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

29/08/2013

Экспорт изображения и установка ракурса 3D-вида по умолчанию

Небольшое пояснение от Александра Игнатовича из Инвестиционной Венчурной Компании о том как можно экспортировать изображение семейства или проекта.

 

Проблема, с которой пришлось столкнуться при реализации экспорта изображения – как получить нужный ракурс для только что созданного 3D-вида, чтобы в итоге получить красивое изображение.

Вопрос: До 2014 версии Revit я использовал вот такой код для создания 3D вида с нужной мне ориентацией по умолчанию:

Код - C#: [Выделить]
  1.  
  2.   var direction = new XYZ( -1, 1, -1 );
  3.   var view3D = doc.IsFamilyDocument
  4.     ? doc.FamilyCreate.NewView3D( direction )
  5.     : doc.Create.NewView3D( direction );

В 2014 же версии у меня возникли трудности, чтобы получить тот же самый результат с помощью методов View3D.CreateIsometric и View3D.SetOrientation.

Попытался реализовать с помощью вот такого кода, но безуспешно:

Код - C#: [Выделить]
  1.  
  2.   var direction = new XYZ(-11-1);
  3.   var collector = new FilteredElementCollector(doc);
  4.   var viewFamilyType = collector
  5.     .OfClass<ViewFamilyType>()
  6.     .Cast<ViewFamilyType>()
  7.     .FirstOrDefault(=> x.ViewFamily
  8.       == ViewFamily.ThreeDimensional);
  9.  
  10.   // . . . 
  11.  
  12.   var view3D = View3D.CreateIsometric(
  13.     doc, viewFamilyType.Id);
  14.  
  15.   // . . .
  16.  
  17.   view3D.SetOrientation( new ViewOrientation3D(
  18.     direction, new XYZ(011)new XYZ(01-1)));

Результат совсем не такой, как со старым кодом, методы которого объявлены устаревшими в Revit API 2014.

Какие параметры нужно использовать в этих методах, чтобы получить  такой же результат?

Ответ: Я решил свою проблему пытаясь сгенерировать изображения семейств и проекта, чтобы они выглядели так же, как и в 3D виде по умолчанию в Revit.

 Я думаю, я нашел самый простой способ как это сделать, и возможно этот метод окажется полезным не только для меня.

Когда я сначала пытался сконвертировать мой старый код для работы с новыми методами, я вызывал метод

Код - C#: [Выделить]
  1.  
  2.         view3D.SetOrientation(
  3.             new ViewOrientation3D(
  4.             direction,
  5.             new XYZ( 011 ),
  6.             new XYZ( 01-1 ) ) );


Я просто его удалил и теперь все работает превосходно.   

С помощью кода я получаю прекрасные изображения. Вот парочка из них:

 

 

Вот часть кода, который я использую для генерации изображений.

Код - C#: [Выделить]
  1.  
  2.         static string ExportToImage(Document doc)
  3.         {
  4.             var tempFileName = Path.ChangeExtension(
  5.               Path.GetRandomFileName()"png");
  6.  
  7.             string tempImageFile;
  8.  
  9.             try
  10.             {
  11.                 tempImageFile = Path.Combine(
  12.                   Path.GetTempPath(), tempFileName);
  13.             }
  14.             catch (IOException)
  15.             {
  16.                 return null;
  17.             }
  18.  
  19.             IList<ElementId> views = new List<ElementId>();
  20.  
  21.             try
  22.             {
  23.  
  24. #if !VERSION2014
  25.                 var direction = new XYZ(-11-1);
  26.                 var view3D = doc.IsFamilyDocument
  27.                   ? doc.FamilyCreate.NewView3D(direction)
  28.                   : doc.Create.NewView3D(direction);
  29. #else
  30.     var collector = new FilteredElementCollector(
  31.       doc );
  32.  
  33.     var viewFamilyType = collector
  34.         .OfType<ViewFamilyType>()
  35.         .FirstOrDefault( x => x.ViewFamily
  36.           == ViewFamily.ThreeDimensional );
  37.  
  38.     var view3D = ( viewFamilyType != null )
  39.       ? View3D.CreateIsometric( doc, viewFamilyType.Id )
  40.       : null;
  41.  
  42. #endif // VERSION2014
  43.  
  44.                 if (view3D != null)
  45.                 {
  46.                     views.Add(view3D.Id);
  47.  
  48.                     var graphicDisplayOptions
  49.                       = view3D.get_Parameter(
  50.                         BuiltInParameter.MODEL_GRAPHICS_STYLE);
  51.  
  52.                     // Settings for best quality
  53.  
  54.                     graphicDisplayOptions.Set(6);
  55.                 }
  56.             }
  57.             catch (Autodesk.Revit.Exceptions
  58.               .InvalidOperationException)
  59.             {
  60.             }
  61.  
  62.             var ieo = new ImageExportOptions
  63.             {
  64.                 FilePath = tempImageFile,
  65.                 FitDirection = FitDirectionType.Horizontal,
  66.                 HLRandWFViewsFileType = ImageFileType.PNG,
  67.                 ImageResolution = ImageResolution.DPI_150,
  68.                 ShouldCreateWebSite = false
  69.             };
  70.  
  71.             if (views.Count > 0)
  72.             {
  73.                 ieo.SetViewsAndSheets(views);
  74.                 ieo.ExportRange = ExportRange.SetOfViews;
  75.             }
  76.             else
  77.             {
  78.                 ieo.ExportRange = ExportRange
  79.                   .VisibleRegionOfCurrentView;
  80.             }
  81.  
  82.             ieo.ZoomType = ZoomFitType.FitToPage;
  83.             ieo.ViewName = "tmp";
  84.  
  85.             if (ImageExportOptions.IsValidFileName(
  86.               tempImageFile))
  87.             {
  88.                 // If ExportRange = ExportRange.SetOfViews 
  89.                 // and document is not active, then image 
  90.                 // exports successfully, but throws
  91.                 // Autodesk.Revit.Exceptions.InternalException
  92.  
  93.                 try
  94.                 {
  95.                     doc.ExportImage(ieo);
  96.                 }
  97.                 catch
  98.                 {
  99.                     return string.Empty;
  100.                 }
  101.             }
  102.             else
  103.             {
  104.                 return string.Empty;
  105.             }
  106.  
  107.             // File name has format like 
  108.             // "tempFileName - view type - view name", e.g.
  109.             // "luccwjkz - 3D View - {3D}.png".
  110.             // Get the first image (we only listed one view
  111.             // in views).
  112.  
  113.             var files = Directory.GetFiles(
  114.               Path.GetTempPath(),
  115.               string.Format("{0}*.*", Path
  116.                 .GetFileNameWithoutExtension(
  117.                   tempFileName)));
  118.  
  119.             return files.Length > 0
  120.               ? files[0]
  121.               : string.Empty;
  122.         }


И конечно, большое спасибо Александру, за то что не забыл поделиться с нами своим решением!

 

Источник: http://thebuildingcoder.typepad.com/blog/2013/08/setting-a-default-3d-view-orientation.html

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

Опубликовано 29.08.2013
Отредактировано 29.08.2013 в 12:41:49