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.

Tekla OpenAPI FAQ: 13 комментариев

  1. Андрей 30.05.2014 at 05:15

    оочень хочу научится писать приложения для теклы где можно найти материал на эту тему?

    • Mihail 16.09.2014 at 21:36

      В принципе вся информация опубликована на портале теклы:
      http://extra.tekla.com

      Естественно на иностранном. :/ но хочешь научиться, придется изучать всё равно.

  2. nikolay 19.01.2015 at 11:21

    Не подскажете если какая нибудь возможность получить инструменты для создания параметрических узлов через OPEN TEKLA API не имея лицензии. Буду очень благодарен за ответ. Моя почта shjin777собакаgmail.com

    • DonJad 27.02.2015 at 17:04

      Да, все инструменты в текле есть. Для того чтобы начать работать достаточно подключить в проект на C# следующие библиотеки:

      Tekla.Structures.dll — основная библиотека, обязательная для работы с текла с помощью C#.
      Tekla.Strucutes.Geometry.dll — содержит классы для работы с геометрией — точки, вектора, их вращение и т.п.
      Tekla.Structures.Dialog.dll — с помощью этой библиотеки можно подключиь стандартные диалоги для ваших АПИ компонентов.
      Tekla.Structures.Drawgin.dll — здесь классы для работы с чертежами
      Tekla.Structures.Model.dll — классы для работы с моделью.
      Tekla.Structures.Plugins.dll — классы для написания компонента на C#
      Tekla.Structures.Catalog.dll — классы для работы с каталогами (профилей, материалов, болтов)

      лежит это богатство тут:
      ..\TeklaStructures\19.0\nt\bin

      еще не помешает reference c описанием и примеры.

  3. Дмитрий 17.06.2016 at 17:38

    Здравствуйте.
    В Текле все профили в библиотеке поделены на группы (двутавры, тавры, швеллеры и т.д.), дальше в группах дополнительные параметры (деление по ГОСТ или типа того) ну и потом сам профиль.
    Есть ли возможность прочитать какие группы уже есть, и какие госты в них записаны, ну и дальше какие профили созданы в самих групах гостов?
    И есть ли возможность через API создавать такие сечения динамически?
    Спасибо большое

    • DonJad 21.06.2016 at 21:38

      Можно создать .lis файл.
      Апи для этого не нужно, достаточно изучить параметры самих профилей в файле.
      А потом уже создать приложение которое сгененирирует нужные профиля, со всеми атрибутами.

      • Дмитрий 22.06.2016 at 22:51

        С генерацией .lis файлов проблемы не было, спасибо 🙂

  4. Алексей 30.08.2016 at 19:26

    Добрый день!
    Подскажите, как правильно создать пользовательский компонент с использованием C# VisualStudio? Где взять его имя, входные параметры? Как изменить программно открытые для редактирования его параметры?

    • DonJad 08.02.2017 at 12:00

      http://cadsupport.ru/tekla-api-faq/2/#insert-tekla-component-api

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

  5. Дмитрий 08.02.2017 at 00:15

    Доброго времени суток!
    С Текловским Open Api работаю уже несколько лет, в данный момент пишу плагин для работы с Tekla Analysis.
    Столкнулся со следующей проблемой — вытягиваю из модели AnalysisPart, далее фрагмент кода (TSA заменил Tekla::Structures::Analysis для упрощения):

    TSA::Analysis^ _analysis = gcnew TSA::Analysis();

    TSA::AnalysisObjectSelector^ _analysisObjectSelector = _analysis->GetAnalysisObjectSelector();

    TSA::AnalysisObjectEnumerator^ analysisObjectEnumerator =
    _analysisObjectSelector->GetAllObjectsWithType(TSA::AnalysisObject::AnalysisObjectEnum::ANALYSIS_PART, _analysisModelName);

    if (analysisObjectEnumerator != nullptr)
    {
    for each (TSA::AnalysisPart^ nextPart in analysisObjectEnumerator)
    {
    nextPart->AnalysisPartBarAttributes->BarStartCondition->EccentricityMode =
    TSA::AnalysisPartEnd::EccentricityModeEnum::ECCENTRICITY_MODE_MANUAL;

    nextPart->AnalysisPartBarAttributes->BarStartCondition->Eccentricity->X = 1.23;

    }

    nextPart->Modify();
    }
    то-есть — перебираю каждый и устанавливаю для них определенные параметры, для упрощения понимания оставил два.
    Затем, естественно каждому делаю Modify.
    Странность состоит в том, что после отработки плагина в AnalysisPart данные не появляются.
    Или я что-то неправильно делаю, или Текловцы API не дописали почеловечески.
    Во всяком случае для физической модели я делаю нечто подобное и там данные обновляются.
    Посоветуйте, пожалуйста где я допустил ошибку?

    • DonJad 08.02.2017 at 11:52

      Если открыть справку по API, даже в 2016i — можно обратить внимание, что раздел Analysis — документирован крайне слабо по сравнению с другими разделами. И сформирован по сути автоматически, представляя собой просто список методов и свойств.

      Лично я пока не рассматриваю Tekla Structures в качестве расчетного пакета, потому в эту сторону даже не смотрю. Как я понимаю это задел на будущее, которое пока не наступило.

      В целом то, что метод Modify() не срабатывает — странно. Нечто похожее встречалось в 18.1 — не срабатывал медот Modify для DwgObject в разделе Drawing.

      Так что как вариант — можно попробовать исполнить код в другой версии Теклы.

  6. Дмитрий 17.04.2017 at 11:38

    Уже разобрался со своей проблемой, описанной выше: оказывается нужно обязательно удалять модель анализа

    String^ analysisModelName = _analysisModel->AnalysisModelName;

    String^ analysisEngineName = _analysisModel->AnalysisEngine;

    _analysisModel->Delete();

    и затем создать новую с таким-же именем и необходимыми параметрами (сохранив их предварительно)

    _analysisModel = gcnew Tekla::Structures::Analysis::AnalysisModel();

    _analysisModel->AnalysisModelName = analysisModelName;

    _analysisModel->AnalysisEngine = analysisEngineName;

    _analysisModel->AnalysisObjectType = Tekla::Structures::Analysis::AnalysisObject::AnalysisObjectEnum::ANALYSIS_MODEL;

    _analysisModel->MemberAxislocation = Tekla::Structures::Analysis::AnalysisModel::AxisLocationEnum::REFERENCE_AXIS;

    _analysisModel->Insert();

    теперь данные в AnalysisPart появляются стабильно.

Добавить комментарий

Имя *
E-mail *
Сайт