Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
pfievxd

Reactor và các ứng dụng của nó ?

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

Trên diễn đàn nhà mình số bài viết liên quan đến Reactor có vẻ đặc biệt hiếm hoi, gần như chỉ có 1 bài của bác gia_bach viết về ứng dụng Reactor cho quản lý bản vẽ (right?)... Okie, vậy các đại cao thủ hãy khai sáng mảng này cho mọi người với, một chút giới thiệu, 1 vài ví dụ chẳng hạ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
Trên diễn đàn nhà mình số bài viết liên quan đến Reactor có vẻ đặc biệt hiếm hoi, gần như chỉ có 1 bài của bác gia_bach viết về ứng dụng Reactor cho quản lý bản vẽ (right?)... Okie, vậy các đại cao thủ hãy khai sáng mảng này cho mọi người với, một chút giới thiệu, 1 vài ví dụ chẳng hạn

 

bác đọc bài này nè

http://www.cadviet.com/forum/index.php?showtopic=24994

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ì bác Vuvuzela ko đọc kỹ rồi, cái này em đã đề cập trong phần đặt vấn đề rồi mà, đây có phải là bài viết duy nhất về vấn đề này ko nhỉ ^^

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

Ví dụ thì tìm trên mạng chắc nhiều ^^,nhưng dịch ra thì hơi ngại bạn nhỉ :undecided:

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 xin post 1 ví dụ đơn giản mới vớ đc về reactor.

Thay vì tạo hàng loạt lệnh để vẽ các hình vuông,hình tròn theo bán kính,ta có thể tạo 1 lisp sau:

(vl-load-com)
(if (null circle_reactor)
(setq circle_reactor (vlr-command-reactor nil '((:vlr-unknownCommand . taoduongtron)))))
;;*********************************************************************
(defun	taoduongtron (calling-reactor endcommandInfo / Layer_Key)
(setq 	Layer_Key (nth 0 endcommandInfo))
(if (or (wcmatch Layer_Key "ht*")(wcmatch Layer_Key "HT*"))(veht))
(princ)
)
;;*********************************************************************
(defun veht (/ dis1 p1 p2 p3 p4 mid1 lst1 arraySpace sArray Doc blk1 blk2 Poly)
(setq 	Layer_Key (strcase Layer_Key)
		dis1 (vl-string-left-trim "HT" Layer_Key)
		dis1 (/ (layso dis1) (getvar "Dimlfac")))			
(if dis1
	(progn
		(setq	p1 (getpoint "\n Nhap diem chen : "))
		(vlax-invoke-method *modelspace* 'AddCircle (vlax-3d-point p1) dis1)			
		(princ "\n Da xong...")				
	)
)
)


;***********ve hinh vuong

(if (null square_reactor)
(setq square_reactor (vlr-command-reactor nil '((:vlr-unknownCommand . taohinhvuong)))))
;;*********************************************************************
(defun	taohinhvuong (calling-reactor endcommandInfo / Layer_Key)
(setq 	Layer_Key (nth 0 endcommandInfo))
(if(or (wcmatch Layer_Key "hv*")(wcmatch Layer_Key "HV*"))(vehv))
(princ)
)
;;*********************************************************************
(defun vehv (/ dis1 p1 p2 p3 p4 mid1 lst1 arraySpace sArray Doc blk1 blk2 Poly)
(setq 	Layer_Key (strcase Layer_Key)
		dis1 (vl-string-left-trim "HV" Layer_Key)
		dis1 (/ (layso dis1) (getvar "Dimlfac")))
(if dis1
	(progn			
		(setq	mid1 (getpoint "\n Nhap diem chen: "))			
		(setq 	p1 (polar (polar mid1 0.0 (/ dis1 2.0)) (* 0.5 pi) (/ dis1 2.0))
				p2 (polar p1 (* 1.5 pi) dis1) 
				p3 (polar p2 (* 1.0 pi) dis1) 
				p4 (polar p3 (* 0.5 pi) dis1)
				lst1 (list (car p1)(cadr p1) (car p2)(cadr p2) (car p3)(cadr p3) 
                                                   (car p4)(cadr p4)(car p1)(cadr p1))
				arraySpace (vlax-make-safearray vlax-vbdouble  
                                                         (cons 0 (- (length lst1) 1)))
				sArray (vlax-safearray-fill arraySpace lst1))
		(vlax-invoke-method *modelspace* 'AddLightWeightPolyline sArray)			
			(princ "\n Da xong...")				
	)
)
)

;*****************
(setq *ModelSpace*
   (vla-get-ModelSpace
	 (vla-get-ActiveDocument (vlax-get-acad-object))
   )
)
;;*********************************************************************
(defun Layso( string / Num)
(cond
	((= (type (read string)) 'INT)
		(setq Num (atoi string)))
	((= (type (read string)) 'REAL)
		(setq Num (atof string)))
	(t	(setq Num nil))
)
Num
)

OK.giờ để vẽ hình tròn,hoặc hình vuông theo bán kính nào đó,ví dụ 100 chẳng hạn thì ta sẽ nhập ht100

Mời mọi người tiếp tục nào ^^

  • Vote tăng 6

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

HX, mới đọc lại bài của bác gia_bach, bác í sử dụng 1 đống hàm vlr- , nhìn vào đã hoa mắt, thôi để lúc nào thư thả ngâm cứu vậ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

Lâu lâu rồi không ai đả động đến Reactor nhỉ ^^

Hôm nay ketxu post thêm 1 ví dụ về offset 2 phía :

(vl-load-com)
(if (null ostd)
(setq ostd (vlr-command-reactor nil '((:vlr-unknownCommand . offsettudong)))))
;;*********************************************************************
(defun	offsettudong (calling-reactor endcommandInfo / Layer_Key)
(setq 	Layer_Key (strcase (nth 0 endcommandInfo)))
(if (wcmatch Layer_Key "OO*")(offset2))	
)
;;*********************************************************************
(defun offset2 (/ dis1 ss)
(setq dis1 (/ (atof (vl-string-left-trim "OO" Layer_Key)) (getvar "Dimlfac")) ss (ssget))			
(if dis1 (foreach a (ST:Ss->lstEnt ss ) (ST:Ent-OffsetDouble a dis1))(princ))	
)
(defun ST:Ent-OffsetDouble (Ent Dist / vObj)
(setq vobj (vlax-ename->vla-object Ent))
(if (vlax-method-applicable-p vobj 'Offset)
(progn
	(vla-offset vObj dist)
	(vla-offset vObj (- dist))
)
nil
)						
)
(defun ST:Ss->lstEnt (ss / n e l)
 (setq n (sslength ss))
 (while (setq e (ssname ss (setq n (1- n))))
   (setq l (cons e l))
 )  
)

Ok. Bây giờ để offset nhiều đối tượng về 2 phía với khoảng cách bất kỳ, hãy đánh liền oo + khoảng cách và chọn các đối tượng đó

Ví dụ : oo100, oo200, oo10.1 ....

  • Vote tăng 2

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

Tiếp tục 1 ví dụ nữa, áp dụng UnknownCommand cho phép đặt lệnh tắt đổi màu đối tượng. Thay vì tạo hàng loạt hàm c:1,2,3... để đổi sang màu tương ứng, ta sẽ chỉ dùng duy nhất 1 Reactor sau :

;@ketxu
(vl-load-com)
(if (null dmtd)
(setq dmtd (vlr-command-reactor nil '((:vlr-unknownCommand . doimau)))))
;;*********************************************************************
(defun doimau (calling-reactor endcommandInfo / Layer_Key)
(setq Layer_Key (strcase (nth 0 endcommandInfo)))
(if (and (= (strlen (rtos (atoi Layer_Key) 2 0))(strlen Layer_key))(< (atoi Layer_key) 257))(doimaufunc)(princ "\nChua co lenh nao nhu the nay"))
)
;;*********************************************************************
(defun doimaufunc (/ dis1 ss)
(setq col (atoi Layer_Key)  ss (ssget)) 
(if ss (foreach a (mapcar 'vlax-ename->vla-object (ST:Ss->lstEnt ss ) ) (ST:Ent-PutColor a col))(princ)) 
)
(defun ST:Ent-PutColor  (obj color_use) ;vla-object
(if (wcmatch (getvar "acadver") "16*,17*,18*")
   (setq vla_truecolor
   (vla-getinterfaceobject
     (vlax-get-acad-object)
     (cond
       ((wcmatch (getvar "acadver") "16*")
 "AutoCAD.AcCmColor.16")
       ((wcmatch (getvar "acadver") "17*")
 "AutoCAD.AcCmColor.17")
       ((wcmatch (getvar "acadver") "18*")
 "AutoCAD.AcCmColor.18")))))
(if (wcmatch (getvar "acadver") "16*,17*,18*")
  (progn
     (vla-put-colorindex
vla_truecolor
color_use)
     (if obj
(vla-put-truecolor obj vla_truecolor)))
   (if (wcmatch (getvar "acadver") "15*")
     (vla-put-color obj color_use)))
 (vlax-release-object vla_truecolor)
 (setq vla_truecolor nil))


(defun ST:Ss->lstEnt (ss / n e l)
 (setq n (sslength ss))
 (while (setq e (ssname ss (setq n (1- n))))
   (setq l (cons e l))
 )
)

Bây giờ, muốn đổi màu đối tượng sang màu nào, hãy nhấn số và chọn các đối tượng ^^

Reactor quả có thú vị ^^

  • 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

em dùng được rùi. Hơi gà nhưng vẫn tìm ra. vì trong cad của em em đổi một số lệnh thành số lên không dùng được lệnh. em tìm mãi mới thấy cài này. hay thậ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

Sửa code của Ketxu 2 tí cho giống cách dùng của lệnh offset

- lựa offset sang 1 bên hoặc 2 bên

- đổi tên lệnh về số 0 bàn phím số, ví dụ: muốn offset 1 đơn vị bản vẽ gõ 01; offset 0.5 đvbv gõ 0.5; offset 1.5 đvbv gõ 01.5...

(if (null ostd) (setq ostd (vlr-command-reactor nil '((:vlr-unknownCommand . offsettudong)))))
;;*********************************************************************
(defun offsettudong (calling-reactor endcommandInfo / Layer_Key ss ang1 ang2 dist en pt0 pt1 vobj)
(setq Layer_Key (strcase (car endcommandInfo)))
(if (wcmatch Layer_Key "0*")
(if (setq dist (atof (vl-string-left-trim "0" Layer_Key)))
(while (setq en (car (entsel "Chon doi tuong offset\n")))
(setq vobj (vlax-ename->vla-object En))
(if (setq pt1 (getpoint "Chon phia offset,[enter] de offset sang 2 ben\n"))
(progn
(setq ang1 (angle (Vlax-curve-getfirstderiv en (vlax-curve-getParamAtPoint en (setq Pt0 (vlax-curve-getClosestPointTo en pt1)))) '(0 0)) ang2 (angle pt0 pt1))
(setq dist (if(or(equal(/(- ang1 ang2)(/ pi 2))1 0.001)(equal(/(- ang1 ang2)(/ pi 2))-3 0.001)) (- dist) dist))
(if (vlax-method-applicable-p vobj 'Offset) (vla-offset vObj dist)))
(and (vlax-method-applicable-p vobj 'Offset) (vla-offset vObj dist) (vla-offset vObj (- dist))))
(setq dist (abs dist)))))
(princ))

 

Các bác có cánh nào để sau khi sử dụng lệnh này xong, muốn tiếp tục sử dụng lại thì chỉ việc gõ enter hoặc space như các lệnh thông thường khác không. nhược điểm của thằng này là phải gõ lại lệnh, không tự động nhận lệnh cũ

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ác bác có cánh nào để sau khi sử dụng lệnh này xong, muốn tiếp tục sử dụng lại thì chỉ việc gõ enter hoặc space như các lệnh thông thường khác không. nhược điểm của thằng này là phải gõ lại lệnh, không tự động nhận lệnh cũ

 

Bác tham khảo của mót này nhé! Dùng để vẽ đường tâm của hình tròn, reactor được. Nó có thể dùng enter hoặc space để gọi lại.

(setq cl:ratio 1.25 cl:app "LMAC_CL")
(defun c:cl ( / _line ss e c r l1 l2 )
 (if
(and
 	(setq ss
   	(ssget
     	(list '(0 . "CIRCLE") '(-4 . "<NOT") (list -3 (list cl:app)) '(-4 . "NOT>"))
   	)
 	)
 	(or (tblsearch "APPID" cl:app) (regapp cl:app))
)
(progn
 	(defun _line ( p1 p2 h )
   	(entmakex
     	(list (cons 0 "LINE") (cons 10 p1) (cons 11 p2)
       	(list -3
         	(list cl:app
           	(cons 1002 "{") (cons 1005 h) (cons 1002 "}")
         	)
       	)
     	)
   	)
 	)
 	(repeat (setq i (sslength ss))
   	(setq e  (entget (ssname ss (setq i (1- i))))
         	h  (cdr (assoc  5 e))
         	c  (cdr (assoc 10 e))
         	r  (* cl:ratio (cdr (assoc 40 e)))
         	l1 (_line (polar c 0. r) (polar c pi r) h)
         	l2 (_line (polar c (/ pi 2.) r) (polar c (/ (* 3. pi) 2.) r) h)
   	)
   	(entmod
     	(list (assoc -1 e)
       	(list -3
         	(list cl:app
           	(cons 1002 "{")
           	(cons 1005 (cdr (assoc 5 (entget l1))))
           	(cons 1005 (cdr (assoc 5 (entget l2))))
           	(cons 1002 "}")
         	)
       	)
     	)
   	)
   	(vlr-object-reactor (list (vlax-ename->vla-object (cdr (assoc -1 e)))) (list cl:app h)
     	(list
       	(cons :vlr-modified 'cl:circle:callback)
     	)
   	)
   	(vlr-object-reactor (mapcar 'vlax-ename->vla-object (list l1 l2)) (list cl:app h)
     	(list
       	(cons :vlr-modified 'cl:line:callback)
     	)
   	)
 	)
)
 )
 (princ)
)
(defun c:clremove ( / _massoc ss fl i e r d h x )

 (defun _massoc ( x l )
(if (setq a (assoc x l))
 	(cons (cdr a) (_massoc x (cdr (member a l))))
)
 )

 (princ "\nSelect Circles to Remove Associativity <All>: ")
 (setq fl (list '(0 . "CIRCLE") (list -3 (list cl:app))) i -1)

 (if
(setq ss
 	(cond
   	( (ssget fl) )
   	( (ssget "_X" fl) )
 	)
)
(while (setq e (ssname ss (setq i (1+ i)))) (setq e (entget e (list cl:app)))
 	(foreach r (cdar (vlr-reactors :vlr-object-reactor))
   	(if
     	(and
       	(setq d (vlr-data r))
       	(listp d)
       	(eq cl:app (car d))
       	(or (not (cadr d)) (eq (cdr (assoc 5 e)) (cadr d)))
     	)
     	(vlr-remove r)
   	)
 	)
 	(foreach h (_massoc 1005 (cdadr (assoc -3 e)))
   	(if (setq x (entget (handent h)))
     	(entmod (list (assoc -1 x) (list -3 (list cl:app))))
   	)
 	)
 	(entmod (list (assoc -1 e) (list -3 (list cl:app))))
)
 )
 (princ)
)     

(defun cl:circle:callback ( owner reactor params / xtyp xval c r )
 (if
(and
 	(vlax-read-enabled-p owner)
 	(progn (vla-getxdata owner cl:app 'xtyp 'xval) xval)
 	(setq
   	c (vlax-get owner 'center)
   	r (* cl:ratio (vlax-get owner 'radius))
 	)
)
(mapcar
 	(function
   	(lambda ( h a )
     	(if (or (entget (setq h (handent h))) (entdel h))
       	(entmod
         	(list (cons -1 h) (cons 10 (polar c a r)) (cons 11 (polar c (+ a pi) r)))
       	)
     	)
   	)
 	)
 	(cddr (mapcar 'vlax-variant-value (vlax-safearray->list xval))) (list 0. (/ pi 2.))
)
 )
 (princ)
)


(defun cl:line:callback ( owner reactor params )
 (setq *data (list owner reactor))
 (vlr-command-reactor (list cl:app)
(list
 	(cons :vlr-commandended 	'cl:line:modify)
 	(cons :vlr-commandcancelled 'cl:line:cancelled)
 	(cons :vlr-commandfailed	'cl:line:cancelled)
)
 )
 (vlr-remove reactor)
 (princ) 
)

(defun cl:line:modify ( reactor params / xtyp xval h ) (vlr-remove reactor)
 (if
(and *data (not (vlax-erased-p (car *data))) (progn (vla-getxdata (car *data) cl:app 'xtyp 'xval) xval)   
 	(or
   	(entget
     	(setq h
       	(handent
         	(caddr
           	(mapcar 'vlax-variant-value (vlax-safearray->list xval))
         	)
       	)
     	)
   	)
   	(entdel h)
 	)
)
(progn
 	(cl:circle:callback (vlax-ename->vla-object h) nil nil)
 	(vlr-add (cadr *data))
 	(setq *data nil)
)
 )  
 (princ)
)


(defun cl:line:cancelled ( reactor params ) (vlr-remove reactor)
 (if *data
(progn
 	(vlr-add (cadr *data))
 	(setq *data nil)
)
 )
 (princ)
)


(
 (lambda ( / r d s i e o xtyp xval )
(foreach r (cdar (vlr-reactors :vlr-object-reactor))
 	(if (and (setq d (vlr-data r)) (listp d) (eq cl:app (car d)))
   	(vlr-remove r)
 	)
)
(if (setq s (ssget "_X" (list '(0 . "CIRCLE") (list -3 (list cl:app)))))
 	(repeat (setq i (sslength s))
   	(setq e (ssname s (setq i (1- i))))
   	(vlr-object-reactor (list (setq o (vlax-ename->vla-object e))) (list cl:app (cdr (assoc 5 (entget e))))
     	(list
       	(cons :vlr-modified 'cl:circle:callback)
     	)
   	)
   	(vla-getxdata o cl:app 'xtyp 'xval) (setq xval (mapcar 'vlax-variant-value (vlax-safearray->list xval)))
   	(vlr-object-reactor
     	(mapcar
       	(function
         	(lambda ( h )
           	(or (entget (setq h (handent h))) (entdel h)) (vlax-ename->vla-object h)
         	)
       	)
       	(list (caddr xval) (cadddr xval))
     	)
     	(list cl:app (cdr (assoc 5 (entget e)))) (list (cons :vlr-modified 'cl:line:callback))
   	)
 	)
)
 )
)
(vl-load-com) (princ)

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ác Hà chưa hiểu bản chất của vấn đề rồi. sở dĩ lệnh cl bác post ở trên có thể được gọi lại bởi vì ta có hàm (defun c:cl...) nó định nghĩa cho cad hiểu CL là 1 lệnh. như thế nó cũng giống như bao nhiêu lệnh lisp thông thường khác.

Còn lisp offset bên trên không định nghĩa 1 lệnh cụ thể. nó chỉ hướng dẫn cho cad phải ứng xử như thế nào khi gặp 1 lệnh mà nó không hiểu (unknow command) có dạng 0*.

Mặc định cad không gọi lại 1 unknow command mà chỉ gọi lệnh cuối cùng mà nó hiểu khi người dùng nhấn enter (space) mà không nhập tên lệnh.

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ác Thái tự hỏi tự giải thích :D

Nếu cố, bác thử thay người dùng tạo defun trong file lisp tạm xem có được khô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

Anh chị em cho mình hỏi tại sao hàm CallBack nó thực thi đến 2 lần ạ

(vl-load-com)
(if (null unknownCommand)(setq unknownCommand (vlr-command-reactor nil '((:vlr-unknownCommand . DisplayWrongFunc)))))
(defun    DisplayWrongFunc (reactor_object  lst / cmdLine cmd dis)
    (if lst (alert (strcat "Ban vua dung lenh: " (car lst))))
)

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

Vì có 2 reactor làm 1 việc giống nhau nên nó làm 2 lần.

Người khác khi chạy cái lsp của bạn nó chỉ làm 1 lần thôi, còn bạn chắc trước đó đã tạo 1 lần rồi.

Bạn dùng (vlr-reactors :vlr-command-reactor) để biết số command reactor đã tạo ra.

  • 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 chị em cho mình hỏi tại sao hàm CallBack nó thực thi đến 2 lần ạ

(vl-load-com)

(if (null unknownCommand)(setq unknownCommand (vlr-command-reactor nil '((:vlr-unknownCommand . DisplayWrongFunc)))))

(defun    DisplayWrongFunc (reactor_object  lst / cmdLine cmd dis)

    (if lst (alert (strcat "Ban vua dung lenh: " (car lst))))

)

Đối số data trong bất kỳ hàm make reactor nào cũng cực kỳ quan trọng để xác định chính xác 1 reactor, ngoài ra nó còn có thể được dùng để cung cấp dữ liệu mở rộng cho chính reactor đó.

 

Mình thấy đa số các bạn ở Cadviet thường bỏ qua đối số Data và để là nil. thay vào đó các bạn lại dùng 1 biến để gán cho 1 reactor được tạo ra nhằm xác định nó. việc làm đó thực sự vô nghĩa và tạo ra nhiều khó khăn trong việc quản lý reactor. Tệ hơn nữa, nó chính là nguyên nhân gây ra những xung đột và trùng lặp như trường hợp trên mà đôi khi chính người viết cũng không kiểm soát được. bởi biến (cho dù là biến toàn cục) thì cũng chỉ sử dụng cho 1 phiên làm việc, tắt bản vẽ biến sẽ được giải phóng khỏi bộ nhớ. Còn reactor thì khi được tạo ra, nó sẽ tồn tại như 1 đối tượng dữ liệu trong bản vẽ, không thể tự mất đi sau mỗi phiên làm việc. nó chỉ mất khi người dùng chủ động xóa nó.

 

Data chỉ để nil khi reactor được tạo ra thông qua 1 lệnh và được xóa đi ngay khi lệnh đó kết thúc.

 

Như trường hợp trên. thay vì viết (setq unknownCommand (vlr-command-reactor nil '((:vlr-unknownCommand . DisplayWrongFunc))))

Thì nên viết (vlr-command-reactor "unknownCommand" '((:vlr-unknownCommand . DisplayWrongFunc)))

 

Hì, Mình đang rảnh nên chém bão tí, mời các bạn góp tí gió cho vui về chủ đề này  :P

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

 Thật ra đối số data trong command reactor không quan trong bằng cái hàm callback, khi bạn gõ một lệnh thì cad sẽ duyệt qua hết các command reactor (nếu có), cái nào có hàm callback phù hợp với lệnh đó thì nó sẽ thực thi, chứ cad ko cần biết cái reactor đó tên là gì. Chỉ có người viết là cần đặt tên để khỏi nhầm nếu có nhiều reactor làm nhiều việc khác nhau.

  Nhưng đối với Object reactor thì cái data mới thật sự quan trọng vì khi đó nên lưu các object "chủ động" và đối số owners làm object "thụ động"., 2 cái tác động qua lại thì reactor mới hoạt động tốt.

  Chủ đề này ít được nhiều người quan tâm vì vừa khó lại phải biết lsp mới hiểu được.

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 nó quan trọng như nhau đối với tất cả các reactor type. Sẽ có những ứng dụng chỉ sử dụng trong 1 khoảng thời gian nhất định của phiên làm việc, hoặc tại 1 thời điểm bản vẽ cùng tồn tại nhiều reactor của 1 reactor type. Khi đó nếu cần phải bật hoặc tắt 1 trong số chúng bạn sẽ cần truy cập Data của nó.

 

Có 1 cách làm khác là sử dụng Vlr-reactions để tìm ra cặp (even-callback) tương ứng của mỗi reactor, nhưng nó không tiện bằng việc kiểm tra data. Ngoài ra như mình đã nói, chúng ta có thể lợi dụng data để cung cấp thêm dữ liệu mở rộng cho từng reactor.

 

Chủ đề này mình nghĩ là không khó với những ai viết lisp bằng Vlide. Mình thấy nó đơn giản và minh bạch hơn nhiều so với các hàm VLA. 

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

(vlr-command-reactor data callbacks)

Và trong hàm callbacks:

(event-name . callback_function)

callback_function có 2 biến reactor_object list

 

Thật sự cái data và reactor_object này mình chưa biết có công dụng gì?

Bạn nào biết thì chỉ giúp, có ví dụ càng dễ hiểu hơn :D. Lâu ni code nhưng mà mơ mơ ảo ảo. Hông hiểu chi hế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

Ví dụ đơn giản như thế này:

(setq com-reactor (vlr-command-reactor (list 1 2 3 4) '((:vlr-commandEnded . EndCommand))))
(defun EndCommand (reactor_object lst )
(if (member (nth 0 lst) '("DIMLINEAR" ))
(princ (vlr-data reactor_object)))
)

Ý nghĩa là nếu ng dùng vẽ lệnh dimlinear xong thì sẽ hiện ra cái data của reactor là (1 2 3 4).

Cái lst chứa tên lệnh.

Cái (vlr-data reactor) để lấy data của reactor (là cái mà bạn thường hay để nil đó, ở đây là (list 1 2 3 4))

  • 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

Điều hay nhất ở đây là data của một reactor cho phép đọc và ghi đè, thậm chí có thể ghi đè bởi callback của chính reactor đó. Vì thế ứng dụng của nó là rất lớn nếu biết tận dụng.
 
Ví dụ như code trên của Tot77, Nếu muốn mỗi lần người dùng sử dụng lệnh DIMLINEAR Cad phải báo cáo lần gần nhất người dùng sử dụng lệnh DIMLINEAR trong bản vẽ đó là khi nào, thì trong hàm callback trên ta có thể sử dụng 1 hàm ghi vào data thông tin đó để lấy ra cho lần sau. cái này thì chỉ có sử dụng data mới làm được.

  • Vote tăng 2

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


×