找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1032|回复: 8

[求助] [LISP函数]:求助,各位老大帮我看下下面的一段反应器的程序为什么回调函数出错!

[复制链接]
发表于 2007-5-25 22:48:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
(defun c:rct-circ2()
(setq p0 (getpoint "\n输入圆心:"))
(setq r (getdist p0 "\n输入半径:"))
(command"circle" p0 r)
(setq r (* 1.25 r))
(setq ec (entlast))
(setq v_c (list (vlax-ename->vla-object ec)));将圆的图元名转化为VLA对象
(setq p1 (polar p0 0 r))
(setq p2 (polar p0 (* 0.5 pi) r))
(setq p3 (polar p0 pi r))
(setq p4 (polar p0 (* -0.5 pi) r))
(command"line" p1 p3 "")
(setq el1 (entlast));第1条直线的图元名
(setq v_l1 (list (vlax-ename->vla-object el1)));将第1条直线的图元名转化为VLA对象
(command"line" p2 p4 "")
(setq el2 (entlast));第2条直线的图元名
(setq v_l2 (list (vlax-ename->vla-object el2)));将第2条直线的图元名转化为VLA对象
(setq l1-l2 (list v_l1 v_l2));两条直线的VLA对象表
(setq vrl (vlr-pers(vlr-object-reactor v_c l1-l2 '((:vlr-modified . c-21)))))
(princ)
)
(defun c-21(notifier reactor paramete / p0 p1 p2 p3 p4 p0x p0y p0z v_l1 v_l2)
(setq p0 (VLA-get-center notifier));获得圆的圆心,P0为变体
(setq p0 (vlax-variant-value p0));将变体转换为安全数组
(setq p0 (vlax-safearray->list p0));将安全数组转换为表
(setq c_r (* 1.25 (VLA-get-radius notifier)));获得圆半径之后乘以1.25
(setq v_l1 (car reactor));第1条直线的VLA对象
(setq v_l2 (cadr reactor));第2条直线的VLA对象
(setq p0x (car p0));获得圆心的X坐标
(setq p0y (cadr p0));获得圆心的Y坐标
(setq p0z (caddr p0));获得圆心的Z坐标
;计算直线端点的新位置再转换为ActiveX的三维点
(setq p1 (vlax-3d-point (list (+ p0x c_r) p0y p0z)))
(setq p2 (vlax-3d-point (list  p0x (+ p0y c_r) p0z)))
(setq p3 (vlax-3d-point (list (- p0x c_r) p0y p0z)))
(setq p4 (vlax-3d-point (list  p0x (- p0y c_r) p0z)))
(vla-put-startpoint v_l1 p1)
(vla-put-endpoint v_l1 p2)
(vla-put-startpoint v_l1 p3)
(vla-put-endpoint v_l1 p4)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-5-26 09:41:29 | 显示全部楼层
反应器,学了一点皮毛。
1.首先,少了一句(vl-load-com)
2.其次,这里我就不懂为什么要这样子???l1-l2这个位置应该是字符串或者不写。
怎么会是两条直线的VLA对象表?
[php](setq vrl (vlr-pers(vlr-object-reactor v_c l1-l2 '((:vlr-modified . c-21)))))
;;;(vlr-object-reactor owners data callbacks)
;;;参数 data 为任意要与反应器对象关联的 AutoLISP 数据。若没有数据则为 nil。
;;;来个例子吧:
(setq circleReactor (vlr-object-reactor (list myCircle) "Circle Reactor" '((:vlr-modified . print-radius))))
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-5-26 10:32:03 | 显示全部楼层
将1楼的代码改进后,帖于下:

  1. ;;反应器练习------标记点位
  2. ;;日期:2007-05-25
  3. (defun C:RCT-CIRC2 ()
  4.     (if        (and (setq P0 (getpoint "\n输入圆心:"))
  5.              (setq R (getdist P0 "\n输入半径:"))
  6.         )
  7.         (progn
  8.             ;;绘制圆
  9.             (command "_.circle" "non" P0 "non" R)
  10.             (setq R (* 1.25 R))
  11.             (setq EC (entlast))
  12.             (setq V_C (list (vlax-ename->vla-object EC)))
  13.             ;;计算点位
  14.             (setq P1 (polar P0 0 R))
  15.             (setq P2 (polar P0 (* 0.5 pi) R))
  16.             (setq P3 (polar P0 pi R))
  17.             (setq P4 (polar P0 (* -0.5 pi) R))
  18.             ;;第1条直线
  19.             (command "_.line" "non" P1 "non" P3 "")
  20.             (setq EL1 (entlast))
  21.             (setq H1 (cdr (assoc 5 (entget EL1))))
  22.             ;;第2条直线
  23.             (command "_.line" "non" P2 "non" P4 "")
  24.             (setq EL2 (entlast))
  25.             (setq H2 (cdr (assoc 5 (entget EL2))))
  26.             ;;创建反应器
  27.             (setq VRL
  28.                      (vlr-pers
  29.                          (vlr-object-reactor
  30.                              V_C
  31.                              (list H1 H2)
  32.                              '((:vlr-modified . C-21))
  33.                          )
  34.                      )
  35.             )
  36.         )
  37.     )
  38.     (princ)
  39. )
  40. (defun C-21 (NOTIFIER REACTOR PARAMETE / P0 P1 P2 P3 P4        P0X P0Y        P0Z V_L1
  41.              V_L2)
  42.     ;;获取圆心坐标
  43.     (setq P0 (vla-get-center NOTIFIER))
  44.     (setq P0 (vlax-variant-value P0))
  45.     (setq P0 (vlax-safearray->list P0))
  46.     ;;获取圆半径之后乘以1.25
  47.     (setq C_R (* 1.25 (vla-get-radius NOTIFIER)))

  48.     ;;获取直线对象
  49.     (setq E1 (handent (car (vlr-data REACTOR)))
  50.           E2 (handent (cadr (vlr-data REACTOR)))
  51.     )
  52.     ;;直线起终点坐标计算
  53.     (setq P1 (vlax-3d-point (polar P0 0 C_R))
  54.           P2 (vlax-3d-point (polar P0 (* 0.5 pi) C_R))
  55.           P3 (vlax-3d-point (polar P0 pi C_R))
  56.           P4 (vlax-3d-point (polar P0 (* 1.5 pi) C_R))
  57.     )
  58.     ;;修改直线位置
  59.     (vla-put-startpoint (vlax-ename->vla-object E1) P1)
  60.     (vla-put-endpoint (vlax-ename->vla-object E1) P3)
  61.     (vla-put-startpoint (vlax-ename->vla-object E2) P2)
  62.     (vla-put-endpoint (vlax-ename->vla-object E2) P4)
  63.     (princ)
  64. )

请体会对象句柄在其中的应用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-5-27 09:57:02 | 显示全部楼层
啊啊。。。。
学到了,原来还不理解data的意思呢。。。不过还是有很多都不懂。。。
期待能有更多关于反应器的资料、问题、例子出现。。。。呵呵好兴奋哟。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-5-27 14:36:03 | 显示全部楼层
在回调函数中不能有COMMAND函数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-5-27 22:57:30 | 显示全部楼层
请问zml84 ,类似的一个实体与其它实体关联的反应器,是不是都必须用实体的handle做为反应哭的DATA来建立关联?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-5-28 08:48:20 | 显示全部楼层
最初由 oyxx_1023 发布
[B]请问zml84 ,类似的一个实体与其它实体关联的反应器,是不是都必须用实体的handle做为反应哭的DATA来建立关联? [/B]


看来好多人与我一样,刚接触对象反应器时对DATA数据的理解有误区。
对象反应器中的data数据,实际上就是用户附加在反应器上的用户数据。她的类型可以是数字、字符串、表等,但不可以是函数。
关于关联问题,因为你的目的是要操作某一个或几个感兴趣的对象,所以就要使用能够表示对象身份的数据。
从这个意义上讲,图元名、VLA对象名、arxID、句柄handle均可以作为标识数据。
<br>
而句柄在图档中是唯一的,她也是跟随对象终生的,就算对象被删除了,这个句柄也是不会分配给其他对象的。
真有点从一而终的味道。
所以我选择了她。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-5-28 12:46:29 | 显示全部楼层
总是觉得反应器的用处不是很大,又很麻烦,所以一只不肯学,现在看来还是有必要研究一下的!感谢zml84!
请问带反应器对象复制后,反应器能否一同复制过去,如何实现呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-5-28 14:57:25 | 显示全部楼层
反应器技术,是实现对象智能化的捷径。
关于8楼的问题,讨论如下:
某一图元对象A被附着对象反应器A1后,对图元A进行复制操作形成新对象B,这个过程是不会激发对象反应器A1的,反应器A1也不会随之一同被复制。
1、不会激发反应器A1,是因为,复制这个操作并没有对原图元对象A的各项特性进行编辑。
2、反应器A1不会随A复制,是因为,反应器回调函数中可能会对除原对象外的其他对象(假设为C)进行操作,也就是说A与C之间确立了一种链接的关系。若再将回调函数中要操作的对象C链接到复制后的新对象B上,如同一女被嫁二夫,原来确立的关系就会被打乱。
<br>
若真的想实现将反应器一同复制过去,需要自己编写复制过程。
就是说在复制时若检测到对象A上有反应器A1,则先将反应器指向数据中的对象C复制同对象A起复制,得到新对象B、D,然后根据反应器A1的类型,创建一个新的反应器B1,附着于对象B。
复制结束。
<br>
我的观点是:一般对象反应器是在程序内部根据需要而设置的。程序生成之后再去COPY是没有技术应用背景的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 10:58 , Processed in 0.251374 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表