surveyor_randy 发表于 2007-11-11 10:28:31

选定线的最近端点

有什么方法可以获得线的最近点(开始或结束)或选定线的2顶点折线?现在,我让用户选择实体,然后在其中一个端点上绘制标记并提示用户这是否是正确的点,如果不是,它会选择另一个。我想做的是让用户单击最接近他们想要使用的端点的线。这可能吗?感谢您的任何输入/建议。
**** Hidden Message *****

SomeCallMeDave 发表于 2007-11-11 11:13:10

是的,它是possilbe。ThisDrawing.Utility.GetEntity函数将返回选择的实体(线/线)和选择实体的点。
然后您可以测试从端点到“选择点”的距离并返回最近的终端。如果您不将其限制为2顶点样条线,那将有点困难。
如果您想看的话,我有一些原型代码

surveyor_randy 发表于 2007-11-11 12:06:56


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

SomeCallMeDave 发表于 2007-11-11 12:31:13

这是粗略的代码。 它需要错误检查,实体类型测试等,
但我认为它得到了这个想法(如果我正确地解释了你的第一篇文章)。
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类进行访问。

surveyor_randy 发表于 2007-11-11 15:37:36

谢谢你的代码片段!至于定位程序,我将研究VL主动X模块。老实说,我甚至不知道有这样的东西存在。我很想访问大量的VL例程!你知道我在哪里可以找到这个模块的文档吗
我已经编写了我的大多数定位函数。剩下唯一要做的就是为水平曲线定位,这应该没什么大不了的!再次感谢您的帮助!
页: [1]
查看完整版本: 选定线的最近端点