Работа с динамическими блоками в 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)
}