Đến nội dung


Hình ảnh
* * * * - 4 Bình chọn

Học AutoLisp


  • Please log in to reply
182 replies to this topic

#161 Polyline

Polyline

    biết lệnh mirror

  • Members
  • PipPipPip
  • 159 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 16 January 2014 - 01:51 PM

QLeader là lệnh dành cho người dùng AutoCAD. Khi viết Lisp bạn nên sử dụng lệnh Leader, nó cũng có nhiều tùy chọn và phù hợp hơn với AutoLisp.


  • 0

#162 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5451 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 16 January 2014 - 02:04 PM

Namvanvo nghiên cứu lisp này nhé!

;by Juerg Menzi
;----- Get Qleader.
(defun GetQleader ( / CurDic CurItm RetVal)
 (if (setq CurDic (dictsearch (namedobjdict) "AcadDim"))
  (progn
   (foreach memb '(3 40 60 61 62 63 64 65 66 67 68 69 70 71 72 170 340)
    (if (setq CurItm (assoc memb CurDic)) (setq RetVal (cons CurItm RetVal))))
   (reverse RetVal))))
;----- Set Qleader
(defun SetQleader (Lst / DicLst)
 (dictremove (namedobjdict) "AcadDim")
 (setq DicLst (append '((0 . "XRECORD") (100 . "AcDbXrecord") (90 . 990106)) Lst))
 (dictadd (namedobjdict) "AcadDim" (entmakex DicLst))
 (princ))
;-Group codes for settings: '((3 . "") 
; User arrowhead block name (default="") (40 . 0.0) 
; Default text width (default=0.0) (60 . 0) 
; Annotation type (default=0): 
; 0=MText 
; 1=Copy object 
; 2=Tolerance 
; 3=Block 
; 4=None (61 . 0) 
; Annotation reuse (default=0): 
; 0=Off 
; 1=On (62 . 1) 
; Left attachment point (default=1): 
; 0=Top of top line 
; 1=Middle of top line 
; 2=Middle of multiline text 
; 3=Middle of bottom line 
; 4=Bottom of bottom line (63 . 3) 
; Right attachment point (default=3): 
; 0=Top of top line
; 1=Middle of top line 
; 2=Middle of multiline text 
; 3=Middle of bottom line 
; 4=Bottom of bottom line (64 . 0) 
; Underline bottom line (default=0): 
; 0=Off ; 1=On (65 . 0) 
; Use splined leader line (default=0): 
; 0=Off ; 1=On (66 . 0) 
; No limit on points (default=0): 
; 0=Off 
; 1=On (67 . 3) 
; Maximum number of points (default=3) (68 . 1) 
; Prompt for MText width (word wrap) (default=1): 
; 0=Off 
; 1=On (69 . 0) 
; Always left justify (default=0): 
; 0=Off 
; 1=On (70 . 0) 
; Allowed angle, first segment (default=0): 
; 0=Any angle 
; 1=Horizontal 
; 2=90° 
; 3=45° 
; 4=30° 
; 5=15° (71 . 1)
; Allowed angle, second segment (default=0): 
; 0=Any angle 
; 1=Horizontal 
; 2=90° 
; 3=45° 
; 4=30° 
; 5=15° (72 . 0) 
; Frame text (default=0): 
; 0=Off 
; 1=On (170 . 0) 
; Active tab for settings (default=0): 
; 0=Annotation 
; 1=Leader Line & Arrow 
; 2=Attachment 
; (340 . ID) 
; Object ID for annotation reuse 
 


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#163 cunipro

cunipro

    biết zoom

  • Members
  • Pip
  • 12 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 27 September 2014 - 12:07 AM

em mới vào diễn đàn và mong muốn học list. . . thấy mấy bác thảo luận ầm ầm . . .em cũng ham hố và sàm sồ . . . 

mong các bác chiếu cố và giúp đỡ  :D  :D  :D  :D  :D  :D  :D  :D  :D  :D  :D ..


  • 0

#164 Namvanvo

Namvanvo

    Edu level: li5

  • Members
  • PipPipPipPipPip
  • 386 Bài viết
Điểm đánh giá: 42 (tàm tạm)

Đã gửi 27 September 2014 - 07:21 AM

Namvanvo nghiên cứu lisp này nhé!

 Thank Bác Hà, em sẽ tiếp tục nghiên cứu cái lisp này sau, level hiện tại thì chưa đủ để hiểu được nó  :mellow:


  • 0

#165 nguyenbd1

nguyenbd1

    biết lệnh text

  • Members
  • PipPipPipPip
  • 276 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 30 November 2014 - 08:38 AM

các bác co thể hướng dẫn em viet doan mã lisp nhu hinh vẽ dưới ko a

122369_33.jpg

 

 
với yêu cầu chiều dài lỗ taro có thể xoay được...thao tác trên dòng command như sau: sau khi nhập lệnh M10 , yêu cầu chọn điểm chuẩn (1)  sau đó là chọn điểm (2) để chọn hướng quay...chều dài lỗ ta rô dài hay ngắn sẽ phụ thuộc vào điểm 2.. nếu khoảng cách từ điểm (1) tới (2) >25 thì sẽ vẽ ra hình như hình dưới. rất mong su giúp đỡ của anh em...122369_11_2.jpg


  • 0

#166 nguyenbd1

nguyenbd1

    biết lệnh text

  • Members
  • PipPipPipPip
  • 276 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 30 November 2014 - 09:00 AM

đây là bản vẽ chi tiết. xin lỗi mạng yếu ko up được file dwg được.122369_22.jpg


  • 0

#167 nguyenbd1

nguyenbd1

    biết lệnh text

  • Members
  • PipPipPipPip
  • 276 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 30 November 2014 - 02:03 PM

kog ai giúp em voi a


  • 0

#168 thanhmom2009

thanhmom2009

    biết zoom

  • Members
  • Pip
  • 12 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 30 November 2014 - 03:04 PM

Em sửa lại xíu cho chuẩn:

Xin lỗi các Bác vì em hỏi cái này ở chỗ này không biết có đúng không? (Em có học theo mấy bài đầu của bac Nguyen Hoanh tưởng đâu tự làm được nhưng vẫn

còn nhiều cục gạch quá nên chịu phải hỏi các sư huynh)

Là vì em tìm trên cadviet có nhiều lisp tính diện tích nhưng không cái  nào là đầy đủ đối với công việc em sử dụng (được cái này thì mất cái kia). Công việc em

(tính diện tích các mcn) cần như thế này ạ :

1. Chọn tập tin lưu số liệu

2. Load lisp, đánh lệnh 

3. Nhập tỉ lệ

4. Chọn font, chiều cao text diện tích xuất ra

5. Khi pick vào vùng kín để tính diện tích (gồm cả line và pline) thì đồng thời bo đối tượng như lệnh boundary và xuất ra text diện tích

6. Tính diện tích các hình tiếp theo chỉ cần chọn điểm giữa (bước 5) mà không phải lặp lại bước 1,2,3,4.

7. Chỉ dừng lại khi ấn esc

Em mong có sư huynh nào viết giúp em còn nếu như không muốn cho em con cá mà cho cần câu thì chỉ cho em cách viết (chỉ tỉ mỉ thì em mới làm được, vì em thì chỉ mới trình độ nhập môn thôi các sư huynh ạ). Cám ơn mấy sư huynh trước


  • 0

#169 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 30 November 2014 - 03:31 PM

đây là bản vẽ chi tiết. xin lỗi mạng yếu ko up được file dwg được.122369_22.jpg

Hề hề hề,

. Nguyen bd1 đã biết nhiều về lisp rồi cơ mà, Việc viết lisp để vẽ được như mô tả đâu phải quá khó khăn với khả năng của nguyenbd1 nhỉ. Bạn mắc chỗ nào khi viết lisp này? Cái lisp như vầy tuy không quá khó nhưng hơi mất công tỷ mỷ chút chút thôi. Bạn cứ mạnh dạn làm thử đi, vấp đâu gỡ đó sẽ nhanh hơn bạn ạ.


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#170 nguyenbd1

nguyenbd1

    biết lệnh text

  • Members
  • PipPipPipPip
  • 276 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 30 November 2014 - 05:57 PM

Hề hề hề,

. Nguyen bd1 đã biết nhiều về lisp rồi cơ mà, Việc viết lisp để vẽ được như mô tả đâu phải quá khó khăn với khả năng của nguyenbd1 nhỉ. Bạn mắc chỗ nào khi viết lisp này? Cái lisp như vầy tuy không quá khó nhưng hơi mất công tỷ mỷ chút chút thôi. Bạn cứ mạnh dạn làm thử đi, vấp đâu gỡ đó sẽ nhanh hơn bạn ạ.

anh bình cứ nói thế. em moi chi biết dùng lisp ng ta thi gioj thôi. anh chiếu cố giúp em với ạ. thank anh trước.


  • 0

#171 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 01 December 2014 - 10:25 AM

Em sửa lại xíu cho chuẩn:

Xin lỗi các Bác vì em hỏi cái này ở chỗ này không biết có đúng không? (Em có học theo mấy bài đầu của bac Nguyen Hoanh tưởng đâu tự làm được nhưng vẫn

còn nhiều cục gạch quá nên chịu phải hỏi các sư huynh)

Là vì em tìm trên cadviet có nhiều lisp tính diện tích nhưng không cái  nào là đầy đủ đối với công việc em sử dụng (được cái này thì mất cái kia). Công việc em

(tính diện tích các mcn) cần như thế này ạ :

1. Chọn tập tin lưu số liệu

2. Load lisp, đánh lệnh 

3. Nhập tỉ lệ

4. Chọn font, chiều cao text diện tích xuất ra

5. Khi pick vào vùng kín để tính diện tích (gồm cả line và pline) thì đồng thời bo đối tượng như lệnh boundary và xuất ra text diện tích

6. Tính diện tích các hình tiếp theo chỉ cần chọn điểm giữa (bước 5) mà không phải lặp lại bước 1,2,3,4.

7. Chỉ dừng lại khi ấn esc

Em mong có sư huynh nào viết giúp em còn nếu như không muốn cho em con cá mà cho cần câu thì chỉ cho em cách viết (chỉ tỉ mỉ thì em mới làm được, vì em thì chỉ mới trình độ nhập môn thôi các sư huynh ạ). Cám ơn mấy sư huynh trước

.Hề hề hề,

Bạn hãy chọn lấy cái lisp gần đạt với yêu cầu của bạn nhất và post lên, Nói rõ chỗ nào cần sửa và cần sửa ra sao, cũng như cần bổ sung thêm những gì, như vậy sẽ thuận lợi hơn cho người muốn giúp bạn. Nên post ngay ở topic có chứa lisp đó để tiện theo dõi.


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#172 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 01 December 2014 - 10:31 AM

anh bình cứ nói thế. em moi chi biết dùng lisp ng ta thi gioj thôi. anh chiếu cố giúp em với ạ. thank anh trước.

Hề hề hề, 

Thực ra thì mình đang hơi bù đầu vì công việc làm hàng cho đợt Tết nguyên đán nên chưa rảnh để viết ngay được. Nếu bạn có thể chờ thì thư thư vài hôm nếu chưa có người viết mình sẽ viết nhé. Không khó đâu, chỉ hơi loằng ngoằng khi xác định các điểm chốt thôi do cái đường chuẩn nó không nằm ngay ngắn. Bạn cứ thử sẽ thấy, y như khi vẽ tay thôi mà.


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#173 thanhmom2009

thanhmom2009

    biết zoom

  • Members
  • Pip
  • 12 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 01 December 2014 - 12:16 PM

Ok. Thanks anh. Em cứ sợ mấy topic kia lâu quá rồi thì ko ai dòm ngó tới hihi


  • 0

#174 nguyenbd1

nguyenbd1

    biết lệnh text

  • Members
  • PipPipPipPip
  • 276 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 01 December 2014 - 05:21 PM

Hề hề hề, 

Thực ra thì mình đang hơi bù đầu vì công việc làm hàng cho đợt Tết nguyên đán nên chưa rảnh để viết ngay được. Nếu bạn có thể chờ thì thư thư vài hôm nếu chưa có người viết mình sẽ viết nhé. Không khó đâu, chỉ hơi loằng ngoằng khi xác định các điểm chốt thôi do cái đường chuẩn nó không nằm ngay ngắn. Bạn cứ thử sẽ thấy, y như khi vẽ tay thôi mà.

cảm ơn anh. e chờ su giúp đỡ của anh


  • 0

#175 phamductai1989

phamductai1989

    biết pan

  • Members
  • Pip
  • 7 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 19 March 2015 - 01:16 PM

Patpat lại khích tướng rồi. Xin giới thiệu phần tiếp theo để mọi người khỏi phải chờ, hy vọng là nó có ích.

Phần 4:
* Các phần trước, chúng ta đã thực hành được với lệnh lisp tính diện tích của một đối tượng. Phần này, chúng ta sẽ đi vào cải tiến để lệnh tính diện tích sẽ áp dụng cho một tập đối tượng được chọn của chúng ta.

* Trong AutoLisp tập đối tượng được lưu trong biến kiểu tập chọn. Với lệnh (ssget), có thể tạo ra một tập chọn chứa các đối tượng chúng ta chọn. Với lệnh (ssname ss index) chúng ta sẽ lấy được entname đối tượng thứ index trong tập đối tượng ss. lệnh (sslength ss) trả về số đối tượng trong tập chọn.

* Tính diện tích của một tập đối tượng, ta sẽ tính diện tích của từng đối tượng trong tập này và cộng lại với nhau. Để làm được như vậy, chúng ta sẽ làm một hàm lặp như sau:
(repeat sodoituong
(setq
ent_ht (ssname ssdt index)
index (+ index 1)
dientich (tinhdientich_one ent_ht)
tongdientich (+ tongdientich dientich)
)
Vòng lặp này sẽ quét qua tất cả các đối tượng và cộng dồn diện tích của đối tượng hiện tại vào diện tích tổng. Trong đoạn mã trên, biến sodoituong chứa số đối tượng có trong tập chọn. index là biến chứa chỉ số của đối tượng hiện tại (index có giá trị từ 0 đến sodoituong-1). ent_ht là tên của đối tượng hiện tại. tinhdientich_one là hàm tính diện tích của một đối tượng được chỉ định, hàm này có được bằng cách gom 2 dòng lệnh của phần trước lại với nhau là: (command ".area" "o" ent)(setq dientich (getvar "area")). Tongdientich chính là diện tích của tất cả các đối tượng, giá trị này có được nhờ cộng dồn tất cả các giá trị của biến dientich lại với nhau.

* Chương trình tính diện tích sẽ tiếp tục được cải tiến như sau:
--------------------Gốc (xin nhắc lại phần trước):
(defun c:tdt( / sel ent dientich)
(princ "\nChao cadviet")
(setq sel (entsel "\nHay chon doi tuong: "))
(setq ent (car sel))
(command ".area" "o" ent)
(setq dientich (getvar "area"))
(princ "\nDien tich tap doi tuong vua roi la: ")
(princ dientich)
(princ "\nm2")
(princ)
)

--------------------Cải tiến (màu xám là đoạn code bỏ đi, màu xanh là đoạn code thêm mới):
(defun c:tdt( / sel ent dientich)
(princ "\nChao cadviet")
;(setq sel (entsel "\nHay chon doi tuong: "))
(setq ssdt (ssget))
;(setq ent (car sel))
(defun tinhdientich_one(ent)
(command ".area" "o" ent)
(setq dientich (getvar "area"))
)

; khởi tạo các biến
(setq
sodoituong (sslength ssdt)
index 0
tongdientich 0.0
)

; vòng lặp quét qua các đối tượng
(repeat sodoituong
(setq
ent_ht (ssname ssdt index)
index (1+ index)
dientich (tinhdientich_one ent_ht)
tongdientich (+ tongdientich dientich)
)
)

(princ "\nDien tich tap doi tuong vua roi la: ")
;(princ dientich)

;in tổng diện tích
(princ tongdientich)

(princ "\nm2")
(princ)
)

* Như vậy, chúng ta đã tạo được một đoạn code tính diện tích của một tập đối tượng. Tuy nhiên, đoạn code này hơi rườm rà, do có một lệnh định nghĩa hàm defun tinhdientich_one nằm ngay giữa đoạn code. Bây giờ, chúng ta sẽ làm sạch lại đoạn code trên bằng cách sắp xếp lại mà không thay đổi bất cứ ý nghĩa của một mã nào:
(defun c:tdt( / sel ent dientich)


;định nghĩa hàm tính diện tích 1 đối tượng
(defun tinhdientich_one(ent)
(command ".area" "o" ent)
(setq dientich (getvar "area"))
)


; viết lời chào và chọn đối tượng

(princ "\nChao cadviet")
(setq ssdt (ssget))


; khởi tạo các biến

(setq
sodoituong (sslength ssdt)
index 0
tongdientich 0.0
)


; quét qua tất cả các đối tượng trong tập chọn, tính diện tích và cộng dồn diện tích

(repeat sodoituong
(setq
ent_ht (ssname ssdt index)
index (1+ index)
dientich (tinhdientich_one ent_ht)
tongdientich (+ tongdientich dientich)
)
)


; xuất kết quả ra màn hình

(princ "\nDien tich tap doi tuong vua roi la: ")
(princ tongdientich)
(princ "\nm2")
(princ)
)


--------------------------------------------------------------------------------------------
Phần tiếp theo sẽ trình bày phần tinh chỉnh code để:
- kết xuất kết quả ra đối tượng text
- lọc các đối tượng được chọn
- ẩn các đoạn text trung gian.

Cảm ơn các bạn vẫn đang theo dõi.


  • 0

#176 phamductai1989

phamductai1989

    biết pan

  • Members
  • Pip
  • 7 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 19 March 2015 - 01:17 PM

Phần 1: bắt đầu

Đầu tiên, chúng ta hãy bắt đầu bằng chương trình viết chữ.

Hãy tạo một file mới và save nó với tên hoclisp.lsp.
(princ "\nChao cadviet")
(princ)

Đây là đoạn mã đơn giản nhất của AutoLisp nhằm viết ra một dòng 'Chao cadviet' trên màn hình nhập dữ liệu của autocad. để sử dụng, appload file hoclisp.lsp này. ta sẽ thấy trên màn hình xuất hiện chữ Chao cadviet.

Đi sâu vào phân tích lệnh, ta thấy: mỗi hàm của cad được bắt đầu bằng dấu '(' ngay sau đó là tên hàm, tiếp đến là thông số của hàm (có thể có, có thể không có) và kết thúc bằng dấu ')' Trong trường hợp này princ là tên hàm, "\nChao cadviet" là tham số của hàm princ.

Trong hai câu lệnh gọi hàm vừa rồi, câu thứ nhất là để viết chữ ra màn hình text, câu lệnh thứ 2 dùng để ẩn kết thúc mà không hiển thị thêm gì cả. Nếu thiếu câu lệnh thứ 2, bạn sẽ nhìn thấy 'Chao cadviet"\nChao cadviet"' trên màn hình, trong đó "\nChao cadviet" là kết quả của hàm (princ "\nChao cadviet").


  • 0

#177 phamductai1989

phamductai1989

    biết pan

  • Members
  • Pip
  • 7 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 19 March 2015 - 01:19 PM

bác hoành ơi e muốn tạo lisp là lưu và thoát bản vẽ như nào ạ
ví dụ là
e muon in xong bản vẽ thì tự động lưu và thoát bản vẽ luôn ý
  • 0

#178 quantvxd

quantvxd

    biết zoom

  • Members
  • Pip
  • 13 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 19 March 2015 - 05:00 PM

bác hoành ơi e muốn tạo lisp là lưu và thoát bản vẽ như nào ạ
ví dụ là
e muon in xong bản vẽ thì tự động lưu và thoát bản vẽ luôn ý

In thì phải tự thực hiện thôi bạn, có chăng nên tách yêu cầu ra.
Ví dụ muốn lưu và thoát thì có thể dùng
(defun c:QQ2()
(command "CLOSE" "yes")
)
mình nghĩ như thế hay hơn
P.s có nhầm lẫn đừng vội dùng nhé, để mình xem lại
  • 0

#179 tronghauxd

tronghauxd

    Chưa sử dụng CAD

  • Members
  • Pip
  • 2 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 29 June 2015 - 10:13 AM

bạn ơi sao mình ap và load file lsp rồi mà dùng lệnh chao ko hiện ra dòng chữ Chao cadviet nhỉ?


  • 0

#180 Quang Nguyen

Quang Nguyen

    Chưa sử dụng CAD

  • Members
  • Pip
  • 1 Bài viết
Điểm đánh giá: -1 (bình thường)

Đã gửi 07 January 2016 - 04:42 PM

Xin chào a Hoành, tôi có sử dụng 1 số ct AutoLisp cho công việc của mình (nhưng không rành lập trình AutoLisp), trong quá trình sử dụng tính diện tích trên bản vẽ cad có 1 số vấn đề cần a góp ý điều chỉnh dùm

Tôi có đính kèm 2 file AutoLisp gồm:

1. Tính diện tích liên tục dùng lệnh tdt

2. Tính diện tích dùng lệnh ss

Tôi thích dùng file lisp1 để tính dtich rất nhanh, nhưng tôi thấy file lisp2 có 1 chức năng rất hay mà tôi rất muốn nhờ anh điều chỉnh file lisp1 dùm, đó là trước khi ghi ra số dtich của 1 hình thì sẽ hatch vào hình đó trước rồi mới ghi ra số(vì muốn nhìn thấy được hình dáng vị trí của hình mà minh vừa chọn, tính năng có trong file lisp2).

http://www.cadviet.c..._ltuc__tdt_.lsp

http://www.cadviet.c..._dtich__ss_.lsp

Rất mong nhận được sự giúp đỡ của anh,

Cám ơn anh rất nhiều.


  • -1