ADN Club > Navisworks API

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

(1/1)

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

Создал класс, который получает доступ к Navisworks, открывает файл, делает манипуляции и закрывает файл.
Вот код который передвигает модель по новым координатам:

--- Код - C# [Выбрать] ---public class NavisworksTransform{        private DocumentControl _documentControl;                public NavisworksTransform()        {                ApplicationControl.ApplicationType = ApplicationType.MultipleDocument;                ApplicationControl.Initialize();                ApplicationControl.CloseFileAfterLoad = true;        }                public void SetNewCoordinates(string path, string savePath,         List<NewCoordinates> newCoordinateList, bool isSingleFile = true)        {                _documentControl = new DocumentControl();                _documentControl.SetAsMainDocument();                if (!_documentControl.Document.TryOpenFile(path))                {                        throw new Exception($"Не удалось открыть файл {path}");                }                 var doc = _documentControl.Document;                System.Console.WriteLine($"\nПроисходит изменение модели {doc.FileName}");                 var model = doc.Models.First();                string fileName = model.FileName;                 NewCoordinates coordinates = newCoordinateList                        .FirstOrDefault(x => fileName.Contains(x.Building));                 if (coordinates != null)                {                        var newCoordinates = UnitConverter.ConvertUnit(coordinates.XYZ, coordinates.XYZUnits, model);                         var newAngle = UnitConverter.ConvertUnit(coordinates.RotXYZ, coordinates.RotXYZUnits);                           ModelItemCollection newSelection = new ModelItemCollection();                        newSelection.Add(model.RootItem);                        _documentControl.Document.CurrentSelection.CopyFrom(newSelection);                         MoveModel(doc, newCoordinates);                        RotateModel(doc, newAngle[0], new[] { 1, 0, 0 });                        RotateModel(doc, newAngle[1], new[] { 0, 1, 0 });                        RotateModel(doc, newAngle[2], new[] { 0, 0, 1 });                         if (isSingleFile)                        {                                doc.SaveFile(savePath);                                System.Console.WriteLine($"Модель успешно изменена и сохранена по следующему пути {savePath}");                         }                        else                        {                                string concatPath = savePath + "\\" + Path.GetFileName(doc.FileName);                                doc.SaveFile(concatPath);                                System.Console.WriteLine($"Модель успешно изменена и сохранена по следующему пути {concatPath}");                        }                 }                 else                {                        System.Console.WriteLine($"В файле JSON не удалось найти имя соответствующее следующей модели {fileName}." +                                                                         $"\nДанный файл будет пропущен");                }         }         public void NavisworksTerminate()        {                _documentControl.Document.Clear();                _documentControl.Dispose();                ApplicationControl.Terminate();        }         private void MoveModel(Document doc, double[] moveStep)         {                ModelItemCollection coll = doc.CurrentSelection.SelectedItems;                 if (coll.Count == 0)                        return;                Vector3D oNewVector3d = new Vector3D(moveStep[0], moveStep[1], moveStep[2]);                Transform3D oNewOverrideTrans = Transform3D.CreateTranslation(oNewVector3d);                doc.Models.OverridePermanentTransform(coll, oNewOverrideTrans, true);        }          private void RotateModel(Document doc, double angle, int[] axis)        {                ModelItemCollection coll = doc.CurrentSelection.SelectedItems;                 if (coll.Count == 0)                        return;                 Point3D oCenterP = coll.BoundingBox().Center;                 Vector3D oMoveBackToOrig = new Vector3D(-oCenterP.X, -oCenterP.Y, -oCenterP.Z);                 Transform3D oMoveBackToOrigM = Transform3D.CreateTranslation(oMoveBackToOrig);                 UnitVector3D odeltaA = new UnitVector3D(axis[0], axis[1], axis[2]);                 Rotation3D delta = new Rotation3D(odeltaA, angle);                 Transform3D oNewOverrideTrans = new Transform3D(delta);                 Transform3D oFinalM = Transform3D.Multiply(oMoveBackToOrigM, oNewOverrideTrans);                 oFinalM = Transform3D.Multiply(oFinalM, oMoveBackToOrigM.Inverse());                 doc.Models.OverridePermanentTransform(coll, oFinalM, true);         }  }  
Делал разные попытки запустить. Ниже приведены эти попытки и ошибки, которые у меня возникают.
1-я попытка.

--- Код - C# [Выбрать] --- ApplicationControl.ApplicationType = ApplicationType.SingleDocument; 
--- Код - C# [Выбрать] ---NavisworksTransform transform = new NavisworksTransform();foreach (var path in files){        transform.SetNewCoordinates(path, saveDirectory, newCoordinateList, false);}transform.NavisworksTerminate(); Возникает следующая ошибка:


--- Код: ---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# [Выбрать] --- 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# [Выбрать] ---foreach (var path in files){        NavisworksTransform transform = new NavisworksTransform();        transform.SetNewCoordinates(path, saveDirectory, newCoordinateList, false);        transform.NavisworksTerminate();} 
и в обоих случаях выдаёт следующую ошибку..

--- Код: ---Autodesk.Navisworks.Api.RuntimeLoaderException: Navisworks Api not licensed
в Autodesk.Navisworks.Internal.ApiImplementation.ApplicationImpl.InitialiseApi(ApplicationConfig config)
в Autodesk.Navisworks.Api.Controls.ApplicationControl.InitializeImpl()

--- Конец кода ---

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


Александр Ривилис:
Если твоё консольное приложение уже сейчас может работать с одним файлом, то сделай другое консольное приложение, которое будет по очереди запускать твоё консольное приложение с каждым из файлов, которые тебе нужно обработать. Мне кажется, что это будет простейшим вариантом.
В принципе можно обойтись и одним консольным приложением, которое (если оно запускается без параметров) получает список обрабатываемых файлов и затем запускает себя же, но с параметром - имя файла - для каждого из файлов, которые нужно обработать.

user32:
Ну вот я тоже подумал или ещё создать приложение или как то через bat файл может решить, но наверное так и поступлю, спасибо

Александр Ривилис:
user32,
Кстати, можно подумать и об распараллеливании процессов (т.е. запуск одновременно нескольких консольных приложений - например, по количеству ядер процессора).

user32:
О, кстати, идея, надо попробовать, спасибо)

Навигация

[0] Главная страница сообщений

Перейти к полной версии