Đến nội dung


Hình ảnh
- - - - -

Lisp biến 1 phần của đoạn thẳng trở thành nét Hidden2.


  • Please log in to reply
11 replies to this topic

#1 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 19 November 2009 - 02:07 PM

Em muốn có 1 lisp như thế này, Ban đầu có 1 đoạn ( thẳng, cong ) CD là loại nét liền, trên đó có 2 điểm A,B.
Khi mình chạy lisp lên, chọn vào điểm A, B thì đoạn thẳng AB trở thành nét đút và đổi sang màu 08. còn đoạn CA và BD thì vẫn là nét liền .
Cái này sẽ rất hữu ích khi ta vẽ. Mong các bác Pro quan tâm júp đỡ và cho ý kiến !
  • 0
Hoàng Giang

#2 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 19 November 2009 - 03:55 PM

Em muốn có 1 lisp như thế này, Ban đầu có 1 đoạn ( thẳng, cong ) CD là loại nét liền, trên đó có 2 điểm A,B.
Khi mình chạy lisp lên, chọn vào điểm A, B thì đoạn thẳng AB trở thành nét đút và đổi sang màu 08. còn đoạn CA và BD thì vẫn là nét liền .
Cái này sẽ rất hữu ích khi ta vẽ. Mong các bác Pro quan tâm júp đỡ và cho ý kiến !

Chào bạn hhhhgggg,
Bạn dùng thử cái này rồi cho ý kiến nha.
http://www.cadviet.c...s/2/chgline.lsp
Chúc bạn vui.

PS: Bạn lưu ý khi lisp hỏi bạn chọn điểm thứ hai thì bạn phải chọn điểm nằm trên phần đường line đang highlight nhé. Bởi vì đó là phần tạo ra sau khi break đường đó tại điểm thứ nhất.
  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#3 hhhhgggg

hhhhgggg

    biết dimedit

  • Members
  • PipPipPipPipPip
  • 393 Bài viết
Điểm đánh giá: 30 (tàm tạm)

Đã gửi 19 November 2009 - 04:38 PM

Chào bạn hhhhgggg,
Bạn dùng thử cái này rồi cho ý kiến nha.
http://www.cadviet.c...s/2/chgline.lsp
Chúc bạn vui.

PS: Bạn lưu ý khi lisp hỏi bạn chọn điểm thứ hai thì bạn phải chọn điểm nằm trên phần đường line đang highlight nhé. Bởi vì đó là phần tạo ra sau khi break đường đó tại điểm thứ nhất.

OK ! Good ! đúng ý em ! Cảm ơn bác nhìu nhé ! Cái này giúp ta vẽ các nét đứt nằm trong 1 vùng rất nhanh, ko mất công Br rùi đổi !
  • 0
Hoàng Giang

#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 19 November 2009 - 04:47 PM

PS: Bạn lưu ý khi lisp hỏi bạn chọn điểm thứ hai thì bạn phải chọn điểm nằm trên phần đường line đang highlight nhé. Bởi vì đó là phần tạo ra sau khi break đường đó tại điểm thứ nhất.

Chào bác PhamthanhBinh
Điều bác nêu ra đó cũng chính là nhược điểm của đoạn Lisp bác viết ra. Nếu User chọn điểm cắt thứ hai trên phần đuờng không Hightlight thì sẽ không đúng yêu cầu của user ngay. Nếu dựa vào đặc điểm thứ tự tạo đối tượng ta sẽ giải quyết thành công trọn vẹn code trên

Hơn nữa trong Code này của bác:

(defun c:chgln ()
(setq a (entsel "\n Chon line muon thay doi"))
(command "break" a "f" (setq b (getpoint "\n Chon diem thu nhat")) B )
(setq c (entlast))
(command "break" c (setq b (getpoint "\n Chon diem thu hai")) B )
(command "change" c "" "p" "c" "8" "lt" "hidden" "")
)

ví dụ như 1 đối tượng bị break tại 1 điểm thì có 2 đối tượng được tạo ra. Bác có thể nào xác định được đối tượng nào tạo ra sau cùng hay không? (setq c (entlast))
Trường hợp nếu đối tượng tạo ra sau cùng đúng ý user thì được, còn nếu đối tượng sau cùng tạo ra không đúng ý của user thì :cheers:
  • 1

#5 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 20 November 2009 - 03:08 PM

......
ví dụ như 1 đối tượng bị break tại 1 điểm thì có 2 đối tượng được tạo ra. Bác có thể nào xác định được đối tượng nào tạo ra sau cùng hay không? (setq c (entlast))
............

Đôi điều về lệnh Break trong truờng hợp chia đôi đối tuợng gốc (2 đối tượng được tạo ra).
Xét đối tuợng với 2 tham số Param : StartParam và EndParam (vlax-curve-getStartParam curve) và (vlax-curve-getEndParam curve)
- đối tuợng tạo mới (entlast) là đối tuợng bao gồm phần có tham số Param lớn hơn (EndParam)
- đối tuợng gốc là đối tuợng bao gồm phần có tham số Param nhỏ hơn (StartParam)

Như vậy truớc khi gọi lệnh BREAK cần sắp xếp lại thứ tự các "Điểm chọn thứ nhất""Điểm chọn thứ hai" theo thứ tự giảm dần (hoặc tăng dần tùy ý) của Param tuơng ứng với các điểm đã chọn. (vlax-curve-getParamAtPoint curve pt)

Gửi bạn Code có bổ sung phần kiểm tra sự tồn tại của LineType Hidden2 (nếu chưa có, Load nó)
Chấp nhận các đối tuợng Line, PLine, SPLine, Arc.
(defun c:brk(/ cobj ent ov pt1 pt2 tmp vl); brk -> Break Curve
(vl-load-com)
(command "undo" "be")
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(545 0 0))
(if (and (setq Ent (car (entsel "\nChon doi tuong can chia :")))
(wcmatch (cdr (assoc 0 (entget ent))) "*LINE,ARC")
(setq pt1 (getpoint "\nDiem dau :"))
(setq pt2 (getpoint "\nDiem cuoi :")) )
(progn
(if (not (tblsearch "LTYPE" "HIDDEN2"))
(command "._linetype" "_load" "HIDDEN2" "acad.lin" ""))
(setq cObj (vlax-ename->vla-object Ent)
pt1 (vlax-curve-getClosestPointto cObj pt1)
pt2 (vlax-curve-getClosestPointto cObj pt2))
(if (> (vlax-curve-getParamAtPoint cObj pt1)
(vlax-curve-getParamAtPoint cObj pt2))
(setq tmp pt1 pt1 pt2 pt2 tmp) )
(command "._break" ent "_non" (trans pt2 0 1) "_non" (trans pt2 0 1))
(command "._break" ent "_non" (trans pt1 0 1) "_non" (trans pt1 0 1))
(command "change" (entlast) "" "p" "c" "8" "lt" "hidden2" "")
(mapcar 'setvar vl ov) ; reset Sys Vars
(command "undo" "e")
)
(alert "Khong hop le !"))
(princ))

  • 2

#6 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 20 November 2009 - 06:00 PM

Đôi điều về lệnh Break trong truờng hợp chia đôi đối tuợng gốc (2 đối tượng được tạo ra).
Xét đối tuợng với 2 tham số Param : StartParam và EndParam (vlax-curve-getStartParam curve) và (vlax-curve-getEndParam curve)
- đối tuợng tạo mới (entlast) là đối tuợng bao gồm phần có tham số Param lớn hơn (EndParam)
- đối tuợng gốc là đối tuợng bao gồm phần có tham số Param nhỏ hơn (StartParam)

Như vậy truớc khi gọi lệnh BREAK cần sắp xếp lại thứ tự các "Điểm chọn thứ nhất""Điểm chọn thứ hai" theo thứ tự giảm dần (hoặc tăng dần tùy ý) của Param tuơng ứng với các điểm đã chọn. (vlax-curve-getParamAtPoint curve pt)

Gửi bạn Code có bổ sung phần kiểm tra sự tồn tại của LineType Hidden2 (nếu chưa có, Load nó)
Chấp nhận các đối tuợng Line, PLine, SPLine, Arc.

(defun c:brk(/ cobj ent ov pt1 pt2 tmp vl); brk -> Break Curve
(vl-load-com)
(command "undo" "be")
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(545 0 0))
(if (and (setq Ent (car (entsel "\nChon doi tuong can chia :")))
(wcmatch (cdr (assoc 0 (entget ent))) "*LINE,ARC")
(setq pt1 (getpoint "\nDiem dau :"))
(setq pt2 (getpoint "\nDiem cuoi :")) )
(progn
(if (not (tblsearch "LTYPE" "HIDDEN2"))
(command "._linetype" "_load" "HIDDEN2" "acad.lin" ""))
(setq cObj (vlax-ename->vla-object Ent)
pt1 (vlax-curve-getClosestPointto cObj pt1)
pt2 (vlax-curve-getClosestPointto cObj pt2))
(if (> (vlax-curve-getParamAtPoint cObj pt1)
(vlax-curve-getParamAtPoint cObj pt2))
(setq tmp pt1 pt1 pt2 pt2 tmp) )
(command "._break" ent "_non" (trans pt2 0 1) "_non" (trans pt2 0 1))
(command "._break" ent "_non" (trans pt1 0 1) "_non" (trans pt1 0 1))
(command "change" (entlast) "" "p" "c" "8" "lt" "hidden2" "")
(mapcar 'setvar vl ov) ; reset Sys Vars
(command "undo" "e")
)
(alert "Khong hop le !"))
(princ))

Chào bác Giabach,
Đọc cái lisp của bác thấy ngộ ra rất nhiều điều hay bác ạ. Từ cái cách nhìn nhận vấn đề một các tổng quát đến các giải pháp xử lý cụ thể cho các trường hợp đều được bác giải quyết khá thấu đáo. Tuy nhiên do trình độ của mình còn non nên có một vài chỗ mình chưa quán triệt được. Rất mong bác hướng dẫn thêm để mình có thể hiểu kỹ hơn.
1/- Cái tham số "-non" trong lệnh break của Cad nhằm giải quyết vấn đề gì bác nhỉ???
Mình xài lệnh break chỉ biết có tham số "f" là để chọn điểm break thứ nhất khi không muốn dùng điểm chọn đối tượng làm điểm break thứ nhất thôi bác ạ.
2/- Cái hàm (trans pt2 0 1) theo mình hiểu là để chuyển điểm pt2 từ hệ tọa độ WCS về hệ tọa độ của người sử dụng UCS , thực chất chỉ là cho nó mặc áo mới, chứ bản thân nó chả có thay đổi gì. Vậy sao bác phải dùng nó ở dây bác nhỉ???
Nếu chỉ dùng (command "break" ent "-non" pt2 "-non" pt2) thì có được không hả bác???

Cầu mong bác luôn mạnh khỏe và hạnh phúc

@ Bác Tue_NV: Thực ra mình biết là sau khi break nó sẽ sinh ra một đối tượng mới và đối tượng cũ bị thay đổi nhưng vẫn giữ nguyên tên ename của nó. Vì thế mình mới dùng hàm entlast để gọi đối tượng mới sinh ra này. Khi break lần thứ hai do đã xác định được đầu cuối của đối tượng mới sinh ra này nên mình mới xài lệnh change ngay cái đối tượng này sau break bác ạ.
Nhược của cái lisp đó bác Giabach đã khắc phục ngon lành rồi, còn lúc ban đầu tuy mình biết có cái lấn cấn đó nhưng chưa nghĩ ra biện pháp giải quyết nên đành ghi chú như vậy để bạn hhhhgggg có thể sử dụng được.
Thành thật mà nói thì cái vốn đi mót của mình nó còn lỏng lắm nên phải nhờ các bác chỉ bảo thêm. Mình cứ liều post lên mặc dầu nó chưa hoàn thiện cũng là mong các bác chỉ bảo thêm chứ chả phải là mình coi thường mọi người đâu bác ạ.
Mọi cái mình viết vừa là nhằm mục tiêu nếu có thể sẽ giúp được phần nào cho ai đó cần, vừa là để mình luyện thêm về cái mình mót được, cho nên sự khiếm khuyết của nó là không thể tránh. Rất mong bác và mọi người hiểu cho mình và giúp mình hoàn thiện thêm những điều mót được nhé, đừng giận mình làm chi kẻo nó chóng già. Hề hề hề....
  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#7 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 21 November 2009 - 10:54 PM

...............................
1/- Cái tham số "-non" trong lệnh break của Cad nhằm giải quyết vấn đề gì bác nhỉ???
Mình xài lệnh break chỉ biết có tham số "f" là để chọn điểm break thứ nhất khi không muốn dùng điểm chọn đối tượng làm điểm break thứ nhất thôi bác ạ.
2/- Cái hàm (trans pt2 0 1) theo mình hiểu là để chuyển điểm pt2 từ hệ tọa độ WCS về hệ tọa độ của người sử dụng UCS , thực chất chỉ là cho nó mặc áo mới, chứ bản thân nó chả có thay đổi gì. Vậy sao bác phải dùng nó ở dây bác nhỉ???
Nếu chỉ dùng (command "break" ent "-non" pt2 "-non" pt2) thì có được không hả bác???
..................................

Chào bác Bình.
Trong môi trường LISP thì 2 dòng lệnh sau là tương đương nhau (có cùng kết quả)
(command "break" ent pt1 pt2)
(command "break" ent "f" pt1 pt2)
tham số "f" chỉ có tác dụng rõ ràng khi gõ lệnh trực tiếp trên CAD.

1/ - tham số "-non" trong dòng lệnh (command "._break" ent "_non" (trans pt2 0 1) "_non" (trans pt2 0 1)) không phải là tùy chọn của lệnh Break, mà nó là tùy chọn của lệnh OSnap (bắt điểm)
Trong 1 số t/hợp đặc biệt, mặc dù đã đặt biến hệ thống osmode = 0 , nhưng CAD vẫn không cho kết quả tại các điểm đã chọn. Tham số "-non" có tác dụng tương đương với việc tắt chế độ bắt điểm. (đôi khi tham số "-non" không cần thiết nhưng không phải là thừa - dư còn hơn thiếu)

2/ - về hàm (trans pt2 0 1) : nhờ bác thắc mắc nên tui kiểm tra lại thì phát hiện ra có lỗi trong trường hợp gọi lệnh trong hệ tọa độ của người sử dụng UCS. :cheers:
dòng (command "._break" ent "_non" (trans pt2 0 1) "_non" (trans pt2 0 1))
phải được thay bằng dòng (command "._break" ent "_non" (trans pt2 0 ent) "_non" (trans pt2 0 ent))
nghĩa là chuyển điểm pt2 từ hệ tọa độ WCS về hệ tọa độ của ename (ent)

Nếu chỉ dùng (command "break" ent "-non" pt2 "-non" pt2) thì kết quả sẽ không đúng trong trường hợp gọi lệnh trong hệ tọa độ của người sử dụng UCS.

Chúc bác sức khỏe.
  • 1

#8 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 22 November 2009 - 11:24 AM

Rất tâm đắc với câu nói của Bác:

Mọi cái mình viết vừa là nhằm mục tiêu nếu có thể sẽ giúp được phần nào cho ai đó cần, vừa là để mình luyện thêm về cái mình mót được, cho nên sự khiếm khuyết của nó là không thể tránh. Rất mong bác và mọi người hiểu cho mình và giúp mình hoàn thiện thêm những điều mót được nhé, đừng giận mình làm chi kẻo nó chóng già. Hề hề hề....


  • 0

#9 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 22 November 2009 - 02:30 PM

Sửa lỗi trong trường hợp gọi lệnh trong hệ tọa độ của người sử dụng UCS
và bổ sung phần các điểm chọn trùng với 2 đầu mút.
(defun c:brk(/ cobj ent ov pt1 pt2 tmp vl); brk -> Break Curve
;; By : Gia_Bach, www.CadViet.com ;;
(vl-load-com)
(command "undo" "be")
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(545 0 0))
(if (and (setq Ent (car (entsel "\nChon doi tuong can chia :")))
(wcmatch (cdr (assoc 0 (entget ent))) "*LINE,ARC")
(not (redraw ent 3))
(setq pt1 (getpoint "\nDiem dau :"))
(setq pt2 (getpoint pt1 "\nDiem cuoi :" ))
(not (redraw ent 4)))
(progn
(if (not (tblsearch "LTYPE" "HIDDEN2"))
(command "._linetype" "_load" "HIDDEN2" "acad.lin" ""))
(setq cObj (vlax-ename->vla-object Ent)
pt1 (vlax-curve-getClosestPointto cObj (trans pt1 1 0))
pt2 (vlax-curve-getClosestPointto cObj (trans pt2 1 0)))
(if (eq (vla-get-Objectname cobj)"AcDb2dPolyline")
(progn
(command "._pedit" ent "")
(setq cObj (vlax-ename->vla-object (entlast)))))
(if (> (vlax-curve-getParamAtPoint cObj pt1)
(vlax-curve-getParamAtPoint cObj pt2))
(setq tmp pt1 pt1 pt2 pt2 tmp) )
(command "._break" ent "_non" (trans pt2 0 1) "_non" (trans pt2 0 1))
(if (equal pt1 (vlax-curve-getStartPoint cObj) 0.001)
(command "change" ent "" "p" "c" "8" "lt" "hidden2" "")
(progn
(command "._break" ent "_non" (trans pt1 0 1) "_non" (trans pt1 0 1))
(command "change" (entlast) "" "p" "c" "8" "lt" "hidden2" "") ))
(command "undo" "e") )
(alert "Khong hop le !"))
(mapcar 'setvar vl ov) ; reset Sys Vars
(princ))

Bài viết đã được chỉnh sửa nội dung bởi gia_bach: 28 December 2011 - 10:56 AM

  • 0

#10 tuanthunder

tuanthunder

    biết zoom

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

Đã gửi 28 November 2009 - 12:31 PM

Sửa lỗi trong trường hợp gọi lệnh trong hệ tọa độ của người sử dụng UCS
và bổ sung phần các điểm chọn trùng với 2 đầu mút.

(defun c:brk(/ cobj ent ov pt1 pt2 tmp vl); brk -> Break Curve
(vl-load-com)
(command "undo" "be")
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(545 0 0))
(if (and (setq Ent (car (entsel "\nChon doi tuong can chia :")))
(wcmatch (cdr (assoc 0 (entget ent))) "*LINE,ARC")
(not (redraw ent 3))
(setq pt1 (getpoint "\nDiem dau :"))
(setq pt2 (getpoint "\nDiem cuoi :")) )
(progn
(if (not (tblsearch "LTYPE" "HIDDEN2"))
(command "._linetype" "_load" "HIDDEN2" "acad.lin" ""))
(setq cObj (vlax-ename->vla-object Ent)
pt1 (vlax-curve-getClosestPointto cObj (trans pt1 1 0))
pt2 (vlax-curve-getClosestPointto cObj (trans pt2 1 0)))
(if (> (vlax-curve-getParamAtPoint cObj pt1)
(vlax-curve-getParamAtPoint cObj pt2))
(setq tmp pt1 pt1 pt2 pt2 tmp) )
(command "._break" ent "_non" (trans pt2 0 1) "_non" (trans pt2 0 1))
(if (equal pt1 (vlax-curve-getStartPoint cObj) 0.001)
(command "change" ent "" "p" "c" "8" "lt" "hidden2" "")
(progn
(command "._break" ent "_non" (trans pt1 0 1) "_non" (trans pt1 0 1))
(command "change" (entlast) "" "p" "c" "8" "lt" "hidden2" "")
)
)
(redraw ent 4)
(mapcar 'setvar vl ov) ; reset Sys Vars
(command "undo" "e")
)
(alert "Khong hop le !"))
(princ))


Lísp của bạn viết rất hay. Bạn có thể viết lại cái lisp : Khi cắt các line,Pl,arc... thì layer của đoạn bị cắt là một layer mình đang chọn (Chứ không phải layer hidden2) để lisp này chủ động hơn cho mọi người dùng không?
Cảm ơn bạn.
  • 0

#11 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 28 November 2009 - 02:03 PM

Lísp của bạn viết rất hay. Bạn có thể viết lại cái lisp : Khi cắt các line,Pl,arc... thì layer của đoạn bị cắt là một layer mình đang chọn (Chứ không phải layer hidden2) để lisp này chủ động hơn cho mọi người dùng không?
Cảm ơn bạn.

Mạn phép anh giabach Tue_NV viết thêm vào đoạn Code của anh để giúp cho bạn tuanthunder
@ tuanthunder : Bạn sử dụng code này thử nhé :

(defun c:brk(/ cobj ent ov pt1 pt2 tmp vl str); brk -> Break Curve
(vl-load-com)
(command "undo" "be")
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(545 0 0))
(if (and (setq Ent (car (entsel "\nChon doi tuong can chia :")))
(wcmatch (cdr (assoc 0 (entget ent))) "*LINE,ARC")
(not (redraw ent 3))
(setq pt1 (getpoint "\nDiem dau :"))
(setq pt2 (getpoint "\nDiem cuoi :")) )
(progn
(setq cObj (vlax-ename->vla-object Ent)
pt1 (vlax-curve-getClosestPointto cObj (trans pt1 1 0))
pt2 (vlax-curve-getClosestPointto cObj (trans pt2 1 0)))
(if (> (vlax-curve-getParamAtPoint cObj pt1)
(vlax-curve-getParamAtPoint cObj pt2))
(setq tmp pt1 pt1 pt2 pt2 tmp) )
(command "._break" ent "_non" (trans pt2 0 1) "_non" (trans pt2 0 1))
(if (equal pt1 (vlax-curve-getStartPoint cObj) 0.001)
(command "change" ent "" "p" "LA" (lcurr) "")
(progn
(command "._break" ent "_non" (trans pt1 0 1) "_non" (trans pt1 0 1))
(command "change" (entlast) "" "p" "LA" (lcurr) "")
)
)
(redraw ent 4)
(mapcar 'setvar vl ov) ; reset Sys Vars
(command "undo" "e")
)
(alert "Khong hop le !"))
(princ))
;
(defun lcurr(/ e)
(setq str (getstring t "\n Nhap ten layer hoac Enter de pick vao doi tuong :"))
(if (= str "")
(progn
(while (null (setq e (entsel "\n pick vao doi tuong :"))))
(setvar "clayer" (cdr(assoc 8 (entget(car e)))))
)
(progn
(while (null (tblsearch "layer" str))
(setq str (getstring t "\n Nhap lai ten layer :"))
)
(setvar "clayer" str)
)
)
)

  • 1

#12 tuanthunder

tuanthunder

    biết zoom

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

Đã gửi 30 November 2009 - 07:06 PM

Mạn phép anh giabach Tue_NV viết thêm vào đoạn Code của anh để giúp cho bạn tuanthunder
@ tuanthunder : Bạn sử dụng code này thử nhé :


(defun c:brk(/ cobj ent ov pt1 pt2 tmp vl str); brk -> Break Curve
(vl-load-com)
(command "undo" "be")
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(545 0 0))
(if (and (setq Ent (car (entsel "\nChon doi tuong can chia :")))
(wcmatch (cdr (assoc 0 (entget ent))) "*LINE,ARC")
(not (redraw ent 3))
(setq pt1 (getpoint "\nDiem dau :"))
(setq pt2 (getpoint "\nDiem cuoi :")) )
(progn
(setq cObj (vlax-ename->vla-object Ent)
pt1 (vlax-curve-getClosestPointto cObj (trans pt1 1 0))
pt2 (vlax-curve-getClosestPointto cObj (trans pt2 1 0)))
(if (> (vlax-curve-getParamAtPoint cObj pt1)
(vlax-curve-getParamAtPoint cObj pt2))
(setq tmp pt1 pt1 pt2 pt2 tmp) )
(command "._break" ent "_non" (trans pt2 0 1) "_non" (trans pt2 0 1))
(if (equal pt1 (vlax-curve-getStartPoint cObj) 0.001)
(command "change" ent "" "p" "LA" (lcurr) "")
(progn
(command "._break" ent "_non" (trans pt1 0 1) "_non" (trans pt1 0 1))
(command "change" (entlast) "" "p" "LA" (lcurr) "")
)
)
(redraw ent 4)
(mapcar 'setvar vl ov) ; reset Sys Vars
(command "undo" "e")
)
(alert "Khong hop le !"))
(princ))
;
(defun lcurr(/ e)
(setq str (getstring t "\n Nhap ten layer hoac Enter de pick vao doi tuong :"))
(if (= str "")
(progn
(while (null (setq e (entsel "\n pick vao doi tuong :"))))
(setvar "clayer" (cdr(assoc 8 (entget(car e)))))
)
(progn
(while (null (tblsearch "layer" str))
(setq str (getstring t "\n Nhap lai ten layer :"))
)
(setvar "clayer" str)
)
)
)

Cảm ơn bác đã viết Lisp rất hay. Nhưng bác có thể chỉnh lại Lisp để các nét đứt đó sẽ là Layer hiện hành(Tức layer đang được chọn). Chứ không phải qua bước nhập tên layer hay pick layer nữa. Cảm ơn bác.Chúc bác luôn khỏe và thành đạt
  • 0