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

12/05/2014

Определение размера и месторасположения видов на листе

Рассмотрим, как можно определить размер и месторасположение листа и всех видов на нем.

В предыдущих версиях Revit сделать это было довольно проблематично.

Вот несколько статей на эту тему:

Сейчас же все стало гораздо проще. Класса View имеет теперь свойство Outline.

Ниже представлен лист ‘A102 – Plans’, на котором находятся два вида:

 

Моя утилита GeoSnoop динамически генерирует вот такую временную форму на которой изображены границы листа и видов на нем:

 

Во внешней команде CmdUploadSheets извлекаются все листы с видами и отображаются на временной немодальной форме. Это всего пара строк кода: вызываем новый метод GetSheetViewportLoops и существующий GeoSnoop.DisplayLoops:

Код - C#: [Выделить]
  1.   foreach( ViewSheet sheet in sheets )
  2.   {
  3.     JtLoops sheetViewportLoops
  4.       = GetSheetViewportLoops( sheet );
  5.  
  6.     string sheet_number = sheet.get_Parameter(
  7.       BuiltInParameter.SHEET_NUMBER )
  8.         .AsString();
  9.  
  10.     caption = string.Format(
  11.       "Лист и виды - {0} - {1}",
  12.       sheet_number, sheet.Name );
  13.  
  14.     GeoSnoop.DisplayLoops( revit_window,
  15.       caption, false, sheetViewportLoops );
  16.   }

Интересным является код, в котором извлекаются границы листа и  видов:

Код - C#: [Выделить]
  1.   /// <summary>
  2.   /// Возвращает полигоны, представляющие собой размер
  3.   /// и месторасположение заданного листа и видов на нем
  4.   /// </summary>
  5.   static JtLoops GetSheetViewportLoops(
  6.     ViewSheet sheet )
  7.   {
  8.     Document doc = sheet.Document;
  9.  
  10.     List<Viewport> viewports = sheet
  11.       .GetAllViewports()
  12.       .Select<ElementId,Viewport>(
  13.         id => doc.GetElement( id ) as Viewport )
  14.       .ToList<Viewport>();
  15.  
  16.     int n = viewports.Count;
  17.  
  18.     JtLoops sheetViewportLoops = new JtLoops( n + 1 );
  19.  
  20.     BoundingBoxUV bb = sheet.Outline; // (0,0), (2.76,1.95)
  21.  
  22.     JtBoundingBox2dInt ibb = new JtBoundingBox2dInt(); // (0,0),(840,...)
  23.  
  24.     ibb.ExpandToContain( new Point2dInt( bb.Min ) );
  25.     ibb.ExpandToContain( new Point2dInt( bb.Max ) );
  26.  
  27.     JtLoop loop = new JtLoop( 4 );
  28.  
  29.     loop.Add( ibb.Corners );
  30.  
  31.     sheetViewportLoops.Add( loop );
  32.  
  33.     foreach( Viewport vp in viewports )
  34.     {
  35.       XYZ center = vp.GetBoxCenter();
  36.       Outline outline = vp.GetBoxOutline();
  37.  
  38.       ibb.Init();
  39.  
  40.       ibb.ExpandToContain(
  41.         new Point2dInt( outline.MinimumPoint ) );
  42.  
  43.       ibb.ExpandToContain(
  44.         new Point2dInt( outline.MaximumPoint ) );
  45.  
  46.       loop = new JtLoop( 4 );
  47.  
  48.       loop.Add( ibb.Corners );
  49.  
  50.       sheetViewportLoops.Add( loop );
  51.     }
  52.     return sheetViewportLoops;
  53.   }

Последнюю версию кода приложения RoomAppEditor можно скачать на GitHub.

Версия, обсуждаемая в статье - 2015.0.2.8

Источник: http://thebuildingcoder.typepad.com/blog/2014/04/determining-the-size-and-location-of-viewports-on-a-sheet.html

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

Опубликовано 12.05.2014
Отредактировано 12.05.2014 в 14:41:44