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

[Hỏi] Xóa đối tượng nằm trên layout khác

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

Mình có thể tạo một tập đối tượng bằng hàm (ssget chứa các đối tượng trên tất cả các Layout.

Tuy nhiên lệnh Erase chỉ cho phép xóa đối tượng trên Layout hiện hành. Hàm (entdel cũng vậy.

 

Như vậy, làm thế nào để xóa tất cả các đối tượng trong một tập chọn bao gồm nhiều đối tượng nằm trên nhiều layout khác nhau?

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

Cám ơn bác Doan Van Ha! Mình xin tự trả lời câu hỏi đã đặt ra ở trên (với sự giúp đỡ của bác Doan Van Ha) như sau:
 
Để xóa một đối tượng, ta có các lựa chọn là: Dùng lệnh Erase, dùng hàm (entdel hoặc hàm (vla-delete.
- Lệnh Erase và hàm (entdel chỉ có thể xóa đối tượng trên sheet hiện tại (Model hoặc Layout hiện hành)
- Hàm (vla-delete có thể xóa đối tượng nằm trong Model hay bất kỳ Layout nào.

 

Như vậy, có thể khẳng định (thêm một lần nữa) rằng các hàm (vla- có sức mạnh hơn hẳn so với các lệnh gốc của AutoCAD hoặc các hàm AutoLisp đơn thuần khác. Chỉ có một việc phải làm là phải gọi (vl-load-com) trước khi sử dụng.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vào lúc 21/8/2013 tại 10:32, Polyline đã nói:

Mình có thể tạo một tập đối tượng bằng hàm (ssget chứa các đối tượng trên tất cả các Layout.

Tuy nhiên lệnh Erase chỉ cho phép xóa đối tượng trên Layout hiện hành. Hàm (entdel cũng vậy.

 

Như vậy, làm thế nào để xóa tất cả các đối tượng trong một tập chọn bao gồm nhiều đối tượng nằm trên nhiều layout khác nhau?

 

Vào lúc 21/8/2013 tại 11:22, Doan Van Ha đã nói:

 

@Doan Van Ha Em đã tham khảo link anh gửi nhưng em còn thắc mắc, mong anh giải đáp.

Hiện em đã có lisp copy đối tượng từ layout hiện hành sang tất cả các layout.

Code lisp:

(defun c:CTL (/ *error* ss)
(princ "\rCOPYTOLAYOUTS ")
(vl-load-com)
 
(defun *error* (msg)
(if acDoc (vla-endundomark acDoc))
(cond ((not msg)) ; Normal exit
((member msg '("Function cancelled" "quit / exit abort"))) ; <esc> or (quit)
((princ (strcat "\n** Error: " msg " ** ")))) ; Fatal error, display it
(princ))
 
(prompt "\nSelect objects to copy to layouts: ")
(if (setq ss (ssget "_:L"))
((lambda (acDoc / oItemList oCurLayout)
(vla-startundomark acDoc)
(vlax-for oItem (setq ss (vla-get-activeselectionset acDoc))
(setq oItemList (cons oItem oItemList)))
(vlax-for oLayout (vla-get-layouts acDoc)
(if (and (/= (cond
(oCurLayout)
((setq oCurLayout (vla-get-activeLayout acDoc))))
oLayout)
(/= "Model" (vla-get-name oLayout)))
(vlax-invoke
acDoc
"copyobjects"
oItemList
(vla-get-block oLayout))))
(vla-delete ss)
(*error* nil))
(vla-get-activedocument (vlax-get-acad-object)))
(prompt "\n** Nothing selected ** "))
(princ))

Em muốn tìm lisp để xóa đối tượng ở cùng một vị trí (tọa độ) trong tất cả các lay out (Ví dụ: Block khung tên, ghi chú,...) nhưng em tham khảo trên mạng không có lisp như vậy.

Nếu thay đổi chức năng copy trong lisp như trên thành delete thì có được không ạ?

Anh có thể hướng dẫn chi tiết thêm được không ? Em 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
2 giờ trước, nikizi đã nói:

 

 

@Doan Van Ha Em đã tham khảo link anh gửi nhưng em còn thắc mắc, mong anh giải đáp.

Hiện em đã có lisp copy đối tượng từ layout hiện hành sang tất cả các layout.

Code lisp:


(defun c:CTL (/ *error* ss)
(princ "\rCOPYTOLAYOUTS ")
(vl-load-com)
 
(defun *error* (msg)
(if acDoc (vla-endundomark acDoc))
(cond ((not msg)) ; Normal exit
((member msg '("Function cancelled" "quit / exit abort"))) ; <esc> or (quit)
((princ (strcat "\n** Error: " msg " ** ")))) ; Fatal error, display it
(princ))
 
(prompt "\nSelect objects to copy to layouts: ")
(if (setq ss (ssget "_:L"))
((lambda (acDoc / oItemList oCurLayout)
(vla-startundomark acDoc)
(vlax-for oItem (setq ss (vla-get-activeselectionset acDoc))
(setq oItemList (cons oItem oItemList)))
(vlax-for oLayout (vla-get-layouts acDoc)
(if (and (/= (cond
(oCurLayout)
((setq oCurLayout (vla-get-activeLayout acDoc))))
oLayout)
(/= "Model" (vla-get-name oLayout)))
(vlax-invoke
acDoc
"copyobjects"
oItemList
(vla-get-block oLayout))))
(vla-delete ss)
(*error* nil))
(vla-get-activedocument (vlax-get-acad-object)))
(prompt "\n** Nothing selected ** "))
(princ))

Em muốn tìm lisp để xóa đối tượng ở cùng một vị trí (tọa độ) trong tất cả các lay out (Ví dụ: Block khung tên, ghi chú,...) nhưng em tham khảo trên mạng không có lisp như vậy.

Nếu thay đổi chức năng copy trong lisp như trên thành delete thì có được không ạ?

Anh có thể hướng dẫn chi tiết thêm được không ? Em cám ơn anh.

Tham khảo lisp xóa tất cả block có điểm chèn tại (0 , 0 0) trong tất cả layout.

(defun c:eraseBlock (/ pt )
  (setq pt (list 0 0 0))
  (vlax-for lay (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object)))
    (vlax-for obj (vla-get-block lay)
      (if (= (vla-get-Objectname obj) "AcDbBlockReference"   )
	(if (< (distance pt (vlax-safearray->list (variant-value(vla-get-InsertionPoint obj)))) 0.00001)
	     (vla-erase obj)
	  )
	)
      )
    )
(princ))

 

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

×