乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 42|回复: 3

[编程交流] 从中获取AcadPolyline

[复制链接]

2

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 22:56:47 | 显示全部楼层 |阅读模式
我想分解blockrefs,以便更仔细地查看其中的对象。
我首先尝试的是检索blockref中多段线的坐标。
 
但是,当我将多段线引用设置为分解数组的对象时,会出现“类型不匹配”错误。(尽管它的ObjectName==AcDbPolyline)。
 
  1. If varEx(i).ObjectName = "AcDbPolyline" Then
  2. Set pl = varEx(i) 'ERROR: Type mismatch
  3.   '(...)
  4. End If

 
我需要一个AcadPolyline对象来访问“坐标”属性。
这是怎么做到的?
我不习惯VB,但我发现它的对象模型相当混乱。。。
 
以下是完整代码:
 
 
  1. Public Sub Test()
  2.    Dim bref As AcadBlockReference
  3.    Dim ent As AcadEntity
  4.    Dim exp As Variant
  5.    Dim pl As AcadPolyline
  6.    
  7.    For Each ent In ThisDrawing.ModelSpace
  8.       
  9.        If ent.ObjectName = "AcDbBlockReference" Then
  10.       
  11.            Set bref = ent
  12.            Debug.Print "exploding", bref.Name
  13.            Dim i As Double
  14.    
  15.            varEx = bref.Explode
  16.            
  17.            For i = 0 To UBound(varEx)
  18.                Debug.Print varEx(i).ObjectName
  19.                If varEx(i).ObjectName = "AcDbPolyline" Then
  20.                    Set pl = varEx(i) 'ERROR: Type mismatch
  21.                    '(...)
  22.                End If
  23.            Next
  24.       
  25.        End If
  26.    Next
  27. End Sub

 
非常感谢。
回复

使用道具 举报

0

主题

19

帖子

20

银币

限制会员

铜币
-1
发表于 2022-7-6 23:32:25 | 显示全部楼层
  1. SSET2.SelectOnScreen
  2. For Each ent In SSET2
  3.   If (TypeOf ent Is AutoCAD.AcadLWPolyline) Then
  4.        Set lwpl = ent
  5.        vtxs = lwpl.Coordinates
  6.            For idx = LBound(vtxs) To UBound(vtxs) Step 2
  7.                List1(0).AddItem vtxs(idx)
  8.                List1(1).AddItem vtxs(idx + 1)
  9.            Next idx
  10.    End If
  11. Next ent

 
可能尝试设置为对象,然后将obj设置为varEx返回
回复

使用道具 举报

2

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 23:38:13 | 显示全部楼层
我是否理解你的意思
 
  1. Dim o As AcadObject
  2. (...)
  3. Set o = varEx(i)
  4. Set pl = o

 
同样的错误。
试一试会有帮助吗。net还是使用相同的库?
 
谢谢你的帮助。
 
编辑:
python做到了这一点。
这里有一个例子。dwg只包含由3个顶点多段线组成的bref。
不适用于较旧的acad版本,此处在acad 11上测试。
  1. >>> import win32com.client
  2. >>> acad = win32com.client.Dispatch("AutoCAD.Application")
  3. >>> doc = acad.ActiveDocument
  4. >>> ms = doc.ModelSpace
  5. >>>
  6. >>> for item in ms:
  7. ...     print item.ObjectName
  8. ...
  9. AcDbBlockReference
  10. >>> bref = ms[0]
  11. >>> exp = bref.Explode()
  12. >>> exp
  13. (<COMObject Explode>,)
  14. >>> e=exp[0]
  15. >>> e.ObjectName
  16. u'AcDbPolyline'
  17. >>> e.Coordinates
  18. (1000.0, 500.0, 1000.0, 600.0, 1100.0, 600.0, 1100.0, 500.0, 1000.0, 500.0)
回复

使用道具 举报

0

主题

19

帖子

20

银币

限制会员

铜币
-1
发表于 2022-7-7 00:13:00 | 显示全部楼层
如果仍然包含LWpoly,请确保尝试所有可能的多段线。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-1-31 14:47 , Processed in 0.436753 second(s), 71 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表