Экспорт изображения и установка ракурса 3D-вида по умолчанию
Небольшое пояснение от Александра Игнатовича из Инвестиционной Венчурной Компании о том как можно экспортировать изображение семейства или проекта.
Проблема, с которой пришлось столкнуться при реализации экспорта изображения – как получить нужный ракурс для только что созданного 3D-вида, чтобы в итоге получить красивое изображение.
Вопрос: До 2014 версии Revit я использовал вот такой код для создания 3D вида с нужной мне ориентацией по умолчанию:
- var direction = new XYZ( -1, 1, -1 );
- var view3D = doc.IsFamilyDocument
- ? doc.FamilyCreate.NewView3D( direction )
- : doc.Create.NewView3D( direction );
В 2014 же версии у меня возникли трудности, чтобы получить тот же самый результат с помощью методов View3D.CreateIsometric и View3D.SetOrientation.
Попытался реализовать с помощью вот такого кода, но безуспешно:
- var direction = new XYZ(-1, 1, -1);
- var collector = new FilteredElementCollector(doc);
- var viewFamilyType = collector
- .OfClass<ViewFamilyType>()
- .Cast<ViewFamilyType>()
- .FirstOrDefault(x => x.ViewFamily
- == ViewFamily.ThreeDimensional);
- // . . .
- var view3D = View3D.CreateIsometric(
- doc, viewFamilyType.Id);
- // . . .
- view3D.SetOrientation( new ViewOrientation3D(
- direction, new XYZ(0, 1, 1), new XYZ(0, 1, -1)));
Результат совсем не такой, как со старым кодом, методы которого объявлены устаревшими в Revit API 2014.
Какие параметры нужно использовать в этих методах, чтобы получить такой же результат?
Ответ: Я решил свою проблему пытаясь сгенерировать изображения семейств и проекта, чтобы они выглядели так же, как и в 3D виде по умолчанию в Revit.
Я думаю, я нашел самый простой способ как это сделать, и возможно этот метод окажется полезным не только для меня.
Когда я сначала пытался сконвертировать мой старый код для работы с новыми методами, я вызывал метод
- view3D.SetOrientation(
- new ViewOrientation3D(
- direction,
- new XYZ( 0, 1, 1 ),
- new XYZ( 0, 1, -1 ) ) );
Я просто его удалил и теперь все работает превосходно.
С помощью кода я получаю прекрасные изображения. Вот парочка из них:
Вот часть кода, который я использую для генерации изображений.
- static string ExportToImage(Document doc)
- {
- var tempFileName = Path.ChangeExtension(
- Path.GetRandomFileName(), "png");
- string tempImageFile;
- try
- {
- tempImageFile = Path.Combine(
- Path.GetTempPath(), tempFileName);
- }
- catch (IOException)
- {
- return null;
- }
- IList<ElementId> views = new List<ElementId>();
- try
- {
- #if !VERSION2014
- var direction = new XYZ(-1, 1, -1);
- var view3D = doc.IsFamilyDocument
- ? doc.FamilyCreate.NewView3D(direction)
- : doc.Create.NewView3D(direction);
- #else
- var collector = new FilteredElementCollector(
- doc );
- var viewFamilyType = collector
- .OfType<ViewFamilyType>()
- .FirstOrDefault( x => x.ViewFamily
- == ViewFamily.ThreeDimensional );
- var view3D = ( viewFamilyType != null )
- ? View3D.CreateIsometric( doc, viewFamilyType.Id )
- : null;
- #endif // VERSION2014
- if (view3D != null)
- {
- views.Add(view3D.Id);
- var graphicDisplayOptions
- = view3D.get_Parameter(
- BuiltInParameter.MODEL_GRAPHICS_STYLE);
- // Settings for best quality
- graphicDisplayOptions.Set(6);
- }
- }
- catch (Autodesk.Revit.Exceptions
- .InvalidOperationException)
- {
- }
- var ieo = new ImageExportOptions
- {
- FilePath = tempImageFile,
- FitDirection = FitDirectionType.Horizontal,
- HLRandWFViewsFileType = ImageFileType.PNG,
- ImageResolution = ImageResolution.DPI_150,
- ShouldCreateWebSite = false
- };
- if (views.Count > 0)
- {
- ieo.SetViewsAndSheets(views);
- ieo.ExportRange = ExportRange.SetOfViews;
- }
- else
- {
- ieo.ExportRange = ExportRange
- .VisibleRegionOfCurrentView;
- }
- ieo.ZoomType = ZoomFitType.FitToPage;
- ieo.ViewName = "tmp";
- if (ImageExportOptions.IsValidFileName(
- tempImageFile))
- {
- // If ExportRange = ExportRange.SetOfViews
- // and document is not active, then image
- // exports successfully, but throws
- // Autodesk.Revit.Exceptions.InternalException
- try
- {
- doc.ExportImage(ieo);
- }
- catch
- {
- return string.Empty;
- }
- }
- else
- {
- return string.Empty;
- }
- // File name has format like
- // "tempFileName - view type - view name", e.g.
- // "luccwjkz - 3D View - {3D}.png".
- // Get the first image (we only listed one view
- // in views).
- var files = Directory.GetFiles(
- Path.GetTempPath(),
- string.Format("{0}*.*", Path
- .GetFileNameWithoutExtension(
- tempFileName)));
- return files.Length > 0
- ? files[0]
- : string.Empty;
- }
И конечно, большое спасибо Александру, за то что не забыл поделиться с нами своим решением!
Источник: 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