09/08/2014
Фильтрация системных семейств
Вопрос: Возможно ли создать такой фильтр, чтобы получить только системные семейства, игнорируя пользовательские? Я пробовал использовать пример, описанный в статье http://adndevblog.typepad.com/aec/2012/05/accessing-system-families-in-a-revit-template.html, однако, этот фильтр возвратил все семейства.
Я знаю, что можно отфильтровать элементы по какому-то конкретному типу, например:
Код: [Выделить]
- FilteredElementCollector coll = new FilteredElementCollector(pDoc);
- // Получить все типоразмеры стен
- coll.OfClass(typeof(WallType));
- IEnumerable<WallType> types = coll.Cast<WallType>();
- Но мне нужно получить вообще все типоразмеры, являющиеся системными. Найти какую-либо информацию по этому поводу у меня не получилось.
- Ответ от команды разработчиков Revit API: Конечно это возможно.
- Попробуйте применить фильтр .WhereElementIsElementType() плюс к этому добавьте условие ElementClassFilter(typeof(FamilySymbol), true /* инвертированное значение */).
- Нужно применить эти два фильтра последовательно, для того чтобы получить требуемый вами результат. Первым фильтром мы выбираем все объекты класса ElementType, а вторым – исключаем из этой выборки объекты класса FamilySymbol. Таким образом, останутся только типоразмеры системных семейств.
- Ну и напоследок пример кода:
- Код - C#: [Выделить]
- [Transaction(TransactionMode.Manual)]
- public class Command : IExternalCommand
- {
- public Result Execute(
- ExternalCommandData commandData,
- ref string message,
- ElementSet elements)
- {
- UIApplication uiapp = commandData.Application;
- UIDocument uidoc = uiapp.ActiveUIDocument;
- Application app = uiapp.Application;
- Document doc = uidoc.Document;
- // WhereElementIsElementType вернет все объекты класса ElementType
- FilteredElementCollector coll = new FilteredElementCollector(doc)
- .WhereElementIsElementType();
- // значение параметра true означает, что нужно выбрать все элементы ,
- // за исключением типа, указанного в первом параметре.
- ElementClassFilter filterInv =
- new ElementClassFilter(typeof(FamilySymbol), true);
- // Чтобы увидеть результат, добавьте в Watch coll.WherePasses(filterInv);
- // в режиме отладки
- coll.WherePasses(filterInv);
- return Result.Succeeded;
- }
- }
Метод coll.WherePasses(filterInv) возвратит все типоразмеры системных семейств.
Источник: http://adndevblog.typepad.com/aec/2014/08/system-families-filter-and-beach-aerial-picture.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=901
Опубликовано 09.08.2014Отредактировано 11.08.2014 в 08:43:26