Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - fixo

Pages: 1 ... 6 7 [8] 9
106
Hatching / Intersect an outerloop of hatch with curves
« on: June 17, 2012, 03:43:16 PM »
This code will work with associative hatch only

Code: [Select]
        [CommandMethod("hat", CommandFlags.Modal)]
        public static void IntersectHatchWithCurves()
        {

            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;

            Transaction tr = db.TransactionManager.StartTransaction();
            using (tr)
            {
                try
                {
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, false) as BlockTableRecord;
                    PromptEntityOptions peo = new PromptEntityOptions("\nSelect a hatch: ");
                    peo.SetRejectMessage("Select hatch only!");
                    peo.AddAllowedClass(typeof(Hatch), true);
                    PromptEntityResult res = doc.Editor.GetEntity(peo);
                    if (res.Status != PromptStatus.OK) return;
                    // Point3d pt = res.PickedPoint;
                    Entity ent = tr.GetObject(res.ObjectId, OpenMode.ForRead, false) as Entity;
                    Hatch hat = ent as Hatch;
                    if (hat == null)
                    {
                        Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("No luck, mate...");
                        return;
                    }
                    // get outer loop of hatch
                    HatchLoop loops = hat.GetLoopAt(0);
                    Polyline pline = new Polyline();
                 if (loops.IsPolyline)
                 {
                     DoubleCollection bulgcoll=new DoubleCollection();
                     Point2dCollection pts=new Point2dCollection();
                     BulgeVertexCollection bulges =  loops.Polyline;

                    for (int i=0;i<bulges.Count;i++)
                    {
                        BulgeVertex bulg = bulges[i];
                        bulgcoll.Add(bulg.Bulge);
                        pts.Add(bulg.Vertex);
                    }
                     // create polyline around of the hatch
                     pline = new Polyline(bulges.Count);
                    for (int n = 0; n < pts.Count; n++)
                    {
                        pline.AddVertexAt(n, pts[n], bulgcoll[n], 0, 0);
                    }
                     // commented lines used just for debug only
                    //btr.AppendEntity(pline);
                    //tr.AddNewlyCreatedDBObject(pline, true);
                    //pline.ColorIndex = 5;
                 }

                    // select all intersection curves on layer "0"
                 TypedValue[] tvs = new TypedValue[] {
              new TypedValue((int) DxfCode.Start, "arc,circle,line,lwpolyline,spline"),
              new TypedValue((int) DxfCode.LayerName, "0")
            };
                 SelectionFilter sf = new SelectionFilter(tvs);
                 PromptSelectionOptions pso = new PromptSelectionOptions();
                    pso.MessageForRemoval="\nwrong object selected!";
                 pso.MessageForAdding = "\nSelect curves separately one by another: ";
                 PromptSelectionResult psr = ed.GetSelection(pso,sf);
                 int count = 0;
                 if (psr.Status == PromptStatus.OK)
                 {
                     count = psr.Value.GetObjectIds().Length;

                     ed.WriteMessage("\nSelected:    " + count.ToString());

                 }
                 else
                 {
                     ed.WriteMessage("\nBad selection");
                     return;

                 }

                 foreach (SelectedObject selobj in psr.Value)
                 {
                     
                         DBObject obj = tr.GetObject(selobj.ObjectId, OpenMode.ForRead) as DBObject;
                         Curve curv = obj as Curve;
                         if (obj.ObjectId != pline.ObjectId)
                         {
                         Point3dCollection ipts = new Point3dCollection();
                         // next line is may have another syntax for other Acad release
                         pline.IntersectWith(curv, Intersect.OnBothOperands, ipts, (int)IntPtr.Zero, (int)IntPtr.Zero);

                         if (ipts.Count > 0)
                         {
                             foreach (Point3d pt in ipts)
                             {
                                 // draw circles in intersection for dispaying the result
                                 Circle circ = new Circle(pt, Vector3d.ZAxis, 0.5);
                                 btr.AppendEntity(circ);
                                 tr.AddNewlyCreatedDBObject(circ, true);
                                 circ.ColorIndex = 2;
                             }
                         }
                     }
                 }
                    tr.Commit();
                }
                catch (Autodesk.AutoCAD.Runtime.Exception ex)
                {
                    ed.WriteMessage("\n" + ex.Message + "\n" + ex.StackTrace);

                }
                finally
                {

                }
            }
        }

~'J'~

107
Colors and linetypes / Using AutoCAD dialogs
« on: June 17, 2012, 10:34:21 AM »
Code: [Select]
       using Autodesk.AutoCAD.Runtime;
        using Autodesk.AutoCAD.ApplicationServices;
        using Autodesk.AutoCAD.DatabaseServices;
        using Autodesk.AutoCAD.Geometry;
        using Autodesk.AutoCAD.EditorInput;
        using Autodesk.AutoCAD.EditorInput;
        using Autodesk.AutoCAD.Windows;
        //________________________________________//

        [Obsolete]//   just for use ObjectId.Open method below
        [CommandMethod("setlt")]
        public static void SetLinetype()
        {
            var db = HostApplicationServices.WorkingDatabase;
            var ld = new Autodesk.AutoCAD.Windows.LinetypeDialog();
            if (ld.ShowDialog() != DialogResult.OK) return;
            var ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;           
            LinetypeTableRecord ltr = ld.Linetype.Open(OpenMode.ForRead, false) as LinetypeTableRecord;
            ed.WriteMessage("\nSelected linetype: " + ltr.Name);
            db.Celtype = ld.Linetype;
        }


        [CommandMethod("setc")]
        public static void SetColor()
        {
            var db = HostApplicationServices.WorkingDatabase;
            var cd = new Autodesk.AutoCAD.Windows.ColorDialog();
            if (cd.ShowDialog() != DialogResult.OK) return;
            var ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            ed.WriteMessage("\nSelected color: " + cd.Color);
            db.Cecolor = cd.Color;

        }
   
        [CommandMethod("setlw")]
        public static void SetLineWeight()
        {
            var db = HostApplicationServices.WorkingDatabase;
            var lw = new Autodesk.AutoCAD.Windows.LineWeightDialog();
            if (lw.ShowDialog() != DialogResult.OK) return;
            var ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            LineWeight lwt = lw.LineWeight;
            ed.WriteMessage("\nSelected linetype: " + lwt.ToString());
            db.Celweight = lwt;
        }

~'J'~

108
Blocks / Get block name by subentity
« on: June 16, 2012, 12:16:41 PM »
Code: [Select]
        [CommandMethod("bnm")]
        // expired by Barbara Hun:
        // http://adndevblog.typepad.com/autocad/2012/05/get-block-that-entities-are-included-in.html#tpe-action-posted-6a0167607c2431970b0167674896a4970b
        public static void getBlockNameFromItsSubentity()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            Database db = doc.Database;

            Matrix3d ucs = ed.CurrentUserCoordinateSystem;

            PromptNestedEntityOptions pno = new PromptNestedEntityOptions("\nSelect an subentity inside an INSERT: ");

            PromptNestedEntityResult nres = ed.GetNestedEntity(pno);

            if (nres.Status != PromptStatus.OK)
            {
                ed.WriteMessage("\nEntsel failed");
                return;
            }

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

                using (tr)
                {
                    Point3d pickPt = nres.PickedPoint.TransformBy(ucs);

                    ed.WriteMessage("\nPicked point is {0}", pickPt);

                    ObjectId selId = nres.ObjectId;

                    List<ObjectId> objIds = new List<ObjectId>(nres.GetContainers());

                    // Reverse the "containers" list

                    // Now append the selected entity

                    objIds.Add(selId);

                    objIds.Reverse();

                    // Retrieve the sub-entity path for this entity

                    SubentityId subEnt = new SubentityId(SubentityType.Null, 0);

                    FullSubentityPath path = new FullSubentityPath(objIds.ToArray(), subEnt);

                    // Open the outermost container, relying on the open

                    // transaction...

                    Entity subent = tr.GetObject(objIds[0], OpenMode.ForRead, false) as Entity;

                    // Output the class name of the sub entity

                    ed.WriteMessage("\nThe sub entity is of type {0}", subent.GetType().Name);

                    // Get the object id of the owner block

                    ObjectId eid = subent.OwnerId;

                    DBObject bowner = tr.GetObject(eid, OpenMode.ForRead, false) as DBObject;

                    // Output the class name of the owner block

                    ed.WriteMessage("\nThe owner is of type {0}",

                    bowner.GetType().Name);

                    string blkname = string.Empty;

                    // Output the information of the block definition

                    BlockTableRecord btrec = bowner as BlockTableRecord;

                    if (btrec != null)
                    {

                        blkname = btrec.Name;


                        ed.WriteMessage("\nBlock Record name is {0}", blkname);

                    }
                    BlockReference bref = bowner as BlockReference;

                    if (bref != null)
                    {
                        bowner = tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead, false) as BlockTableRecord;

                        if (bref.IsDynamicBlock)
                        {
                            btrec = tr.GetObject(bref.DynamicBlockTableRecord, OpenMode.ForRead, false) as BlockTableRecord;

                            blkname = btrec.Name;
                        }
                        else
                        {
                            blkname = bref.Name;
                        }

                        ed.WriteMessage("\nBlock Reference name is {0}", blkname);

                    }
                    tr.Commit();
                }
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                ed.WriteMessage("\n" + ex.Message + "\n" + ex.StackTrace);
            }
            finally
            {

            }
        }

109
Blocks / Get all block references on a particular layout
« on: June 06, 2012, 07:01:24 PM »

Code: [Select]
      //inspired by Xiaodong Liang
      [CommandMethod("finb")]
        public static void FindBlokRefInLayout()
        {
            SelectionSet ss;

            string lName = "Layout1";

            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;
            // switch to the Layout1
            Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("ctab", lName);

            Transaction tr = db.TransactionManager.StartTransaction();

            using (tr)
            {
                try
                {
                    BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;

                    foreach (ObjectId id in bt)
                    {

                        BlockTableRecord btr;

                        btr = tr.GetObject(id, OpenMode.ForRead) as BlockTableRecord;

                        // if this is a layout

                        if (btr.IsLayout)
                        {

                            ObjectId lid = btr.LayoutId;

                            Layout lt = tr.GetObject(lid, OpenMode.ForWrite) as Layout;

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

                            // get name of the layout

                            if (lt.LayoutName != lName)
                            { 
                                continue;
                            }
                            else
                            {

                                // select all blocks on Layout1

                                RXClass etype = RXObject.GetClass(typeof(BlockReference));

                                // iterate the entities within the layout

                                foreach (ObjectId eid in btr)
                                {
                                    Entity ent;

                                    ent = tr.GetObject(eid, OpenMode.ForRead) as Entity;

                                    // cast if this is a block reference

                                    if (eid.ObjectClass.IsDerivedFrom(etype))
                                    {

                                        objs.Add(eid);

                                        // highlight entity
                                       
                                        ent.Highlight();

                                    }

                                }
                            }
                            // populate the selectionset

                                ed.SetImpliedSelection(objs.ToArray<ObjectId>());

                            // perform the selection

                                PromptSelectionResult res = ed.SelectImplied();

                           
                                if (res.Status == PromptStatus.OK)
                                {

                                    ss = res.Value;
                                    // display information for user
                                    ed.WriteMessage("\n\t---\tSelected: {0} block instances", ss.GetObjectIds().Length);
                                }
                                else
                                {
                                    ed.WriteMessage("\nEmpty selection!");
                                   // return;
                                }

                        }

                    }
                    tr.Commit();
                }
                catch (System.Exception ex)
                {
                    ed.WriteMessage("\n" + ex.Message + "\n" + ex.StackTrace);
                }
            }
        }

~'J'~

110
Blocks / Get constant attributes example
« on: May 29, 2012, 07:40:02 PM »
 
Code: [Select]
       [CommandMethod("gatt", CommandFlags.Modal | CommandFlags.Session)]
        public static void GetAttributesTest()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            using (DocumentLock docloc = doc.LockDocument())
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    try
                    {
                        BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;                       
                        PromptSelectionOptions pso = new PromptSelectionOptions();
                        pso.MessageForRemoval = "\nWrong objects selected or Nothing selected";
                        pso.MessageForAdding = "\nSelect Blocks";
                        TypedValue[] tvs = new TypedValue[] { new TypedValue(0, "INSERT") };
                        SelectionFilter filt = new SelectionFilter(tvs);
                        PromptSelectionResult psr = ed.GetSelection(pso, filt);
                        if (!(psr.Status == PromptStatus.OK))
                            return;
                        if (psr.Value.Count == 0)
                        {
                            ed.WriteMessage("\nCount: {0} blocks",  psr.Value.Count);
                            return;
                        }

                        foreach (SelectedObject sobj in psr.Value)
                        {
                            BlockReference bref = (BlockReference)tr.GetObject(sobj.ObjectId, OpenMode.ForRead);
                            BlockTableRecord btrec = (BlockTableRecord)tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead);
                            StringBuilder sb = new StringBuilder();
                            //Get constant attributes from BlockDefinition object
                            foreach (ObjectId eid in btrec)
                            {
                                DBObject obj = (Entity)tr.GetObject(eid, OpenMode.ForRead);
                                if (obj is AttributeDefinition)
                                {
                                    AttributeDefinition atdef = obj as AttributeDefinition;
                                    if (atdef.Constant)
                                    {
                                        sb.AppendLine(atdef.TextString);
                                    }
                                }


                            }
                            //Get visible attributes from BlockReference object
                            Autodesk.AutoCAD.DatabaseServices.AttributeCollection attcoll = bref.AttributeCollection;

                            foreach (ObjectId id in attcoll)
                            {
                                AttributeReference atref = (AttributeReference)tr.GetObject(id, OpenMode.ForRead);
                                sb.AppendLine(atref.TextString);
                            }
                            ed.WriteMessage(sb.ToString() + "\n");

                        }
                        tr.Commit();
                    }
                    catch (Autodesk.AutoCAD.Runtime.Exception ex)
                    {
                        ed.WriteMessage("\n" + ex.Message + "\n" + ex.StackTrace);
                    }
                }
            }
        }

~'J'~

111
Blocks / Sample code to renumber blocks
« on: May 29, 2012, 05:41:56 PM »
 [CommandMethod("BlocksRenumbering", "brenum", CommandFlags.Modal | CommandFlags.Session | CommandFlags.Redraw)]
        public static void TestRenumberBlocks()
        {
            // objects initializing
            Document doc = acadApp.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            Database db = doc.Database;

            try
            {
                using (doc.LockDocument())
                {
                    using (Transaction tr = db.TransactionManager.StartTransaction())
                    {
                        PromptStringOptions psto = new PromptStringOptions("\nEnter a  block name: ");

                        psto.AllowSpaces = true;

                        psto.DefaultValue = "Door";// change default block name here

                        PromptResult stres;

                        stres = ed.GetString(psto);

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

                        string oldblock = stres.StringResult;

                        ed.WriteMessage("\nBlock Name Entered:\t{0}\n", oldblock);

                        psto = new PromptStringOptions("\nEnter a tag name: ");

                        psto.AllowSpaces = true;

                        psto.DefaultValue = "SYM.";//change default tag name here

                        stres = ed.GetString(psto);

                        if (stres.Status != PromptStatus.OK)

                            return;

                        string tagname = stres.StringResult;

                        ed.WriteMessage("\nTag Name Entered:\t{0}\n", tagname);
                       
                        PromptIntegerOptions pio = new PromptIntegerOptions("\nEnter an initial attribute value: ");

                        pio.AllowNegative = false;

                        pio.AllowNone = true;

                        pio.AllowZero = false;

                        pio.DefaultValue = 1;

                        PromptIntegerResult ires = ed.GetInteger(pio);

                        if (ires.Status != PromptStatus.OK)

                            return;

                        int init = ires.Value;

                        ed.WriteMessage("\nInitial Value Entered:\t{0}\n", init);
                       
                        BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;

                        if (!bt.Has(oldblock)) return;

                        ObjectId newblkId = bt[oldblock];

                        acadApp.SetSystemVariable("nomutt", 0);

                        TypedValue[] tvs = { new TypedValue(0, "insert"), new TypedValue(2, oldblock) };

                        SelectionFilter filt = new SelectionFilter(tvs);

                        PromptSelectionOptions pso = new PromptSelectionOptions();

                        pso.MessageForRemoval = "You must select the blocks only!";

                        pso.MessageForAdding = "\nSelect blocks in the right order: ";


                        PromptSelectionResult res = ed.GetSelection(pso, filt);

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

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

                        SelectionSet sset = res.Value;

                        foreach (SelectedObject obj in sset)
                        {
                            Entity ent = (Entity)obj.ObjectId.GetObject(OpenMode.ForWrite, false, true) as Entity;

                            BlockReference oldblk = ent as BlockReference;

                            Autodesk.AutoCAD.DatabaseServices.AttributeCollection atts =
                                oldblk.AttributeCollection;

                            foreach (ObjectId id in atts)
                            {
                                Autodesk.AutoCAD.DatabaseServices.AttributeReference atref =
                                    id.GetObject(OpenMode.ForWrite, false, true) as Autodesk.AutoCAD.DatabaseServices.AttributeReference;

                                if (atref.Tag == tagname.ToUpper())
                                {
                                    atref.TextString = init.ToString();
                                    init += 1;
                                    break;
                                }
                            }
                        }
                        tr.Commit();
                    }

                }
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage(ex.Message + "\n" + ex.StackTrace);
            }
            finally
            {
                acadApp.SetSystemVariable("nomutt", 0);


            }

        }

112
Polylines / Import multyline styles from source drawing
« on: May 28, 2012, 01:21:00 PM »
Code: [Select]
       [CommandMethod("ImportMlineStyles", "imls", CommandFlags.Modal | CommandFlags.Session)]
        public void MilneStylesList()
        {
            string filename = "C:\\Test\\Mult.dwg";//<-- change a source drawing name here
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = HostApplicationServices.WorkingDatabase;
            Editor ed = doc.Editor;

            // define list of string to store multileader style names
            List<string> mstyleList = new List<string>();

            //define boolean variable for future use
            bool result = true;

            // use LockDocument to avoid eLockViolatioException because we're use CommandFlags.Session
            using (DocumentLock docloc = doc.LockDocument())
            {
                // create new database
                using (Database exdb = new Database(false, true))
                {
                    exdb.ReadDwgFile(filename, FileOpenMode.OpenForReadAndAllShare, false, "");
                    //exdb.ReadDwgFile(filename, System.IO.FileShare.Read, True, "")
                    try
                    {
                        ObjectIdCollection ids = new ObjectIdCollection();
                        // Start a transaction
                        using (Transaction tr = db.TransactionManager.StartTransaction())
                        {
                            // Start a source transaction
                            using (Transaction extr = exdb.TransactionManager.StartTransaction())
                            {
                                // Open the MlineStyle dictionary for read
                                DBDictionary dictms = default(DBDictionary);

                                // Open the MlineStyle dictionary for read                             
                                dictms = (DBDictionary)extr.GetObject(exdb.MLStyleDictionaryId, OpenMode.ForRead);

                                // step through the
                                // get every DictionaryEntry in the dictionary

                                foreach (DictionaryEntry id in dictms)
                                {
                                    // Get every object using Objectid then cast DBobject as MlineStyle
                                    MlineStyle mlst = (MlineStyle)extr.GetObject((ObjectId)id.Value, OpenMode.ForRead);
                                    ids.Add((ObjectId)id.Value);
                                    mstyleList.Add(mlst.Name);
                                    // add multileader style name to the list
                                }
                                IdMapping imap = new IdMapping();
                                // Perform WblockCloneObjects method
                                db.WblockCloneObjects(ids, db.MLStyleDictionaryId, imap, DuplicateRecordCloning.Replace, false);
                                // Commit external transaction
                                extr.Commit();
                            }
                            //  Dispose of the external transaction
                            // Commit transaction
                            tr.Commit();
                        }
                        //  Dispose of the  transaction
                        // handling exception

                    }
                    catch (Autodesk.AutoCAD.Runtime.Exception ex)
                    {
                        // Display error message
                        ed.WriteMessage("\n" + ex.Message + "\n" + ex.StackTrace);
                        // set result to false
                        result = false;
                    }
                    finally
                    {
                        if (result)
                        {
                            ed.WriteMessage("\nProgram ended up with: {0}", result);
                            foreach (string ms in mstyleList)
                            {
                                ed.WriteMessage("\n" + ms);
                            }
                        }
                    }
                }
                //  Dispose external database
            }
            //  Dispose of the LockDocument
        }

~'J'~

113
Colors and linetypes / Set color from Pantone color book
« on: May 25, 2012, 07:58:57 AM »
Code: [Select]
       [CommandMethod("TestColorPantone","tcp", CommandFlags.Modal | CommandFlags.UsePickSet | CommandFlags.Redraw)]
        public static void TestPantoneColorBook()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            Database db = doc.Database;

            PromptEntityOptions optEnt = new PromptEntityOptions("\nSelect object: ");

            optEnt.SetRejectMessage("\nSelect object only!");

            optEnt.AddAllowedClass(typeof(Entity), false);

            PromptEntityResult res = ed.GetEntity(optEnt);

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

            ObjectId id = res.ObjectId;

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, false);

                Entity ent = tr.GetObject(id, OpenMode.ForWrite) as Entity;

                // Change color from PANTONE color book, e.g.:

                // ent.Color = Color.FromNames("PANTONE Magenta 2582 C","PANTONE(R) solid coated");

                ent.Color = Color.FromNames("RAL 230 30 15", "RAL DESIGN");// etc...

                tr.Commit();

            }
        }

~'J'~

114
Dimensions / Move dimension text up or down
« on: May 23, 2012, 07:37:45 AM »
   
Code: [Select]
    [CommandMethod("cdimup")]
        public static void TestDimUp()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            Database db = HostApplicationServices.WorkingDatabase;

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                // Select a dimension

                try
                {

                    PromptEntityOptions peo = new PromptEntityOptions("\nSelect a Dimension >>");
                    peo.SetRejectMessage("\nYou have to select the Dimension only >>");
                    peo.AddAllowedClass(typeof(Dimension), false);
                    PromptEntityResult res;
                    res = ed.GetEntity(peo);
                    if (res.Status != PromptStatus.OK)
                        return;
                    Entity ent = (Entity)tr.GetObject(res.ObjectId, OpenMode.ForRead);
                    if (ent == null)
                        return;
                    Dimension dim = (Dimension)ent as Dimension;
                    if (dim == null) return;

                    if (!dim.IsWriteEnabled) dim.UpgradeOpen();

                    // Add Xdata:

                    dim.XData = new ResultBuffer(

                    new TypedValue((int)DxfCode.ExtendedDataRegAppName, "ACAD"),

                    new TypedValue((int)DxfCode.ExtendedDataAsciiString, "DSTYLE"),

                    new TypedValue((int)DxfCode.ExtendedDataControlString, "{"),

                    new TypedValue((int)DxfCode.ExtendedDataInteger16, 77),

                    new TypedValue((int)DxfCode.ExtendedDataInteger16, 1),

                    new TypedValue((int)DxfCode.ExtendedDataControlString, "}")

                          );

                    dim.DowngradeOpen();

                    tr.Commit();
                }
                catch (System.Exception ex)
                {
                    Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.Message);
                }

            }

        }

   
Code: [Select]
    [CommandMethod("cdimdown")]
        public static void TestDimDown()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            Database db = HostApplicationServices.WorkingDatabase;

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                // Select a dimension

                try
                {

                    PromptEntityOptions peo = new PromptEntityOptions("\nSelect a Dimension >>");
                    peo.SetRejectMessage("\nYou have to select the Dimension only >>");
                    peo.AddAllowedClass(typeof(Dimension), false);
                    PromptEntityResult res;
                    res = ed.GetEntity(peo);
                    if (res.Status != PromptStatus.OK)
                        return;
                    Entity ent = (Entity)tr.GetObject(res.ObjectId, OpenMode.ForRead);
                    if (ent == null)
                        return;
                    Dimension dim = (Dimension)ent as Dimension;
                    if (dim == null) return;

                    if (!dim.IsWriteEnabled) dim.UpgradeOpen();

                    // Add Xdata:

                    dim.XData = new ResultBuffer(

                    new TypedValue((int)DxfCode.ExtendedDataRegAppName, "ACAD"),

                    new TypedValue((int)DxfCode.ExtendedDataAsciiString, "DSTYLE"),

                    new TypedValue((int)DxfCode.ExtendedDataControlString, "{"),

                    new TypedValue((int)DxfCode.ExtendedDataInteger16, 77),

                    new TypedValue((int)DxfCode.ExtendedDataInteger16, 4),

                    new TypedValue((int)DxfCode.ExtendedDataControlString, "}")

                          );

                    dim.DowngradeOpen();
               
                    tr.Commit();
                }
                catch (System.Exception ex)
                {
                    Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.Message);
                }

            }

        }

~'J'~

115
Blocks / Replace block and change value of conterminous attributes
« on: May 22, 2012, 06:40:26 PM »
         
Code: [Select]
        [CommandMethod("TestReplace")]
        public static void TestReplaceWithAttributes()
        {
            Database db = HostApplicationServices.WorkingDatabase;
            Document doc = acadApp.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            try
            {
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                //----------------------------------------------------------
                PromptEntityOptions peo = new PromptEntityOptions("\nSelect the block instance >>");
                peo.SetRejectMessage("\nYou have to select the block instance only >>");
                peo.AddAllowedClass(typeof(BlockReference), false);
                PromptEntityResult res;
                res = ed.GetEntity(peo);
                if (res.Status != PromptStatus.OK)
                    return;
                Entity ent = (Entity)tr.GetObject(res.ObjectId, OpenMode.ForRead);
                if (ent == null)
                    return;
                BlockReference bref = (BlockReference)ent as BlockReference;
                if (bref == null) return;

                //----------------------------------------------------------
                PromptStringOptions pso = new PromptStringOptions("\nEnter a block name to replace : ");
                pso.AllowSpaces = true;
                pso.UseDefaultValue = true;
                pso.DefaultValue = "newblock";//  <---    change a new block name here
                PromptResult stres;
                string repblk = string.Empty;
                stres = ed.GetString(pso);
                if (stres.Status == PromptStatus.OK)
                {
                    repblk = stres.StringResult;
                }
                if (stres.Status == PromptStatus.None)
                {
                    repblk = "newblock";//  <---    change a new block name here
                }
                //----------------------------------------------------------
               
                BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;

                if (!bt.Has(repblk)) return;

                BlockTableRecord btrec = null;

                if (bref.IsDynamicBlock)
                {
                    btrec = tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;

                    if (btrec.IsAnonymous)
                    {
                        btrec = tr.GetObject(bref.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord;                 
                    }

                }
                else
                {
                    btrec = tr.GetObject(bref.BlockTableRecord,   OpenMode.ForRead) as BlockTableRecord;   
                }
                //----------------------------------------------------------
               BlockTableRecord btr =  tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
               //----------------------------------------------------------
               Dictionary<string, string> attdic = new Dictionary<string, string>();

               if (btrec.HasAttributeDefinitions)
               {
                 AttributeCollection atts=  bref.AttributeCollection;
                 foreach (ObjectId id in atts)
                 {
                     DBObject obj = tr.GetObject(id, OpenMode.ForRead) as DBObject;
                     AttributeReference atref = obj as AttributeReference;
                     if (atref != null)
                         attdic.Add(atref.Tag.ToUpper(), atref.TextString);
                 }

               }
               //----------------------------------------------------------
               BlockTableRecord newbtrec =  tr.GetObject(bt[repblk], OpenMode.ForRead) as BlockTableRecord;
               Point3d inspt = bref.Position;
               BlockReference newbref = new BlockReference(inspt, bt[repblk]);
               if (!newbref.IsWriteEnabled) newbref.UpgradeOpen();
               newbref.BlockUnit = bref.BlockUnit;
               newbref.Layer = bref.Layer;
               newbref.Rotation = bref.Rotation;
               newbref.ScaleFactors = bref.ScaleFactors;
                btr.AppendEntity(newbref);
                tr.AddNewlyCreatedDBObject(newbref, true);
                //----------------------------------------------------------
                if (attdic.Count > 0)
                {
                    if (newbtrec.HasAttributeDefinitions)
                    {
                        AttributeCollection atcoll = newbref.AttributeCollection;

                        foreach (ObjectId subid in newbtrec)
                        {
                            Entity subent = (Entity)subid.GetObject(OpenMode.ForRead);

                            AttributeDefinition attDef = subent as AttributeDefinition;

                            if (attDef != null)
                            {                               

                                AttributeReference attRef = new AttributeReference();

                                attRef.SetPropertiesFrom(attDef);

                                attRef.Visible = attDef.Visible;

                                attRef.SetAttributeFromBlock(attDef, bref.BlockTransform);

                                attRef.HorizontalMode = attDef.HorizontalMode;

                                attRef.VerticalMode = attDef.VerticalMode;

                                attRef.Rotation = attDef.Rotation;

                                attRef.TextStyle = attDef.TextStyle;//  <---    A2009 syntax

                                attRef.Position = attDef.Position+inspt.GetAsVector();

                                attRef.Tag = attDef.Tag;

                                attRef.FieldLength = attDef.FieldLength;

                                if (attdic.ContainsKey(attRef.Tag.ToUpper()))
                                {
                                    attRef.TextString = attdic[attRef.Tag.ToUpper()];
                                }
                                else
                                {
                                    attRef.TextString = attDef.TextString;
                                }

                                attRef.Justify = attDef.Justify;

                                attRef.AdjustAlignment(db);

                                atcoll.AppendAttribute(attRef);

                                tr.AddNewlyCreatedDBObject(attRef, true);

                            }

                        }
                    }
                }
                //----------------------------------------------------------
                if (!bref.IsWriteEnabled) bref.UpgradeOpen();
                bref.Erase();
                btr.UpdateAnonymousBlocks();
                tr.Commit();
                }
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage("Error:\n{0}\nTrace:\n{1}", ex.Message, ex.StackTrace);
            }
            finally
            {
                //do whatever you need

            }
        }

~'J'~

116
Polylines / 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'~

117
Polylines / Intersect line with curve
« on: May 21, 2012, 08:54:31 AM »
Code: [Select]
        [CommandMethod("IntLineCurve","ilw", CommandFlags.Modal | CommandFlags.UsePickSet | CommandFlags.Redraw )]
        public void IntersectTestIn()
        {
            Database db = HostApplicationServices.WorkingDatabase;
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {

                PromptEntityOptions peo = new PromptEntityOptions("\nSelect a Line >>");
                peo.SetRejectMessage("\nYou have to select the Line only >>");
                peo.AddAllowedClass(typeof(Line), false);
                PromptEntityResult res;
                res = ed.GetEntity(peo);
                if (res.Status != PromptStatus.OK)
                    return;
                Entity ent = (Entity)tr.GetObject(res.ObjectId, OpenMode.ForRead);
                if (ent == null)
                    return;
                Line line = (Line)ent as Line;
                if (line == null) return;

                peo = new PromptEntityOptions("\nSelect a curve: ");
                peo.SetRejectMessage("\nYou have to select the curve only >>");
                peo.AddAllowedClass(typeof(Curve), false);
                res = ed.GetEntity(peo);
                if (res.Status != PromptStatus.OK)
                    return;
                ent = (Entity)tr.GetObject(res.ObjectId, OpenMode.ForRead);
                if (ent == null)
                    return;
                Curve pline = (Curve)ent as Curve;
                if (pline == null) return;
                Point3dCollection pts = new Point3dCollection();
                line.IntersectWith(pline, Intersect.OnBothOperands, pts, 0, 0);//<-- A2010
                if (pts.Count == 0) return;
                List<Point3d> points = new List<Point3d>();

                foreach (Point3d p in pts)
                    points.Add(p);
                Point3d sp = line.StartPoint;
                points.Sort(delegate(Point3d p1, Point3d p2)
                {
                    return Convert.ToInt32(
                            Convert.ToDouble(sp.DistanceTo(p1).CompareTo(
               Convert.ToDouble(sp.DistanceTo(p2)))));
                }
);
                pts = new Point3dCollection(points.ToArray());
                DBObjectCollection objs = line.GetSplitCurves(pts);
                List<DBObject> lstobj = new List<DBObject>();
               
                foreach (DBObject dbo in objs)
                    lstobj.Add(dbo);
 

                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                int i=1;
                foreach (DBObject dbo in objs)
                {
                    Line ln = dbo as Line;
                    if (!ln.IsWriteEnabled)
                        ln.UpgradeOpen();
                    ln.SetPropertiesFrom(line);
                    ln.ColorIndex=i;
                    btr.AppendEntity(ln);
                    tr.AddNewlyCreatedDBObject(ln, true);
                    if (i > 255)
                    {
                        i = 1;
                    }
                    else
                    {
                        i += 1;
                    }                 
                }


                if (!line.IsWriteEnabled)
                    line.UpgradeOpen();
                line.Erase();
                line.Dispose();

                ed.Regen();
                tr.Commit();
            }
        }

~'J'~

118
Polylines / Breaking a curve at a point
« on: May 20, 2012, 07:05:11 PM »
Code: [Select]
// based on code by Balaji Ramamoorthy
// http://adndevblog.typepad.com/autocad/2012/05/breaking-a-curve-at-a-point.html
       [CommandMethod("bre")]
        public static void ADSProjectBreak()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            Matrix3d ucs = ed.CurrentUserCoordinateSystem;

            Database db = HostApplicationServices.WorkingDatabase;

            ObjectId id;

            Entity ent;

            try
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);

                    // Let the user select a curve   

                    id = ed.GetEntity("\nSelect curve: ").ObjectId;

                    if (id == ObjectId.Null) return;

                    ent = (Entity)tr.GetObject(id, OpenMode.ForRead, false);

                    if (ent == null) return;

                    // Check that it is really a curve   

                    Curve Curve = ent as Curve;

                    if (Curve == null) return;

                    // Get the break position and convert to WC coordinates   

                    Point3d breakPnt;

                    breakPnt = ed.GetPoint("\nPick a point on the curve: ").Value;

                    breakPnt.TransformBy(ucs.Inverse());

                    // Check that the point is on the curve

                    breakPnt = Curve.GetClosestPointTo(breakPnt, false);

                    Point3dCollection breakPoints = new Point3dCollection();

                    DBObjectCollection newCurves = new DBObjectCollection();

                    // Get the segments according to the trim points   

                    breakPoints.Add(breakPnt);

                    newCurves = Curve.GetSplitCurves(breakPoints);

                    if (newCurves == null)
                    {

                        ed.WriteMessage("\nGetSplitCurves failed :  Error");

                        return;

                    }

                    // Here we add the segments to the database with different colors   

                    for (int i = 0; i < newCurves.Count; i++)
                    {

                        Entity pent = (Entity)newCurves[i] as Entity;

                        pent.SetPropertiesFrom(ent);

                        pent.ColorIndex = i + 1;// to display result only

                        btr.AppendEntity(pent);

                        tr.AddNewlyCreatedDBObject(pent, true);

                        tr.TransactionManager.QueueForGraphicsFlush();
                    }

                    ent.UpgradeOpen();

                    ent.Erase();

                    doc.TransactionManager.FlushGraphics();

                    tr.Commit();
                }

            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(ex.Message + "\n" + ex.StackTrace);
            }
            finally
            {
                ed.WriteMessage("\nPokey");
            }
        }

~'J'~

119
Polylines / Add bulged segment (create jumpover)
« on: May 20, 2012, 11:36:29 AM »
 
Code: [Select]
       public static void Jumper()   
    {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Matrix3d ucs = ed.CurrentUserCoordinateSystem;
            Database db = doc.Database;
            PromptEntityResult res = ed.GetEntity(new PromptEntityOptions("Select polyline : "));
            if (res.Status != PromptStatus.OK) return;
            ObjectId id = res.ObjectId;
            Point3d pp = res.PickedPoint;
            // Set break gap
            double gap = 3.0;
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead);
                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                Entity ent = tr.GetObject(id, OpenMode.ForWrite) as Entity;
                Polyline poly = ent as Polyline;
                if (poly == null) return;
                pp = poly.GetClosestPointTo(pp, false).TransformBy(ucs);
                double par = poly.GetParameterAtPoint(pp);
                double dist = poly.GetDistAtPoint(pp);
                int idx = (int)par;           
                Point3d p1 = poly.GetPointAtDist(dist - gap/2).TransformBy(ucs);
                Point3d p2 = poly.GetPointAtDist(dist + gap/2).TransformBy(ucs);
                poly.AddVertexAt(idx+1, new Point2d(p1.X, p1.Y), 1, 0, 0);
                poly.AddVertexAt(idx+2, new Point2d(p2.X, p2.Y), 0, 0, 0);           
                tr.Commit();
            }
        }

~'J'~

120
Polylines / 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'~

Pages: 1 ... 6 7 [8] 9