hehao 发表于 2009-4-14 21:26:00

求助:我在cad08或06里画的多段线怎么不支持对象

本帖最后由 作者 于 2009-4-24 13:18:01 编辑 <br /><br /> <p>Sub toudu()<br/>Dim pl(7) As Double</p><p>pt(2) as Double<br/>Dim plineObj As AcadLWPolyline<br/>pl(0) = 5.6811<br/>pl(1) = 0<br/>pl(2) = -5.6811<br/>pl(3) = 0<br/>pl(4) = -5.6811<br/>pl(5) = 0<br/>pl(6) = 5.6811<br/>pl(7) = 0<br/>Set plineObj = ThisDrawing.ModelSpace.AddLightWeightPolyline(pl)<br/>plineObj.SetBulge 0, 1.72677826<br/>plineObj.SetBulge 1, 0<br/>dim q as Double<br/>&nbsp;&nbsp; pt(0) =&nbsp;4.470<br/>&nbsp;&nbsp; pt(1) =&nbsp;7.921<br/>&nbsp;&nbsp; pt(2) = 0</p><p><font color="#f70909">q = DistancePt2Poly(pt1, plineObj)‘调用明经的点到多段线的最短距离<br/>&nbsp;&nbsp;&nbsp; MsgBox "点到多段线的最近距离是:" &amp; q</font></p><p><font color="#f70909">end sub</font></p><p>Private Function DistancePt2Poly(ByVal pt As Variant, ByVal objPoly As AcadLWPolyline) As Double<br/>&nbsp;&nbsp;&nbsp; Dim intVertCount As Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 多段线的顶点数量<br/>&nbsp;&nbsp;&nbsp; Dim varCoords As Variant&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 保存所有顶点的坐标数组<br/>&nbsp;&nbsp;&nbsp; varCoords = objPoly.Coordinates<br/>&nbsp;&nbsp;&nbsp; intVertCount = (UBound(varCoords) + 1) / 2<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; ' 遍历所有顶点,判断每一段曲线与点之间的距离<br/>&nbsp;&nbsp;&nbsp; Dim i As Integer<br/>&nbsp;&nbsp;&nbsp; Dim ptCurrent As Variant, ptNext As Variant&nbsp;&nbsp;&nbsp;&nbsp; ' 当前顶点和下一个顶点<br/>&nbsp;&nbsp;&nbsp; Dim minDistance As Double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 最短距离<br/>&nbsp;&nbsp;&nbsp; For i = 0 To intVertCount - 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 获得当前顶点和下一个顶点的坐标<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If i &lt; intVertCount - 1 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptCurrent = objPoly.Coordinate(i)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptNext = objPoly.Coordinate(i + 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ElseIf objPoly.Closed Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptCurrent = objPoly.Coordinate(i)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptNext = objPoly.Coordinate(0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit For<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 分情况计算距离<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If objPoly.GetBulge(i) = 0 Then&nbsp;&nbsp;&nbsp;&nbsp; ' 如果该段是直线<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If i = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; minDistance = DisPt2Line(pt, ptCurrent, ptNext)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If DisPt2Line(pt, ptCurrent, ptNext) &lt; minDistance Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; minDistance = DisPt2Line(pt, ptCurrent, ptNext)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim aimPoly As AcadLWPolyline&nbsp;&nbsp; ' 辅助多段线<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim ptVerts(0 To 3) As Double&nbsp;&nbsp; ' 辅助多段线的顶点<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim varEnts As Variant&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 分解辅助多段线后得到的实体<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim aimArc As AcadArc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 辅助圆弧<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptVerts(0) = ptCurrent(0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptVerts(1) = ptCurrent(1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptVerts(2) = ptNext(0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptVerts(3) = ptNext(1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set aimPoly = ThisDrawing.ModelSpace.AddLightWeightPolyline(ptVerts)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aimPoly.SetBulge 0, objPoly.GetBulge(i)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 分解辅助多段线,得到一个圆弧<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varEnts = aimPoly.Explode<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If TypeOf varEnts(0) Is AcadArc Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set aimArc = varEnts(0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 计算点到圆弧段的距离<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If i = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; minDistance = DisPt2Arc(pt, aimArc)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If DisPt2Arc(pt, aimArc) &lt; minDistance Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; minDistance = DisPt2Arc(pt, aimArc)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 删除辅助圆弧和多段线<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aimPoly.Delete<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aimArc.Delete<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; Next i<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; DistancePt2Poly = minDistance<br/>End Function</p><p>' 计算点到直线的最短距离<br/>Private Function DisPt2Line(ByVal pt As Variant, ByVal ptStart As Variant, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal ptEnd As Variant) As Double<br/>&nbsp;&nbsp;&nbsp; ' 计算三点所组成的三角形的面积s=sqr(p*(p-a)*(p-b)*(p-c)),p=0.5*(a+b+c)<br/>&nbsp;&nbsp;&nbsp; Dim area As Double<br/>&nbsp;&nbsp;&nbsp; Dim p As Double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 周长的一半<br/>&nbsp;&nbsp;&nbsp; Dim a As Double, b As Double, c As Double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 各条边的边长<br/>&nbsp;&nbsp;&nbsp; a = Distance(pt, ptStart)<br/>&nbsp;&nbsp;&nbsp; b = Distance(pt, ptEnd)<br/>&nbsp;&nbsp;&nbsp; c = Distance(ptStart, ptEnd)<br/>&nbsp;&nbsp;&nbsp; p = (a + b + c) / 2<br/>&nbsp;&nbsp;&nbsp; area = Sqr(p * (p - a) * (p - b) * (p - c))<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; ' 计算点到直线的垂直距离<br/>&nbsp;&nbsp;&nbsp; Dim dblDistance As Double<br/>&nbsp;&nbsp;&nbsp; dblDistance = 2 * area / c<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; ' 计算垂足到直线两端点的距离<br/>&nbsp;&nbsp;&nbsp; Dim dblDis1 As Double, dblDis2 As Double<br/>&nbsp;&nbsp;&nbsp; dblDis1 = Sqr(a ^ 2 - dblDistance ^ 2)<br/>&nbsp;&nbsp;&nbsp; dblDis2 = Sqr(b ^ 2 - dblDistance ^ 2)<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; ' 根据点是否在直线两端点之间,返回点到直线的最短距离<br/>&nbsp;&nbsp;&nbsp; If dblDis1 &gt; c Or dblDis2 &gt; c Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If a &gt; b Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DisPt2Line = b<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DisPt2Line = a<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DisPt2Line = dblDistance<br/>&nbsp;&nbsp;&nbsp; End If<br/>End Function</p><p>' 计算点到圆弧的最短距离<br/>Private Function DisPt2Arc(ByVal pt As Variant, ByVal objArc As AcadArc) As Double<br/>&nbsp;&nbsp;&nbsp; ' 假设点在圆弧的扇形区域内,返回点到圆弧的距离<br/>&nbsp;&nbsp;&nbsp; DisPt2Arc = Distance(pt, objArc.Center) - objArc.Radius<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; ' 计算点到圆弧两个端点的距离<br/>&nbsp;&nbsp;&nbsp; Dim dblDis1 As Double, dblDis2 As Double<br/>&nbsp;&nbsp;&nbsp; dblDis1 = Distance(pt, objArc.StartPoint)<br/>&nbsp;&nbsp;&nbsp; dblDis2 = Distance(pt, objArc.EndPoint)<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; ' 如果点不在圆弧的扇形区域内,则到两端点的距离包含了一个最小距离<br/>&nbsp;&nbsp;&nbsp; Dim angle As Double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 圆心到点的矢量的角度<br/>&nbsp;&nbsp;&nbsp; angle = ThisDrawing.Utility.AngleFromXAxis(objArc.Center, pt)<br/>&nbsp;&nbsp;&nbsp; Dim angleStart As Double, angleEnd As Double<br/>&nbsp;&nbsp;&nbsp; angleStart = objArc.StartAngle<br/>&nbsp;&nbsp;&nbsp; angleEnd = objArc.EndAngle<br/>&nbsp;&nbsp;&nbsp; If (angle - angleStart) * (angle - angleEnd) * (angleEnd - angleStart) &gt; ZERO Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If dblDis1 &gt; dblDis2 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DisPt2Arc = dblDis2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DisPt2Arc = dblDis1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; End If<br/>End Function</p><p>' 计算两点之间的距离<br/>Private Function Distance(ByVal pt1 As Variant, ByVal pt2 As Variant) As Double<br/>&nbsp;&nbsp;&nbsp; Distance = Sqr((pt1(0) - pt2(0)) ^ 2 + (pt1(1) - pt2(1)) ^ 2)<br/>End Function</p><p>' 测试本节的函数<br/>Sub GetDistancePt2Poly()<br/>&nbsp;&nbsp;&nbsp; Dim pt As Variant<br/>&nbsp;&nbsp;&nbsp; pt = ThisDrawing.Utility.GetPoint(, "拾取一点:")</p><p>&nbsp;&nbsp;&nbsp; Dim objPoly As AcadLWPolyline<br/>&nbsp;&nbsp;&nbsp; Dim ptPick As Variant<br/>&nbsp;&nbsp;&nbsp; ThisDrawing.Utility.GetEntity objPoly, ptPick, "选择多段线:"<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; MsgBox "点到多段线的最近距离是:" &amp; DistancePt2Poly(pt, objPoly)<br/>End Sub</p><p><br/></p><p>怎么q的值是空值,要呢显示错误:(溢出)调试了好久就没有,但是在命令行用pline画一个,用哪个测试函数GetDistancePt2Poly就有了。请高手看是怎么回事?多谢</p>
页: [1]
查看完整版本: 求助:我在cad08或06里画的多段线怎么不支持对象