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

09/08/2014

Фильтрация системных семейств

Вопрос: Возможно ли создать такой фильтр, чтобы получить только системные семейства, игнорируя пользовательские? Я пробовал использовать пример, описанный в статье http://adndevblog.typepad.com/aec/2012/05/accessing-system-families-in-a-revit-template.html, однако, этот фильтр возвратил все семейства.

Я знаю, что можно отфильтровать элементы по какому-то конкретному типу, например:

Код: [Выделить]
  1. FilteredElementCollector coll = new FilteredElementCollector(pDoc);
  2.     // Получить все типоразмеры стен
  3.     coll.OfClass(typeof(WallType));
  4.     IEnumerable<WallType> types = coll.Cast<WallType>();
  5. Но мне нужно получить вообще все типоразмеры, являющиеся системными. Найти какую-либо информацию по этому поводу у меня не получилось.
  6. Ответ от команды разработчиков Revit API: Конечно это возможно.
  7. Попробуйте применить фильтр .WhereElementIsElementType() плюс к этому добавьте условие ElementClassFilter(typeof(FamilySymbol), true /* инвертированное значение */).
  8. Нужно применить эти два фильтра последовательно, для того чтобы получить требуемый вами результат. Первым фильтром мы выбираем все объекты класса ElementType, а вторым – исключаем из этой выборки объекты класса FamilySymbol. Таким образом, останутся только типоразмеры системных семейств.
  9. Ну и напоследок пример кода:
  10.  
  11. Код - C#: [Выделить]
  12.  [Transaction(TransactionMode.Manual)]
  13. public class Command : IExternalCommand
  14. {
  15. public Result Execute(
  16.   ExternalCommandData commandData,
  17.   ref string message,
  18.   ElementSet elements)
  19.   {
  20.     UIApplication uiapp = commandData.Application;
  21.     UIDocument uidoc = uiapp.ActiveUIDocument;
  22.     Application app = uiapp.Application;
  23.     Document doc = uidoc.Document;
  24.  
  25.     // WhereElementIsElementType вернет все объекты класса ElementType
  26.     FilteredElementCollector coll = new FilteredElementCollector(doc)
  27.                                         .WhereElementIsElementType();
  28.     // значение параметра true означает, что нужно выбрать все элементы ,
  29.     // за исключением типа, указанного в первом параметре.
  30.     ElementClassFilter filterInv =
  31.                    new ElementClassFilter(typeof(FamilySymbol), true);
  32.     // Чтобы увидеть результат, добавьте в Watch      coll.WherePasses(filterInv);
  33.     // в режиме отладки
  34.     coll.WherePasses(filterInv);
  35.     return Result.Succeeded;
  36.   }
  37. }

Метод 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