乐筑天下

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

[编程交流] LW多边形自定义属性

[复制链接]

14

主题

42

帖子

28

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 22:26:25 | 显示全部楼层 |阅读模式
嗨,伙计们
 
我的问题类似于安德的问题。我在使用从SHP到多段线转换的自定义特性时遇到了一些问题。
 
我将形状作为多段线插入,其中包含来自形状文件数据库的额外属性。到现在为止,一直都还不错。但是现在我想把多段线放到不同的层中,这取决于我刚刚创建的属性。
 
问题是,我似乎无法使用VBA编码从自定义属性中获取数组,甚至是某种变体对象。对于LW Poly,这可能吗?我正在使用AutoCAD MAP 3D 2011。
 
我有一个开始的代码:
 
  1. Sub Layer()
  2.    Dim Ent As AcadEntity
  3.    Dim pLine As AcadLWPolyline
  4.    Dim aAttributes As Variant
  5.    Dim Attrib As Variant
  6.    Dim Layer As AcadLayer
  7.    Dim sText As String
  8.    
  9.    For Each Ent In ThisDrawing.ModelSpace
  10.        If TypeOf Ent Is AcadLWPolyline Then
  11.            Set pLine = Ent
  12.            aAttributes = pLine.GetAttributes
  13.            
  14.            Select Case pLine.Layer
  15.            Case "ggba"
  16.                For Each Attrib In aAttributes
  17.                    If Attrib.TagString = "TPC" Then
  18.                        sText = Attrib.TextString
  19.                        Set Layer = ThisDrawing.Application.ActiveDocument.Layers.Add("GBA" & sText)
  20.                        pLine.Layer = Layer
  21.                    End If
  22.                Next Attrib
  23.            End Select
  24.        End If
  25.    Next
  26. End Sub

 
显然是。getattribute方法不适用于LW多边形。
 
非常感谢您的帮助,
谢谢
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 22:32:30 | 显示全部楼层
您需要获取坐标而不是属性。
 
也可以通过web搜索“vba多段线顶点”http://www.cadtutor.net/forum/showthread.php?7823-通过VBA获取多段线的坐标,查看Fixo解。
回复

使用道具 举报

14

主题

42

帖子

28

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 22:35:44 | 显示全部楼层
谢谢你的回复,但这不是我想说的。我知道如何获得坐标,这很困难:-)
 
我一直在网上搜索,发现我需要的数据在“对象数据”中。然而,这是一个完全不同的故事,因为数据存储在表中,连接到CAD对象,就像它在GIS中一样。
 
我似乎找不到一个使用VBA在对象的对象数据中循环的好例子。这是可能的,但对我来说仍然是个谜。
回复

使用道具 举报

29

主题

519

帖子

477

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
163
发表于 2022-7-6 22:38:47 | 显示全部楼层
如果您的意思是“对象数据”,则可以访问图层属性(Object.layer),并将其直接设置为希望LW多段线处于的图层。正如您在代码中所演示的那样。
 
如果您指的是存储在GIS中的数据,则可以使用扩展数据来访问它。我们从GIS导出DXF文件,所有连接到对象的数据都导出为扩展数据。我编写了一个查看器来显示连接到选定对象的所有数据,这并不总是无关紧要的,有些对象连接了100多个数据项。使用Express工具查看是否有任何LW多段线附加了扩展数据,如果有,请修改代码以处理扩展数据而不是属性。
 
我不太确定你想用你的代码实现什么。正如您正确地说的那样,LW多段线不能有属性,因此变量aAttributes将始终为空,case循环中的代码将永远不会执行。在您的代码中,如果“TPC”不是属性,那么它是什么?
回复

使用道具 举报

14

主题

42

帖子

28

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 22:43:30 | 显示全部楼层
嗯,政府发给我们整个城市的形状文件,以检查我们调查的新特征。由于我们使用AutoCAD,因此更容易将整个地块转换为DWG。只需要交付调整。
 
问题是形状中的一些线表示不同的东西。形状建筑物中有所有主要和次要建筑物。为了实用,我们想把不同类型的建筑放在不同的层中。将形状输入AutoCAD时,属性将作为OD:ShapeName输入。我怀疑这是帮助文件中提到的“对象数据”。表示主楼或副楼的属性是“TPC”。
 
希望这有帮助。
回复

使用道具 举报

29

主题

519

帖子

477

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
163
发表于 2022-7-6 22:50:00 | 显示全部楼层
单击LW多段线时,在“属性”窗格中会看到什么?对于块,如果其具有属性,则这些属性与其当前值一起列在“属性”窗格的底部。
 
当您转到功能区>工具组>列表扩展数据按钮上的“快速工具”选项卡时,在文本窗口中会看到什么。系统会提示您选择对象,然后“输入应用程序名称:”只需按Enter键。如果对象具有扩展数据,则会列出它,如果没有,则会收到消息“没有与应用程序名称关联的扩展数据”
 
你能举个小例子吗?
回复

使用道具 举报

14

主题

42

帖子

28

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 22:53:45 | 显示全部楼层
在属性中,我得到了我需要的数据,一直在底部。
 
以下是您询问的列表:
  1. * Registered Application Name: AcMap_E615D161-C9D7-11d3-839F-0060B0FB6B57
  2. * Code 1071, 32-bit signed long integer: 2
  3. * Code 1071, 32-bit signed long integer: 16
  4. * Code 1071, 32-bit signed long integer: 1
  5. Object has 16365 bytes of Xdata space available.
回复

使用道具 举报

29

主题

519

帖子

477

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
163
发表于 2022-7-6 22:57:45 | 显示全部楼层
好的,这里的数据是来自文本窗口的扩展数据,而不是属性。您是否也在“属性窗格”中获取信息?
单词“Code”后面的数字是DXF代码,DXF代码1000到1071(含1000到1071)保留用于扩展数据。
 
除了代码1001之外,所有代码都可以在一组扩展数据中多次使用。1001是应用程序名称,只能出现一次。
代码1003是与扩展数据相关的层,它可能对您有用。
 
有两种方法与数据“GetXData”和“SetXData”相关。
 
您可以检索LW多段线的扩展数据,然后在扩展数据中循环,直到找到所需的条目,然后相应地设置LW多段线的图层特性。
回复

使用道具 举报

29

主题

519

帖子

477

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
163
发表于 2022-7-6 23:01:15 | 显示全部楼层
尝试检查地图帮助文件中的扩展数据、元数据、ObjectData、DataTables等。
 
这里似乎有很多关于这些主题的信息,这是你在第3篇文章中谈到的。
回复

使用道具 举报

14

主题

42

帖子

28

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 23:03:05 | 显示全部楼层
好的,谢谢。但它似乎不适用于GetXData函数。我总是得到空的变量数组,所以,没有帮助。
 
因此,现在我们正忙于处理数据表和ObjectData,不过,我刚刚遇到了AutoCAD的致命崩溃,几秒钟后,VBA管理器由于内存溢出,在处理图形中的数据表时失去了所有编程。愉快的
 
我听说操作数据表是AutoCAD自定义过程中的一个大问题。显然没有在帮助文件中处理。。。有人对此有经验吗?
 
以下是需要调整的众多文件之一:
测验图纸
 
Grtz公司
天文学家
 
更新:
它在这条线上崩溃:
  1. Set OD = acad.Projects(ThisDrawing).ODTables.Item("ggba")

 
完整代码:
  1. Public Function Get_Attributes()
  2. Dim acadOBJ As Object
  3. Dim acad As AcadMap
  4. Set acad = ThisDrawing.Application.GetInterfaceObject("AutoCADMap.Application.5")
  5. Dim boolVal As Boolean
  6. Dim aLayer As AcadLayer
  7. Dim sString As String
  8. Dim TPC As Integer
  9. Dim OD As ODTable ' variable to connect to PB table
  10. Set OD = acad.Projects(ThisDrawing).ODTables.Item("ggba") ' setting up the table for use
  11. Dim ODrcs As ODRecords
  12. Set ODrcs = OD.GetODRecords ' get all records in the table
  13. Dim acadOBJ_objectID() As Long 'store pillar objectID in an array
  14. Dim ODtbs As ODTables
  15. Dim iType As Integer
  16. Set ODtbs = ThisDrawing.Application.GetInterfaceObject("AutoCADMap.Application").Projects(ThisDrawing).ODTables
  17. 'get the field names
  18. For i = 0 To ODtbs.Item("ggba").ODFieldDefs.Count - 1
  19.    'get the field index of "TYPE" field
  20.        If ODtbs.Item("ggba").ODFieldDefs.Item(i).Name = "TPC" Then
  21.            iType = i
  22.        End If
  23. Next i
  24. For Each acadOBJ In ThisDrawing.ModelSpace
  25.    boolVal = ODrcs.Init(acadOBJ, True, False)
  26.        Do While ODrcs.IsDone = False
  27.            If ODrcs.Record.ObjectID = acadOBJ.ObjectID Then
  28.                TPC = ODrcs.Record.Item(iType).Value
  29.            End If
  30.          ODrcs.Next
  31.        Loop
  32.    sString = "GBA" & TPC
  33.    Set aLayer = ThisDrawing.Layers.Add(sString)
  34.    acadOBJ.Layer = aLayer
  35. Next
  36. End Function
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 11:22 , Processed in 0.353011 second(s), 72 queries .

© 2020-2025 乐筑天下

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