PickFirstSelectionSet 失效,count为0
本帖最后由 Flyingdancing 于 2012-7-25 12:05 编辑Sub CAL()
Dim sel As AcadSelectionSet
Dim sum As Double
Dim ent As AcadEntity
Dim dimaln As AcadDimAligned
Dim a As New DataObject
On Error Resume Next
Set sel = ThisDrawing.PickfirstSelectionSet
If sel.Count = 0 Then sel.SelectOnScreen
For Each ent In sel
Set dimaln = ent
sum = sum + dimaln.TextOverride
Next
a.SetText sum
a.PutInClipboard
End Sub重点:
我把这个宏做成工具栏按钮后,启动就失效,直接跳到屏幕选择
而先选,然后手动到VBE中F5或者F8,都能够正确运行
请问这是什么情况?
你工具栏按钮加了^c^c了吧,这会取消所有的命令。要不就是你的pickfirst环境变量是0,应该为1才行 chmenf087 发表于 2012-7-25 19:32 static/image/common/back.gif
你工具栏按钮加了^c^c了吧,这会取消所有的命令。要不就是你的pickfirst环境变量是0,应该为1才行
直接VBA设置的菜单:
application.MenuGroups.Item(0).Toolbars("个人工具").AddToolbarButton(0,"xx","","路径")
这条命令会加^C^C么?
PICKFIRST确实为1 "VBARUN"命令不支持先选择后操作.
想实现先选择后操作,就得回避"VBARUN".要么像你现在这样在VBAIDE中用"F5"或"F8"运行VBA宏,要么就用LSP引导
可以参见这个帖子
命令行执行VBA程序,先选择后操作,透明命令 本帖最后由 Flyingdancing 于 2012-7-25 21:27 编辑
woaishuijia 发表于 2012-7-25 21:15 static/image/common/back.gif
"VBARUN"命令不支持先选择后操作.
想实现先选择后操作,就得回避"VBARUN".要么像你现在这样在VBAIDE中用"F5 ...
谢了
这样就要做成公用接口了,要不每次做新程序都得lisp添加,烦死……
CAD也够狠,明明能做到的功能不给VBA 本帖最后由 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
(setqdoc (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)
)
woaishuijia 发表于 2012-7-25 23:39
没办法,VBA是微软的产品,LSP是AutoDesk自己的,自己的孩子自己当然重视了,呵呵.
所以,只用VBA,有的时候真会 ...
老师厉害!感谢分享。 我一般是把vba改成vb6,这样可以用PickFirstSelectionSet ,但也有不好之处,如一般不能用命令,大量数据交互会很慢等
页:
[1]