Author Topic: Use GetClosestPointTo() and OnSegmentAt() to locate a pline vertex near a point  (Read 671 times)

0 Members and 1 Guest are viewing this topic.

Offline fixo

  • Full Member
  • ***
  • Posts: 135
  • Karma: +4/-0
  • Gender: Male
    • prefered language: C
    • Prog expertise: Good
    • View Profile
       
Code: [Select]
        // based on article by Wayne Brill
        // http://adndevblog.typepad.com/autocad/2012/06/use-getclosestpointto-and-onsegat-to-locate-a-polyline-vertex-near-a-point.html
        [CommandMethod("oseg")]
       public  static void TEST_PointOnPoly()
        {

                Database db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;

                Editor ed = acApp.DocumentManager.MdiActiveDocument.Editor;

                CoordinateSystem3d cs = ed.CurrentUserCoordinateSystem.CoordinateSystem3d;

                Plane plan = new Plane(Point3d.Origin, cs.Zaxis);

                Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("osmode", 512);

                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    try
                    {
                        Entity ename;

                        Point3d pt;

                        Point3d ptWcs;

                        PromptEntityOptions peo = new PromptEntityOptions("\nSelect Pline: ");

                        peo.SetRejectMessage("\nYou have to select LWPOLYLINE!");

                        peo.AddAllowedClass(typeof(Polyline), false);

                        PromptEntityResult res = ed.GetEntity(peo);

                        if (res.Status != PromptStatus.OK) return;

                        ObjectId id = res.ObjectId;

                        // Convert to WCS incase selection was made

                        // while in a UCS.

                        pt = res.PickedPoint;

                        // Transform from UCS to WCS

                        Matrix3d mat =

                          Matrix3d.AlignCoordinateSystem(

                            Point3d.Origin,

                            Vector3d.XAxis,

                            Vector3d.YAxis,

                            Vector3d.ZAxis,

                            cs.Origin,

                            cs.Xaxis,

                            cs.Yaxis,

                            cs.Zaxis

                          );

                        ptWcs = pt.TransformBy(mat);

                        ename = tr.GetObject(id, OpenMode.ForRead) as Entity;

                        Polyline pline = ename as Polyline;

                        if (pline == null)
                        {

                            ed.WriteMessage("\nSelected Entity is not a Polyline");

                            return;

                        }

                        Point3d clickpt = pline.GetClosestPointTo(ptWcs, false);

                        for (int c = 0; c < pline.NumberOfVertices; c++)
                        {

                            double segParam= new double();

                            // This is the test filter here...it uses the

                            // nifty API OnSegmentAt

                            if (pline.OnSegmentAt(c, clickpt.Convert2d(plan), segParam))
                            {

                                ed.WriteMessage("\nSelected Segment: {0} \n", c + 1);

                                break;

                            }

                        }
                        }

                        catch (System.Exception ex)
                        {

                           ed.WriteMessage("\n" + ex.Message + "\n" + ex.StackTrace);

                        }

                    }

                }

~'J'~