Tekla OpenAPI FAQ

Оглавление

1. Для чего применяется Tekla OpenAPI?

Tekla Structures Open API применяется для разработки приложений (*.exe), плагинов (*.dll), макросов и скриптов (*.cs) и COM приложений например VBA макросов.
Макросы и скрипты сохраняются в виде обычного текстового файла,  компилируются и исполняются из основного приложения tekla, (Tools->Macros)
Любой набор действий пользователя в Текле так же может быть сохранён в качестве скрипта и «проигран» позднее. Это позволяет автоматизировать огромное множество рутинных операций. Как установить и запустить скрипт смотри тут. Как записать собственный скрипт можно узнать здесь.
Типичный результат записи скрипта выглядит так:
namespace Tekla.Technology.Akit.UserScript
 {
   public class Script
    {
      public static void Run(Tekla.Technology.Akit.IScript akit)
      {
       akit.Callback("acmd_display_attr_dialog", "detail_dial", ""main_frame");
       akit.PushButton("butDetailSymbol_on_off", "detail_dial");
       akit.PushButton("butDetailSymbol_on_off", "detail_dial");           
       akit.ValueChange("detail_dial", "lbltxtDetailLabelIndexStart", "1");
       akit.PushButton("butDetailSymbol_modify", "detail_dial");
       akit.PushButton("butDetailSymbol_ok", "detail_dial");
      }
  }
}
Сначала идет объявление обязательного заголовка а дальше
akit.Callback(«acmd_display_attr_dialog», «detail_dial», «»main_frame»);  // запустить диалог редактирования марки детали на чертеже
akit.PushButton(«butDetailSymbol_on_off», «detail_dial»);  // нажать кнопку on/off
akit.PushButton(«butDetailSymbol_on_off», «detail_dial»);  // еще раз ту же кнопку, глюк деталей для них требуется нажимать из скрипта дважды, иначе выбор не сбросится.
akit.ValueChange(«detail_dial», «lbltxtDetailLabelIndexStart», «1»);  // присвоить детали имя 1
akit.PushButton(«butDetailSymbol_modify», «detail_dial»); // нажать кнопку — изменить
akit.PushButton(«butDetailSymbol_ok», «detail_dial»); // нажать кнопку ОК, закрыть диалог.

2. Как узнать тип выбранного объекта?

В примере условием проверяем соответствует ли объект тому типу, что нужен нам.

     while(myEnum.MoveNext())
     {
         Beam myBeam = myEnum.Current as Beam;

         If (myBeam != null)
         {
             // beam selected, add code for beam here
         }
     }

myEnum — это список объектов Текла. Beam — класс балок TeklaStructures, myBeam — объект класса Beam, которому мы присваиваем текущий объект из списка, как балку. Если в результате myBeam — не равен null, т.е. содержит ссылку на представление балки в Текле, то запускаем код программы. Если же он пуст, берем следующий объект из списка myEnum. И далее по кругу, пока myEnum.Next() не вернет false, т.е. список закончится.

3. Как получить номер позиции или сборки?

С помощью функции GetReportProperty(string name, ref string)
первый аргумент это имя параметра, второй — ссылка объявленную строковую переменную в которую будет возвращен результат выполнения функции.

    Beam B = new Beam(point, point2);

    string AssPos = "";

    if(!B.GetReportProperty("ASSEMBLY_POS", ref AssPos))
        Console.WriteLine("GetReportProperty failed!!!");

4. Какие именно свойства объектов можно получить с помощью GetReport?

Полный список параметров для запроса можно найти тут: contentattributes_global.lst в папке environments/%env%/template/settings.

Но лично я нашел его тут:

C:\Program Files\Tekla Structures\19.0\nt\TplEd\settings

5. Какой аргумент нужно использовать для метода GetObjectsByFilterName чтобы получить сборки(assembly)?

Необходимо использовать сохраненный файл выбора из Object group диалого (
You have to pass the name of the saved attribute file defined in the Object group dialog (the dialog can be opened for instance from the «Object representation» dialog or from the «Setup->Select filter..» menu). Please check that the extension of the used file is correct (*.SObjGrp).

6. Как получить размеры профиля, например толщину полки?

Параметры профиля можно запросить с помощью функции GetReportProperty()
Для получения параметров профиля можно использовать параметры «DIM_A» и «DIM_B», что то типа такого:  Beam.GetReportProperty(«DIM_A», ref Variable); 
Вернёт вам в переменную Variable  высоту профиля.
Полный список параметров которые можно запросить можно найти в файле contentattributes_global.lst

13. Запросить от пользователя данные из Теклы во время выполнения программы.

С помощью класса Picker() можно запросить у пользователя ввод данных из Теклы. Например задать точки в модели или на чертеже, либо выбрать какие-то объекты.
    try
    {
        Picker picker = new Picker();
        Tekla.Structures.Point p1 = picker.PickPoint();
    }
    catch(Exception e)
    {
        return;   // cancelled etc.
    }

14. Топ-5 причин ошибок при выполнении программы.

  1.  Либо в Текле не открыта Модель либо сама программа Tekla Structures не запущена
  2.  Не было установлено соединение с моделью/чертежом для вызова модели надо использовать запись вида: Model myModel = new Model();Так же необходимо использовать проверки Model.GetConnectionStatus() (возвращает true если соединение было установлено) илиDrawingHandler.GetConnectionStatus() — для чертежей, до того как запускать основной код программы.
  3. Tekla.Structures.Model использованы не подходящие reference.
  4. Несовместимые типы объектов. Ну например вы пытаетесь присвоить строке численное значение. Или например точка из TeklaStructures.3dGeometry.3dPoint, не соответствует точке System.Geometry.Point.
  5. Добавление объекта или его выбор вернуло ошибку по одной из следующих причин:
    • a. Пользовательский компонент не найден A custom component is not found from the model; or,
    • b. «boolean part operative class» не соответствует «BooleanPart.BooleanOperativeClassName» во вставленном объекте.

Не забывайте использовать try-catch

15. Как назначить изображение для плагина?

Растр должен иметь имя вида: et_element_<pluginname>.bmp
И лежать в папке  ….\TeklaStructures\<version>\nt\bitmaps\  
В этом случае текла автоматически подхватит его и назначит в качестве растра для плагина.

16. Как подхватить объект в модели, если он выделен на чертеже?

В этом нелегком деле поможет следующий код:

TSM.ModelObject selectedObject = 
  Model.SelectModelObject(partInTheDrawing.ModelIdentifier);

17. В чем разница между PluginBase и ConnectionBase.

Plug-in  — компонент, это значит, что он пересоздаётся заново в случае изменения каких-либо параметров компонента.

ConnectionBase это базовый класс для определения подключения, деталей и швов. Эти типы более специализированы и ограничен входными значениями полученными от PluginBase.