Chuyển đến nội dung
Diễn đàn CADViet
Nguyen Hoanh

Viết Lisp theo yêu cầu

Các bài được khuyến nghị

Bạn hãy thay tất cả những chữ USERR3 thành USERR2 trong đoạn Lisp vẽ thép âm thôi nhé.

Đoạn Lisp vẽ thép dương có USERR3 thì không thay.

Hãy chạy thử xem

Chúc thành công :cry:

 

 

Ô yeah!!!!!!!!!!!

Ngon rồi bác ạ! :cry:

 

 

Bác nhiệt tình quá !

 

Cảm ơn bác!

Cảm ơn CadViet!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

à mình load thêm 1 chương trình hổ trợ vào cad. sau đó đánh lệnh vào đó và chọn tất cả bản vẽ cần sửa và ok thế là xong. nhưng có điều là tiếng hàn bạn ạ. thử tham khảo sem nhé.

http://www.cadviet.com/upfiles/EZ.zip

http://www.cadviet.com/upfiles/FastStoneEditor.bmp

à chỉ hổ trợ cad2002 thôi bạn nhé

tải về giải nén ra chép vào support rồi ap load nó vào là được. gõ lệnh ez nhé.

chuc bạn thành công

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
oh.hay lắm cảm ơn bạn nhiều nha. đó là bản vẽ được xuất từ tekla ra mà.sau khi xoá mình sẽ exten từ đường trên cùng xuống vậy.vì mình dùng tự động chỉnh sửa cho tất cả các bản vẻ giống nhau mà kô cần phải mở từng bản lên nên như vậy cũng là tốt rồi. chú7 lúc trước mình dùng filter để chọn line thì nó hiện lên cái bảng filter selection nên kô làm tự động được giờ thì ok rồi. thank bạn nhiều

Chào bạn ngocthinh84,

Sau một hồi, lần mò tìm cách, cuối cùng mình đã ra được cái lisp có thể giải quyết được yêu cầu của bạn. Chạy thử với cái bản vẽ bạn gửi thì Ok. Bạn xài thử xem và cho mình biết kết quả nhé.

Cái khó nhất với mình là việc phải sắp xếp lại các điểm đầu và cuối của mỗi đoạn thẳng sao cho nó có một trật tự nhất định. Còn trên bản vẽ của bạn nó lung tung quá, cái trước cái sau nó tèm lem cả. Trong lisp này mình phải dùng một mẹo nhỏ mới sắp xếp nổi nó theo tọa độ x của điểm. Sau khi sắp xếp được rồi thì chỉ cần chọn hai điểm có tọa độ y lớn nhất và nhỏ nhất trong mỗi cụm điểm cùng x là vẽ được đường thẳng cần thiết ngay.

Rất mong bạn thông cảm vì phải chờ lâu do trình độ lisp của mình còn hạn chế.

Lisp đây:

(defun c:nl ()
(setq Oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq ss (ssget (list (cons 0 "LINE"))))
(setq i 0
  n (sslength ss)
  lst '()
)
(While (	   (setq e (ssname ss i)
		 elist (entget e)
   )
   (if (= (car (cdr (assoc 10 elist))) (car (cdr (assoc 11 elist)))) 
	   (progn
			 (setq p1 (cdr (assoc 10 elist))
				   p2 (cdr (assoc 11 elist))
				   lst (append (list p1) lst)
				   lst (append (list p2) lst)
			 )
			 (entdel e)
	   )
	)
	(setq  i (1+ i))
)

(setq lsts (list))
(while (/= nil lst)
(setq st (car (nth 0 lst))
  lst0 '()
  lst0 (append (list (nth 0 lst)) lst0)
)
(foreach p lst
  (if (= (car p) st)
	  (setq lst0 (append (list p) lst0))
  )
)
(setq lst0 (list lst0))
(foreach p lst
   (if (/= (car p) st)
	   (setq lst0 (append (list p) lst0))
   )
)
(setq lst0 (reverse lst0))
(setq lst2 (car lst0)
  lst (cdr lst0)
)
(foreach q lst2
	(setq lsts (append (list q) lsts))
)
)
(setq lst lsts)







(While (/= nil lst)
(setq lst1 '())
(setq j 0)
(setq a (car (nth 0 lst)))
(While (/= nil (nth j lst))
   (if (= (car (nth j lst)) a)
	   (progn
			 (setq lst1 (cons (cadr (nth j lst)) lst1))
	   )
	)

	(setq j (1+ j))
) 
(setq b (nth 0 lst1))
(foreach c lst1
	 (if ()
(setq c (nth 0 lst1))
(foreach d lst1
	 (if (>= d c) (setq c d))
)
(command "line" (list a b) (list a c) "")
(if (/= (car (nth 0 lst)) (car (nth 1 lst)))
(setq lst (cdr lst))
(progn
	  (while (= (car (nth 0 lst)) (car (nth 1 lst)))
		   (setq lst (cdr lst))
	  )
)
)
)
(setvar "osmode" oldos)
(princ)
)

 

Chúc bạn vui và hãy chia xẻ với mọi người. Rất cám ơn bạn về những điều bạn đã chia xẻ cùng mọi người

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Các cao thủ có thể viết giùm em cái Lisp để dùng Draw Order --> Send to back hoặc Bring to front bằng lệnh được không ạ. Cái này cũng hay phải dùng mà cứ phải dùng thanh công cụ thì hơi lâu. Em cũng tìm khắp diễn đàn mà chưa thấy Lisp này. Các bác giúp em nhé. Thanks Cad Viet

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Các cao thủ có thể viết giùm em cái Lisp để dùng Draw Order --> Send to back hoặc Bring to front bằng lệnh được không ạ. Cái này cũng hay phải dùng mà cứ phải dùng thanh công cụ thì hơi lâu. Em cũng tìm khắp diễn đàn mà chưa thấy Lisp này. Các bác giúp em nhé. Thanks Cad Viet

Chào bạn hiepmeo,

Bạn xài thử cái này xem nhé.

(defun c:drob ()
(command "draworder" (ssget) "" "b")
)
(defun c:drof ()
(command "draworder" (ssget) "" "f")
)

Lệnh draworder bring to back là drob, còn bring to front là drof bạn nhé.

Có điều bạn cần lưu ý như sau:

1/- lệnh này có nhanh hơn cái việc dùng toolbar là do kỹ năng xài cad của bạn. Bởi lệnh này cũng cần xài tới 4 ký tự và một phát enter. Nếu bạn muốn nhanh hơn có thể bỏ bớt ký tự trong hàm lệnh.

2/- Đây cũng là cấu trúc chung cho các hàm lệnh sử dụng các lệnh sẵn có của cad. Việc sử dụng các hàm lệnh này thực ra chưa chắc đã hay hơn việc nhập lệnh trên dòng command. Không nên quá lạm dụng nó vì nó có thể gấy rối cho cad nhất là khi có quá nhiều các lệnh kiểu này.

3/- Dựa vào cấu trúc này bạn có thể tạo bất cứ hàm lệnh cad nào mà bạn muốn, miễn là bạn phải hiểu rõ cấu trúc, trình tự thực hiện của từng lệnh trong Cad. Hy vọng rằng bạn sẽ có thể tự tạo được các lệnh phù hợp với yêu cầu của bạn.

 

Chúc bạn thành công.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bạn hiepmeo,

Bạn xài thử cái này xem nhé.

(defun c:drob ()
(command "draworder" (ssget) "" "b")
)
(defun c:drof ()
(command "draworder" (ssget) "" "f")
)

Lệnh draworder bring to back là drob, còn bring to front là drof bạn nhé.

Có điều bạn cần lưu ý như sau:

1/- lệnh này có nhanh hơn cái việc dùng toolbar là do kỹ năng xài cad của bạn. Bởi lệnh này cũng cần xài tới 4 ký tự và một phát enter. Nếu bạn muốn nhanh hơn có thể bỏ bớt ký tự trong hàm lệnh.

2/- Đây cũng là cấu trúc chung cho các hàm lệnh sử dụng các lệnh sẵn có của cad. Việc sử dụng các hàm lệnh này thực ra chưa chắc đã hay hơn việc nhập lệnh trên dòng command. Không nên quá lạm dụng nó vì nó có thể gấy rối cho cad nhất là khi có quá nhiều các lệnh kiểu này.

3/- Dựa vào cấu trúc này bạn có thể tạo bất cứ hàm lệnh cad nào mà bạn muốn, miễn là bạn phải hiểu rõ cấu trúc, trình tự thực hiện của từng lệnh trong Cad. Hy vọng rằng bạn sẽ có thể tự tạo được các lệnh phù hợp với yêu cầu của bạn.

 

 

Chúc bạn thành công.

 

 

Thank bác nhiều, em cũng chỉ dùng lệnh này thôi, em cũng không muốn (thật ra không biết,hì hì) can thiệp vào Cad bằng nhiều lệnh dạng này...Thank

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

chào các bạn, mình lại mạo muội nhờ các bạn viết dùng mình 1 lisp để làm như sau :

 

mình có đường (polyline hoặc cong) và cần lisp tự động đánh số các cột đèn theo thứ tự T1/L1-1A, T1/L1-2B, T1/L1-3C, T1/L1-4A.....ban đầu có T1/L1-1A mình chỉ cần click vào chữ cần đánh (T1/L1-1A) chọn đường cần al theo lisp sẽ tự động đánh tiếp vào các block kế tiếp với điểm gốc cần đánh như trong bản vẽ kèm theo.

http://www.cadviet.com/upfiles/Drawing1_37.dwg

ở bản vẽ đã có đầy đủ thông tin :cry: cảm ơn các bạn nhiều.

 

mình thấy cái lisp mình yêu cầu nó gần như công 2 cái lisp này vào làm 1, kô bít có giúp đc j cho các bạn viết jiup kô :cry:

 

cái lisp này là để đánh số cột đèn tăng dần ví dụ như T1/L1-1A sẽ thành T1/L1-2B, T1/L1-3C, T1/L1-4A.....

 

;;;===================================================================

;;; Danh so cot den:

(defun c:dsc (/ ang x y ent tg tg1tg2 num_r

num_c num_inc dis_r dis_c num top idnum

dx dy bottom inc tgnum attr attr_ent

t_base b_base locat value deci stnum loca1 loca2

tt count inctg inctg1 bpoint mx my nx

ny bx by

)

(setq idnum 0)

(while (/= idnum 1)

(setq ent (entsel "\nHay lua chon so ma ban muon copy : "))

(if ent

(progn

(setq e (car ent))

(setq tg (entget e))

(if (= (cdr (assoc 0 tg)) "TEXT")

(setq idnum 1)

)

)

(princ)

)

)

 

(setq num_inc (getreal "\nHay nhap he so tang giam <1> : "))

(if (= num_inc nil)

(setq num_inc 1)

)

 

(setq bpoint (getpoint "\nChon diem goc de copy : "))

(setq x (car bpoint))

(setq y (car (cdr bpoint)))

 

(if (and (= (cdr (assoc 72 tg)) 0) (= (cdr (assoc 73 tg)) 0))

(progn

(setq bx (car (cdr (assoc 10 tg))))

(setq by (car (cdr (cdr (assoc 10 tg)))))

)

(progn

(setq bx (car (cdr (assoc 11 tg))))

(setq by (car (cdr (cdr (assoc 11 tg)))))

)

)

 

(setq attr (cdr tg))

(setq tg (cdr (assoc 1 tg)))

(setq inc 0)

(setq tg1 "")

(setq t_base "")

(setq b_base "")

(setq idnum 0)

(setq top 0)

(setq bottom 0)

(setq stnum "")

(setq deci 0)

(repeat (strlen tg)

(if

(or (and (> (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1)))

47

) ;(chr 32)

(< (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1)))

58

)

)

 

(= (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1)))

32

)

 

(= (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1)))

46

)

)

(progn

(if (= (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1)))

46

)

(setq deci inc)

)

(if (= inc 0)

(progn

(setq idnum 1)

(if

(= (ascii (setq tgnum (substr tg (- (strlen tg) inc) 1)))

46

)

(setq b_base (strcat "." b_base))

)

)

)

(if (= bottom 1)

(progn (setq bottom 0) (setq idnum 1) (setq top 1))

)

(if (and (= idnum 0) (= top 1))

(setq t_base (strcat tgnum t_base))

)

(if (= idnum 1)

(progn

(if (and (= tgnum "0") (> inc 0))

(setq stnum (strcat stnum "0"))

(setq stnum "")

)

(setq tg1 (strcat tgnum tg1))

)

)

)

(if (= inc 0)

(progn

(setq b_base (strcat tgnum b_base))

(setq bottom 1)

)

(if (= bottom 1)

(setq b_base (strcat tgnum b_base))

(progn

(setq top 1)

(setq t_base (strcat tgnum t_base))

(if (= idnum 1)

(setq idnum 0)

)

)

)

)

)

(setq inc (+ inc 1))

)

 

(if (= tg1 "")

(exit)

)

(setq num (atof tg1))

(setq count 1)

 

(while (setq bpoint (getpoint "\nChon diem copy tiep theo : "))

(setq num (+ num num_inc))

(if (>= (strlen b_base) 1)

(cond

((or (= "A"

(strcase (substr b_base (strlen b_base) 1))

)

(= "B"

(strcase (substr b_base (strlen b_base) 1))

)

)

(setq b_base

(strcat

(substr b_base 1 (1- (strlen b_base)))

(chr (1+ (ascii (substr b_base (strlen b_base) 1))))

)

)

)

((= "C" (strcase (substr b_base (strlen b_base) 1)))

(setq

b_base (strcat (substr b_base 1 (1- (strlen b_base))) "A")

)

)

)

 

)

(setq value (strcat t_base (strcat stnum (rtos num 2 deci)) b_base))

(setq nx (car bpoint))

(setq ny (car (cdr bpoint)))

(setq dx (- nx x))

(setq dy (- ny y))

(setq mx (car (getvar "ucsxdir")))

(setq my (car (cdr (getvar "ucsxdir"))))

(setq loca1 (+ bx (* mx dx)))

(setq loca2 (+ by (* my dx)))

(setq mx (car (getvar "ucsydir")))

(setq my (car (cdr (getvar "ucsydir"))))

(setq loca1 (+ loca1 (* mx dy)))

(setq loca2 (+ loca2 (* my dy)))

(setq attr_ent (subst (cons 1 value) (assoc 1 attr) attr))

(if (and (= (cdr (assoc 72 attr_ent)) 0)

(= (cdr (assoc 73 attr_ent)) 0)

)

(setq attr_ent (subst (list 10 loca1 loca2 0)

(assoc 10 attr_ent)

attr_ent

)

)

(setq attr_ent (subst (list 11 loca1 loca2 0)

(assoc 11 attr_ent)

attr_ent

)

)

)

(entmake attr_ent)

(setq count (+ count 1))

) ;end while

(princ)

)

 

 

cái lisp này nó sẽ copy các text theo 1 text có sẵn và al theo 1 đường thẳng chọn trước với khoảng cách giữa các text do mình chọn

 

 

 

;;;-----------------------------------------------

(defun c:FG2( / obj Li Di Sb P1 p2 goc n oldos P3)

(setq

OBJ (ssget)

LI (entget (car (entsel "\nSelect line :")))

DI (getreal "\nVertical distance : ")

SB (getint "\nNumber of step :")

P1 (cdr (assoc 10 LI))

P2 (cdr (assoc 11 LI))

goc (angle P1 P2)

n 1

oldos (getvar "osmode")

)

(if (> goc pi) (setq goc (- goc pi)))

(setvar "osmode" 0)

(repeat SB

(setq P3 (polar P1 goc (* (/ DI (sin goc)) n)))

(command "copy" OBJ "" P1 P3 "")

(setq n (1+ n))

)

(setvar "osmode" oldos)

(princ)

)

;;;-----------------------------------------------

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
chào các bạn, mình lại mạo muội nhờ các bạn viết dùng mình 1 lisp để làm như sau :

 

mình có đường (polyline hoặc cong) và cần lisp tự động đánh số các cột đèn theo thứ tự T1/L1-1A, T1/L1-2B, T1/L1-3C, T1/L1-4A.....ban đầu có T1/L1-1A mình chỉ cần click vào chữ cần đánh (T1/L1-1A) chọn đường cần al theo lisp sẽ tự động đánh tiếp vào các block kế tiếp với điểm gốc cần đánh như trong bản vẽ kèm theo.

http://www.cadviet.com/upfiles/Drawing1_37.dwg

ở bản vẽ đã có đầy đủ thông tin :cry: cảm ơn các bạn nhiều.

 

mình thấy cái lisp mình yêu cầu nó gần như công 2 cái lisp này vào làm 1, kô bít có giúp đc j cho các bạn viết jiup kô :cry:

 

Chào bạn Nguyenkhoadung98,

Rất tiếc mình không mở được file bản vẽ bạn gửi do mình dùng cad2004. Do vậy vẫn chưa hiểu được yêu cầu của bạn.

Nếu không phiền, bạn có thể upload lại cái file của bạn ở version cad2004 để mình có thể tham khảo. Việc tạo cái lisp như yêu cầu của bạn mình không dám chắc sẽ thành công nhưng sẽ cố gắng thử xem sau khi nắm rõ yêu cầu của bạn.

Chúc bạn vui.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chào mọi người!

Mình muốn in nhiều bản vẽ trong một file (như trắc ngang của đường chẳng hạn) thì phải kích đi kích lại nhiều lần khổ quá. Bác nào cho mình xin cái lisp để in một lần nhiều bản theo khung tên, hoặc theo một block nào đó đã định dạng trước được không? Cảm ơn nhiều.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chào mọi người!

Mình muốn in nhiều bản vẽ trong một file (như trắc ngang của đường chẳng hạn) thì phải kích đi kích lại nhiều lần khổ quá. Bác nào cho mình xin cái lisp để in một lần nhiều bản theo khung tên, hoặc theo một block nào đó đã định dạng trước được không? Cảm ơn nhiều.

bạn tìm kiếm trên diễn đàn với từ MPLOT

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bạn Nguyenkhoadung98,

Rất tiếc mình không mở được file bản vẽ bạn gửi do mình dùng cad2004. Do vậy vẫn chưa hiểu được yêu cầu của bạn.

Nếu không phiền, bạn có thể upload lại cái file của bạn ở version cad2004 để mình có thể tham khảo. Việc tạo cái lisp như yêu cầu của bạn mình không dám chắc sẽ thành công nhưng sẽ cố gắng thử xem sau khi nắm rõ yêu cầu của bạn.

Chúc bạn vui.

 

xin cảm ơn bạn bình rất nhiều ( lần trước cũng là bạn jup mình :cry: ) mình up lại cái bản cad 2004 để bạn xem cảm ơn bạn nhiều

 

http://www.cadviet.com/upfiles/Drawing11.dwg

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
bạn tìm kiếm trên diễn đàn với từ MPLOT

Cảm ơn nhiều! vậy là từ nay đỡ khổ rồi. mà mình thấy nó ko cho hiệu chỉnh theo ý mình (canh trái, canh phải, chừa lề), a có thể bổ sung thêm được không?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

chào các cao thủ cadviet.

mong các bạn hướng dẫn mình cách thay đổi dạng text này sang dạng text khác. mà vẫn hiện thị tiếng việt

vì mình có 1 số file mà máy mình ko có phông chữ đó nên nó ko hiểu.

thank...

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chương trình rải "cột đèn". Bạn thử dùng chương trình này xem. Tuy nhiên nó chỉ dùng được với đường thẳng thôi, còn polyline và circle thi phức tạp hơn nhiều.

 

(defun c:dsc()

(vl-load-com)

(princ "\nChon vat copy...") ;; Chon block "chieusang" hoac bat cu vat the nao khac

(setq ss (ssget))

(setq e1 (entsel "\nHay lua chon so ma ban muon copy : ") ;; Chon Text

ent (entget (car e1)))

 

(setq os (getvar "OSMODE"))

(setvar "OSMODE" 1)

 

(setq di1 (getpoint "\nTu diem:")

di2 (getpoint di1 "\nDen diem:")

ang (angle di1 di2)

n 1)

 

(setq tx (cdr (assoc 1 ent))

m (vl-string-search "-" tx)

a1 (substr tx 1 m)

a2 (substr tx (+ 2 m))

a3 (atoi (substr a2 1 1))

a4 (ascii (substr a2 2 1)))

 

(setq kc (getreal (strcat "\nBuoc copy <" (rtos (getvar "USERR1")) ">:")))

(if (not kc )

(setq kc (getvar "USERR1"))

(setvar "USERR1" kc))

 

(setq sl (fix (/ (distance di2 di1) kc)))

 

(setvar "osmode" 0)

(repeat sl

(command "copy" ss "" di1 (polar di1 ang (* n kc)))

(command "copy" e1 "" di1 (polar di1 ang (* n kc)))

(setq e (entlast)

a3 (1+ a3))

(if (<= (1+ a4) 99) (setq a4 (1+ a4)) (setq a4 97))

(setq chu (strcat a1 "-" (itoa a3) (chr a4)))

(setq ent (entget e)

ent (subst (cons 1 chu) (assoc 1 ent) ent))

(entmod ent)

(setq n (1+ n))

)

(setvar "OSMODE" os)

)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
xin cảm ơn bạn bình rất nhiều ( lần trước cũng là bạn jup mình :cry: ) mình up lại cái bản cad 2004 để bạn xem cảm ơn bạn nhiều

 

http://www.cadviet.com/upfiles/Drawing11.dwg

Chào bạn nguyenkhoadung98,

Bạn xài thử lisp này xem nhé. Có gì chưa được bạn hãy post lên để mình kiểm tra và sửa lại.

(defun C:idc ()
(setq dt (entsel "/n Chon doi tuong goc")
  dc (entsel "/n Chon duong chuan")
  txt (entsel "/n Chon text goc")
  kc (getreal "/n Chon khoang cach giua cac đoi tuong")
  pg (getpoint " Chon diem goc copy")
  elst (entget (car txt))
   text (cdr (assoc 1 elst))
   t1 (substr text 1 6)
   t2 (substr text 7 1)
   t3 (substr text 8 1)
   gt (cdr (assoc 50 elst))
   h (cdr (assoc 40 elst))  
)
(command "measure" dc kc)
(setq ss (ssget "p")
   i 0
   n (sslength ss)			
)
(if (and (= (cdr (assoc 72 elst)) 0) (= (cdr (assoc 73 elst)) 0))
 (setq pt (cdr (assoc 10 elst)))
 (setq pt (cdr (assoc 11 elst)))
)
(while (	   (setq p0 (cdr (assoc 10 (entget (ssname ss i)))))
   (if (/= nil (ssname ss (1+ i)))
	   (setq p1 (cdr (assoc 10 (entget (ssname ss (1+ i))))))
	   (setq p1 (cdr (assoc 10 (entget (ssname ss (1- i))))))
   )
   (setq gr (angle p0 p1)
		 gd (/ (* gr 180) pi)
   )
   (if (and (> gd 90) (		   (setq gd (+ gd 180))
   )
   (if (/= (atoi t2) nil)
	   (setq t4 (+ i (atoi t2) 1))
	   (setq t4 100)
   )
   (if (or (> (ascii t3) 67) (		   (setq t5 (chr 65))
	   (setq t5 t3)
   )
   (if (= 0 (rem i 3))
	   (setq t5 (chr (+ (ascii t5) 1)))
	   (if (= 1 (rem i 3))
		   (setq t5 (chr (+ (ascii t5) 2)))
	   )
   )
   (command "copy" dt "" pg p0)
   (command "text" (list (car p0) (+ (cadr p0) 20)) h gd (strcase (strcat t1 (itoa t4) t5) nil))
   (setq i (1+ i))
)
)

 

Lệnh chạy lisp là idc bạn nhé. Lisp này có thể đành số cột dọc theo line, polyline, spline bạn ạ.

 

Chúc bạn vui.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bạn nguyenkhoadung98,

Bạn xài thử lisp này xem nhé. Có gì chưa được bạn hãy post lên để mình kiểm tra và sửa lại.

(defun C:idc ()
(setq dt (entsel "/n Chon doi tuong goc")
  dc (entsel "/n Chon duong chuan")
  txt (entsel "/n Chon text goc")
  kc (getreal "/n Chon khoang cach giua cac đoi tuong")
  pg (getpoint " Chon diem goc copy")
  elst (entget (car txt))
   text (cdr (assoc 1 elst))
   t1 (substr text 1 6)
   t2 (substr text 7 1)
   t3 (substr text 8 1)
   gt (cdr (assoc 50 elst))
   h (cdr (assoc 40 elst))  
)
(command "measure" dc kc)
(setq ss (ssget "p")
   i 0
   n (sslength ss)			
)
(if (and (= (cdr (assoc 72 elst)) 0) (= (cdr (assoc 73 elst)) 0))
 (setq pt (cdr (assoc 10 elst)))
 (setq pt (cdr (assoc 11 elst)))
)
(while (	   (setq p0 (cdr (assoc 10 (entget (ssname ss i)))))
   (if (/= nil (ssname ss (1+ i)))
	   (setq p1 (cdr (assoc 10 (entget (ssname ss (1+ i))))))
	   (setq p1 (cdr (assoc 10 (entget (ssname ss (1- i))))))
   )
   (setq gr (angle p0 p1)
		 gd (/ (* gr 180) pi)
   )
   (if (and (> gd 90) (		   (setq gd (+ gd 180))
   )
   (if (/= (atoi t2) nil)
	   (setq t4 (+ i (atoi t2) 1))
	   (setq t4 100)
   )
   (if (or (> (ascii t3) 67) (		   (setq t5 (chr 65))
	   (setq t5 t3)
   )
   (if (= 0 (rem i 3))
	   (setq t5 (chr (+ (ascii t5) 1)))
	   (if (= 1 (rem i 3))
		   (setq t5 (chr (+ (ascii t5) 2)))
	   )
   )
   (command "copy" dt "" pg p0)
   (command "text" (list (car p0) (+ (cadr p0) 20)) h gd (strcase (strcat t1 (itoa t4) t5) nil))
   (setq i (1+ i))
)
)

Lệnh chạy lisp là idc bạn nhé. Lisp này có thể đành số cột dọc theo line, polyline, spline bạn ạ.

Chào bác phamthanhbinh

(command "measure" dc kc)

Dòng lệnh này chỉ đúng với đường thẳng Line thôi chứ đường Pline hoặc Spline thì không còn đúng nữa bác Binh à.

Lí do không đúng nữa là trục cột điện khi dùng với mã lệnh trên không vuông góc với trục của Pline hay Spline.

Bác thử dùng lệnh measure với đối tượng Block nhé. Vì khi chèn Block với lệnh Measure thì ta có thể xoay trục cột điện vuông góc với trục của đường Pline, Spline.

 

Command: me MEASURE

Select object to measure:

Specify length of segment or [block]: B

 

Enter name of block to insert: d0

 

Align block with object? [Yes/No] : y

 

Specify length of segment:

 

Mã Dxf của tên Block là 2. (2 . "d0")

 

Còn một điểm nữa là file Lisp của bác chạy trong trường hợp là rải khoảng cách giữa các trụ đèn đều bằng nhau.

Không biết ý của bạn Nguyenkhoadung có muốn rải khoảng cách bằng nhau hay không?

Nhưng mình biết ý của bạn là chọn từng điểm second point làm điểm đích copy các trụ đèn và chắc rằng khoảng cách giữa các trụ sẽ không bằng nhau trên thực tế.

Nếu khoảng cách giữa các trụ đèn bằng nhau thì nói chung là ổn.

Còn nếu khoảng cách rải không bằng nhau thì với đường Pline hay Spline thì rất khó bác Bình à. Mình cũng chưa có cách gì trong trường hợp này cả. Mong mọi người cùng góp ý thảo luận để Code trên thành công trọn vẹn.

Đôi lời góp ý cùng bác.

Chúc bác vui và thành công.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bác phamthanhbinh

(command "measure" dc kc)

Dòng lệnh này chỉ đúng với đường thẳng Line thôi chứ đường Pline hoặc Spline thì không còn đúng nữa bác Binh à.

Lí do không đúng nữa là trục cột điện khi dùng với mã lệnh trên không vuông góc với trục của Pline hay Spline.

Bác thử dùng lệnh measure với đối tượng Block nhé. Vì khi chèn Block với lệnh Measure thì ta có thể xoay trục cột điện vuông góc với trục của đường Pline, Spline.

 

Command: me MEASURE

Select object to measure:

Specify length of segment or [block]: B

 

Enter name of block to insert: d0

 

Align block with object? [Yes/No] : y

 

Specify length of segment:

 

Mã Dxf của tên Block là 2. (2 . "d0")

 

Còn một điểm nữa là file Lisp của bác chạy trong trường hợp là rải khoảng cách giữa các trụ đèn đều bằng nhau.

Không biết ý của bạn Nguyenkhoadung có muốn rải khoảng cách bằng nhau hay không?

Nhưng mình biết ý của bạn là chọn từng điểm second point làm điểm đích copy các trụ đèn và chắc rằng khoảng cách giữa các trụ sẽ không bằng nhau trên thực tế.

Nếu khoảng cách giữa các trụ đèn bằng nhau thì nói chung là ổn.

Còn nếu khoảng cách rải không bằng nhau thì với đường Pline hay Spline thì rất khó bác Bình à. Mình cũng chưa có cách gì trong trường hợp này cả. Mong mọi người cùng góp ý thảo luận để Code trên thành công trọn vẹn.

Đôi lời góp ý cùng bác.

Chúc bác vui và thành công.

Cám ơn bác Tue_NV về chỉ dẫn cách copy với lệnh block. Với cách này thì giả sử đối tượng không phải block ta cũng có thể tạo block cho nó được. Quả thật là mình chưa nghĩ tới điều này.

Tuy nhiên với đối tượng không phải block, thực ra vẫn có cách để copy cho nó "vuông góc" với đường chuẩn được bác ạ. Đó là tạo một chuẩn ảo trên đối tượng cần copy. Sau đó sử dụng chuẩn ảo này để canh vuong góc với đường nối hai điểm trên đường chuẩn. Sở dĩ mình chưa làm phần này là vì bạn nguyenkhoadung chưa yêu cầu là cái cột phải vuông góc với đường chuẩn mà chỉ nói là copy về điểm đặt đó thôi. Mình muốn bạn ấy nhìn thấy lỗi của lisp để có thể hiểu được cần trình bày cụ thể hơn về cái yêu cầu của mình mới giúp người viết lisp viết hoàn chỉnh được.

Về khoảng cách giữa các trụ cũng vậy, thực ra mình hiểu là cách đều chứ bạn nguyenkhoadung không nói vậy. Trong trường hợp khoảng cách không đều có thể dùng hàm vlax-curve-getpointatdis để xác dịnh các điểm đặt của cột. Về các hàm vlax do mình còn hiểu lơ mơ lắm nên chưa dám mạnh dạn xài nó . Mình cũng định chờ bài phản hồi của bạn nguyenkhoadung rồi sẽ hoàn chỉnh nó cho chuẩn với yêu cầu của bạn ấy.

Rất cám ơn bác đã góp ý chân tình. Mình cũng đã học mót được rất nhiều bài học từ bác. Rất mong bác luôn giữ được bầu nhiệt huyết của mình. Kính chúc bác vạn sự như ý.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chào cả nhà!

Trong cad có đường spline khó chịu quá, nó không cho trim, offset, hoặc nối các đoạn lại thành plyline. Ai biết có lệnh (hoặc lisp) nào chuyển spline sang polyline không? Chỉ giúp mình với. Thank!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
chào các cao thủ cadviet.

mong các bạn hướng dẫn mình cách thay đổi dạng text này sang dạng text khác. mà vẫn hiện thị tiếng việt

vì mình có 1 số file mà máy mình ko có phông chữ đó nên nó ko hiểu.

thank...

Mình nghĩ nếu máy bạn thiếu font gì thì tìm cài vô cho nó thì hay hơn đó. Vì sau này mình còn dung nhiều mà. Nếu không bạn thử cách này nhé.

Bạn vô Format/text style. Sau đó chọn kiểu chữ và đổi lại font mà máy bạn có nhung lưu ý là phải cùng bản mã nhé nếu không nó lại lỗi đó.

Chúc bạn thanh công!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào cả nhà!

Trong cad có đường spline khó chịu quá, nó không cho trim, offset, hoặc nối các đoạn lại thành plyline. Ai biết có lệnh (hoặc lisp) nào chuyển spline sang polyline không? Chỉ giúp mình với. Thank!

Hì hì, chào bạn conghoan1003,

Mình chưa hiểu bạn nói gì vì cái spline mà mình tạo trên Cad2004 thì nó cho trim, cho copy, cho move, cho ofset ..... tùm lum hết. Tệ thế chứ. Còn bạn muốn đổi spline thành polyline thì trên diễn đàn đã có cái líp của bác SSG. Bạn chịu khó tìm sẽ thấy ngay ý mà. Mình nhớ là trong topic Autolisp ấy bạn ạ. Ở đó có nhiều lisp hay lắm. Mình mót mãi chả hết được. Tại tham lam nên mót về rồi cất đâu chả nhớ nữa. Để mình tìm lại. Nếu thấy mình sẽ post lên bạn nhé.

Chúc bạn thành công.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Hì hì, chào bạn conghoan1003,

Mình chưa hiểu bạn nói gì vì cái spline mà mình tạo trên Cad2004 thì nó cho trim, cho copy, cho move, cho ofset ..... tùm lum hết. Tệ thế chứ. Còn bạn muốn đổi spline thành polyline thì trên diễn đàn đã có cái líp của bác SSG. Bạn chịu khó tìm sẽ thấy ngay ý mà. Mình nhớ là trong topic Autolisp ấy bạn ạ. Ở đó có nhiều lisp hay lắm. Mình mót mãi chả hết được. Tại tham lam nên mót về rồi cất đâu chả nhớ nữa. Để mình tìm lại. Nếu thấy mình sẽ post lên bạn nhé.

Chúc bạn thành công.

Chào bạn Thanh Bình!

Cảm ơn bạn nhiều!

Đúng ra là các đường spline nó cho trim, offset nhưng hiểu “trở trời” thế nào mà nó lại không cho làm trim, offset trong một số bản vẽ chẳng hiều nữa, nhất là trong các bản vẽ bình đồ (của đường). Mình làm thiết kế nên hay gặp trường hợp này lắm. Mỗi lần như thế mình lại phải vẽ lại bằng polyline.

Chúc sức khoẻ!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chào anh ssq!

E có đọc được bài viết về cái lisp đo chiều dài của các đoạn polyline của anh, em thấy cái này hay quá, em đang cần mà khổ nỗi em chẳng biết viết lisp nên không thể them mắm thêm muôi vô được. Anh có thể giúp em hoàn thiện được không?

Em xin nhắc lại mục đích em cần là đo tấc cả các đường thẳng, polyline được quét (quét một lần càng tốt) và ghi chiều dài của nó ở cuối đoạn đó luôn.

Cảm ơn anh nhiều!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
chào các bạn, mình lại mạo muội nhờ các bạn viết dùng mình 1 lisp để làm như sau :

 

mình có đường (polyline hoặc cong) và cần lisp tự động đánh số các cột đèn theo thứ tự T1/L1-1A, T1/L1-2B, T1/L1-3C, T1/L1-4A.....ban đầu có T1/L1-1A mình chỉ cần click vào chữ cần đánh (T1/L1-1A) chọn đường cần al theo lisp sẽ tự động đánh tiếp vào các block kế tiếp với điểm gốc cần đánh như trong bản vẽ kèm theo.

http://www.cadviet.com/upfiles/Drawing1_37.dwg

ở bản vẽ đã có đầy đủ thông tin :cry: cảm ơn các bạn nhiều.

 

mình thấy cái lisp mình yêu cầu nó gần như công 2 cái lisp này vào làm 1, kô bít có giúp đc j cho các bạn viết jiup kô :cry:

 

cái lisp này là để đánh số cột đèn tăng dần ví dụ như T1/L1-1A sẽ thành T1/L1-2B, T1/L1-3C, T1/L1-4A.....

Vì không có thời gian nên xin góp ý về bài này của phamthanhbinh như sau:

Theo hình thì yêu cầu là vẽ cột và đánh số lại tên. Số lượng và khoảng cách cột được nhập vào chứ không nhất thiết là toàn bộ đường cong. Vì vậy cách của bạn phamthanhbinh ngoài việc chưa xoay hình và text không cùng format với text gốc thì cũng chỉ chạy đúng khi hình gốc trùng với điểm đầu và hướng vẽ từ đầu đến điểm cuối của đường cong. Ngoài ra lại còn xuất hiện thêm nhiều point nữa.

Tôi nghĩ là nên làm như sau:

Chọn đường cong:

(setq plineObj (car (entsel "\nHay chon duong polyline ")))

Lấy diểm thứ hai

(vlax-curve-getpointatdist plineObj khoangcach)

trong đó khoảng cách phải chú ý chiều, có thể tăng hoặc giảm dần

lấy hướng của tiếp tuyến với đường cong

(vlax-curve-getFirstDeriv plineObj param)

trong đó param tính theo

(setq param (vlax-curve-getParamAtDist plineObj khoangcach))

Sau đó dựa vào 2 điểm và hướng tiếp tuyến, dùng lệnh ALIGN để copy cột và tên đến điểm thứ hai rồi sửa lại tên cột theo cách của tác giả

Nhưng còn các vấn đề mà nguyenkhoadung98 không nói rõ là

-Điểm đầu tiên không nằm trên đường chuẩn thì thế nào? Lúc đó có định lại là điểm gần nhất nằm trên đường chuẩn hay không

-Khi ra ngoài đường chuẩn thì kết thúc hay kéo dài bằng 1 line từ điểm cuối có hướng trùng với tiếp tuyến

-Đây là trường hợp copy theo khoảng cách là theo đường cong hay là đường chim bay vì dây điện thì thẳng.

Nếu là trường hợp thứ 2 thì tôi nghĩ là vẽ 1 đường tròn, tìm giao điểm với đường chuẩn. Nếu có nhiều giao điểm thì lấy điểm nào gần với điểm tính được theo cách thứ 1 rồi làm theo cách trên

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bạn Thanh Bình!

Cảm ơn bạn nhiều!

Đúng ra là các đường spline nó cho trim, offset nhưng hiểu “trở trời” thế nào mà nó lại không cho làm trim, offset trong một số bản vẽ chẳng hiều nữa, nhất là trong các bản vẽ bình đồ (của đường). Mình làm thiết kế nên hay gặp trường hợp này lắm. Mỗi lần như thế mình lại phải vẽ lại bằng polyline.

Chúc sức khoẻ!

cái này là do các đường spline của bác nó nằm ở các cao độ khác nhau thì làm sao mà trim được.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×