Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
lp_hai

[Hỏi]Làm thế nào để biết dt đã bị xóa hay chưa trong bản vẽ?

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

lp_hai    209

Chào cả nhà! Vì "mục đích cá nhân" nên phát sinh câu hỏi thế này, mong mọi người giúp đỡ :)

Trong lisp em có dùng đoạn code:

(setq dt (ssget))

và biến dt này em muốn dùng cho những lần dùng lệnh tiếp theo mà ko cần chọn lại. vì thế ở dòng đầu tiên em ko xóa biến đó đi:

defun c:vd()

 

ví dụ lisp thế này:

 

(DEFUN C:vd ()

(if (not dt)

(setq dt (ssget) )

)

(princ "\nco doi tuong")

)

 

vấn đề ở đây là khi em xóa dt đi (xóa bằng lệnh erase) thì hàm (not dt) trả về nil, vì cad vẫn còn hiểu biến dt.

Câu hỏi của e là khi mình xóa dt rồi thì làm sao để lisp hỏi chọn dt mới??

Thanks cả 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
Tue_NV    3.841

Chào cả nhà! Vì "mục đích cá nhân" nên phát sinh câu hỏi thế này, mong mọi người giúp đỡ :)

Trong lisp em có dùng đoạn code:

(setq dt (ssget))

và biến dt này em muốn dùng cho những lần dùng lệnh tiếp theo mà ko cần chọn lại. vì thế ở dòng đầu tiên em ko xóa biến đó đi:

defun c:vd()

 

ví dụ lisp thế này:

 

(DEFUN C:vd ()

(if (not dt)

(setq dt (ssget) )

)

(princ "\nco doi tuong")

)

 

vấn đề ở đây là khi em xóa dt đi (xóa bằng lệnh erase) thì hàm (not dt) trả về nil, vì cad vẫn còn hiểu biến dt.

Câu hỏi của e là khi mình xóa dt rồi thì làm sao để lisp hỏi chọn dt mới??

Thanks cả nhà.

Bạn có thể kiểm tra ename trong tập DT đã bị xóa bằng lệnh Erase chưa bằng hàm (vlax-erased-p obj) hoặc bằng hàm entget

Topic này đã có lập ra rồi bạn ạ

  • 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
phamthanhbinh    3.123

Chào cả nhà! Vì "mục đích cá nhân" nên phát sinh câu hỏi thế này, mong mọi người giúp đỡ :)

Trong lisp em có dùng đoạn code:

(setq dt (ssget))

và biến dt này em muốn dùng cho những lần dùng lệnh tiếp theo mà ko cần chọn lại. vì thế ở dòng đầu tiên em ko xóa biến đó đi:

defun c:vd()

 

ví dụ lisp thế này:

 

(DEFUN C:vd ()

(if (not dt)

(setq dt (ssget) )

)

(princ "\nco doi tuong")

)

 

vấn đề ở đây là khi em xóa dt đi (xóa bằng lệnh erase) thì hàm (not dt) trả về nil, vì cad vẫn còn hiểu biến dt.

Câu hỏi của e là khi mình xóa dt rồi thì làm sao để lisp hỏi chọn dt mới??

Thanks cả nhà.

Hề hề hề,

Đơn giản mà bạn, Sau khi đã xóa thì thêm vào dòng code (setq dt (ssget)).

Hề hề hề,..

  • 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
Tue_NV    3.841

Hề hề hề,

Đơn giản mà bạn, Sau khi đã xóa thì thêm vào dòng code (setq dt (ssget)).

Hề hề hề,..

Cái này bạn ấy xóa bằng lệnh Erase chứ không phải xóa bằng Lisp.

Em nghĩ đơn giản là bạn ấy chỉ muốn kiểm tra Tập DT có bị xóa khỏi CAD bằng lệnh erase chưa hay không thôi.

Nếu đã bị xóa toàn bộ hoặc là biến DT chưa tồn tại thì thiết lập (setq dt (ssget))

  • 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
lp_hai    209

cảm ơn các bác quan tâm, đúng như bác Tue nói, em làm theo chỉ dẫn của bác Tue là kiểm tra enget(ssname dt 0), nếu trả về nil thì setq dt lại.

còn nếu muốn chính xác hơn thì chắc phải cho nó cái vòng lập repeat wa từng ename trong dt.

thanks cả 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
ketxu    2.653

Dt của bạn là 1 tập đối tượng, kiểm tra dt có bị xóa hay chưa sẽ có 1 trong 2 trường hợp :

- Toàn bộ bị xóa (vl-every)

- 1 đối tượng trong tập chọn bị xóa (thay vl-every bằng vl-some)

 

 

Sử dụng vlax-erased-p vlaObj để biết 1 đối tượng đã bị xóa hay chưa.

Bạn nghiên cứu code này, hoặc cho nó vào lisp của bạn, có gì không hiểu ta bàn tiếp nhé :) Mình đã ghi chú chức năng trong đó rồi

 

(defun c:test()
(defun ST:Ss->ListVLA (ss / n e l) ;Ham nay de lay list cac vlaObject cua 1 tap chon ss
 (setq n (sslength ss))
 (while (setq e (ssname ss (setq n (1- n))))
(setq l (cons (vlax-ename->vla-object e) l))
 )
)
(defun ST:SS-earsed-p (lstSS)
;Ham nay kiem tra list cac doi tuong lstSS (dang VLA) da bi xoa hay chua
;Neu dinh nghia xoa cua ban la 1 doi tuong thoi thi ban thay vl-every bang vl-some nhe
(vl-every 'vlax-erased-p lstSS)
)

;Bat dau ham chinh :
(or ss (setq ss (ssget))) ;Neu chua co ss thi chon lai ss, co roi thi dung ss da co
(or lstSS (setq lstSS (ST:Ss->ListVLA ss))) ;Neu chua co lstSS thi tinh lai tu ss, co roi thi thoi
(if (ST:SS-earsed-p lstss) ;Neu ss da bi xoa
(progn
 (princ "Tap chon ss da bi xoa, moi ban chon lai doi tuong :")
 (setq ss (ssget))
 (setq lstSS (ST:Ss->ListVLA ss)) ;Nho phai thiet lap lai lstSS o day nhe
)
)
;Lam nhung viec khac binh thuong
(princ)
)

  • 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
Tue_NV    3.841

cảm ơn các bác quan tâm, đúng như bác Tue nói, em làm theo chỉ dẫn của bác Tue là kiểm tra enget(ssname dt 0), nếu trả về nil thì setq dt lại.

còn nếu muốn chính xác hơn thì chắc phải cho nó cái vòng lập repeat wa từng ename trong dt.

thanks cả nhà.

Bạn chú ý trường hợp khi mà DT lần đầu tiên nó chưa hề tồn tại (not dt) -> T

 

(ssname dt 0) -> error: bad argument type: lselsetp nil

 

Bạn kiểm tra thêm điều kiện này nữa.

Chúc thành cô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
phamthanhbinh    3.123

cảm ơn các bác quan tâm, đúng như bác Tue nói, em làm theo chỉ dẫn của bác Tue là kiểm tra enget(ssname dt 0), nếu trả về nil thì setq dt lại.

còn nếu muốn chính xác hơn thì chắc phải cho nó cái vòng lập repeat wa từng ename trong dt.

thanks cả nhà.

Hề hề hề,

Sorry mọi người vì mình hiểu sai ý của bạn lp_hai trong câu:

Câu hỏi của e là khi mình xóa dt rồi thì làm sao để lisp hỏi chọn dt mớ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

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

Đăng nhập để thực hiện theo  

×