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:
О, кстати, идея, надо попробовать, спасибо)
Навигация
Перейти к полной версии