Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
24 replies to this topic

#1 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 23 December 2010 - 08:25 AM

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

#2 VUVUZELA

VUVUZELA

    biết lệnh chamfer

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

Đã gửi 23 December 2010 - 11:05 AM

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.c...showtopic=24994
  • 0

Hệ thống Liên Kết, Thiết Kế Tự Động

ttps://www.facebook...etThietKeTuDong


#3 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 23 December 2010 - 10:31 PM

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ỉ ^^
  • 0

#4 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 24 December 2010 - 09:34 AM

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:
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#5 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 24 December 2010 - 11:23 AM

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 ^^
  • 6

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#6 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 25 December 2010 - 09:20 PM

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

#7 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 13 July 2011 - 12:30 AM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#8 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 17 July 2011 - 10:19 PM

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ị ^^
  • 4

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#9 dovananh.xd

dovananh.xd

    biết lệnh offset

  • Members
  • PipPipPip
  • 174 Bài viết
Điểm đánh giá: 25 (tàm tạm)

Đã gửi 25 November 2011 - 10:17 AM

Đây rồi! Cám ơn bác.
  • 0

#10 doanvantien86

doanvantien86

    biết vẽ arc

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

Đã gửi 25 November 2011 - 11:41 AM

Các bác ơi cho em hỏi lệnh đổi màu thì dùng thế nào? em tìm mãi không biết lệnh là gì? Chỉ em với nha.hi thanks
  • 0

#11 doanvantien86

doanvantien86

    biết vẽ arc

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

Đã gửi 25 November 2011 - 11:57 AM

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

#12 doanvantien86

doanvantien86

    biết vẽ arc

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

Đã gửi 25 November 2011 - 11:58 AM

Quên chưa Thanks các pro...
  • 0

#13 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 05 December 2011 - 03:46 PM

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ũ
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#14 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 05 December 2011 - 07:30 PM

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)

  • 0

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


#15 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 05 December 2011 - 08:25 PM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#16 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 05 December 2011 - 10:51 PM

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 ?
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#17 Reaperblack

Reaperblack

    Chưa sử dụng CAD

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

Đã gửi 13 March 2012 - 10:12 AM

nhiều lisp hay quá thank các pro ....
  • 0

#18 hochoaivandot

hochoaivandot

    biết dimradius

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

Đã gửi 09 September 2014 - 12:34 PM

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


  • 0

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#19 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 09 September 2014 - 12:59 PM

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.


  • 1

#20 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 09 September 2014 - 02:16 PM

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


  • 0