Search code examples
c#autocadcadautocad-pluginobjectarx

Working with dynamic blocks in C # (for AutoCad)


I have created a dynamic block with two parameters (par_l and par_h) for the rectangle. Why not in this case nothing happens? I assume that par_l should extend the item to 500. As default I have 100 and 100. The block I have created in the program. By code in c # I want to manipulate it

[CommandMethod("Elem")]
        public void TestCommand()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            Transaction tr = db.TransactionManager.StartTransaction();

                    BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite);
                    ed.WriteMessage(bt["prz_podl"]+"");

                    BlockTableRecord btr = tr.GetObject(bt["prz_podl"], OpenMode.ForWrite) as BlockTableRecord;

                    Point3d point = new Point3d(0, 0, 0);
                    BlockReference br = new BlockReference(point, btr.Id);
                    br.BlockTableRecord = btr.Id;

                    DynamicBlockReferencePropertyCollection properties = br.DynamicBlockReferencePropertyCollection;
                    for (int i = 0; i < properties.Count; i++)
                    {
                        DynamicBlockReferenceProperty property = properties[i];
                        if (property.PropertyName == "par_l")
                        {
                            ed.WriteMessage(property.Value+"");
                            property.Value = 500.0;
                        }
                    }
                   tr.Commit();  
        }

Solution

  • You have to append the newly created block reference to some BlockTableRecord and add it to the active transaction. You also have to dispose the transaction. Disposing it will take care of diposing all the objects opened with it or added to it.

    [CommandMethod("TEST")]
    public void Test()
    {
        var doc = AcAp.DocumentManager.MdiActiveDocument;
        var db = doc.Database;
        var ed = doc.Editor;
    
        using (var tr = db.TransactionManager.StartTransaction())
        {
            var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
            // if the bloc table has the block definition
            if (bt.Has("prz_podl"))
            {
                // create a new block reference
                var br = new BlockReference(Point3d.Origin, bt["prz_podl"]);
    
                // add the block reference to the curentSpace and the transaction
                var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                curSpace.AppendEntity(br);
                tr.AddNewlyCreatedDBObject(br, true);
    
                // set the dynamic property value
                foreach (DynamicBlockReferenceProperty prop in br.DynamicBlockReferencePropertyCollection)
                {
                    if (prop.PropertyName == "par_l")
                    {
                        prop.Value = 500.0;
                    }
                }
            } 
            // save changes
            tr.Commit();
        } // <- end using: disposing the transaction and all objects opened with it (block table) or added to it (block reference)
    }