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

[Nhờ trợ giúp] LISP truy xuất thông tin đối tượng trong GROUP

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

Chào các bác!

Em đang nghiên cứu về cách tóm được thông tin các đối tượng trong GROUP.

Bình thường em đối với các đối tượng em dễ dàng truy xuất được các đối tượng với các Ename. Tuy nhiên, 1 đối tượng có quá nhiều Ename thì em chưa biết cách tóm được nó. Ví dụ đối với đối tượng dạng Group thì mã 330 rất nhiều. Vậy làm thế nào để em lấy được các Ename trong Group đó vậy?

Cảm ơn các bác đã quan tâm.

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

Cái mã 330 nằm trong cặp mã 102 là mã của group, bạn chọn tất cả đối tượng rồi lọc ra cái nào có cùng mã 330 đó là thuộc cùng 1 group.

(102 . {ACAD_REACTORS) (330 . <Entity name: 7ef03ae0>) (102 . })

(102 . 
{ACAD_REACTORS) (330 . <Entity name: 7ef03ae0>) (102 . })
  • 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

1 ví dụ:


(setq lst_ename (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 340)) (entget (caar (acet-txtexp-getgname (ssname (ssget) 0) (acet-txtexp-grplst)))))))

  • 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

 

Cái mã 330 nằm trong cặp mã 102 là mã của group, bạn chọn tất cả đối tượng rồi lọc ra cái nào có cùng mã 330 đó là thuộc cùng 1 group.

(102 . {ACAD_REACTORS) (330 . <Entity name: 7ef03ae0>) (102 . })

(102 . 
{ACAD_REACTORS) (330 . <Entity name: 7ef03ae0>) (102 . })

Anh có thể cho em 1 đoạn mã Code lấy các Ename 330 không anh? Vì Group có nhiều Ename quá. 

Sau khi tập hợp được các Ename mã 330 em sẽ  duyệt từng cái để xem nó là gì? Từ đó điều khiển 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

1 ví dụ:


(setq lst_ename (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 340)) (entget (caar (acet-txtexp-getgname (ssname (ssget) 0) (acet-txtexp-grplst)))))))

Nó ko hiểu cái này bác Hạ ạ

ACET-TXTEXP-GRPLST

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 đang nghiên cứu về các đối tượng Group nên cũng tìm được cách lấy tên của Group.

Có mã Code này rồi em sẽ tiếp tục tìm hiểu truy xuất theo tên Group.

(defun obtername_grupo (group_object / ent_name acad_reactors vlx_objetc); group_name
(setq ent_name (entget group_object))
(if (setq acad_reactors (member '(102 . "{ACAD_REACTORS") ent_name))
(while
(and
(setq acad_reactors (cdr acad_reactors))
(eq (caar acad_reactors) 330)
(eq (vla-get-ObjectName (setq vlx_objetc (vlax-ename->vla-object (cdar acad_reactors)))) "AcDbGroup")); end of and
(if (equal (cadr acad_reactors) '(102 . "}"))
(setq acad_reactors nil)); end of if
(setq group_name (vla-get-Name vlx_objetc))); end of while
); end of if
); end of defun obtername_grupo

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

Đây:


;HA: trich tu file "Txtexp.lst" trong folder Express.
; --------------------- GROUP LIST FUNCTION ----------------------
;EX: (setq lst_ename (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 340)) (entget (caar (acet-txtexp-getgname (ssname (ssget) 0) (acet-txtexp-grplst)))))))
;   This function will return a list of all the group names in the drawing and their entity names in the form:
;   ((<ename1> . <name1>) ... (<enamex> . <namex>))
(defun acet-txtexp-grplst (/ GRP ITM NAM ENT GLST)
 (setq GRP  (dictsearch (namedobjdict) "ACAD_GROUP"))
 (while (setq ITM (car GRP))       ; While edata item is available
  (if (= (car ITM) 3)             ; if the item is a group name
   (setq NAM (cdr ITM)           ; get the name
             GRP (cdr GRP)           ; shorten the edata
             ITM (car GRP)           ; get the next item
             ENT (cdr ITM)           ; which is the ename
             GRP (cdr GRP)           ; shorten the edata
             GLST                     ; store the ename and name
             (if GLST
              (append GLST (list (cons ENT NAM)))
              (list (cons ENT NAM))))
   (setq GRP (cdr GRP))))           ; else shorten the edata
 GLST)                               ; return the list
; ------------------- GET GROUP NAME FUNCTION --------------------
;   This function returns a list of all the group names in GLST where ENT is a member. The list has the same form as GLST.
  (defun acet-txtexp-getgname (ENT GLST / GRP GDATA NAM NLST)
    (if (and GLST (listp GLST))
      (progn
        (foreach GRP GLST
          (setq GDATA (entget (car GRP)))
          (foreach ITM GDATA                   ; step through the edata
            (if (and
                  (= (car ITM) 340)            ; if the item is a entity name
                  (eq (setq NAM (cdr ITM)) ENT) ; and the ename being looked for
                )
              (setq NLST                       ; store the ename and name
                      (if NLST
                        (append NLST (list (cons (car GRP) (cdr GRP))))
                        (list (cons (car GRP) (cdr GRP)))
                      )
              )
            )
          )
        )
      )
    )
    NLST
  )
 

  • 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

Bạn dùng cái này cũng được. Ở đây tôi không kiểm tra đối tượng có thuộc group hay không, tức là bạn phải biết chắc nó thuộc group nào đó (vì acad proxy cũng có mã 102 và 330).

 

(defun c:grm()
  (setq a (car (entsel "\nChon 1 doi tuong cua group:")))
  (if (assoc 102 (entget a))
    (progn
      (setq b (assoc 330 (entget a)))
      (vl-remove-if-not '(lambda(x) (member b (entget x)))
 (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "X"))))))
  )
)
  • 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

Tuyệt vời rồi bác.

 

Bạn dùng cái này cũng được. Ở đây tôi không kiểm tra đối tượng có thuộc group hay không, tức là bạn phải biết chắc nó thuộc group nào đó (vì acad proxy cũng có mã 102 và 330).

 

(defun c:grm()
  (setq a (car (entsel "\nChon 1 doi tuong cua group:")))
  (if (assoc 102 (entget a))
    (progn
      (setq b (assoc 330 (entget a)))
      (vl-remove-if-not '(lambda(x) (member b (entget x)))
 (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "X"))))))
  )
)

Để em test nốt cái bác Hạ xem đã ạ

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ả 2 đều tuyệt bác ạ.

Cảm ơn 2 bác nhiều lắm. 

Chẳng mấy chốc học mót của 2 bác mà em hoàn thành được sản phẩm của mình.Hii 

:wub:

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

×