Статьи > Тестирование статей
Civil 3D. Получение данных о семействе и типоразмере части трубопроводной сети.
(1/1)
Дмитрий Загорулькин:
Иногда нужно получить данные о семействе и типоразмере трубы или колодца, которые уже присутствуют на чертеже. Например - чтобы создать такую же часть в другом месте сети. Метод создания трубы или колодца в сети требует указания ObjectId для семейства и типоразмера (из справки):
Network.AddStructure Method (ObjectId, ObjectId, Point3d, Double, ObjectId, Boolean):
--- Код - C# [Выбрать] ---public void AddStructure( ObjectId structureFamilyId, ObjectId structureSizeId, Point3d location, double rotation, ref ObjectId newStructureId, bool applyRules)Network.AddLinePipe Method:
--- Код - C# [Выбрать] ---public void AddLinePipe( ObjectId pipeFamilyId, ObjectId pipeSizeId, LineSegment3d line, ref ObjectId newPipeId, bool applyRules)Однако в NET API Civil 3D 2013-2016 нет таких свойств у части, как FamilyId и PartSizeId. Более того, если название типоразмера мы еще можем получить из свойства PartSizeName, то о семействе части в NET API вообще нет никаких данных! Поэтому, это один из тех нередких случаев, когда мы вынуждены использовать COM API. Решение этой задачи в виде кода представлено ниже:
--- Код - C# [Выбрать] ---/// <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(); }}
Александр Ривилис:
Отлично! Я позволил себе немного подправить терминологию, чтобы она совпадала с официальной от Autodesk и опубликовал статью на нашем сайте: Получение данных о семействе и типоразмере элемента трубопроводной сети
Навигация
Перейти к полной версии