Получение данных о семействе и типоразмере элемента трубопроводной сети
Иногда нужно получить данные о семействе и типоразмере трубы или колодца, которые уже присутствуют на чертеже. Например - чтобы создать такой же элемент в другом месте сети. Метод создания трубы или колодца в сети требует указания ObjectId для семейства и типоразмера (из справки):
Network.AddStructure Method (ObjectId, ObjectId, Point3d, Double, ObjectId, Boolean):
- public void AddStructure(
- ObjectId structureFamilyId,
- ObjectId structureSizeId,
- Point3d location,
- double rotation,
- ref ObjectId newStructureId,
- bool applyRules
- )
Network.AddLinePipe Method:
- public void AddLinePipe(
- ObjectId pipeFamilyId,
- ObjectId pipeSizeId,
- LineSegment3d line,
- ref ObjectId newPipeId,
- bool applyRules
- )
Однако в Civil 3D .NET API 2013 - 2016 нет у элемента таких свойств, как FamilyId и PartSizeId. Более того, если название типоразмера мы еще можем получить из свойства PartSizeName, то о семействе элементов в .NET API вообще нет никаких данных! Поэтому, это один из тех нередких случаев, когда мы вынуждены использовать COM API. Решение этой задачи в виде кода представлено ниже:
- /// <summary>
- /// Получение данных о семействе и типоразмере элемента сети
- /// </summary>
- /// <param name="part">Элемент сети - труба или колодец</param>
- /// <param name="familyId">Выходной параметр - Id семейства элемента</param>
- /// <param name="familyName">Выходной параметр - название семейства элемента</param>
- /// <param name="sizeId">Выходной параметр - Id типоразмера элемента</param>
- /// <param name="sizeName">Выходной параметр - название типоразмера элемента</param>
- public static void GetPartFamilyAndSize
- (this Part part,
- out ObjectId familyId,
- out string familyName,
- out ObjectId sizeId,
- out string sizeName)
- {
- familyId = ObjectId.Null;
- sizeId = ObjectId.Null;
- // Получаем COM-объект для элемента
- dynamic partCOM = part.AcadObject;
- // Получаем из свойств COM-объекта названия семейства
- familyName = partCOM.PartFamily.Name;
- // Получаем название типоразмера из свойства COM-объекта
- sizeName = partCOM.PartSizeName;
- // Можно получить название типоразмера из свойства NET-объекта
- // sizeName = part.PartSizeName;
- // Запускаем эмуляцию транзакции
- using (OpenCloseTransaction ocTr = part.Database.TransactionManager.StartOpenCloseTransaction())
- {
- // Получаем сеть элемента
- Network net = ocTr.GetObject(part.NetworkId, OpenMode.ForRead) as Network;
- // ... и ее список элементов
- PartsList partsList = ocTr.GetObject(net.PartsListId, OpenMode.ForRead) as PartsList;
- // Проходим по коллекции семейств домена элемента в списке элементов
- foreach (ObjectId curFamilyId in partsList.GetPartFamilyIdsByDomain(part.Domain))
- {
- // Получаем семейство элементов
- PartFamily partFam = ocTr.GetObject(curFamilyId, OpenMode.ForRead) as PartFamily;
- // Если название семейства совпадает с названием семейства элементов
- if (partFam.Name.Equals(familyName))
- {
- // Сохраняем его идентификатор в переменной
- familyId = curFamilyId;
- // Проходим по типоразмерам элементов в семействе
- for (int i = 0; i < partFam.PartSizeCount; i++)
- {
- ObjectId famSizeId = partFam[i];
- // Получаем объект описания типоразмера
- PartSize partSize = ocTr.GetObject(famSizeId, OpenMode.ForRead) as PartSize;
- // Если его название совпадает с названием типоразмера элемента
- if (partSize.Name.Equals(sizeName))
- {
- // Сохраняем его идентификатор в переменной
- sizeId = famSizeId;
- // Мы нашли нужный типоразмер - прерываем
- // цикл прохода по типоразмерам семейства
- break;
- }
- }
- // Мы нашли нужное семейство - перываем
- // цикл прохода по семействам в списке
- break;
- }
- }
- ocTr.Commit();
- }
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=3032
Опубликовано 20.09.2015