Working with dynamic blocks in C # (for AutoCad)

3.7k Views Asked by At

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

There are 1 best solutions below

0
On BEST ANSWER

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