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

LISP : Ánh xạ giá trị đối tượng (thay đổi giá trị nguồn -> Đích cập nhật theo)

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

Chào các bạn

Nhân đọc bài Ánh xạ giá trị đối tượng text, nguồn đổi giá trị, đích bị sửa của bác Hoành,

xin gửi các bạn LISP : Ánh xạ giá trị đối tượng gồm

1 . LinkT : Ánh xạ giá trị Text

2 . LinkA : Ánh xạ giá trị Diện tích

chú ý : khi sửa giá trị ở đối tượng nguồn, đối tượng đích (text) chỉ update sau khi sử dụng lệnh REGEN, SAVE, PLOT, ...

(defun c:LinkT (/ ss_ent ent ss e cmd);Link Text
 (if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
   (progn
     (vl-load-com)
     (command "_.undo" "_begin")
     (setq cmd (getvar "cmdecho"))
     (setvar "cmdecho" 0)
     (and (princ "\nChon Text goc : ")
   (setq ss_ent (ssget "_:S:E" '((0 . "TEXT"))) )
   (setq ent (vlax-ename->vla-object (ssname ss_ent 0)))
   (princ "\nChon Text can Link gia tri tu Text goc : ")
   (setq ss (ssget (list (cons 0 "TEXT")) ))
   (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
     (vla-put-TextString
       (vlax-ename->vla-object e)
       (strcat"%<\\AcObjProp Object(%<\\_ObjId "(vl-princ-to-string (vla-get-ObjectId ent)) ">%).TextString >%")
       )
     )
   )
     (setvar "cmdecho" cmd)
     (command "_.undo" "_end")(princ)
     )
   (alert "\nChi chay tren Autocad 2006-2010")
   )
 )

(defun c:LinkA (/ ss_ent ent ss e cmd sole tile Suff Pref);Link Area
 (if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
   (progn
     (vl-load-com)
     (command "_.undo" "_begin")
     (setq cmd (getvar "cmdecho"))
     (setvar "cmdecho" 0)
     (and (princ "\nChon doi tuong lay Dien tich : ")
   (setq ss_ent (ssget "_:S:E" '((0 . "*POLYLINE,ARC,SPLINE,ELLIPSE,CIRCLE"))) )
   (setq ent (vlax-ename->vla-object (ssname ss_ent 0)))
   (princ "\nChon Text can Link gia tri Dien tich : ")
   (setq ss (ssget (list (cons 0 "TEXT")) ))
   (setq sole (getvar "Luprec"));so le
   (setq tile 1);ti le
   (setq Pref "S=")
   (setq Suff " mm2")
   (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
     (vla-put-TextString
       (vlax-ename->vla-object e)
       (strcat "%<\\AcObjProp Object(%<\\_ObjId "
	       (vl-princ-to-string (vla-get-ObjectId ent) )
	       ">%).Area \\f \"%lu2%ps[" Pref "," Suff "]%pr" (itoa sole) "%ct8[" (vl-princ-to-string tile) "]\">%"
	       )
       )
     )
   )
     (setvar "cmdecho" cmd)
     (command "_.undo" "_end")(princ)
     )
   (alert "\nChi chay tren Autocad 2006-2010")
   )
 )

  • Vote tăng 11

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
Chào các bạn

Nhân đọc bài Ánh xạ giá trị đối tượng text, nguồn đổi giá trị, đích bị sửa của bác Hoành,

xin gửi các bạn LISP : Ánh xạ giá trị đối tượng gồm

1 . LinkT : Ánh xạ giá trị Text

2 . LinkA : Ánh xạ giá trị Diện tích

chú ý : khi sửa giá trị ở đối tượng nguồn, đối tượng đích (text) chỉ update sau khi sử dụng lệnh REGEN, SAVE, PLOT, ...

Cám ơn, rất hay. Bạn có thể nghiên cứu sao cho đối tượng đích cập nhật ngay sau khi đối tượng nguồn thay đổi thì rất tuyệt

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ám ơn, rất hay. Bạn có thể nghiên cứu sao cho đối tượng đích cập nhật ngay sau khi đối tượng nguồn thay đổi thì rất tuyệt

Cái này khó đấy bác ạ. Nhiệm vụ của lisp chỉ là tạo liên kết giữa 2 đối tượng còn sau đó nó thay đổi như thế nào không nằm trong phạm vi ảnh hưởng của lisp nữa.

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 này khó đấy bác ạ. Nhiệm vụ của lisp chỉ là tạo liên kết giữa 2 đối tượng còn sau đó nó thay đổi như thế nào không nằm trong phạm vi ảnh hưởng của lisp nữa.

Mình thấy trong Visual Lisp có chủ đề REACTOR. Hình như chủ đề này có liên quan đến vấn đề đang bàn. Kg biết có bạn nào ứng dụng chưa thì cho ý kiến. Mình chưa có thời gian nghiên cứu vấn đề này nên kg biết nó có làm đc như ý trên kg

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 thấy trong Visual Lisp có chủ đề REACTOR. Hình như chủ đề này có liên quan đến vấn đề đang bàn. Kg biết có bạn nào ứng dụng chưa thì cho ý kiến. Mình chưa có thời gian nghiên cứu vấn đề này nên kg biết nó có làm đc như ý trên kg

Đúng là REACTOR có thể làm đuợc vấn đề này : cập nhật đối tượng đích ngay sau khi đối tượng nguồn thay đổi.

Nhưng việc sử dụng REACTOR tốn rất nhiều công sức đầu vào (tuơng tự như trong CƠ SỞ DỮ LIỆU để có thể truy xuất đuợc dữ liệu, phải có Database và việc bỏ thời gian (đồng nghĩa với tiền bạc) để nhập Database có lẽ bạn biết rồ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
Đúng là REACTOR có thể làm đuợc vấn đề này : cập nhật đối tượng đích ngay sau khi đối tượng nguồn thay đổi.

Nhưng việc sử dụng REACTOR tốn rất nhiều công sức đầu vào (tuơng tự như trong CƠ SỞ DỮ LIỆU để có thể truy xuất đuợc dữ liệu, phải có Database và việc bỏ thời gian (đồng nghĩa với tiền bạc) để nhập Database có lẽ bạn biết rồi ...)

Mình nghĩ kg tốn nhiều công sức như bạn nghĩ đâu, có điều nó chưa thật sự hấp dẫn hoặc công việc của bạn chưa cần đến. Mình đọc qua các bài viết của bạn thấy bạn vận dụng Visual Lisp rất linh hoạt và thành thạo. Bản thân mình kg rành Visual Lisp và công việc khá bận rộn nên chưa nghiên cứu VL và REACTOR, nếu trước đây mình biết đến REACTOR thì đã vận dụng vào công việc rồi. Hiện nay mình vẫn phải cập nhật đối tựợng đích thông qua 1 lệnh chứ chưa tự động, mình thấy nó là một đột phá của Lisp, rất hay. Nhưng kg rõ khi dùng với rất nhiều đối tượng nguồn và đích thì có ảnh hưởng đến tốc độ kg.

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ều nó chưa thật sự hấp dẫn hoặc công việc của bạn chưa cần đến.

............................

Bạn tham khảo 1 ví dụ về REACTOR :

- Cập nhật bán kính (đuờng kính) vòng tròn khi có sự thay đổi bán kính (đuờng kính) của bất kỳ đối tuợng vòng tròn đã chọn.

đối tượng đích cập nhật ngay sau khi đối tượng nguồn thay đổi không cần lệnh Regen, ...

Cách sử dụng :

1. sau khi load Lisp, tại dấu nhắc gõ lệnh LinkR -> chọn các vòng tròn cần Link với nhau -> enter kết thúc lệnh.

2. thay đổi bán kính (đuờng kính) của bất kỳ đối tuợng vòng tròn đã chọn ở buớc 1 -> xem kết quả các vòng tròn còn lại trong tập hợp đã chọn ở buớc 1.

 

(defun c:LinkR (/ ss objlst obj_reactor); Link Radius
 (if (setq ss (ssget  '((0 . "CIRCLE"))) )
   (progn
     (vl-load-com)
     (setq objlst (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))
     (setq obj_reactor (vlr-object-reactor  objlst  nil '((:vlr-modified . callback))))
     )
   )
 )
(defun callback (notifier-object obj_reactor parameter-list  / objlist newrad)
 (setq objlist (vlr-owners obj_reactor))
 (setq newrad (vla-get-radius notifier-object))
 (if
   (= notifier-object (nth 0 objlist))
   (vla-put-radius (nth 1 objlist) newrad)
   (vla-put-radius (nth 0 objlist) newrad)
   )
 )

  • Vote tăng 3

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 tham khảo 1 ví dụ về REACTOR :

Cám ơn bạn, mình biết là bạn rất nhanh về Visual Lisp. Bạn đã giải tỏa kg chỉ cho mình mà cho nhiều bạn trên diễn đàn, hiện nay mình chưa thạo VL nên cũng chưa trao đổi đc với bạn. Có lẽ từ đây sẽ có nhiều bạn quan tâm đến vấn đề này và phát triển nó cho công việc của mình và sẽ cần bạn hỗ trợ đấy .

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 tham khảo 1 ví dụ về REACTOR :

- Cập nhật bán kính (đuờng kính) vòng tròn khi có sự thay đổi bán kính (đuờng kính) của bất kỳ đối tuợng vòng tròn đã chọn.

đối tượng đích cập nhật ngay sau khi đối tượng nguồn thay đổi không cần lệnh Regen, ...

Cách sử dụng :

1. sau khi load Lisp, tại dấu nhắc gõ lệnh LinkR -> chọn các vòng tròn cần Link với nhau -> enter kết thúc lệnh.

2. thay đổi bán kính (đuờng kính) của bất kỳ đối tuợng vòng tròn đã chọn ở buớc 1 -> xem kết quả các vòng tròn còn lại trong tập hợp đã chọn ở buớc 1.

 

(defun c:LinkR (/ ss objlst obj_reactor); Link Radius
 (if (setq ss (ssget  '((0 . "CIRCLE"))) )
   (progn
     (vl-load-com)
     (setq objlst (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))
     (setq obj_reactor (vlr-object-reactor  objlst  nil '((:vlr-modified . callback))))
     )
   )
 )
(defun callback (notifier-object obj_reactor parameter-list  / objlist newrad)
 (setq objlist (vlr-owners obj_reactor))
 (setq newrad (vla-get-radius notifier-object))
 (if
   (= notifier-object (nth 0 objlist))
   (vla-put-radius (nth 1 objlist) newrad)
   (vla-put-radius (nth 0 objlist) newrad)
   )
 )

Gia_bach, cảm ơn bạn. Đúng là gãi đúng chỗ ngứa. Thiep đang định hỏi mấy cái Reator và callback có công dụng gì mà có tới hàng chục cái lận chứ ít gì.

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
Gia_bach, cảm ơn bạn. Đúng là gãi đúng chỗ ngứa. Thiep đang định hỏi mấy cái Reator và callback có công dụng gì mà có tới hàng chục cái lận chứ ít gì.

Cái này hay đấy, đáng tiếc là chỉ sử dụng được có 1 lần. Nếu copy 1 vòng tròn nữa sang bên cạnh, hoặc cả bộ đi nơi khác thì mất REACTOR. Chắc phải có cách gi` để khi liên kết rồi thì phải dùng được để insert sang nơi khác được chứ.

 

Bản chất của REACTOR là khi thay đổi 1 tính chất đã được gắn reactor của đối tượng đã được chỉ định (VD: thay bán kính của đường tròn; edit text...) thì tính chất của các đối tượng đi kèm đã được chỉ định sẽ tự động điều chỉnh theo hàm callback. Việc gắn reactor thông qua lisp, nhưng sử dụng thì không cần phải dùng lại lisp đó nữa, kết quả thay đổi tức thì và hiển nhiên như kiểu chuyển ô trong Excel

 

 

Thử nghiệm:

Tạo 1 block có 3 vòng tròn , dùng lệnh LINKR để liên kết reactor trong lúc edit block, kết quả là có sử dụng được reactor. Các vòng tròn tự điều chỉnh bán kính khi 1 vòng tròn bị thay đổi bán kính.

Đến lúc close block, vào lại block để edit thì tan tành reactor.

 

Kết luận:

Reactor chỉ liên kết những entity đã xác định thông qua ename.

Mất reactor của nhóm đối tượng được sao chép.

Có thể dùng được cho việc làm phép tính trong CAD , cập nhật ngày tháng.

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

Chào anh gia_bach và mọi người!

Ai đã sử dụng lisp này cho em hỏi: Tại sao các text của em đều bị một lớp màu trắng sữa phủ lên mà regen bản vẽ hay tắt đi mở lại đều không làm mất đi được.

Cảm ơn!

linkt.jpg

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
Chào anh gia_bach và mọi người!

Ai đã sử dụng lisp này cho em hỏi: Tại sao các text của em đều bị một lớp màu trắng sữa phủ lên mà regen bản vẽ hay tắt đi mở lại đều không làm mất đi được.

Cảm ơn!

linkt.jpg

Bạn khởi động Cad, vào Options -> User Preferences -> fields. Bỏ chọn vào ô Display background of fields -> OK.

  • 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
Chào anh gia_bach và mọi người!

Ai đã sử dụng lisp này cho em hỏi: Tại sao các text của em đều bị một lớp màu trắng sữa phủ lên mà regen bản vẽ hay tắt đi mở lại đều không làm mất đi được.

...........

Chào svba1608 , HoangSon614

Đúng là Bạn có thể gõ lệnh FIELDDISPLAY hoặc vào OPTION để tắt lớp màu trắng sữa phủ lên đối tượng, nhưng theo tui chúng ta nên để theo mặc định là bật nét tô màu (trắng) của đối tượng đích để phân biệt giữa đối tượng nguồn và đối tượng đích.

Lớp màu nển (background color) chỉ hiển thị trong CAD, không ảnh huởng gì khi in (PLOT) bản vẽ.

  • 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
Chào svba1608 , HoangSon614

Đúng là Bạn có thể gõ lệnh FIELDDISPLAY hoặc vào OPTION để tắt lớp màu trắng sữa phủ lên đối tượng, nhưng theo tui chúng ta nên để theo mặc định là bật nét tô màu (trắng) của đối tượng đích để phân biệt giữa đối tượng nguồn và đối tượng đích.

Lớp màu nển (background color) chỉ hiển thị trong CAD, không ảnh huởng gì khi in (PLOT) bản vẽ.

tuy nhiên cái màu nền này nó quá sáng làm cho việc quan sát kết quả không rõ ràng. Nếu có thể đổi màu nền mặc định được thì tốt. Còn không thì đôi khi vẫn phải tắt hoặc bật nền để tiện quan sát

  • 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

Anh gia_bach và mọi người có thể phát triển lisp này thêm được không?

Cụ thể là: Ánh xạ giá trị đối tượng text - Nguồn thay đổi - Đích thay đổi theo.

Ví dụ:

+ Text nguồn: 3.1

+ Text đích: 3.2,3.4,3.5,3.6 ....

Khi thay đổi text nguồn thành 3.2, các text đích sẽ thay đổi thành: 3.3,3.4,3.5,3.6 ...

 

Hay là:

+ Text nguồn: 3.1

+ Text đích: bất kỳ...

Khi thay đổi text nguồn thành 3.2, các text đích sẽ lần lượt thay đổi thành 3.3,3.4,3.5,3.6... theo thứ tự lựa chọn của chuột khi chọn text đích.

 

Cảm ơn!

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
Anh gia_bach và mọi người có thể phát triển lisp này thêm được không?

Cụ thể là: Ánh xạ giá trị đối tượng text - Nguồn thay đổi - Đích thay đổi theo.

Ví dụ:

+ Text nguồn: 3.1

+ Text đích: 3.2,3.4,3.5,3.6 ....

Khi thay đổi text nguồn thành 3.2, các text đích sẽ thay đổi thành: 3.3,3.4,3.5,3.6 ...

Tue_NV phát biểu lại bài toán trên, svba xem có đúng không nhé :

Cho 1 tập hợp text T= { X1, X2, X3, ....., Xn }

 

Thay đổi 1 phần tử Text ví dụ phần tử X2 -> thành X2'

Gọi số D = X2' - X2

( D

( D > 0 khi X2' > X2 )

Vậy thì tập hợp Text T trở thành :

T= { X1+D, X2+D, X3+D, ....., Xn+D }

 

Svba xem có đúng ý của em không?

  • 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
Tue_NV phát biểu lại bài toán trên, svba xem có đúng không nhé :

Cho 1 tập hợp text T= { X1, X2, X3, ....., Xn }

 

Thay đổi 1 phần tử Text ví dụ phần tử X2 -> thành X2'

Gọi số D = X2' - X2

( D

( D > 0 khi X2' > X2 )

Vậy thì tập hợp Text T trở thành :

T= { X1+D, X2+D, X3+D, ....., Xn+D }

 

Svba xem có đúng ý của em không?

Vâng, cảm ơn anh Tue_NV. Bài toán tổng quát này chính là ý của em.

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
Tue_NV phát biểu lại bài toán trên, svba xem có đúng không nhé :

Cho 1 tập hợp text T= { X1, X2, X3, ....., Xn }

 

Thay đổi 1 phần tử Text ví dụ phần tử X2 -> thành X2'

Gọi số D = X2' - X2

( D

( D > 0 khi X2' > X2 )

Vậy thì tập hợp Text T trở thành :

T= { X1+D, X2+D, X3+D, ....., Xn+D }

 

Svba xem có đúng ý của em không?

Nếu đúng như vậy thì em hãy sử dụng Lisp này

Khi sử dụng Lisp này thì yêu cầu tập hợp text của T= { X1, X2, X3, ....., Xn } phải nằm trong 1 Group

tức là các đối tượng X1, X2, X3, ....., Xn thuộc 1 group -> X1, X2, X3, ....., Xn là các Text được thành lập bởi lệnh Group

và CAD phải ở chế độ hiển thị Group ON

Sử dụng Code sau. Hy vọng bạn hài lòng

(defun c:Lchu(/ e p socu somoi D ss i ent)
(setq e (entsel "\n Chon Text nguon trong Group can chinh sua :"))
(setq p (cadr e) dt (car e))
(setq socu (atof (cdr(assoc 1 (entget dt)))))
(setq somoi (getreal (strcat "\n Nhap so moi  :")))
(setq D (- somoi socu))
(setq ss (ssget p) i 0)

(if (not tpo) (setq tpo 0))
(setq tp (getint (strcat "\n So chu so thap phan  :")))
(if (not tp) (setq tp tpo) (setq tpo tp))

(while ( (setq ent (entget (ssname ss i)))
(if (distof (cdr(assoc 1 ent)))
(progn
  (setq so (+ (atof (cdr(assoc 1 ent))) D))
  (setq ent (entmod (subst (cons 1 (rtos so 2 tp)) (assoc 1 ent) ent)))
)
)
(setq i (1+ i))
)
(princ)
)

  • Vote tăng 3

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
Nếu đúng như vậy thì em hãy sử dụng Lisp này

Khi sử dụng Lisp này thì yêu cầu tập hợp text của T= { X1, X2, X3, ....., Xn } phải nằm trong 1 Group

tức là các đối tượng X1, X2, X3, ....., Xn thuộc 1 group -> X1, X2, X3, ....., Xn là các Text được thành lập bởi lệnh Group

và CAD phải ở chế độ hiển thị Group ON

..................

Chào Tue_NV

Lâu rồi trên lập trình AutoLisp của CadViet mới có ý tuởng mới : sử dụng Group để lọc và chọn đối tuợng.

Đi theo đuờng mòn hoài khó tới đích quá!

Cám ơn bạn nhiều.

  • 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
Chào các bạn

Nhân đọc bài Ánh xạ giá trị đối tượng text, nguồn đổi giá trị, đích bị sửa của bác Hoành,

xin gửi các bạn LISP : Ánh xạ giá trị đối tượng gồm

1 . LinkT : Ánh xạ giá trị Text

2 . LinkA : Ánh xạ giá trị Diện tích

chú ý : khi sửa giá trị ở đối tượng nguồn, đối tượng đích (text) chỉ update sau khi sử dụng lệnh REGEN, SAVE, PLOT, ...

(defun c:LinkA (/ ss_ent ent ss e cmd sole tile Suff Pref);Link Area

-----

(setq Pref "S=")

(setq Suff " mm2")

------

 

có thể thêm Pref và Suff vào chuổi đích vậy có cách nào chỉ lấy ra một đoạn chuổi nguồn không?

ví dụ

nguồn: 15 dia8 a=20

đích thứ nhất lấy số lượng 15

đích thứ hai lấy đường kính 8

đích thứ ba lấy khoảng cách 20

 

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
Chào Tue_NV

Lâu rồi trên lập trình AutoLisp của CadViet mới có ý tuởng mới : sử dụng Group để lọc và chọn đối tuợng.

Đi theo đuờng mòn hoài khó tới đích quá!

Cám ơn bạn nhiều.

Cảm ơn anh gia_bach

Đúng là đi theo đuờng mòn hoài khó tới đích. Thật sự là Tue_NV cũng thấy thế và từ khi đọc các bài viết của anh trong topic này, Tue_NV cảm thấy Lisp đã làm nhiều công việc thực sự rất hiệu quả, đặc biệt là REACTOR

Anh gia_bach cho Tue_NV hỏi về Lisp LinkR của anh trong topic này :

Bạn tham khảo 1 ví dụ về REACTOR :

- Cập nhật bán kính (đuờng kính) vòng tròn khi có sự thay đổi bán kính (đuờng kính) của bất kỳ đối tuợng vòng tròn đã chọn.

đối tượng đích cập nhật ngay sau khi đối tượng nguồn thay đổi không cần lệnh Regen, ...

Cách sử dụng :

1. sau khi load Lisp, tại dấu nhắc gõ lệnh LinkR -> chọn các vòng tròn cần Link với nhau -> enter kết thúc lệnh.

2. thay đổi bán kính (đuờng kính) của bất kỳ đối tuợng vòng tròn đã chọn ở buớc 1 -> xem kết quả các vòng tròn còn lại trong tập hợp đã chọn ở buớc 1.

 

(defun c:LinkR (/ ss objlst obj_reactor); Link Radius
 (if (setq ss (ssget  '((0 . "CIRCLE"))) )
   (progn
     (vl-load-com)
     (setq objlst (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))
     (setq obj_reactor (vlr-object-reactor  objlst  nil '((:vlr-modified . callback))))
     )
   )
 )
(defun callback (notifier-object obj_reactor parameter-list  / objlist newrad)
 (setq objlist (vlr-owners obj_reactor))
 (setq newrad (vla-get-radius notifier-object))
 (if
   (= notifier-object (nth 0 objlist))
   (vla-put-radius (nth 1 objlist) newrad)
   (vla-put-radius (nth 0 objlist) newrad)
   )
 )

 

Tue_NV đã sử dụng Lisp này và nhận thấy : sau khi sử dụng Lisp và hiệu chỉnh bán kính đường tròn bằng Grips thì thấy có 1 số đường tròn thay đổi theo, 1 số đường tròn không chịu thay đổi theo. Tue_NV không hiểu nguyên nhân làm sao? Anh giải thích dùm em tí nhé.

Đây là file mà Tue_NV chạy thử với lisp LINKR : LinkR.dwg

Cảm ơn anh gia_bach

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

Tue_NV đã sử dụng Lisp này và nhận thấy : sau khi sử dụng Lisp và hiệu chỉnh bán kính đường tròn bằng Grips thì thấy có 1 số đường tròn thay đổi theo, 1 số đường tròn không chịu thay đổi theo.

..................

Chào Tue_NV

Lisp LINKR bị lỗi như Tue_NV đã phát hiện.

(sau khi Post Lisp LINKR lên diễn đàn vài ngày tui cũng đã phát hiện lỗi này, nhưng chờ mãi không thấy ai có ý kiến phản hồi. "No Table")

Gửi Tue_NV Lisp đã fix lỗi. Tue_NV test lại dùm, cám ơn nhiều.

(defun c:LinkR (/ ss objlst obj_reactor); Link Radius
 (if (setq ss (ssget  '((0 . "CIRCLE"))) )
   (progn
     (vl-load-com)
     (setq objlst (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))
     (setq obj_reactor (vlr-object-reactor  objlst  nil '((:vlr-modified . callback))))
     )
   )
 )
(defun callback (notifier-object obj_reactor parameter-list / objlist newrad)
 (setq objlist (vlr-owners obj_reactor))
 (setq newrad (vla-get-radius notifier-object))
 (foreach obj objlist
   (if (/= (vla-get-radius obj)newrad)
     (vla-put-radius obj newrad)
     )
   )
 )

  • Vote tăng 4

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ó thể thêm Pref và Suff vào chuổi đích vậy có cách nào chỉ lấy ra một đoạn chuổi nguồn không?

ví dụ

nguồn: 15 dia8 a=20

đích thứ nhất lấy số lượng 15

đích thứ hai lấy đường kính 8

đích thứ ba lấy khoảng cách 20

Chào master_worse

Rất tiếc là lệnh FIELD trong CAD chưa cho phép làm điều này.

 

Khi đóng bản vẽ thì sự liên kết này cũng mất đi luôn, vậy có cách nào để không làm mất sự liên kết này không?
Gửi bạn LISP link text đã cập nhật phần liên kết sau khi đóng bản vẽ .

chú ý : để liên kết đuợc thưc hiện, list phải đuợc Appload truớc khi sử dụng (đưa list vào mục Startup Suite)

(defun c:LinkT (/ ss objlst ); Link Text
 (if (setq ss (ssget  '((0 . "TEXT"))) )	
   (progn
     (vl-load-com)
     (setq objlst (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))
     (if (and obj_reactor (vlr-added-p obj_reactor))
(vlr-remove obj_reactor))
     (setq obj_reactor (vlr-pers (vlr-object-reactor  objlst  nil '((:vlr-modified . LinkText)
							     (:vlr-erased . eraseEnt)  ))))
     (princ (strcat "\n   Da thuc hien Link " (itoa(sslength ss)) " Text voi nhau !"
	     "\n   Goi lenh Edit Text (ddedit) de cap nhat gia tri."))
     (princ)
     )
   )
 )
(defun LinkText (notifier-object obj_reactor parameter-list / objlist str)
 (setq objlist (vlr-owners obj_reactor)
str (vla-get-TextString notifier-object))
 (foreach obj objlist
   (if (/= (vla-get-TextString obj)str)
     (vla-put-TextString obj str)
     )
   )
 )
(defun eraseEnt (notifier-object obj_reactor parameter-list)
 (alert "Ban da thuc hien lenh Erase tu doi tuong REACTOR.\nLinkText da bi huy bo : Cac Text khong con Link voi nhau !")
 (vlr-owner-remove  obj_reactor notifier-object)
 (vlr-remove obj_reactor)
 (princ)
 )

  • Vote tăng 3

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

×