找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 398|回复: 4

[求助] 获取二维多线段子实体的方法

[复制链接]
发表于 2017-6-27 00:05:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在测绘软件cass(基于cad开发),有界址线,一个闭合的多线段,整个线有个整地的扩展属性,在组吗1000中,“south”来存储信息
但是每两个顶点之间的线段,单独也有一个属性,属于前面多线段的子实体(VERTEX),这个子实体怎么获取呢,
在cad 用list命令行可以看到二维多线段的子实体。但是vba读取不到,lwpolyline没有这个属性或者方法,
  
  之前在网上找了一个间接的方法,通过创建类,来获取子实体的句柄,然后根据句柄到实体来得到这个实体,但是比较麻烦,还需要该CAD2006.FAS文件,创建类,不知道有没有更便捷的方法。直接得到这个子实体。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-6-27 00:09:19 | 显示全部楼层
既然你说了是二维多段线,那就是POLYLINE而不是LWPOLYLINE了,用 (entnext pl )  pl是主实体,就能得到子实体VERTEX
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-27 00:15:59 | 显示全部楼层

好的,谢谢,明天试试,请问用vba怎么实现呢,这是lisp语言,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-6-27 00:24:22 | 显示全部楼层

不知道你用什么版本的CAD,不推荐你在用VBA了, 方便的有LISP,高级些的有.NET,再高级的有ARX。

下面是VBA的代码,获取OLD POLYLINE 的顶点的XDATA

  1. Sub GetXDataFromVertexOfPLine()
  2.    Dim objEnt As AcadEntity
  3.    Dim objCopy As AcadEntity
  4.    Dim objPl As AcadPolyline
  5.    Dim varPick As Variant
  6.    Dim xdataOut As Variant
  7.    Dim xtypeOut As Variant
  8.    Dim strAppNames As String
  9.    Dim i, j As Integer
  10.    Dim num As Integer
  11.    Dim strHandle As String
  12.    Dim lonHandle As Long

  13.    On Error Resume Next

  14.    ThisDrawing.Utility.GetEntity objEnt, varPick, "Select an old Polyline: "
  15.    If objEnt Is Nothing Then
  16.     MsgBox "Nothing selected."
  17.     Exit Sub
  18.    Else
  19.     If objEnt.ObjectName = "AcDb2dPolyline" Then    'an old 2d polyline
  20.         Set objCopy = objEnt.Copy
  21.         objEnt.Delete
  22.         Set objEnt = Nothing
  23.         Set objEnt = objCopy
  24.         Set objCopy = Nothing

  25.         objEnt.GetXData "", xtypeOut, xdataOut
  26.         If VarType(xtypeOut) = vbEmpty Then
  27.         MsgBox "No XDATA for polyline header."
  28.         Else
  29.         strAppNames = ""
  30.         For i = LBound(xtypeOut) To UBound(xtypeOut) Step 1
  31.             If xtypeOut(i) = 1001 Then
  32.             strAppNames = strAppNames & xdataOut(i) & vbCrLf
  33.             End If
  34.         Next
  35.         If strAppNames <> "" Then
  36.             MsgBox "XDATA App names:" & vbCrLf & vbCrLf & strAppNames
  37.         End If
  38.         End If
  39.     Else
  40.         MsgBox "Non old polyline selected!"
  41.         Exit Sub
  42.     End If

  43.     Set objPl = objEnt
  44.     objEnt = Nothing

  45.     num = (UBound(objPl.Coordinates) - LBound(objPl.Coordinates) + 1) / 3
  46.     strHandle = objPl.Handle
  47.     Set objPl = Nothing
  48.     lonHandle = Val("&H" & strHandle) + 1
  49.     strHandle = Hex(lonHandle)
  50.     Set objEnt = ThisDrawing.Database.HandleToObject(strHandle)

  51.     For j = 1 To num Step 1
  52.         objEnt.GetXData "", xtypeOut, xdataOut
  53.         If VarType(xtypeOut) = vbEmpty Then
  54.         MsgBox "No XDATA for No. " & j & " vertex."
  55.         Else
  56.         strAppNames = ""
  57.         For i = LBound(xtypeOut) To UBound(xtypeOut) Step 1
  58.             If xtypeOut(i) = 1001 Then
  59.             strAppNames = strAppNames & xdataOut(i) & vbCrLf
  60.             End If
  61.         Next
  62.         If strAppNames <> "" Then
  63.             MsgBox "XDATA App names of vertex " & j & " :" & vbCrLf &
  64. vbCrLf & strAppNames
  65.         End If
  66.         End If

  67.         strHandle = objEnt.Handle
  68.         lonHandle = Val("&H" & strHandle) + 1
  69.         strHandle = Hex(lonHandle)
  70.         Set objEnt = ThisDrawing.Database.HandleToObject(strHandle)
  71.     Next

  72.    End If

  73. End Sub

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-28 16:37:02 | 显示全部楼层

放进去好像不行,
网上找了一个方法 http://blog.sina.com.cn/s/blog_48ff6e1401009b56.html
但是执行的时候就获取不到,
他是根据lisp函数引入到vba的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-19 18:26 , Processed in 0.411675 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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