从中获取AcadPolyline
我想分解blockrefs,以便更仔细地查看其中的对象。我首先尝试的是检索blockref中多段线的坐标。
但是,当我将多段线引用设置为分解数组的对象时,会出现“类型不匹配”错误。(尽管它的ObjectName==AcDbPolyline)。
If varEx(i).ObjectName = "AcDbPolyline" Then
Set pl = varEx(i) 'ERROR: Type mismatch
'(...)
End If
我需要一个AcadPolyline对象来访问“坐标”属性。
这是怎么做到的?
我不习惯VB,但我发现它的对象模型相当混乱。。。
以下是完整代码:
Public Sub Test()
Dim bref As AcadBlockReference
Dim ent As AcadEntity
Dim exp As Variant
Dim pl As AcadPolyline
For Each ent In ThisDrawing.ModelSpace
If ent.ObjectName = "AcDbBlockReference" Then
Set bref = ent
Debug.Print "exploding", bref.Name
Dim i As Double
varEx = bref.Explode
For i = 0 To UBound(varEx)
Debug.Print varEx(i).ObjectName
If varEx(i).ObjectName = "AcDbPolyline" Then
Set pl = varEx(i) 'ERROR: Type mismatch
'(...)
End If
Next
End If
Next
End Sub
非常感谢。
SSET2.SelectOnScreen
For Each ent In SSET2
If (TypeOf ent Is AutoCAD.AcadLWPolyline) Then
Set lwpl = ent
vtxs = lwpl.Coordinates
For idx = LBound(vtxs) To UBound(vtxs) Step 2
List1(0).AddItem vtxs(idx)
List1(1).AddItem vtxs(idx + 1)
Next idx
End If
Next ent
可能尝试设置为对象,然后将obj设置为varEx返回 我是否理解你的意思
Dim o As AcadObject
(...)
Set o = varEx(i)
Set pl = o
同样的错误。
试一试会有帮助吗。net还是使用相同的库?
谢谢你的帮助。
编辑:
python做到了这一点。
这里有一个例子。dwg只包含由3个顶点多段线组成的bref。
不适用于较旧的acad版本,此处在acad 11上测试。
>>> import win32com.client
>>> acad = win32com.client.Dispatch("AutoCAD.Application")
>>> doc = acad.ActiveDocument
>>> ms = doc.ModelSpace
>>>
>>> for item in ms:
... print item.ObjectName
...
AcDbBlockReference
>>> bref = ms
>>> exp = bref.Explode()
>>> exp
(<COMObject Explode>,)
>>> e=exp
>>> e.ObjectName
u'AcDbPolyline'
>>> e.Coordinates
(1000.0, 500.0, 1000.0, 600.0, 1100.0, 600.0, 1100.0, 500.0, 1000.0, 500.0)
如果仍然包含LWpoly,请确保尝试所有可能的多段线。
页:
[1]