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

27/04/2016

Использование CustomExporter для 2D

Вопрос: Я пытаюсь получить двумерное представление заданного элемента в модели. При помощи CustomExporter я получаю все видимые элементы на 3D виде. Я читал несколько статей и в одной из них я прочел, что нужно использовать что-то вроде «переключение на двумерный план этажа и запросить представление этого элемента на заданном виде». Сейчас я застрял на этапе как мне получить нужный план этажа, если у меня их в модели несколько? Можете направить меня в нужное русло?

Например, есть ли способ экспортировать аннотации?

Ответ: Взгляните на подобрку статей по CustomExporter

В Revit 2015 можно было работать тольок с 3D. 2016 также поддерживает 2D.

Советую также обратить внимание на мою надстройку Редактирование помещения.

Есть еще записи и материалы с Autodesk University и много постов в блогах на эту тему.  

Ответ: Вы имеете ввиду класс CustomExporter? Проблема в том, что метод Export в качестве входящего параметра требует 3D   вид, но аннотации на 3D виде не отображаются. На сколько мне известно, в Revit 2016 появилась поддержка 2D объектов, но на входе, тем не менее, требуется 3D вид все равно.

А можно ли извлесь двумерную геометрию из 2D вида с помощью CustomExporter?

Ответ: Вы полностью правы. CustomExporter может экспортировать только 3D виды. С 2D видом возникает исключение.

Но вы также правы, что начиная с Revit 2016 CustomExporter может также экспортировать текст, который является двумерной сущностью. Также могут быть экспортированы линии модели – хоть они и являются трехмерными объектами, но в предыдущией версии они все равно не экспортировались

Ответ: А есть ли планы по избавлению от такого ограничения в будущем?

Есть ли какой-то другой способ обойти это ограничение? Может быть можно создать 3D вид, который выглядит точно так же как и 2D?

Ответ: К сожалению, нет:

  • Пока таких планов нет
  • Не думаю, что можно создать 3D вид, который выглядит в точночти, как и 2D вид.
  • Постарайтесь понять, дейстительно ли аннотации не экспортируются. Если они видны на виде, то они все же должны наверняка экспортироваться.

Ответ: Спасибо за отклик. Я нашел обсуждения в статье Виды, отображаемые заданный элемент, SVG и NoSQL (на англ.), которая оказалось очень полезной для меня и я в итоге применил подобный подход. В статье вы используете ElementMulticlassFilter для фильтрации 3D видов, планов этажей и фасадов, на которых отображается заданный набор элементов. В моем случае мне нужны только планы этажей. Я прохоже по всему списку, до тех пор, пока не найду план этажа, на котором отображается нужный мне элемент. После этого, я передаю этот вид в качестве совйства класса Options для извелчения геометрии объекта для получния двумерного представления моего элемента.

Вот мой код:

Код - C#: [Выделить]
  1. internal class YBExporteContext : IExportContext
  2. {
  3.   private Document _host_document;
  4.   private IEnumerable<View> _2D_views_that_can_display_elements;
  5.  
  6.   public YBExporteContext(
  7.     Document document,
  8.     View activeView )
  9.   {
  10.     this._host_document = document;
  11.     this._2D_views_that_can_display_elements
  12.       = YbUtil.FindAllViewsThatCanDisplayElements(
  13.         document );
  14.   }
  15.  
  16.   private GeometryElement _get2DRepresentation(
  17.     Element element )
  18.   {
  19.     View view = this._get2DViewForElement( element );
  20.     if( view == null )
  21.       return null;
  22.  
  23.     Options options = new Options();
  24.     options.View = view;
  25.     return element.get_Geometry( options );
  26.   }
  27.  
  28.   /// <summary>
  29.   /// Получить 2D виды, на которых изображен заданный элемент
  30.   /// </summary>
  31.   /// <param name="element"></param>
  32.   /// <returns>2D виды, на которых изображен заданный элемент </returns>
  33.   private View _get2DViewForElement( Element element )
  34.   {
  35.     FilteredElementCollector collector;
  36.     ICollection<ElementId> elements_in_view;
  37.  
  38.     foreach( View view in
  39.       this._2D_views_that_can_display_elements )
  40.     {
  41.       collector = new FilteredElementCollector(
  42.         this._host_document, view.Id )
  43.           .WhereElementIsNotElementType();
  44.  
  45.       elements_in_view = collector.ToElementIds();
  46.  
  47.       if( elements_in_view.Contains( element.Id ) )
  48.         return view;
  49.     }
  50.  
  51.     return null;
  52.   }
  53. }
  54.  
  55. public static class YbUtil
  56. {
  57.   public static IEnumerable<View>
  58.     FindAllViewsThatCanDisplayElements(
  59.       Document doc )
  60.   {
  61.     ElementMulticlassFilter filter
  62.       = new ElementMulticlassFilter( new List<Type>
  63.         { typeof( ViewPlan ) } );
  64.  
  65.     return new FilteredElementCollector( doc )
  66.       .WherePasses( filter )
  67.       .Cast<View>()
  68.       .Where( v => !v.IsTemplate && v.CanBePrinted );
  69.   }
  70. }

Ответ: Отличное решение. Спасибо, что поделились с ним. Для своего редактора момещения я создал упрощенный 2D вид из 3D используя ExtrusionAnalyzer. Результат тоже был неплохой.

На самом деле существуются различные варианты для достижения данной цели и нужно пробовать, какой из них более подходит в вашем случае.

Источник: http://thebuildingcoder.typepad.com/blog/2015/11/au-begins-and-using-a-custom-exporter-for-2d.html

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

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

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