Featured image of post Headless? Ты что, голову дома забыл?

Headless? Ты что, голову дома забыл?

Следующий уровень в автоматизации

BimPublisher как автоматизация

Для Tekla есть самый популярный вариант полной автоматизации - это BimPublisher. Из названия понятно, что BimPublisher предназначен для публикации чего-то. И его даже можно использовать для других задач, не относящихся к экспорту. Для этих задач мы можем использовать макросы, которые запускаются перед экспортом (в BimPublisher это Run these macros before exports) и после экспорта (в BimPublisher это Run these macros after exports). Пример такой автоматизации можно найти в статье из раздела Tekla User Assistance про автоматическое обновление моделей из Model Sharing.

Проблема BimPublisher

Почему бы тогда не остановится на BimPublisher и пользоваться им для наших задач, зачем что-то придумывать? Проблема в том, что BimPublisher запускает Tekla с UI, который нужен человеку. Но у нас-то не будет никакого человека, который будет пользоваться Tekla, Tekla будет использоваться программой - т.е. нашим скриптом. Следовательно UI нам не нужен, но запуск Tekla и открытие модели большей частью состоит из загрузки UI.

Headless Tekla

Решением проблемы является Headless Tekla, пример можно найти в официальном репозитории Trimble на GitHub. Headless Tekla находится в сборке Tekla.Structures.Service, а ее API не выпущен официально, поэтому в справке отсутствует документация. Но благодаря примеру можно быстро разобраться что к чему. Немного изменю файл Program.cs из примера и приведу его здесь с комментариями:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var binDir = $@"C:\TeklaStructures\2022.0\bin";

// Подписка на событие, которое возникает, когда не найдена dll. 
// Поскольку при запуске Tekla нужно много dll из папки /bin/, 
// мы их не копируем к нашему исполняемому файлу, 
// а просто указываем где .Net Framework искать dll, 
// которую он не нашел в папке с исполняемым файлом.
AppDomain.CurrentDomain.AssemblyResolve += 
    (_, args) => FindAssembly(args, binDir);

// Создаем экземпляр headless tekla, в этот момент происходит запуск Tekla
using var service = new TSS.TeklaStructuresService(
    new DirectoryInfo(binDir),
    "ENGLISH",
    new FileInfo(
        $@"C:\TeklaStructures\2022.0\Environments\default\env_Default_environment.ini"
    ),
    new FileInfo($@"C:\TeklaStructures\2022.0\Environments\default\role_Steel_Detailer.ini")
);

var modelPath = @"C:\TeklaStructuresModels\test-model";
service.Initialize(new DirectoryInfo(modelPath));

// После инициализации Tekla нам доступен API
Console.WriteLine($"Connected: {new TSM.Model().GetConnectionStatus()}");
Console.WriteLine($"Model name: {new TSM.Model().GetInfo().ModelName}");
Console.ReadKey();

return;

static Assembly FindAssembly(ResolveEventArgs args, string binDir)
{
    var requestedAssembly = new AssemblyName(args.Name);
    var dllPath = Path.Combine(binDir, requestedAssembly.Name + ".dll");
    return File.Exists(dllPath) ? Assembly.LoadFile(dllPath) : throw new ArgumentException();
}

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

This work is licensed under CC BY-NC-SA 4.0
Обновлено 21 Feb 2024 07:00 UTC
Создано при помощи Hugo
Тема Stack, дизайн Jimmy