乐筑天下

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

一个程序,请各位高手看一看

[复制链接]
hpy

10

主题

119

帖子

14

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
154
发表于 2003-12-25 20:47:00 | 显示全部楼层 |阅读模式
下面这个程序是一本书上的。它的功能是给圆添加中心线并使中心线随着圆的改变而改变。
在使用中觉得程序有一点点问题。具体表现在如果对圆进行了编辑(比如拉伸、移动等)后
如果进行"undo"操作,在2002中会出现提示:错误:Automation错误,未提供说明。
如果再对圆进行编辑则中心线不再随着圆的改变而改变。在AutoCAD2004中不会出现错误提示,
但如果再对圆进行编辑则中心线也不再随着圆的改变而改变。
    请各位高手看一看,帮忙解决一下这个问题。另外该程序一次只能对一个圆添加中心线,如果
能对多个圆添加中心线那就更好了。
(defun c:ccen ()
    (setvar "CMDECHO" 0)
    (vl-load-com) ;;加载visualisp延伸功能
    (setq acadobject (vlax-get-acad-object))
    (setq acadDocument (vla-get-ActiveDocument acadobject))
    (setq mspace (vla-get-ModelSpace acadDocument))
    (setq util (vla-get-Utility acadDocument))
    (setq lts (vla-get-Linetypes acadDocument))
    ;;获取模型空间变量,utility变量与线型变量
    (setq selsets (vla-get-Selectionsets acadDocument)) ;;获取当前图形中的选择集
    (setq i (vla-get-Count selsets)) ;;将选到的变量存在变量i中
    (while (> i 0)
        (setq sset (vla-item selsets 0))
        (vla-delete sset)
        (setq i (- i 1))
    )  ;;;这个程序是说:如果选择集中有图元存在,则将其从选择集中删除,
       ;;;注意:这并不会从图面上真正删除图元。
    (setq sset (vla-add selsets "sset"))
    ;;新建选择集sset,如果没有以上的准备工作,则在下一次执行程序时,由于
    ;;sset选择集已存在,执行到此就无法新建一个同名选择集,程序会提示一
    ;;错误信息
    (vla-SelectOnScreen sset)
    (setq notallcircle nil) ;;设定变量notallcircle来判断是或所选对象为圆
    (setq ssetcount (vla-get-count sset)) ;;获取选择集中图元数量
    (while (> ssetcount 0)
        (setq obj (vla-item sset (- ssetcount 1)))
        (setq objname (vla-get-objectname obj))
        (if (/= objname "AcDbCircle")
            (setq notallcircle t)
        )
       (setq ssetcount (- ssetcount 1))
     ) ;;上面的循环程序用来判断是或所选图元均为圆(用图元名判断)若非,设定变量notallcircle为t
     (while (and (vla-get-count sset) notallcircle)
         (prompt "所选图元中至少有一非圆的图元,请再选一次,或按ESC结束!")
         (vla-clear sset)
         (vla-SelectOnScreen sset)
         (setq notallcircle nil)
         (setq ssetcount (vla-get-count sset))
     (while (> ssetcount 0)
         (setq obj (vla-item sset (- ssetcount 1)))
         (setq objname (vla-get-objectname obj))
         (if (/= objname "AcDbCircle")
             (setq notallcircle t)
         )
        (setq ssetcount (- ssetcount 1))
      ))
      (setq circ-d (vla-get-Radius obj))
      (setq circ-cen (vla-get-center obj))
      (setq pt (vla-PolarPoint util circ-cen 0 (+ 5 circ-d)))
      (setq line (vla-addline mspace circ-cen pt))
      (load-line-types "CENTER" "acad.lin")
      (vla-put-Linetype line "CENTER")
      (setq lts (/ circ-d 5))
      (vla-put-LinetypeScale line lts)
      (setq linearray (vla-ArrayPolar line 4 (/ (* pi 2 (1- 4)) 4) circ-cen))
      (vla-delete sset)
      (setq circleReactor (VLR-Object-Reactor (list obj) "circle Reactor"
           '((:VLR-modified . mark))))
)
(defun load-line-types (line-type file-name / tmp res)
     (if (and (setq tmp (vlax-get-acad-object))
         (setq tmp (vla-get-activedocument tmp))
         (setq tmp (vla-get-linetypes tmp))
     )
     (if (setq res (find-line-type line-type tmp))
         res
         (progn (vla-load tmp line-type file-name)
            (if (vla-item tmp line-type)
                (vla-item tmp line-type) nil)
            )
          ) nil
      )
)
(defun find-line-type (line-type line-type-collection / res)
    (setq line-type (strcase line-type))
    (vlax-for 1-obj line-type-collection (if (= (strcase
              (vla-get-name 1-obj)) line-type)
              (setq res 1-obj)
     )) res
)
(defun mark (notifier-object reactor-object parameter-list)
    (vl-load-com)
    (setq circ-d (vla-get-Radius obj))
    (setq circ-cen (vla-get-center obj))
    (setq pt (vla-PolarPoint util circ-cen 0 (+ 5 circ-d)))
    (vla-delete line)
    (setq linesafearray (vlax-variant-value linearray))
    (vla-delete (vlax-safearray-get-element linesafearray 0))
    (vla-delete (vlax-safearray-get-element linesafearray 1))
    (vla-delete (vlax-safearray-get-element linesafearray 2))
    (setq line (vla-addline mspace circ-cen pt))
    (load-line-types "CENTER" "acad.lin")
    (vla-put-Linetype line "CENTER")
    (setq lts (/ circ-d 5))
    (vla-put-LinetypeScale line lts)
    (setq linearray (vla-ArrayPolar line 4 (/ (* pi 2 (1- 4)) 4) circ-cen))
)
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2003-12-25 21:50:00 | 显示全部楼层
这个程序存在很大的问题,就是在回调函数全部使用的全局变量,这样的程序没有太大的用处,因为稍有变化,它就会发生错误。
当然,你说的这种错误在一般的反应器中都存在的,我也没见过对这种错误的说明,我的提示里有说明这个对象正在被undo使用
回复

使用道具 举报

29

主题

1152

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1268
发表于 2004-4-2 12:42:00 | 显示全部楼层
;;程序測試
;;試試以下的程序,使用永久反應裝置
;;進行"undo"操作,也不會有錯誤
;;By 龍龍仔(LUCAS)
CL_REACTOR.VLX
       
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:torxpbyriw4.zip 
下载次数:0  文件大小:2.08 KB  售价:2银币 [记录]
下载权限: 不限 以上或 Vip会员   [开通Vip]   [签到领银币]  [免费赚银币]

回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-8-15 17:43 , Processed in 4.045754 second(s), 64 queries .

© 2020-2025 乐筑天下

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