Đến nội dung


Hình ảnh
- - - - -

[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


  • Please log in to reply
12 replies to this topic

#1 huunhantvxdts

huunhantvxdts

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 366 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 30 December 2013 - 11:19 AM

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

 


  • 0

#2 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 30 December 2013 - 11:44 AM

Tôi ko rành lisp lắm. Nhưng với VBA tôi làm như sau:

duyet qua tung thuoc tinh va dung select case


  • 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 30 December 2013 - 12:07 PM

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

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

huunhantvxdts

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 366 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 30 December 2013 - 01:41 PM

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


  • 0

#5 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 30 December 2013 - 02:30 PM

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.


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

#6 huunhantvxdts

huunhantvxdts

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 366 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 30 December 2013 - 02:35 PM

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


  • 0

#7 huunhantvxdts

huunhantvxdts

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 366 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 30 December 2013 - 02:38 PM

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


  • 0

#8 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 30 December 2013 - 02:56 PM

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

  • 1

#9 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 30 December 2013 - 03:45 PM

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


  • 0

#10 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 30 December 2013 - 03:55 PM

Hàm GetAtts ở bài #3 đó bạn.


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


#11 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 30 December 2013 - 04:21 PM

thanks.

mình down về rồi nhưng ko có thgian test, nhân tiện đọc bài này thì yêu cầu luôn ^^


  • 0

#12 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 31 December 2013 - 05:00 PM

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ị


  • 0

#13 phuong44e1

phuong44e1

    Edu level: li4

  • Members
  • PipPip
  • 63 Bài viết
Điểm đánh giá: -2 (bình thường)

Đã gửi 11 June 2014 - 12:10 AM

Cảm ơn bài viết rất nhiều. Nhờ bài viết mà mình đã làm dc lisp của mình. Mình muốn bình chọn mà ko biết làm nhw thế  nào


  • 0