ADN Open CIS
Сообщество программистов Autodesk в СНГ

10/03/2014

Наименование системных семейств

В Revit существует 2 типа семейств: пользовательские семейства и системные семейства. Пользовательские семейства в большинстве случаев являются редактируемыми и их можно сохранить в отдельный файл семейства (.rfa). С системными же семействами такое проделать не получится. Можно лишь создавать новые типоразмеры системных семейств.

Примерами системных семейств являются стены, трубы, потолки, кабельные лотки и т.п.

С точки зрения Revit API, между этими семействами также есть существенное различие.

Все пользовательские семейства в API представлены в виде класса Family. Типоразмеры – классом FamilySymbol, а экземпляры семейства – классом FamilyInstance.

С системными же семействами ситуация обстоит иначе. Системное семейство не сопоставлено какому-либо классу в Revit API. Типоразмеры и экземпляры каждого системного семейства представлены отдельным классом в Revit API.

Например, типоразмер стены – класс WallType, экземпляр стены – класс Wall. PipeType и Pipe для типоразмера трубы и экземпляра трубы соответственно и т.д.

Получить наименование пользовательского семейства довольно легко. Класс Family имеет свойство Name.

С системными семействами такой фокус не пройдет, хотя бы потому, что нет класса, описывающего системное семейство.

Тем не менее, логично передоложить что получить его все же каким-то образом можно. В диспетчере проектов семейства сгруппированы в виде Категория – Семейство – Типоразмер. И как можно заметить, для системных семейств иерархия точно такая же:

 

Также, зайдя в свойства типа мы также видим свойство Семейство.

 

Чтобы понять, как же получить наименование системного семейства, воспользуемся утилитой RevitLookup.

Откроем RevitLookup, найдем типоразмер базового семейства и выделим один из типоразмеров:

 

Попробуем поискать наименование семейства в параметрах. Для этого выделим свойство Parameters:

 

Среди параметров нет наименования семейства. Однако этот список параметров, которые видит пользователь, т.е. список, который возвращает свойство Element.Parameters.

Однако, как мы уже знаем в этот список включаются не все параметры, которые есть у элемента. Для просмотра дополнительных параметров, воспользуемся командой Built-in Enums Snoop…

Просмотрев все параметры их значения, можно заметить, что значение встроенного параметра ALL_MODEL_FAMILY_NAME и равно наименованию семейства.

 

Таким образом, чтобы получить наименование базового семейства, достаточно получить значение встроенного параметра ALL_MODEL_FAMILY_NAME для типоразмера системного семейства.

Кстати, для пользовательских семейств можно воспользоваться этим же методом, вместо значения свойства Family.Name.

В заключении небольшой пример кода, с помощью которого можно получить список всех системных семейств стен с их типоразмерами.

Код - C#: [Выделить]
  1.             // Выберем сначала все типоразмеры стен,
  2.             // так как напрямую поулучить список семейств мы не можем
  3.  
  4.             var wallTypes
  5.               = new FilteredElementCollector(doc)
  6.                 .WhereElementIsElementType()               
  7.                 .OfClass(typeof(WallType))
  8.                 .OfType<WallType>()
  9.                 .ToList();
  10.  
  11.           
  12.             // сгруппируем типорамзеры по наименованию семейства
  13.  
  14.             var wallFamiliesWithType =
  15.                 // выбираем из всех типоразмеров
  16.                 from wt in wallTypes
  17.  
  18.                 // найдем встроенный параметр с наименованием семейства
  19.                 let familyParam = wt.get_Parameter(BuiltInParameter.ALL_MODEL_FAMILY_NAME)
  20.  
  21.                 // получим значение параметра. Предварительно проверим что параметр существует
  22.                 let familyName = familyParam != null ? familyParam.AsString() : string.Empty
  23.  
  24.                 // сгруппируем типоразмеры по наименованию семейства
  25.                 group wt by familyName
  26.                 into g
  27.  
  28.                 // выберем семейство с типами
  29.                 select new {FamilyName = g.Key, WallTypes = g.ToList()};
  30.  
  31.             Debug.Print("Всего семейств стен: {0}", wallFamiliesWithType.Count());
  32.  
  33.             foreach (var wallFamilyWithTypes in wallFamiliesWithType)
  34.             {
  35.                 Debug.Print("Семейство: {0}; Кол-во типоразмеров: {1}",
  36.                     wallFamilyWithTypes.FamilyName,
  37.                     wallFamilyWithTypes.WallTypes.Count);
  38.  
  39.                 foreach (WallType wallType in wallFamilyWithTypes.WallTypes)
  40.                 {
  41.                     Debug.Print("\t{0} [{1}]", wallType.Name, wallType.Id);
  42.                 }
  43.  
  44.             }

Результат:

Код - XML: [Выделить]
  1. Всего семейств стен: 3
  2. Семейство: Базовая стена; Кол-во типоразмеров: 5
  3.                 Наружный - Кирпич на металлической обрешетке [397]
  4.                 Типовой - 200мм [398]
  5.                 Типовой - Кирпич 90мм [401]
  6.                 Типовой - 300мм [6291]
  7.                 Наружный - Блок на металлической обрешетке [54538]
  8. Семейство: Витраж; Кол-во типоразмеров: 1
  9.                 Наружное остекление [29096]
  10. Семейство: Составная стена; Кол-во типоразмеров: 1
  11.                 Наружный - Кирпич по блоку с металлической обрешеткой [54537]

 

Автор: Виктор Чекалин
Автор перевода: Виктор Чекалин

Обсуждение: http://adn-cis.org/forum/index.php?topic=601

Опубликовано 10.03.2014