Обработка нескольких файлов через консольное приложение

Автор Тема: Обработка нескольких файлов через консольное приложение  (Прочитано 6788 раз)

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

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

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

Создал класс, который получает доступ к Navisworks, открывает файл, делает манипуляции и закрывает файл.
Вот код который передвигает модель по новым координатам:
Код - C# [Выбрать]
  1. public class NavisworksTransform
  2. {
  3.         private DocumentControl _documentControl;
  4.        
  5.         public NavisworksTransform()
  6.         {
  7.                 ApplicationControl.ApplicationType = ApplicationType.MultipleDocument;
  8.                 ApplicationControl.Initialize();
  9.                 ApplicationControl.CloseFileAfterLoad = true;
  10.         }
  11.        
  12.         public void SetNewCoordinates(string path, string savePath,
  13.         List<NewCoordinates> newCoordinateList, bool isSingleFile = true)
  14.         {
  15.                 _documentControl = new DocumentControl();
  16.                 _documentControl.SetAsMainDocument();
  17.                 if (!_documentControl.Document.TryOpenFile(path))
  18.                 {
  19.                         throw new Exception($"Не удалось открыть файл {path}");
  20.                 }
  21.  
  22.                 var doc = _documentControl.Document;
  23.                 System.Console.WriteLine($"\nПроисходит изменение модели {doc.FileName}");
  24.  
  25.                 var model = doc.Models.First();
  26.                 string fileName = model.FileName;
  27.  
  28.                 NewCoordinates coordinates = newCoordinateList
  29.                         .FirstOrDefault(x => fileName.Contains(x.Building));
  30.  
  31.                 if (coordinates != null)
  32.                 {
  33.                         var newCoordinates = UnitConverter.ConvertUnit(coordinates.XYZ, coordinates.XYZUnits, model);
  34.  
  35.                         var newAngle = UnitConverter.ConvertUnit(coordinates.RotXYZ, coordinates.RotXYZUnits);
  36.  
  37.  
  38.  
  39.                         ModelItemCollection newSelection = new ModelItemCollection();
  40.                         newSelection.Add(model.RootItem);
  41.                         _documentControl.Document.CurrentSelection.CopyFrom(newSelection);
  42.  
  43.                         MoveModel(doc, newCoordinates);
  44.                         RotateModel(doc, newAngle[0], new[] { 1, 0, 0 });
  45.                         RotateModel(doc, newAngle[1], new[] { 0, 1, 0 });
  46.                         RotateModel(doc, newAngle[2], new[] { 0, 0, 1 });
  47.  
  48.                         if (isSingleFile)
  49.                         {
  50.                                 doc.SaveFile(savePath);
  51.                                 System.Console.WriteLine($"Модель успешно изменена и сохранена по следующему пути {savePath}");
  52.  
  53.                         }
  54.                         else
  55.                         {
  56.                                 string concatPath = savePath + "\\" + Path.GetFileName(doc.FileName);
  57.                                 doc.SaveFile(concatPath);
  58.                                 System.Console.WriteLine($"Модель успешно изменена и сохранена по следующему пути {concatPath}");
  59.                         }
  60.  
  61.                 }
  62.  
  63.                 else
  64.                 {
  65.                         System.Console.WriteLine($"В файле JSON не удалось найти имя соответствующее следующей модели {fileName}." +
  66.                                                                          $"\nДанный файл будет пропущен");
  67.                 }
  68.  
  69.         }
  70.  
  71.         public void NavisworksTerminate()
  72.         {
  73.                 _documentControl.Document.Clear();
  74.                 _documentControl.Dispose();
  75.                 ApplicationControl.Terminate();
  76.         }
  77.  
  78.         private void MoveModel(Document doc, double[] moveStep)
  79.  
  80.         {
  81.                 ModelItemCollection coll = doc.CurrentSelection.SelectedItems;
  82.  
  83.                 if (coll.Count == 0)
  84.                         return;
  85.                 Vector3D oNewVector3d = new Vector3D(moveStep[0], moveStep[1], moveStep[2]);
  86.                 Transform3D oNewOverrideTrans = Transform3D.CreateTranslation(oNewVector3d);
  87.                 doc.Models.OverridePermanentTransform(coll, oNewOverrideTrans, true);
  88.         }
  89.  
  90.  
  91.         private void RotateModel(Document doc, double angle, int[] axis)
  92.         {
  93.                 ModelItemCollection coll = doc.CurrentSelection.SelectedItems;
  94.  
  95.                 if (coll.Count == 0)
  96.                         return;
  97.  
  98.                 Point3D oCenterP = coll.BoundingBox().Center;
  99.  
  100.                 Vector3D oMoveBackToOrig = new Vector3D(-oCenterP.X, -oCenterP.Y, -oCenterP.Z);
  101.  
  102.                 Transform3D oMoveBackToOrigM = Transform3D.CreateTranslation(oMoveBackToOrig);
  103.  
  104.                 UnitVector3D odeltaA = new UnitVector3D(axis[0], axis[1], axis[2]);
  105.  
  106.                 Rotation3D delta = new Rotation3D(odeltaA, angle);
  107.  
  108.                 Transform3D oNewOverrideTrans = new Transform3D(delta);
  109.  
  110.                 Transform3D oFinalM = Transform3D.Multiply(oMoveBackToOrigM, oNewOverrideTrans);
  111.  
  112.                 oFinalM = Transform3D.Multiply(oFinalM, oMoveBackToOrigM.Inverse());
  113.  
  114.                 doc.Models.OverridePermanentTransform(coll, oFinalM, true);
  115.  
  116.         }
  117.  
  118.  
  119. }
  120.  
  121.  

Делал разные попытки запустить. Ниже приведены эти попытки и ошибки, которые у меня возникают.
1-я попытка.
Код - C# [Выбрать]
  1.  ApplicationControl.ApplicationType = ApplicationType.SingleDocument;
  2.  
Код - C# [Выбрать]
  1. NavisworksTransform transform = new NavisworksTransform();
  2. foreach (var path in files)
  3. {
  4.         transform.SetNewCoordinates(path, saveDirectory, newCoordinateList, false);
  5. }
  6. transform.NavisworksTerminate();
  7.  
Возникает следующая ошибка:

System.InvalidOperationException: Can't create multiple Documents when ApplicationControl.ApplicationType is SingleDocument
в Autodesk.Navisworks.Api.Controls.DocumentControl.DocumentGetImpl()
в Autodesk.Navisworks.Api.Controls.DocumentControl.SetAsMainDocumentImpl()
в Autodesk.Navisworks.Api.Controls.DocumentControl.SetAsMainDocument()

2-я попытка. 
Код - C# [Выбрать]
  1.  ApplicationControl.ApplicationType = ApplicationType.MultipleDocument;

Остальной код оставил без изменений. Выдало следующую ошибку:
System.InvalidOperationException: Cannot replace MainDocument, should live for lifetime of application
в Autodesk.Navisworks.Api.Application.SetMainDocument(Document doc)
в Autodesk.Navisworks.Api.Controls.DocumentControl.SetAsMainDocumentImpl()
в Autodesk.Navisworks.Api.Controls.DocumentControl.SetAsMainDocument()

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

Решил пробовать дальше,
В 3-й и 4-й попытке я
ApplicationControl.Initialize();
и
ApplicationControl.Terminate();
решил запихнуть в цикл
Код - C# [Выбрать]
  1. foreach (var path in files)
  2. {
  3.         NavisworksTransform transform = new NavisworksTransform();
  4.         transform.SetNewCoordinates(path, saveDirectory, newCoordinateList, false);
  5.         transform.NavisworksTerminate();
  6. }
  7.  

и в обоих случаях выдаёт следующую ошибку..
Autodesk.Navisworks.Api.RuntimeLoaderException: Navisworks Api not licensed
в Autodesk.Navisworks.Internal.ApiImplementation.ApplicationImpl.InitialiseApi(ApplicationConfig config)
в Autodesk.Navisworks.Api.Controls.ApplicationControl.InitializeImpl()

Может кто сталкивался с таким? Возможно ли через Windows приложение обработать несколько файлов невиса, не запуская сам невис?



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

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

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Ну вот я тоже подумал или ещё создать приложение или как то через bat файл может решить, но наверное так и поступлю, спасибо

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
О, кстати, идея, надо попробовать, спасибо)