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

23/05/2015

Изоляция экземпляров семейства для дальнейшего экспорта в DWG

Проблема следующая: нужно взять оборудование, представленное в виде семейств категории Типовые модели на 3D виде и для каждого оборудования создать отдельный вид для дальнейшего экспорта в DWG.

Один из способов представлен ниже. Мы берем все экземпляры семейств типовых моделей на текущем виде, затем, соответствующие семейства. Потом создаем вид для каждого семейства создаем новый вид с названием семейства.

Чтобы отображать на виде только определенные экземпляры семейств, нужно создать и установить новый фильтр на вид. На самом деле, Jeremy уже делал подобное (статью на блоге Jeremy писал на самом деле я и она также есть на нашем сайте – прим. переводчика) и мы немного его подправили для нашей задачи.

И в конце мы экспортировали созданные виды.

Код с комментариями представлен ниже:

Код - C#: [Выделить]
  1. // Получаем текущий документ
  2. Document doc = commandData.Application.ActiveUIDocument.Document;
  3.  
  4. // Берем все экземпляры семейств категории Типовые модели
  5. FilteredElementCollector collGenericModels =
  6.   new FilteredElementCollector(doc, doc.ActiveView.Id);
  7. collGenericModels.OfClass(typeof(FamilyInstance));
  8. collGenericModels.OfCategory(BuiltInCategory.OST_GenericModel);
  9.  
  10. // Но так как нам нужны семейства
  11. // создадим список идентификаторов семейств
  12. List<int> genericModelsFamiliesIds = new List<int>();
  13. foreach (FamilyInstance equip in collGenericModels)
  14. {
  15.   ElementId symbolId = equip.Symbol.Id;
  16.   if (!genericModelsFamiliesIds.Contains(symbolId.IntegerValue))
  17.     genericModelsFamiliesIds.Add(symbolId.IntegerValue);
  18. }
  19.  
  20. // получаем текущий вид
  21. View3D activeView = doc.ActiveView as View3D;
  22. if (activeView == null)
  23. {
  24.   // Должен быть активный 3D вид
  25.   message = "Запустите команду находясь на 3D виде" ;
  26.   return Result.Failed;
  27. }
  28.  
  29. // контролируем количество копий
  30. int copy = 1;
  31.  
  32. // список созданных видов
  33. List<ElementId> viewIds = new List<ElementId>();
  34.  
  35. foreach (int genericModelId in genericModelsFamiliesIds)
  36. {
  37.   // Берем семейство
  38.   FamilySymbol famSymbol = doc.GetElement(
  39.      new ElementId(genericModelId)) as FamilySymbol;
  40.  
  41.   // Создаем вид поутем создания копии текущего вида
  42.   ElementId genericModelViewId = activeView.Duplicate(
  43.      ViewDuplicateOption.Duplicate);
  44.   // добавляем этот вид в список
  45.   viewIds.Add(genericModelViewId);
  46.  
  47.   View3D genericModelView = doc.GetElement(
  48.      genericModelViewId) as View3D;
  49.  
  50.   // Здесь можно настроить имя вида
  51.   string viewName = string.Format("MM-{0}", famSymbol.Name);
  52.   try
  53.   {
  54.     // пытаемся задать новое имя
  55.     genericModelView.ViewName = viewName;
  56.   }
  57.   catch
  58.   {
  59.     // по идее не должно случиться.
  60.     // если только у вас регламент наименований слишком сложный
  61.     viewName = string.Format("{0} - Copy ({1})", viewName, copy);
  62.     genericModelView.ViewName = viewName;
  63.     copy++;
  64.   }
  65.  
  66.   // Спрячем все категории на виде
  67.   foreach (Category cat in doc.Settings.Categories)
  68.   {
  69.     try { genericModelView.SetVisibility(cat, false); }
  70.     catch { /* não aplicável */}
  71.   }
  72. // И установим видимость Типовых моделей
  73.   Category catGenericModel = doc.Settings.Categories.
  74.      get_Item(BuiltInCategory.OST_GenericModel);
  75.   genericModelView.SetVisibility(catGenericModel, true);
  76.  
  77.   // Сейчас создадим фильтр
  78.   // С префиксом F_
  79.   ParameterFilterElement newFilter =
  80.     ParameterFilterElement.Create(
  81.     doc, string.Format("F_{0}", viewName),
  82.   new[] { catGenericModel.Id });
  83.   // Задаем правило, что отображать только экземпляры с определенным названием типоразмера
  84.   FilterRule rule = ParameterFilterRuleFactory.
  85.     CreateNotEqualsRule(
  86.     new ElementId(BuiltInParameter.ALL_MODEL_TYPE_NAME),
  87.   famSymbol.Name, true);
  88.   // Применяем правило
  89.   newFilter.SetRules(new[] { rule });
  90.   genericModelView.AddFilter(newFilter.Id);
  91.   genericModelView.SetFilterVisibility(newFilter.Id, false);
  92. }
  93.  
  94. // Ну и наконец экспортируем виды в DWG
  95. DWGExportOptions options = DWGExportOptions.GetPredefinedOptions(
  96.    doc, "Standard");
  97. doc.Export("c:\\temp_rvt\\", "GenericModels", viewIds, options);

Источник: http://adndevblog.typepad.com/aec/2015/04/revit-api-training-and-some-manual-work-automation.html

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

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

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