Наименование системных семейств
В 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.
В заключении небольшой пример кода, с помощью которого можно получить список всех системных семейств стен с их типоразмерами.
- // Выберем сначала все типоразмеры стен,
- // так как напрямую поулучить список семейств мы не можем
- var wallTypes
- = new FilteredElementCollector(doc)
- .WhereElementIsElementType()
- .OfClass(typeof(WallType))
- .OfType<WallType>()
- .ToList();
- // сгруппируем типорамзеры по наименованию семейства
- var wallFamiliesWithType =
- // выбираем из всех типоразмеров
- from wt in wallTypes
- // найдем встроенный параметр с наименованием семейства
- let familyParam = wt.get_Parameter(BuiltInParameter.ALL_MODEL_FAMILY_NAME)
- // получим значение параметра. Предварительно проверим что параметр существует
- let familyName = familyParam != null ? familyParam.AsString() : string.Empty
- // сгруппируем типоразмеры по наименованию семейства
- group wt by familyName
- into g
- // выберем семейство с типами
- select new {FamilyName = g.Key, WallTypes = g.ToList()};
- Debug.Print("Всего семейств стен: {0}", wallFamiliesWithType.Count());
- foreach (var wallFamilyWithTypes in wallFamiliesWithType)
- {
- Debug.Print("Семейство: {0}; Кол-во типоразмеров: {1}",
- wallFamilyWithTypes.FamilyName,
- wallFamilyWithTypes.WallTypes.Count);
- foreach (WallType wallType in wallFamilyWithTypes.WallTypes)
- {
- Debug.Print("\t{0} [{1}]", wallType.Name, wallType.Id);
- }
- }
Результат:
- Всего семейств стен: 3
- Семейство: Базовая стена; Кол-во типоразмеров: 5
- Наружный - Кирпич на металлической обрешетке [397]
- Типовой - 200мм [398]
- Типовой - Кирпич 90мм [401]
- Типовой - 300мм [6291]
- Наружный - Блок на металлической обрешетке [54538]
- Семейство: Витраж; Кол-во типоразмеров: 1
- Наружное остекление [29096]
- Семейство: Составная стена; Кол-во типоразмеров: 1
- Наружный - Кирпич по блоку с металлической обрешеткой [54537]
Автор перевода: Виктор Чекалин
Обсуждение: http://adn-cis.org/forum/index.php?topic=601
Опубликовано 10.03.2014