Đến nội dung


Hình ảnh
- - - - -

lisp offset liên tục


  • Please log in to reply
38 replies to this topic

#1 tuananhcmd

tuananhcmd

    biết zoom

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

Đã gửi 08 February 2009 - 05:41 PM

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")
)
)
  • 0

#2 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 08 February 2009 - 09:14 PM

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 "")
  • 0

#3 tuananhcmd

tuananhcmd

    biết zoom

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

Đã gửi 09 February 2009 - 09:08 AM

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
  • 0

#4 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 09 February 2009 - 09:27 AM

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>: 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é.
  • 0

#5 thoclep

thoclep

    biết lệnh offset

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

Đã gửi 09 February 2009 - 04:49 PM

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.
  • 2

#6 amateurday

amateurday

    biết lệnh break

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

Đã gửi 09 April 2009 - 12:55 PM

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
  • 0

#7 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 09 April 2009 - 04:41 PM

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.
  • 0

#8 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 09 April 2009 - 05:28 PM

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:
  • 2

#9 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 09 April 2009 - 07:28 PM

Đâ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") "")
)
)

  • 1

#10 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 09 April 2009 - 08:40 PM

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: <" (rtos kco) "> :")))

(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)
)

  • 4

#11 tdt0310

tdt0310

    biết zoom

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

Đã gửi 10 April 2009 - 12:06 AM

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!
  • 0

#12 ustoichivost

ustoichivost

    biết vẽ circle

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

Đã gửi 10 April 2009 - 05:21 AM

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 ?
  • 0

#13 tdt0310

tdt0310

    biết zoom

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

Đã gửi 11 April 2009 - 12:46 AM

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.
  • 0

#14 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 11 April 2009 - 07:56 AM

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.c...?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ỗ.
  • 0

#15 huy1339

huy1339

    biết zoom

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

Đã gửi 14 April 2009 - 01:46 PM

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 đó.
  • 0

#16 tuananhcmd

tuananhcmd

    biết zoom

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

Đã gửi 24 June 2009 - 01:21 PM

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)
)
  • 0

#17 tranlaogia

tranlaogia

    biết lệnh scale

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

Đã gửi 14 October 2009 - 04:42 PM

Đâ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 đó.
  • 0

#18 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 14 October 2009 - 08:16 PM

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é.
  • 1

#19 tranlaogia

tranlaogia

    biết lệnh scale

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

Đã gửi 27 October 2009 - 10:16 AM

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:
  • 0

#20 thanhliemvqh

thanhliemvqh

    biết pan

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

Đã gửi 15 March 2010 - 10:51 AM

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 ?????????
  • 0