反应堆帮助
我不熟悉visual lisp和学习反应器。看到这篇文章,决定做一些类似的事情。LISP要求绘制一个圆和一条线,然后创建reactor。reactor将保持圆心和线端点之间的关系。当我移动任何一个实体时,反应器会更新另一个实体。但总是给我一些错误。我做错了什么。请帮忙。提前谢谢。对不起,压痕不好。无法理解如何发布lisp代码。(defun c:reactry (/ entcirc entline modangle moddist)
(command "._circle" pause pause)
(setq entcirc (vlax-ename->vla-object (entlast)))
(command "._line" pause pause "")
(setq entline (vlax-ename->vla-object (entlast)))
(setq modangle (angle
(vlax-safearray->list
(variant-value (vlax-get-property entline 'endPoint))
) ;_ end vlax-safearray->list
(vlax-safearray->list
(variant-value (vlax-get-property entcirc 'center))
) ;_ end vlax-safearray->list
) ;_ end angle
moddist(distance
(vlax-safearray->list
(variant-value (vlax-get-property entline 'endPoint))
) ;_ end vlax-safearray->list
(vlax-safearray->list
(variant-value (vlax-get-property entcirc 'center))
) ;_ end vlax-safearray->list
) ;_ end distance
) ;_ end setq
(vlr-object-reactor (list entcirc entline)
(list modangle moddist)
'((:vlr-objectClosed . modifyentities))
) ;_ end vlr-object-reactor
) ;_ end defun
(defun modifyentities
(notobj reacobj syslist / ownerslist paramlist adoc)
(setq ownerslist (vlr-owners reacobj))
(setq paramlist (vlr-data reacobj))
(setq adoc (vlax-get-property (vlax-get-acad-object) 'activedocument))
(vlr-remove reacobj)
(cond ((= "AcDbCircle" (vlax-get-property notobj 'ObjectName))
(vlax-put-property
(if (= "AcDbCircle" (car ownerslist))
(cadr ownerslist)
(car ownerslist)
) ;_ end if
'endPoint
(vlax-invoke-method (vlax-get-property adoc 'utility)
'polarPoint
(vlax-get-property notobj 'center)
(+ pi (car paramlist))
(cadr paramlist)
) ;_ end vlax-invoke-method
) ;_ end vlax-put-property
)
(T
(vlax-put-property
(if (= "AcDbCircle" (car ownerslist))
(car ownerslist)
(cadr ownerslist)
) ;_ end if
'center
(vlax-invoke-method (vlax-get-property adoc 'utility)
'polarPoint
(vlax-get-property notobj 'endPoint)
(car paramlist)
(cadr paramlist)
) ;_ end vlax-invoke-method
) ;_ end vlax-put-property
)
) ;_ end cond
(vlr-add reacobj)
) ;_ end defun 你看过约束或动态块可能更容易。可以将圆约束到直线的端点。它可以调节。
新建块。图纸 @ronsingh78:
阅读本文,提及代码的来源并描述错误。 好啊谢谢你帮我贴出正确的方式。希望这次它看起来格式化了
(defun c:reactry (/ entcirc entline modangle moddist)
(command "._circle" pause pause)
(setq entcirc (vlax-ename->vla-object (entlast)))
(command "._line" pause pause "")
(setq entline (vlax-ename->vla-object (entlast)))
(setq modangle (angle
(vlax-safearray->list
(variant-value (vlax-get-property entline 'endPoint))
) ;_ end vlax-safearray->list
(vlax-safearray->list
(variant-value (vlax-get-property entcirc 'center))
) ;_ end vlax-safearray->list
) ;_ end angle
moddist(distance
(vlax-safearray->list
(variant-value (vlax-get-property entline 'endPoint))
) ;_ end vlax-safearray->list
(vlax-safearray->list
(variant-value (vlax-get-property entcirc 'center))
) ;_ end vlax-safearray->list
) ;_ end distance
) ;_ end setq
(vlr-object-reactor (list entcirc entline)
(list modangle moddist)
'((:vlr-objectClosed . modifyentities))
) ;_ end vlr-object-reactor
) ;_ end defun
(defun modifyentities
(notobj reacobj syslist / ownerslist paramlist adoc)
(setq ownerslist (vlr-owners reacobj))
(setq paramlist (vlr-data reacobj))
(setq adoc (vlax-get-property (vlax-get-acad-object) 'activedocument))
(vlr-remove reacobj)
(cond ((= "AcDbCircle" (vlax-get-property notobj 'ObjectName))
(vlax-put-property
(if (= "AcDbCircle" (car ownerslist))
(cadr ownerslist)
(car ownerslist)
) ;_ end if
'endPoint
(vlax-invoke-method (vlax-get-property adoc 'utility)
'polarPoint
(vlax-get-property notobj 'center)
(+ pi (car paramlist))
(cadr paramlist)
) ;_ end vlax-invoke-method
) ;_ end vlax-put-property
)
(T
(vlax-put-property
(if (= "AcDbCircle" (car ownerslist))
(car ownerslist)
(cadr ownerslist)
) ;_ end if
'center
(vlax-invoke-method (vlax-get-property adoc 'utility)
'polarPoint
(vlax-get-property notobj 'endPoint)
(car paramlist)
(cadr paramlist)
) ;_ end vlax-invoke-method
) ;_ end vlax-put-property
)
) ;_ end cond
(vlr-add reacobj)
) ;_ end defun 在选择代码并单击“#”后,evevn出现了一些错误,它什么也不做 代码是我写的,纯粹出于理论目的。我正在努力学习反应堆。比格尔,谢谢你的建议。然而,我这么做只是为了理解反应堆及其工作原理。
(defun c:reactry (/ entcirc entline modangle moddist)
(command "._circle" pause pause)
(setq entcirc (vlax-ename->vla-object (entlast)))
(command "._line" pause pause "")
(setq entline (vlax-ename->vla-object (entlast)))
(setq modangle (angle
(vlax-safearray->list
(variant-value (vlax-get-property entline 'endPoint))
) ;_ end vlax-safearray->list
(vlax-safearray->list
(variant-value (vlax-get-property entcirc 'center))
) ;_ end vlax-safearray->list
) ;_ end angle
moddist(distance
(vlax-safearray->list
(variant-value (vlax-get-property entline 'endPoint))
) ;_ end vlax-safearray->list
(vlax-safearray->list
(variant-value (vlax-get-property entcirc 'center))
) ;_ end vlax-safearray->list
) ;_ end distance
) ;_ end setq
(vlr-object-reactor (list entcirc entline)
(list modangle moddist)
'((:vlr-objectClosed . modifyentities))
) ;_ end vlr-object-reactor
) ;_ end defun
(defun modifyentities
(notobj reacobj syslist / ownerslist paramlist adoc)
(setq ownerslist (vlr-owners reacobj))
(setq paramlist (vlr-data reacobj))
(setq adoc (vlax-get-property (vlax-get-acad-object) 'activedocument))
(vlr-remove reacobj)
(cond ((= "AcDbCircle" (vlax-get-property notobj 'ObjectName))
(vlax-put-property
(if (= "AcDbCircle" (car ownerslist))
(cadr ownerslist)
(car ownerslist)
) ;_ end if
'endPoint
(vlax-invoke-method (vlax-get-property adoc 'utility)
'polarPoint
(vlax-get-property notobj 'center)
(+ pi (car paramlist))
(cadr paramlist)
) ;_ end vlax-invoke-method
) ;_ end vlax-put-property
)
(T
(vlax-put-property
(if (= "AcDbCircle" (car ownerslist))
(car ownerslist)
(cadr ownerslist)
) ;_ end if
'center
(vlax-invoke-method (vlax-get-property adoc 'utility)
'polarPoint
(vlax-get-property notobj 'endPoint)
(car paramlist)
(cadr paramlist)
) ;_ end vlax-invoke-method
) ;_ end vlax-put-property
)
) ;_ end cond
(vlr-add reacobj)
) ;_ end defun 对代码进行快速测试不会显示任何错误。因此,请更详细地描述这个问题。”“有些错误”太模糊了。 见截图附件。有一个错误、一个警告和一个错误。当我启动例程时,它要求我创建实体。现在移动直线,圆会更新,但我得到附加的错误,之后如果我移动圆,什么都不会发生。现在,去掉所有的反应堆,重新开始日常工作。这次移动圆而不是直线,直线跟随。然而,现在如果你移动这条线,那么圆就停留在原地。基本上,当你开始例行程序时,无论你先移动哪个实体都会工作,但另一个似乎会松动反应堆。另外,我得到了错误。请帮忙。
如果你移动圆圈,反应堆会导致管线改变。但这种变化反过来又会触发反应堆改变圆,这在那个精确的时刻是不可能的。
两个可能有用的功能:
vlax-read-enabled-p
vlax-write-enabled-p
在这种情况下,也可以使用全局变量,例如“*CallBackIsActiveP*”。
(defun modifyentities (notobj reacobj syslist / ownerslist paramlist adoc)
(if (not *CallBackIsActiveP*)
(progn
(setq *CallBackIsActiveP* T)
...
(setq *CallBackIsActiveP* nil)
)
)
) 谢谢Roy_043。看来我就要到了。不过我还有一个问题。如果我像这样设置一个反应堆对象
#(setq tmpobjreactor(vlr对象reactor(list entcirc entline)nil’(:vlr modified.funcone)))#
然后调用(vlr所有者tmpobjreactor),它列出了直线和圆对象,这很好,因为我是这样设置的。现在我运行以下命令
(vlr所有者移除tmpobjreactor entcirc)
它返回圆对象,确认其已被删除。现在我再次调用(vlr owners tmpobjreactor),希望它只显示作为所有者的行,但它仍然再次列出这两个对象。我做错了什么?请告知。
页:
[1]
2