明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2310|回复: 7

PickFirstSelectionSet 失效,count为0

[复制链接]
发表于 2012-7-25 10:46:27 | 显示全部楼层 |阅读模式
本帖最后由 Flyingdancing 于 2012-7-25 12:05 编辑
  1. Sub CAL()
  2. Dim sel As AcadSelectionSet
  3. Dim sum As Double
  4. Dim ent As AcadEntity
  5. Dim dimaln As AcadDimAligned
  6. Dim a As New DataObject


  7. On Error Resume Next
  8. Set sel = ThisDrawing.PickfirstSelectionSet
  9. If sel.Count = 0 Then sel.SelectOnScreen

  10. For Each ent In sel
  11. Set dimaln = ent
  12. sum = sum + dimaln.TextOverride
  13. Next
  14. a.SetText sum
  15. a.PutInClipboard
  16. End Sub
重点:
我把这个宏做成工具栏按钮后,启动就失效,直接跳到屏幕选择

而先选,然后手动到VBE中F5或者F8,都能够正确运行

请问这是什么情况?


发表于 2012-7-25 19:32:52 | 显示全部楼层
你工具栏按钮加了^c^c了吧,这会取消所有的命令。要不就是你的pickfirst环境变量是0,应该为1才行
 楼主| 发表于 2012-7-25 20:42:46 | 显示全部楼层
chmenf087 发表于 2012-7-25 19:32
你工具栏按钮加了^c^c了吧,这会取消所有的命令。要不就是你的pickfirst环境变量是0,应该为1才行

直接VBA设置的菜单:
application.MenuGroups.Item(0).Toolbars("个人工具").AddToolbarButton(0,"xx","","路径")
这条命令会加^C^C么?
PICKFIRST确实为1
发表于 2012-7-25 21:15:42 | 显示全部楼层
"VBARUN"命令不支持先选择后操作.
想实现先选择后操作,就得回避"VBARUN".要么像你现在这样在VBAIDE中用"F5"或"F8"运行VBA宏,要么就用LSP引导
可以参见这个帖子
命令行执行VBA程序,先选择后操作,透明命令
 楼主| 发表于 2012-7-25 21:25:58 | 显示全部楼层
本帖最后由 Flyingdancing 于 2012-7-25 21:27 编辑
woaishuijia 发表于 2012-7-25 21:15
"VBARUN"命令不支持先选择后操作.
想实现先选择后操作,就得回避"VBARUN".要么像你现在这样在VBAIDE中用"F5 ...

谢了
这样就要做成公用接口了,要不每次做新程序都得lisp添加,烦死……
CAD也够狠,明明能做到的功能不给VBA
发表于 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引导程序
  1. (defun c:gc (/ doc PickfirstSel selcount mysel i ent)
  2.   (setvar "CMDECHO" 0)
  3.   (vl-load-com)        ;将 Visual LISP 扩展功能加载到 AutoLISP
  4.   (setq  doc       (vla-get-ActiveDocument (vlax-get-acad-object))
  5.           ;当前文档
  6.   PickfirstSel (vla-get-PickfirstSelectionSet doc)
  7.           ;PickfirstSelectionSet 对象
  8.   selcount     (vla-get-count PickfirstSel)
  9.           ;PickfirstSelectionSet 对象的 count 属性
  10.   )
  11.   (if (not (zerop selcount))    ;检查 PickfirstSelectionSet 对象的 count 属性是否为 0
  12.     (progn        ;PickfirstSelectionSet 对象的 count 属性是不为 0 时
  13.       (setq mysel (vla-add (vla-get-selectionsets doc) "SS" )
  14.           ;用 selectionsets 集合的 add 方法新建一个名为"SS"的选择集
  15.       ent    (vlax-make-safearray vlax-vbobject '(0 . 0))
  16.           ;创建一个上,下标均为 0 的对象型数组
  17.       i    -1      ;初始化循环变量
  18.       )
  19.       (repeat selcount      ;循环.循环次数为 PickfirstSelectionSet 对象的 count 属性值
  20.   (setq i (1+ i))      ;循环变量递加
  21.   (vlax-safearray-put-element  ;把 PickfirstSelectionSet 对象中的第 i 个对象添加到数组
  22.     ent
  23.     0
  24.     (vla-item PickfirstSel i)
  25.   )
  26.   (vla-additems mysel ent)  ;用选择集对象的 additems 方法把数组中的对象添加到"SS"选择集
  27.       )
  28.     )
  29.   )
  30.   (vl-vbarun "公差与配合.dvb!gc" )  ;加载并运行 VBA 宏,同时借此命令清除 PickfirstSelectionSet 中的所有项目
  31.   (setvar "CMDECHO" 1)
  32.   (princ)
  33. )

发表于 2020-7-3 15:25:38 | 显示全部楼层
woaishuijia 发表于 2012-7-25 23:39
没办法,VBA是微软的产品,LSP是AutoDesk自己的,自己的孩子自己当然重视了,呵呵.
所以,只用VBA,有的时候真会 ...

老师厉害!感谢分享。
发表于 2020-7-4 21:52:21 | 显示全部楼层
我一般是把vba改成vb6,这样可以用PickFirstSelectionSet ,但也有不好之处,如一般不能用命令,大量数据交互会很慢等
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 04:42 , Processed in 0.157911 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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