Использование 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 для извелчения геометрии объекта для получния двумерного представления моего элемента.
Вот мой код:
- internal class YBExporteContext : IExportContext
- {
- private Document _host_document;
- private IEnumerable<View> _2D_views_that_can_display_elements;
- public YBExporteContext(
- Document document,
- View activeView )
- {
- this._host_document = document;
- this._2D_views_that_can_display_elements
- = YbUtil.FindAllViewsThatCanDisplayElements(
- document );
- }
- private GeometryElement _get2DRepresentation(
- Element element )
- {
- View view = this._get2DViewForElement( element );
- if( view == null )
- return null;
- Options options = new Options();
- options.View = view;
- return element.get_Geometry( options );
- }
- /// <summary>
- /// Получить 2D виды, на которых изображен заданный элемент
- /// </summary>
- /// <param name="element"></param>
- /// <returns>2D виды, на которых изображен заданный элемент </returns>
- private View _get2DViewForElement( Element element )
- {
- FilteredElementCollector collector;
- ICollection<ElementId> elements_in_view;
- foreach( View view in
- this._2D_views_that_can_display_elements )
- {
- collector = new FilteredElementCollector(
- this._host_document, view.Id )
- .WhereElementIsNotElementType();
- elements_in_view = collector.ToElementIds();
- if( elements_in_view.Contains( element.Id ) )
- return view;
- }
- return null;
- }
- }
- public static class YbUtil
- {
- public static IEnumerable<View>
- FindAllViewsThatCanDisplayElements(
- Document doc )
- {
- ElementMulticlassFilter filter
- = new ElementMulticlassFilter( new List<Type>
- { typeof( ViewPlan ) } );
- return new FilteredElementCollector( doc )
- .WherePasses( filter )
- .Cast<View>()
- .Where( v => !v.IsTemplate && v.CanBePrinted );
- }
- }
Ответ: Отличное решение. Спасибо, что поделились с ним. Для своего редактора момещения я создал упрощенный 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