Статьи > Тестирование статей

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 и опубликовал статью на нашем сайте: Получение данных о семействе и типоразмере элемента трубопроводной сети

Навигация

[0] Главная страница сообщений

Перейти к полной версии