Работа с динамическими блоками в C # (для AutoCad)

Я создал динамический блок с двумя параметрами (par_l и par_h) для прямоугольника. Почему не в этом случае ничего не происходит? Я предполагаю, что par_l должен расширить элемент до 500. По умолчанию у меня есть 100 и 100. Блок, который я создал в программе. По коду в C# я хочу манипулировать им

[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 ответ

Решение

Вы должны добавить вновь созданную ссылку на блок в некоторый BlockTableRecord и добавить его в активную транзакцию. Вы также должны распорядиться транзакцией. Уничтожение этого будет заботиться о погружении всех объектов, открытых с ним или добавленных к нему.

[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)
}
Другие вопросы по тегам