找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1384|回复: 5

[他山之石] 反应器如何关联多个对象?

[复制链接]

已领礼包: 112个

财富等级: 日进斗金

发表于 2016-7-29 23:47:49 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 革天明 于 2016-7-30 00:10 编辑

如上图所示,建立了一个反应器实现圆与直线关联,当圆的半径发生变化时,直线的长度也发生变化,当直线或圆的位置发生变化时,相对应的圆和直线的位置也发生了变化。现在我想通过添加一个MTEXT,当圆的半径发生变化时,文字的高度也成比例的发生变化,当直线和圆的位置发生变化时,MTEXT的中心点始终位于圆心的位置。下面是我根据网上的例子改写的,但程序运行达不到效果,且会提示:Automation 错误。 对象正在通知

以下是代码部分:
;;条件: 程序生成的一个圆与一条直线.
;;目的: 圆的半径与直线几何关联,直线起点始终位于圆周上,且直线与圆垂直。
;;
(defun C:X1 (/ CIR_EN LIN_EN MYCIR MYLIN P1 P2)
  (if (and (setq P1 (getpoint "\n圆心点:"))
           (setq P2 (getdist P1 "\n圆的半径:"))
           (progn
             (command "_.circle" "non" P1 "non" P2)
             t
           )
           (setq P4 (getpoint P1 "\n直线终点:"))
      )
    (progn
      (setq CIR_EN (entlast)
            MYCIR  (entget CIR_EN)
      )
      (setq P3 (FEI-POINT->CIRCLE P4 MYCIR))
      (command "_.line" "non" P3 "non" P4 "")
      (setq LIN_EN (entlast)
            MYLIN  (entget LIN_EN)
      )
      (entmake (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(100 . "AcDbMText") '(7 . "Standard") '(71 . 5) (cons 40 P2) (cons 1 "01") (cons 10 P1)))
      (setq mtext_en(entlast)
            mymtext(entget mtext_en)
      )
      (vlr-pers
        ;;_圆对象反应器
        (vlr-object-reactor
          (list (vlax-ename->vla-object CIR_EN))
          (list (cdr (assoc 5 mylin)) (cdr (assoc 5 mymtext)))
          '((:vlr-OpenedForModify . CIR-getRadious)
            (:vlr-modified . CIR-CHANG)
           )
        )
      )
      (vlr-pers
        ;;_线对象反应器
        (vlr-object-reactor
          (list (vlax-ename->vla-object LIN_EN))
          (list (cdr (assoc 5 mycir)))
          '((:vlr-modified . LINE-CHANG)
            (:vlr-objectclosed . LINE_END_CHANG)
           )
        )
      )     
      ;;;;;;;;;;;;
    )
  )
)
;;;;;;==============================================================
;;圆现在的半径
(defun CIR-getRadious(OBJ REACTOR-OBJECT PARAMETER-LIST)
  (princ "\n我运行了")
  (setq Radious(vla-get-Radius OBJ))
  (princ Radious)
)
;;;;圆改变时的回调函数
(defun CIR-CHANG
       (OBJ REACTOR-OBJECT PARAMETER-LIST / LIN_EN CIR_EN P11)
  (setq        CIR_EN (vlax-vla-object->ename OBJ)
        LIN_EN (handent (car (vlr-data REACTOR-OBJECT)))
        mtext_en(handent (cadr (vlr-data REACTOR-OBJECT)))
  )
  (vla-put-startpoint
    (vlax-ename->vla-object LIN_EN)
    (vlax-3d-point
      (FEI-POINT->CIRCLE
        (cdr (assoc 11 (entget LIN_EN)))
        (entget CIR_EN)
      )
    )
  )
  (vla-put-Height
    (vlax-ename->vla-object mtext_en) (vla-get-Radius OBJ)
  )
)

;;;;;;==============================================================
;;;;直线改变时的回调函数
(defun LINE-CHANG (OBJ              REACTOR-OBJECT            PARAMETER-LIST
                   /              LIN_EN         CIR_EN            P10
                   P11              R                 CEN
                  )
  (setq        LIN_EN (vlax-vla-object->ename OBJ)
        CIR_EN (handent (car (vlr-data REACTOR-OBJECT)))
  )
  (setq        P10 (cdr (assoc 10 (entget LIN_EN)))
        P11 (cdr (assoc 11 (entget LIN_EN)))
        r   (cdr (assoc 40 (entget cir_EN)))
        CEN (polar p10 (angle p11 P10) r)
  )
  (vla-put-center
    (vlax-ename->vla-object CIR_EN)
    (vlax-3D-point cen)
  )
)
;;;;;;==============================================================
;;;;直线改变后的回调函数
(defun LINE_END_CHANG (OBJ REACTOR-OBJECT PARAMETER-LIST)
  (princ "\n线已修改完成")
  (princ)
)
;;;;;;______________fei-pointt->circle_______________
;;;;;; 方式: (setq pn (vl-point->circle pt date))  
;;;;;; pt-已知点 date-包含圆心和半径的表(圆心 半径)
;;;;;; 返回值pn="pt"到"圆"的垂足点                 
(defun FEI-POINT->CIRCLE (PX EN / PT CEN RAD)
  (setq        CEN (cdr (assoc 10 EN))
        RAD (cdr (assoc 40 EN))
  )
  (setq PT (polar CEN (angle CEN PX) RAD))
)

红色部分为我添加的代码,现在的问题是文字的大小及位置并不会随圆半径的改变比例而改变,位置也不会随之移动。
Automation 错误。 对象正在通知
这是当前运行时出现的错误提示。请问如何才能实现文字高度始终为圆的半径且处于圆心所在的位置?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 112个

财富等级: 日进斗金

 楼主| 发表于 2016-7-29 23:49:03 | 显示全部楼层
反应器.gif
一楼图片被吞了,请看二楼演示
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-7-30 00:11:02 | 显示全部楼层
你把圆和文字做成块,文字用属性,不是更好吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

 楼主| 发表于 2016-7-30 00:15:44 | 显示全部楼层
发现解决方法了!
'((:vlr-OpenedForModify . CIR-getRadious)
            (:vlr-modified . CIR-CHANG)
           )
将红色部分注释掉即可,原理是因为这里的文字高度和圆的半径是正比例关系,所以按上面那样只添加 :vlr-modified里面的代码即可,直接设置文字高度为圆的半径。
这里发现自己之前的思路是获取初始圆的半径,得到修改后圆的半径,计算出比例,然后初始文字高度乘以比例即得到文字应该的高度。思路本身没有问题,但对于文字高度和圆的半径为正比例的情况下,就比较繁琐了,实际上可以直接设置文字高度。

但是:vlr-OpenedForModify为什么得不到初始圆的半径呢?此CIR-getRadious函数已运行但就是获取不到初始圆的半径,请大神能指点一下!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1488个

财富等级: 财源广进

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

使用道具 举报

已领礼包: 6056个

财富等级: 富甲天下

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 20:05 , Processed in 0.408879 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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