Превью для файлов в проводнике - {3D} по умолчанию

Автор Тема: Превью для файлов в проводнике - {3D} по умолчанию  (Прочитано 5758 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн archwebАвтор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Здравствуйте!
Я не программист к сожалению, занимаюсь созданием семейств в Ревит. Раньше я сохранял модели, не задумываясь как они будут выглядеть в проводнике и все модели сохранены в таком виде:


Теперь, по разным причинам возникла необходимость пересохранить модели в 3D Виде, чтобы в проводнике была видна превью 3Д модели.

Прошерстив интернет и проштудировав блог Джереми Таммика, нашел вот это решение: http://thebuildingcoder.typepad.com/blog/2011/09/activate-a-3d-view.html

Хотел использовать его, прикрутив к нему обработку всех файлов из указанной папки, но к сожалению не работает.

Провожу ниже мой код, буду благодарен за любую помощь или подсказку, чтоб решить проблему и сохранить thumbnail для файлов - 3D View:

Код - C# [Выбрать]
  1. namespace ChangeTo3dView
  2. {
  3.     [Transaction(TransactionMode.Manual)]
  4.     public class DeleteImportElement : IExternalCommand
  5.     {
  6.         Autodesk.Revit.ApplicationServices.Application app;
  7.         Document doc;
  8.  
  9.  
  10.  
  11.         View3D threeDView;
  12.  
  13.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  14.         {
  15.             app = commandData.Application.Application;
  16.             doc = commandData.Application.ActiveUIDocument.Document;
  17.  
  18.  
  19.  
  20.  
  21.             string directory = @"D:\Desktop\View\";
  22.             string s = "";
  23.  
  24.             foreach (string filename in Directory.GetFiles(directory))
  25.             {
  26.                 s += "Family Name,Family Type,";
  27.                 Document doc = app.OpenDocumentFile(filename);
  28.                 UIApplication uiapp = commandData.Application;
  29.                 UIDocument uidoc = uiapp.ActiveUIDocument;
  30.                
  31.                                
  32.                 createView(uidoc, doc);
  33.  
  34.              
  35.                 doc.Save();
  36.                 doc.Close(false);
  37.  
  38.             }
  39.  
  40.            
  41.             return Result.Succeeded;
  42.         }
  43.  
  44.  
  45.  
  46.         public void createView(UIDocument uidoc, Document doc)
  47.         {
  48.  
  49.             var viewFamilyType
  50.             = new FilteredElementCollector(doc)
  51.             .OfClass(typeof(ViewFamilyType))
  52.             .OfType<ViewFamilyType>()
  53.             .FirstOrDefault(x =>
  54.              x.ViewFamily == ViewFamily.ThreeDimensional);
  55.  
  56.  
  57.  
  58.            
  59.             using (var t = new Transaction(doc, "Create 3D View"))
  60.             {
  61.                 t.Start();
  62.  
  63.                 threeDView = View3D.CreateIsometric(
  64.                  doc, viewFamilyType.Id);
  65.                                
  66.  
  67.                 threeDView.get_Parameter(BuiltInParameter
  68.                  .VIEW_DETAIL_LEVEL).Set(1);
  69.  
  70.                 threeDView.get_Parameter(BuiltInParameter
  71.                   .MODEL_GRAPHICS_STYLE).Set(3);
  72.  
  73.                 t.Commit();
  74.             }
  75.  
  76.          
  77.  
  78.  
  79.         }
  80.  
« Последнее редактирование: 28-03-2017, 14:46:49 от Виктор Чекалин »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Приветствую на форуме!
По существу вопроса тебе еще я надеюсь ответят. Я же напоминаю о необходимости правильного форматирования кода на форуме (читай у меня в подписи).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
archweb, добро пожаловать на форум.

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

Оффлайн archwebАвтор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Здравствуйте, Виктор!
Код выполняется без проблем, но в превью вид не изменяется. Остается вид сверху, а мне нужен вид 3D.

Оффлайн shss

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Как-то давно (в Revit 2015) пользовался такой функцией для генерации стандартного {3D} вида:
Код - C# [Выбрать]
  1. RevitCommandId default3DViewId = RevitCommandId.LookupPostableCommandId(PostableCommand.Default3DView);
  2. if (commandData.Application.CanPostCommand(default3DViewId))
  3.     commandData.Application.PostCommand(default3DViewId );

Отмечено как Решение Александр Ривилис 29-03-2017, 10:56:54

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
archweb,
У метода Document.Save есть возможность передать объект типа SaveOptions. У него есть свойство SaveOptions.PreviewViewId, т.е. идентификатор вида, который использовать в качестве вида на превью.
Должно получиться как то так:
Код - C# [Выбрать]
  1. namespace ChangeTo3dView
  2. {
  3.     [Transaction(TransactionMode.Manual)]
  4.     public class DeleteImportElement : IExternalCommand
  5.     {
  6.         Autodesk.Revit.ApplicationServices.Application app;
  7.         Document doc;
  8.  
  9.  
  10.  
  11.         View3D threeDView;
  12.  
  13.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  14.         {
  15.             app = commandData.Application.Application;
  16.             doc = commandData.Application.ActiveUIDocument.Document;
  17.  
  18.  
  19.  
  20.  
  21.             string directory = @"D:\Desktop\View\";
  22.             string s = "";
  23.  
  24.             foreach (string filename in Directory.GetFiles(directory))
  25.             {
  26.                 s += "Family Name,Family Type,";
  27.                 Document doc = app.OpenDocumentFile(filename);
  28.                 UIApplication uiapp = commandData.Application;
  29.                 UIDocument uidoc = uiapp.ActiveUIDocument;
  30.                
  31.                                
  32.                 var viewId = createView(uidoc, doc);
  33.  
  34.                 var options = new SaveOptions()
  35.                {
  36.                     PreviewViewId = viewId
  37.                };
  38.                 doc.Save(options);
  39.                 doc.Close(false);
  40.  
  41.             }
  42.  
  43.            
  44.             return Result.Succeeded;
  45.         }
  46.  
  47.  
  48.  
  49.         public ElementId createView(UIDocument uidoc, Document doc)
  50.         {
  51.  
  52.             var viewFamilyType
  53.             = new FilteredElementCollector(doc)
  54.             .OfClass(typeof(ViewFamilyType))
  55.             .OfType<ViewFamilyType>()
  56.             .FirstOrDefault(x =>
  57.              x.ViewFamily == ViewFamily.ThreeDimensional);
  58.  
  59.  
  60.  
  61.            
  62.             using (var t = new Transaction(doc, "Create 3D View"))
  63.             {
  64.                 t.Start();
  65.  
  66.                 threeDView = View3D.CreateIsometric(
  67.                  doc, viewFamilyType.Id);
  68.                                
  69.  
  70.                 threeDView.get_Parameter(BuiltInParameter
  71.                  .VIEW_DETAIL_LEVEL).Set(1);
  72.  
  73.                 threeDView.get_Parameter(BuiltInParameter
  74.                   .MODEL_GRAPHICS_STYLE).Set(3);
  75.  
  76.                 t.Commit();
  77.             }
  78.  
  79.             return threeDView.Id;
  80.          
  81.  
  82.  
  83.         }
  84.  
Код не проверял, мог где то ошибиться в синтаксисе.

Оффлайн shss

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Виктор,
а разве не так должно быть?
Код - C# [Выбрать]
  1. doc.Save(options as SaveOptions);
  2.  


Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Сергей, да, конечно. Спасибо, поправил оригинальный пост.

Оффлайн archwebАвтор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Спасибо, парни! Выручили, работает так как надо!!!

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


Посмотрел на форуме автодеск, говорят нужно использовать метод View.HideElementsTemporary, но все равно коннекторы не скрываются:
https://goo.gl/ZKUkGG
Как к моей команде прикрутить метод который скрывает коннекторы?

Еще раз спасибо!

Оффлайн shss

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Я бы сделал, вот так:
Код - C# [Выбрать]
  1. using (Transaction tr = new Transaction(doc, "HideConnectors")) {
  2.     tr.Start();
  3.     (doc.GetElement(viewId) as View).HideElementsTemporary(new FilteredElementCollector(doc, viewId).OfCategory(BuiltInCategory.OST_ConnectorElem).ToElements());
  4.     if (tr.Commit() == TransactionStatus.Committed) {
  5.         Debug.Print("Success transaction");
  6.     }else{
  7.         Debug.Print("Transaction failed");
  8.     }
  9. }
  10.  

Оффлайн archwebАвтор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
shss, попробовал добавить твой код, но выдает ошибку:




Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Как к моей команде прикрутить метод который скрывает коннекторы?
Сергей верно идею подсказал. только зачем это делать отдельной транзакцией? Да и искать скрывать элементы категории, вместо категории целиком...
В методе createView надо их скрыть.
Код - C# [Выбрать]
  1.         public ElementId createView(UIDocument uidoc, Document doc)
  2.         {
  3.  
  4.             var viewFamilyType
  5.             = new FilteredElementCollector(doc)
  6.             .OfClass(typeof(ViewFamilyType))
  7.             .OfType<ViewFamilyType>()
  8.             .FirstOrDefault(x =>
  9.              x.ViewFamily == ViewFamily.ThreeDimensional);
  10.  
  11.  
  12.  
  13.            
  14.             using (var t = new Transaction(doc, "Create 3D View"))
  15.             {
  16.                 t.Start();
  17.  
  18.                 threeDView = View3D.CreateIsometric(
  19.                  doc, viewFamilyType.Id);
  20.                                
  21.                threeDView.HideCategoryTemporary(new ElementId(BuiltInCategory.OST_ConnectorElem));
  22.                 threeDView.get_Parameter(BuiltInParameter
  23.                  .VIEW_DETAIL_LEVEL).Set(1);
  24.  
  25.                 threeDView.get_Parameter(BuiltInParameter
  26.                   .MODEL_GRAPHICS_STYLE).Set(3);
  27.  
  28.                 t.Commit();
  29.             }
  30.  
  31.             return threeDView.Id;
  32.          
  33.  
  34.  
  35.         }

Оффлайн archwebАвтор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Спасибо, ребята! Благодарю за терпение и помощь, все получилось и работает как надо:


Теперь я окончательно убедился, что нужно учить программирование и ревит API.

Спасибо!!!

Оффлайн shss

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
только зачем это делать отдельной транзакцией?
Упс, я просто не обратил внимание на общий код.
Конечно, если есть уже готовая транзакция, то нужно ее использовать.

Да и искать скрывать элементы категории, вместо категории целиком...
Просто если не все коннекторы нужно скрыть, например:)

Виктор, а при последующем открытии файла, категория также будет скрыта?

Оффлайн archwebАвтор темы

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Сергей, я вижу коннекторы при открытии файлов. Насколько я понял, они временно скрыты в виде. Тем более, в UI нет категории, для того чтобы скрыть коннекторы.