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 ... 3 4 [5] 6 7 8
61
3D entities / Create 3D solid by extruding a polyline
« on: August 08, 2012, 09:52:08 PM »
     
Code: [Select]
     // based on C++ code by Virupaksha Aithal from this page:
      //http://adndevblog.typepad.com/autocad/2012/08/create-3d-solid-by-extruding-a-polyline.html
       [CommandMethod("extt")]
        public void CreateExtrude()
        {
            Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("delobj", 1);

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

            Database db = doc.Database;

            Editor ed = doc.Editor;

            PromptSelectionOptions pso = new PromptSelectionOptions();

            pso.SingleOnly = true;

            pso.SinglePickInSpace = true;

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

            pso.MessageForRemoval = "Failed to select a polyline";

            pso.PrepareOptionalDetails = true;

            SelectionFilter filter =
                new SelectionFilter(
                new TypedValue[] { new TypedValue(0, "lwpolyline"),new TypedValue(70, 1) });

            //select the polyline
            PromptSelectionResult sres = ed.GetSelection(pso,filter);

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

            using (Transaction tr = doc.TransactionManager.StartTransaction())
            {
                //get the boundary curves of the polyline

                ObjectId idPoly = sres.Value[0].ObjectId;

                Entity pEntity = tr.GetObject(idPoly, OpenMode.ForRead) as Entity;

                Polyline pPoly = pEntity as Polyline; ;

                if (pPoly == null) return;

                DBObjectCollection lines = new DBObjectCollection();

                pPoly.Explode(lines);

                // Create a region from the set of lines.

                DBObjectCollection regions = new DBObjectCollection();

                regions = Region.CreateFromCurves(lines);

                if (regions.Count == 0)
                {
                    ed.WriteMessage("\nFailed to create region\n");
                    return;
                }

                Region pRegion = (Region)regions[0];

                // Extrude the region to create a solid.

                Solid3d pSolid = new Solid3d();

                pSolid.RecordHistory = true;

                pSolid.Extrude(pRegion, 10.0, 0.0);
           
                ObjectId savedExtrusionId = ObjectId.Null;

                ObjectId modelId;

                modelId = SymbolUtilityServices.GetBlockModelSpaceId(db);

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

                savedExtrusionId = btr.AppendEntity(pSolid);

                tr.AddNewlyCreatedDBObject(pSolid,true);
         
                if (!pPoly.IsWriteEnabled) pPoly.UpgradeOpen();

                pPoly.Erase();
           
                tr.Commit();
            }

        }

~'J'~

62
Blocks / Remove any item from old block, then create new one instead
« on: August 08, 2012, 11:34:00 AM »
Code: [Select]
            public class BlockUtils
    {
        public ObjectIdCollection ids = new ObjectIdCollection();

        public  void curdb_ObjectAppended(object sender, ObjectEventArgs e)
        {

            //add the object id

            ids.Add(e.DBObject.ObjectId);

        }
       
        [CommandMethod("reins")]
        public void ReinsertBlock()
        {

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

            Database db = doc.Database;

            Editor ed = doc.Editor;

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

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

                    BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead, false, true);

                    PromptStringOptions psto = new PromptStringOptions("\nEnter the new block name: ");

                    psto.AllowSpaces = true;

                    PromptResult stres;

                    stres = ed.GetString(psto);

                    if (stres.Status != PromptStatus.OK)

                        return;

                    try
                    {
                        // Validate the provided block name
                        SymbolUtilityServices.ValidateSymbolName(stres.StringResult, false);
                    }
                    catch
                    {
                        ed.WriteMessage("\n\"{0}\"n is an invalid name, try another one.", stres.StringResult);

                        return;
                    }

                    string blockname = stres.StringResult;

                    if (bt.Has(blockname))
                    {
                        Autodesk.AutoCAD.Runtime.ErrorStatus es = ErrorStatus.DuplicateRecordName;

                        ed.WriteMessage("\n{0}\n{1}\n", es.ToString(), "Block already exist, try another name");

                        return;
                    }

                    PromptEntityOptions peo = new PromptEntityOptions("\nSelect block: ");

                    peo.SetRejectMessage("\nYou have to select BlockReference only!");

                    peo.AllowNone = false;

                    peo.AllowObjectOnLockedLayer = true;

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

                    PromptEntityResult per = ed.GetEntity(peo);

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

                    ObjectId objId = per.ObjectId;

                    if (!objId.ObjectClass.IsDerivedFrom(RXClass.GetClass(typeof(BlockReference))))
                    {

                        ed.WriteMessage( "\nYou didn't select a BlockReference, please try again...\n");

                        return;

                    }

                    DBObject blkobj = (DBObject)tr.GetObject(objId, OpenMode.ForRead, false);

                    BlockReference bref = blkobj as BlockReference;

                    if (bref == null) return;

                    BlockTableRecord btrec = null;

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

                    DBObjectCollection explobjs = new DBObjectCollection();

                    ids.Clear();
                    // Add event
                    db.ObjectAppended += new ObjectEventHandler(curdb_ObjectAppended);

                    bref.ExplodeToOwnerSpace();

                    // Remove event

                    db.ObjectAppended -= new ObjectEventHandler(curdb_ObjectAppended);

                    ObjectIdCollection newids = new ObjectIdCollection();
             
                    // Create BlockTableRecord
                    Matrix3d ucs2wcs = ed.CurrentUserCoordinateSystem;
                    Matrix3d wcs2ucs = ucs2wcs.Inverse();

                    // Add BlockTableRecord to Database
                    BlockTableRecord newbtr = new BlockTableRecord();

                    newbtr.Origin = btrec.Origin;
                    newbtr.Name = blockname;
                    newbtr.Units = bref.BlockUnit;
                    newbtr.Annotative = btrec.Annotative;
                    bt.UpgradeOpen();

                    ObjectId newblkid = bt.Add(newbtr);
                    tr.AddNewlyCreatedDBObject(newbtr, true);
                    // Pick displacement point, use pan and zoom to find an empty area for copy of the block
                    PromptPointOptions ppo = new PromptPointOptions("\nPick a displacement point: ");
                    ppo.BasePoint = bref.Position;
                    ppo.UseBasePoint = true;
                    ppo.UseDashedLine = true;
                    PromptPointResult pres = ed.GetPoint(ppo);
                    if (pres.Status != PromptStatus.OK) return;
                    Point3d movept = pres.Value;

                    //create vector for displacement
                    Vector3d vectrans = new Vector3d();
                    vectrans = movept.GetAsVector().Subtract(bref.Position.GetAsVector());
                    Matrix3d mat = Matrix3d.Displacement(vectrans);
                    foreach (ObjectId id in ids)
                    {
                        Entity ent = tr.GetObject(id, OpenMode.ForWrite) as Entity;
                        ent.TransformBy(mat);
                        tr.TransactionManager.QueueForGraphicsFlush();
                    }

                    PromptEntityOptions pxo = new PromptEntityOptions("\nSelect entity to remove from block: ");

                    pxo.AllowNone = false;

                    pxo.AllowObjectOnLockedLayer = true;

                    PromptEntityResult pxr = ed.GetEntity(pxo);

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

                    ObjectId exId = pxr.ObjectId;
                 
                    ids.Remove(exId);
                 
                    Entity exnt = (Entity)tr.GetObject(exId, OpenMode.ForWrite);

                    exnt.Erase();

                    exnt.Dispose();

                    newbtr.Origin = movept;

                    newbtr.AssumeOwnershipOf(ids);
                   
               
                  tr.TransactionManager.QueueForGraphicsFlush();
                   
                    if (btrec.HasAttributeDefinitions)
                    {
                        // Transform objects now in block from WCS to UCS
                        // and collect attributes
                        System.Collections.Generic.List<AttributeDefinition> attdefs =
                            new System.Collections.Generic.List<AttributeDefinition>();
                        foreach (ObjectId oid in newbtr)
                        {
                            Entity ent = (Entity)tr.GetObject(oid, OpenMode.ForWrite);
                            ent.TransformBy(wcs2ucs);
                            AttributeDefinition ad = ent as AttributeDefinition;
                            if (ad != null && !ad.Constant) attdefs.Add(ad);
                        }

                        // Create BlockReference
                        using (BlockReference newbref = new BlockReference(Point3d.Origin, bt[blockname]))
                        {
                              newbref.TransformBy(ucs2wcs * Matrix3d.Displacement(movept.GetAsVector()));
                         
                            ObjectContextCollection occ = db.ObjectContextManager.GetContextCollection("ACDB_ANNOTATIONSCALES");
                            if (occ.HasContext(db.Cannoscale.Name))
                                Autodesk.AutoCAD.Internal.ObjectContexts.AddContext(
                                    newbref, occ.GetContext(db.Cannoscale.Name));
                            // Add BlockReference to current space                           
                            m_ctab.AppendEntity(newbref);
                            tr.AddNewlyCreatedDBObject(newbref, true);

                            // Add attributes to BlockReference, if any
                            foreach (AttributeDefinition ad in attdefs)
                                using (AttributeReference attref = new AttributeReference())
                                {
                                    attref.SetAttributeFromBlock(ad, newbref.BlockTransform);
                                    if (ad.IsMTextAttributeDefinition)
                                        attref.UpdateMTextAttribute();
                                    attref.AdjustAlignment(db);
                                    newbref.AttributeCollection.AppendAttribute(attref);
                                    tr.AddNewlyCreatedDBObject(attref, true);
                                }
                        }
                    }
               
                    doc.TransactionManager.FlushGraphics();
                    tr.TransactionManager.QueueForGraphicsFlush();
                    tr.Commit();
                }
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage
                    (ex.Message + "\n" + ex.StackTrace);
            }
            finally
            {
            }
        }
    }

~'J'~

63
Layouts and printing / Delete layout without transaction
« on: August 05, 2012, 11:47:41 AM »
Code: [Select]
        [CommandMethod("dellt")]
        public void DelLayout()
        {
           // put desired layout name:
            string laytName = "D-Size Layout";// may have any layout name belongs to current drawing

            LayoutManager laytmgr = LayoutManager.Current;
            try
            {
                laytmgr.DeleteLayout(laytName);

                Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.Regen();
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage
                    (ex.Message + "\n" + ex.StackTrace);

            }
     
        }

~'J'~

64
Blocks / Move all attributes to the new positions
« on: August 05, 2012, 07:05:58 AM »
Code: [Select]
        // move attributes to the new positions
        // run command ATTSYNC manually to display result
        // right after the command is finished
        [CommandMethod("DAR")]

        static public void MoveAttributeReferences()
        {

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

            Database db = doc.Database;

            Editor ed = doc.Editor;

            // Select a block reference

            PromptEntityOptions peo = new PromptEntityOptions("\nSelect a block reference:");

            peo.SetRejectMessage("\nMust be block reference...");

            peo.AddAllowedClass(typeof(BlockReference), true);

            PromptEntityResult per = ed.GetEntity(peo);

            if (per.Status != PromptStatus.OK)

                return;

            // Select attribute reference

            PromptNestedEntityOptions pno = new PromptNestedEntityOptions("\nSelect an attribute ");

            PromptNestedEntityResult nres = ed.GetNestedEntity(pno);

            if (nres.Status != PromptStatus.OK)
            {
                ed.WriteMessage("\nAttribute nentsel failed");

                return;
            }
            Point3d spickPt = nres.PickedPoint;

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

            ObjectId sselId = nres.ObjectId;

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

            // Reverse the "containers" list

            // Now append the selected entity

            enIds.Add(sselId);

            enIds.Reverse();

            // Retrieve the sub-entity path for this entity

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

            FullSubentityPath path = new FullSubentityPath(enIds.ToArray(), subent);

            // Open the outermost container, relying on the open

            // transaction...


            Transaction tr = db.TransactionManager.StartTransaction();

            using (tr)
            {

                // This time we just open the block reference

                BlockReference br = (BlockReference)tr.GetObject(per.ObjectId, OpenMode.ForRead);

                // If the block reference has attribute references...

                if (br.AttributeCollection.Count == 0) return;

                BlockTableRecord owner;

                owner = (BlockTableRecord)tr.GetObject(br.BlockTableRecord, OpenMode.ForRead);
                if (br.IsDynamicBlock)
                {
                    owner = (BlockTableRecord)tr.GetObject(br.DynamicBlockTableRecord, OpenMode.ForRead);
                }
                owner.UpgradeOpen();


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

                AttributeReference attref = attent as AttributeReference;

                Point3d pt = attref.Position;

                PromptPointOptions ppo = new PromptPointOptions("\nSpecify the new attribute position: ");

                ppo.BasePoint=pt;

                ppo.UseBasePoint = true;

                ppo.UseDashedLine = true;

                PromptPointResult pres = ed.GetPoint(ppo);

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

                Point3d dp = pres.Value;

                Vector3d vec = pt.GetVectorTo(dp);

                Matrix3d mat = Matrix3d.Displacement(vec);

                foreach (ObjectId id in owner)
                {
                    if (id.ObjectClass.IsDerivedFrom(RXClass.GetClass(typeof(AttributeDefinition))))
                    {
                        AttributeDefinition attdef = (AttributeDefinition)tr.GetObject(id, OpenMode.ForRead);

                        attdef.UpgradeOpen();
                         // move attribute
                        attdef.TransformBy(mat);

                        attdef.DowngradeOpen();

                        //attdef.Erase();// debug only, commented

                    }
                }
         
                owner.DowngradeOpen();

                tr.Commit();

            }

        }

~'J'~

65
Polylines / Copy polyline segment
« on: July 30, 2012, 07:20:52 PM »
 C#
Code: [Select]
    [CommandMethod("copyseg")]
        public void copySegment()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;
            PromptEntityOptions peo = new PromptEntityOptions("\nSelect the segment to copy: ");
            peo.SetRejectMessage("\nYou have to select polyline only!");
            peo.AllowNone = false;
            peo.AllowObjectOnLockedLayer = false;
            peo.AddAllowedClass(typeof(Polyline), true);
            PromptEntityResult per = ed.GetEntity(peo);
            if (per.Status == PromptStatus.OK)
            {
 
                ObjectId objId = per.ObjectId;
                try
                {
                    using (Transaction tr = db.TransactionManager.StartTransaction())
                    {
                        Polyline pline = tr.GetObject(objId, OpenMode.ForRead, false) as Polyline;
                        if (pline != null)
                        {
                            BlockTableRecord btr = tr.GetObject(db.CurrentSpaceId,OpenMode.ForWrite, false) as BlockTableRecord;
                            Point3d pickPt = pline.GetClosestPointTo((Point3d)per.PickedPoint, false);
                            double param = pline.GetParameterAtPoint(pickPt);
                            int index = (int)param;
                          double swid=  pline.GetStartWidthAt(index);
                          double ewid = pline.GetEndWidthAt(index);

                          SegmentType stype=  pline.GetSegmentType(index);
                          if (stype == SegmentType.Line)
                          {
                             LineSegment2d lineseg= pline.GetLineSegment2dAt(index);
                              Polyline spoly = new Polyline();
                              Point2d sp = lineseg.StartPoint;
                              Point2d ep = lineseg.EndPoint;
                              spoly.AddVertexAt(0, sp, 0, swid, ewid);
                              spoly.AddVertexAt(1, ep,0,swid,ewid);
                              spoly.ColorIndex = 1;
                              btr.AppendEntity(spoly);
                              tr.AddNewlyCreatedDBObject(spoly, true);

                          }
                          if (stype == SegmentType.Arc)
                          {
                              CircularArc2d arcseg = pline.GetArcSegment2dAt(index);
                              Polyline spoly = new Polyline();
                              Point2d sp = arcseg.StartPoint;
                              Point2d ep = arcseg.EndPoint;
                              double boo = pline.GetBulgeAt(index);
                              spoly.AddVertexAt(0, sp, boo, swid, ewid);
                              spoly.AddVertexAt(1, ep, boo, swid, ewid);
                              spoly.ColorIndex = 2;
                              btr.AppendEntity(spoly);
                              tr.AddNewlyCreatedDBObject(spoly, true);

                          }
                        }
                        tr.Commit();
                    }
                }
                catch (System.Exception ex)
                {
   
                    ed.WriteMessage("\nError: {0}\nTrace: {1}" , ex.Message , ex.StackTrace);
                }
            }
        }


VB.NET
Code: [Select]
      <CommandMethod("copyseg")> _
        Public Sub copySegment()
            Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
            Dim ed As Editor = doc.Editor
            Dim db As Database = doc.Database
            Dim peo As New PromptEntityOptions(vbLf & "Select the segment to copy: ")
            peo.SetRejectMessage(vbLf & "You have to select polyline only!")
            peo.AllowNone = False
            peo.AllowObjectOnLockedLayer = False
            peo.AddAllowedClass(GetType(Polyline), True)
            Dim per As PromptEntityResult = ed.GetEntity(peo)
            If per.Status = PromptStatus.OK Then

                Dim objId As ObjectId = per.ObjectId
                Try
                    Using tr As Transaction = db.TransactionManager.StartTransaction()
                        Dim pline As Polyline = TryCast(tr.GetObject(objId, OpenMode.ForRead, False), Polyline)
                        If pline IsNot Nothing Then
                            Dim btr As BlockTableRecord = TryCast(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, False), BlockTableRecord)
                            Dim pickPt As Point3d = pline.GetClosestPointTo(per.PickedPoint, False)
                            Dim param As Double = pline.GetParameterAtPoint(pickPt)
                            Dim index As Integer = CInt(Math.Truncate(param))
                            Dim swid As Double = pline.GetStartWidthAt(index)
                            Dim ewid As Double = pline.GetEndWidthAt(index)

                            Dim stype As SegmentType = pline.GetSegmentType(index)
                            If stype = SegmentType.Line Then
                                Dim lineseg As LineSegment2d = pline.GetLineSegment2dAt(index)
                                Dim spoly As New Polyline()
                                Dim sp As Point2d = lineseg.StartPoint
                                Dim ep As Point2d = lineseg.EndPoint
                                spoly.AddVertexAt(0, sp, 0, swid, ewid)
                                spoly.AddVertexAt(1, ep, 0, swid, ewid)
                                spoly.ColorIndex = 1
                                btr.AppendEntity(spoly)
                                tr.AddNewlyCreatedDBObject(spoly, True)
                            End If

                            If stype = SegmentType.Arc Then
                                Dim arcseg As CircularArc2d = pline.GetArcSegment2dAt(index)
                                Dim spoly As New Polyline()
                                Dim sp As Point2d = arcseg.StartPoint
                                Dim ep As Point2d = arcseg.EndPoint
                                Dim boo As Double = pline.GetBulgeAt(index)
                                spoly.AddVertexAt(0, sp, boo, swid, ewid)
                                spoly.AddVertexAt(1, ep, boo, swid, ewid)
                                spoly.ColorIndex = 2
                                btr.AppendEntity(spoly)
                                tr.AddNewlyCreatedDBObject(spoly, True)
                            End If

                        End If
                        tr.Commit()
                    End Using
                Catch ex As System.Exception

                    ed.WriteMessage(vbLf & "Error: {0}" & vbLf & "Trace: {1}", ex.Message, ex.StackTrace)
                End Try
            End If
        End Sub

67
Dimensions / Reset dimension values
« on: July 23, 2012, 02:31:22 PM »
Code: [Select]
    // tested on AutoCAD 2010
       [CommandMethod("ResetDimValues", "rdv", CommandFlags.Modal | CommandFlags.Redraw)]
        public void ResetDims()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;

            TypedValue[] values = new TypedValue[] { new TypedValue(0, "DIMENSION") };
            SelectionFilter filter = new SelectionFilter(values);
            PromptSelectionOptions opts = new PromptSelectionOptions();

            opts.MessageForRemoval = "\nMust be a type of Dimension!";
            opts.MessageForAdding = "\nSelect dimensions to reset : ";
            opts.PrepareOptionalDetails = false;
            opts.SingleOnly = false;
            opts.SinglePickInSpace = false;
            opts.AllowDuplicates = true;
            PromptSelectionResult result = ed.GetSelection(opts, filter);
            if (result.Status != PromptStatus.OK) return;
            try
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    SelectionSet sset = result.Value;
                    foreach (SelectedObject selobj in sset)
                    {
                        DBObject obj = tr.GetObject(selobj.ObjectId, OpenMode.ForWrite, false) as DBObject;
                        Dimension dim = obj as Dimension;
                        if (dim != null)
                        {
                            dim.DimensionText = "<>";
                        }
                    }
                    tr.Commit();
                }
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage("\nProblem updating  dimensions.\n");
                ed.WriteMessage(ex.Message);
            }
        }

~'J'~

68
Text / Copy text to Leader
« on: July 23, 2012, 09:58:02 AM »
Code: [Select]
   // tested on AutoCAD 2010
       [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
                    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", ".");
                }
            }
        }

~'J'~

69
Text / Add vertex to MLeader
« on: July 23, 2012, 09:10:14 AM »
Code: [Select]
   //tested on AutoCAD 2010
       [CommandMethod("AddVertexToMLeader", "mlv", CommandFlags.Redraw)]
        public void AddMleaderVx()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            Database db = doc.Database;
     
            try
            {
                PromptEntityOptions peo =
                 new PromptEntityOptions("\nSelect mleader: ");
                peo.SetRejectMessage("\nMust be select type of MLeader.");
                peo.AddAllowedClass(typeof(MLeader), false);

                PromptEntityResult per = ed.GetEntity(peo);
                if (per.Status != PromptStatus.OK) return;
                ObjectId txtId = per.ObjectId;
                PromptPointOptions opt = new PromptPointOptions("\nSpecify new vertex location: ");
                PromptPointResult res = ed.GetPoint(opt);

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

                Point3d vp = res.Value;

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

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

                    DBObject obj = (DBObject)tr.GetObject(txtId, OpenMode.ForWrite) as DBObject;

                    MLeader leader = obj as MLeader;
   
                    int ld = leader.AddLeader();
                    int ln = leader.AddLeaderLine(ld);
                    leader.AddFirstVertex(ln, vp);
                    leader.AddLastVertex(ln, leader.TextLocation);

                    tr.Commit();
                }
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage("\nError: {0}\nTrace: {1}", ex.Message, ex.StackTrace);
            }
            finally
            {
           
            }
        }

~'J'~

70
Text / Copy Text to MultiLeader
« on: July 23, 2012, 08:50:02 AM »
Code: [Select]
      // tested on AutoCAD 2010
      [CommandMethod("TextToLeader", "ttm", 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 mleader 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;
                    }

                    MLeader leader = new MLeader();
                    leader.ContentType = ContentType.MTextContent;
                    MText annomtx = new MText();
                    if (mtxtobj != null)
                    {
                        leader.MText = mtxtobj;
                        leader.TextHeight = mtxtobj.TextHeight;
                    }
                    if (txtobj != null)
                    {
                        annomtx = new MText();
                        annomtx.Location = txtobj.Position;
                        annomtx.Contents = txtobj.TextString;
                        leader.MText = annomtx;
                        leader.TextHeight = txtobj.Height;
                    }

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

                    }
                    leader.ArrowSymbolId = bt["_DOT"];
                    leader.ArrowSize = leader.TextHeight * 0.2;
                    leader.DoglegLength = leader.TextHeight * 0.25;
                    leader.LeaderLineType = LeaderType.StraightLeader;
                    int ld = leader.AddLeader();
                    int ln = leader.AddLeaderLine(ld);
                    leader.AddFirstVertex(ln, pt);
                    leader.AddLastVertex(ln, tp);
                   
                    btr.AppendEntity(leader);
                    tr.AddNewlyCreatedDBObject(leader, true);
                    // 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", ".");
                }
            }
        }

~'J'~

71
Text / Create field by picked point coordinate
« on: July 21, 2012, 09:11:34 AM »
 
Code: [Select]
       [CommandMethod("FieldPointLocation", "fpl", CommandFlags.Redraw | CommandFlags.Modal)]
        public static void SetField()
        {

            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            // Set snap to whatever you need:
            //  Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("osmode", 1);
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                Point3d pt = ed.GetPoint("\nPick field location: ").Value;
                Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("lastpoint", pt);
                Field fieldobj = new Field();
                fieldobj.EvaluationOption = FieldEvaluationOptions.Automatic;
                fieldobj.SetFieldCode("%<\\AcVar lastpoint \\f \"%lu2%pt3%ls59%pr3\">%");// decimal, separator semicolon,presicion 3
                //fieldobj.SetFieldCode("%<\\AcVar lastpoint \\f \"%lu4%pt3\">%");// architectural, separator comma, precision 1/8"
                MText mtextobj = new MText();
                mtextobj.SetDatabaseDefaults();
                mtextobj.SetField("Text", fieldobj);
                fieldobj.Evaluate(0, db);
                mtextobj.Location = pt;
                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                btr.AppendEntity(mtextobj);
                tr.AddNewlyCreatedDBObject(mtextobj, true);
                tr.Commit();
            }
        }

72
Polylines / Pline / pline intersections
« on: July 19, 2012, 04:01:19 PM »
 
Code: [Select]
       [CommandMethod("gi")]
        public void GetIntersections()
        {
            Database db = HostApplicationServices.WorkingDatabase;

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

            Editor ed = doc.Editor;

            Transaction tr = db.TransactionManager.StartTransaction();

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

                    PromptEntityOptions peo = new PromptEntityOptions("\nSelect a single polyline  >>");

                    peo.SetRejectMessage("\nSelected object might be of type polyline only >>");

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

                    PromptEntityResult res;

                    res = ed.GetEntity(peo);

                    if (res.Status != PromptStatus.OK)

                        return;

                    DBObject ent = (DBObject)tr.GetObject(res.ObjectId, OpenMode.ForRead);

                    if (ent == null) return;

                    //Polyline poly = (Polyline)ent as Polyline;
                    Curve curv = ent as Curve;

                    DBObjectCollection pcurves = new DBObjectCollection();

                    curv.Explode(pcurves);
                    TypedValue[] values = new TypedValue[]
                     {
                        new TypedValue(0, "lwpolyline")
                        //might be added layer name to select curve:
                        //, new TypedValue(8, "mylayer")
                     };
                    SelectionFilter filter = new SelectionFilter(values);

                    Point3dCollection fence = new Point3dCollection();

                    double leng = curv.GetDistanceAtParameter(curv.EndParam) - curv.GetDistanceAtParameter(curv.StartParam);
                    // number of divisions along polyline to create fence selection
                    double step = leng / 256;// set number of steps to your suit

                    int num = Convert.ToInt32(leng / step);

                    int i = 0;

                    for (i = 0; i < num; i++)
                    {
                        Point3d pp = curv.GetPointAtDist(step * i);

                        fence.Add(curv.GetClosestPointTo(pp, false));
                    }

                    PromptSelectionResult selres = ed.SelectFence(fence, filter);

                    if (selres.Status != PromptStatus.OK) return;
                    Point3dCollection intpts = new Point3dCollection();
                   
                    DBObjectCollection qcurves = new DBObjectCollection();

                    foreach (SelectedObject selobj in selres.Value)
                    {
                        DBObject obj = tr.GetObject(selobj.ObjectId, OpenMode.ForRead, false) as DBObject;
                        if (selobj.ObjectId != curv.ObjectId)
                        {
                            DBObjectCollection icurves = new DBObjectCollection();
                            Curve icurv = obj as Curve;
                            icurv.Explode(icurves);
                            foreach (DBObject dbo in icurves)
                            {
                                if (!qcurves.Contains(dbo))
                                    qcurves.Add(dbo);
                            }
                        }

                    }
                    ed.WriteMessage("\n{0}", qcurves.Count);



                    int j = 0;
                    Point3dCollection polypts = new Point3dCollection();

                    for (i = 0; i < pcurves.Count; ++i)
                    {
                        for (j = 0; j < qcurves.Count; ++j)
                        {
                            Curve curve1 = pcurves[i] as Curve;

                            Curve curve2 = qcurves[j] as Curve;

                            Point3dCollection pts = new Point3dCollection();

                            curve1.IntersectWith(curve2, Intersect.OnBothOperands, pts, (int)IntPtr.Zero, (int)IntPtr.Zero);

                            foreach (Point3d pt in pts)
                            {
                                if (!polypts.Contains(pt))
                                    polypts.Add(pt);
                            }
                        }
                    }

                    Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("osmode", 0);// optional
                    // for debug only
                    Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(string.Format("\nNumber of Intersections: {0}", polypts.Count));
                    // test for visulization only
                    foreach (Point3d inspt in polypts)
                    {
                        Circle circ = new Circle(inspt, Vector3d.ZAxis, 10 * db.Dimtxt);
                        circ.ColorIndex = 1;
                        btr.AppendEntity(circ);
                        tr.AddNewlyCreatedDBObject(circ, true);

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

        }

~'J'~

73
Blocks / Get the real block name
« on: July 12, 2012, 07:55:14 AM »
    Assume to use transaction in this function as an argument

Code: [Select]
       //      get the real block name.        //
        static public 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;
        }

~'J'~

74
Dimensions / Creating and using Multileader with attributed block
« on: July 08, 2012, 04:34:37 PM »
Code: [Select]
        [CommandMethod("testMleaderAttribute", "tma", CommandFlags.Modal)]
        public void MleaderAttribute()
        {

            object clay = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("clayer");

            object ccolor = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("cecolor");

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

            Editor ed = doc.Editor;

            Database db = doc.Database;
            try
            {
                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;

                    if (!bt.Has("MleaderBlock"))// may have any name
                    {

                        Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("clayer", "0");

                        Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("cecolor", "bylayer");
                        BlockTableRecord lbtr = new BlockTableRecord();
                        lbtr.Name = "MleaderBlock";
                        lbtr.Origin = new Point3d(0, 0, 0);
                        lbtr.BlockScaling = BlockScaling.Uniform;
                        lbtr.Explodable = true;
                        lbtr.Units = UnitsValue.Inches;
                        // add BlockTableRecord to BlocTable
                        bt.UpgradeOpen();
                        blkid = bt.Add(lbtr);
                        tr.AddNewlyCreatedDBObject(lbtr, true);
                        // add objects to block
                        // add circle
                        Circle circle = new Circle(new Point3d(0, 0, 0), Vector3d.ZAxis, 3);
                        lbtr.AppendEntity(circle);
                        tr.AddNewlyCreatedDBObject(circle, true);
                        // add attribute
                        AttributeDefinition attr = new AttributeDefinition();
                        attr.Tag = "NUMBER";// may have any name
                        attr.Prompt = "Axis number:";
                        attr.TextString = "1";

                        //attr.TextStyle = db.Textstyle;//<--   A2009
                        attr.TextStyleId = db.Textstyle;//<--   A2010
                        attr.Height = 1.0;
                        attr.Position = new Point3d(0, 0, 0);
                        attr.HorizontalMode = TextHorizontalMode.TextCenter;
                        attr.VerticalMode = TextVerticalMode.TextVerticalMid;
                        attr.LockPositionInBlock = true;
                        attr.AdjustAlignment(db);
                        lbtr.AppendEntity(attr);
                        tr.AddNewlyCreatedDBObject(attr, true);
                        // commented adding the mtext
                        //MText mText = new MText();
                        //mText.Contents = "test";
                        //Point3d mpt = new Point3d(0, 0, 0);
                        //mText.Location = mpt;
                        //mText.Attachment = AttachmentPoint.MiddleCenter;
                        //lbtr.AppendEntity(mText);
                        //tr.AddNewlyCreatedDBObject(mText, true);
                    }

                    blkid = bt["MleaderBlock"];
                    MLeader leader = new MLeader();
                    // set content type to Block
                    leader.ContentType = ContentType.BlockContent;
                    leader.BlockContentId = blkid;
                    // check if desired arrowblock exist
                    if (!bt.Has("_NONE"))
                    {
                        Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("DIMBLK", "_NONE");

                    }
                    leader.ArrowSymbolId = bt["_NONE"];
                    leader.ArrowSize = 0;
                    leader.DoglegLength = 0;
                    leader.LeaderLineType = LeaderType.StraightLeader;
                    // you can set coordinates using Getpoint instead
                    Point3d lpt = new Point3d(0, 0, 0);
                    Point3d npt = new Point3d(5, 5, 0);

                    leader.AddLeaderLine(lpt);
                    leader.SetVertex(0, 1, npt);

                    btr.AppendEntity(leader);
                    tr.AddNewlyCreatedDBObject(leader, true);
                    // leader insereted, go to attribute updating
                    if (!leader.IsWriteEnabled) leader.UpgradeOpen();
                    blkid = leader.BlockContentId;
                    BlockTableRecord mbtr = (BlockTableRecord)tr.GetObject(blkid, OpenMode.ForRead);

                    foreach (ObjectId atid in mbtr)
                    {
                        DBObject obj = tr.GetObject(atid, OpenMode.ForRead, false) as DBObject;

                        if (atid.ObjectClass.IsDerivedFrom(RXClass.GetClass(typeof(AttributeDefinition))))
                        {
                            AttributeDefinition attdef = (AttributeDefinition)obj as AttributeDefinition;

                            if (attdef.Tag == "NUMBER") // check your existing tag
                            {
                                AttributeReference attref = leader.GetBlockAttribute(attdef.ObjectId);

                                if (!attref.IsWriteEnabled) attref.UpgradeOpen();
                                // add new attribute value
                                attref.TextString = ed.GetString("\nEnter the number: ").StringResult;

                                leader.SetBlockAttribute(attdef.ObjectId, attref);

                            }
                        }
                    }

                    leader.RecordGraphicsModified(true);

                    tr.Commit();
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("clayer", clay);

                Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("cecolor", ccolor);
            }
        }

~'J'~

75
Tables / Change cell text width
« on: July 04, 2012, 03:31:21 PM »
Code: [Select]
        [CommandMethod("CellTextWidth","ctw", CommandFlags.Modal)]
        public static void setCellTextWidth()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;
            PromptEntityOptions opts = new PromptEntityOptions("\nSelect the table:");
            opts.SetRejectMessage("\nMust be the table only...");
            opts.AddAllowedClass(typeof(Table), true);
            PromptEntityResult res = ed.GetEntity(opts);
            if (res.Status != PromptStatus.OK) return;
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                DBObject obj = tr.GetObject(res.ObjectId, OpenMode.ForRead, false) as DBObject;
                Table tbl = obj as Table;
                if (tbl == null) return;
                int row = 2;
                int colm =1;
                tbl.UpgradeOpen();
                AcadTable actbl = tbl.AcadObject as AcadTable;
                actbl.SetCellValueFromText(row, colm, "{\\W0.5;Text Width = 0.5}", AcParseOption.acPreserveMtextFormat);
                actbl.SetText(row + 1, colm + 1, "Text Width = 0.5");
                tr.Commit();
            }
        }

~'J'~

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