/// <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();
}
}