乐筑天下

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

[编程交流] 直线附近的对象

[复制链接]

13

主题

70

帖子

57

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 23:04:00 | 显示全部楼层
这是另一种方法:
 
使用直线,创建一个边界框,然后向其添加一些填充,并使用基于这些边界框点上的交叉选择创建的点构建一个选择集,然后处理该选择集
回复

使用道具 举报

13

主题

70

帖子

57

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 23:06:34 | 显示全部楼层
获取线的边界框,然后向其添加公差变量,以定义要处理的编程选择集的交叉
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 23:13:33 | 显示全部楼层
不确定这是否有帮助
试试我老歌里的这一首,这会让你
要搜索离行最近的文本,请更改选择
根据您的需要进行筛选:
  1. Option Explicit
  2. Const pi As Double = 3.14159265358979
  3. Public Sub
  4. TouchNearestText()
  5. Dim oEnt As AcadEntity
  6. Dim oLine As
  7. AcadLine
  8. Dim pickPt
  9. On Error GoTo Err_Report
  10. Call
  11. ThisDrawing.Utility.GetEntity(oEnt, pickPt, vbLf & "Select a Line:
  12. ")
  13.      If Not TypeOf oEnt Is AcadLine
  14. Then
  15.      MsgBox "Not a
  16. Line!"
  17.      Exit
  18. Sub
  19.      End If
  20. Set oLine = oEnt
  21.      Dim minExt As
  22. Variant
  23.      Dim maxExt As
  24. Variant
  25.    ' Return the bounding box
  26. for the line and return the minimum
  27.    ' and maximum extents
  28. of the box in the minExt and maxExt variables.
  29. oLine.GetBoundingBox minExt, maxExt
  30.    Dim pts(0 To 11) As
  31. Double
  32.    pts(0) = minExt(0): pts(1) = minExt(1): pts(2) =
  33. 0#
  34.    pts(3) = maxExt(0): pts(4) = minExt(1): pts(5) =
  35. 0#
  36.    pts(6) = maxExt(0): pts(7) = maxExt(1): pts( =
  37. 0#
  38.    pts(9) = minExt(0): pts(10) = maxExt(1): pts(11) =
  39. 0#
  40.      Dim setObj As
  41. AcadSelectionSet
  42.     Dim setColl As
  43. AcadSelectionSets
  44.     Dim oText As
  45. AcadText
  46.     Dim pickPnt As
  47. Variant
  48.     Dim setName As
  49. String
  50.     Dim selMod As
  51. Long
  52.     Dim vertPts As
  53. Variant
  54.     Dim dblElv As
  55. Double
  56.     Dim gpCode(1) As
  57. Integer
  58.     Dim dataValue(1) As
  59. Variant
  60.     Dim dxfcode,
  61. dxfdata
  62.     '' build your filter
  63. here:
  64.     gpCode(0) = 0: gpCode(1) =
  65. 8
  66.     dataValue(0) = "TEXT": dataValue(1) =
  67. "0"
  68.     dxfcode = gpCode: dxfdata =
  69. dataValue
  70.     setName = "$CrossSelect$"
  71.     With
  72. ThisDrawing
  73.          Set
  74. setColl =
  75. .SelectionSets
  76.          For
  77. Each setObj In
  78. setColl
  79. If setObj.Name = setName
  80. Then
  81. .SelectionSets.item(setName).Delete
  82. Exit
  83. For
  84. End If
  85. Next
  86.          Set setObj =
  87. .SelectionSets.Add(setName)
  88.     End With
  89.     selMod =
  90. AcSelect.acSelectionSetCrossingPolygon     ' <-- can use
  91. also acSelectionSetWindowPolygon   '
  92.     setObj.SelectByPolygon selMod, pts, dxfcode,
  93. dxfdata
  94.     setObj.Highlight
  95. True
  96.     Dim objEnt As
  97. AcadEntity
  98.     Dim dblDist As Double
  99. If setObj.Count
  100. = 0 Then Exit Sub
  101.     Dim distArr As Variant
  102. Dim ang As Double
  103.     Dim angLine As
  104. Double
  105.     ReDim arr(1000, 1) As Variant ''put maximum
  106. number of nearer items you
  107. need
  108.         ' >> do your
  109. stuffs here
  110.         Dim
  111. n
  112.     For Each objEnt In
  113. setObj
  114.          Set oText =
  115. objEnt
  116.          Dim ptIns As
  117. Variant
  118.          ptIns =
  119. oText.InsertionPoint
  120. angLine = oLine.Angle
  121. ang = ThisDrawing.Utility.AngleFromXAxis(oLine.StartPoint,
  122. ptIns)
  123.          ang = ang -
  124. angLine
  125.          dblDist =
  126. Distance(ptIns,
  127. oLine.StartPoint)
  128. dblDist = Abs(dblDist *
  129. Sin(ang))
  130.          arr(n, 0) =
  131. oText.Handle: arr(n, 1) =
  132. dblDist
  133.          n = n +
  134. 1
  135.     Next
  136.     Dim strHandle As String
  137. Dim minDist
  138.     minDist = arr(0,
  139. 1)
  140.     For n = 0 To UBound(arr,
  141. 1)
  142.      If arr(n, 0) <> "" And arr(n, 1) <
  143. minDist Then
  144.     minDist = arr(n,
  145. 1)
  146.     strHandle = arr(n, 0)
  147. End If
  148.     Next
  149.     '' change
  150. some properties of a text you've found
  151. Set objEnt =
  152. ThisDrawing.HandleToObject(strHandle)
  153.     objEnt.Layer =
  154. oLine.Layer
  155. objEnt.TrueColor =
  156. oLine.TrueColor
  157. objEnt.Update
  158.     MsgBox "Minimum distance: " & minDist
  159. Err_Report:
  160. If Err.Number <> 0 Then
  161. MsgBox Err.Description
  162. End
  163. If
  164. End Sub
  165. '' by Bryco
  166. Public Function Distance(ByVal pt1 As Variant, ByVal pt2 As
  167. Variant) As Double
  168. Dim x As Double, y As Double, z As Double
  169. Dim dist As
  170. Double
  171. ' Calculate the distance between pt1 and pt2
  172. x = pt1(0) -
  173. pt2(0)
  174. y = pt1(1) - pt2(1)
  175. z = pt1(2) - pt2(2)
  176. dist = Sqr((Sqr((x ^ 2)
  177. + (y ^ 2)) ^ 2) + (z ^ 2))
  178. Distance = dist
  179. End Function
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 23:20:08 | 显示全部楼层
以下是可读性更强的源代码,请参阅附件:
FindNearestObject。txt文件
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 11:25 , Processed in 0.509397 second(s), 58 queries .

© 2020-2025 乐筑天下

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