Jump to content
InfoFile
Tác giả: tien2005
Bài viết gốc: 236286
Tên lệnh: vht
Code lisp như thế nào để hạn chế lỗi cho người dùng?

mình code lại vẽ hình tròn. Các Bạn góp ý thêm

(defun c:vht ( / p r)
(while (not (setq p (getpoint "\nSpecify center point for circle: "))))
  (while (or (not r) (equal r 0.0 0.00001))
    (setq r (getdist "\nSpecify radius of circle: " p))
    )
 (vl-cmdf "circle"  p (abs r))
 (princ))

 

 


Filename: 236286_vht.lsp
Tác giả: KangKung
Bài viết gốc: 230799
Tên lệnh: kk
chỉnh thuộc tính cho nhiều block

Chào các anh, em đ­ược giử cho một bản vẽ có rất nhiều block thuộc tính là toạ độ, nhưng khi in ra thì ko thấy. Có anh chị nào biết cách chỉnh hàng loạt thuộc tính để có thể in ra được không?

Em up lên file block đó: 

>>

Chào các anh, em đ­ược giử cho một bản vẽ có rất nhiều block thuộc tính là toạ độ, nhưng khi in ra thì ko thấy. Có anh chị nào biết cách chỉnh hàng loạt thuộc tính để có thể in ra được không?

Em up lên file block đó: http://www.mediafire.com/?6x7er41idv7x4ll

Trong bản vẽ bạn gửi có 4 cái block attribute. 4 cái này có chung gốc rễ là cái block toadodiemxenhe (bạn bấm i enter rồi xem thì biết). Chung 1 block thuộc tính thì lẽ ra tất cả các đối tượng Text trong các block trên bản vẽ phải cùng Layer với block gốc nhưng không hiểu bạn hay là người gửi File cho bạn đã chỉnh một số Text trong block về Layer DEFPOINTS. Đây là Layer mặc định không thể in được. Để in được bạn dùng Lisp sau chuyển tất cả đối tượng Text về Layer bất kì (Layer "0" chẳng hạn).

;============CHUYEN DOI TUONG TU LAYER DEFPOINTS TRONG BLOCK ATTRIBUTE VE LAYER "0"=========
;=======================KANGKUNG 05/04/2013=========================
(defun c:KK()
  (vl-load-com)
  (setq taphop(ssget "_X" '((0 . "INSERT"))) i 0)
  (while (< i (sslength taphop))
    (SETQ EN2(ENTNEXT(ssname taphop i)))
    (SETQ ENLIST2(ENTGET EN2))
    (while (/= (cdr(assoc 0 enlist2)) "SEQEND")
      (setq en2(entnext en2))
      (setq enlist2(entget en2))
      (setq obj(vlax-ename->vla-object en2))
      (if (= "DEFPOINTS" (vla-get-layer obj))
	(vla-put-Layer obj "0")))
    (setq i(1+ i))
    )
  (alert "Well Done")
  )
(princ "\n                Written By KangKung - 05/04/2013\n")
(princ "\n                  Nhap KK de chay chuong trinh\n")

<<

Filename: 230799_kk.lsp
Tác giả: pdle
Bài viết gốc: 195925
Tên lệnh: ip dc an
Đóng băng layer

@all: Cảm ơn tất cả mọi người đã quan tâm giải đáp thắc mắc cho em. Lâu không dùng CAD, không nghịch Lisp, E giờ đã mù tịt rồi.
@ketxu: em sẽ đọc lại nội quy để thực hiện đúng. Từ nay sẽ lại online cadviet đều đều thôi.

Về vấn đề của em, sở dĩ em nghĩ đến dùng lisp bởi công việc được lặp đi lặp lại theo một trình tự nhất định. Đây là file...
>>
@all: Cảm ơn tất cả mọi người đã quan tâm giải đáp thắc mắc cho em. Lâu không dùng CAD, không nghịch Lisp, E giờ đã mù tịt rồi.
@ketxu: em sẽ đọc lại nội quy để thực hiện đúng. Từ nay sẽ lại online cadviet đều đều thôi.

Về vấn đề của em, sở dĩ em nghĩ đến dùng lisp bởi công việc được lặp đi lặp lại theo một trình tự nhất định. Đây là file mẫu:http://www.cadviet.com/upfiles/3/64291_23b010.dwg

Trình tự xử lý như sau:
1. Nhập ip key <lấy từ mã hoàng hóa tương ứng>, thay thế IP KEY của text
2. Thaw layer 3D, xem lại hình 3D đã đúng chưa. Yêu cầu: Điểm thấp nhất của mặt phẳng dưới phải nằm trên mặt phẳng OXY
3. Dùng lệnh _hide để ẩn đường khuất. Sau đó freeze layer 3D. Chuyển view về dạng top, và lưu file dưới dạng CAD 2004.

Với trình tự đó em viết lisp sau:

;;; Lenh doi ip
(defun c:ip(/ s l ip ss)
(
setq s (ssget "_X" (list(cons 0 "TEXT") (cons 8 "PLAN")))
l(sslength s)
)
(setq ip (getstring "IP = "))
(
if(= l 1)
(progn
(
setq ss (entget (ssname s 0))
ss (subst (cons 1 ip) (assoc 1 ss) ss )
)
(entmod ss)
)
)
(
if (/= l 1)
(progn
(
setq ss(entget (car(entsel "Specify The Text")))
ss (subst (cons 1 ip) (assoc 1 ss) ss )
)
(entmod ss)
)
)
(command "laythw")
(command "-view" "sw" )
(command "-visualstyles" "c" "r" )
(princ)
)
;;; Lenh di chuyen
(defun c:dc (/ ss)
(
setq pt1(getpoint "\nBase point:")
pt2(getpoint "\nPlane point:")
z1 (caddr pt1)
z2 (caddr pt2)
pt3 (list 0 0 (- z1 z2))
ss (ssget "_X" (list(cons 8 "3D")))
sp (ssget "_X" (list(cons 8 "PLAN")))
)
(command "move" ss "" pt1 pt3)
(setq pt4(getpoint "\nBase point:")
pt5(list 0 0 0)
)
(command "move" sp "" pt4 pt5)
(princ)
)
;;; Lenh an doi tuong va luu file
(defun c:an (/ ob ss fina link)
(
setq fina (vl-filename-base (getvar "dwgname"))
link "C:\\Users\\pdle\\Desktop\\Technoinox\\Corrected\\"
link (strcat link fina ".dwg")
)
(command "-visualstyles" "c" "2")
(command "_hide")
(command "-layer" "f" "3D" "")
(command "-view" "t")
(command "saveas" "2004" link)
(princ)
)


Minh họa:
1. Đổi IP KEY, dùng lệnh ip
http://www.cadviet.com/upfiles/3/64291_01.jpg

Kết quả như sau:
http://www.cadviet.com/upfiles/3/64291_02.jpg

02. Kiểm tra hình và di chuyển theo yêu cầu. Lệnh dc
http://www.cadviet.com/upfiles/3/64291_03.jpg

03. Lệnh an
http://www.cadviet.com/upfiles/3/64291_04.jpg

Layer 3D ở chế độ freeze:
http://www.cadviet.com/upfiles/3/64291_05.jpg

Mọi người xem hộ em cái lisp, cho ý kiến lisp như thế đã hợp lý chưa? nên sửa chỗ nào cho nhanh và hợp lý hơn với yêu cầu.

Em cảm ơn!
<<

Filename: 195925_ip_dc_an.lsp
Tác giả: Tue_NV
Bài viết gốc: 237737
Tên lệnh: edd
Nhờ các anh chị trong forums viết hộ em lisp sau.


......

..

PS: Sau khi tò mò, mình mới phát hiện ra là dim của bác Tue_NV được lấy màu là byBlock. Cái Block dim này gồm có 10 đối tượng con tạo thành trong đó có tới 7 đối tượng có màu 5 và 3 đối tượng có màu 0.

Để đổi màu các đối tượng con này. mình phải explode cái block dim này ra và...

>>


......

..

PS: Sau khi tò mò, mình mới phát hiện ra là dim của bác Tue_NV được lấy màu là byBlock. Cái Block dim này gồm có 10 đối tượng con tạo thành trong đó có tới 7 đối tượng có màu 5 và 3 đối tượng có màu 0.

Để đổi màu các đối tượng con này. mình phải explode cái block dim này ra và như vậy làm cho tính associate của nó bị phá vỡ cho dù sau đó mình hoàn toàn có thể tạo block lại với các đối tượng con mới này. Điều này có nhẽ là chủ thớt cũng không khoái, nhưng mình chưa biết cách nào hơn nên đành gác tay chờ các bác khác ra sức vậy.

 

Cái này em thấy đơn giản mà bác. Code của bác đây, em chỉnh lại:

 

(defun c:edd ( / ssd els)
(vl-load-com)
(command "undo" "be")
(setq ssd (acet-ss-to-list (ssget (list (cons 0 "dimension")))))
(foreach dm ssd
     (if (/= (cdr (assoc 1 (entget dm))) "")
            (command "._DIMOVERRIDE" "DIMCLRT" "2" "DIMCLRD" "2" "DIMCLRE" "2" "" dm "")
     )
     (entmod els)
)
(command "undo" "e")
(princ)
)

<<

Filename: 237737_edd.lsp
Tác giả: Noob_Lisp
Bài viết gốc: 123292
Tên lệnh: ll
Thống kê hình dạng line


Bạn xem thử có được không? Nếu có thời gian sẽ phát triển thêm phân theo hình dạng, tính tổng chiều dài từng loại v.v..


Filename: 123292_ll.lsp
Tác giả: hoapt8903
Bài viết gốc: 68700
Tên lệnh: brt
tạo Block cho các đối tuợng vừa vẽ

Em xin chân thành cảm ơn anh Duy nhiều. Nhưng thật sự là em mới làm quen với lisp nên cũng ko hiểu ý của anh. Em đưa file lisp của em lên. anh code cho em 1 đoạn với




vấn đề của em là khi chạy lisp trên thì đc hình vẽ, nhưng em muốn Block cái bánh răng lại thành 1 Block cho dễ thao tác và lắp ghép với các đối tượng khác. Em xin cảm ơn trước.

Filename: 68700_brt.lsp
Tác giả: FoJ
Bài viết gốc: 9088
Tên lệnh: nn
Nối Pline của diễn đàn bị lỗi
em đã sử dụng lisp NN để nối Pline, nhưng sao với đời cad2007 em thấy hình như nó bị rơi vào 1 vòng lặp mà không có điểm dùng, chỉ có cách là endtask cái cad thôi, các bác giúp em được không ?



em không rành về lisp lắm chỉ biết ứng dụng thôi, còn các bác bảo em ngồi coding thì em chịu à, hì hì

Filename: 9088_nn.lsp
Tác giả: phamthanhbinh
Bài viết gốc: 194567
Tên lệnh: cyc ak
vẽ đường cyloid (x,y)

Hề hề hề,
Xin lỗi bạn vì mình chậm trả lời. Thú thực là việc đọc một lisp mà chưa hiểu ý đồ người viết thì không đơn giản chút nào.

Bạn có thể tham khảo lisp sau đây của bác SSG về việc vẽ bánh răng cycloid.

Chúc bạn vui.

Filename: 194567_cyc_ak.lsp
Tác giả: tuan_thietkedien
Bài viết gốc: 49995
Tên lệnh: ktt
Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

Các bác xem dùm em cái lisp này, em muốn kiểm tra text nào có Style không phải CADVIET thì báo và sửa lại thành Style CADVIET, mà sao nó gặp thằng text nào đúng hay sai gì cũng báo hết. :cheers:


Filename: 49995_ktt.lsp
Tác giả: gia_bach
Bài viết gốc: 55713
Tên lệnh: xoay
Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

Vì bạn chỉ xử lý code DXF 50 nên Tui đoán bạn muốn quay Text theo góc nhập vào. (bởi vì với các đối tượng khác như ARC, LINE... thì phải sử dụng cách khác )
Hơn nữa trong LISP nói chung : đơn vị góc được tính bằng Radian chứ không phải độ.
do đó bạn cần chuyển đổi từ độ -> radian
(defun deg->rad (f_ang)
(setq f_ang (* pi (/ f_ang 180.0)))
)

đây là LISP đã...
>>

Vì bạn chỉ xử lý code DXF 50 nên Tui đoán bạn muốn quay Text theo góc nhập vào. (bởi vì với các đối tượng khác như ARC, LINE... thì phải sử dụng cách khác )
Hơn nữa trong LISP nói chung : đơn vị góc được tính bằng Radian chứ không phải độ.
do đó bạn cần chuyển đổi từ độ -> radian
(defun deg->rad (f_ang)
(setq f_ang (* pi (/ f_ang 180.0)))
)

đây là LISP đã sửa đổi, hy vọng đúng ý bạn.

<<

Filename: 55713_xoay.lsp
Tác giả: Tue_NV
Bài viết gốc: 84598
Tên lệnh: ous
Cho mình xin Lisp Erase short object và Extend undershoots!

truongthanh sử dụng code này thử xem nhé :


:cheers:

Filename: 84598_ous.lsp
Tác giả: Tue_NV
Bài viết gốc: 76406
Tên lệnh: m um
Lisp đưa đối tượng về vị trí cũ sau khi move?

Tức là ta UM (unmove cho đến khi nào) mà số phần tử trong tập hợp chọn SS2 bằng 0 thì không thể UM được nữa -> Cái này theo đúng như ý của User. Hơn nữa, khi Un (unmove) các đối tượng không bị move nhầm thì các đối tượng này không có tác dụng gì cả (theo đúng ý của user luôn) :bigsmile:
>>

Tức là ta UM (unmove cho đến khi nào) mà số phần tử trong tập hợp chọn SS2 bằng 0 thì không thể UM được nữa -> Cái này theo đúng như ý của User. Hơn nữa, khi Un (unmove) các đối tượng không bị move nhầm thì các đối tượng này không có tác dụng gì cả (theo đúng ý của user luôn) :bigsmile:
Các bạn hãy thử Code này và cho biết ý kiến nhé :

<<

Filename: 76406_m_um.lsp
Tác giả: Tue_NV
Bài viết gốc: 224549
Tên lệnh: st
Cải tạo các lệnh cơ bản của cad
Lệnh ST cải tạo lại trên code của bạn ThuyLinh
- Muốn gọi hộp thoại ST -> ở dòng select object -> pick vào vùng trống trên màn hình hoặc enter
- Muốn gọi Style của Text -> ở dòng select object -> pick vào Text

Filename: 224549_st.lsp
Tác giả: gadibo
Bài viết gốc: 238255
Tên lệnh: tlt
Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

em đang viết 1 đoạn code ngắn , trong đó dùng vòng lặp while nhưng ko hiểu sao vòng lặp lại ko kết thúc dc , nó cứ lặp mãi dẫn đến việc treo máy .em post lên nhờ các bác phân tích lỗi hộ e .

thank các bác .

(defun c:TLT ( / a b mai )
(setvar "osmode" 33 )
(setq a (getpoint "\n pick diem dau ranh"))
(setvar "osmode" 0 )
(setq b (polar a 0 1.2))
(command "TL" a "0.4" "100" "0.4" "0" "0.4"...
>>

em đang viết 1 đoạn code ngắn , trong đó dùng vòng lặp while nhưng ko hiểu sao vòng lặp lại ko kết thúc dc , nó cứ lặp mãi dẫn đến việc treo máy .em post lên nhờ các bác phân tích lỗi hộ e .

thank các bác .

(defun c:TLT ( / a b mai )
(setvar "osmode" 33 )
(setq a (getpoint "\n pick diem dau ranh"))
(setvar "osmode" 0 )
(setq b (polar a 0 1.2))
(command "TL" a "0.4" "100" "0.4" "0" "0.4" "-100")
(initget 1 "1 75")
(while (setq mai (getkword "\n nhap do doc mai <1 hoac 75>: "))
(if (= mai "1")
(command "6" "-100" "2" "10")
(command "8" (-(/ 100 0.75)) "2" "10")
)
(initget 1 "1 75")
)
(command "" a b "")
(setvar "osmode" 33 )
(princ)
)

<<

Filename: 238255_tlt.lsp
Tác giả: gadibo
Bài viết gốc: 238261
Tên lệnh: tlt
Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

1). Initget mà có 1 >> không chấp nhận enter >> không thể thoát bằng cách enter >> bỏ số 1 đi.

2). Lệnh TL là lệnh gì vậy?

em đã làm dc ,thay bit bằng 2 thì nó đã kết thúc .

PS : cho em hỏi chút về hàm while :

(while TESTEXPR EXPR ....)

TESTEXPR là điều kiện để lặp còn...

>>

1). Initget mà có 1 >> không chấp nhận enter >> không thể thoát bằng cách enter >> bỏ số 1 đi.

2). Lệnh TL là lệnh gì vậy?

em đã làm dc ,thay bit bằng 2 thì nó đã kết thúc .

PS : cho em hỏi chút về hàm while :

(while TESTEXPR EXPR ....)

TESTEXPR là điều kiện để lặp còn EXPR biểu thức định giá trị .

em đang mơ hồ ở chỗ

(defun c:TLT ( / a b mai )
(setvar "osmode" 33 )
(setq a (getpoint "\n pick diem dau ranh"))
(setvar "osmode" 0 )
(setq b (polar a 0 1.2))
(command "TL" a "0.4" "100" "0.4" "0" "0.4" "-100")
(initget 1 "1 75")
(while (setq mai (getkword "\n nhap do doc mai <1 hoac 75>: ")) ; điều kiện
(if (= mai "1"); biểu thức sau điều kiện
(command "6" "-100" "2" "10")
(command "8" (-(/ 100 0.75)) "2" "10")
)
(initget 1 "1 75") ; tại sao lại phải thêm cái này vào thì vòng lặp mới ổn ( có thể em chưa hiểu lắm )
)
(command "" a b "")
(setvar "osmode" 33 )
(princ)
)

<<

Filename: 238261_tlt.lsp
Tác giả: tien2005
Bài viết gốc: 238054
Tên lệnh: edd
Nhờ các anh chị trong forums viết hộ em lisp sau.

Mình cũng mót được cái này của Ketxu (lisp tìm dim fake) 

(defun c:edd ( / ss)
  (vl-load-com)
  (ssget "_X" '((0 . "*DIMENSION") (1 . "*?*")))
  (vlax-for x (setq ss (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))) (vla-put-TextColor x 2))
  (vla-delete ss)
  (princ)
  )

Filename: 238054_edd.lsp
Tác giả: loprjnce
Bài viết gốc: 238395
Tên lệnh: doily
Quét, lọc và thay đổi Layer cho nhóm đối tượng.

Mình có chỉnh đoạn code lại theo layer của mình như sau:

(defun c:doily()
(progn
  (setq Lay_nguon "1" Lay_dich "1a")
  (setq ss (ssget (list(cons 8 Lay_nguon))))
  (if (and Lay_nguon Lay_dich ss)
    (setq i -1)(while (< (setq i (1+ i)) (sslength ss)) (entmod(subst (cons 8 Lay_dich) (assoc 8 (setq ent (entget (ssname ss i)))) ent))))
  (princ "chuc ban thanh cong")
  (princ)
  )
(setq Lay_nguon "1" Lay_dich "1a")
(setq ss (ssget...
>>

Mình có chỉnh đoạn code lại theo layer của mình như sau:

(defun c:doily()
(progn
  (setq Lay_nguon "1" Lay_dich "1a")
  (setq ss (ssget (list(cons 8 Lay_nguon))))
  (if (and Lay_nguon Lay_dich ss)
    (setq i -1)(while (< (setq i (1+ i)) (sslength ss)) (entmod(subst (cons 8 Lay_dich) (assoc 8 (setq ent (entget (ssname ss i)))) ent))))
  (princ "chuc ban thanh cong")
  (princ)
  )
(setq Lay_nguon "1" Lay_dich "1a")
(setq ss (ssget (list(cons 8 Lay_nguon))))
(if (and Lay_nguon Lay_dich ss)
    (setq i -1)(while (< (setq i (1+ i)) (sslength ss)) (entmod(subst (cons 8 Lay_dich) (assoc 8 (setq ent (entget (ssname ss i)))) ent))))
(vl-cmdf  "change" ss "" "p" "la" Lay_dich "")
(command "change" ss "" "p" "la" Lay_dich "")
(setq i -1)(while (< (setq i (1+ i)) (sslength ss)) (entmod(subst (cons 8 Lay_dich) (assoc 8 (setq ent (entget (ssname ss i)))) ent)))))

nhưng vấn đề là:

- Khi load active hiện lỗi "; error: extra right paren on input" (mình cũng không rõ lỗi gì)

- Khi command "doily" > quét vùng đối tượng > cad lọc quét chọn những đối tượng như layer mình muốn > "space" > chuc ban thanh cong > "space". Thế là hết lệnh! Nó không tự chuyển từ Lay_nguon sang Lay_dich như mình đã gán.

 

Mong AE hướng dẫn dùm. THanks all...

 

 

; error: extra right paren on input
 
; error: extra right paren on input

<<

Filename: 238395_doily.lsp
Tác giả: Tue_NV
Bài viết gốc: 88459
Tên lệnh: cong
Viết lisp theo yêu cầu [phần 2]

Cảm ơn bác Hoành. Cho phép Tue_NV học được điều này giúp cho bạn HoangVuTuan
Bạn HoangVuTuan sử dụng thử code sau :

Chức năng Download Lisp file bị lỗi bác Hoành ạ. Nhờ bác sửa giúp.
Bạn HoangVuTuan nhấn nút Reply bài viết này -> Chép hết code về chạy nhé.

Filename: 88459_cong.lsp
Tác giả: ro88
Bài viết gốc: 238501
Tên lệnh: td1
Lisp xuất tọa độ

các bác ơi, cho em hỏi tí là muốn sửa để phần toạ độ XY có 4 số sau dấu phẩy (,) thì làm thế nào ạ! cả thay đổi cột YX thành XY nữa! cảm ơn các bác

 

thanks vì lisp của bạn cái mình đang cần
mình có 1...

>>

các bác ơi, cho em hỏi tí là muốn sửa để phần toạ độ XY có 4 số sau dấu phẩy (,) thì làm thế nào ạ! cả thay đổi cột YX thành XY nữa! cảm ơn các bác

 

thanks vì lisp của bạn cái mình đang cần
mình có 1 yêu cầu nhỏ là bạn có thể chỉnh lại cho số tọa độ lấy làm tròn 2 số lẻ dc ko ( trong lisp lấy 3 số lẻ)
thank a lot

http://www.cadviet.com/upfiles/3/23835_xxx.lsp

 

Mình up cho các bạn lisp này theo yêu cầu cái này mình cũng sư tầm trên cadviet. nhờ rất nhiều người sửa giúp.

cái XY hay YX thì chịu khó sửa đi chứ mình ko biết.

Lệnh là TD1 nhé:

;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.com/forum/index.php?showtopic=63922&pid=213751&st=0&#entry213751
;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.com/forum/index.php?showtopic=63922&pid=199638&st=0&#entry199638
;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.com/forum/index.php?showtopic=13203&st=3100
;; free lisp from cadviet.com
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Chuong trinh danh so va lap bang toa do ho so thua dat dia chinh
;;;Bang toa do tao thanh block, duoc dat ten theo so thu tu 1, 2, 3...
;;;Chap nhan cac doi tuong la Region, Polyline, Line va Arc khep kin
;;;Written by - January 2009 - www.cadviet.com
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;PUBLIC FUNCTIONS
;;;-------------------------------------------------------------------------------
(Defun DTR (x) (/ (* x pi) 180))
;;;change degree to radian, return REAL
;;;-------------------------------------------------------------------------------
(defun lineP (p0 a r / p1)
;;;Line polar: point, degree angle, radius
  (setq p1 (polar p0 (dtr a) r))
  (command "line" p0 p1 "")
)
;;;-------------------------------------------------------------------------------
(defun linePX (p0 x) (lineP p0 0 x))
;;;Horizontal line: length x, from p0
;;;-------------------------------------------------------------------------------
(defun linePY (p0 y) (lineP p0 90 y))
;;;Vertical line: length y, from p0
;;;-------------------------------------------------------------------------------
(defun getVert (e / i L)
;;;Return list of all vertex from pline e
  (setq	i 0
	L nil
  )
  (vl-load-com)
  (repeat (fix (+ (vlax-curve-getEndParam e) 1))
(setq L (append L (list (vlax-curve-getPointAtParam e i))))
(setq i (1+ i))
  )
  L
)
;;; First point of List rearrangement
(defun relist(pt0 Lst / i rt)
  (setq i 0)
  (foreach pt Lst
(if (equal pt0 pt 0.001)
   (setq rt i))
(setq i (1+ i)))
  (append (append (member (nth rt Lst) Lst)
  	(cdr (reverse (cdr (member (nth rt Lst) (reverse Lst))))))
  	(list (nth rt Lst)))
)
;;;New Layer
(defun newlayer(a b c d)
(if (not (tblsearch "layer" a))
	(command "-layer" "n" a "c" b a "l" c a "lw" d a ""))
)
;;;-------------------------------------------------------------------------------
(defun wtxtMC (txt p h k)
;;;Write text Middle Center, specify text, point, height
  (entmake (list (cons 0 "TEXT")
  	(cons 7 (getvar "textstyle"))
  	(cons 1 txt)
  	(cons 10 p)
  	(cons 11 p)
  	(cons 40 h)
  	(cons 72 1)
  	(cons 73 2)
  	(if k (cons 51 (DTR 18)) (cons 51 0))
	)
  )
)
;;;-------------------------------------------------------------------------------
(defun Collect (e / e2 SS)
;;;Selection set from e to entlast
  (setq SS (ssadd))
  (ssadd e SS)
  (while (setq e2 (entnext e)) (ssadd e2 SS) (setq e e2))
  SS
)
;;;-------------------------------------------------------------------------------
(defun Collect1	(e / ss)
;;;Selection set after e to entlast. If e nil, select all from fist entity of drawing.
  (if (= e nil)
(setq ss (collect (entnext)))
(progn (setq ss (collect e)) (ssdel e ss))
  )
)
;;;-------------------------------------------------------------------------------
;;;PRIVATE FUNCTIONS
;;;-------------------------------------------------------------------------------
(defun txt1 (txtL / p1 p2 p3 p4 pL i)
;;;Write texts in 1 row
  (setq
p1 (list (+ (car p0) (* 2 h)) (- (cadr p0) (* 1.5 h)))
p2 (polar p1 0 (* 7 h))
p3 (polar p2 0 (* 10 h))
p4 (polar p3 0 (* 9 h))
pL (list p1 p2 p3 p4)
i  0
  )
  (repeat 4
(wtxtMC (nth i txtL) (nth i pL) h t)
(setq i (1+ i))
  )
)
;;;-------------------------------------------------------------------------------
(defun txt2 (txtL / p1 p2 p3 p4 pL i)
;;;Write texts in 1 row
  (setq
p1 (list (+ (car p0) (* 2 h)) (- (cadr p0) (* 1.5 h)))
p2 (polar p1 0 (* 7 h))
p3 (polar p2 0 (* 10 h))
p4 (polar p3 0 (* 9 h))
p4 (polar p4 (* 0.5 pi) h)
pL (list p1 p2 p3 p4)
i  0
  )
  (repeat 4
(wtxtMC (nth i txtL) (nth i pL) h t)
(setq i (1+ i))
  )
)
;;;-------------------------------------------------------------------------------
;;;MAIN PROGRAM
;;;-------------------------------------------------------------------------------
(defun C:TD1 (/ h p et p0 p00 p01 p02 pt pvL pvL1 n j pv num txtL ss bn ntp p11 p12 p13 p14)
  (setvar "cmdecho" 0)
;;;New layer check
  (newlayer "kichthuoc" 7 "continuous" "default")
  (newlayer "stt" 1 "continuous" "default")
  (newlayer "bangtd" 7 "continuous" "default")
;;;GET TEXT HEIGHT
  (if (not h0)  (setq h0 1))
  (setq h (getreal (strcat "\nChon chieu cao text <" (rtos h0) ">:")))
  (if (not h)  (setq h h0)  (setq h0 h))
;;;GET DECIMAL PRECISION
  (if (not ntp0)  (setq ntp0 2))
  (setq ntp (getint (strcat "\nSo chu so thap phan <" (itoa ntp0) ">:")))
  (if (not ntp)  (setq ntp ntp0)  (setq ntp0 ntp))
;;;GET CIRCLE RADIUS
  (if (not cr0)  (setq cr0 0.3))
  (setq cr (getreal (strcat "\nNhap ban kinh vong tron <" (rtos cr0) ">:")))
  (if cr (setq cr0 cr))

;;;PICK & BASE POINT
  (initget "Y")
  (setq save (getkword "\nBan co muon luu file? < Y / Enter for No >:"))

  (setq oldos (getvar "osmode")
	pdau (getpoint "\nPick diem dau tien (so thu tu = M1): " )
  ) 

  ;(while pdau
(setq p (getpoint "\nPick 1 diem giua mien kin:")
          	pvL nil pvL1 nil)
(command "boundary" p "")
(setq et (entlast)
         	pvL1 (reverse (getvert et))) 
(redraw et 3) 
(setq p00 (getpoint "\nDiem dat Bang TDGR:"))
(initget "T t N n")
(setq chieu (getkword "\nLua chon chieu ghi toa do < T/N >"))
(command "erase" et "")
(setq  p0 p00
    	p01  (polar p00 (* 1.5 pi) (* h 3))   
    	pvL  (relist pdau pvL1)
    	n	(length pvL)
    	p02	(polar p01 (* 1.5 pi) (+ (* h 3) (* (1- n) h 2)))
) 
(setvar "osmode" 0)
;;;HEADER
  (setvar "CLAYER" "bangtd")
  (linepx p0 (* 32 h))
  (command "copy" "L" "" "m" p00 p01 "")
  (setq Lkqua nil)
  (command "style" "Standard" ".Arial" "" "" "" "" "")
  (wtxtMC "B¶ng kª to¹ d«d vµ kho¶ng c¸ch"
  	(polar (polar p0 0 (* 16 h)) (* 0.5 pi) (* 4 h))
  	(* 1.2 h) nil)
  (wtxtMC "H? t?a d? VN-2000"
  	(polar (polar p0 0 (* 16 h)) (* 0.5 pi) (* 2 h))
  	(* 1.2 h) nil)
  (txt1 (setq Lkq (list "TT" "Y (m)" "X (m)" "S (m)")))
  (setq Lkqua (append Lkqua (list Lkq)))
  (setq p0 (polar p0 (* 1.5 pi) (* 3 h)))
;;;MAKE RECORDS
  (if (or (= chieu "N") (= chieu "n")) (setq pvL (reverse pvL)) )
  (setq	j  0
	pt nil)
  (repeat n
(setq
   pv  (nth j pvL)
   num (itoa (1+ j))
num (strcat "M" num)
)
(if	pt
   (setq S (rtos (distance pt pv) 2 ntp))
   (setq S "")
)
(setq
   txtL (list num (rtos (car pv) 2 ntp) (rtos (cadr pv) 2 ntp) S)
   Lkqua (append Lkqua (list txtL))
)
(txt2 txtL)
(setq p11 (polar p0 (* 1.5 pi) (* 2.5 h)))
(setq P12 (polar p11 0 (* 25 h)))
(setq P13 (polar p11 0 (* 31 h)))
(setq P14 (polar p11 0 (* 32 h)))
(command "LINE" p11 p12 "")
(command "LINE" p13 p14 "")
(setq p0 (polar p0 (* 1.5 pi) (* 2 h)))
(setq pt pv)
(setq j (1+ j))
(if	(= j (- n 1))  (setq j 0))
  )
  (command "LINE" p11 p14 "")
  (linepy p00 (- (distance p00 (polar p0 (* 1.5 pi) (* 0.5 h)) )))
  (command "copy" "L" "" "m"  p0
	(list (+ (car p0) (* 4 h)) (cadr p0))
	(list (+ (car p0) (* 14 h)) (cadr p0))
	(list (+ (car p0) (* 24 h)) (cadr p0))
	(list (+ (car p0) (* 32 h)) (cadr p0))
	"")
;;;WRITE POINT NAME
  (setvar "CLAYER" "stt")
  (setq j 0)
  (repeat (1- n)
(setq
   pv  (nth j pvL)
   num (itoa (1+ j))
num (strcat "M" num)
)
(wtxtMC num (polar pv 0 h) h t)
(command "circle" pv cr0)
(command "HATCH" "solid" "L" "")
(command "erase" vtron "")
(setq j (1+ j))
  )
;;;GHI CANH THUA
(setvar "CLAYER" "kichthuoc")
(ghicanh) 
;;;FINISH
(savef)
(setvar "osmode" oldos)
;(setq pdau (getpoint "\nPick diem dau tien (so thu tu = 1) :"))
  ;;; ) 
  (setvar "cmdecho" 1)
  (princ)
)
;;;-------------------------------------------------------------------------------
(defun savef() 
  (if save
(progn
   (setq file (open (setq tenfile (strcat (getvar "dwgprefix")
 	(vl-filename-base (vl-string-right-trim "\\" (getvar "dwgname"))) ".txt")) "a"))
   (foreach line Lkqua
	(setq line1 "")
	(foreach it line
  	(setq line1 (strcat line1 " " it)))
	(write-line line1 file)
   )
   (close file)
   (princ (strcat "\nDa luu thanh file " tenfile))
)
  )
)
;;;PHAN BO SUNG
;;;------------------------------------------------------------------------------------
(defun Text_canh_TCA (S p a )
;;;Entmake text S at p with angle A - Top Center
  (if (/= p nil)
(entmake (list
    	(cons 0 "TEXT")
    	(cons 62 2)
    	(cons 10 p)
    	(cons 40 h)
    	(cons 1 S)
    	(cons 50 a )
    	(cons 41 0.7)
    	(cons 7 (getvar "textstyle"))
    	(cons 72 1)
    	(cons 11 p)
    	(cons 73 3)
  	)
)
  )
)
;;;------------------------------------------------------------------------------------
(defun Text_canh_BCA (S p a )
;;;Entmake text S at p with angle A - Bottom Center
  (if (/= p nil)
(entmake (list
    	(cons 0 "TEXT")
    	(cons 62 2)
    	(cons 10 p)
    	(cons 40 h)
    	(cons 1 S)
    	(cons 50 a )
    	(cons 41 0.7)
    	(cons 7 (getvar "textstyle"))
    	(cons 72 1)
    	(cons 11 p)
    	(cons 73 1)
  	)
)
  )
)
;;;-------------------------------------------------------------------------------
(defun Ghicanh (/ i k p1 p2 dist rad x_mp y_mp mp mp1)
  (setq
i	0  
k	(1- (length pvL))
  )
  (repeat k
(setq
   p1   (nth i pvL)
   p2   (nth (+ i 1) pvL)
   dist (distance p1 p2)
   rad  (angle p1 p2)
   x_mp (* (+ (car p1) (car p2)) 0.5)
   y_mp (* (+ (cadr p1) (cadr p2)) 0.5)
   mp   (list x_mp y_mp)
)
(if	(and (> rad (* 0.5 pi)) (<= rad (* 1.5 pi)))
   (setq mp (polar mp (+ rad (* 0.5 pi)) (* 0.3 h)))
)
(if	(and (> rad (* 0.5 pi)) (<= rad (* 1.5 pi)))
   (progn
	(setq rad (+ rad pi))
	;(Text_canh_TCA (rtos dist 2 2) mp rad)
)
   ;(Text_canh_BCA (rtos dist 2 2) mp rad)
)
(setq mp1 (polar mp (angle p mp) (* 2 h)) )
(command "DIMALIGNED" p1 p2 mp1)
(setq i (1+ i))
  )
  ;; repeat k;
)
;;;--------------------------


<<

Filename: 238501_td1.lsp
Tác giả: Doan Van Ha
Bài viết gốc: 238659
Tên lệnh: ha
[Yêu cầu] Lisp Move đối tượng hàng loạt được chọn trước

Lisp move từng nhóm đối tượng đến 1 Line cho trước.

Có 4 cách chọn kiểu đối tượng để Move: Point (nhập "P"), Text phía trên (nhập "TT"), Text phía dưới (nhập "TD") và cả 3 đối tượng (nhập "3").

Lệnh dùng: HA

;Doan Van Ha - CADViet.com - Ngay 16/6/2013
;Chuc nang: Move tung nhom doi tuong den 1 Lien.
(defun C:HA( / kieu typ lay ent ss p1 p2 pt z osm cmd)
 (command "undo"...
>>

Lisp move từng nhóm đối tượng đến 1 Line cho trước.

Có 4 cách chọn kiểu đối tượng để Move: Point (nhập "P"), Text phía trên (nhập "TT"), Text phía dưới (nhập "TD") và cả 3 đối tượng (nhập "3").

Lệnh dùng: HA

;Doan Van Ha - CADViet.com - Ngay 16/6/2013
;Chuc nang: Move tung nhom doi tuong den 1 Lien.
(defun C:HA( / kieu typ lay ent ss p1 p2 pt z osm cmd)
 (command "undo" "be") (setq osm (getvar "osmode") cmd (getvar "cmdecho"))
 (initget "P TT TD 3")
 (setq kieu (getkword "\nKieu doi tuong can Move : "))
 (cond
  ((= kieu "P") (setq typ "Point" lay "diem"))
  ((= kieu "TT") (setq typ "Text" lay "Tendiem"))
  ((= kieu "TD") (setq typ "Text" lay "Docao"))
  ((= kieu "3") (setq typ "Point,Text" lay "diem,Tendiem,Docao")))
 (if
  (and
   (setq ent (car (entsel "\nChon Line: ")))
   (princ "\nChon cac doi tuong can Move...")
   (setq ss (ssget (list (cons 0 typ) (cons 8 lay)))))
  (progn 
   (setvar "osmode" 0) (setvar "cmdecho" 0)
   (setq p1 (cdr (assoc 10 (entget ent))))
   (setq p2 (cdr (assoc 11 (entget ent))))
   (setq z -1)
   (repeat (sslength ss)
    (setq pt (cdr (assoc 10 (entget (ssname ss (setq z (1+ z)))))))
    (command "move" ss "" pt (FindPerpPoint p1 p2 pt)))))
 (setvar "osmode" osm) (setvar "cmdecho" cmd) (command "undo" "e") (princ))
(defun FindPerpPoint (p1 p2 q / x1 x2 x3 y1 y2 y3 z1 z2 z3 T4)
 (setq x1 (car p1) x2 (car p2) x3 (car q)
       y1 (cadr p1) y2 (cadr p2) y3 (cadr q)
       z1 (caddr p1) z2 (caddr p2) z3 (caddr q)
       T4 (/ (+ (* (- x2 x1) (- x3 x1)) (* (- y2 y1) (- y3 y1)) (* (- z2 z1) (- z3 z1)))
             (+ (* (- x2 x1) (- x2 x1)) (* (- y2 y1) (- y2 y1)) (* (- z2 z1) (- z2 z1)))))
 (list (+ x1 (* T4 (- x2 x1))) (+ y1 (* T4 (- y2 y1))) (+ z1 (* T4 (- z2 z1)))))


<<

Filename: 238659_ha.lsp

Trang 133/304

133