明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 963|回复: 8

添加所有多段线图形到一个集合出错

[复制链接]
发表于 2015-4-14 14:28:50 | 显示全部楼层 |阅读模式
我在一个dwg文件中只画了两个封闭的多段线图形,为什么运行下面这段话后msgbox显示是181,而不是2?图上只有2个,如果要只选中这两个多段线图形到集合,该怎么改?谢谢!
Dim myset As AcadSelectionSet
  ThisDrawing.SelectionSets("drawletter").Delete
  Set myset = ThisDrawing.SelectionSets.Add("drawletter")
  myset.Select acSelectionSetAll
MsgBox myset.Count
发表于 2015-4-14 22:10:27 | 显示全部楼层
你既然能输出myset.Count,为什么 就不能输出更多的信息,看看都有什么 ??
下面代码、加在你的代码后面

Dim obj As AcadObject
For Each obj In myset
    Debug.Print obj.ObjectName
Next obj
发表于 2015-4-14 22:12:52 | 显示全部楼层
object.Select Mode[, Point1][, Point2][, FilterType][, FilterData]

Object

SelectionSet
使用该方法的对象。

Mode

AcSelect 常数; 仅用于输入

acSelectionSetWindow

acSelectionSetCrossing

acSelectionSetPrevious

acSelectionSetLast

acSelectionSetAll

Point1

Variant[变体] (双精度数组); 仅用于输入; 可选项
指定 Point1 的三维 WCS 坐标,或坐标数组。查看模式定义以正确使用 Point1。

Point2

Variant[变体] (三元素双精度数组); 仅用于输入; 可选项
指定 Point2 的三维 WCS 坐标。查看模式定义以正确使用 Point2。

FilterType

Variant[变体](整数数组); 仅用于输入; 可选项
指定使用的过滤器类型的 DXF 组码。

FilterData

Variant[变体](变体数组); 仅用于输入; 可选项
过滤器的值。
--------------------
过滤选择研究下后面的两个参数,或者在本论坛的随意找一个相关的帖子,就能找到你想要的
 楼主| 发表于 2015-4-18 10:10:29 | 显示全部楼层
zzyong00 发表于 2015-4-14 22:12
object.Select Mode[, Point1][, Point2][, FilterType][, FilterData]

Object

谢谢!不过我又出新问题了^_^
运行下面这段程序时,会出现“运行时错误,找不到主键”,我调试了发现是If  EndIf 这段出的错,我猜是找不到item("drawletter")这个集,因为如果我先添加上一个drawletter集后,运行这段话就不会有错误提示了。  请教下怎么改比较好?

第二个问题,我发现下面这段话运行时把布局视图里的多段线也添加到drawletter里了,但是我是只想把绘图窗口里的多段线添加到drawletter里的,这个怎么办?

谢谢!

Sub kk()
Dim myset As AcadSelectionSet
Dim obj As AcadObject
Dim FilterType(0) As Integer
Dim FilterData(0) As Variant

If Not IsNull(ThisDrawing.SelectionSets.Item("drawletter")) Then
   Set myset = ThisDrawing.SelectionSets.Item("drawletter")
  myset.Delete
End If


Set myset = ThisDrawing.SelectionSets.Add("drawletter")
    FilterType(0) = 0
    FilterData(0) = "*POLYLINE"
    myset.Select acSelectionSetAll, , , FilterType, FilterData

   MsgBox myset.Count
  
  For Each obj In myset
    Debug.Print obj.ObjectName
  Next obj
  myset.Item(0).Highlight True
End Sub
发表于 2015-4-18 19:28:18 | 显示全部楼层
baneit319 发表于 2015-4-18 10:10
谢谢!不过我又出新问题了^_^
运行下面这段程序时,会出现“运行时错误,找不到主键”,我调试了发现是 ...

你哪是抄的别人的代码吧,还不全,isnull这里是自定义函数吧?
还是看这里吧http://bbs.mjtd.com/thread-111783-1-1.html
 楼主| 发表于 2015-4-19 12:09:50 | 显示全部楼层
zzyong00 发表于 2015-4-18 19:28
你哪是抄的别人的代码吧,还不全,isnull这里是自定义函数吧?
还是看这里吧http://bbs.mjtd.com/thread ...

IsNull不是自定义的,我在help里查了,是有这个函数的,我以前的excel Vba 里用了也是有IsNull这个函数的。

应该不是错在 IsNull, 而是错在第一次运行时,找不到selectionsets.item("drawletter")这个。


下面是IsNull的用法



IsNull 函数      
返回 Boolean 值,指出表达式是否不包含任何有效数据 (Null)。
语法
IsNull(expression)

必要的 expression 参数是一个 Variant,其中包含数值表达式或字符串表达式。

说明

如果 expression 为 Null,则 IsNull 返回 True;否则 IsNull 返回 False。如果 expression 由多个变量组成,则表达式的任何作为变量组成成分的 Null 都会使整个表达式返回 True。

Null 值指出 Variant 不包含有效数据。Null 与 Empty 不同,后者指出变量尚未初始化。Null 与长度为零的字符串 (““) 也不同,长度为零的字符串指的是空串。

重要 使用 IsNull 函数是为了确定表达式是否包含 Null 值的。在某些情况下,希望表达式取值为 True,比如希望 If Var = Null 和 If Var <> Null 取值为 True,而它们总取值为 False。这是因为任何包含 Null 的表达式本身就是 Null,所以为 False。

点评

"isnull这里是自定义函数吧",你好好看看我说的!  发表于 2015-4-19 14:20
 楼主| 发表于 2015-4-19 12:49:43 | 显示全部楼层
zzyong00 发表于 2015-4-18 19:28
你哪是抄的别人的代码吧,还不全,isnull这里是自定义函数吧?
还是看这里吧http://bbs.mjtd.com/thread ...

我找到了一个解决方法,在前面加了on error resume next 就行。但是我觉得这样不保险,我想另外找个方法,解决找不到selectionset.item("drawletter")的问题。

点评

给你个网址,你也是不爱看,只能帮人帮到底,送佛送到西了  发表于 2015-4-19 14:37
对错误不进行控制,不是编程应有的态度  发表于 2015-4-19 14:22
发表于 2015-4-19 14:27:42 | 显示全部楼层
本帖最后由 zzyong00 于 2015-4-19 14:32 编辑

  1. Private Sub SelectLots(ByVal Ssetname As String, _
  2.     ByVal objName As String, _
  3.     Optional strPrompt As String = "请选择单行文本,可以框选" & vbCrLf)
  4.     'Ssetname 新建选择集的名
  5.    'objName 要选择对象的名,可以文字对象,也可以是直线或其它任何acad实体
  6.    'strPrompt 选择时提示的文字
  7.     Dim sSetObj As AcadSelectionSet, flag As Boolean

  8.     For Each sSetObj In ThisDrawing.SelectionSets

  9.         If sSetObj.name = Ssetname Then
  10.             flag = True
  11.             Exit For
  12.         End If

  13.     Next

  14.     If flag Then sSetObj.Delete                                                 '创建集合,如集存在,则删除,新建
  15.     Set sSetObj = ThisDrawing.SelectionSets.Add(Ssetname)

  16.     Dim gpCode(0)    As Integer

  17.     Dim dataValue(0) As Variant

  18.     gpCode(0) = 0
  19.     dataValue(0) = objName

  20.     Dim groupCode As Variant, dataCode As Variant

  21.     groupCode = gpCode
  22.     dataCode = dataValue
  23.     ThisDrawing.Utility.Prompt strPrompt
  24.     sSetObj.SelectOnScreen groupCode, dataCode
  25. End Sub

  26. Sub kk()
  27. Dim myset As AcadSelectionSet
  28. Dim obj As AcadObject
  29. SelectLots "drawletter", "*POLYLINE"
  30. Set myset = ThisDrawing.SelectionSets("drawletter")
  31. if  myset.Count=0 then exit sub
  32.   For Each obj In myset
  33.     Debug.Print obj.ObjectName
  34.   Next obj
  35.   myset.Item(0).Highlight True
  36. End Sub
 楼主| 发表于 2015-4-19 19:13:50 | 显示全部楼层
谢谢,这个问题解决了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 12:25 , Processed in 0.168364 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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