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

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

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

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.com/upfiles/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.

  • 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

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

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á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ỉ!

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 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ề

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, 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.

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ề 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!

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

Chỉnh sửa theo phamthanhbinh
Bổ sung lisp theo yêu cầu
  • Vote tăng 3

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ề 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!

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

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

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 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"

  • 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

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

  • 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

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.

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

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 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ề,...

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ề 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.

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

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

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

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!

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

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

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

Nếu bạn tiếp tục chỉ gửi nhõn cái file ảnh thì khó có ai quan tâm lắm

Lần trước mình định nhắc bạn nhưng thôi, lần này lại vẫn thế. Chẳng ai bắt bệnh hên xui bằng cách đó cho bạn được đâu, khó lắm bạn ơi.

Mà bạn đã thử tất cả các lisp trong topic chưa :o

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

Nếu bạn tiếp tục chỉ gửi nhõn cái file ảnh thì khó có ai quan tâm lắm

Lần trước mình định nhắc bạn nhưng thôi, lần này lại vẫn thế. Chẳng ai bắt bệnh hên xui bằng cách đó cho bạn được đâu, khó lắm bạn ơi.

Mà bạn đã thử tất cả các lisp trong topic chưa ohmy.png

Vâng, xin lỗi anh vì em chỉ gửi file ảnh. Em đã thử 3 lisp có trong topic. Và đây là sản phẩm của lệnh VEC anh ạ.

http://www.cadviet.com/upfiles/3/0_mat.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

ô, thế bạn gửi file kết quả, k có file mẫu, giờ người viết lisp lại viết lisp tạo vòng tròn để test lại code bạn dùng hay sao ?? Mong bạn đứng trên suy nghĩ của người viết để hiể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

ô, thế bạn gửi file kết quả, k có file mẫu, giờ người viết lisp lại viết lisp tạo vòng tròn để test lại code bạn dùng hay sao ?? Mong bạn đứng trên suy nghĩ của người viết để hiểu sad.png

Xin lỗi bác nhé, bác nói tới đây em lại mới nói. Em chưa làm được thì lấy gì làm mẫu bác, còn mong muốn giúp đỡ của em là; các thành phần của vòng tròn ấy đè lên các đối tượng khác để em in cho nó đỡ xấu bản vẽ. Chắc bác chưa để ý lắm cái mong muốn nhỏ của em ở đầu topic rồi. Bởi thế, em mới thấy lisp bác giúp đỡ em nó chỉ có phần vòng tròn, tử, mẫu là nó đè lên các đối tượng khác, còn cái phần chắn ngang thì nó lại chưa đè.

Còn nếu bác để ý thì cái file "mong muốn" em cũng đã up ở đầu topic rồi đó bác.

Xin lỗi vì làm phiền bác nhiều quá nha.

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 lỗi bác nhé, bác nói tới đây em lại mới nói. Em chưa làm được thì lấy gì làm mẫu bác, còn mong muốn giúp đỡ của em là; các thành phần của vòng tròn ấy đè lên các đối tượng khác để em in cho nó đỡ xấu bản vẽ. Chắc bác chưa để ý lắm cái mong muốn nhỏ của em ở đầu topic rồi. Bởi thế, em mới thấy lisp bác giúp đỡ em nó chỉ có phần vòng tròn, tử, mẫu là nó đè lên các đối tượng khác, còn cái phần chắn ngang thì nó lại chưa đè.

Còn nếu bác để ý thì cái file "mong muốn" em cũng đã up ở đầu topic rồi đó bác.

Xin lỗi vì làm phiền bác nhiều quá nha.

File mẫu của bạn thì Tue_NV test Lisp của mình OK

Trường hợp bạn chạy xong rồi thì Circle đã bị xóa -> không thể test bằng Lisp được

Bạn có thể giải quyết tiếp bằng lệnh Draworder kết hợp 'Fi -> Lọc ra những anh chắn ngang và cho nó ở Front

Có thể dùng Quick select với lệnh draworder

File của bạn khi dùng lệnh xong

Bạn xem thử : http://www.cadviet.com/upfiles/3/4652_0_mat.dwg

  • 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

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

×