首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用vb.net在AutoCAD二次开发中求圆与直线的交点

用vb.net在AutoCAD二次开发中求圆与直线的交点
EN

Stack Overflow用户
提问于 2015-08-26 10:02:43
回答 1查看 2.8K关注 0票数 0

对于我的autocad自定义,我需要找到圆与直线的交点。下面是我的代码,但它没有返回任何交叉点。

由于对我的问题施加的约束,总会有至少一个交叉点。但是,我真的不能得到那个十字路口point.Can谁来帮我指出实现我想做的事情的方法?

代码语言:javascript
复制
Imports System
Imports System.Runtime.InteropServices
Imports System.Drawing
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.ApplicationServices.DocumentExtension

Namespace sweeping
    Public Class intersecting
        <CommandMethod("ITSSPS")>
        Public Shared Sub SweepAlongPath()

            Dim doc As Document = Application.DocumentManager.MdiActiveDocument
            Dim db As Database = doc.Database
            Dim ed As Editor = doc.Editor

            Using tr As Transaction = db.TransactionManager.StartTransaction()

                'getting point1
                Dim ppo1 As PromptPointOptions = New PromptPointOptions(vbLf & "choose/click the centre of the first circle:")
                Dim ppr1 As PromptPointResult = doc.Editor.GetPoint(ppo1)
                Dim pt1 As Point3d = ppr1.Value
                If ppr1.Status = PromptStatus.Cancel Then Exit Sub

                Dim pdo11 As PromptDoubleOptions = New PromptDoubleOptions(vbLf & "The radius of the first cycle? Type 5 as 5.0")
                Dim pdr11 As PromptDoubleResult = doc.Editor.GetDouble(pdo11)
                Dim pd11 As Double = pdr11.Value
                If pdr11.Status = PromptStatus.Cancel Then Exit Sub

                Dim pdo12 As PromptDoubleOptions = New PromptDoubleOptions(vbLf & "What about the height? Type 5 as 5.0")
                Dim pdr12 As PromptDoubleResult = doc.Editor.GetDouble(pdo12)
                Dim pd12 As Double = pdr12.Value
                If pdr12.Status = PromptStatus.Cancel Then Exit Sub

                'getting point2
                Dim ppo2 As PromptPointOptions = New PromptPointOptions(vbLf & "choose/click the centre of the second circle:")
                Dim ppr2 As PromptPointResult = doc.Editor.GetPoint(ppo2)
                Dim pt2 As Point3d = ppr2.Value
                If ppr2.Status = PromptStatus.Cancel Then Exit Sub

                Dim pdo21 As PromptDoubleOptions = New PromptDoubleOptions(vbLf & "The radius of the second cycle? Type 5 as 5.0")
                Dim pdr21 As PromptDoubleResult = doc.Editor.GetDouble(pdo21)
                Dim pd21 As Double = pdr21.Value
                If pdr21.Status = PromptStatus.Cancel Then Exit Sub

                Dim pdo22 As PromptDoubleOptions = New PromptDoubleOptions(vbLf & "What about the height? Type 5 as 5.0")
                Dim pdr22 As PromptDoubleResult = doc.Editor.GetDouble(pdo22)
                Dim pd22 As Double = pdr22.Value
                If pdr22.Status = PromptStatus.Cancel Then Exit Sub

                Dim line12 As Line = New Line(pt1, pt2)
                Dim Cir1, Cir2 As Circle
                Cir1 = New Circle() : Cir1.Center = pt1 : Cir1.Normal = New Vector3d(0, 0, 1) : Cir1.Radius = pd11
                Cir2 = New Circle() : Cir2.Center = pt2 : Cir2.Normal = New Vector3d(0, 0, 1) : Cir2.Radius = pd21

                Dim bt As BlockTable = tr.GetObject(db.BlockTableId, OpenMode.ForRead)
                Dim btr As BlockTableRecord = tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)

                Dim Cir11 As Entity = DirectCast(Cir1, Entity)
                Dim line121 As Entity = DirectCast(line12, Entity)


                btr.AppendEntity(Cir11)
                tr.AddNewlyCreatedDBObject(Cir11, True)

                btr.AppendEntity(line121)
                tr.AddNewlyCreatedDBObject(line121, True)

                Dim its3dpts As Point3dCollection = New Point3dCollection()
                line121.IntersectWith(Cir11, Intersect.OnBothOperands, its3dpts, IntPtr.Zero, IntPtr.Zero)

                For Each pt3d As Point3d In its3dpts
                    Dim ptt As Point3d = pt3d
                    Dim Cir3 As Circle = New Circle()
                    Cir3.Center = ptt : Cir3.Normal = New Vector3d(0, 0, 1) : Cir3.Radius = 450
                    ed.WriteMessage(pt3d.ToString)
                    btr.AppendEntity(Cir3)
                    tr.AddNewlyCreatedDBObject(Cir3, True)
                Next
                tr.Commit()
            End Using
        End Sub
    End Class
End Namespace

非常感谢帮助我的人。

EN

回答 1

Stack Overflow用户

发布于 2015-08-26 19:29:34

这个对IntersectWith的调用应该是有效的。我在这里试过了,它工作得很好。你确定圆和直线真的相交吗?

下面是我的测试代码:

代码语言:javascript
复制
[CommandMethod("findIntersect")]
public static void CmdFindIntersect()
{
  Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  ObjectId lineId = ed.GetEntity("Select line: ").ObjectId; // not safe, test only
  ObjectId circleId = ed.GetEntity("Select circle: ").ObjectId; // not safe, test only

  Database db = Application.DocumentManager.MdiActiveDocument.Database;
  using (Transaction trans = db.TransactionManager.StartTransaction())
  {
    Line l = trans.GetObject(lineId, OpenMode.ForRead) as Line;
    Circle c = trans.GetObject(circleId, OpenMode.ForRead) as Circle;

    Point3dCollection intersectionPoints = new Point3dCollection();
    l.IntersectWith(c, Intersect.OnBothOperands, intersectionPoints, IntPtr.Zero, IntPtr.Zero);

    trans.Commit();

    ed.WriteMessage("{0} intersection(s) found", intersectionPoints.Count);
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32216859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档