ronsingh78 发表于 2022-7-5 17:29:21

反应堆帮助

我不熟悉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

BIGAL 发表于 2022-7-5 17:36:17

你看过约束或动态块可能更容易。可以将圆约束到直线的端点。它可以调节。
 
新建块。图纸

Roy_043 发表于 2022-7-5 17:37:24

@ronsingh78:
阅读本文,提及代码的来源并描述错误。

ronsingh78 发表于 2022-7-5 17:43:21

好啊谢谢你帮我贴出正确的方式。希望这次它看起来格式化了
(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 发表于 2022-7-5 17:44:28

在选择代码并单击“#”后,evevn出现了一些错误,它什么也不做

ronsingh78 发表于 2022-7-5 17:47:41

代码是我写的,纯粹出于理论目的。我正在努力学习反应堆。比格尔,谢谢你的建议。然而,我这么做只是为了理解反应堆及其工作原理。
 
 
(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

Roy_043 发表于 2022-7-5 17:52:37

对代码进行快速测试不会显示任何错误。因此,请更详细地描述这个问题。”“有些错误”太模糊了。

ronsingh78 发表于 2022-7-5 17:56:43

见截图附件。有一个错误、一个警告和一个错误。当我启动例程时,它要求我创建实体。现在移动直线,圆会更新,但我得到附加的错误,之后如果我移动圆,什么都不会发生。现在,去掉所有的反应堆,重新开始日常工作。这次移动圆而不是直线,直线跟随。然而,现在如果你移动这条线,那么圆就停留在原地。基本上,当你开始例行程序时,无论你先移动哪个实体都会工作,但另一个似乎会松动反应堆。另外,我得到了错误。请帮忙。

Roy_043 发表于 2022-7-5 18:01:12

如果你移动圆圈,反应堆会导致管线改变。但这种变化反过来又会触发反应堆改变圆,这在那个精确的时刻是不可能的。
两个可能有用的功能:
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)
   )
)
)

ronsingh78 发表于 2022-7-5 18:02:56

谢谢Roy_043。看来我就要到了。不过我还有一个问题。如果我像这样设置一个反应堆对象
 
 
#(setq tmpobjreactor(vlr对象reactor(list entcirc entline)nil’(:vlr modified.funcone)))#
 
 
然后调用(vlr所有者tmpobjreactor),它列出了直线和圆对象,这很好,因为我是这样设置的。现在我运行以下命令
 
 
(vlr所有者移除tmpobjreactor entcirc)
 
 
它返回圆对象,确认其已被删除。现在我再次调用(vlr owners tmpobjreactor),希望它只显示作为所有者的行,但它仍然再次列出这两个对象。我做错了什么?请告知。
页: [1] 2
查看完整版本: 反应堆帮助