乐筑天下

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

[编程交流] 偏移VBA

[复制链接]

14

主题

42

帖子

28

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 22:12:35 | 显示全部楼层 |阅读模式
嗨,伙计们
 
我对autoCAD VBA中的偏移方法有点问题。它对LWpoly很有吸引力,但2DPOLYINE或其他具有X、Y和Z坐标的多段线似乎没有通过该方法,创建变量数组varObjArr。感谢您的帮助!
 
  1. Dim varObjArr As Variant
  2. Dim aEnt As AcadEntity
  3. Dim aLine2 As AcadPolyline
  4. Dim Coords2 As Variant
  5. [... part that works with acadlwpolylines...]
  6. ElseIf TypeOf aEnt Is AcadPolyline Then
  7.            Set aLine2 = aEnt
  8.            varObjArr = aLine2.Offset(-0.001)
  9.            Set aLine2 = varObjArr(0)
  10.            Coords2 = aLine2.Coordinates
  11.            aLine2.Delete
  12. End If
回复

使用道具 举报

29

主题

519

帖子

477

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
163
发表于 2022-7-6 22:20:01 | 显示全部楼层
除了长波多段线,只有二维多段线和三维多段线。
 
您的ElseIf语句需要更改以拾取二维多段线。我通常用objEnt获得对象名。ObjectName和对于二维多段线,检查“ACDB2DPOLYINE”的值,而对于LWPOLYINES,检查ACDBPOLYINE,对于三维多段线,检查“ACDB3DPOLYINE”。
 
如果您也要偏移其他对象,则可以考虑使用select case方法,例如:
 
  1. Select Case objEnt.ObjectName
  2.    
  3.    Case "AcDbPolyline"
  4.            ... (LWPolyline)
  5.    Case "AcDb2dPolyline"
  6.            ... (2D-Polyline)
  7.    Case "AcDb3dPolyline"
  8.            ... (3D-Polyline)
  9.    Case "AcDbLine"
  10.            ... (Line)
  11.    .
  12.    .
  13.    .
  14.    Case Else
  15.            ... (Catches non handled objects)
  16. End Select
回复

使用道具 举报

14

主题

42

帖子

28

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 22:24:40 | 显示全部楼层
是的,我想你可以选择怎么捡。带有TypeOf或the。name属性。
 
我现在似乎确实让他们通过了这个程序,有点奇怪,因为我什么都没改变。。。
 
谢谢
天文学家
回复

使用道具 举报

29

主题

519

帖子

477

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
163
发表于 2022-7-6 22:29:27 | 显示全部楼层
只要你有它的工作,那么一切都是好的。
回复

使用道具 举报

14

主题

42

帖子

28

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 22:30:26 | 显示全部楼层
嗨,伙计们
 
补偿像一个魅力,但我想做的事之后似乎并没有按计划进行。
 
我正在寻找闭合多段线,这些闭合多段线在特定的几层中与其他多段线重叠。有时程序标记的行与任何内容都不重叠,但我真的看不出我的编程有任何错误。我整个上午都在试图纠正这个错误,但没有任何结果。
 
我认为应该在某个地方删除一个变量,因为如果没有任何重叠的多边形,一切都正常。可能是选择集吗?
 
谢谢你看!
 
  1. Option Compare Text
  2. Option Explicit
  3. Sub Overlap()
  4. Dim aEnt As AcadEntity
  5. Dim varObjArr As Variant
  6. Dim aEnt2 As AcadEntity
  7. Dim sSet As AcadSelectionSet
  8. Dim sSet2 As AcadSelectionSet
  9. Dim aLine As AcadLWPolyline
  10. Dim aCopy As AcadLWPolyline
  11. Dim aCheck As AcadLWPolyline
  12. Dim aLine2 As AcadPolyline
  13. Dim aCopy2 As AcadPolyline
  14. Dim aCheck2 As AcadPolyline
  15. Dim Coords As Variant
  16. Dim Coords2 As Variant
  17. Dim Coords3 As Variant
  18. Dim FT(0) As Integer
  19. Dim FD(0) As Variant
  20. Dim FT2(1) As Integer
  21. Dim FD2(1) As Variant
  22. Dim oLay As AcadLayer
  23. Dim j As Integer
  24. Dim i As Integer
  25. Dim Overlap_Count As Integer
  26. FT(0) = 0
  27. FD(0) = "*polyline"
  28. FT2(0) = 0
  29. FD2(0) = "*polyline"
  30. FT2(1) = 8
  31. FD2(1) = "N_GRA*"
  32. Set oLay = ThisDrawing.Layers.Add("_CHECK_OVERLAP")
  33. oLay.Lineweight = acLnWt030
  34. oLay.Color = acCyan
  35. Overlap_Count = 0
  36. On Error GoTo Delete
  37. Set sSet = ThisDrawing.SelectionSets.Add("sset")
  38. sSet.Select acSelectionSetAll, , , FT, FD
  39. On Error GoTo ErrorControle
  40.       
  41. For Each aEnt In sSet
  42.    If aEnt.Layer Like "N_GRA1A" Or aEnt.Layer Like "N_GRA1GBA" Then
  43.        GoTo FollowingEntity
  44.    ElseIf aEnt.Layer Like "*gano*" Or aEnt.Layer Like "N_GRA*" Or aEnt.Layer Like "ANO_GVCO*" Then
  45.        If TypeOf aEnt Is AcadLWPolyline Then
  46.            Set aCheck = aEnt
  47.            varObjArr = aCheck.Offset(0.001)
  48.            Set aLine = varObjArr(0)
  49.            If aLine.Area > aCheck.Area Then
  50.                Erase varObjArr
  51.                aLine.Delete
  52.                varObjArr = aCheck.Offset(-0.001)
  53.                Set aLine = varObjArr(0)
  54.            End If
  55.            
  56.            ReDim Coords(0 To UBound(aLine.Coordinates))
  57.            Coords = aLine.Coordinates
  58.            aLine.Delete
  59.       
  60.            ReDim Coords2(0 To ((UBound(Coords) + 1) / 2 * 3) - 1) As Double
  61.            j = 0
  62.       
  63.            For i = 0 To UBound(Coords) Step 2
  64.                Coords2(j) = Coords(i)
  65.                Coords2(j + 1) = Coords(i + 1)
  66.                Coords2(j + 2) = 0
  67.                j = j + 3
  68.            Next i
  69.            
  70.        ElseIf TypeOf aEnt Is AcadPolyline Then
  71.            Set aCheck2 = aEnt
  72.            varObjArr = aCheck2.Offset(0.001)
  73.            Set aLine2 = varObjArr(0)
  74.            If aLine2.Area > aCheck2.Area Then
  75.                Erase varObjArr
  76.                aLine2.Delete
  77.                varObjArr = aCheck2.Offset(-0.001)
  78.                Set aLine2 = varObjArr(0)
  79.            End If
  80.            
  81.            ReDim Coords2(0 To UBound(aLine2.Coordinates)) As Double
  82.            Coords2 = aLine2.Coordinates
  83.            aLine2.Delete
  84.        End If
  85.       
  86.        Erase varObjArr
  87.       
  88.        On Error GoTo Delete2
  89.        Set sSet2 = ThisDrawing.SelectionSets.Add("sset2")
  90.        sSet2.SelectByPolygon acSelectionSetCrossingPolygon, Coords2, FT2, FD2
  91.       
  92.        On Error GoTo ErrorControle
  93.        For Each aEnt2 In sSet2
  94.            If TypeOf aEnt2 Is AcadLWPolyline Then
  95.                Set aCopy = aEnt2.Copy
  96.                aCopy.Layer = "_CHECK_OVERLAP"
  97.                Overlap_Count = Overlap_Count + 1
  98.                'following code is the make the offsetlines visible for control
  99.                'ThisDrawing.ModelSpace.AddPolyline (Coords2)
  100.            ElseIf TypeOf aEnt2 Is AcadPolyline Then
  101.                Set aCopy2 = aEnt2.Copy
  102.                aCopy2.Layer = "_CHECK_OVERLAP"
  103.                Overlap_Count = Overlap_Count + 1
  104.                'following code is the make the offsetlines visible for control
  105.                'ThisDrawing.ModelSpace.AddPolyline (Coords2)
  106.            End If
  107.        Next aEnt2
  108.       
  109.        ThisDrawing.SelectionSets.Item("sset2").Delete
  110.       
  111.    End If
  112. FollowingEntity:
  113. Next aEnt
  114. ThisDrawing.SelectionSets.Item("sset").Delete
  115. MsgBox Overlap_Count & " nieuwe GRA's hebben een ontoelaatbare overlap.", vbInformation, "Resultaten check"
  116. If Overlap_Count = 0 Then
  117.    oLay.Delete
  118. End If
  119. Exit Sub
  120. Delete:
  121.    ThisDrawing.SelectionSets.Item("sset").Delete
  122.    Resume
  123. Delete2:
  124.    ThisDrawing.SelectionSets.Item("sset2").Delete
  125.    Resume
  126. ErrorControle:
  127.    If Err Then MsgBox Err.Description
  128. End Sub
回复

使用道具 举报

12

主题

175

帖子

77

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
149
发表于 2022-7-6 22:37:17 | 显示全部楼层
 
 
 
也许这取决于我们前段时间讨论的“适当缩放”问题。http://www.cadtutor.net/forum/showthread.php?82294-选择集交叉问题,即selectionset命令将仅获取显示窗口中的对象。
 
在那篇文章中,我还展示了如何收集必须完全位于某个围栏内的元素。这很像你的案子。
 
此外,我只能将其作为警告(因为我不完全确定):运行“(entget(car(entsel)))命令,然后选择一条轻量级多段线,它将“LWPOLYLINE”作为entitytype返回。所以也许你最好用大写字母
  1. FD(0) = "*POLYLINE"

根据您的选择标准
 
最后,我试着通读你的代码,看看是否能帮上忙,但我还是坚持了下面的代码片段
 
  1.            Set aCheck = aEnt
  2.            varObjArr = aCheck.Offset(0.001)
  3.            Set aLine = varObjArr(0)
  4.            If aLine.Area > aCheck.Area Then
  5.                Erase varObjArr
  6.                aLine.Delete
  7.                varObjArr = aCheck.Offset(-0.001)
  8.                Set aLine = varObjArr(0)
  9.            End If

 
在我看来,“aLine.Area>aCheck.Area”检查的结果总是为FALSE,因为aLine和aCheck都来自aEnt,只有一个偏移量作为差。
 
至于现在,我没有得到进一步的。。。
回复

使用道具 举报

14

主题

42

帖子

28

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 22:40:37 | 显示全部楼层
嗨,RICVBA
 
我确实注意到了不同论坛上的缩放问题,所以我在程序中加入了最大化。
 
因为我使用了选项比较文本,所以写多段线的方式应该不会有问题。它拾取所有多段线。
 
我确实在offset命令方面遇到了一些问题。此命令确保从选择集中排除与所测量的多段线具有相同边界的多段线。0001m的小偏差使得仍然可以按照公认的标准进行检查。在编程和错误处理时,我发现每次偏移都没有正确完成。如果从左到右或从右到左绘制多段线,则偏移的方式不同。这就是我输入代码的原因。
 
我感觉交叉多边形选项没有按它应该的那样工作。我已经把工作程序(在AC2011地图中)放到了AC2004上,但是当它到达交叉多边形时:混乱。。。多边形围绕0,0点绘制,保留节点数和面积,并删除原始多边形。我现在不仅抓挠我的头。。。GRMBL公司
 
我正在排除故障。。。
 
Grtz公司
天文学家
回复

使用道具 举报

12

主题

175

帖子

77

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
149
发表于 2022-7-6 22:45:06 | 显示全部楼层
 
 
嗨AstroNout
如果需要,您可以发布dwg文件。这样我才能更好地理解正在播放的内容,并可能提供一些有用的帮助
再见
回复

使用道具 举报

14

主题

42

帖子

28

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 22:49:39 | 显示全部楼层
在左边,这是必须绘制的情况。右边是原始情况。这是2011年绘制的。
 
2004年的情况将尽快公布在这里。
 
Grtz公司
天文学家
测试重叠。图纸
回复

使用道具 举报

12

主题

175

帖子

77

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
149
发表于 2022-7-6 22:55:01 | 显示全部楼层
 
嗨AstroNout
我只是在一个只包含“右侧”对象的图形中运行您的例程,并获得了您所期望的“左侧”。
你实际上遇到了什么问题?
 
PS:我之前对“aLine.Area>aCheck.Area”检查的怀疑是因为我不知道“offset”方法,我假设该方法只是移动新创建的对象,而我现在意识到它作用于它们的区域。很抱歉
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 08:55 , Processed in 0.378004 second(s), 72 queries .

© 2020-2025 乐筑天下

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