Show Posts

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


Messages - fixo

Pages: 1 ... 3 4 [5] 6 7 ... 9
61
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();
            }
        }

62
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
        }

63
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();
            }
        }

64
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", ".");
                }
            }
        }

65
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
        }

66
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();
            }
        }

67
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());
            }
        }

68
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);
          }
      }

69
AutoCAD talk / Re: .NET C# and Civil3d API
« on: November 09, 2012, 05:35:36 PM »
You may to lok ath this bloq, there is many code examples in there
written by Isaac Rodriguez:
http://civilizeddevelopment.typepad.com/

70
Blocks / Re: Show block tooltip
« on: October 29, 2012, 06:07:19 PM »
To be honestly, most of code is written by Kean Walmsley,
regatds to him for that, mine is just a litlle piece of this routine,
Cheers :)

71
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;
            }
        }
    }
}

72
Glad I could help
Happy coding :)

73
Hi Kevin, you may want to use this code,
mostly borrowed from Kean Walmsley:
Code: [Select]
        //using System.IO;
        private SelectionSet LineSelection(Editor ed)
        {

            // select lines on screen using filter

            PromptSelectionOptions pso = new PromptSelectionOptions();

            pso.MessageForRemoval = "\n Select lines only: ";

            pso.MessageForAdding = "\nSelect lines: ";

            pso.RejectObjectsOnLockedLayers = false;

            TypedValue[] dxfcodes = new TypedValue[1] { new TypedValue(0, "LINE") };

            SelectionFilter filter = new SelectionFilter(dxfcodes);

            PromptSelectionResult psr = ed.GetSelection(pso, filter);

            if (psr.Status != PromptStatus.OK)

                return null;

            return psr.Value;

        }

        [CommandMethod("LinesToFile", "ltf", CommandFlags.Modal | CommandFlags.UsePickSet)]
        public void testLineSelection()
        {
            bool isOk = true;
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            List<Point3d[]> linedata = new List<Point3d[]>();
            string txtname = (string)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("dwgprefix");
            string dwgname = (string)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("dwgname");
            dwgname = dwgname.Substring(0, dwgname.Length - 4) + ".csv";// <--  change on .txt if it's need
            txtname = Path.Combine(txtname, dwgname);
            try
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    SelectionSet sset = LineSelection(ed);
                    foreach (SelectedObject sobj in sset)
                    {
                        Line ln = tr.GetObject(sobj.ObjectId, OpenMode.ForRead) as Line;
                        if (ln != null)
                        {
                            Point3d p1 = ln.StartPoint;
                            Point3d p2 = ln.EndPoint;
                            Point3d[] pts = new Point3d[2];
                            pts[0] = p1;
                            pts[1] = p2;
                            linedata.Add(pts);
                        }
                    }

                    using (StreamWriter sw = new StreamWriter(txtname))
                    {
                        foreach (Point3d[] lnItem in linedata)
                        {
                            string txtline = string.Format("{0:f6}\t{1:f6}\t{2:f6}\t{3:f6}\t{4:f6}\t{5:f6}", lnItem[0].X, lnItem[0].Y, lnItem[0].Z, lnItem[1].X, lnItem[1].Y, lnItem[1].Z);
                            sw.WriteLine(txtline);
                        }
                        sw.Flush();
                        sw.Close();
                    }
                    tr.Commit();
                }
            }
            catch (System.Exception ex)
            {
                isOk = false;
                ed.WriteMessage(ex.Message + "\n" + ex.StackTrace);
            }
            finally
            {
                if (isOk)
                {
                    ed.WriteMessage("\nProgram ended up with success\nSee record in:\n{0}", txtname);
                }
                else
                {
                    ed.WriteMessage("\nProgram failed");
                }
            }
        }

~'J'~

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

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

Pages: 1 ... 3 4 [5] 6 7 ... 9