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 2 3 [4] 5 6 ... 8
46
Dimensions / Change leader annotation point
« on: January 08, 2013, 06:19:14 PM »
Tested on A2010 only, for other release it's may be a different solution
Code: [Select]
      [CommandMethod("ChangeLeaderAnnoPoint", "clap", CommandFlags.Modal | CommandFlags.UsePickSet | CommandFlags.Redraw)]
        public void MoveLeaderAnno()
        {

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

            Editor ed = doc.Editor;

            Database db = doc.Database;

            Transaction tr = doc.TransactionManager.StartTransaction();

            using (tr)
            {

                PromptEntityOptions peo = new PromptEntityOptions("\nPlease pick leader >>");
                peo.SetRejectMessage("\nSelect Leader only >>");
                peo.AddAllowedClass(typeof(Leader), 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;
                Leader ld = (Leader)ent as Leader;
                if (ld == null) return;

                ld.UpgradeOpen();
                Point3d oldPt = ld.LastVertex;
                ObjectId aid = ld.Annotation;
                Entity anno = tr.GetObject(aid, OpenMode.ForWrite) as Entity;
                if (anno == null) return;

                if (!anno.IsWriteEnabled) anno.UpgradeOpen();
                Point3d newPt;

                PromptPointOptions ppo = new PromptPointOptions("\nNew annotation point");
                PromptPointResult ppr = ed.GetPoint(ppo);
                if (ppr.Status != PromptStatus.OK) return;

                if (ppr.Status != PromptStatus.OK) return;
                newPt = ppr.Value;
                ed.WriteMessage("\nNew annotation point: {0}\n", newPt);
                Vector3d offset = newPt - oldPt;

                anno.TransformBy(Matrix3d.Displacement(offset));

                tr.Commit();
            }
        }

47
Hatching / Create associative hatch
« on: January 04, 2013, 07:44:39 PM »
Code: [Select]
        [CommandMethod("CreateAssocHatch","cash", CommandFlags.UsePickSet)]
        public void testCreateAssocHatch()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Database db = doc.Database;

            Editor ed = doc.Editor;

            ObjectId objId;

            Entity ent;

            PromptEntityResult per = ed.GetEntity(new PromptEntityOptions("\nSelect an entity to be hatched: "));

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

            objId = per.ObjectId;

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

                using (tr)
                {

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

                    if (ent == null) return;
                 
                    Hatch hat = new Hatch();

                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForWrite);
                   // to set associative add hatch first
                    btr.AppendEntity(hat);

                    tr.AddNewlyCreatedDBObject(hat, true);

                    hat.PatternAngle = 0.0;

                    hat.PatternScale = 10.0;

                    hat.Associative = true;

                    hat.SetHatchPattern(HatchPatternType.PreDefined, "ANSI32");

                    // append loop to hatch
                    ObjectIdCollection dbObjIds = new ObjectIdCollection();

                    dbObjIds.Add(objId);
                     
                    hat.AppendLoop(HatchLoopTypes.External, dbObjIds);
       
                    hat.Layer = ent.Layer;
 
                    hat.ColorIndex = 256;//bylayer,  may use as per entity colorindex
   
                    hat.HatchStyle = HatchStyle.Normal;
 
                    hat.EvaluateHatch(true);
 

                    tr.Commit();
                }
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                ed.WriteMessage("Error: {0}", ex.ToString());
            }
        }

48
Dimensions / Create ordinate dimension
« on: January 03, 2013, 01:13:35 PM »
   http://adndevblog.typepad.com/autocad/2012/09/ordinate-dimension-text-is-incorrect-in-rotated-ucs.html   
   By Philippe Leefsma (translated on C#)]
Code: [Select]
       [CommandMethod("CreateOrdinateDimension","cdom", CommandFlags.Modal | CommandFlags.UsePickSet)]
        public static void testOrdinateDimension()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;
            ObjectId id = ObjectId.Null;
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                PromptPointOptions ppo = new PromptPointOptions("\n  >>  Select point for ordinate dimension >>");

                PromptPointResult ppr = ed.GetPoint(ppo);

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

                double gap = db.Dimtxt * 2;

               Point3d  pt = ppr.Value;

               Point3d tpt = new Point3d(pt.X, pt.Y + gap, pt.Z);

               Matrix3d mx = ed.CurrentUserCoordinateSystem.Inverse();

               Vector3d mXPrev = Vector3d.XAxis;
                // build custom dimension text
               string dstr = string.Format("X = {0:f3}\\PY = {1:f3}", pt.X, pt.Y);// set precision to 3 decimals {:f3}

               OrdinateDimension odim = new OrdinateDimension(false, pt, tpt, dstr, db.Dimstyle);

               double ohrot = odim.HorizontalRotation;
               // get the old Xaxis and transform it to current plane
               Matrix3d mMat = Matrix3d.PlaneToWorld(odim.Normal); //ECS

               mXPrev.TransformBy(mMat); //get the ECS xaxis in the world coordinates

               mXPrev.TransformBy(mx); //transform current xaxis to plane defined by mx

               // transform the dimension entity by the given transformation matrix

               odim.TransformBy(mx);

               // get the xAxis after transformation of the dimension entity

               mMat=   Matrix3d.WorldToPlane(odim.Normal);

               // transform the old axis to the current ECS.

               mXPrev.TransformBy(mMat);

                  // get the angle of the old xaxis with respect to the current xaxis
               
                 double newhrot = - Math.Atan2(mXPrev.X, mXPrev.Y);

                 odim.HorizontalRotation = ohrot + newhrot;

               postToModelSpace(odim);

               tr.AddNewlyCreatedDBObject(odim, true);
   
                    tr.Commit();
                }
            }


        static void postToModelSpace(Entity ent)
        {

            BlockTableRecord btr;

            Database db = HostApplicationServices.WorkingDatabase;

            btr = SymbolUtilityServices.GetBlockModelSpaceId(db).GetObject(OpenMode.ForWrite) as BlockTableRecord;

            btr.AppendEntity(ent);

        }

49
Blocks / How can you copy an entity from Model Space to Paper Space
« on: January 03, 2013, 10:07:28 AM »
         Translated on C# from this web page:
         http://adndevblog.typepad.com/autocad/2013/01/how-can-you-copy-an-entity-from-model-space-to-paper-space-in-objectarx.html
         Citation:
        How can you copy an entity from Model Space to Paper Space in ObjectARX?
        By Gopinath Taget

        To copy entities from Model Space to Paper Space in ObjectARX is actually quite straightforward.
        You can utilize the services of deepCloneObject() function to copy your select entities from Model Space into Paper Space.
        This is useful in situations where for example an older drawing contains a title block and you want to copy that title block into Paper Space.
        The following code defines command called "MS2PS". Simply select entities you want to copy over using a "window" style of selection:


        // This is command 'MS2PS'
Code: [Select]
        [CommandMethod("MS2PS")]
        public void ms2ps()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;
            Transaction tr = doc.TransactionManager.StartTransaction();

            using (tr)
            {

                PromptPointOptions ppo = new PromptPointOptions("\nFirst corner: ");
                PromptPointResult ppr = ed.GetPoint(ppo);
                if (ppr.Status != PromptStatus.OK) return;
                PromptCornerOptions pco = new PromptCornerOptions("\nOther corner: ", ppr.Value);
                PromptPointResult pcr = ed.GetCorner(pco);
                if (pcr.Status != PromptStatus.OK) return;
                Point3d p1 = ppr.Value;
                Point3d p2 = pcr.Value;
                if (p1.X == p2.X || p1.Y == p2.Y)
                {
                    ed.WriteMessage("\nInvalid coordinate specification");
                    return;
                }//end getcorner
                PromptSelectionResult res = ed.SelectCrossingWindow(p1, p2);
                if (res.Status != PromptStatus.OK) return;
                SelectionSet sset = res.Value;
                if (sset.Count == 0) return;
                ObjectIdCollection idps = new ObjectIdCollection();
                foreach (SelectedObject obj in sset)
                    idps.Add(obj.ObjectId);
                // Get the BlockTable
                BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.PaperSpace], OpenMode.ForWrite);
                db.DeepCloneObjects(idps, btr.ObjectId, new IdMapping(), true);

                tr.Commit();
            }
        }

50
Polylines / Get Curve Length
« on: January 03, 2013, 09:17:45 AM »
 
Code: [Select]
       [CommandMethod("getCurveLength", "cul", CommandFlags.Modal | CommandFlags.UsePickSet)]
        public void CurveLength()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;
            Transaction tr = doc.TransactionManager.StartTransaction();
            double startParam, endParam, length;
            using (tr)
            {

                PromptEntityOptions peo = new PromptEntityOptions("\nSelect Curve >>");
                peo.SetRejectMessage("\nSelect Curve only >>");
                peo.AddAllowedClass(typeof(Curve), 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;
                Curve curve = (Curve)ent as Curve;
                if (curve != null)
                {
                    startParam = curve.StartParam;

                    endParam = curve.EndParam;

                    length = curve.GetDistanceAtParameter(endParam) - curve.GetDistanceAtParameter(startParam);

                    ed.WriteMessage("\nLength = {0:f3}\n", length);

                }//end getentity

                tr.Commit();
            }//end using transaction
        }

51
External databases / Read and parse .csv or .txt file
« on: December 29, 2012, 08:16:31 PM »
 
Code: [Select]
       [CommandMethod("ptsRead")]
        public void testReadCSV()
        {   // file name contains separated text
            string filePath = @"C:\Test\points.txt";
            if (!File.Exists(filePath))
            {
                MessageBox.Show("File does not exist");
                return;
            }
            // put appropriate delimiter here
            string sep = ";";
            Point3dCollection pts = new Point3dCollection();
            using (System.IO.StreamReader reader = new System.IO.StreamReader(filePath))
            {
                while (!reader.EndOfStream)
                {
                    // Call reader.ReadLine() appropriately
                    string textLine = reader.ReadLine();
                    Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\n{0}", textLine);
                    string[] tmp = textLine.Split(new string[] { sep }, StringSplitOptions.RemoveEmptyEntries);
                    if (tmp.Length != 0)
                    {
                        Point3d pt = new Point3d(Convert.ToDouble(tmp[0]), Convert.ToDouble(tmp[1]), Convert.ToDouble(tmp[2]));
                        pts.Add(pt);
                    }
                }
            }

            if (pts == null)
            {
                MessageBox.Show("Cant parse this file");
                return;
            }
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Database db = doc.Database;

            Editor ed = doc.Editor;

            Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("pdmode", 34);

            Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("pdsize", 2.0);

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

                foreach (Point3d pnt in pts)
                {
                    DBPoint pt = new DBPoint(pnt);

                    pt.SetDatabaseDefaults();

                    pt.ColorIndex = 1;// <-- set any color of point

                    btr.AppendEntity(pt);

                    DBText txt = new DBText();

                    tr.AddNewlyCreatedDBObject(pt, true);

                    txt.SetDatabaseDefaults();

                    txt.Position = pt.Position;

                    txt.TextString = txt.Position.ToString();//<-- add any textstring to suit

                    txt.Justify = AttachmentPoint.BaseLeft;

                    // txt.AlignmentPoint = pt.Position;

                    txt.AdjustAlignment(db);

                    btr.AppendEntity(txt);

                    tr.AddNewlyCreatedDBObject(txt, true);
                }
                tr.Commit();
            }
        }

52
Dimensions / Add text or mtext to leader
« on: December 29, 2012, 06:38:52 PM »
 
Code: [Select]
       [CommandMethod("CopyTextToLeader", "ttl", CommandFlags.Redraw)]
        public void TextToMleader()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            Database db = doc.Database;
            // save current DIMBLK variable
            string dblk = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("DIMBLK").ToString();
            try
            {
                PromptEntityOptions peo =
                 new PromptEntityOptions("\nSelect Text / MText: ");
                peo.SetRejectMessage("\nMust be select type of Text or MText.");
                peo.AddAllowedClass(typeof(DBText), false);
                peo.AddAllowedClass(typeof(MText), false);
                PromptEntityResult per = ed.GetEntity(peo);
                if (per.Status != PromptStatus.OK) return;
                ObjectId txtId = per.ObjectId;
                PromptPointOptions opt = new PromptPointOptions("\nSpecify leader arrowhead location: ");
                PromptPointResult res = ed.GetPoint(opt);

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

                Point3d pt = res.Value;

                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
                    ObjectId blkid = ObjectId.Null;
                    DBObject obj = (DBObject)tr.GetObject(txtId, OpenMode.ForWrite) as DBObject;
                    ed.WriteMessage("\nType\t{0}\n", obj.GetRXClass().DxfName);
                    DBText txtobj = null;
                    MText mtxtobj = null;
                    Point3d tp = new Point3d();
                    if (obj.GetRXClass().DxfName == "TEXT")
                    {
                        txtobj = obj as DBText;
                        if (txtobj == null) return;
                        tp = txtobj.Position;
                    }
                    if (obj.GetRXClass().DxfName == "MTEXT")
                    {
                        mtxtobj = obj as MText;
                        if (mtxtobj == null) return;
                        tp = mtxtobj.Location;
                    }

                    Leader leader = new Leader();
                    // Create the MText annotation
                    MText copymtx = new MText();
                    if (mtxtobj != null)
                    {
                        copymtx = mtxtobj.Clone() as MText;
                    }
                    if (txtobj != null)
                    {
                        copymtx = new MText();
                        copymtx.Location = txtobj.Position;
                        copymtx.Contents = txtobj.TextString;
                    }

                    // Add the new object to current space and the transaction
                    btr.AppendEntity(copymtx);
                    tr.AddNewlyCreatedDBObject(copymtx, true);


                    if (txtobj != null)
                    {
                        leader.TextStyleId = txtobj.TextStyleId;
                    }
                    if (mtxtobj != null)
                    {
                        leader.TextStyleId = mtxtobj.TextStyleId;
                    }

                    // set arrow head block to DOT or use any other
                    if (!bt.Has("_DOT"))
                    {
                        Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("DIMBLK", "_DOT");

                    }
                    leader.HasArrowHead = true;
                    leader.Dimldrblk = bt["_DOT"];
                    leader.Dimasz = db.Dimtxt * 0.2;
                    leader.AppendVertex(pt);
                    leader.AppendVertex(tp);

                    btr.AppendEntity(leader);
                    tr.AddNewlyCreatedDBObject(leader, true);
                    // attach the annotation after the leader object is added
                    leader.Annotation = copymtx.ObjectId;
                    // evaluate leader
                    leader.EvaluateLeader();
                    // erase prototypes
                    if (mtxtobj != null) mtxtobj.Erase();
                    if (txtobj != null) txtobj.Erase();

                    tr.Commit();
                }
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage("\nError: {0}\nTrace: {1}", ex.Message, ex.StackTrace);
            }
            finally
            {
                // reset DIMBLK
                if (dblk != "")
                {
                    Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("DIMBLK", dblk);
                }
                else
                {
                    Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("DIMBLK", ".");
                }
            }
        }

53
Dimensions / Read dimension text
« on: December 29, 2012, 06:32:41 PM »
 
Code: [Select]
       [CommandMethod("GetDimText","gd", CommandFlags.UsePickSet)]
        public void getDimText()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Database db = doc.Database;

            Editor ed = doc.Editor;

            Transaction tr = doc.TransactionManager.StartTransaction();

            using (tr)
            {
                PromptEntityOptions peo = new PromptEntityOptions("\nSelect dimension >>");

                peo.SetRejectMessage("\nSelect 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)
                {
                   
                    ed.WriteMessage("\nDim measurement:\t{0}",dim.Measurement);

                    if (dim.DimensionText != "") ed.WriteMessage("\nHas overriden dim text:\t{0}", dim.DimensionText);
           
                }

                tr.Commit();
            }//end using transaction
        }

54
Polylines / Draw grid by picking corners
« on: December 29, 2012, 06:30:51 PM »
        [CommandMethod("gds")]
Code: [Select]
        public static void TestGraph()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Matrix3d ucs = ed.CurrentUserCoordinateSystem;
            PromptPointOptions ppo = new PromptPointOptions("\nJust a Lower Left corner: ");
            PromptPointResult ppr = ed.GetPoint(ppo);
            if (ppr.Status != PromptStatus.OK)
            {
                return;
            }
            PromptCornerOptions pco = new PromptCornerOptions("\nUpper Right corner: ", ppr.Value);
            PromptPointResult pcr = ed.GetCorner(pco);
            if (pcr.Status != PromptStatus.OK)
            {
                return;
            }
            Point3d p1 = ppr.Value;
            Point3d p2 = pcr.Value;
            if (((p1.X == p2.X || p1.Y == p2.Y) & (p2.X > p1.X || p2.Y > p1.Y)))
            {
                ed.WriteMessage("\nWrong coordinate specification");
                return;
            }
            // Calculate the four corner points of the box
            // and add them to a Point3dCollection:
            Point3dCollection points = new Point3dCollection();
            points.Add(p1);
            points.Add(new Point3d(p2.X, p1.Y, 0.0));
            points.Add(p2);
            points.Add(new Point3d(p1.X, p2.Y, 0.0));
            double leng = 0;
            leng = p2.X - p1.X;
            double wid = 0;
            wid = p2.Y - p1.Y;

            //'-------------------------------------------------------''
            PromptIntegerOptions pio = new PromptIntegerOptions("");
            pio.Message = "\nEnter the number of rows: ";

            // Restrict input to positive and non-negative values
            pio.AllowZero = false;
            pio.AllowNegative = false;
            // Add default value
            pio.DefaultValue = 4;
            pio.AllowNone = true;

            // Get the value entered by the user
            PromptIntegerResult ires = ed.GetInteger(pio);
            if (ires.Status != PromptStatus.OK)
            {
                return;
            }

            int rownum = ires.Value;

            pio.Message = "\nnEnter the number of columns: ";

            // Restrict input to positive and non-negative values
            pio.AllowZero = false;
            pio.AllowNegative = false;
            // Add default value
            pio.DefaultValue = 8;
            pio.AllowNone = true;

            // Get the value entered by the user
            PromptIntegerResult ires2 = ed.GetInteger(pio);
            if (ires2.Status != PromptStatus.OK)
            {
                return;
            }

            int colnum = ires2.Value;

            double rowstep = 0;
            rowstep = wid / rownum;

            double colstep = 0;
            colstep = leng / colnum;
           
            Database db = ed.Document.Database;

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTableRecord btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
                Plane plan = new Plane(Point3d.Origin, Vector3d.ZAxis);
                Polyline poly = new Polyline(4);
                int i = 0;
                foreach (Point3d pt in points)
                {
                    poly.AddVertexAt(i, pt.Convert2d(plan), 0, 0, 0);
                    i += 1;
                }
                poly.Closed = true;
                btr.AppendEntity(poly);
                tr.AddNewlyCreatedDBObject(poly, true);

                Point3dCollection vps = new Point3dCollection();
                Point3dCollection hps = new Point3dCollection();
                for (i = 1; i <= rownum - 1; i++)
                {
                    vps.Add(new Point3d(p1.X, p1.Y + (i * rowstep), p1.Z));
                }
                for (i = 1; i <= colnum - 1; i++)
                {
                    hps.Add(new Point3d(p1.X + (i * colstep), p1.Y, p1.Z));
                }
                Line ln = new Line();

                foreach (Point3d pt in vps)
                {
                    ln = new Line(pt, new Point3d(pt.X + leng, pt.Y, 0));
                    btr.AppendEntity(ln);
                    tr.AddNewlyCreatedDBObject(ln, true);
                }
                foreach (Point3d pt in hps)
                {
                    ln = new Line(pt, new Point3d(pt.X, pt.Y + wid, 0));
                    btr.AppendEntity(ln);
                    tr.AddNewlyCreatedDBObject(ln, true);
                }
                tr.Commit();
            }
        }

55
Selection sets / Copy selected objects to other document
« on: December 25, 2012, 02:41:08 PM »
Code: [Select]
        //using System.Windows.Forms;

        static public void createCopyDoc(string fileName) // This method can have any name
        {
            DocumentCollection dm = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager;
            Document doc = dm.MdiActiveDocument;
            try
            {
            using (DocumentLock docloc = doc.LockDocument())
            {

                if (!File.Exists(fileName))
                {
                    Document newdoc = dm.Add("");
                    Database newdb=newdoc.Database;
                    newdb.SaveAs(fileName, DwgVersion.Current);
                    newdoc.CloseAndDiscard();
                }
            }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        [CommandMethod("CSset", CommandFlags.Session)]

        static public void CopySelectedText() // This method can have any name
        {
            string fileName = "c:\\test\\CopySet.dwg"; // add target drawing full name here
            DocumentCollection dm = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager;
            Document doc = dm.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            try
            {
            using (DocumentLock docloc = doc.LockDocument())
            {
                Transaction tr = db.TransactionManager.StartTransaction();

                using (tr)
                {
                    BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);

                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);

                    // build filter to select texts and mtexts in the model space
                    TypedValue[] tv = new TypedValue[] { new TypedValue((int)DxfCode.Start, "*text"), new TypedValue(410, "Model") };

                    SelectionFilter filt = new SelectionFilter(tv);
                    //perform selection on screen
                    PromptSelectionResult res = ed.GetSelection(filt);

                    SelectionSet sset = res.Value;

                    ObjectId[] idcoll = sset.GetObjectIds();

                    ed.WriteMessage("\nSelected: {0}",  idcoll.Length);

                    ObjectIdCollection ids = new ObjectIdCollection();

                    foreach (ObjectId id in idcoll)
                    {
                        ids.Add(id);
                    } // may use ids.CopyTo(idcoll,idcoll.Length-1) instead

                    // create drawing if does not exists
                    if (!File.Exists(fileName))
                    {
                        createCopyDoc(fileName);

                    }

                    using (Database newdb = new Database(false, true))
                    {

                        newdb.ReadDwgFile(fileName,    System.IO.FileShare.ReadWrite, true, "");

                        using (Transaction newtr = newdb.TransactionManager.StartTransaction())
                        {

                           // Get Block table of target database
                            BlockTable  newbt = (BlockTable)newtr.GetObject(newdb.BlockTableId, OpenMode.ForRead);
                            // Get model space of target database
                            BlockTableRecord newbtr = (BlockTableRecord)newtr.GetObject(newbt[BlockTableRecord.ModelSpace], OpenMode.ForRead);

                        if (ids.Count != 0)
                        {
                            IdMapping iMap = new IdMapping();

                            db.WblockCloneObjects(ids, newbtr.ObjectId, iMap, DuplicateRecordCloning.Ignore, false);
                            // Save target drawing
                            newdb.SaveAs(fileName, DwgVersion.Current);// [A2010] this syntax ought be different for other Acad release
                           

                        }
                        }

                    }

                    tr.Commit();
                }//end using transaction
            }
            }
            catch (System.Exception ex)
            {
                // informative message
                ed.WriteMessage("\n{0}\n", ex.ToString());
                MessageBox.Show(ex.ToString());
            }
        }

56
Polylines / Total length and area of curves
« on: December 12, 2012, 05:12:12 PM »
You can add other entity type to build selection,
here is 2 small programs, tested on A2010
Code: [Select]
    [CommandMethod("tot")]
       
        public void testTotalLength()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Database db = doc.Database;

            Editor ed = doc.Editor;

            double total = 0;

            Transaction tr = doc.TransactionManager.StartOpenCloseTransaction();

            using (tr)
            {

                TypedValue[] tv = new TypedValue[] { new TypedValue((int)DxfCode.Start, "*LINE,ARC") };

                SelectionFilter flt = new SelectionFilter(tv);

                PromptSelectionResult res = ed.GetSelection(flt);

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

                SelectionSet sset = res.Value;

                if (sset.Count == 0) return;

                foreach (SelectedObject sobj in sset)
                {
                    Entity ent = (Entity)tr.GetObject(sobj.ObjectId, OpenMode.ForRead);

                    Curve curv = ent as Curve;

                    if (curv != null)

                        total += curv.GetDistanceAtParameter(curv.EndParam);
                }
                ed.WriteMessage("\nTotal Length:\t{0:f3}\n",total);
            }
        }
      [CommandMethod("toa")]

      public void testTotalArea()
      {
          Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

          Database db = doc.Database;

          Editor ed = doc.Editor;

          double total = 0;

          Transaction tr = doc.TransactionManager.StartOpenCloseTransaction();

          using (tr)
          {
              // build filter to select closed curves and circles
              TypedValue[] tv = new TypedValue[]
              { new TypedValue(-4, "<or"),
                  new TypedValue(-4, "<and"),
                  new TypedValue(0, "*LINE"),
                  new TypedValue(70, 1), new TypedValue(-4, "and>"),
                  new TypedValue(0, "CIRCLE"),
                  new TypedValue(-4, "or>") };

              SelectionFilter flt = new SelectionFilter(tv);

              PromptSelectionResult res = ed.GetSelection(flt);

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

              SelectionSet sset = res.Value;

              if (sset.Count == 0) return;

              foreach (SelectedObject sobj in sset)
              {
                  Entity ent = (Entity)tr.GetObject(sobj.ObjectId, OpenMode.ForRead);

                  Curve curv = ent as Curve;

                  if (curv != null)

                      total += curv.Area;
              }
              ed.WriteMessage("\nTotal Area:\t{0:f3}\n", total);
          }
      }

57
Blocks / Show block tooltip
« on: October 28, 2012, 09:22:47 PM »
To display block info, please, try to hover mouse right on block,
then tooltip message woul be displayed
Tested on A2010 only

Code: [Select]
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;

namespace ToolTips
{
    public class BlockToolTip
    {
        public class Drawing
        {

            Document doc;
            Editor ed;

            public Drawing()
            {
                doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
                ed = doc.Editor;
            }



            [CommandMethod("WWS")]
            public void StartToolTip()
            {
                ed.WriteMessage("\n---   To remove handler type: WWE   ---\n");
                ed.PointMonitor += new PointMonitorEventHandler(ed_PointMonitor);
            }


            void ed_PointMonitor(object sender, PointMonitorEventArgs e)
            {
                Editor ed = (Editor)sender;
                try
                {
                    FullSubentityPath[] paths = e.Context.GetPickedEntities();
                    string attdata = "";
                    Transaction tr = doc.TransactionManager.StartTransaction();
                    using (tr)
                    {
                        foreach (FullSubentityPath path in paths)
                        {
                            ObjectId[] ids = path.GetObjectIds();
                            if (ids.Length > 0)
                            {
                                ObjectId id = ids[0];
                                DBObject obj = tr.GetObject(id, OpenMode.ForRead);
                                if (obj != null)
                                {
                                    BlockReference bref = obj as BlockReference;
                                    if (bref != null)
                                    {
                                        BlockTableRecord bdef = (BlockTableRecord)tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead);
                                        if (!bdef.HasAttributeDefinitions) return;
                                        attdata = GetAttributesData(tr, bref);
                                    }
                                }
                            }
                        }
                        tr.Commit();
                    }
                    if (attdata != "")
                        e.AppendToolTipText(attdata);
                }
                catch (System.Exception ex)
                {
                    Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(ex.Message + "\n" + ex.StackTrace);
                }
            }
            string GetAttributesData(Transaction tr, BlockReference bref)
            {
                int mix = 24;
                int left;
                StringBuilder sb = new StringBuilder();
                left = "Block:".Length;
                sb.AppendLine(String.Format("{0}{1}\n", "Block:".PadRight(mix - 6, ' '), bref.Name));
                var info = (from ObjectId id in bref.AttributeCollection
                            let attref = (AttributeReference)tr.GetObject(id, OpenMode.ForRead, false)
                            select new { key = attref.Tag, value = attref.TextString }).ToArray();
                foreach (var item in info)
                {
                    left = item.key.Length;
                    sb.AppendLine(String.Format("{0}{1}", item.key.PadRight(mix - left, ' '), item.value));
                }
                return sb.ToString();
            }

            [CommandMethod("wwe")]
            public void EndToolTip()
            {
                ed.TurnForcedPickOn();
                ed.PointMonitor -= ed_PointMonitor;
            }
        }
    }
}

58
Blocks / Count blocks by attribute value
« on: August 16, 2012, 10:07:25 PM »
Code: [Select]
        // using System.Linq;
        #region "Selection block by attribute tag"

        //      get the real block name.        //     
        public static string EffectiveName(Transaction tr, BlockReference bref)
        {
            BlockTableRecord btr = null;
            if ((bref.IsDynamicBlock)
                | (bref.Name.StartsWith("*U", StringComparison.InvariantCultureIgnoreCase)))
            {
                btr = tr.GetObject(bref.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
            }
            else
            {
                btr = tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
            }
            return btr.Name;
        }
        [CommandMethod("SelectByAttributeValue", "byval", CommandFlags.Modal)]
        public void GetSelectionByAtt()
        {

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

            Database db = doc.Database;

            Editor ed = doc.Editor;

            string m_str = string.Empty;

            PromptStringOptions psto = new PromptStringOptions("\nEnter the tag to find (case-nonsensitive): ");
            // to disable the blank space in user input
            psto.AllowSpaces = false;

            PromptResult pstr = ed.GetString(psto);

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

            m_str = pstr.StringResult.ToUpper();

            List<object[]> blockdata = new List<object[]>();

            PromptSelectionOptions pso = new PromptSelectionOptions();

            pso.MessageForRemoval = "\nFailed to select a blocks!";

            pso.MessageForAdding = "\nPlease select a blocks: ";

            // build filter to select all attributed blocks
            SelectionFilter filter =
                new SelectionFilter(
                new TypedValue[] { new TypedValue(0, "insert"),
                    new TypedValue(66, 1) }
                    );

            // perform block selection
            PromptSelectionResult sres = ed.GetSelection(pso, filter);// might be SelectAll instead

            if (sres.Status != PromptStatus.OK) return;
            try
            {

                SelectionSet sset = sres.Value;

                using (Transaction tr = db.TransactionManager.StartTransaction())
                {

                    foreach (SelectedObject sobj in sset)
                    {
                        Entity ent = tr.GetObject(sobj.ObjectId, OpenMode.ForRead, false) as Entity;

                        BlockReference bref = ent as BlockReference;

                        AttributeCollection attribs = bref.AttributeCollection;

                        foreach (ObjectId attid in attribs)
                        {
                            AttributeReference attref = tr.GetObject(attid, OpenMode.ForRead, false) as AttributeReference;

                            if (attref.Tag == m_str)
                            {

                                object[] datum = new object[] { EffectiveName(tr, bref), attref.Tag, attref.TextString };
                                // add block  info to the list
                                blockdata.Add(datum);

                            }
                        }
                    }
                    // display total result
                    //foreach (object[] item in blockdata)
                    //    ed.WriteMessage("\n{0}\t{1}\t{2}", item[0], item[1],item[2]);
                    var grps = from blk in blockdata
    group blk by new
    {
        Name =blk.ElementAt(0), Tag =blk.ElementAt(1),AttValue=blk.ElementAt(2)
    }
    into grp
    select new
    {
        BlockName=grp.First().ElementAt(0),
        Tag=grp.First().ElementAt(1),
        AttValue=grp.First().ElementAt(2),
        Count= grp.Count()
    };

                    // display subtotals
                    foreach (var grp in grps)
                    {
                        ed.WriteMessage("\n[ Block Name: {0} |Tag: {1} | Value: {2} | Count: {3} ]\n",
                            grp.BlockName,
                            grp.Tag,
                            grp.AttValue,
                            grp.Count
        );
                    }
                    tr.Commit();

                }
            }
            catch (System.Exception ex)
            {
                Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(ex.Message + "\n" + ex.StackTrace);
            }
            finally
            {
            }
        }
        #endregion

~'J'~

59
Blocks / Count blocks by attribute tag
« on: August 16, 2012, 09:34:43 PM »
Code: [Select]
       // using System.Linq;
        #region "Selection block by attribute tag"

        //      get the real block name.        //     
        public static string EffectiveName(Transaction tr, BlockReference bref)
        {
            BlockTableRecord btr = null;
            if ((bref.IsDynamicBlock)
                | (bref.Name.StartsWith("`*U", StringComparison.InvariantCultureIgnoreCase)))
            {
                btr = tr.GetObject(bref.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
            }
            else
            {
                btr = tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
            }
            return btr.Name;
        }
        [CommandMethod("SelectByAttribute","byatt", CommandFlags.Modal)]
        public void GetSelectionByAtt()
        {
   
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Database db = doc.Database;

            Editor ed = doc.Editor;

            string m_str = string.Empty;

            PromptStringOptions psto= new PromptStringOptions("\nEnter the tag to find (case-nonsensitive): ");
            // to disable the blank space in user input
            psto.AllowSpaces=false;

            PromptResult pstr= ed.GetString(psto);

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

            m_str= pstr.StringResult.ToUpper();

            List<object[]> blockdata = new List<object[]>();

            PromptSelectionOptions pso = new PromptSelectionOptions();

            pso.MessageForRemoval = "\nFailed to select a blocks!";

            pso.MessageForAdding = "\nPlease select a blocks: ";

            // build filter to select all attributed blocks
            SelectionFilter filter =
                new SelectionFilter(
                new TypedValue[] { new TypedValue(0, "insert"),
                    new TypedValue(66, 1) }
                    );

            // perform block selection
            PromptSelectionResult sres = ed.GetSelection(pso, filter);// might be SelectAll instead

            if (sres.Status != PromptStatus.OK) return;
            try
            {

            SelectionSet sset = sres.Value;

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {

            foreach (SelectedObject sobj in sset)
            {
                Entity ent = tr.GetObject(sobj.ObjectId,OpenMode.ForRead, false) as Entity;

                BlockReference bref = ent as BlockReference;

                AttributeCollection attribs = bref.AttributeCollection;

                foreach (  ObjectId attid in attribs)
                {
                    AttributeReference attref= tr.GetObject(attid, OpenMode.ForRead,false) as AttributeReference;

                if (attref.Tag==m_str)
                {
                   
                    object[] datum = new object[]{EffectiveName(tr, bref), attref.Tag,attref.TextString};
                            // add block  info to the list
                            blockdata.Add(datum);
           
                }
                    }
                }
             // display total result
            //foreach (object[] item in blockdata)
            //    ed.WriteMessage("\n{0}\t{1}\t{2}", item[0], item[1],item[2]);

                // group items by name and attribute tag
            var grps = from s in blockdata
                       group s by s[0]  into grp
                       select new
                       {
                           BlockName = grp.Key,
                           Tag = grp.First().ElementAt(1),
                           AttValue = grp.First().ElementAt(2),
                           Count= grp.Count()
                       };
            // display subtotals
            foreach (var grp in grps)
            {
                ed.WriteMessage("\n[ Block Name: {0} |Tag: {1} | Value: {2} | Count: {3} ]\n",
                    grp.BlockName,
                    grp.Tag,
                    grp.AttValue,
                    grp.Count
);
            }
            tr.Commit();

            }           
            }       
            catch (System.Exception ex)
            {
                Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(ex.Message + "\n" + ex.StackTrace);
            }
            finally
            {
            }
        }
        #endregion

~'J'~

60
Text / Add prefix and suffix to the text or mtext
« on: August 14, 2012, 04:16:56 PM »
Code: [Select]
        #region "Add prefix and suffix to the text or mtext multiply"
        [CommandMethod("PSUF")]
        public static void UpdateMultipleTexts()
        {

            Database db = HostApplicationServices.WorkingDatabase;

            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;

            Transaction tr = db.TransactionManager.StartTransaction();

            string pref = GetstringDflt(ed, "Enter a Prefix: ", "A-");

            string suff = GetstringDflt(ed, "Enter a Suffix: ", "-B");

            using (tr)
            {

                try
                {
                    Entity ent;

                    PromptEntityResult per;

                    ObjectId id;

                    do
                    {
                        PromptEntityOptions peo = new PromptEntityOptions("\nSelect Text >>");
                        peo.SetRejectMessage("\nMust be selected a Text or Mtext only!");

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

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

                        per = ed.GetEntity(peo);

                        if (per.Status != PromptStatus.OK)
                        {
                            break;
                        }
                        id = per.ObjectId;

                        ent = id.GetObject(OpenMode.ForRead) as Entity;

                        ed.WriteMessage("\nObject Selected:\t{0}", ent.GetRXClass().DxfName);

                        if ((!(ent is DBText)) && (!(ent is MText)))
                        {
                            ed.WriteMessage("\nNot a Text or MText");
                            continue;
                        }
                        DBText txt= ent as DBText;
                        if (txt!= null)
                        {
                            txt.UpgradeOpen();
                            string text = txt.TextString;
                            txt.TextString = pref + text+ suff;
                            txt.DowngradeOpen();
                        }

                        MText mtxt = ent as MText;
                        if (mtxt != null)
                        {
                            mtxt.UpgradeOpen();
                            string text = mtxt.Contents;
                            mtxt.Contents = pref + text + suff;
                            mtxt.DowngradeOpen();
                        }
                     
                        db.TransactionManager.QueueForGraphicsFlush();
                    }
                    while (per.Status == PromptStatus.OK);
                    tr.Commit();
                }

                catch (Autodesk.AutoCAD.Runtime.Exception ex)
                {

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

            }
        }
        #region "Helpers"
        public static string GetstringDflt(Editor ed, string msg, string dflt)
        {
            string answer = string.Empty;

            PromptStringOptions pso = new PromptStringOptions("\n" + msg);

            if (dflt != string.Empty)
            {
                pso.DefaultValue = dflt;
            }
            pso.AllowSpaces = true;

            PromptResult pr = ed.GetString(pso);

            if (pr.Status == PromptStatus.OK)
            {
                answer = pr.StringResult;
            }
            return answer;
        }
        #endregion

        #endregion

~'J'~

Pages: 1 2 3 [4] 5 6 ... 8