Определение размера и месторасположения видов на листе
Рассмотрим, как можно определить размер и месторасположение листа и всех видов на нем.
В предыдущих версиях Revit сделать это было довольно проблематично.
Вот несколько статей на эту тему:
- Список всех листов и видов на нем – CmdListViews (на англ.)
 - Определение размера листа – CmdSheetSize (на англ.)
 - Определение месторасположения вида на листе (на англ.)
 - Точное позиционирование видового экрана (на англ.)
 
Сейчас же все стало гораздо проще. Класса View имеет теперь свойство Outline.
Ниже представлен лист ‘A102 – Plans’, на котором находятся два вида:
 
Моя утилита GeoSnoop динамически генерирует вот такую временную форму на которой изображены границы листа и видов на нем:
 
Во внешней команде CmdUploadSheets извлекаются все листы с видами и отображаются на временной немодальной форме. Это всего пара строк кода: вызываем новый метод GetSheetViewportLoops и существующий GeoSnoop.DisplayLoops:
- foreach( ViewSheet sheet in sheets )
 - {
 - JtLoops sheetViewportLoops
 - = GetSheetViewportLoops( sheet );
 - string sheet_number = sheet.get_Parameter(
 - BuiltInParameter.SHEET_NUMBER )
 - .AsString();
 - caption = string.Format(
 - "Лист и виды - {0} - {1}",
 - sheet_number, sheet.Name );
 - GeoSnoop.DisplayLoops( revit_window,
 - caption, false, sheetViewportLoops );
 - }
 
Интересным является код, в котором извлекаются границы листа и видов:
- /// <summary>
 - /// Возвращает полигоны, представляющие собой размер
 - /// и месторасположение заданного листа и видов на нем
 - /// </summary>
 - static JtLoops GetSheetViewportLoops(
 - ViewSheet sheet )
 - {
 - Document doc = sheet.Document;
 - List<Viewport> viewports = sheet
 - .GetAllViewports()
 - .Select<ElementId,Viewport>(
 - id => doc.GetElement( id ) as Viewport )
 - .ToList<Viewport>();
 - int n = viewports.Count;
 - JtLoops sheetViewportLoops = new JtLoops( n + 1 );
 - BoundingBoxUV bb = sheet.Outline; // (0,0), (2.76,1.95)
 - JtBoundingBox2dInt ibb = new JtBoundingBox2dInt(); // (0,0),(840,...)
 - ibb.ExpandToContain( new Point2dInt( bb.Min ) );
 - ibb.ExpandToContain( new Point2dInt( bb.Max ) );
 - JtLoop loop = new JtLoop( 4 );
 - loop.Add( ibb.Corners );
 - sheetViewportLoops.Add( loop );
 - foreach( Viewport vp in viewports )
 - {
 - XYZ center = vp.GetBoxCenter();
 - Outline outline = vp.GetBoxOutline();
 - ibb.Init();
 - ibb.ExpandToContain(
 - new Point2dInt( outline.MinimumPoint ) );
 - ibb.ExpandToContain(
 - new Point2dInt( outline.MaximumPoint ) );
 - loop = new JtLoop( 4 );
 - loop.Add( ibb.Corners );
 - sheetViewportLoops.Add( loop );
 - }
 - return sheetViewportLoops;
 - }
 
Последнюю версию кода приложения RoomAppEditor можно скачать на GitHub.
Версия, обсуждаемая в статье - 2015.0.2.8
Обсуждение: http://adn-cis.org/forum/index.php?topic=727
Опубликовано 12.05.2014Отредактировано 12.05.2014 в 14:41:44