- 积分
- 3124
- 明经币
- 个
- 注册时间
- 2007-1-20
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2012-7-25 23:39:28
|
显示全部楼层
本帖最后由 woaishuijia 于 2012-7-25 23:55 编辑
没办法,VBA是微软的产品,LSP是AutoDesk自己的,自己的孩子自己当然重视了,呵呵.
所以,只用VBA,有的时候真会受限制,还是两个都会用才好,既能发挥VBA功能强大的优势,也可以用LSP做一下必要的补充.
其实我自用的VBA宏都是用LSP引导的,无论是否需要透明操作.而且我把这些用于引导的LSP统一做到"acaddoc.lsp"文件中,放在支持目录下,每打开或新建一个文档就自动加载这些自定义命令,使用时只要在命令行键入特定的自定义命令,就能自动加载并运行相应的VBA宏.
另外,MCCAD管理员的帖子貌似也有问题,尽管可以在选择对象之后执行LSP自定义命令,再用VLA函数运行VBA宏,但宏过程结束时,并不能自动清除 PickfirstSelectionSet 中的项目,且 PickfirstSelectionSet 对象是只读的, 所以也没有办法在VBA宏中清除它(至少我没找到这样的方法).这样在重复多次选择时很麻烦.
所以我的办法比管理员的还要复杂,我是在VLSP中检查 PickfirstSelectionSet 对象的 Count 属性,只要该选择集不为空,就新建一个命名选择集,再把 PickfirstSelectionSet 中的对象添加到命名选择集中,最后还是使用"VL-VBARUN"函数运行VBA宏,这样可以利用这个命令清除 PickfirstSelectionSet 中的对象.而在VBA宏中直接检索和使用命名选择集.
下面是我的透明命令的LSP引导程序
- (defun c:gc (/ doc PickfirstSel selcount mysel i ent)
- (setvar "CMDECHO" 0)
- (vl-load-com) ;将 Visual LISP 扩展功能加载到 AutoLISP
- (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))
- ;当前文档
- PickfirstSel (vla-get-PickfirstSelectionSet doc)
- ;PickfirstSelectionSet 对象
- selcount (vla-get-count PickfirstSel)
- ;PickfirstSelectionSet 对象的 count 属性
- )
- (if (not (zerop selcount)) ;检查 PickfirstSelectionSet 对象的 count 属性是否为 0
- (progn ;PickfirstSelectionSet 对象的 count 属性是不为 0 时
- (setq mysel (vla-add (vla-get-selectionsets doc) "SS" )
- ;用 selectionsets 集合的 add 方法新建一个名为"SS"的选择集
- ent (vlax-make-safearray vlax-vbobject '(0 . 0))
- ;创建一个上,下标均为 0 的对象型数组
- i -1 ;初始化循环变量
- )
- (repeat selcount ;循环.循环次数为 PickfirstSelectionSet 对象的 count 属性值
- (setq i (1+ i)) ;循环变量递加
- (vlax-safearray-put-element ;把 PickfirstSelectionSet 对象中的第 i 个对象添加到数组
- ent
- 0
- (vla-item PickfirstSel i)
- )
- (vla-additems mysel ent) ;用选择集对象的 additems 方法把数组中的对象添加到"SS"选择集
- )
- )
- )
- (vl-vbarun "公差与配合.dvb!gc" ) ;加载并运行 VBA 宏,同时借此命令清除 PickfirstSelectionSet 中的所有项目
- (setvar "CMDECHO" 1)
- (princ)
- )
|
|