Author Topic: Stationing polyline  (Read 2157 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
Stationing polyline
« on: May 19, 2012, 07:48:54 PM »
Code: [Select]
    [CommandMethod("akon")]
        public static void Stationing()
        {

            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Database db = doc.Database;

            Editor ed = doc.Editor;

            Matrix3d ucs = ed.CurrentUserCoordinateSystem;

            //TypedValue[] filter = { new TypedValue((int)DxfCode.Start, "LWPOLYLINE") };

            //SelectionFilter filterSset = new SelectionFilter(filter);

            //PromptSelectionOptions pso = new PromptSelectionOptions();

            //pso.SingleOnly = true;//comment this if you want to label multiple polylines

            //pso.MessageForAdding = "Select a single polyline >> ";

            //PromptSelectionResult psr = ed.GetSelection(pso, filterSset);

            //if (psr.Status != PromptStatus.OK)
            //    return;
            double fuzz = (double)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("dimtxt");
            if (fuzz == 0) fuzz = 0.1;
            //-------------------------------------------------------------------
            PromptPointOptions ppo = new PromptPointOptions("\nPick a point near to the start of curve: ");
            PromptPointResult ppr = default(PromptPointResult);
            ppr = ed.GetPoint(ppo);
            if (ppr.Status != PromptStatus.OK)
            {
                ed.WriteMessage("\nwrong point specification!");
                return;
            }
            Point3d p = ppr.Value;
            //------------------------------------------------------------''
            Vector3d vd = new Vector3d(fuzz, fuzz, 0);
            Point3d pMin = p - vd;
            Point3d pMax = p + vd;
            TypedValue[] tvs = new TypedValue[] { new TypedValue(0, "lwpolyline") };
            Point3dCollection points = new Point3dCollection();
            points.Add(pMin);
            points.Add(pMax);
            SelectionFilter sf = new SelectionFilter(tvs);
            PromptSelectionResult sres = ed.SelectFence(points, sf);
            if (sres.Status != PromptStatus.OK)
            {
                ed.WriteMessage("\nWrong selection!");
                return;
            }

            if (sres.Value.Count == 0)
            {
                ed.WriteMessage("\nNothing selected!");
                return;
            }

            //-------------------------------------------------------------------

            Transaction tr = db.TransactionManager.StartTransaction();

            using (tr)
            {
                try
                {

                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                    //' cast entity as Line
                    ObjectId eid = sres.Value.GetObjectIds()[0];

                    Entity ent = tr.GetObject(eid, OpenMode.ForRead) as Entity;
                    //'-----------------------------------------------------------''
                    Polyline pline = ent as Polyline;

                    if (pline != null)
                    {
                        ed.WriteMessage("\n{0},{1}", pline.StartPoint.X, pline.StartPoint.Y);
                    }
                    //ObjectId[] ids = psr.Value.GetObjectIds();
                    Point3d px = pline.GetClosestPointTo(pMin, false);

                    double leng = pline.Length;

                    bool endclick = false;

                    if ((pline.GetDistAtPoint(px) > leng / 2))
                    {
                        endclick = true;
                    }

                    double theight = db.Textsize;

                    if (theight == 0) theight = db.Dimtxt;

                    //for (int i = 0; i < ids.Length; i++)
                    //{
                    // Autodesk.AutoCAD.DatabaseServices.Polyline pline = tr.GetObject(ids[i], OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Polyline;

                    double step = 50.0;// <---  change the step to your needs

                    int num = (int)(leng / step);

                    double ang;

                    int n = 1;

                    Plane plan = pline.GetPlane();

                    Line ln = null;

                    DBText txt = null;

                    Vector3d vect = new Vector3d();

                    Vector3d vec = new Vector3d();

                    Point3d ptxt = new Point3d();

                    Point3d ppt = new Point3d();

                    Point3d pptx = new Point3d();

                    if (!endclick)
                    {
                        for (n = 0; n < num + 1; n++)
                        {
                            ptxt = pline.GetPointAtDist(step * n);

                            vec = pline.GetFirstDerivative(ptxt).GetPerpendicularVector();

                            ppt = (ptxt + vec * theight * 8).TransformBy(ucs);

                            pptx = (ptxt + vec * theight * 5).TransformBy(ucs);

                            ln = new Line(ptxt, ppt);

                            btr.AppendEntity(ln);

                            tr.AddNewlyCreatedDBObject(ln, true);

                            vect = ln.GetFirstDerivative(ppt).GetPerpendicularVector();

                            txt = new DBText();

                            txt.Position = pptx;

                            txt.TextString = string.Format("{0:f2}", n * step);

                            txt.HorizontalMode = TextHorizontalMode.TextCenter;

                            txt.VerticalMode = TextVerticalMode.TextBottom;

                            txt.AlignmentPoint = pptx;

                            ang = ln.Angle + Math.PI;

                            if ((ang > Math.PI / 2) || (ang < Math.PI * 1.5))

                                ang = ang + Math.PI;
                            txt.Rotation = ang;

                            btr.AppendEntity(txt);

                            tr.AddNewlyCreatedDBObject(txt, true);

                        }

                        ptxt = pline.EndPoint;

                        vec = pline.GetFirstDerivative(ptxt).GetPerpendicularVector();

                        ppt = (ptxt + vec * theight * 8).TransformBy(ucs);

                        pptx = (ptxt + vec * theight * 5).TransformBy(ucs);

                        ln = new Line(ptxt, ppt);

                        btr.AppendEntity(ln);

                        tr.AddNewlyCreatedDBObject(ln, true);

                        vect = ln.GetFirstDerivative(ppt).GetPerpendicularVector();

                        txt = new DBText();

                        txt.Position = pptx;

                        txt.TextString = string.Format("{0:f2}", leng);

                        txt.HorizontalMode = TextHorizontalMode.TextCenter;

                        txt.VerticalMode = TextVerticalMode.TextBottom;

                        txt.AlignmentPoint = pptx;

                        ang = ln.Angle + Math.PI;

                        if ((ang > Math.PI / 2) || (ang < Math.PI * 1.5))

                            ang = ang + Math.PI;

                        txt.Rotation = ang;

                        btr.AppendEntity(txt);

                        tr.AddNewlyCreatedDBObject(txt, true);
                    }
                    else
                    {
                        //---------------------------------------------------
                        for (n = num; n >= 0; n--)
                        {
                            ptxt = pline.GetPointAtDist(step * n);

                            vec = pline.GetFirstDerivative(ptxt).GetPerpendicularVector();

                            ppt = (ptxt + vec * theight * 8).TransformBy(ucs);

                            pptx = (ptxt + vec * theight * 5).TransformBy(ucs);

                            ln = new Line(ptxt, ppt);

                            btr.AppendEntity(ln);

                            tr.AddNewlyCreatedDBObject(ln, true);

                            vect = ln.GetFirstDerivative(ppt).GetPerpendicularVector();

                            txt = new DBText();

                            txt.Position = pptx;

                            txt.TextString = string.Format("{0:f2}", n * step);

                            txt.HorizontalMode = TextHorizontalMode.TextCenter;

                            txt.VerticalMode = TextVerticalMode.TextBottom;

                            txt.AlignmentPoint = pptx;

                            ang = ln.Angle + Math.PI;

                            if ((ang > Math.PI / 2) || (ang < Math.PI * 1.5))

                                ang = ang + Math.PI;

                            txt.Rotation = ang;

                            btr.AppendEntity(txt);

                            tr.AddNewlyCreatedDBObject(txt, true);

                        }

                        ptxt = pline.EndPoint;

                        vec = pline.GetFirstDerivative(ptxt).GetPerpendicularVector();

                        ppt = (ptxt + vec * theight * 8).TransformBy(ucs);

                        pptx = (ptxt + vec * theight * 5).TransformBy(ucs);

                        ln = new Line(ptxt, ppt);

                        btr.AppendEntity(ln);

                        tr.AddNewlyCreatedDBObject(ln, true);

                        vect = ln.GetFirstDerivative(ppt).GetPerpendicularVector();

                        txt = new DBText();

                        txt.Position = pptx;

                        txt.TextString = string.Format("{0:f2}", leng);

                        txt.HorizontalMode = TextHorizontalMode.TextCenter;

                        txt.VerticalMode = TextVerticalMode.TextBottom;

                        txt.AlignmentPoint = pptx;

                        ang = ln.Angle + Math.PI;

                        if ((ang > Math.PI / 2) || (ang < Math.PI * 1.5))

                            ang = ang + Math.PI;

                        txt.Rotation = ang;

                        btr.AppendEntity(txt);

                        tr.AddNewlyCreatedDBObject(txt, true);
                        //---------------------------------------------------

                    }

                    db.TransactionManager.QueueForGraphicsFlush();

                    //}

                    tr.Commit();
                }
                catch (Autodesk.AutoCAD.Runtime.Exception ex)
                {
                    MessageBox.Show(string.Format(
                    "Error:\n{0}\nTrace:\n{1}", ex.Message, ex.StackTrace));
                }
            }
        }

~'J'~