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.


Topics - fixo

Pages: 1 ... 5 6 [7] 8
91
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'~

92
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);


            }

        }

93
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'~

94
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'~

95
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'~

96
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'~

97
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'~

98
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'~

99
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'~

100
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'~

101
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'~

102
Polylines / Label polyline areas with field
« on: May 18, 2012, 01:50:27 PM »
Code: [Select]
//----------------------------------------------------------------------------------------------//
        [CommandMethod("POLA", CommandFlags.Modal)]
        public void PolyAreas()
        {
            var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            var ed = doc.Editor;
            Matrix3d ucs = ed.CurrentUserCoordinateSystem;
           
            var sf = new SelectionFilter(new TypedValue[] { new TypedValue(0, "LWPOLYLINE"), new TypedValue(70, 1) });
            var pso = new PromptSelectionOptions();
            pso.MessageForAdding = "Select polylines (or enter for all): ";
            pso.AllowDuplicates = false;
            var psr = ed.GetSelection(pso, sf);
            // If nothing selected then select all
            if (psr.Status == PromptStatus.Error) psr = ed.SelectAll(sf);
            // make sure the selection isn't empty
            if (psr.Status == PromptStatus.OK && psr.Value.Count > 0)
            {
                using (var tr = db.TransactionManager.StartTransaction())
                {
                    var btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                    foreach (SelectedObject so in psr.Value)
                    {
                        var pline = (Polyline)tr.GetObject(so.ObjectId, OpenMode.ForRead);

                        Point3d cp = GetPseudoCentroid(db, pline).TransformBy(ucs);
                        string strObjId = pline.ObjectId.ToString();
                        strObjId = strObjId.Trim(new char[] { '(', ')' });
                        var mtx = new MText();
                        mtx.Contents = "%<\\AcObjProp Object(%<\\_ObjId " + strObjId + ">%).Area \\f \"%pr3%lu2%ct4%qf1 SQ. FT.\">%";
                        mtx.Location = cp;
                        mtx.Rotation = 0;
                        mtx.Attachment = AttachmentPoint.MiddleCenter;

                        btr.AppendEntity(mtx);
                        tr.AddNewlyCreatedDBObject(mtx, true);
                        tr.TransactionManager.QueueForGraphicsFlush();

                    }
                    doc.TransactionManager.FlushGraphics();
                    tr.Commit();
                    ed.Regen();
                }
            }
        }

        //----------------------------------------------------------------------------------------------//
        public Point3d GetPseudoCentroid(Database db, Polyline pline)
        {
            Point3d cpt = new Point3d();
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;

            try
            {
                using (Transaction tr = db.TransactionManager.StartOpenCloseTransaction())
                {

                    Point3d maxp = pline.GeometricExtents.MaxPoint;
                    Point3d minp = pline.GeometricExtents.MinPoint;
                    cpt = new Point3d((maxp.X + minp.X) / 2, (maxp.Y + minp.Y) / 2, (maxp.Z + minp.Z) / 2);

                    tr.Commit();
                    return cpt;
                }
            }
            catch
            {
                // ed.WriteMessage("\nError on getting centroid");//debug only
                return cpt;
            }

        }

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

~'J'~

103
Math and Geometry / Circle by 3 points
« on: May 06, 2012, 01:14:55 PM »
Code: [Select]
        [CommandMethod("circ3p")]// This method can have any name
        public static void TestFor3PointCircle()
        {
            // Get the document and database
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            // If we have a valid point selection, get all 3 points
           PromptPointOptions ppo =   new PromptPointOptions("\nPick a point : ");
            ppo.AllowNone = true;
            PromptPointResult ppr;
                ppr = ed.GetPoint(ppo);
                if (ppr.Status != PromptStatus.OK) return;
            Point3d p1= ppr.Value;
            ppo =   new PromptPointOptions("\nPick a second point : ");
                 ppr = ed.GetPoint(ppo);
                if (ppr.Status != PromptStatus.OK) return;
            Point3d p2= ppr.Value;
                        ppo =   new PromptPointOptions("\nPick a third point : ");
                 ppr = ed.GetPoint(ppo);
                if (ppr.Status != PromptStatus.OK) return;
            Point3d p3= ppr.Value;
            // To pass center point by reference
            Point3d pc = new Point3d();
            // Get result
            bool result = CircleCenter(p1, p2, p3, out pc);
            if (result)
                ed.WriteMessage("\nCenter point calculated:\t{0:f3},{1:f3},{2:f3}", pc.X, pc.Y, pc.Z);
            else return;
            // Calculate radius
            double rad = pc.DistanceTo(p1);
            // Open transaction and add circle to the current space
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                Circle circ = new Circle(pc, Vector3d.ZAxis, rad);
                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                btr.AppendEntity(circ);
                tr.AddNewlyCreatedDBObject(circ, true);
                // Commit transaction
                tr.Commit();
               
            }
         
        }

        public static bool CircleCenter(Point3d p0, Point3d pm, Point3d p1, out Point3d pc)
        {
            Vector3d v1 = p0 - pm;

            Vector3d v2 = p1 - pm;

            if (v1.IsParallelTo(v2))
            {
                pc = new Point3d();

                return false;
            }

            CircularArc3d crc = new CircularArc3d(p0, pm, p1);

            pc = crc.Center;

            return true;
        }

    }

Regards,

~'J'~

104
Dimensions / Some basic dimensions function
« on: May 01, 2012, 07:49:36 AM »
Code: [Select]
        Public Sub DrawRotDimension(ByVal db As Database, ByVal tr As Transaction, ByVal pt1 As Point3d, ByVal pt2 As Point3d, ByVal offset As Double, ByVal dimStyleName As String)

            Dim btr As BlockTableRecord = CType(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
            Dim dtb As DimStyleTable = CType(tr.GetObject(db.DimStyleTableId, OpenMode.ForRead), DimStyleTable)
            If Not dtb.Has(dimStyleName) Then Return
            Dim dtr As DimStyleTableRecord = CType(tr.GetObject(dtb(dimStyleName), OpenMode.ForRead), DimStyleTableRecord)
            Dim ang As Double = AngleFromXAxis(pt1, pt2)
            Dim pt3 As Point3d = PolarPoint(pt2, ang + Math.PI / 2, offset)
            Dim odim As RotatedDimension = New RotatedDimension(ang, pt1, pt2, pt3, "<>", dtr.ObjectId)
            odim.SetDatabaseDefaults()
            ''change some properties of the dimension if it is needs here
            ''..........................................
            btr.AppendEntity(odim)
            tr.AddNewlyCreatedDBObject(odim, True)
            ' commit transaction or do it in the main program
            ' tr.Commit()
        End Sub

        Public Sub DrawAlignDimension(ByVal db As Database, ByVal tr As Transaction, ByVal pt1 As Point3d, ByVal pt2 As Point3d, ByVal pt3 As Point3d, ByVal dimStyleName As String)

            Dim btr As BlockTableRecord = CType(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
            Dim dtb As DimStyleTable = CType(tr.GetObject(db.DimStyleTableId, OpenMode.ForRead), DimStyleTable)
            If Not dtb.Has(dimStyleName) Then Return

            Dim dtr As DimStyleTableRecord = CType(tr.GetObject(dtb(dimStyleName), OpenMode.ForRead), DimStyleTableRecord)
            Dim odim As AlignedDimension = New AlignedDimension(pt1, pt2, pt3, "", dtr.ObjectId)
            odim.SetDatabaseDefaults()
            ''change some properties of the dimension if it is needs here
            ''..........................................
            btr.AppendEntity(odim)
            tr.AddNewlyCreatedDBObject(odim, True)
            ' commit transaction or do it in the main program
            ' tr.Commit()
        End Sub

        Public Sub DrawLineAngDimension(ByVal db As Database, ByVal tr As Transaction, ByVal pt1 As Point3d, ByVal pt2 As Point3d, ByVal pt3 As Point3d, ByVal pt4 As Point3d, ByVal pt5 As Point3d, ByVal dimStyleName As String)

            Dim btr As BlockTableRecord = CType(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
            Dim dtb As DimStyleTable = CType(tr.GetObject(db.DimStyleTableId, OpenMode.ForRead), DimStyleTable)
            If Not dtb.Has(dimStyleName) Then Return

            Dim dtr As DimStyleTableRecord = CType(tr.GetObject(dtb(dimStyleName), OpenMode.ForRead), DimStyleTableRecord)
            Dim adim As LineAngularDimension2 = New LineAngularDimension2(pt1, pt2, pt3, pt4, pt5, "", dtr.ObjectId)

            adim.SetDatabaseDefaults()
            ''change some properties of the dimension if it is needs here
            ''..........................................
            btr.AppendEntity(adim)
            tr.AddNewlyCreatedDBObject(adim, True)
            ' commit transaction or do it in the main program
            ' tr.Commit()
        End Sub

        Public Sub DrawOrdinateDimension(ByVal db As Database, ByVal tr As Transaction, isAxis As Boolean, ByVal pt1 As Point3d, ByVal pt2 As Point3d, ByVal dimStyleName As String)

            Dim btr As BlockTableRecord = CType(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
            Dim dtb As DimStyleTable = CType(tr.GetObject(db.DimStyleTableId, OpenMode.ForRead), DimStyleTable)
            If Not dtb.Has(dimStyleName) Then Return
            Dim dtr As DimStyleTableRecord = CType(tr.GetObject(dtb(dimStyleName), OpenMode.ForRead), DimStyleTableRecord)

            Dim strdim As String = String.Format("{0:f3}\P{1:f3}", pt1.X, pt1.Y)
            Dim adim As OrdinateDimension = New OrdinateDimension(isAxis, pt1, pt2, strdim, dtr.ObjectId)

            adim.SetDatabaseDefaults()
            ''change some properties of the dimension if it is needs here
            ''..........................................
            btr.AppendEntity(adim)
            tr.AddNewlyCreatedDBObject(adim, True)
            ' commit transaction or do it in the main program
            ' tr.Commit()
        End Sub

        Public Sub DrawArcDimension(ByVal db As Database, ByVal tr As Transaction, ByVal cpt As Point3d, ByVal pt1 As Point3d, ByVal pt2 As Point3d, ByVal pt3 As Point3d, ByVal dimStyleName As String)

            Dim btr As BlockTableRecord = CType(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
            Dim dtb As DimStyleTable = CType(tr.GetObject(db.DimStyleTableId, OpenMode.ForRead), DimStyleTable)
            If Not dtb.Has(dimStyleName) Then Return

            Dim dtr As DimStyleTableRecord = CType(tr.GetObject(dtb(dimStyleName), OpenMode.ForRead), DimStyleTableRecord)

            Dim adim As ArcDimension = New ArcDimension(cpt, pt1, pt2, pt3, "", dtr.ObjectId)
            adim.SetDatabaseDefaults()
            ''change some properties of the dimension if it is needs here
            ''..........................................
            btr.AppendEntity(adim)
            tr.AddNewlyCreatedDBObject(adim, True)
            ' commit transaction or do it in the main program
            ' tr.Commit()
        End Sub

        Public Sub DrawDiametricDimension(ByVal db As Database, ByVal tr As Transaction, ByVal pt1 As Point3d, ByVal pt2 As Point3d, ByVal leg As Double, ByVal dimStyleName As String)

            Dim btr As BlockTableRecord = CType(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
            Dim dtb As DimStyleTable = CType(tr.GetObject(db.DimStyleTableId, OpenMode.ForRead), DimStyleTable)
            If Not dtb.Has(dimStyleName) Then Return

            Dim dtr As DimStyleTableRecord = CType(tr.GetObject(dtb(dimStyleName), OpenMode.ForRead), DimStyleTableRecord)
            Dim odim As DiametricDimension = New DiametricDimension(pt1, pt2, leg, "", dtr.ObjectId)
            odim.SetDatabaseDefaults()
            ''change some properties of the dimension if it is needs here
            ''..........................................
            btr.AppendEntity(odim)
            tr.AddNewlyCreatedDBObject(odim, True)
            ' commit transaction or do it in the main program
            ' tr.Commit()
        End Sub

        Public Sub DrawRadialDimension(ByVal db As Database, ByVal tr As Transaction, ByVal cpt As Point3d, ByVal pt1 As Point3d, ByVal leg As Double, ByVal dimStyleName As String)

            Dim btr As BlockTableRecord = CType(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
            Dim dtb As DimStyleTable = CType(tr.GetObject(db.DimStyleTableId, OpenMode.ForRead), DimStyleTable)
            If Not dtb.Has(dimStyleName) Then Return

            Dim dtr As DimStyleTableRecord = CType(tr.GetObject(dtb(dimStyleName), OpenMode.ForRead), DimStyleTableRecord)
            Dim odim As RadialDimension = New RadialDimension(cpt, pt1, leg, "", dtr.ObjectId)

            odim.SetDatabaseDefaults()
            ''change some properties of the dimension if it is needs here
            ''..........................................
            btr.AppendEntity(odim)
            tr.AddNewlyCreatedDBObject(odim, True)
            ' commit transaction or do it in the main program
            ' tr.Commit()
        End Sub

        Public Sub DrawRadialDimensionLarge(ByVal db As Database, ByVal tr As Transaction, ByVal cpt As Point3d, ByVal pt1 As Point3d, ByVal pt2 As Point3d, ByVal pt3 As Point3d, ByVal ang As Double, ByVal dimStyleName As String)

            Dim btr As BlockTableRecord = CType(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
            Dim dtb As DimStyleTable = CType(tr.GetObject(db.DimStyleTableId, OpenMode.ForRead), DimStyleTable)
            If Not dtb.Has(dimStyleName) Then Return

            Dim dtr As DimStyleTableRecord = CType(tr.GetObject(dtb(dimStyleName), OpenMode.ForRead), DimStyleTableRecord)
            Dim odim As RadialDimensionLarge = New RadialDimensionLarge(cpt, pt1, pt2, pt3, ang, "", dtr.ObjectId)

            odim.SetDatabaseDefaults()
            ''change some properties of the dimension if it is needs here
            ''..........................................
            btr.AppendEntity(odim)
            tr.AddNewlyCreatedDBObject(odim, True)
            ' commit transaction or do it in the main program
            ' tr.Commit()
        End Sub

        Public Sub DrawPoint3AngularDimension(ByVal db As Database, ByVal tr As Transaction, ByVal cpt As Point3d, ByVal pt1 As Point3d, ByVal pt2 As Point3d, ByVal pt3 As Point3d, ByVal dimStyleName As String)

            Dim btr As BlockTableRecord = CType(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
            Dim dtb As DimStyleTable = CType(tr.GetObject(db.DimStyleTableId, OpenMode.ForRead), DimStyleTable)
            If Not dtb.Has(dimStyleName) Then Return

            Dim dtr As DimStyleTableRecord = CType(tr.GetObject(dtb(dimStyleName), OpenMode.ForRead), DimStyleTableRecord)
            Dim odim As Point3AngularDimension = New Point3AngularDimension(cpt, pt1, pt2, pt3, "", dtr.ObjectId)

            odim.SetDatabaseDefaults()
            ''change some properties of the dimension if it is needs here
            ''..........................................
            btr.AppendEntity(odim)
            tr.AddNewlyCreatedDBObject(odim, True)
            ' commit transaction or do it in the main program
            ' tr.Commit()
        End Sub


        '' published by Irvin on May 12, 2009 1:25 PM
        '' http://forums.autodesk.com/t5/NET/Set-current-textstyle/m-p/2485015/highlight/true#M14423
        '' (slightly edited)
        <CommandMethod("SetDimStlye")> _     
        Public Sub SetDimStyle(ByVal dimStyleName As String)
            Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
            Dim db As Database = doc.Database
            Dim ed As Editor = doc.Editor
            Using trans As Transaction = db.TransactionManager.StartTransaction()
                Dim DimTbl As DimStyleTable = CType(trans.GetObject(db.DimStyleTableId, OpenMode.ForRead), DimStyleTable)
                If DimTbl.Has(dimStyleName) Then
                    Dim DimRecord As DimStyleTableRecord = CType(trans.GetObject(DimTbl(dimStyleName), OpenMode.ForRead), DimStyleTableRecord)
                    If DimRecord.ObjectId <> db.Dimstyle Then
                        db.Dimstyle = DimRecord.ObjectId
                        db.SetDimstyleData(DimRecord)
                    End If
                End If
                trans.Commit()
            End Using
            Dim dimstyleStr As String = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("dimstyle").ToString()
            ed.WriteMessage(vbCr & "Current Dimstyle now: {0}", dimstyleStr)
        End Sub

        <CommandMethod("GetDimStlye")> _
        Public Sub GetCurrDimStyle()
            Dim dimstyleStr As String = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("dimstyle").ToString()
            Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("First method: " & dimstyleStr)
            Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
            Dim ed As Editor = doc.Editor
            Dim db As Database = doc.Database
            Using tr As Transaction = db.TransactionManager.StartTransaction()
                Dim dt As DimStyleTable = DirectCast(tr.GetObject(db.DimStyleTableId, OpenMode.ForRead), DimStyleTable)
                Dim id As ObjectId = db.Dimstyle
                Dim dr As DimStyleTableRecord = DirectCast(tr.GetObject(id, OpenMode.ForRead), DimStyleTableRecord)
                Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("Second method: " & dr.Name)
            End Using
        End Sub


        <CommandMethod("ChangeDimStlye")> _
        Public Sub ChangeDimStlye()

            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()

                Dim dimTbl As DimStyleTable = tr.GetObject(db.DimStyleTableId, OpenMode.ForRead)
                Dim dimDtr As DimStyleTableRecord = tr.GetObject(dimTbl("DimStyle1"), OpenMode.ForRead)
                Dim ids As ObjectIdCollection = dimDtr.GetPersistentReactorIds()
                For Each objId As ObjectId In ids

                    If objId.ObjectClass.IsDerivedFrom(RXClass.GetClass(GetType(Dimension))) Then

                        Dim dimen As Dimension = tr.GetObject(objId, OpenMode.ForWrite)
                        dimen.DimensionStyle = dimTbl("DimStyle2")
                        ''''' or
                        ''''''dimen.DimensionStyleName = "DimStyle2"
                    End If
                Next
                tr.Commit()
            End Using
        End Sub

        Public Shared Function GetPlineCoordinates(ByVal ent As Polyline) As Point3dCollection

            Dim pts As Point3dCollection = New Point3dCollection()
            Dim coord As Point3d
            Dim i As Integer = 0
            For i = 0 To ent.NumberOfVertices - 1
                coord = ent.GetPoint3dAt(i)
                pts.Add(coord)
            Next
            Return pts
        End Function

        Public Function Distance(ByVal fPoint As Point3d, ByVal sPoint As Point3d) As Double
            Dim x1, x2 As Double
            Dim y1, y2 As Double
            Dim z1, z2 As Double
            Dim cDist As Double
            x1 = fPoint.X : y1 = fPoint.Y : z1 = fPoint.Z
            x2 = sPoint.X : y2 = sPoint.Y : z2 = sPoint.Z
            cDist = Math.Sqrt(((x2 - x1) ^ 2) + ((y2 - y1) ^ 2))
            Return cDist
        End Function

        '' by Tony Tanzillo
        Public Function AngleFromXAxis(ByVal p1 As Point3d, ByVal p2 As Point3d) As Double

            Return New Vector2d(p2.X - p1.X, p2.Y - p1.Y).Angle

        End Function

        '' by Tony Tanzillo
        Public Function PolarPoint(ByVal basepoint As Point3d, ByVal angle As Double, ByVal distance As Double) As Point3d
            Return New Point3d( _
            basepoint.X + (distance * Math.Cos(angle)), _
            basepoint.Y + (distance * Math.Sin(angle)), _
            basepoint.Z)
        End Function

        Public Shared Function GetFirstPoint(ed As Editor, msg As String, ByRef pt As Point3d) As Boolean
            pt = New Point3d()

            Dim opt As New PromptPointOptions(vbLf & msg)

            Dim res As PromptPointResult = ed.GetPoint(opt)

            If res.Status = PromptStatus.OK Then
                pt = res.Value

                Return True
            Else
                Return False
            End If
        End Function
     
        Public Shared Function GetNextPoint(ed As Editor, msg As String, frompt As Point3d, ByRef pt As Point3d) As Boolean

            Dim opt As New PromptPointOptions(vbLf & msg)

            opt.UseBasePoint = True

            opt.AllowNone = True

            opt.BasePoint = frompt

            Dim res As PromptPointResult = ed.GetPoint(opt)

            If res.Status = PromptStatus.OK Then
                pt = res.Value
                Return True
            Else
                Return False
            End If
        End Function

105
Blocks / Create block with attributes
« on: April 28, 2012, 09:59:25 AM »
Tested on A2009 only
Code: [Select]
         [CommandMethod("STATION")]
        public static void CreateStation()
        {
            // Get the current document and database
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Database db = doc.Database;

            Editor ed = doc.Editor;
            // Start a transaction
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                try
                {
                    BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite);
                    string blkName = "STATION";
                    if (bt.Has(blkName))
                    {
                        ed.WriteMessage("\nBlock \"STATION\" already exist.");
                        return;
                    }
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                    Point3d inspt = new Point3d(0, 0, 0);
                    BlockTableRecord newBtr = new BlockTableRecord();
                    bt.Add(newBtr);
                    newBtr.Name = blkName;
                    newBtr.Origin = inspt;
                    newBtr.BlockScaling = BlockScaling.Uniform;
                    newBtr.Units = UnitsValue.Inches;
                    newBtr.Explodable = true;
                    tr.AddNewlyCreatedDBObject(newBtr, true);
                    Line ln = new Line();
                    ln.StartPoint = new Point3d(0.5, 0, 0);
                    ln.EndPoint = new Point3d(12, 0, 0);

                    Circle circ = new Circle();
                    circ.Center = inspt;
                    circ.Radius = 0.5;

                    AttributeDefinition attr = new AttributeDefinition();
                    attr.Tag = "NUMBER";
                    attr.Prompt = "Station number:";
                    attr.TextString = "1";
                    attr.Verifiable = true;
                    attr.LockPositionInBlock = true;
                    //attr.TextStyle = db.Textstyle;//<--   A2009
                    attr.TextStyleId = db.Textstyle;//<--   A2010
                    attr.Height = 1.0;
                    attr.Position = new Point3d(6.0, 0.5, 0);
                    attr.AdjustAlignment(db);

                    newBtr.AppendEntity(ln);
                    tr.AddNewlyCreatedDBObject(ln, true);

                    newBtr.AppendEntity(circ);
                    tr.AddNewlyCreatedDBObject(circ, true);

                    newBtr.AppendEntity(attr);
                    tr.AddNewlyCreatedDBObject(attr, true);


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

~'J'~

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