Đến nội dung


Hình ảnh

[Hỏi] Làm sao để thay thế (đối tượng bằng wipeout) ?


  • Please log in to reply
30 replies to this topic

#1 minhphuong_humg

minhphuong_humg

    biết lệnh offset

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

Đã gửi 09 December 2011 - 09:47 AM

Mình có một file cad với cách đánh số cột như trong bản vẽ kèm theo (http://www.cadviet.c...les/3/0_hoi.dwg). Tuy nhiên, ở khung hình nhỏ ở góc trái bản vẽ thì hình tròn có thể đè lên trên đường polyline, còn các hình tròn khác trong bản vẽ thì không thể. Cho mình hỏi làm sao để thay thế toàn bộ hình tròn trong bản vẽ bằng hình tròn ở khung dưới được. Mục đích là để cho đường tròn đó đề lên polyline để sau khi in cho bản vẽ được đẹp hơn. Xin cảm ơn mọi người.
  • 2

#2 hientv86

hientv86

    biết lệnh chamfer

  • Members
  • PipPipPipPip
  • 211 Bài viết
Điểm đánh giá: 47 (tàm tạm)

Đã gửi 09 December 2011 - 10:55 AM

Cái hình tròn bên trái đó vẽ bằng lệnh Wipeout ,chẳng làm gì được lần sau vẽ lại rút kn copy từ trước
  • 0

#3 minhphuong_humg

minhphuong_humg

    biết lệnh offset

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

Đã gửi 09 December 2011 - 03:33 PM

Cái hình tròn bên trái đó vẽ bằng lệnh Wipeout ,chẳng làm gì được lần sau vẽ lại rút kn copy từ trước

Cảm ơn bạn, mình không còn cách nào khác hả bạn? Vậy thì mình mất thời gian quá nhỉ!
  • 0

#4 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 09 December 2011 - 04:00 PM

Mình có một file cad với cách đánh số cột như trong bản vẽ kèm theo (http://www.cadviet.c...les/3/0_hoi.dwg). Tuy nhiên, ở khung hình nhỏ ở góc trái bản vẽ thì hình tròn có thể đè lên trên đường polyline, còn các hình tròn khác trong bản vẽ thì không thể. Cho mình hỏi làm sao để thay thế toàn bộ hình tròn trong bản vẽ bằng hình tròn ở khung dưới được. Mục đích là để cho đường tròn đó đề lên polyline để sau khi in cho bản vẽ được đẹp hơn. Xin cảm ơn mọi người.

Hề hề hề,
Thực tế có thể làm được điều bạn muốn, song có điều cần hỏi lại cho rõ là chỉ thay cái vòng tròn hay là thay cả nội dung bên trong vòng tròn đó. Hơn nữa cái vòng tròn góc trái là mảu vàng,và nhỏ hơn cái còng tròn mà mình đoán là phải thay màu xanh.
Vậy bạn muốn thay thế kiểu gì thì hãy post cái ảnh kết quả bạn muốn lên nhé. nếu không rất có thể bạn sẽ được cái chả mong muốn tí nào.
Hề hề hề
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#5 Chiron

Chiron

    biết dimradius

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

Đã gửi 09 December 2011 - 04:07 PM

Cảm ơn bạn, mình không còn cách nào khác hả bạn? Vậy thì mình mất thời gian quá nhỉ!

Bạn có thể đưa yêu cầu này qua lisp box hỏi xem có khả thi không? Mình nghĩ là khó thực hiện, nhưng bên đó có nhiều ý tưởng tuyệt vời.
  • 0

#6 minhphuong_humg

minhphuong_humg

    biết lệnh offset

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

Đã gửi 09 December 2011 - 04:31 PM

Hề hề hề,
Thực tế có thể làm được điều bạn muốn, song có điều cần hỏi lại cho rõ là chỉ thay cái vòng tròn hay là thay cả nội dung bên trong vòng tròn đó. Hơn nữa cái vòng tròn góc trái là mảu vàng,và nhỏ hơn cái còng tròn mà mình đoán là phải thay màu xanh.
Vậy bạn muốn thay thế kiểu gì thì hãy post cái ảnh kết quả bạn muốn lên nhé. nếu không rất có thể bạn sẽ được cái chả mong muốn tí nào.
Hề hề hề

Cảm ơn anh! Nghĩa là em muốn thay cái vòng tròn đó để cho nó che cái phần Polyline đi anh ạ. Để khi in nó không hiện đường Polyline ở dưới lên đó anh. Còn nội dung thì giữ nguyên. Rất mong anh hướng dẫn cho em, vì để thế em thấy rất mất thẩm mỹ của bản vẽ.Trân trọng cảm ơn anh!
  • 0

#7 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 09 December 2011 - 05:05 PM

Cảm ơn anh! Nghĩa là em muốn thay cái vòng tròn đó để cho nó che cái phần Polyline đi anh ạ. Để khi in nó không hiện đường Polyline ở dưới lên đó anh. Còn nội dung thì giữ nguyên. Rất mong anh hướng dẫn cho em, vì để thế em thấy rất mất thẩm mỹ của bản vẽ.Trân trọng cảm ơn anh!

Hề hề hề,
Đúng như bạn Chiron đã nói, mình có thể xử lý việc này bằng lisp được, nhưng trước hết bạn hãy mở topic này bên lisp box đã nhé. Như vậy đúng với quy định của diễn đàn và sẽ thuận lợi hơn cho những người khác theo dõi và quan tâm tới vấn đề này. Hãy chịu khó một chút vì quyền lợi chung của mọi người tham gia diễn đàn bạn nhé. Có thể khi bạn post xong topic thì đã có bài trả lời rồi đó.
Hề hề hề,
Đất chả chịu giời thì giời chịu đất vậy. Mình giúp bạn lần này chuyển bài viết về box mới và sửa tiêu đề topic cho đúng với quy định của diễn đàn, mong rằng lần sau bạn sẽ tự thực hiện đúng với quy định nhé.
Hãy dùng thử cái lisp này xem có đúng cái bạn cần không nhé. Lưu ý rằng các vòng tròn của bạn sau khi dùng lisp này sẽ không còn là circle nữa mà là các wipeout tương tự như cái mẫu trong bản vẽ của bạn post. Vì thế chớ có ngạc nhiên khi thấy nó không được tròn vành vạnh nhé.
Trong lisp này mình có nhón một khúc lisp của bác SSG về để xào nấu lại. Vì thế hãy cám ơn bác ấy nhé. Không có bác ấy thì cái lisp này sẽ chả dùng được đâu.
Hề hề hề


(defun c:ch2w (/ ent pt la oldlay oldos d0 d1 ent1 ent2 plst ss1 sscl)
(vl-load-com)
(command "undo" "be")
(setq ent (car (entsel "\n Hay chon mot hinh tron mau muon thay the de tao wipeout "))
pt (cdr (assoc 10 (setq els (entget ent))))
la (cdr (assoc 8 els))
)
(setq oldlay (getvar "clayer"))
(setvar "clayer" la)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(if (not d0) (setq d0 0.5));;;Init dividual distance, global variable
(setq d1 (getreal (strcat "\nLength of 1 segment <" (rtos d0) ">:")));;;Input distance
(if d1 (setq d0 d1) (setq d1 d0));;;Reset or get distance
(makepl ent d1)
(setq ent1 (entlast))
(command "wipeout" "p" ent1 "n")
(setq ent2 (entlast)
plst (acet-geom-vertex-list ent1)
ss1 (ssget "cp" plst (list (cons 0 "line") (cons 8 "Duong"))) )
(command "draworder" ent2 "" "b")
(command "draworder" ss1 "" "b")
(command "erase" ent "")
(alert "\n Chon tat ca cac vong tron can thay the")
(setq sscl (acet-ss-to-list (ssget (list (cons 0 "circle") (cons 8 la)))))
(foreach crl sscl
(setq p1 (cdr (assoc 10 (entget crl))))
(command "move" ent1 "" pt p1)
(command "copy" ent2 "" pt p1)
(setq ent2 (entlast)
plst (acet-geom-vertex-list ent1)
ss1 (ssget "cp" plst (list (cons 0 "line") (cons 8 "Duong"))) )
(command "draworder" ent2 "" "b")
(command "draworder" ss1 "" "b")
(command "erase" crl "")
(setq pt p1 p1 nil)
)
(command "erase" ent1 "")
(setvar "clayer" oldlay)
(setvar "osmode" oldos)
(command "undo" "e")
(princ)
)

;;;-------------------------------------------------------------
(defun makepl ( e d1 / ps pe d d2 p2);;;Make pline along curve e. Length of 1 segment = d1
(vl-load-com);;;Load Visual LISP extensions before use vlax-xxxx functions
(setq
ps (vlax-curve-getStartPoint e);;;Start point
pe (vlax-curve-getEndPoint e);;;End point
d (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e));;;Length of curve e
d2 d1;;;Init variable distance
)
(command "pline");;;Call pline command
(command ps);;;Start point
(while (<= d2 d);;;While not over end point pe
(setq p2 (vlax-curve-getPointAtDist e d2));;;Variable point at d2 = length along curve
(command p2);;;Continue pline command from current point to p2
(setq d2 (+ d2 d1));;;Increase distance d2 by d1
);;;End while
(if (not (equal pe ps 0.01))
(command pe "");;;Pline to pe and finish command
(command "c" )
)
)
;;;-------------------------------------------------------------
Hề hề hề,
Chúc bạn vui

Bài viết đã được chỉnh sửa nội dung bởi phamthanhbinh: 09 December 2011 - 06:40 PM
Bổ sung lisp theo yêu cầu

  • 3
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#8 minhphuong_humg

minhphuong_humg

    biết lệnh offset

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

Đã gửi 09 December 2011 - 08:47 PM

Hề hề hề,
Đúng như bạn Chiron đã nói, mình có thể xử lý việc này bằng lisp được, nhưng trước hết bạn hãy mở topic này bên lisp box đã nhé. Như vậy đúng với quy định của diễn đàn và sẽ thuận lợi hơn cho những người khác theo dõi và quan tâm tới vấn đề này. Hãy chịu khó một chút vì quyền lợi chung của mọi người tham gia diễn đàn bạn nhé. Có thể khi bạn post xong topic thì đã có bài trả lời rồi đó.
Hề hề hề,
Đất chả chịu giời thì giời chịu đất vậy. Mình giúp bạn lần này chuyển bài viết về box mới và sửa tiêu đề topic cho đúng với quy định của diễn đàn, mong rằng lần sau bạn sẽ tự thực hiện đúng với quy định nhé.
Hãy dùng thử cái lisp này xem có đúng cái bạn cần không nhé. Lưu ý rằng các vòng tròn của bạn sau khi dùng lisp này sẽ không còn là circle nữa mà là các wipeout tương tự như cái mẫu trong bản vẽ của bạn post. Vì thế chớ có ngạc nhiên khi thấy nó không được tròn vành vạnh nhé.
Trong lisp này mình có nhón một khúc lisp của bác SSG về để xào nấu lại. Vì thế hãy cám ơn bác ấy nhé. Không có bác ấy thì cái lisp này sẽ chả dùng được đâu.
Hề hề hề



(defun c:ch2w (/ ent pt la oldlay oldos d0 d1 ent1 ent2 plst ss1 sscl)
(vl-load-com)
(command "undo" "be")
(setq ent (car (entsel "\n Hay chon mot hinh tron mau muon thay the de tao wipeout "))
pt (cdr (assoc 10 (setq els (entget ent))))
la (cdr (assoc 8 els))
)
(setq oldlay (getvar "clayer"))
(setvar "clayer" la)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(if (not d0) (setq d0 0.5));;;Init dividual distance, global variable
(setq d1 (getreal (strcat "\nLength of 1 segment <" (rtos d0) ">:")));;;Input distance
(if d1 (setq d0 d1) (setq d1 d0));;;Reset or get distance
(makepl ent d1)
(setq ent1 (entlast))
(command "wipeout" "p" ent1 "n")
(setq ent2 (entlast)
plst (acet-geom-vertex-list ent1)
ss1 (ssget "cp" plst (list (cons 0 "line") (cons 8 "Duong"))) )
(command "draworder" ent2 "" "b")
(command "draworder" ss1 "" "b")
(command "erase" ent "")
(alert "\n Chon tat ca cac vong tron can thay the")
(setq sscl (acet-ss-to-list (ssget (list (cons 0 "circle") (cons 8 la)))))
(foreach crl sscl
(setq p1 (cdr (assoc 10 (entget crl))))
(command "move" ent1 "" pt p1)
(command "copy" ent2 "" pt p1)
(setq ent2 (entlast)
plst (acet-geom-vertex-list ent1)
ss1 (ssget "cp" plst (list (cons 0 "line") (cons 8 "Duong"))) )
(command "draworder" ent2 "" "b")
(command "draworder" ss1 "" "b")
(command "erase" crl "")
(setq pt p1 p1 nil)
)
(command "erase" ent1 "")
(setvar "clayer" oldlay)
(setvar "osmode" oldos)
(command "undo" "e")
(princ)
)

;;;-------------------------------------------------------------
(defun makepl ( e d1 / ps pe d d2 p2);;;Make pline along curve e. Length of 1 segment = d1
(vl-load-com);;;Load Visual LISP extensions before use vlax-xxxx functions
(setq
ps (vlax-curve-getStartPoint e);;;Start point
pe (vlax-curve-getEndPoint e);;;End point
d (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e));;;Length of curve e
d2 d1;;;Init variable distance
)
(command "pline");;;Call pline command
(command ps);;;Start point
(while (<= d2 d);;;While not over end point pe
(setq p2 (vlax-curve-getPointAtDist e d2));;;Variable point at d2 = length along curve
(command p2);;;Continue pline command from current point to p2
(setq d2 (+ d2 d1));;;Increase distance d2 by d1
);;;End while
(if (not (equal pe ps 0.01))
(command pe "");;;Pline to pe and finish command
(command "c" )
)
)
;;;-------------------------------------------------------------
Hề hề hề,
Chúc bạn vui


Thành thật em cảm ơn anh rất nhiều, sáng mai đi làm em sẽ làm ngay theo cách anh mách. Lý do em em post ở đây là vì: em nghĩ rằng vấn đề này có thể Copy rồi Dán hoặc Lọc theo kiểu gì đó---->liên quan tới Kỹ thuật Autocad; nên em viết bài này ở đây. Rất mong mọi người bỏ quá cho em. Cảm ơn anh và các bạn đã quan tâm rất nhiều. Chúc mọi người có sức khỏe!
  • 0

#9 minhphuong_humg

minhphuong_humg

    biết lệnh offset

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

Đã gửi 12 December 2011 - 02:44 PM

Em rất bất ngờ về kết quả mà Lisp bác Phamthanhbinh đã giúp đỡ, tuy nhiên khi em làm em còn thấy một điều thắc mắc nho nhỏ, xin bác giúp đỡ em với ạ.
01. Lisp bác gửi cho em nó chỉ đè được Polyline thôi, còn "nhỡ" mà cái vòng tròn ấy đè lên text thì em thấy nó vẫn "trong veo" bác ạ. Xin bác xem file em gửi kèm (http://www.cadviet.c...khongdetext.rar).
02. Lisp của bác chỉ chuẩn khi để nguyên các yếu tố có trên bản vẽ; nghĩa là cứ để tất cả các layer mở để chọn thì OK còn nếu mình tắt hết các lớp đi, để lớp Vòng tròn đó thôi (để mình chọn cho tiện) thì khi bật các layer kia lên thì nó vẫn không đè được bác ạ; mặc dù em có nhân lệnh RE một số lần cũng không được.
Rất mong bác giúp đỡ em.
Thành thật em cảm ơn bác rất nhiều.
  • 0

#10 only102

only102

    biết vẽ pline

  • Advance Member
  • PipPip
  • 63 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 12 December 2011 - 03:54 PM

Em rất bất ngờ về kết quả mà Lisp bác Phamthanhbinh đã giúp đỡ, tuy nhiên khi em làm em còn thấy một điều thắc mắc nho nhỏ, xin bác giúp đỡ em với ạ.
01. Lisp bác gửi cho em nó chỉ đè được Polyline thôi, còn "nhỡ" mà cái vòng tròn ấy đè lên text thì em thấy nó vẫn "trong veo" bác ạ. Xin bác xem file em gửi kèm (http://www.cadviet.c...khongdetext.rar).
02. Lisp của bác chỉ chuẩn khi để nguyên các yếu tố có trên bản vẽ; nghĩa là cứ để tất cả các layer mở để chọn thì OK còn nếu mình tắt hết các lớp đi, để lớp Vòng tròn đó thôi (để mình chọn cho tiện) thì khi bật các layer kia lên thì nó vẫn không đè được bác ạ; mặc dù em có nhân lệnh RE một số lần cũng không được.
Rất mong bác giúp đỡ em.
Thành thật em cảm ơn bác rất nhiều.

Thực ra, theo ý của bạn hỏi ở bài đầu thì việc này cũng có thể sử lý kỹ thuật trên Auto cad. nhưng chắc chắn là nó sẽ lâu hơn dùng lisp. vì thế mình ko đề cập ở đây nữa. Còn vấn đề tồn tại ở trên đây, thì bạn có thể dùng lệnh Qselect chọn cái lớp wipeout và text layer sst đó rồi chọn bring to front là những cái khác chìm ngỉm luôn.
  • 0
Không sợ việc gì khó! Chỉ sợ việc bất khả thi...

#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 12 December 2011 - 04:12 PM

Em rất bất ngờ về kết quả mà Lisp bác Phamthanhbinh đã giúp đỡ, tuy nhiên khi em làm em còn thấy một điều thắc mắc nho nhỏ, xin bác giúp đỡ em với ạ.
01. Lisp bác gửi cho em nó chỉ đè được Polyline thôi, còn "nhỡ" mà cái vòng tròn ấy đè lên text thì em thấy nó vẫn "trong veo" bác ạ. Xin bác xem file em gửi kèm (http://www.cadviet.c...khongdetext.rar).
02. Lisp của bác chỉ chuẩn khi để nguyên các yếu tố có trên bản vẽ; nghĩa là cứ để tất cả các layer mở để chọn thì OK còn nếu mình tắt hết các lớp đi, để lớp Vòng tròn đó thôi (để mình chọn cho tiện) thì khi bật các layer kia lên thì nó vẫn không đè được bác ạ; mặc dù em có nhân lệnh RE một số lần cũng không được.
Rất mong bác giúp đỡ em.
Thành thật em cảm ơn bác rất nhiều.

Lisp bác Bình khi di chuyển thì mất tính năng "đè"
Quick code cho bạn
Bạn thử xem :



(defun c:vec(/ ename i ss ssnc)
(command "undo" "be")
(if (setq ss (ssget '((0 . "CIRCLE") (8 . "stt"))) i -1)
(Progn
(setvar "clayer" "stt")
(Repeat (sslength ss)
(setq ename (ssname ss (setq i (1+ i))))
(if (= (cdr(assoc 0 (entget ename))) "CIRCLE")
(progn
(command ".polygon" "360" (cdr(assoc 10 (entget ename)))
"I" (cdr(assoc 40 (entget ename))))
(setq ssnc (ssget "cp" (ACET-GEOM-VERTEX-LIST (entlast))
'((0 . "*LINE,*TEXT") (8 . "stt")) ))
(command ".wipeout" "p" "L" "y")

(entdel ename)
;(command ".draworder" (entlast) "" "a" ssnc "")
(command ".draworder" ssnc "" "a" (entlast) "")
)
)
(command "undo" "end")

)
)
)
)
Chú ý : Vòng tròn, Line và Text trong vòng tròn nằm ở Layer "STT"
  • 2

#12 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 12 December 2011 - 04:51 PM

Bác Tuệ test kết quả trên nền CAD nào vậy ạ ^^ E test xong thì ôm một khối Unknown Command + các text chui xuống bên dưới hết. ^^
Theo e giải pháp khoai hơn 1 chút là chuyển tất cả về Block ATT
Hoặc sau khi tạo hết Wipeout :

(command ".draworder" (ssget "x" '((0 . "LINE,*TEXT") (8 . "stt")) ) "" "f" )
(command "regen")


(defun c:vec(/ ename i ss ssnc)
(if (setq ss (ssget "x" '((0 . "CIRCLE") (8 . "stt"))) i -1)
(Progn
(command "undo" "be")
(setvar "clayer" "stt")
(Repeat (sslength ss)
(setq ename (ssname ss (setq i (1+ i))))
(if (= (cdr(assoc 0 (entget ename))) "CIRCLE")
(progn
(command ".polygon" "360" "_non" (cdr(assoc 10 (entget ename))) "I" (cdr(assoc 40 (entget ename))))
(command ".wipeout" "p" "L" "y")
(entdel ename)
)
)
)
(command ".draworder" (ssget "x" '((0 . "LINE,*TEXT") (8 . "stt")) ) "" "f" )
(command "regen")
(command "undo" "be")
)
)
)
P/s : sử dụng lại lisp lần 2 k lỗi như trước, mọi việc OK n bị treo CAD sau đó ( khi muốn move wipeout đi để test) , có lẽ do máy e cùi mà đòi ôm a polygon 360 :(
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#13 Chiron

Chiron

    biết dimradius

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

Đã gửi 12 December 2011 - 05:06 PM

Thực ra, theo ý của bạn hỏi ở bài đầu thì việc này cũng có thể sử lý kỹ thuật trên Auto cad. nhưng chắc chắn là nó sẽ lâu hơn dùng lisp. vì thế mình ko đề cập ở đây nữa. Còn vấn đề tồn tại ở trên đây, thì bạn có thể dùng lệnh Qselect chọn cái lớp wipeout và text layer sst đó rồi chọn bring to front là những cái khác chìm ngỉm luôn.

bạn có thể mô tả cách của bạn được không? vì không phải lúc nào cũng dùng lisp được.
  • 0

#14 only102

only102

    biết vẽ pline

  • Advance Member
  • PipPip
  • 63 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 12 December 2011 - 05:33 PM

bạn có thể mô tả cách của bạn được không? vì không phải lúc nào cũng dùng lisp được.

Mình ko biết trường hợp như thế nào thì ko dùng lisp được. Nhưng nếu muốn chỉ xử lý mà ko dùng lisp thì bạn có thể tạo 1 polygon (lệnh PO) trùm lên cái circle đó rồi biến nó thành wipeout. Sau đó, copy đè lên các vị trí vòng tròn trên bản vẽ. Qselect line và text thuộc layer "sst" (như của bản vẽ) rồi đưa nó lên trên. Nếu cần thì lại Qselect vòng tròng và xóa đi
Cách này thủ công nên nếu có lisp chắc chắn vẫn hơn.
  • 0
Không sợ việc gì khó! Chỉ sợ việc bất khả thi...

#15 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 13 December 2011 - 02:12 AM

Em rất bất ngờ về kết quả mà Lisp bác Phamthanhbinh đã giúp đỡ, tuy nhiên khi em làm em còn thấy một điều thắc mắc nho nhỏ, xin bác giúp đỡ em với ạ.
01. Lisp bác gửi cho em nó chỉ đè được Polyline thôi, còn "nhỡ" mà cái vòng tròn ấy đè lên text thì em thấy nó vẫn "trong veo" bác ạ. Xin bác xem file em gửi kèm (http://www.cadviet.c...khongdetext.rar).
02. Lisp của bác chỉ chuẩn khi để nguyên các yếu tố có trên bản vẽ; nghĩa là cứ để tất cả các layer mở để chọn thì OK còn nếu mình tắt hết các lớp đi, để lớp Vòng tròn đó thôi (để mình chọn cho tiện) thì khi bật các layer kia lên thì nó vẫn không đè được bác ạ; mặc dù em có nhân lệnh RE một số lần cũng không được.
Rất mong bác giúp đỡ em.
Thành thật em cảm ơn bác rất nhiều.

Hề hề hề,
Bạn hãy xem lại yêu cầu của bạn: Tuy nhiên, ở khung hình nhỏ ở góc trái bản vẽ thì hình tròn có thể đè lên trên đường polyline, còn các hình tròn khác trong bản vẽ thì không thể.
Và : Cảm ơn anh! Nghĩa là em muốn thay cái vòng tròn đó để cho nó che cái phần Polyline đi anh ạ.
Đâu có thấy bạn nói đến yêu cầu đè text đâu. Vì thế khi chọn đối tượng cần dấu xuống dưới wipeout thì mình chỉ cho chọn các đường line mà thôi. Nếu bạn muốn bạn có thể bổ xung thêm không cứ là text mà còn cả các đối tượng khác cũng được vào trong bộ chọn ss1 là Ok. Vấn đề là bạn cần nói rõ cái yêu cầu của bạn thì mới làm lisp đúng cho bạn được.
Việc bạn tắt hết các lớp đi để chọn các đối tượng vòng tròn thì rõ ràng khi bạn chọn các đối tượng cần giấu sẽ chả chọn được gì nữa vì nó đã giấu rồi, vậy nên khi mở lại thì đương nhiên là nó còn thấy bạn ạ. Lệnh ssget là lệnh mà nó chỉ cho chọn các đối tượng hiển thị trên màn hình.
Thực ra tại sao bạn phải tắt các lớp nhỉ khi trong lisp mình đã có bộ chọn cho bạn để chỉ chọn các đối tượng là vòng tròn trên lớp STT của bạn (lớp của đối tượng mẫu). Do đó bạn chỉ cần quét bằng cửa sổ là Ok chứ đâu phải pick chọn từng thằng đâu.
Bạn không chịu đọc kỹ lisp mà chỉ muốn ăn ngay nên mới phải nghẹn đó.
Hề hề hề,
@ bác Tue_NV: Mình chưa rõ ý của bác nói khi di chuyển thì mất tính năng đè là như thế nào??? Phải chăng bác nói là khi move các đối tượng trên bản vẽ ra khỏi vị trí cũ còn Wipeout thì để lại thì cái wipeout không đè được các đối tượng nữa. ??? Vậy thì mình chưa rõ vì sao lại phải di chuyễn như vậy?? Sao không di luôn cả thằng wipeout đi cùng nhỉ????
Cái này thì mình chưa hiểu lắm nên rất mong bác chỉ bảo thêm.
Hề hề hề,...
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#16 minhphuong_humg

minhphuong_humg

    biết lệnh offset

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

Đã gửi 13 December 2011 - 08:48 AM

Hề hề hề,
Bạn hãy xem lại yêu cầu của bạn: Tuy nhiên, ở khung hình nhỏ ở góc trái bản vẽ thì hình tròn có thể đè lên trên đường polyline, còn các hình tròn khác trong bản vẽ thì không thể.
Và : Cảm ơn anh! Nghĩa là em muốn thay cái vòng tròn đó để cho nó che cái phần Polyline đi anh ạ.
Đâu có thấy bạn nói đến yêu cầu đè text đâu. Vì thế khi chọn đối tượng cần dấu xuống dưới wipeout thì mình chỉ cho chọn các đường line mà thôi. Nếu bạn muốn bạn có thể bổ xung thêm không cứ là text mà còn cả các đối tượng khác cũng được vào trong bộ chọn ss1 là Ok. Vấn đề là bạn cần nói rõ cái yêu cầu của bạn thì mới làm lisp đúng cho bạn được.
Việc bạn tắt hết các lớp đi để chọn các đối tượng vòng tròn thì rõ ràng khi bạn chọn các đối tượng cần giấu sẽ chả chọn được gì nữa vì nó đã giấu rồi, vậy nên khi mở lại thì đương nhiên là nó còn thấy bạn ạ. Lệnh ssget là lệnh mà nó chỉ cho chọn các đối tượng hiển thị trên màn hình.
Thực ra tại sao bạn phải tắt các lớp nhỉ khi trong lisp mình đã có bộ chọn cho bạn để chỉ chọn các đối tượng là vòng tròn trên lớp STT của bạn (lớp của đối tượng mẫu). Do đó bạn chỉ cần quét bằng cửa sổ là Ok chứ đâu phải pick chọn từng thằng đâu.
Bạn không chịu đọc kỹ lisp mà chỉ muốn ăn ngay nên mới phải nghẹn đó.
Hề hề hề,
@ bác Tue_NV: Mình chưa rõ ý của bác nói khi di chuyển thì mất tính năng đè là như thế nào??? Phải chăng bác nói là khi move các đối tượng trên bản vẽ ra khỏi vị trí cũ còn Wipeout thì để lại thì cái wipeout không đè được các đối tượng nữa. ??? Vậy thì mình chưa rõ vì sao lại phải di chuyễn như vậy?? Sao không di luôn cả thằng wipeout đi cùng nhỉ????
Cái này thì mình chưa hiểu lắm nên rất mong bác chỉ bảo thêm.
Hề hề hề,...

Em rất cảm ơn bác phamthanhbinh và tất cả các bác đã quan tâm tới vấn đề em hỏi. Bác Bình trách em cũng có phần đúng là em chưa hỏi "hết" nhưng cũng phải nói với bác là nhìn vào bản vẽ thì "đa số" là cái vòng tròn ấy nó đè lên Polyline nên em mới hỏi vậy; còn theo suy nghĩ thiển cận của em thì em nghĩ nó "đè" thì nó cũng sẽ "đè" hết các đối tượng. Rất mong bác thông cảm vì sự hỏi thiếu thông tin của em. Trân trọng cảm ơn bác.
  • 0

#17 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 13 December 2011 - 12:43 PM

Faster. Bạn muốn thao tác với vùng chọn thì bỏ chũ "x" trong các dòng ssget đi. Muốn sửa gì thì minhg ghi chú trong lisp đó.
Lisp có sử dụng phần tạo wipeout của bác Thái Bụi cho nhanh

(defun c:vec(/ lst num lay ss ss1 e1 dxf10 max_dist cen dxf14 wpObject doc)
(setq num 100 ;So canh Pline gia lap duong tron
lay "STT" ;Layer Text, Line, Circle)
)
(cond ( (setq ss (ssget "x" (list (cons 0 "CIRCLE") (cons 8 lay))))
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object))
ss1 (vla-get-ActiveSelectionSet doc)
e1 (entget (ssname ss 0)) i 0 d (cdr(assoc 40 e1)) pt (cdr (assoc 10 e1))
)
(vla-startundomark doc)
;Tao WipeOut
(if (not (member "acwipeout.arx" (arx))) (arxload "acwipeout.arx"))
(setq i 0)
(while (< i num)
(setq lst (cons (polar pt (/ (* pi 2 (setq i (1+ i))) num) d) lst))
)
(setq dxf10 (list (apply'min (mapcar 'car lst)) (apply'min(mapcar'cadr lst)) (if(caddar lst)(caddar lst)0))
max_dist(float (apply'max (mapcar'- (apply'mapcar(cons'max lst)) dxf10)))
cen (mapcar'+ dxf10 (list(/ max_dist 2)(/ max_dist 2) 0.0))
dxf14 (mapcar '(lambda(p)(mapcar '/ (mapcar'- p cen)(list max_dist (- max_dist) 1.0)))lst)
dxf14 (reverse (cons(car dxf14)(reverse dxf14)))
wpObject
(vlax-ename->vla-object
(entmakex (append (list
'(0 . "WIPEOUT")'(100 . "AcDbEntity")
(cons 8 lay)
'(100 . "AcDbWipeout")'(90 . 0)
(cons 10 (trans dxf10 (list 0 0 1) 0))
(cons 11 (trans (list max_dist 0.0 0.0) (list 0 0 1) 0))
(cons 12 (trans (list 0.0 max_dist 0.0) (list 0 0 1) 0))
'(13 1.0 1.0 0.0)'(70 . 7)'(280 . 1)'(71 . 2)
(cons 91 (length dxf14)))
(mapcar'(lambda(p)(cons 14 p))dxf14)
)
)
)
)
(vlax-map-collection ss1 '(lambda(x)(vla-move (vla-copy wpObject) (vlax-3d-point pt)(vlax-3d-point (vlax-get x 'Center)))(vla-erase x)))
(cond ( (setq ss (ssget "x" (list (cons 0 "LINE,*TEXT") (cons 8 Lay))))
(setq ss1 (vla-get-ActiveSelectionSet doc))
(vlax-map-collection ss1 '(lambda(x)(vla-copy x)(vla-erase x)))
)
)
(vlax-release-object ss1)
(vla-regen doc acActiveViewport )
(vla-endundomark doc)
)
))

  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#18 minhphuong_humg

minhphuong_humg

    biết lệnh offset

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

Đã gửi 14 December 2011 - 08:53 AM

Faster. Bạn muốn thao tác với vùng chọn thì bỏ chũ "x" trong các dòng ssget đi. Muốn sửa gì thì minhg ghi chú trong lisp đó.
Lisp có sử dụng phần tạo wipeout của bác Thái Bụi cho nhanh


(defun c:vec(/ lst num lay ss ss1 e1 dxf10 max_dist cen dxf14 wpObject doc)
(setq num 100 ;So canh Pline gia lap duong tron
lay "STT" ;Layer Text, Line, Circle)
)
(cond ( (setq ss (ssget "x" (list (cons 0 "CIRCLE") (cons 8 lay))))
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object))
ss1 (vla-get-ActiveSelectionSet doc)
e1 (entget (ssname ss 0)) i 0 d (cdr(assoc 40 e1)) pt (cdr (assoc 10 e1))
)
(vla-startundomark doc)
;Tao WipeOut
(if (not (member "acwipeout.arx" (arx))) (arxload "acwipeout.arx"))
(setq i 0)
(while (< i num)
(setq lst (cons (polar pt (/ (* pi 2 (setq i (1+ i))) num) d) lst))
)
(setq dxf10 (list (apply'min (mapcar 'car lst)) (apply'min(mapcar'cadr lst)) (if(caddar lst)(caddar lst)0))
max_dist(float (apply'max (mapcar'- (apply'mapcar(cons'max lst)) dxf10)))
cen (mapcar'+ dxf10 (list(/ max_dist 2)(/ max_dist 2) 0.0))
dxf14 (mapcar '(lambda(p)(mapcar '/ (mapcar'- p cen)(list max_dist (- max_dist) 1.0)))lst)
dxf14 (reverse (cons(car dxf14)(reverse dxf14)))
wpObject
(vlax-ename->vla-object
(entmakex (append (list
'(0 . "WIPEOUT")'(100 . "AcDbEntity")
(cons 8 lay)
'(100 . "AcDbWipeout")'(90 . 0)
(cons 10 (trans dxf10 (list 0 0 1) 0))
(cons 11 (trans (list max_dist 0.0 0.0) (list 0 0 1) 0))
(cons 12 (trans (list 0.0 max_dist 0.0) (list 0 0 1) 0))
'(13 1.0 1.0 0.0)'(70 . 7)'(280 . 1)'(71 . 2)
(cons 91 (length dxf14)))
(mapcar'(lambda(p)(cons 14 p))dxf14)
)
)
)
)
(vlax-map-collection ss1 '(lambda(x)(vla-move (vla-copy wpObject) (vlax-3d-point pt)(vlax-3d-point (vlax-get x 'Center)))(vla-erase x)))
(cond ( (setq ss (ssget "x" (list (cons 0 "LINE,*TEXT") (cons 8 Lay))))
(setq ss1 (vla-get-ActiveSelectionSet doc))
(vlax-map-collection ss1 '(lambda(x)(vla-copy x)(vla-erase x)))
)
)
(vlax-release-object ss1)
(vla-regen doc acActiveViewport )
(vla-endundomark doc)
)
))

Cảm ơn bác ketxu rất nhiều, cảm ơn mọi người đã quan tâm và giúp đỡ. Chúc mọi người có sức khỏe dồi dào.Trân trọng cảm ơn!
  • 0

#19 Chiron

Chiron

    biết dimradius

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

Đã gửi 14 December 2011 - 09:10 AM

Mình ko biết trường hợp như thế nào thì ko dùng lisp được. Nhưng nếu muốn chỉ xử lý mà ko dùng lisp thì bạn có thể tạo 1 polygon (lệnh PO) trùm lên cái circle đó rồi biến nó thành wipeout. Sau đó, copy đè lên các vị trí vòng tròn trên bản vẽ. Qselect line và text thuộc layer "sst" (như của bản vẽ) rồi đưa nó lên trên. Nếu cần thì lại Qselect vòng tròng và xóa đi
Cách này thủ công nên nếu có lisp chắc chắn vẫn hơn.

Mình cứ nghĩ bạn có cách khác giống như qselect rồi replace all giống thao tác với text :D. Nếu có được cách làm này thì dù chậm hơn LISP thì quá tốt. Trường hợp mình dùng autoCAD LT không dùng LISP được thì vẫn phải tìm cách giảm thao tác thôi. Vẫn phải làm thủ công vậy.
  • 0

#20 minhphuong_humg

minhphuong_humg

    biết lệnh offset

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

Đã gửi 30 December 2011 - 08:55 AM

Lisp bác Bình khi di chuyển thì mất tính năng "đè"
Quick code cho bạn
Bạn thử xem :




(defun c:vec(/ ename i ss ssnc)
(command "undo" "be")
(if (setq ss (ssget '((0 . "CIRCLE") (8 . "stt"))) i -1)
(Progn
(setvar "clayer" "stt")
(Repeat (sslength ss)
(setq ename (ssname ss (setq i (1+ i))))
(if (= (cdr(assoc 0 (entget ename))) "CIRCLE")
(progn
(command ".polygon" "360" (cdr(assoc 10 (entget ename)))
"I" (cdr(assoc 40 (entget ename))))
(setq ssnc (ssget "cp" (ACET-GEOM-VERTEX-LIST (entlast))
'((0 . "*LINE,*TEXT") (8 . "stt")) ))
(command ".wipeout" "p" "L" "y")

(entdel ename)
;(command ".draworder" (entlast) "" "a" ssnc "")
(command ".draworder" ssnc "" "a" (entlast) "")
)
)
(command "undo" "end")

)
)
)
)
Chú ý : Vòng tròn, Line và Text trong vòng tròn nằm ở Layer "STT"

Ui, anh ơi. Hôm nay em sử dụng lại có trường hợp xảy ra là với cái vòng tròn ở trên "Tử" là cái số thứ tự, dưới "Mẫu" là cái chiều cao cột; còn cái ở giữa là cái đường ngăn cách (Polyline). Em dùng lisp với lệnh VEC thì nó hiện lên hết; trừ cái "đường ngăn cách đó" là lại bị mất đi. Xin anh hướng dẫn. Trân trọng cảm ơn.
File:http://www.cadviet.com/upfiles/3/0_khongdetext.rar
  • 0