选定线的最近端点
有什么方法可以获得线的最近点(开始或结束)或选定线的2顶点折线?现在,我让用户选择实体,然后在其中一个端点上绘制标记并提示用户这是否是正确的点,如果不是,它会选择另一个。我想做的是让用户单击最接近他们想要使用的端点的线。这可能吗?感谢您的任何输入/建议。**** Hidden Message ***** 是的,它是possilbe。ThisDrawing.Utility.GetEntity函数将返回选择的实体(线/线)和选择实体的点。
然后您可以测试从端点到“选择点”的距离并返回最近的终端。如果您不将其限制为2顶点样条线,那将有点困难。
如果您想看的话,我有一些原型代码
确定! 那就太好了! 我有一个想法,如果用户选择了一条超过2个顶点的折线。 首先,找到最接近用户选择 pline 的位置的顶点。 确定 pline 中的顶点数,然后将线段到该顶点的距离相加,然后获取其余线段的总和。 无论哪个更短,请根据它选择第一个顶点或最后一个顶点。
我最终完成了我的固定程序,只是设置了OSMODE,让他们选择起点和终点。 我仍然对他们感兴趣,只是选择他们想要的线路,最接近他们想要开始驻扎的地方。 这是粗略的代码。 它需要错误检查,实体类型测试等,
但我认为它得到了这个想法(如果我正确地解释了你的第一篇文章)。
Public Sub testGetClosestEndpoint()
Dim oEnt As AcadEntity
Dim vPickedPoint As Variant
Dim vPoint As Variant
Dim vResult As Variant
ThisDrawing.Utility.GetEntity oEnt, vPickedPoint, "Pick (p)Line: "
vResult = GetClosestEndPt(oEnt, vPickedPoint, False)
Debug.Print vResult(0), vResult(1), vResult(2)
End Sub
Public Function GetClosestEndPt(pLineEnt As AcadEntity, pPoint As Variant, p3dIfTrue As Boolean) As Variant
Dim vTemp1 As Variant
Dim oLine As AcadLine
Dim oLwPline As AcadLWPolyline
Dim oPline As AcadPolyline
Dim o3dPline As Acad3DPolyline
Dim maxVert As Integer
Dim dist1 As Double
Dim dist2 As Double
Dim retVal As Variant
If TypeOf pLineEnt Is AcadLine Then
Set oLine = pLineEnt
dist1 = CalcDist(oLine.StartPoint, pPoint, p3dIfTrue)
dist2 = CalcDist(oLine.EndPoint, pPoint, p3dIfTrue)
If dist1 <= dist2 Then
retVal = oLine.StartPoint
Else
retVal = oLine.EndPoint
End If
ElseIf TypeOf pLineEnt Is AcadLWPolyline Then
Set oLwPline = pLineEnt
maxVert = (UBound(oLwPline.Coordinates) - 1) / 2
dist1 = CalcDist(oLwPline.Coordinate(0), pPoint, p3dIfTrue)
dist2 = CalcDist(oLwPline.Coordinate(maxVert), pPoint, p3dIfTrue)
If dist1 <= dist2 Then
retVal = oLwPline.Coordinate(0)
Else
retVal = oLwPline.Coordinate(maxVert)
End If
ElseIf TypeOf pLineEnt Is AcadPolyline Then
Set oPline = pLineEnt
maxVert = (UBound(oPline.Coordinates) - 2) / 3
dist1 = CalcDist(oPline.Coordinate(0), pPoint, p3dIfTrue)
dist2 = CalcDist(oPline.Coordinate(maxVert), pPoint, p3dIfTrue)
If dist1 <= dist2 Then
retVal = oPline.Coordinate(0)
Else
retVal = oPline.Coordinate(maxVert)
End If
ElseIf TypeOf pLineEnt Is Acad3DPolyline Then
Set o3dPline = pLineEnt
maxVert = (UBound(o3dPline.Coordinates) - 2) / 3
dist1 = CalcDist(o3dPline.Coordinate(0), pPoint, p3dIfTrue)
dist2 = CalcDist(o3dPline.Coordinate(maxVert), pPoint, p3dIfTrue)
If dist1 <= dist2 Then
retVal = o3dPline.Coordinate(0)
Else
retVal = o3dPline.Coordinate(maxVert)
End If
End If
GetClosestEndPt = retVal
End Function
Public Function CalcDist(pPt1 As Variant, pPt2 As Variant, p3dIfTrue As Boolean) As Double
Dim temp As Double
If p3dIfTrue Then
temp = Sqr((pPt1(0) - pPt2(0)) ^ 2 + (pPt1(1) - pPt2(1)) ^ 2 + (pPt1(2) - pPt2(2)) ^ 2)
Else
temp = Sqr((pPt1(0) - pPt2(0)) ^ 2 + (pPt1(1) - pPt2(1)) ^ 2)
End If
CalcDist = temp
End Function
LISP vlax-curve-* 函数可能有助于您确定驻位。 它们可能可以在VBA中使用VL Active X模块和/或通过Frank O的VLAX类进行访问。 谢谢你的代码片段!至于定位程序,我将研究VL主动X模块。老实说,我甚至不知道有这样的东西存在。我很想访问大量的VL例程!你知道我在哪里可以找到这个模块的文档吗
我已经编写了我的大多数定位函数。剩下唯一要做的就是为水平曲线定位,这应该没什么大不了的!再次感谢您的帮助!
页:
[1]