Đến nội dung


Hình ảnh
- - - - -

[request] Gán nhanh giá trị trong Dynamic Block sang Block Att


  • Please log in to reply
13 replies to this topic

#1 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 411 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 05 November 2014 - 05:19 PM

Chào các bạn!

Mình đã tìm trên Cv và GG nhưng chưa có chỗ nào đề cập đến vấn đề này, mình nhờ các bạn làm giúp lisp có nội dung sau:

 

- Mình có 1 DynamicBlock và 1 AttBlock, mình muốn gán 1 giá trị bất kỳ(do mình chọn) của DynamicBlock qua 1 att bất kỳ(Do mình chọn) trong AttBlock và giá trị đó để dưới dạng Field, để sau này có thay đổi DynamicBlock thì AttBlock cũng tự động thay đổi giá trị

 

 

 

Mô tả lisp như file bên dưới

http://www.cadviet.c...9_gangiatri.dwg

 

Thanks so much!


  • 0

#2 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 05 November 2014 - 08:09 PM

Cái dynamic có 2 giá trị distance nhưng trong att block chỉ có 1 cái dim1, vậy gán giá trị nào?


  • 1

#3 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 411 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 05 November 2014 - 09:24 PM

Có lúc cần chọn giá trị của Distance1, có lúc lại chọn giá trị của Distance2 để gán cho Dim1, vậy Tot77 có thể làm cách nào hiện thông báo để người dùng chủ động trong việc lựa chọn giá trị Dítance gán cho Dim1 được không?
  • 0

#4 vudong081186

vudong081186

    biết pan

  • Members
  • Pip
  • 5 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 05 November 2014 - 09:36 PM

Mình đã làm mọi cách mà không biết cách viết bài lên trang cadviet này, quá khổ. Chỉ biết nhờ topic bạn này nhờ các bac pro viết cho cái hatch như này, mình xin chân thành cảm ơn!!!

http://www.mediafire...o1/untitled.bmp


  • 0

#5 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 05 November 2014 - 10:19 PM

Có lúc cần chọn giá trị của Distance1, có lúc lại chọn giá trị của Distance2 để gán cho Dim1, vậy Tot77 có thể làm cách nào hiện thông báo để người dùng chủ động trong việc lựa chọn giá trị Dítance gán cho Dim1 được không?

Tôi nghĩ có thể nhấp vào cạnh nào nó sẽ chọn cạnh đó để copy giá tri.
Như g nếu nó là line thì dễ hơn pline.
  • 1

#6 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 411 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 06 November 2014 - 08:18 AM

Thanks Tot77, mình đã chỉnh lại block Dynamic thành line rồi

http://www.cadviet.c...gangiatri_1.dwg


  • 0

#7 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 06 November 2014 - 11:15 AM

Cái này mình đã thấy bạn làm từ CAD đã dùng Field -> Link giá trị của distance trong Block Dynamic -> sang Att rồi mà


  • 0

#8 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 411 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 06 November 2014 - 11:42 AM

@Tue_NV, nếu chỉ có 1 vài cái làm thủ công thì không nói, nhưng đằng này lại nhiều block như thế nên mình mới post lên :) chứ ko phải lười gì!


  • 0

#9 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 06 November 2014 - 02:08 PM

Bạn thử cái này. Nhưng có 1 điều cần chú ý là cái dyn block phải là "đã qua sử dụng", tức là sau khi insert nó thì bạn phải kéo tới kéo lui nó thì nó mới tạo 1 cái block mới với các entities mới chứ không còn là của block gốc nữa.

Nhấp chọn tại cái cạnh nào muốn copy giá trị, rồi nhấp vào cái att (ở đây là DIM1).

(defun c:ggt (/  pl att )  
  (setq pl  (car (nentsel "\nChon Dynamic block theo vi tri de lay gia tri :"))
   att (car (nentsel "\nChon Attribute de gan gia tri :" ))
  )
  (princ (cdr (assoc 2 (entget att)))) (setvar 'cmdecho 0)
  (vla-put-TextString (vlax-ename->vla-object att)
    (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID (vlax-ename->vla-object pl))) ">%).Length \\f \"%lu2%pr0>%"))
  (vl-cmdf "regen") (setvar 'cmdecho 1) (princ)
)

  • 1

#10 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 411 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 06 November 2014 - 03:24 PM

@Tot77, Sau khi gán giá trị, copy cái Dynamic ra thêm 1 đối tượng nữa thì cái giá trị của Att nó lại thay đổi theo cái đối tượng Dynamic mới được copy thêm chứ không thay đổi theo cái Dynamic đầu tiên.


  • 0

#11 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 06 November 2014 - 03:39 PM

3 cái dyn block trong file của bạn có cùng 1 tên là *U8, có lẽ do bạn copy từ 1 cái mà ra.

Sở dĩ bảo bạn phải kéo tới kéo lui là để đổi tên block cho nó là duy nhất, k có 2 cái trùng tên, vì trùng tên thì nó cứ theo 1 cái nào đó nó làm thôi. Như bạn nói thì nó theo cái mới chứ không theo cái cũ.

Tôi cũng chưa biết cách khắc phục cái vụ tên này của dyn block.

Bạn chịu khó khi copy ra thì lại đổi tên và ggt nó 1 lần nữa.


  • 1

#12 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 06 November 2014 - 04:22 PM

Cái này mình nghĩ nên Link theo distance (Parameter) trong Block dynamic

Code của bác Tot đang link theo Length của Line trong Block Dynamic


  • 1

#13 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 06 November 2014 - 05:49 PM

Bạn thử cái này xem.

 

(defun c:ggt (/ att cdyn ndyn dyn len as num)  
  (setq cdyn  (car (setq ndyn (nentsel "\nChon Dynamic block theo vi tri de lay gia tri :")))
dyn (car (last ndyn))
len (vla-get-Length (vlax-ename->vla-object cdyn))
   att (car (nentsel "\nChon Attribute de gan gia tri :" ))
l   (mapcar '(lambda (x) (cons (vla-get-propertyname x) (vlax-get x 'value)))
              (vlax-invoke (vlax-ename->vla-object dyn) 'GetDynamicBlockProperties))
as  (caar (vl-remove-if-not '(lambda (x) (= len (cdr x))) l))
num (if (= as "Distance1") "1" "8")
  )
  
  (princ (cdr (assoc 2 (entget att))))
  (setvar 'cmdecho 0)
  (vla-put-TextString (vlax-ename->vla-object att)
    (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID (vlax-ename->vla-object dyn)))
   ">%).Parameter(" num ").UpdatedDistance \\f \"%lu6%pr0>%"))
  (vl-cmdf "regen")
  (setvar 'cmdecho 1) (princ)
)

  • 1

#14 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 411 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 07 November 2014 - 08:44 AM

Cảm ơn Tot77 nhiều nhé!


  • 0