Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
7 replies to this topic

#1 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 31 October 2011 - 03:17 PM

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à.
  • 0
Hình đã gửi

#2 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 31 October 2011 - 03:38 PM

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 ạ
  • 1

#3 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 31 October 2011 - 03:49 PM

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ề,..
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#4 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 31 October 2011 - 04:00 PM

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

#5 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 31 October 2011 - 04:10 PM

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à.
  • 0
Hình đã gửi

#6 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 31 October 2011 - 04:19 PM

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

  • 2

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


#7 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 31 October 2011 - 04:20 PM

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

#8 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 31 October 2011 - 04:29 PM

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??
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.