- 积分
- 3124
- 明经币
- 个
- 注册时间
- 2007-1-20
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2013-10-2 16:24:56
|
显示全部楼层
本以为你这段代码是试验用的,只针对特殊情况.原来你在做面域这一步就理解错了
下面详细剖析一下你这段代码- On Error Resume Next
- Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("example")
- If Err.Number <> 0 Then
- Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("example")
- ssetObj.Clear
- End If
复制代码 On Error Resume Next 这一行是为下面的创建选择集及条件语句服务的,这本没有问题,但这一段执行后,后面的语句依然按On Error Resume Next 无条件向下执行,就把你后面的创建面域及布尔运算代码中存在的错误掩盖了.如果在上面的代码下面加一行可能会帮助你在调试中更早地发现代码中的问题.
另外,用过的 Err 值建议及时清理.就是在 End If 前增加一行当然,在这个小程序中看似不必,但在大一些的程序中就有用处了,可以避免不必要的错误.
还有,一个选择集用过后,也要及时删除.不要过分依赖错误陷井.
就是在从选择集中提取图元后应增加一行继续看下面一段- ssetObj.SelectOnScreen
- Set RoomObjects(0) = ssetObj(0)
- Set curvers(0) = RoomObjects(0)
- Set RoomObjects(1) = ssetObj(1)
- Set curvers(1) = RoomObjects(1)
- Set RoomObjects(2) = ssetObj(2)
- Set curvers(2) = RoomObjects(2)
- regions = acadApp.ActiveDocument.ModelSpace.AddRegion(curvers)
- Set RoundRoomObja = regions(0)
- Set RoundRoomObjb = regions(1)
- Set RoundRoomObjc = regions(2)
复制代码 第1行从屏幕选择没问题
第2行到第7行,昨天让我有些费解,看不懂你为什么要给 RoomObjects(0 To 2) 这个数组赋值, 因为这个数组变量在后面的代码中并没有出现.今天看了你的回帖,我想我懂你的心思了.你是不是打算当用户在屏幕上选择时,选择的图元中既可能有现有的面域,也可能有构成面域边界的直线或曲线,然后创建面域时,现有的面域和根据边界新建的面域都返回到变体变量 regions 中,再全体并集?
如果我猜得不错的话,你代码的问题就找到了.
AddRegion 方法的参数是一个图元对象数组,该数组中的图元只能是Line、Arc、Circle、Elliptical Arc、LightweightPolyline 和Spline.这些图元必须是共面的,首尾相连的构成封闭图形,且不许自交.
从你这段代码看,你共选择了3个图元(因为你的数组只有3个元素),要做成3个面域,你就只能选择3个圆或椭圆或封闭多段线(比如矩形)或二维封闭样条曲线才行.
如果你打算在可供选择的图元中增加现有的面域,就只能在选择后,遍历选择集元素,查看其类型,找出现有的面域,赋值给特定的变量后再把其它图元赋值给边界对象数组.然后再用 AddRegion 方法新建面域.
下面的代码是在你的基础上修改的,供参考 - Private Sub Command14_Click()
- Dim RoomObjects(0 To 2) As AcadRegion
- Dim curvers() As AcadEntity
- Dim ssetObj As AcadSelectionSet
- On Error Resume Next
- Set ssetObj = acadApp.ActiveDocument.SelectionSets.Add("example")
- If Err Then
- Set ssetObj = acadApp.ActiveDocument.SelectionSets.Item("example")
- ssetObj.Clear
- Err.Clear
- End If
- Dim FT(6) As Integer, FD(6) As Variant, E As AcadEntity, I As Integer, J As Integer, K As Integer
- FT(0) = -4: FD(0) = "<OR"
- FT(1) = 0: FD(1) = "Circle"
- FT(2) = 0: FD(2) = "Ellipse"
- FT(3) = 0: FD(3) = "LWPolyline"
- FT(4) = 0: FD(4) = "SPLine"
- FT(5) = 0: FD(5) = "Region"
- FT(6) = -4: FD(6) = "OR>"
- ssetObj.SelectOnScreen FT, FD
- For Each E In ssetObj
- If E.ObjectName = "AcDbRegion" Then
- Set RoomObjects(I) = E
- I = I + 1
- Else
- ReDim Preserve curvers(J)
- Set curvers(J) = E
- J = J + 1
- End If
- Next
- ssetObj.Delete
- Dim regions As Variant
- If I < 3 Then
- regions = acadApp.ActiveDocument.ModelSpace.AddRegion(curvers)
- If Err Then
- MsgBox "边界错误", vbCritical, "AutoCAD"
- Exit Sub
- End If
- End If
- For J = I To 2
- Set RoomObjects(J) = regions(J - I)
- Next
- For I = 1 To 2
- RoomObjects(0).Boolean acUnion, RoomObjects(I)
- Next
- acadApp.ActiveDocument.Regen True
- ZoomExtents
- End Sub
其中第3行,声明数组改为动态数组,目的是使数组元素数与实际构成新建面域边界的图元数量一致.
第10行,增加 err.clear,清除错误,为后面可能的新建面域函数的错误信息做准备.
第13到20行,增加选择集过滤器,限制用户选择的图元种类.
第21到30行,遍历选择集,把现有面域存进面域对象数组,把非面域对象存进边界对象数组.
第31行,删除用过的选择集.
第33到39行,当选择集中存在边界对象时,新建面域.当用户选择的边界对象不符合创建面域的要求时,第34行会出错,发送信息并退出过程. |
|