Author Topic: Break all Lines  (Read 666 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
Break all Lines
« on: May 21, 2012, 09:30:45 PM »
 
Code: [Select]
      [CommandMethod("bral", CommandFlags.UsePickSet | CommandFlags.Redraw)]
        public static void TestIntersectAllLines()
        {

            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            try
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    TypedValue[] tvs = new TypedValue[] { new TypedValue(0, "line") };

                    SelectionFilter sf = new SelectionFilter(tvs);
                    PromptSelectionResult sres = ed.GetSelection(sf);
                    if (sres.Status != PromptStatus.OK)
                    {
                        ed.WriteMessage("\nWrong selection!");
                        return;
                    }

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

                    List<ObjectId> rids = new List<ObjectId>();

                    rids.AddRange(objs);

                    BlockTableRecord btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
                    Entity ent = null;

                    foreach (SelectedObject subid in sres.Value)
                    {
                        ent = tr.GetObject(subid.ObjectId, OpenMode.ForRead, false) as Entity;
                        Line ln1 = ent as Line;
                        List<Point3d> points = new List<Point3d>();
                        Point3dCollection pts = new Point3dCollection();
                        foreach (ObjectId id in rids)
                        {
                            if (id == subid.ObjectId)
                                continue;
                            Entity next = tr.GetObject(id, OpenMode.ForRead, false) as Entity;
                            Line ln2 = next as Line;
                            ln1.IntersectWith(ln2, Intersect.OnBothOperands, pts, 0, 0);
                            //ln1.IntersectWith(ln2, Intersect.OnBothOperands, pts, IntPtr.Zero, IntPtr.Zero);// <-- might be other syntax
                        }

                        foreach (Point3d p in pts)
                            points.Add(p);
                        Point3d sp = ln1.StartPoint;
                        Point3d ep = ln1.EndPoint;
                        if (!points.Contains(sp))
                            points.Add(sp);
                        if (!points.Contains(ep))
                            points.Add(ep);

                        points.Sort(delegate(Point3d a, Point3d b)
                        {
                            return Convert.ToInt32(
                                    Convert.ToDouble(sp.DistanceTo(a).CompareTo(
                       Convert.ToDouble(sp.DistanceTo(b)))));
                        }
                        );

                        for (int n = 0; n < points.Count - 1; n++)
                        {
                            Line lin = new Line(points[n], points[n + 1]);
                            lin.SetPropertiesFrom(ln1);
                            lin.ColorIndex = n;
                            btr.AppendEntity(lin);
                            tr.AddNewlyCreatedDBObject(lin, true);
                        }

                    }
                    foreach (SelectedObject subid in sres.Value)
                    {
                        ent = tr.GetObject(subid.ObjectId, OpenMode.ForRead) as Entity;
                        if (!ent.IsWriteEnabled)
                            ent.UpgradeOpen();
                        ent.Erase();
                    }
                    tr.Commit();
                }
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage(ex.Message + "\n" + ex.StackTrace);
            }
        }

~'J'~