Найти в Дзене
IT4BIM

Оркестрация Naviswork на сервере: как параллельно выполнять типовые задачи в контексте Naviswork.

Введение В современном строительном проектировании активно используются BIM-модели, а Autodesk Navisworks — один из ключевых инструментов для их анализа и координации. Однако для автоматизации процессов, таких как обработка коллизий или управление моделями, требуется интеграция Navisworks с серверными решениями. В этой статье мы разберем, как создать серверное приложение, способное управлять Navisworks через REST API. Мы разработаем плагин для Navisworks, создадим серверную очередь задач и реализуем механизм удаленного вызова команд. Это позволит автоматизировать работу с моделями и повысить эффективность обработки данных. Разработка плагина под Navisworks Создание библиотеки классов Начнем с создания библиотеки классов на основе .NET Framework, предназначенной для работы с Navisworks. Для этого: 3. В свойствах данных DLL изменим параметр "Копировать локально" на False, чтобы исключить их из сборки. После нам необходимо создать первую кнопку, которую в дальнейшем будем испол

Введение

В современном строительном проектировании активно используются BIM-модели, а Autodesk Navisworks — один из ключевых инструментов для их анализа и координации. Однако для автоматизации процессов, таких как обработка коллизий или управление моделями, требуется интеграция Navisworks с серверными решениями.

В этой статье мы разберем, как создать серверное приложение, способное управлять Navisworks через REST API. Мы разработаем плагин для Navisworks, создадим серверную очередь задач и реализуем механизм удаленного вызова команд. Это позволит автоматизировать работу с моделями и повысить эффективность обработки данных.

Разработка плагина под Navisworks

Создание библиотеки классов

Начнем с создания библиотеки классов на основе .NET Framework, предназначенной для работы с Navisworks. Для этого:

  1. Создадим новый проект типа Class Library (.NET Framework).
  2. Добавим зависимости на библиотеки Navisworks:
  • C:\Program Files\Autodesk\Navisworks Manage 2020\Autodesk.Navisworks.Api.dll
  • C:\Program Files\Autodesk\Navisworks Manage 2020\Autodesk.Navisworks.Automation.dll
  • C:\Program Files\Autodesk\Navisworks Manage 2020\Autodesk.Navisworks.Clash.dll

3. В свойствах данных DLL изменим параметр "Копировать локально" на False, чтобы исключить их из сборки.

После нам необходимо создать первую кнопку, которую в дальнейшем будем использовать для запуска на сервере

-2

Описание кода:

Этот класс NavisCommand представляет собой простую команду для Navisworks, которую можно использовать в серверной среде.

  1. Атрибут [Plugin]
  • Назначает классу имя " Bim.CommandForNavisOrchestration.NavisCommand", а также задаёт параметры для отображения в UI (например, ToolTip и DisplayName). И само имя команды -FirstCommand

2. Метод Execute

  • Основной метод, который запускает выполнение команды.
  • Вызывает метод ExecuteTask(parameters), который отвечает за выполнение задачи.
  • Использует try-catch, чтобы перехватывать ошибки. В случае успешного выполнения возвращает 0, иначе 1.

3. Метод ExecuteTask

  • В дальнейшем сюда можно добавить логику, например, экспорт данных, обработку коллизий и т.д. Для примера открываем приложение блокнота

Что дальше?

Теперь этот класс можно расширять, добавляя в ExecuteTask нужную функциональность. Также его можно использовать на сервере, вызывая его выполнение команды через REST API.

Но так же дополнительно расскажу как можно отладить плагины под NavisWorks
Первым делом необходимо задать целевую платформу x64

-3

Вторым действием "C:\Program Files\Autodesk\Navisworks Manage 2020\Roamer.exe" указать как запускаемую программу Navisworks.

-4

Третьим действием указать выходной каталог в этой папке “ C:\Program Files\Autodesk\Navisworks Manage 2020\Plugins\Имя плагина” – последняя папка должна равняться вашему пространству имен

-5

И самым последним действием перезапустить Visual studio от имени администратора для отладки плагинов Navis.

Таким образом мы подготовили наш плагин как для запуска локально, так и на сервере. Теперь переходим к серверной частию.

Серверная часть: управление задачами Navisworks

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

API-контроллер: NavisTaskController

Сначала необходимо создать контроллер с помощью которого мы будем добавлять элементы в очередь

-6

Описание NavisTaskController

NavisTaskController — это API-контроллер, который управляет очередью задач для выполнения в Navisworks. Он позволяет добавлять задачи через HTTP-запросы и автоматически запускать обработку с параллельным выполнением нескольких экземпляров Navisworks.

Как работает этот контроллер?

Метод Post

  • Принимает задачу в теле запроса (TaskRequest), проверяет, что переданное значение не пустое.
  • Добавляет задачу в очередь filesQueue.
  • Вызывает метод StartProcessing(), чтобы начать обработку задач.
  • Возвращает ответ, что задача успешно добавлена.
-7

Метод StartProcessing

  • Использует lock на queueLock, чтобы гарантировать, что обработка начнется только один раз, даже если поступает несколько запросов.
  • Если задачи еще не обрабатываются (isProcessing == false), запускает асинхронный метод ProcessQueue() в отдельном потоке.
-8

Метод ProcessQueue

  • Запускается в фоне и работает, пока очередь не станет пустой.
  • Берет следующую задачу (filePath) из очереди.
  • Использует SemaphoreSlim с ограничением 5, чтобы не запускать больше 5 задач одновременно.
  • Создает новый экземпляр NavisRunner и выполняет команду в Navisworks.
  • После выполнения команды закрывает экземпляр Navisworks (Kill()).
  • В случае ошибки освобождает семафор в блоке finally.
  • После завершения обработки всех задач сбрасывает флаг isProcessing = false, чтобы можно было запустить новую партию задач.

Ограничения данного подхода

  • Очередь хранится в памяти (ConcurrentQueue<string>), поэтому задачи теряются при перезапуске сервера.
  • Подходит только для одного сервера, так как многосерверная среда потребует внешнего брокера сообщений.
  • Нет механизма повторного выполнения задач в случае ошибки.

Как можно улучшить?

  • Использовать RabbitMQ или Kafka для хранения и управления задачами.
  • Добавить логирование для отслеживания ошибок.
  • Сделать систему мониторинга выполнения задач.

Этот контроллер позволяет запускать задачи в Navisworks через API, обеспечивая параллельное выполнение и автоматическое управление очередью.

-9

Описание NavisRunner

NavisRunner — это класс-обертка для работы с Navisworks в серверной среде. Он позволяет:

  • Автоматически запускать Navisworks в фоновом режиме.
  • Открывать файлы .nwf для обработки.
  • Выполнять заданную команду внутри Navisworks.
  • Закрывать экземпляр Navisworks после выполнения задачи.

Методы

NavisRunner() (конструктор)

  • Запускает новый экземпляр Navisworks и сохраняет его в поле navisApp.
  • Устанавливает Visible = false, чтобы скрыть интерфейс при работе на сервере.

ExecuteCommand(string filePath, string commandName)

Метод для выполнения команды внутри Navisworks.

  • filePath — абсолютный путь к файлу .nwf, который нужно открыть.
  • commandName — имя команды, которая будет выполняться (по умолчанию "Navis.Example.Command").

Что делает метод?

  1. Открывает указанный .nwf файл.
  2. Запускает команду Navisworks, используя ExecuteAddInPlugin.
  3. Обрабатывает возможные исключения, но не логирует их.

Kill()

Метод для корректного завершения работы Navisworks.

  • Вызывает Dispose() у navisApp, чтобы закрыть приложение.
  • Обрабатывает возможные ошибки без логирования.

Вывод

Мы разработали плагин для Navisworks, который можно вызывать через REST API. Этот подход позволяет автоматизировать выполнение команд и управлять Navisworks удаленно, что удобно для серверных решений и облачных платформ.