乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 33|回复: 17

[编程交流] 反应堆帮助

[复制链接]

1

主题

11

帖子

10

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:29:21 | 显示全部楼层 |阅读模式
我不熟悉visual lisp和学习反应器。看到这篇文章,决定做一些类似的事情。LISP要求绘制一个圆和一条线,然后创建reactor。reactor将保持圆心和线端点之间的关系。当我移动任何一个实体时,反应器会更新另一个实体。但总是给我一些错误。我做错了什么。请帮忙。提前谢谢。对不起,压痕不好。无法理解如何发布lisp代码。
 
 
  1. (defun c:reactry (/ entcirc entline modangle moddist)
  2. (command "._circle" pause pause)
  3. (setq entcirc (vlax-ename->vla-object (entlast)))
  4. (command "._line" pause pause "")
  5. (setq entline (vlax-ename->vla-object (entlast)))
  6. (setq modangle (angle
  7.                   (vlax-safearray->list
  8.                     (variant-value (vlax-get-property entline 'endPoint))
  9.                   ) ;_ end vlax-safearray->list
  10.                   (vlax-safearray->list
  11.                     (variant-value (vlax-get-property entcirc 'center))
  12.                   ) ;_ end vlax-safearray->list
  13.                 ) ;_ end angle
  14.        moddist  (distance
  15.                   (vlax-safearray->list
  16.                     (variant-value (vlax-get-property entline 'endPoint))
  17.                   ) ;_ end vlax-safearray->list
  18.                   (vlax-safearray->list
  19.                     (variant-value (vlax-get-property entcirc 'center))
  20.                   ) ;_ end vlax-safearray->list
  21.                 ) ;_ end distance
  22. ) ;_ end setq
  23. (vlr-object-reactor (list entcirc entline)
  24.                      (list modangle moddist)
  25.                      '((:vlr-objectClosed . modifyentities))
  26. ) ;_ end vlr-object-reactor
  27. ) ;_ end defun
  28. (defun modifyentities
  29.       (notobj reacobj syslist / ownerslist paramlist adoc)
  30. (setq ownerslist (vlr-owners reacobj))
  31. (setq paramlist (vlr-data reacobj))
  32. (setq adoc (vlax-get-property (vlax-get-acad-object) 'activedocument))
  33. (vlr-remove reacobj)
  34. (cond ((= "AcDbCircle" (vlax-get-property notobj 'ObjectName))
  35.         (vlax-put-property
  36.           (if (= "AcDbCircle" (car ownerslist))
  37.             (cadr ownerslist)
  38.             (car ownerslist)
  39.           ) ;_ end if
  40.           'endPoint
  41.           (vlax-invoke-method (vlax-get-property adoc 'utility)
  42.                               'polarPoint
  43.                               (vlax-get-property notobj 'center)
  44.                               (+ pi (car paramlist))
  45.                               (cadr paramlist)
  46.           ) ;_ end vlax-invoke-method
  47.         ) ;_ end vlax-put-property
  48.        )
  49.        (T
  50.         (vlax-put-property
  51.           (if (= "AcDbCircle" (car ownerslist))
  52.             (car ownerslist)
  53.             (cadr ownerslist)
  54.           ) ;_ end if
  55.           'center
  56.           (vlax-invoke-method (vlax-get-property adoc 'utility)
  57.                               'polarPoint
  58.                               (vlax-get-property notobj 'endPoint)
  59.                               (car paramlist)
  60.                               (cadr paramlist)
  61.           ) ;_ end vlax-invoke-method
  62.         ) ;_ end vlax-put-property
  63.        )
  64. ) ;_ end cond
  65. (vlr-add reacobj)
  66. ) ;_ end defun
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:36:17 | 显示全部楼层
你看过约束或动态块可能更容易。可以将圆约束到直线的端点。它可以调节。
 
新建块。图纸
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:37:24 | 显示全部楼层
@ronsingh78:
阅读本文,提及代码的来源并描述错误。
回复

使用道具 举报

1

主题

11

帖子

10

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:43:21 | 显示全部楼层
好啊谢谢你帮我贴出正确的方式。希望这次它看起来格式化了
  1. (defun c:reactry (/ entcirc entline modangle moddist)
  2. (command "._circle" pause pause)
  3. (setq entcirc (vlax-ename->vla-object (entlast)))
  4. (command "._line" pause pause "")
  5. (setq entline (vlax-ename->vla-object (entlast)))
  6. (setq modangle (angle
  7.                   (vlax-safearray->list
  8.                     (variant-value (vlax-get-property entline 'endPoint))
  9.                   ) ;_ end vlax-safearray->list
  10.                   (vlax-safearray->list
  11.                     (variant-value (vlax-get-property entcirc 'center))
  12.                   ) ;_ end vlax-safearray->list
  13.                 ) ;_ end angle
  14.        moddist  (distance
  15.                   (vlax-safearray->list
  16.                     (variant-value (vlax-get-property entline 'endPoint))
  17.                   ) ;_ end vlax-safearray->list
  18.                   (vlax-safearray->list
  19.                     (variant-value (vlax-get-property entcirc 'center))
  20.                   ) ;_ end vlax-safearray->list
  21.                 ) ;_ end distance
  22. ) ;_ end setq
  23. (vlr-object-reactor (list entcirc entline)
  24.                      (list modangle moddist)
  25.                      '((:vlr-objectClosed . modifyentities))
  26. ) ;_ end vlr-object-reactor
  27. ) ;_ end defun
  28. (defun modifyentities
  29.       (notobj reacobj syslist / ownerslist paramlist adoc)
  30. (setq ownerslist (vlr-owners reacobj))
  31. (setq paramlist (vlr-data reacobj))
  32. (setq adoc (vlax-get-property (vlax-get-acad-object) 'activedocument))
  33. (vlr-remove reacobj)
  34. (cond ((= "AcDbCircle" (vlax-get-property notobj 'ObjectName))
  35.         (vlax-put-property
  36.           (if (= "AcDbCircle" (car ownerslist))
  37.             (cadr ownerslist)
  38.             (car ownerslist)
  39.           ) ;_ end if
  40.           'endPoint
  41.           (vlax-invoke-method (vlax-get-property adoc 'utility)
  42.                               'polarPoint
  43.                               (vlax-get-property notobj 'center)
  44.                               (+ pi (car paramlist))
  45.                               (cadr paramlist)
  46.           ) ;_ end vlax-invoke-method
  47.         ) ;_ end vlax-put-property
  48.        )
  49.        (T
  50.         (vlax-put-property
  51.           (if (= "AcDbCircle" (car ownerslist))
  52.             (car ownerslist)
  53.             (cadr ownerslist)
  54.           ) ;_ end if
  55.           'center
  56.           (vlax-invoke-method (vlax-get-property adoc 'utility)
  57.                               'polarPoint
  58.                               (vlax-get-property notobj 'endPoint)
  59.                               (car paramlist)
  60.                               (cadr paramlist)
  61.           ) ;_ end vlax-invoke-method
  62.         ) ;_ end vlax-put-property
  63.        )
  64. ) ;_ end cond
  65. (vlr-add reacobj)
  66. ) ;_ end defun
回复

使用道具 举报

1

主题

11

帖子

10

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:44:28 | 显示全部楼层
在选择代码并单击“#”后,evevn出现了一些错误,它什么也不做
回复

使用道具 举报

1

主题

11

帖子

10

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:47:41 | 显示全部楼层
代码是我写的,纯粹出于理论目的。我正在努力学习反应堆。比格尔,谢谢你的建议。然而,我这么做只是为了理解反应堆及其工作原理。
 
 
  1. (defun c:reactry (/ entcirc entline modangle moddist)
  2. (command "._circle" pause pause)
  3. (setq entcirc (vlax-ename->vla-object (entlast)))
  4. (command "._line" pause pause "")
  5. (setq entline (vlax-ename->vla-object (entlast)))
  6. (setq modangle (angle
  7.                   (vlax-safearray->list
  8.                     (variant-value (vlax-get-property entline 'endPoint))
  9.                   ) ;_ end vlax-safearray->list
  10.                   (vlax-safearray->list
  11.                     (variant-value (vlax-get-property entcirc 'center))
  12.                   ) ;_ end vlax-safearray->list
  13.                 ) ;_ end angle
  14.        moddist  (distance
  15.                   (vlax-safearray->list
  16.                     (variant-value (vlax-get-property entline 'endPoint))
  17.                   ) ;_ end vlax-safearray->list
  18.                   (vlax-safearray->list
  19.                     (variant-value (vlax-get-property entcirc 'center))
  20.                   ) ;_ end vlax-safearray->list
  21.                 ) ;_ end distance
  22. ) ;_ end setq
  23. (vlr-object-reactor (list entcirc entline)
  24.                      (list modangle moddist)
  25.                      '((:vlr-objectClosed . modifyentities))
  26. ) ;_ end vlr-object-reactor
  27. ) ;_ end defun
  28. (defun modifyentities
  29.       (notobj reacobj syslist / ownerslist paramlist adoc)
  30. (setq ownerslist (vlr-owners reacobj))
  31. (setq paramlist (vlr-data reacobj))
  32. (setq adoc (vlax-get-property (vlax-get-acad-object) 'activedocument))
  33. (vlr-remove reacobj)
  34. (cond ((= "AcDbCircle" (vlax-get-property notobj 'ObjectName))
  35.         (vlax-put-property
  36.           (if (= "AcDbCircle" (car ownerslist))
  37.             (cadr ownerslist)
  38.             (car ownerslist)
  39.           ) ;_ end if
  40.           'endPoint
  41.           (vlax-invoke-method (vlax-get-property adoc 'utility)
  42.                               'polarPoint
  43.                               (vlax-get-property notobj 'center)
  44.                               (+ pi (car paramlist))
  45.                               (cadr paramlist)
  46.           ) ;_ end vlax-invoke-method
  47.         ) ;_ end vlax-put-property
  48.        )
  49.        (T
  50.         (vlax-put-property
  51.           (if (= "AcDbCircle" (car ownerslist))
  52.             (car ownerslist)
  53.             (cadr ownerslist)
  54.           ) ;_ end if
  55.           'center
  56.           (vlax-invoke-method (vlax-get-property adoc 'utility)
  57.                               'polarPoint
  58.                               (vlax-get-property notobj 'endPoint)
  59.                               (car paramlist)
  60.                               (cadr paramlist)
  61.           ) ;_ end vlax-invoke-method
  62.         ) ;_ end vlax-put-property
  63.        )
  64. ) ;_ end cond
  65. (vlr-add reacobj)
  66. ) ;_ end defun
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:52:37 | 显示全部楼层
对代码进行快速测试不会显示任何错误。因此,请更详细地描述这个问题。”“有些错误”太模糊了。
回复

使用道具 举报

1

主题

11

帖子

10

银币

初来乍到

Rank: 1

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

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 18:01:12 | 显示全部楼层
如果你移动圆圈,反应堆会导致管线改变。但这种变化反过来又会触发反应堆改变圆,这在那个精确的时刻是不可能的。
两个可能有用的功能:
vlax-read-enabled-p
vlax-write-enabled-p
在这种情况下,也可以使用全局变量,例如“*CallBackIsActiveP*”。
  1. (defun modifyentities (notobj reacobj syslist / ownerslist paramlist adoc)
  2. (if (not *CallBackIsActiveP*)
  3.    (progn
  4.      (setq *CallBackIsActiveP* T)
  5.      ...
  6.      (setq *CallBackIsActiveP* nil)
  7.    )
  8. )
  9. )
回复

使用道具 举报

1

主题

11

帖子

10

银币

初来乍到

Rank: 1

铜币
5
发表于 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),希望它只显示作为所有者的行,但它仍然再次列出这两个对象。我做错了什么?请告知。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 03:25 , Processed in 0.456143 second(s), 74 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表