Jump to content
InfoFile
Tác giả: Doan Van Ha
Bài viết gốc: 189988
Tên lệnh: ha
viết lisp sơ họa


Tôi đã đọc ví dụ của bạn và nhận thấy ví dụ bạn đưa ra rất đặc biệt, chứ không mang tính tổng quát. Vì vậy, tôi chỉ giúp bạn được 50%, còn 50% thì đợi bạn trả lời (hoặc bạn tự làm). Đó là tôi chỉ mới làm xong bước 1-3, còn bước 4 (bước duỗi thẳng) thì hỏi bạn mấy câu sau:
1). Khi đường đồng mức đi qua điểm góc thì duỗi theo thằng trước hay theo thằng sau?
>>

Tôi đã đọc ví dụ của bạn và nhận thấy ví dụ bạn đưa ra rất đặc biệt, chứ không mang tính tổng quát. Vì vậy, tôi chỉ giúp bạn được 50%, còn 50% thì đợi bạn trả lời (hoặc bạn tự làm). Đó là tôi chỉ mới làm xong bước 1-3, còn bước 4 (bước duỗi thẳng) thì hỏi bạn mấy câu sau:
1). Khi đường đồng mức đi qua điểm góc thì duỗi theo thằng trước hay theo thằng sau?
2). Khi đường đồng mức nằm gọn trong đường bao nhưng lại cắt cả thằng trước và thằng sau thì duỗi kiểu gì?
Đây là lisp "thô" cho bạn:

<<

Filename: 189988_ha.lsp
Tác giả: phamthanhbinh
Bài viết gốc: 189992
Tên lệnh: sht
viết lisp sơ họa

Hề hề hề,
Bạn dùng thử cái này coi đã đúng ý chưa nhé. Kết quả vẫn còn một số râu thừa do lệnh extrim của express. Mình chưa tìm ra cách xử lý. Bạn có thể xóa thủ công nó một tí. Hy vọng rằng nó có ích cho bạn.

Chúc bạn vui.

Filename: 189992_sht.lsp
Tác giả: Tue_NV
Bài viết gốc: 119280
Tên lệnh: cte
chuyển số liệu text từ cad sang excell

Bạn thử cái này nhé :

Filename: 119280_cte.lsp
Tác giả: Doan Van Ha
Bài viết gốc: 190182
Tên lệnh: gg
Hỏi code lisp: Lấy text từ .txt đưa vào CAD


Mấy ngày nay không thấy bác Tue_NV online nên tôi làm giúp cho bạn đây:

Filename: 190182_gg.lsp
Tác giả: ketxu
Bài viết gốc: 190555
Tên lệnh: test1 test2 test3
Viết tên layer của Line và ghi ra màn hình


- Ghi ra màn hình Layer của Line(s) tại vị trí trung điểm
- Trong lisp kèm thêm 2 lisp nhỏ theo yêu cầu riêng

Filename: 190555_test1_test2_test3.lsp
Tác giả: Thaistreetz
Bài viết gốc: 121269
Tên lệnh: ft
Nhờ viết Lisp tìm tên tuyến
Lệnh là FT, chỉnh thế nào tùy bạn. Mình đưa ra ý tưởng khác bạn 1 chút để dễ dùng hơn. ĐK dùng lisp này: tất cả các text tên tuyến phải được đặt ở layer TENTUYEN. bạn có thể tự sửa code sao cho phù hợp với cách đặt tên layer của bạn. sửa ở đây (8 . "TENTUYEN")

Filename: 121269_ft.lsp
Tác giả: Tue_NV
Bài viết gốc: 190703
Tên lệnh: xuattt
Xin lisp trích xuất thông tin của các thửa đất.

Dữ liệu của bạn là các Text rời rạc, không tuân theo 1 quy luật nào cả. Nếu trong vùng chọn Lisp không chọn được đối tượng thỏa mãn thì Cell được để trống. Còn trong vùng chọn, Lisp có thể chọn nhiều hơn 1 đối tượng thỏa mãn thì nó đánh dấu ? vì không biết chọn đối tượng nào.
Ví dụ trong những thửa hẹp, text chủ thửa bị đè lên nhau thì Cell được đánh dấu ?. Bạn...
>>

Dữ liệu của bạn là các Text rời rạc, không tuân theo 1 quy luật nào cả. Nếu trong vùng chọn Lisp không chọn được đối tượng thỏa mãn thì Cell được để trống. Còn trong vùng chọn, Lisp có thể chọn nhiều hơn 1 đối tượng thỏa mãn thì nó đánh dấu ? vì không biết chọn đối tượng nào.
Ví dụ trong những thửa hẹp, text chủ thửa bị đè lên nhau thì Cell được đánh dấu ?. Bạn bổ sung thêm dữ liệu ở Cell có dấu ? và Cell để trống nhé
Gửi bạn code này. Bạn thử nhé :

<<

Filename: 190703_xuattt.lsp
Tác giả: Doan Van Ha
Bài viết gốc: 190731
Tên lệnh: ha
Lisp tìm tập hợp các hình chữ nhật có diện tích bất kỳ


Bạn cần nói rõ hơn:
- Hình chữ nhật đó được vẽ bằng line hay lwpolyline... Tốt nhất là upload bản vẽ lên
- Tìm ra rồi làm gì: xuất kết quả ra file, hay để delete, copy...
Lisp dưới đây chọn các hình chữ nhật vẽ bằng Lwpolyline, có diện tích < 50. Trả về list các ename.

Filename: 190731_ha.lsp
Tác giả: ssg
Bài viết gốc: 57619
Tên lệnh: bra
Viết lisp chia đoạn thẳng thành 3 phần

Cắt luôn cả cái "vật cắt" nghĩa là không cần phân biệt, cứ chơi tất! Theo ssg, đừng thêm option cho nó phức tạp ra, bạn thử dùng cái BRA (Break All) sau:

Filename: 57619_bra.lsp
Tác giả: q288
Bài viết gốc: 57646
Tên lệnh: chh
Viết lisp chia đoạn thẳng thành 3 phần


Không đơn giản như bạn nghĩ đâu, lúc đầu mình cũng nghĩ như vậy, nhưng chạy thử thì hoặc có lỗi hoặc cắt không hết. Sau cùng thì phải thay đổi luôn giải thuật, không xài giải thuật cũ nữa. GThuật cũ chỉ thìch hợp với số lg vthể ít thôi, theo như nhu cầu cua bạn trongquan ban đầu là chia 3, nhưng nếu số lg nhiều thì việc quản lý vthể mới sẽ rắc rối lắm, chưa kể hàm...
>>


Không đơn giản như bạn nghĩ đâu, lúc đầu mình cũng nghĩ như vậy, nhưng chạy thử thì hoặc có lỗi hoặc cắt không hết. Sau cùng thì phải thay đổi luôn giải thuật, không xài giải thuật cũ nữa. GThuật cũ chỉ thìch hợp với số lg vthể ít thôi, theo như nhu cầu cua bạn trongquan ban đầu là chia 3, nhưng nếu số lg nhiều thì việc quản lý vthể mới sẽ rắc rối lắm, chưa kể hàm ssdel xóa mất đối tượng quá sớm sẽ khiến kết quả sai lạc.
MÌnh cũng đã viết CT mới giải quyết triệt để hơn và gộp luôn option cắt vật cắt như bạn yêu cầu. Còn việc thử trên 1000 vthể mình nghĩ ko cần thiết, đối với file lớn thì nên chia nhỏ ra sẽ tiêt kiệm thời gian hơn. Làm thử phép tính sau:
1000 vthể x 1000 phép toán tìm giao điểm = 1000000 phép toán
giả sử chia nhóm nhỏ 200 vthể và làm 5 lần:
200 vthể x 200 phép tính x 5 lần = 200000 phép toán
Đó là chưa kể đối với máy cấu hình yếu thì dám bị tràn bộ nhớ và treo máy cũng không chừng.

Thao tác CT:
- Đánh lệnh chh
- Chọn vật bị cắt
- Chọn vật cắt, nếu muốn mọi vật đều bị cắt thì


<<

Filename: 57646_chh.lsp
Tác giả: q288
Bài viết gốc: 57650
Tên lệnh: chh
Viết lisp chia đoạn thẳng thành 3 phần
Sorry, có chỗ bị sai chút xíu, chép lại code


Filename: 57650_chh.lsp
Tác giả: Doan Van Ha
Bài viết gốc: 190966
Tên lệnh: pl2
lisp kết hợp PL & UCS

Bạn đã biết vì sao bài của bạn bị mod xoá rồi ư?
Đây là lisp cho bạn (chú ý kích thước trên bản vẽ khác kết quả dim nhé)

Filename: 190966_pl2.lsp
Tác giả: lp_hai
Bài viết gốc: 187100
Tên lệnh: zx
Chỉnh máy in và Plot Style!

Về chuyện in ấn này thì mỗi người mỗi kiểu. Nếu dùng Publish cho các layout thì tốt nhất bạn nên import cái setup in chuẩn từ một file chuẩn nào đó.
cái này bạn làm bắt đầu như sau: mở một bản vẽ (chuẩn) lên, bấm lệnh in, trong bảng plot ở ô paper setup bạn add... một setup mới, đổi tên tùy thích. thiết lập in cho chuuẩn, sau đó thoát ra và save bản vẽ lại. ở những bản vẽ...
>>

Về chuyện in ấn này thì mỗi người mỗi kiểu. Nếu dùng Publish cho các layout thì tốt nhất bạn nên import cái setup in chuẩn từ một file chuẩn nào đó.
cái này bạn làm bắt đầu như sau: mở một bản vẽ (chuẩn) lên, bấm lệnh in, trong bảng plot ở ô paper setup bạn add... một setup mới, đổi tên tùy thích. thiết lập in cho chuuẩn, sau đó thoát ra và save bản vẽ lại. ở những bản vẽ khác hoặc bên layout khác bạn chọn import, rồi chọn lại cái đường dẫn về bản vẽ chuẩn, chọn paper setup vừa tạo. khi publish chỉ cần chọn thiết lập in đã có sẵn,
còn nếu in từng layout, thay vì chọn in previous cho mỗi lần in, bạn chỉ cần lick qua layout cần in và xài lisp này, máy sẽ tự in previous cho bạn và bỏ qua preview luôn. chú ý là lần in trước đó phải "chuẩn" vì in previous sẽ in theo lần in trước đó nhá

(defun c:zx(/ name)
(setq name(getstring "\Enter layout to print: "))
(command "-plot" "N" name "previous plot" "" "" "" "")
)

<<

Filename: 187100_zx.lsp
Tác giả: Thaistreetz
Bài viết gốc: 191112
Tên lệnh: tc
Xin lisp căn Text vào chính giữa ô

Những trường hợp lập bảng như thế này thì tốt hơn là dùng DTEXT cho nhẹ. Quan điểm của mình khi vẽ là hạn chế dùng MTEXT nên không viết cho MTEXT.
Mình bận nên chỉ sửa qua 1 chút theo yêu cầu của bạn (Căn TEXT hoặc MTEXT vào chính giữa ô) thôi nhá.
Không căn được MTEXT cho lựa chọn căn vào lề phải và trái của ô đâu đấy, bác nào rảnh rỗi thì sửa dùm bạn ấy cho 2 lựa...
>>

Những trường hợp lập bảng như thế này thì tốt hơn là dùng DTEXT cho nhẹ. Quan điểm của mình khi vẽ là hạn chế dùng MTEXT nên không viết cho MTEXT.
Mình bận nên chỉ sửa qua 1 chút theo yêu cầu của bạn (Căn TEXT hoặc MTEXT vào chính giữa ô) thôi nhá.
Không căn được MTEXT cho lựa chọn căn vào lề phải và trái của ô đâu đấy, bác nào rảnh rỗi thì sửa dùm bạn ấy cho 2 lựa chọn này. mình cảm ơn!
(defun C:TC (/ Txt PTxt PTX SS i prmt DK TEMP_JTF DCL_ID DCL_JTF)
(setq SS (ssget "I" '((0 . "*TEXT"))) i 0)
(command "undo" "begin")
(setvar "cmdecho" 0)
(if (not JTF-T) (setq JTF-T (list 0 1 0)))
(if (= (cadr JTF-T) 1)
(setq prmt "Text to Center")
(if (= (caddr JTF-T) 1) (setq prmt "Text to Right") (setq prmt "Text to Left"))
);if
(vl-load-com)
(if (not SS)
(progn
(prompt (strcat "\nSelect text object "))
(setq DK (grread nil 4 2))
(if (= (car DK) 3)
(setq SS (ssget "C" (cadr DK) (getcorner (cadr DK)) '((0 . "*TEXT"))))
(if (= (cadr DK) 115)
(progn
(setq DCL_JTF (list "JTFtext : dialog {label = \"Justify in Region\"; : boxed_radio_row {"
" : radio_button { label = \"Left\"; key = \"Lft\";}"
" : spacer { width = 1.2; }"
" : radio_button { label = \"Center\"; key = \"Ctr\";}"
" : radio_button { label = \"Right\"; key = \"Rgt\";}}"
" ok_cancel;}"))
(setq TEMP_JTF (vl-filename-mktemp "CTK.DCL")
FILE_DCL (open TEMP_JTF "W"))
(foreach LL DCL_JTF (write-line LL FILE_DCL))
(close FILE_DCL)
(setq DCL_ID (load_dialog TEMP_JTF))
(new_dialog "JTFtext" DCL_ID)
(set_tile "Lft" (rtos (nth 0 JTF-T) 2 0))
(set_tile "Ctr" (rtos (nth 1 JTF-T) 2 0))
(set_tile "Rgt" (rtos (nth 2 JTF-T) 2 0))
(action_tile "accept" "(setq JTF-T (list(atof(get_tile \"Lft\"))(atof (get_tile \"Ctr\"))(atof (get_tile \"Rgt\"))))(done_dialog)")
(start_dialog)
(unload_dialog DCL_ID)
(vl-file-delete TEMP_JTF)
(setq SS (ssget '((0 . "TEXT"))))
);progn
(if (= (cadr DK) 32) (exit) (progn (prompt "\nWrong Key (!) Select text oject or press etting") (C:TC)))
))));if
(if SS
(progn
(command "UCS" "W")
(setq OSMLAST (getvar "osmode"))
(setvar "OSMODE" 0)
(cond ((= (nth 1 JTF-T) 1)
(repeat (sslength SS)
(setq txt (ssname SS i) PTxt (GET_MIDTEXT txt) PTX (GET_CENTER_REGION PTxt) i (1+ i))
(if PTX (vl-cmdf "move" txt "" PTxt PTX))));list_Ctr
((= (nth 0 JTF-T) 0)
(repeat (sslength SS)
(setq txt (ssname SS i) PTxt (GET_RIGHTTEXT txt) PTX (cadr (GET_LR_REGION PTxt)) i (1+ i))
(if PTX (vl-cmdf "move" txt "" PTxt PTX))));list_rgt
((= (nth 2 JTF-T) 0)
(repeat (sslength SS)
(setq txt (ssname SS i) PTxt (GET_LEFTTEXT txt) PTX (car (GET_LR_REGION PTxt)) i (1+ i))
(if PTX (vl-cmdf "move" txt "" PTxt PTX))));list_lft
);cond
(setvar "osmode" OSMLAST)
(command "UCS" "P")));if
(prompt "Thaistreetz@gmail.com")
(command "undo" "end")
(princ)
);end TC
(defun GET_CENTER_REGION (PT / SSL PTC enx)
(setq SSL (entlast) enx SSL)
(if (= (DXF 0 SSL) "POLYLINE")
(while (/= "SEQEND" (DXF 0 (entnext SSL))) (setq SSL (entnext SSL))));if
(vl-cmdf "-boundary" PT "")
(if (entnext SSL)
(progn
(command "region" "L" "")
(setq PTC (vlax-safearray->list (vlax-variant-value (vlax-get-property (vlax-ename->vla-object (entlast)) 'Centroid))))));if
(while (setq enx (entnext enx)) (entdel enx))
ptc);END
(defun GET_LR_REGION (PT / SSL PTC )
(setq SSL (entlast))
(if (= (DXF 0 SSL) "POLYLINE")
(while (/= "SEQEND" (DXF 0 (entnext SSL)))(setq SSL (entnext SSL))));if
(vl-cmdf "-boundary" PT "")
(if (entnext SSL)
(progn
(command "region" "L" "")
(setq PTC (ACET-GEOM-SS-EXTENTS-FAST (ssget "L")))
(entdel (entlast))
(list (list (car (car PTC)) (+ (cadr (car PTC)) (* 0.5 (abs (- (cadr (car PTC)) (cadr (cadr PTC)))))))
(list (car (cadr PTC)) (- (cadr (cadr PTC)) (* 0.5 (abs (- (cadr (car PTC)) (cadr (cadr PTC)))))))));progn
nil));END
(defun GET_MIDTEXT (EN / TB PTxt PT0 PTA)
(setq TB (ACET-GEOM-TEXTBOX (entget EN) 0))
(GET_M2P (car TB) (caddr TB)))
(defun GET_RIGHTTEXT (EN / TB PTxt PT0 PTA)
(setq TB (textbox (entget EN))
PTxt (GET_M2P (car TB) (cadr TB))
PT0 (DXF 10 EN)
PTA (list (+ (car PT0) (car PTxt)) (+ (cadr PT0) (cadr PTxt))))
(list(+(car PT0)(car (cadr TB))(abs(-(cadr(car TB))(cadr (cadr TB))))) (cadr(polar PT0 (+(DXF 50 EN)(angle PT0 PTA))(distance PT0 PTA)))))
(defun GET_LEFTTEXT (EN / TB PTxt PT0 PTA)
(setq TB (textbox (entget EN))
PTxt (GET_M2P (car TB) (cadr TB))
PT0 (DXF 10 EN)
PTA (list (+ (car PT0) (car PTxt)) (+ (cadr PT0) (cadr PTxt))))
(list (- (car PT0) (abs (- (cadr (car TB)) (cadr (cadr TB))))) (cadr (polar PT0 (+ (DXF 50 EN) (angle PT0 PTA)) (distance PT0 PTA)))))
(defun DXF (Id Obj) (cdr (assoc Id (entget Obj))))
(defun GET_M2P (PT1 PT2) (polar PT1 (angle PT1 PT2) (* 0.5 (distance PT1 PT2))));end

<<

Filename: 191112_tc.lsp
Tác giả: ketxu
Bài viết gốc: 191207
Tên lệnh: ldp
Trim Leader?
Quick code :

(defun c:ldp (/ LM:mAssoc p lst ss)
;Free lisp from Cadviet @Ketxu
(defun LM:mAssoc ( key lst / pair )
(if (setq pair (assoc key lst))
(cons (cdr pair) (LM:mAssoc key (cdr (member pair lst))))
)
)
(and (setq ss (ssget '((0 . "*LEADER"))))
(setq p (getpoint "\nDiem dat chung :"))
(foreach ld (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
(entmod (subst (cons 10 p) (cons 10 (last...
>>
Quick code :

(defun c:ldp (/ LM:mAssoc p lst ss)
;Free lisp from Cadviet @Ketxu
(defun LM:mAssoc ( key lst / pair )
(if (setq pair (assoc key lst))
(cons (cdr pair) (LM:mAssoc key (cdr (member pair lst))))
)
)
(and (setq ss (ssget '((0 . "*LEADER"))))
(setq p (getpoint "\nDiem dat chung :"))
(foreach ld (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
(entmod (subst (cons 10 p) (cons 10 (last (LM:mAssoc 10 (setq lst (entget ld))))) lst))
)
))

<<

Filename: 191207_ldp.lsp
Tác giả: Doan Van Ha
Bài viết gốc: 191227
Tên lệnh: tl
Trim Leader?

Về lisp chuyển layer thì trên cadviet có rất nhiều. Đơn giản như bạn thì dùng cái này xem:

Filename: 191227_tl.lsp
Tác giả: ssg
Bài viết gốc: 68786
Tên lệnh: mb
tạo Block cho các đối tuợng vừa vẽ

Bạn tham khảo ví dụ sau:


Filename: 68786_mb.lsp
Tác giả: phamngoctukts
Bài viết gốc: 164143
Tên lệnh: brd
Lisp cắt đối tượng

Mình test thử có thấy lỗi thế đâu nhỉ.
Đây là code của ket mình có edit tí chút.

Filename: 164143_brd.lsp
Tác giả: huunhantvxdts
Bài viết gốc: 191416
Tên lệnh: dt
mình muốn nhờ viết lisp tính diện tích cho cad 2007 hoặc cao hơn
mình có 1 lisp cũng khá hay nhưng không thỏa mãn tất cả các yêu cầu của bạn.
đây là lisp mình sưu tầm và có chỉnh sửa thêm

;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.com/forum/index.php?showtopic=59486
(Defun c:DT()
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(command "osnap" "none")
(if (null am)(setq am "1"))
>>
mình có 1 lisp cũng khá hay nhưng không thỏa mãn tất cả các yêu cầu của bạn.
đây là lisp mình sưu tầm và có chỉnh sửa thêm

;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.com/forum/index.php?showtopic=59486
(Defun c:DT()
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(command "osnap" "none")
(if (null am)(setq am "1"))
(Setq temp1 T)
(While temp1
(setq pt (strcat "\nHe so ("am") \<Chon diem>: "))
(Initget "h H")
(setq str (getpoint pt))
(Cond
((= str "h") (setq am (getstring (strcat"\nNhap he so <"am"> :"))))
((= str "H") (setq am (getstring (strcat"\nNhap he so <"am"> :"))))
(Progn
(Setq pt str)
(setq temp1 nil)
)
)
)
(setq s 0)
(progn
; (setq pt (getpoint "\n Chon diem: "))
(while pt
(setq entold (cdr (assoc 5 (entget (entlast)))))
(command "boundary" pt "")
(setq entnew (cdr (assoc 5 (entget (entlast)))))
(if (/= entold entnew)
(progn
(setq entnew (entget (entlast)))
(if (assoc 62 entnew)
(setq entnew (subst (cons 62 (+ 3 (cdr (assoc 62 entnew)))) (assoc 62 entnew) entnew))
(setq entnew (append entnew (list (cons 62 (+ 3 (cdr (assoc 62 (tblsearch "layer" (cdr (assoc 8 entnew))))))))))
)


(entmod entnew)
(Command "area" "o" (entlast))
(setq s (+ s (getvar "area")))
(setq pt (getpoint "\n Chon diem: "))
(entdel (entlast))
)
(progn
(princ "chon diem sai")
(setq pt (getpoint "\n Chon diem: "))
)
)
)
)

(command "osnap" "intersection")
(setq am (atof am))
(setq s (* s am))
(setq point (getpoint "\n Chon diem ghi dien tich: "))
(setq th (getvar "textsize"))
(setq th (getstring (strcat "\nChieu cao chu <"(rtos th)"> :")))
;(princ "\nDien tich nhung vung vua chon la: "s)
(command "TEXT" point th 0 (rtos s 2 2))
(setq am (rtos am))
(setvar "MODEMACRO" "**CHUC BAN LAM VIEC HIEU QUA** TAILIEUKYTHUAT.COM")
(princ )
)

<<

Filename: 191416_dt.lsp
Tác giả: Doan Van Ha
Bài viết gốc: 191452
Tên lệnh: ha
Hỏi cách lấy dữ liệu trực tiếp từ dòng lệnh của AutoCAD!

Đây là lisp cho bạn (để lấy các thông tin trên Text Window của bản vẽ hiện hành):

Filename: 191452_ha.lsp

Trang 77/330

77