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

lisp offset liên tục

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

có những lúc bạn muốn offset liên tục với 1 khoảng cách nhât định

thì đây là lisp đáp ứng điều đó

(defun c:olt()

(setq ss(ssget))

(setq po(getpoint "\n phia offset:"))

(setq kc(getreal "\n khoang cach offset:"))

(setq n(getint "\n so lan offset:"))

(setq m 0 )

(repeat n

(setq m(+ m 1))

(command "offset" (* m kc) ss po "e")

)

)

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ó những lúc bạn muốn offset liên tục với 1 khoảng cách nhât định

thì đây là lisp đáp ứng điều đó

(defun c:olt()

(setq ss(ssget))

(setq po(getpoint "\n phia offset:"))

(setq kc(getreal "\n khoang cach offset:"))

(setq n(getint "\n so lan offset:"))

(setq m 0 )

(repeat n

(setq m(+ m 1))

(command "offset" (* m kc) ss po "e")

)

)

Cảm ơn bạn Tuananhcmd.

Cái dòng (setq kc(getreal "\n khoang cach offset:")) thì mình nghĩ nên sử dụng hàm getdist thì hay hơn là sử dụng hàm getreal.

 

Hàm getdist cho phép bạn ngừng chương trình để nhập khoảng cách với một số thực. Hơn nữa với hàm getdist bạn có thể nhập khoảng cách bằng cách pick 2 điểm trên màn hình.

 

Còn hàm getreal cho phép bạn ngừng chương trình để nhập khoảng cách với một số thực.

 

Đoạn Lisp trên bị lỗi ở hàng này

(command "offset" (* m kc) ss po "e")

mình xin sửa lại hàng này là : (command "offset" (* m kc) ss po "")

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ảm ơn bạn Tuananhcmd.

Cái dòng (setq kc(getreal "\n khoang cach offset:")) thì mình nghĩ nên sử dụng hàm getdist thì hay hơn là sử dụng hàm getreal.

 

Hàm getdist cho phép bạn ngừng chương trình để nhập khoảng cách với một số thực. Hơn nữa với hàm getdist bạn có thể nhập khoảng cách bằng cách pick 2 điểm trên màn hình.

 

Còn hàm getreal cho phép bạn ngừng chương trình để nhập khoảng cách với một số thực.

 

Đoạn Lisp trên bị lỗi ở hàng này

(command "offset" (* m kc) ss po "e")

mình xin sửa lại hàng này là : (command "offset" (* m kc) ss po "")

cảm ơn bạn Tue_vn đã góp ý

nhưng nếu sử dụng dòng

(command "offset" (* m kc) ss po "e")

và dòng

(command "offset" (* m kc) ss po "")

đều đem lại một kết quả như nhau

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ảm ơn bạn Tue_vn đã góp ý

nhưng nếu sử dụng dòng

(command "offset" (* m kc) ss po "e")

và dòng

(command "offset" (* m kc) ss po "")

đều đem lại một kết quả như nhau

Vốn biết rằng chữ "e" là viết tắt của chữ "exit"

nhưng cái dòng (command "offset" (* m kc) ss po "e") này của bạn bị lỗi.

Bạn xem lại nè :

Command: offset

 

Specify offset distance or [Through] : 500 : chọn khoảng cách

 

Select object to offset or : chọn đối tượng offset

Specify point on side to offset: : phía offset

Select object to offset or : e : gõ e

 

*Invalid selection*

Expects a point or CLass

 

Select object to offset or : e

 

Khi đánh chữ e trong lệnh offset thì nó báo

*Invalid selection*

Expects a point or CLass

 

Chỉ khi nào ở dòng Select object to offset or : bạn gõ enter thì mới kết thúc được lệnh offset

Bạn xem lại nhé.

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ó những lúc bạn muốn offset liên tục với 1 khoảng cách nhât định

thì đây là lisp đáp ứng điều đó

(defun c:olt()

(setq ss(ssget))

(setq po(getpoint "\n phia offset:"))

(setq kc(getreal "\n khoang cach offset:"))

(setq n(getint "\n so lan offset:"))

(setq m 0 )

(repeat n

(setq m(+ m 1))

(command "offset" (* m kc) ss po "e")

)

)

Để offset liên tục, mọi người có thể dùng lệnh exoffset cho mọi cad có cài express tool

exoffset

Settings: Distance = 100, Layer = CURRENT, Gaptype = Normal

Specify offset distance or [Through] <100>: 110

Select object(s) to offset or [Options/Undo]:

1 object(s) found.

Shift+Pick for multiple; Ctrl+Pick to erase source object.

Side to offset or [Multiple/Options/Undo]: m

Press to exit multiple mode; Ctrl+Pick to erase source object.

  • 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
Vốn biết rằng chữ "e" là viết tắt của chữ "exit"

nhưng cái dòng (command "offset" (* m kc) ss po "e") này của bạn bị lỗi.

Bạn xem lại nè :

Command: offset

 

Specify offset distance or [Through] <500>: 500 : chọn khoảng cách

 

Select object to offset or : chọn đối tượng offset

Specify point on side to offset: : phía offset

Select object to offset or : e : gõ e

 

*Invalid selection*

Expects a point or CLass

 

Select object to offset or : e

 

Khi đánh chữ e trong lệnh offset thì nó báo

*Invalid selection*

Expects a point or CLass

 

Chỉ khi nào ở dòng Select object to offset or : bạn gõ enter thì mới kết thúc được lệnh offset

Bạn xem lại nhé.

 

 

 

sao em load file lisp nó hay bị lỗi này:

Command: ap

APPLOAD offset lien tuc.lsp successfully loaded.

Command: ; error: bad character read (octal): 0

sau đó thực hiện lệnh thì nó báo unknown command

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ó những lúc bạn muốn offset liên tục với 1 khoảng cách nhât định

thì đây là lisp đáp ứng điều đó

(defun c:olt()

(setq ss(ssget))

(setq po(getpoint "\n phia offset:"))

(setq kc(getreal "\n khoang cach offset:"))

(setq n(getint "\n so lan offset:"))

(setq m 0 )

(repeat n

(setq m(+ m 1))

(command "offset" (* m kc) ss po "e")

)

)

Bác có thể thêm 1 chọn lựa để cho phép offset cả 2 bên được không. Thank you.

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ác có thể thêm 1 chọn lựa để cho phép offset cả 2 bên được không. Thank you.

Đây bạn. Lisp Tue_NV cải tiến chạy theo đúng ý bạn nè :

(defun c:olt()
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)

(while (null (setq ss (car(entsel "\n Chon doi tuong offset :")))) 
(Prompt "\n Hay chon lai doi tuong :")
)

(setq po(getpoint "\n phia offset:")) 
(setq kc(getdist "\n khoang cach offset:")) 
(setq n(getint "\n so lan offset:"))
(setq m 0 )
(setq p1 (vlax-curve-getClosestPointTo ss po))
(setq p2 (list (/ (- (* 2 (car p1)) (car po)) 2) (/ (- (* 2 (cadr p1)) (cadr po)) 2) 0.0))

(repeat n
(setq m(+ m 1))
(command "offset" (* m kc) ss po "")
) 

(initget "Y N") ;;;Init keywords
(setq ans (getkword "\n Ban co muon offset sang 2 ben khong? [Yes/No] :")) ;;;Get answer from user
(if (= ans "Y") 
(Progn
(setq m 0 )
(repeat n
(setq m(+ m 1))
(command "offset" (* m kc) ss p2 "")
) 
)
)
(setvar "osmode" oldos)
)

Hy vọng bạn hài lòng.

Cghúc thành công nhé :cheers:

  • 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
Đây bạn. Lisp Tue_NV cải tiến chạy theo đúng ý bạn nè :

(defun c:olt()
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)

(while (null (setq ss (car(entsel "\n Chon doi tuong offset :")))) 
(Prompt "\n Hay chon lai doi tuong :")
)

(setq po(getpoint "\n phia offset:")) 
(setq kc(getdist "\n khoang cach offset:")) 
(setq n(getint "\n so lan offset:"))
(setq m 0 )
(setq p1 (vlax-curve-getClosestPointTo ss po))
(setq p2 (list (/ (- (* 2 (car p1)) (car po)) 2) (/ (- (* 2 (cadr p1)) (cadr po)) 2) 0.0))

(repeat n
(setq m(+ m 1))
(command "offset" (* m kc) ss po "")
) 

(initget "Y N") ;;;Init keywords
(setq ans (getkword "\n Ban co muon offset sang 2 ben khong? [Yes/No] :")) ;;;Get answer from user
(if (= ans "Y") 
(Progn
(setq m 0 )
(repeat n
(setq m(+ m 1))
(command "offset" (* m kc) ss p2 "")
) 
)
)
(setvar "osmode" oldos)
)

Hy vọng bạn hài lòng.

Cghúc thành công nhé :cheers:

Trong trường hợp cần lặp lại thì lệnh Lisp này yêu cầu User phải input lại các thông số cũ, nhờ Bác upgrade thêm để User khỏi phải input lại.

Lisp tham khảo dưới đây của Ssg có chức năng để khắc phục vấn đề trên. Thanks.

(defun C:OO(/ kc kc1 e msg)
(if (<= (setq kc (getvar "OFFSETDIST")) 0) (setq kc 20))
(setq msg (strcat "\nSpecial offset command\nOffset distance <" (rtos kc) ">:"))
(if (setq kc1 (getreal msg)) (setq kc kc1))
(while (setq e (car (entsel)))
(command "offset" kc e pause "")
(command "change" "L" "" "P" "LA" (getvar "clayer") "LT" (getvar "celtype") "")
)
)

  • 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
Trong trường hợp cần lặp lại thì lệnh Lisp này yêu cầu User phải input lại các thông số cũ, nhờ Bác upgrade thêm để User khỏi phải input lại.

Upgrade đây bạn :

(defun c:olt()
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)

(while (null (setq ss (car(entsel "\n Chon doi tuong offset :")))) 
(Prompt "\n Hay chon lai doi tuong :")
)

(setq po(getpoint "\n phia offset:")) 

(if (not kco) (setq kco 100))

(setq kc (getdist(strcat "\n khoang cach offset:  :")))

(if (not kc) (setq kc ko) (setq kco kc))

(setq n(getint "\n so lan offset:"))
(setq m 0 )
(setq p1 (vlax-curve-getClosestPointTo ss po))
(setq p2 (list (/ (- (* 2 (car p1)) (car po)) 2) (/ (- (* 2 (cadr p1)) (cadr po)) 2) 0.0))

(repeat n
(setq m(+ m 1))
(command "offset" (* m kc) ss po "")
) 

(initget "Y N") ;;;Init keywords
(setq ans (getkword "\n Ban co muon offset sang 2 ben khong? [Yes/No] :")) ;;;Get answer from user
(if (= ans "Y") 
(Progn
(setq m 0 )
(repeat n
(setq m(+ m 1))
(command "offset" (* m kc) ss p2 "")
) 
)
)
(setvar "osmode" oldos)
)

  • Vote tăng 4

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

Em chào các bác! Lâu rùi em không online dạo này không biết mọi người có khoẻ không vậy ta. Hi.Bác nào chỉ cho em cách dùng lisp để tính diện tích với.Nếu có lisp tinh diện tích thì cho em luôn nha. Thanks a lot!

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
Em chào các bác! Lâu rùi em không online dạo này không biết mọi người có khoẻ không vậy ta. Hi.Bác nào chỉ cho em cách dùng lisp để tính diện tích với.Nếu có lisp tinh diện tích thì cho em luôn nha. Thanks a lot!

Sao không dùng lệnh AREA đi bạn ?

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
Dùng AREA thì lâu lắm bạn à. Mà lai phải BO nó lại. Có cách nào làm nhanh hơn chỉ cho mình vớiiiiiiii.

Bạn đọc bài viết dưới đây và có gì thắc mắc thì post bài ở đó luôn nhé. Bạn đừng post bài không đúng chủ đề nữa :

http://www.cadviet.com/forum/index.php?showtopic=9764

Bài viết trên viết về cách tính diện tích của đa giác kín bị khoét n lỗ bên trong và cũng đúng trong trường hợp đa giác kín không bị khoét lỗ.

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
Em chào các bác! Lâu rùi em không online dạo này không biết mọi người có khoẻ không vậy ta. Hi.Bác nào chỉ cho em cách dùng lisp để tính diện tích với.Nếu có lisp tinh diện tích thì cho em luôn nha. Thanks a lot!

Bạn đọc phần autolisp trên diễn đàn này ấy,trên đó có giới thiệu về lisp tính diện tích đó.

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

tính tổng dim khi chưa edit (td)

tính tổng text hoặc dim đã edit (tn)

tính tích text

(defun c:tn()

(setq dt (ssget))

(setq dem (sslength dt))

(setq stt 0)

(setq tong 0)

(repeat dem

(setq ten (ssname dt stt))

(setq ds (entget ten))

(if (not (= (assoc 1 ds) nil))

(progn

(setq tx (atof (cdr (assoc 1 ds))))

(setq tong (+ tong tx))

)

)

(setq stt (+ stt 1))

)

(setq tong tong)

)

 

 

(defun c:td()

(setq dt (ssget))

(setq dem (sslength dt))

(setq stt 0)

(setq tong 0)

(repeat dem

(setq ten (ssname dt stt))

(setq ds (entget ten))

(if (not (= (assoc 42 ds) nil))

(progn

(setq tx (cdr (assoc 42 ds)))

(setq tong (+ tong tx))

)

)

(setq stt (+ stt 1))

)

(setq tong tong)

)

 

(defun c:tc()

(setq dt (ssget))

(setq dem (sslength dt))

(setq stt 0)

(setq tich 1)

(repeat dem

(setq ten (ssname dt stt))

(setq ds (entget ten))

(if (not (= (assoc 1 ds) nil))

(progn

(setq tx (atof (cdr (assoc 1 ds))))

(setq tich (* tich tx))

)

)

(setq stt (+ stt 1))

)

(setq tich tich)

)

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
Đây bạn. Lisp Tue_NV cải tiến chạy theo đúng ý bạn nè :

(defun c:olt()
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)

(while (null (setq ss (car(entsel "\n Chon doi tuong offset :")))) 
(Prompt "\n Hay chon lai doi tuong :")
)

(setq po(getpoint "\n phia offset:")) 
(setq kc(getdist "\n khoang cach offset:")) 
(setq n(getint "\n so lan offset:"))
(setq m 0 )
(setq p1 (vlax-curve-getClosestPointTo ss po))
(setq p2 (list (/ (- (* 2 (car p1)) (car po)) 2) (/ (- (* 2 (cadr p1)) (cadr po)) 2) 0.0))

(repeat n
(setq m(+ m 1))
(command "offset" (* m kc) ss po "")
) 

(initget "Y N") ;;;Init keywords
(setq ans (getkword "\n Ban co muon offset sang 2 ben khong? [Yes/No] :")) ;;;Get answer from user
(if (= ans "Y") 
(Progn
(setq m 0 )
(repeat n
(setq m(+ m 1))
(command "offset" (* m kc) ss p2 "")
) 
)
)
(setvar "osmode" oldos)
)

Hy vọng bạn hài lòng.

Cghúc thành công nhé :bigsmile:

 

lisp của bác tuệ thật tuyệt vời. Em nhờ bác Tuệ và các bác viết giùm em lisp offset với yêu cầu sau được kô?

offset đối tượng về 1 phía với các khoảng cách khác nhau mà chỉ cần chọn đối tượng 1 lần, và chỉ cần nhập khoảng cách offset.

lựa chọn offset tuyệt đối so với đối tượng gốc hoặc offset tương đối so với đối tượng sau đó.

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
lisp của bác tuệ thật tuyệt vời. Em nhờ bác Tuệ và các bác viết giùm em lisp offset với yêu cầu sau được kô?

offset đối tượng về 1 phía với các khoảng cách khác nhau mà chỉ cần chọn đối tượng 1 lần, và chỉ cần nhập khoảng cách offset.

lựa chọn offset tuyệt đối so với đối tượng gốc hoặc offset tương đối so với đối tượng sau đó.

Chưa hiểu ý của bạn. Bạn có thể vui lòng nói rõ và chi tiết hơn? Bạn có thể minh họa điều bạn muốn bằng file .dwg rồi upload lên đây 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ưa hiểu ý của bạn. Bạn có thể vui lòng nói rõ và chi tiết hơn? Bạn có thể minh họa điều bạn muốn bằng file .dwg rồi upload lên đây nhé.

em up ma kô được bác ạ. em có thể giải thích như thế này nhờ các bác chỉ giùm. vi dụ như offset đường thẳng a thành các đường thẳng b,c,d... Nếu chọn tuyệt đối thì khi mình nhập các giá trị offset thì chương trình sẽ offset ra các đt b,c,d với khoảng offset so với đường thẳng gốc a. Nếu chon offset tương đối thì mình nhập giá trị offset thành đt b thì chương trình sẽ offset ra đt b với khoảng offset giữa đt b so với đt a;mình nhập giá trị offset thành đt c thì chương trình sẽ offset ra đt c với khoảng offset giữa đt c so với đt b;mình nhập giá trị offset thành đt d thì chương trình sẽ offset ra đt đ với khoảng offset giữa đt d so với đt c;.... Các bác giúp em với nhé. thanks :tongue2:

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
Trời........

Mình nghe nói là lệnh OFFset về 2 phía mà sao thực tế offset ve có 1 phía zdậy ?????????

Cảm ơn bạn đã phát hiện ra lỗi này. Tue_NV đã nhầm trong quá trình tính toán.

Xin gửi lại bạn Lisp offset liên tục về 1 bên, offset liên tục về 2 bên hoàn chỉnh

(defun c:olt(/ ss po p1 p2 m n kc oldos)
(vl-load-com)
(setvar "cmdecho" 0)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)

(while (null (setq ss (car(entsel "\n Chon doi tuong offset :")))) 
(Prompt "\n Hay chon lai doi tuong :")
)

(setq po(getpoint "\n phia offset:")) 

(if (not kco) (setq kco 100))

(setq kc (getdist(strcat "\n khoang cach offset:  :")))

(if (not kc) (setq kc kco) (setq kco kc))

(setq n (getint "\n so lan offset:"))
(setq m 0 )
(setq p1 (vlax-curve-getClosestPointTo ss po))
(setq p2 (list (- (* 2 (car p1)) (car po)) (- (* 2 (cadr p1)) (cadr po)) 0.0))

(repeat n
(setq m(+ m 1))
(command "offset" (* m kc) ss po "")
) 

(initget "Y N") ;;;Init keywords
(setq ans (getkword "\n Ban co muon offset sang 2 ben khong? [Yes/No] :")) ;;;Get answer from user
(if (= ans "Y") 
(Progn
(setq m 0 )
(repeat n
(setq m(+ m 1))
(command "offset" (* m kc) ss p2 "")
) 
)
)
(setvar "osmode" oldos)
(setvar "modemacro" "\nCHUC BAN LAM VIEC HIEU QUA - tue_nvcc@yahoo.com")
(princ)
)

Chỉnh sửa theo Tue_NV
  • Vote giảm 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

Tue_NV có thể viết được lisp offset liên hoàn ko?? tức là offset nhiều đối tượng với 1 khoảng cách cùng 1 lúc,

hoặc bổ sung vào lisp olt, thay vì chọn đối tượng thì là chọn các đối tượng 1 lúc rồi mới offset ấy

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
Tue_NV có thể viết được lisp offset liên hoàn ko?? tức là offset nhiều đối tượng với 1 khoảng cách cùng 1 lúc,

hoặc bổ sung vào lisp olt, thay vì chọn đối tượng thì là chọn các đối tượng 1 lúc rồi mới offset ấy

Quan trọng là Phía Offset đó bạn ạ. Với nhiều curve thì nhiều khả năng là phía Offset bên này lại là phía Offset của Curve bên kia và ngược lại. Bạn hiểu ý của Tue_NV không?

 

Tue_NV cũng đã viết thành công Lisp Offset về phía trong hoặc phía ngoài.

Nội dung của nó là : Chọn 1 loạt đối tượng -> Nó sẽ offset ra phía trong hoặc phía ngoài với 1 khoảng cách do User nhập vào. Đương nhiên, phía trong của curve này không thể là phía ngoài của curve kia được :lol:

 

Nếu bạn có ý khác. Bạn có thể upload file .dwg và nói rõ hơn nhé.

Nếu Offset liên hoàn theo bạn nói thật sự hiệu quả đối với mọi người, mình sẽ viết

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ảm ơn bạn đã phát hiện ra lỗi này. Tue_NV đã nhầm trong quá trình tính toán.

Xin gửi lại bạn Lisp offset liên tục về 1 bên, offset liên tục về 2 bên hoàn chỉnh

.....

Sao sau khi nhập số lần offset thì lisp báp lỗi :; error: bad argument type: numberp: nil.Mong bác xem lại giúp.Thanks

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
Sao sau khi nhập số lần offset thì lisp báp lỗi :; error: bad argument type: numberp: nil.Mong bác xem lại giúp.Thanks

Đã sửa lại lỗi của code.

Bạn vui lòng test lại code ở bài viết số 21 trên nhé

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

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×