Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
huunhantvxdts

[yêu cầu] lisp truy xuất vào từng đối tượng con (theo tên tag) trong block thuộc tính

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

Mình đang viết lisp để cập nhật các cao độ vào block thuộc tính 

Block có nhiều tag bao gồm ( caodotk, caodotn, caododaycong, caododhga, lytrinh,.....)

Bây giờ mình muốn truy xuất vào 1 tag nào đó 

cách làm của mình thì cứ (entnext (entnext (entnext ......))) (mỏi cả tay ) cách này quá mất thời gian mà lại khó kiểm soát

bây giờ nhờ mọi người giúp (viết hàm con) cách nào truy xuất vào từng tag

cám ơn trước cái đã 

hehehehe

 

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ặng bạn 2 hàm Set và Get Attributes. Hy vọng bạn tự áp dụng được.

 

; Arguments [Type]:
; Obj = Object [VLA-OBJECT]
; Lst = Dotted pair list '(("Tag1" . "Val1")...) [list]
 
(defun SetAtts (Obj Lst / AttVal)
 (mapcar '(lambda (Att) (if (setq AttVal (cdr (assoc (vla-get-TagString Att) Lst))) (vla-put-TextString Att AttVal))) (vlax-invoke Obj 'GetAttributes))
 (vla-update Obj)
 
(defun GetAtts (Obj)
 (mapcar '(lambda (Att) (cons (vla-get-TagString Att) (vla-get-TextString Att))) (vlax-invoke Obj 'GetAttributes)))
 
  • 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

Tặng bạn 2 hàm Set và Get Attributes. Hy vọng bạn tự áp dụng được.

 

; Arguments [Type]:
; Obj = Object [VLA-OBJECT]
; Lst = Dotted pair list '(("Tag1" . "Val1")...) [list]
 
(defun SetAtts (Obj Lst / AttVal)
 (mapcar '(lambda (Att) (if (setq AttVal (cdr (assoc (vla-get-TagString Att) Lst))) (vla-put-TextString Att AttVal))) (vlax-invoke Obj 'GetAttributes))
 (vla-update Obj)
 
(defun GetAtts (Obj)
 (mapcar '(lambda (Att) (cons (vla-get-TagString Att) (vla-get-TextString Att))) (vlax-invoke Obj 'GetAttributes)))
 

Cám ơn Bác nhiều lắm đang lay hoay hoài mà chưa làm được. hi vọng là cái này đáp ứng được yêu cầu của tô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ặng bạn 2 hàm Set và Get Attributes. Hy vọng bạn tự áp dụng được.

 

; Arguments [Type]:
; Obj = Object [VLA-OBJECT]
; Lst = Dotted pair list '(("Tag1" . "Val1")...) [list]
 
(defun SetAtts (Obj Lst / AttVal)
 (mapcar '(lambda (Att) (if (setq AttVal (cdr (assoc (vla-get-TagString Att) Lst))) (vla-put-TextString Att AttVal))) (vlax-invoke Obj 'GetAttributes))
 (vla-update Obj)
 
(defun GetAtts (Obj)
 (mapcar '(lambda (Att) (cons (vla-get-TagString Att) (vla-get-TextString Att))) (vlax-invoke Obj 'GetAttributes)))
 

Cám ơn Bác nhiều lắm đang lay hoay hoài mà chưa làm được. hi vọng là cái này đáp ứng được yêu cầu của tôi

Hề hề hề,

Theo thiển ý của mình thì để truy xuất các thuộc tính của một bock, bạn có thễ sử dụng vòng lặp while với hàm entnext cho tới khi tag của att trùng với yêu cầu của bạn.

Sau đó sử lý thuộc tính này theo như ý bạn mong muốn.

đại khái vòng lặp này như sau:

(while (and ent (/= enttag "abcd")

      (setq ent (entnext ent))

      (setq enttag (cdr (assoc 2 (entget ent))))

)

ở đây chuỗi "abcd" là tên tag của thuộc tính mà bạn cần tìm. ent ban đầu là ename của block đang xét.

việc kiểm tra block có chứa thuộc tính hay không chắc bạn đã rành nên mìng nghĩ bạn có thể làm được việc này.

  • 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

 

Tặng bạn 2 hàm Set và Get Attributes. Hy vọng bạn tự áp dụng được.

 

; Arguments [Type]:
; Obj = Object [VLA-OBJECT]
; Lst = Dotted pair list '(("Tag1" . "Val1")...) [list]
 
(defun SetAtts (Obj Lst / AttVal)
 (mapcar '(lambda (Att) (if (setq AttVal (cdr (assoc (vla-get-TagString Att) Lst))) (vla-put-TextString Att AttVal))) (vlax-invoke Obj 'GetAttributes))
 (vla-update Obj)
 
(defun GetAtts (Obj)
 (mapcar '(lambda (Att) (cons (vla-get-TagString Att) (vla-get-TextString Att))) (vlax-invoke Obj 'GetAttributes)))
 

Đã sử dụng nhưng không được theo ý muốn. ở đây tôi muốn là

(setq ttin (GetAtts obj tentag))

lấy toàn bộ thông tin của tag đó

mong Bác sửa lại giùm

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

hề hề hề,

Theo thiển ý của mình thì để truy xuất các thuộc tính của một bock, bạn có thễ sử dụng vòng lặp while với hàm entnext cho tới khi tag của att trùng với yêu cầu của bạn.

Sau đó sử lý thuộc tính này theo như ý bạn mong muốn.

đại khái vòng lặp này như sau:

(while (and ent (/= enttag "abcd")

      (setq ent (entnext ent))

      (setq enttag (cdr (assoc 2 (entget ent))))

)

ở đây chuỗi "abcd" là tên tag của thuộc tính mà bạn cần tìm. ent ban đầu là ename của block đang xét.

việc kiểm tra block có chứa thuộc tính hay không chắc bạn đã rành nên mìng nghĩ bạn có thể làm được việc này.

 

Đúng như vậy đó 

Nhờ Bác viết luôn hàm con đó có được không???Bởi mình sử dụng nó nhiều lần

Cám ơn Bác nhiều

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

Hàm lấy và gán giá trị theo tên Tag của block Att :

(defun GetTagVal (obj tagName)
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (setq str (vla-get-TextString att) ) ) )
  str)
(defun ChangeTagVal (obj tagName val)
  (foreach att (vlax-invoke obj 'GetAttributes)
    (if (= tagName (vla-get-tagstring att))
      (progn
	(vla-put-textstring att val)
	(vla-update att)  ) ) ) )
  • 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

Nhân tiện topic này giúp mình cài tạo cái list như sau:

 

- đầu vào là block att có các số lượng và tên tag không cố định. VD: tag1, tga2, ....tagn

- đầu ra là list dạng (setq lst (list(cons tag1 "value1")(cons tag2 "value2")....(cons tagn "valuen")))

thanks

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

mình đã test hàm GetAtts chạy tốt. Tuy nhiên với text unicode tiếng Việt có dấu thì khi ghi text ra màn hình bị lỗi font. Nếu dùng thuần lisp thì không bị

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  

×