[Rtm.CommandMethod("FieldDynProp", "fdp", Rtm.CommandFlags.Redraw | Rtm.CommandFlags.Modal)]
public static void SetFieldByDynProp()
{
App.Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
Db.Database db = doc.Database;
Ed.Editor ed = doc.Editor;
Ed.PromptEntityOptions peo = new Ed.PromptEntityOptions("\nУкажите экземпляр блока:");
peo.AllowNone = false;
peo.AllowObjectOnLockedLayer = true;
peo.SetRejectMessage("\nВыбран неправильный объект!");
peo.AddAllowedClass(typeof(Db.BlockReference), true);
Ed.PromptEntityResult per = ed.GetEntity(peo);
if (per.Status != Ed.PromptStatus.OK)
return;
using (Db.Transaction tr = db.TransactionManager.StartTransaction())
{
Db.BlockReference acBlock = (Db.BlockReference)tr.GetObject(per.ObjectId, Db.OpenMode.ForRead);
if (acBlock.IsDynamicBlock)
{
// Получаем запись таблицы блоков для динамического блока
Db.BlockTableRecord blockDef = tr.GetObject(
acBlock.DynamicBlockTableRecord,
Db.OpenMode.ForRead) as Db.BlockTableRecord;
String NameTab = "ACAD_ENHANCEDBLOCK";
using (Db.DBDictionary dict = (Db.DBDictionary)blockDef.ExtensionDictionary.GetObject(Db.OpenMode.ForRead))
{
if (dict.Contains(NameTab))
{
Db.ObjectId NameTabId = dict.GetAt(NameTab);
Autodesk.AutoCAD.Internal.DatabaseServices.EvalGraph graph =
tr.GetObject(NameTabId,
Db.OpenMode.ForRead) as Autodesk.AutoCAD.Internal.DatabaseServices.EvalGraph;
int[] nodeIds = graph.GetAllNodes();
foreach (uint nodeId in nodeIds)
{
// Открываем узел по его ID
Db.DBObject node = graph.GetNode(nodeId,
Db.OpenMode.ForRead, tr);
if (node.ObjectId.ObjectClass.Name.Contains("Parameter"))
{
Autodesk.AutoCAD.Internal.DatabaseServices.BlockParameter variable =
tr.GetObject(node.ObjectId, Db.OpenMode.ForRead)
as Autodesk.AutoCAD.Internal.DatabaseServices.BlockParameter;
Autodesk.AutoCAD.Internal.DatabaseServices.BlockParameterPropertyDescriptorCollection nodeProp =
variable.PropertyDescription.SyncRoot as Autodesk.AutoCAD.Internal.DatabaseServices.BlockParameterPropertyDescriptorCollection;
if (variable != null)
{
////Получение дин св-в по имени
Db.DynamicBlockReferenceProperty blockReferenceProperty = (
(from Db.DynamicBlockReferenceProperty blockRefProperty in acBlock.DynamicBlockReferencePropertyCollection
where blockRefProperty.PropertyName.Equals(nodeProp[0].PropertyName, StringComparison.OrdinalIgnoreCase)
select blockRefProperty).FirstOrDefault()) as Db.DynamicBlockReferenceProperty;
ed.WriteMessage("\nПараметр {0} - Имя {1} - Номер {2} - Значение {3}",
variable.Name, nodeProp[0].PropertyName, nodeId.ToString(), blockReferenceProperty.Value.ToString());
}
}
}
}
}
tr.Commit();
}
}
}