Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
11 replies to this topic

#1 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 26 July 2014 - 09:00 AM

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.c.../36665_vidu.dwg


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#2 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 26 July 2014 - 10:23 AM

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

  • 1

#3 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 26 July 2014 - 10:45 AM

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


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#4 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 26 July 2014 - 10:47 AM

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


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#5 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 26 July 2014 - 10:48 AM

Vừa post 1 ví dụ xong.


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#6 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 26 July 2014 - 10:49 AM

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


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#7 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 26 July 2014 - 10:52 AM

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

  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#8 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 26 July 2014 - 10:53 AM

Có lẽ dựa vào mã Code trên em sẽ gắng tìm. Hiii.

Nếu dc các bác chỉ cho thì hay ạ


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#9 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 26 July 2014 - 11:04 AM

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


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#10 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 26 July 2014 - 11:13 AM

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

  • 2

#11 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 26 July 2014 - 11:19 AM

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 đã ạ


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#12 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 26 July 2014 - 11:22 AM

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:


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn