明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1879|回复: 6

[VBA]如何知道折线分解后第几段

[复制链接]
发表于 2003-11-12 11:13:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2003-11-12 18:43:26 编辑

有一条POLYLINE分成三折,鼠标选择到之后就将它分解成三段直线了。那么有没有办法知道刚才鼠标选择的是第几段呢?

If (selobj.EntityName = "AcDbPolyline") Then
   Dim explodedObjects As Variant
    explodedObjects = selobj.Explode
End If
下面应该怎么提取鼠标选择的那一段(现在变成了直线)的信息?
发表于 2003-11-12 20:29:00 | 显示全部楼层
object.GetEntity Object, PickedPoint[, Prompt],GetEntity时有返回一个PickedPoint,即选择点。通过它与各段直线的关系来判断,离哪一段最近的应该就是吧。
 楼主| 发表于 2003-11-12 22:27:00 | 显示全部楼层
凡兄能不能详细一点,喝醉了,看不大懂啊。
  最好帮我完善上面的程序。
多谢!
发表于 2003-11-12 23:02:00 | 显示全部楼层
  1. Sub test()
  2.     Dim selobj As AcadEntity
  3.     Dim pPt As Variant
  4.    
  5.     On Error GoTo ErrTrap
  6.     '选择多段线
  7.     ThisDrawing.Utility.GetEntity selobj, pPt, "指定多段线: "
  8.     If selobj.EntityName = "AcDbPolyline" Then
  9.         Dim explodedObjects As Variant
  10.         '炸开
  11.         explodedObjects = selobj.Explode
  12.         Dim i As Integer
  13.         Dim sPt As Variant
  14.         Dim ePt As Variant
  15.         Dim EntObj As AcadEntity
  16.         For i = 0 To UBound(explodedObjects)
  17.             sPt = explodedObjects(i).StartPoint
  18.             ePt = explodedObjects(i).EndPoint
  19.             '判断选择点是否位于直线两端点的X坐标和Y坐标之内
  20.             '一般情况下这种方法是可行的,对于特殊情况未做判断
  21.             If (pPt(0) > sPt(0) And pPt(0) < ePt(0)) Or (pPt(0) > ePt(0) And pPt(0) < sPt(0)) Then
  22.                 If (pPt(0) > sPt(0) And pPt(0) < ePt(0)) Or (pPt(0) > ePt(0) And pPt(0) < sPt(0)) Then
  23.                     Set EntObj = explodedObjects(i)
  24.                     Exit For
  25.                 End If
  26.             End If
  27.         Next
  28.         If Not (EntObj Is Nothing) Then
  29.             Debug.Print "距选择点最近的直线: " & EntObj.Handle
  30.         End If
  31.     End If
  32.     Exit Sub
  33.    
  34. ErrTrap:
  35.     If ThisDrawing.GetVariable("errno") = 7 Then
  36.         Resume
  37.     End If
  38.     On Error GoTo 0
  39. End Sub
 楼主| 发表于 2003-11-13 09:48:00 | 显示全部楼层
Sub fj()
Dim explodedObjects As Variant
        '炸开
        explodedObjects = selobj.Explode
        Dim k As Integer
        Dim EntObj As AcadEntity
        For k = 0 To UBound(explodedObjects)
            sPt = explodedObjects(k).StartPoint
            ePt = explodedObjects(k).EndPoint
            If (pPt(0) > sPt(0) And pPt(0) < ePt(0)) Or (pPt(0) > ePt(0) And pPt(0) < sPt(0)) Then
                If (pPt(1) > sPt(1) And pPt(1) < ePt(1)) Or (pPt(1) > ePt(1) And pPt(1) < sPt(1)) Then
                    Set lineobj = explodedObjects(k)
                    mp1(0) = sPt(0)
                    mp1(1) = sPt(1)
                    mp2(0) = ePt(0)
                    mp2(1) = ePt(1)        '判断选择点是否位于直线两端点的X坐标和Y坐标之内
            '一般情况下这种方法是可行的,对于特殊情况未做判断
                  ' Exit For
                End If
            End If
        Next
        If Not (EntObj Is Nothing) Then
            Debug.Print "距选择点最近的直线: " & EntObj.Handle
        End If
End Sub
  程序怎么只执行到 If (pPt(0) > sPt(0) And pPt(0) < ePt(0)) Or (pPt(0) > ePt(0) And pPt(0) < sPt(0)) Then然后就跳出来了啊?也不经过End if或者End sub,是什么原因呢?
发表于 2003-11-13 11:44:00 | 显示全部楼层
pPt是选择点,使用GetEntity时返回的。这儿你没有定义,就跑到原点(0,0,0)了。
发表于 2003-11-13 11:44:00 | 显示全部楼层
还有一个办法,用VL控件,取得点取的点到线上的最近点,然后用SelectAtPoint方法得到对象。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-28 13:33 , Processed in 0.168806 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表