Определение размера и месторасположения видов на листе
Рассмотрим, как можно определить размер и месторасположение листа и всех видов на нем.
В предыдущих версиях 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