Здравствуйте, уважаемые форумчане! Подскажите, как можно сопоставить динамический блок. который вставлен на различных листах? необходимо корректировать информацию у динамического блока "Осн. надпись". который вставлен на различных листах
ищем вставки блоков в чертеже
using (DocumentLock docLock = doc.LockDocument())
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
//Алгоритм для отбора динамических вставок блока в т.ч. и их аннонимных копий
//Алгоритм для определения координат атрибутов определения блока
ObjectIdCollection dynBlockRefsFull = new ObjectIdCollection();
// получаем таблицу блоков и проходим по всем записям таблицы блоков
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
foreach (ObjectId btrId in bt)
{
// получаем запись таблицы блоков и смотри анонимная ли она
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead);
if ((btr.IsDynamicBlock) && (btr.Name.Contains("Осн. надпись") == true))
{
// получаем все анонимные блоки динамического блока
ObjectIdCollection anonymousIds = btr.GetAnonymousBlockIds();
// получаем все прямые вставки динамического блока
//foreach (ObjectId id in btr.GetBlockReferenceIds(true, true))
// {
// dynBlockRefsFull.Add(id);
// }
foreach (ObjectId anonymousBtrId in anonymousIds)
{
// получаем анонимный блок
BlockTableRecord anonymousBtr = (BlockTableRecord)tr.GetObject(anonymousBtrId, OpenMode.ForRead);
// получаем все вставки этого блока
ObjectIdCollection blockRefIds = anonymousBtr.GetBlockReferenceIds(true, true);
foreach (ObjectId id in blockRefIds)
{
dynBlockRefsFull.Add(id);
}
}
}
}
далее есть кусок кода, который корректирует информацию в атрибутах блока
foreach (ObjectId id in dynBlockRefsFull)
{
BlockReference br = (BlockReference)tr.GetObject(id, OpenMode.ForWrite);
BlockTableRecord btr = tr.GetObject(br.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
AttributeDefinition[] atr_def = new AttributeDefinition[100];
int i = 0;
foreach (var idEnt in btr)
{
Entity en = tr.GetObject(idEnt, OpenMode.ForRead) as Entity;
if (en.GetType() == typeof(AttributeDefinition))
{
AttributeDefinition atr = tr.GetObject(idEnt, OpenMode.ForRead) as AttributeDefinition;
atr_def[i] = atr;
i++;
}
}
bool shet_na_polnotu = false;
//проверяю что в выбранной основной надписи тег "номер проекта" - не пустой
foreach (ObjectId idAtrRef in br.AttributeCollection)
{
AttributeReference atr_ref = tr.GetObject(idAtrRef, OpenMode.ForWrite, false, true) as AttributeReference;
if ((atr_ref.TextString != "####") && (atr_ref.Tag == "НОМЕР-ПРОЕКТА"))
shet_na_polnotu = true;
}
if (shet_na_polnotu == true)
{
int i_atr = 0;
foreach (ObjectId idAtrRef in br.AttributeCollection)
{
AttributeReference atr_ref = tr.GetObject(idAtrRef, OpenMode.ForWrite, false, true) as AttributeReference;
//
//
//!! Вносим по необходимости в нужный атрибут нужную инфу
//
//
i_atr++;
}
}
}
tr.Commit();
}
}
как рассматривать отдельные основные надписи расположенные на конкретных листах?
например в чертеже листы "1", "2", "3"
нужно получить наименования этих листов, и при выборе в форме к примеру листа "2" написать условие что-то вроде
if блок который мы рассматриваем находится на листе с наименованием "2", то правим атрибуты