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

28/03/2019

Динамическое количество результирующих файлов из Design Automation для Revit

Мы часто слышали от наших партнёров вопрос, как определить выходные параметры для сервиса Design Automation для Revit динамически, т.е., когда мы не знаем, сколько результирующих файлов мы получим в результате обработки. Например, мы ходим экспортировать все листы из модели Revit. В этом примере мы разберём, как это сделать.

На самом деле, решение этой проблемы очень простое. Нужно определить activity с выходным параметром resultrvt с указанием "zip=true":

Код - HTML: [Выделить]
  1. {
  2.                 "id": "ExportToDwgsActivity",
  3.                 "commandLine": [ "$(engine.path)\\\\revitcoreconsole.exe /i $(args[rvtFile].path) /al $(appbundles[ExportToDwgsApp].path)" ],
  4.                 "parameters": {
  5.                   "rvtFile": {
  6.                                "zip": false,
  7.                                "ondemand": false,
  8.                                "verb": "get",
  9.                                "description": "Input Revit model",
  10.                                "required": true
  11.                   },          
  12.                   "resultrvt": {
  13.                                "zip": true,
  14.                                "ondemand": false,
  15.                                "verb": "put",
  16.                                "description": "Exported Dwg files",
  17.                                "required": true,
  18.                                "localName": "exportedDwgs"
  19.                   }
  20.                 },
  21.                 "engine": "Autodesk.Revit+2019",
  22.                 "appbundles": [ "{{dasNickName}}.ExportToDwgsApp+dev" ],
  23.                 "description": "Export 2D sheet from Revit model to Dwgs."
  24. }

Что на самом деле означает "zip=true"? Для заархивированного файла на входе activity это хорошо описано в https://forge.autodesk.com/en/docs/design-automation/v3/tutorials/revit/step6-post-workitem/ (см. перевод на нашем сайте), но для выходного параметра это может быть не столь ясно. Ключевым здесь является значение localName как показано выше. Фактически, после выполенения workitem, вместо загрузки файла по указанному Url, Design Automation для Revit возьмёт папку exportedDwgs, заархивирует её содержимое в файл exportedDwgs.zip и загрузит этот файл по указанному Url. Всё, что требуется от Вашего plugin-а - это экспортировать файлы в указанную папку exportedDwgs. Код этого примера будет выглядеть следующим образом:

Код - C#: [Выделить]
  1. protected void RevitExportToDwgs( DesignAutomationData data )
  2. {
  3.                 if (data == null)
  4.                                throw new ArgumentNullException(nameof(data));
  5.  
  6.                 Application rvtApp = data.RevitApp;
  7.                 if (rvtApp == null)
  8.                                throw new InvalidDataException(nameof(rvtApp));
  9.  
  10.                 string modelPath = data.FilePath;
  11.                 if (String.IsNullOrWhiteSpace(modelPath))
  12.                                throw new InvalidDataException(nameof(modelPath));
  13.  
  14.                 Document doc = data.RevitDoc;
  15.                 if (doc == null)
  16.                                throw new InvalidOperationException("Could not open document.");
  17.  
  18.                 using (Autodesk.Revit.DB.Transaction trans = new Transaction(doc, "ExportToDwgs"))
  19.                 {
  20.                                try
  21.                                {
  22.                                                trans.Start();
  23.  
  24.                                                List<View> views = new FilteredElementCollector(doc)
  25.                                                                .OfClass(typeof(View))
  26.                                                                .Cast<View>()
  27.                                                                .Where(vw =>
  28.                                                                   vw.ViewType == ViewType.DrawingSheet && !vw.IsTemplate
  29.                                                                ).ToList();
  30.  
  31.                                                List<ElementId> viewIds = new List<ElementId>();
  32.                                                foreach (View view in views)
  33.                                                {
  34.                                                                ViewSheet viewSheet = view as ViewSheet;
  35.                                                                viewIds.Add(viewSheet.Id);
  36.                                                }
  37.  
  38.                                                DWGExportOptions options = new DWGExportOptions();
  39.                                                ExportDWGSettings dwgSettings = ExportDWGSettings.Create(doc, "mySetting");
  40.                                                options = dwgSettings.GetDWGExportOptions();
  41.                                                options.MergedViews = true;
  42.                                               
  43.                                                if (RuntimeValue.RunOnCloud)
  44.                                                {
  45.                                                                doc.Export( Directory.GetCurrentDirectory()+ "\\exportedDwgs", "rvt", viewIds, options);
  46.                                                }
  47.                                                else
  48.                                                {
  49.                                                                // For local test
  50.                                                                doc.Export(Path.GetDirectoryName(modelPath)+ "\\exportedDwgs", "rvt", viewIds, options);
  51.                                                }
  52.  
  53.                                                trans.Commit();
  54.                                }
  55.                                catch (Exception ee)
  56.                                {
  57.                                                System.Diagnostics.Debug.WriteLine(ee.Message);
  58.                                                System.Diagnostics.Debug.WriteLine(ee.StackTrace);
  59.                                                return;
  60.                                }
  61.                                finally
  62.                                {
  63.                                                if (trans.HasStarted())
  64.                                                                trans.RollBack();
  65.                                }
  66.                 }
  67. }

Теперь можно запустить workitem для выполнения activity с указанными параметрами. После его выполнения, вы получите заархивированный файл по указанному "{{exportToDwgsResultSignedUrl}}":

Код - HTML: [Выделить]
  1. {
  2.     "activityId":"{{dasNickName}}.ExportToDwgsActivity+dev",
  3.     "arguments":{
  4.         "rvtFile":{
  5.             "url":"https://developer.api.autodesk.com/oss/v2/buckets/{{bucketKey}}/objects/revitModel.rvt",
  6.                           "Headers":{
  7.                             "Authorization":"Bearer {{dataApiToken}}"
  8.                         }
  9.         },
  10.         "resultrvt":{
  11.             "verb":"put",
  12.             "url":"{{exportToDwgsResultSignedUrl}}"
  13.         }
  14.     }
  15. }
 

Источник: https://forge.autodesk.com/blog/how-generate-dynamic-number-output-design-automation-revit-v3

Автор перевода: Александр Игнатович

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

Опубликовано 28.03.2019