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