- 积分
- 10513
- 明经币
- 个
- 注册时间
- 2002-6-3
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
- Option Explicit
- Private Type COORD
- x As Long
- y As Long
- End Type
- Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As Any, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
- Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
- Private Declare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long, ByVal x As Long, ByVal y As Long) As Long
- Const ALTERNATE = 1
- Private Function PointInPolyine(ByVal Pt As Variant, ByVal lwpLineObj As AcadLWPolyline) As Boolean
-
- ' 多段线顶点数目
- Dim NumCoords As Long
- NumCoords = (UBound(lwpLineObj.Coordinates) + 1) / 2
-
- ' 多段线顶点坐标
- Dim poly() As COORD
- ReDim poly(1 To NumCoords)
- Dim i As Integer
- For i = 0 To UBound(lwpLineObj.Coordinates) - 1 Step 2
- poly(i / 2 + 1).x = lwpLineObj.Coordinates(i) * 10000
- poly(i / 2 + 1).y = lwpLineObj.Coordinates(i + 1) * 10000
- Next
-
- ' 创建区域
- Dim hRgn As Long
- hRgn = CreatePolygonRgn(poly(1), NumCoords, ALTERNATE)
- ' 如果成功创建
- If hRgn Then
- ' 如果点在区域内部
- If PtInRegion(hRgn, Pt(0) * 10000, Pt(1) * 10000) <> 0 Then
- PointInPolyine = True
- End If
- End If
-
- ' 删除区域
- DeleteObject hRgn
- End Function
- Sub test()
- Dim EntObj As AcadEntity
- Dim pPt As Variant
- ThisDrawing.Utility.GetEntity EntObj, pPt, "选择多段线: "
- pPt = ThisDrawing.Utility.GetPoint(, "指定点: ")
- If PointInPolyine(pPt, EntObj) Then
- Debug.Print "点" & Round(pPt(0), 4) & "," & Round(pPt(1), 4) & "在多段线内部! "
- Else
- Debug.Print "点" & Round(pPt(0), 4) & "," & Round(pPt(1), 4) & "在多段线外部! "
- End If
- End Sub
- 立即窗口
- 点234.1859,173.8979在多段线内部!
|
|