乐筑天下

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

选定线的最近端点

[复制链接]

6

主题

27

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
51
发表于 2007-11-11 10:28:31 | 显示全部楼层 |阅读模式
有什么方法可以获得线的最近点(开始或结束)或选定线的2顶点折线?现在,我让用户选择实体,然后在其中一个端点上绘制标记并提示用户这是否是正确的点,如果不是,它会选择另一个。我想做的是让用户单击最接近他们想要使用的端点的线。这可能吗?感谢您的任何输入/建议。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

3

主题

88

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2007-11-11 11:13:10 | 显示全部楼层
是的,它是possilbe。ThisDrawing.Utility.GetEntity函数将返回选择的实体(线/线)和选择实体的点。
然后您可以测试从端点到“选择点”的距离并返回最近的终端。如果您不将其限制为2顶点样条线,那将有点困难。
如果您想看的话,我有一些原型代码
回复

使用道具 举报

6

主题

27

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
51
发表于 2007-11-11 12:06:56 | 显示全部楼层

确定! 那就太好了! 我有一个想法,如果用户选择了一条超过2个顶点的折线。 首先,找到最接近用户选择 pline 的位置的顶点。 确定 pline 中的顶点数,然后将线段到该顶点的距离相加,然后获取其余线段的总和。 无论哪个更短,请根据它选择第一个顶点或最后一个顶点。
我最终完成了我的固定程序,只是设置了OSMODE,让他们选择起点和终点。 我仍然对他们感兴趣,只是选择他们想要的线路,最接近他们想要开始驻扎的地方。
回复

使用道具 举报

3

主题

88

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2007-11-11 12:31:13 | 显示全部楼层
这是粗略的代码。 它需要错误检查,实体类型测试等,
但我认为它得到了这个想法(如果我正确地解释了你的第一篇文章)。
  1. Public Sub testGetClosestEndpoint()
  2.     Dim oEnt As AcadEntity
  3.     Dim vPickedPoint As Variant
  4.     Dim vPoint As Variant
  5.     Dim vResult As Variant
  6.    
  7.     ThisDrawing.Utility.GetEntity oEnt, vPickedPoint, "Pick (p)Line: "
  8.    
  9.     vResult = GetClosestEndPt(oEnt, vPickedPoint, False)
  10.     Debug.Print vResult(0), vResult(1), vResult(2)
  11. End Sub
  12. Public Function GetClosestEndPt(pLineEnt As AcadEntity, pPoint As Variant, p3dIfTrue As Boolean) As Variant
  13.     Dim vTemp1 As Variant
  14.     Dim oLine As AcadLine
  15.     Dim oLwPline As AcadLWPolyline
  16.     Dim oPline As AcadPolyline
  17.     Dim o3dPline As Acad3DPolyline
  18.     Dim maxVert As Integer
  19.    
  20.     Dim dist1 As Double
  21.     Dim dist2 As Double
  22.     Dim retVal As Variant
  23.    
  24.     If TypeOf pLineEnt Is AcadLine Then
  25.         Set oLine = pLineEnt
  26.         dist1 = CalcDist(oLine.StartPoint, pPoint, p3dIfTrue)
  27.         dist2 = CalcDist(oLine.EndPoint, pPoint, p3dIfTrue)
  28.         If dist1 <= dist2 Then
  29.             retVal = oLine.StartPoint
  30.         Else
  31.             retVal = oLine.EndPoint
  32.         End If
  33.     ElseIf TypeOf pLineEnt Is AcadLWPolyline Then
  34.         Set oLwPline = pLineEnt
  35.         maxVert = (UBound(oLwPline.Coordinates) - 1) / 2
  36.         dist1 = CalcDist(oLwPline.Coordinate(0), pPoint, p3dIfTrue)
  37.         dist2 = CalcDist(oLwPline.Coordinate(maxVert), pPoint, p3dIfTrue)
  38.         If dist1 <= dist2 Then
  39.             retVal = oLwPline.Coordinate(0)
  40.         Else
  41.             retVal = oLwPline.Coordinate(maxVert)
  42.         End If
  43.     ElseIf TypeOf pLineEnt Is AcadPolyline Then
  44.         Set oPline = pLineEnt
  45.         maxVert = (UBound(oPline.Coordinates) - 2) / 3
  46.         dist1 = CalcDist(oPline.Coordinate(0), pPoint, p3dIfTrue)
  47.         dist2 = CalcDist(oPline.Coordinate(maxVert), pPoint, p3dIfTrue)
  48.         If dist1 <= dist2 Then
  49.             retVal = oPline.Coordinate(0)
  50.         Else
  51.             retVal = oPline.Coordinate(maxVert)
  52.         End If
  53.     ElseIf TypeOf pLineEnt Is Acad3DPolyline Then
  54.         Set o3dPline = pLineEnt
  55.         maxVert = (UBound(o3dPline.Coordinates) - 2) / 3
  56.         dist1 = CalcDist(o3dPline.Coordinate(0), pPoint, p3dIfTrue)
  57.         dist2 = CalcDist(o3dPline.Coordinate(maxVert), pPoint, p3dIfTrue)
  58.         If dist1 <= dist2 Then
  59.             retVal = o3dPline.Coordinate(0)
  60.         Else
  61.             retVal = o3dPline.Coordinate(maxVert)
  62.         End If
  63.     End If
  64.    
  65.     GetClosestEndPt = retVal
  66.    
  67.    
  68. End Function
  69. Public Function CalcDist(pPt1 As Variant, pPt2 As Variant, p3dIfTrue As Boolean) As Double
  70.     Dim temp As Double
  71.    
  72.     If p3dIfTrue Then
  73.         temp = Sqr((pPt1(0) - pPt2(0)) ^ 2 + (pPt1(1) - pPt2(1)) ^ 2 + (pPt1(2) - pPt2(2)) ^ 2)
  74.     Else
  75.        temp = Sqr((pPt1(0) - pPt2(0)) ^ 2 + (pPt1(1) - pPt2(1)) ^ 2)
  76.     End If
  77.    
  78.     CalcDist = temp
  79. End Function

LISP vlax-curve-* 函数可能有助于您确定驻位。 它们可能可以在VBA中使用VL Active X模块和/或通过Frank O的VLAX类进行访问。
回复

使用道具 举报

6

主题

27

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
51
发表于 2007-11-11 15:37:36 | 显示全部楼层
谢谢你的代码片段!至于定位程序,我将研究VL主动X模块。老实说,我甚至不知道有这样的东西存在。我很想访问大量的VL例程!你知道我在哪里可以找到这个模块的文档吗
我已经编写了我的大多数定位函数。剩下唯一要做的就是为水平曲线定位,这应该没什么大不了的!再次感谢您的帮助!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-5 17:26 , Processed in 1.416871 second(s), 62 queries .

© 2020-2025 乐筑天下

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