Tekla OpenAPI FAQ

18. Может ли plug-in, или ConnectionBase, изменить свои входные параметры?

Plug-ins и ConnectionBase не могут изменять свои параметры!

19. В чем разница между приложением, плагином, и скриптом в TeklaStructures?

Plug-ins  — компоненты подключаемые в объектную модель приложения TeklaStructures, при этом когда меняется какой либо из параметров компонента, все объекты входящие в него пересоздаются в соответствии с новыми входными данными. Для корректной работы плагин должен быть скомпилирован под конкретную версию Теклы, иначе текла его не сможет подключить.

Приложение  — это самостоятельная программа которая может подключаться к Текле при необходимости и использовать все возможности TeklaAPI. Но для корректной работы оно так же должно быть скомпилировано под конкретную версию Теклы.

Script — это текстовый файл написанный на c# который текла может открыть, скомпилировать в виде .dll, и выполнить. По скольку он написан на c# то вы можете воспользоваться всеми возможностями объектной модели этого языка. Создавать формы, функции, классы, вызывать объекты и так далее.

20. Как узнать название открытой модели?

ModelInfo modelInfo = Model.GetInfo();

Свойство ModelName объекта modelInfo в результате корректного выполнения функции Model.GetInfo() будет содержать название модели. Если ни одной модели не открыто то в переменной будет пустая строка.

21. Можно ли получить доступ к функциям не перечисленным в Open API?

Да, можно попробовать записать скрипт с требумыми функциями, и запустить его из вашего приложения, или плагина.
Model.RunMacro("MyMacro.cs");

22. Почему GetReportProperty ничего не возвращает?

Прежде всего необходимо убедиться, что такое свойство действительно существует. Обычно имена свойств выглядят так: PROFILE.WIDTH.
И еще ref значение должно иметь подходящий тип. К примеру PROFILE.WIDTH вернет число а не строку.
double Thickness2 = 0.0;
modelPart.GetReportProperty("PROFILE.WIDTH", ref Thickness);

кстати: список полный список атрибутов доступных в текле по умолчанию можно найти в файле contentattributes_global.lst 
подробнее в в этой статье.

23. Как вставить компонет Текла в модель с помощью API

Следующий код иллюстрирует вставку из кода компонента «FloorTool» из библиотеки компонентов Tekla Structures:

const string PluginName = "FloorTool";
ArrayList points = new ArrayList { new Point(0, 0, 0), new Point(0, 6000, 0), new Point(7200, 6000, 0), new Point(7200, 0, 0) };
Polygon inputPolygon = new Polygon { Points = points };

ComponentInput componentInput = new ComponentInput();
componentInput.AddInputPolygon(inputPolygon);
Component component = new Component(componentInput) { Name = PluginName, Number = -100000 };

component.LoadAttributesFromFile("standard");
component.Insert();

24. Почему не вставляется профиль или плитка?

Вероятно в экземпляре класса не описаны какие-то важные свойства для того чтобы сработал метод Insert()
Например тип профиля, или толщина плитки, или начальная и конечная точки балки совпадают.
//This is in Default environment
beam.Profile.ProfileString = "HEA300";

25. В чем разница между координатными системами вида и чертежа когда создаешь виды на чертежах?

В объектой модели теклы предусмотрено несколько методов для создания вида на чертеже. Но все они требуют две системы координат в качестве обязательных аргументов:

public View(Tekla.Structures.Drawing.ContainerView View, Tekla.Structures.Geometry3d.CoordinateSystem ViewCoordinateSystem,Tekla.Structures.Geometry3d.CoordinateSystem DisplayCoordinateSystem, System.Collections.ArrayList PartList)

Разница между этими двумя системами в следующем:

View coordinate system — это система координат трехмерной модели.
Display coordinate system —  система координат в которой вид, в котором мы видим объекты из модели.

Пример можно найти в startUp Package в проекте — BasicViews.sln, ищите методы AddView и AddRotatedView.

26. Почему  .NET макрос выбрасывает исключение если с момента запуска окно несколько минут было открыто?

Это возможно с макросами которые используют akit интерфейс.

По умолчанию akit соединение длится совсем не долго. В порядке сохранения akit соединения онлайн на долгое время вам поможет следующий метод:  order to keep the akit link alive as long as your macro is running you need the next method:

Этот метод используется в MultiReportGenerator чтобы удостоверится что akit соединение всё время доступно. 

static Tekla.Technology.Akit.IScript akit; 
public static void Run(Tekla.Technology.Akit.IScript akit_in)
{
    System.Runtime.Remoting.Lifetime.ClientSponsor sponsor = null;
    try
    {
        sponsor = new System.Runtime.Remoting.Lifetime.ClientSponsor();
        akit = akit_in;
        sponsor.Register((System.MarshalByRefObject)akit);
        Application.Run(new ReportGenerator());
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message + "\n" + ex.StackTrace);
    }
    finally
    {
        if (sponsor != null)
        {
            sponsor.Close();
        }
    }
}

27. Как узнать какая версия Теклы запущена?

Версию сборки Теклы можно получить с помощью метода GetCurrentProgramVersion, из класа Model. Он возвращает строку содержащую версию и дату сборки.
string TSVersion = Model.GetCurrentProgramVersion();

28. Why I get the next message «Cannot load DLL dakit.dll: Given module not found.»?

Have you initialized the connection to the assembly you’re trying to use? eg. new Model() or new DrawingHandler()

29. Можно ли получить отчетные значения (report properties) в локальной системе кординат опрашиваемого объекта?

Нет, эти свойства всегда возвращаются в глобальной системе координат.

30. Привязка макросов к версии Tekla Structures. 

Если вы хотите перенести макров в новую версию Tekla Structures  необходимо перенести только файл с расширением .cs , dll и pdb переносить не следует, они создаются автоматически при вызове макроса, по сути dll — содержит ваш cs скрипт скомпилированный под конкретную версию Tekla Structures.

31. Как запустить внешнее приложение из Теклы?

Приложение можно запустить с помощью макроскрипта.
Он может быть выполнен из панели инструментов, или из диалога Toold>Macros.
Чтобы запутить приложение в скрипт надо добавить ссылку на System.Diagnostic.Process класс.
На приведенном ниже примере показано как запустить из Теклы Internet Explorer и открыть страницу Экстранета.
// Generated by Tekla.Technology.Akit.ScriptBuilder

using Tekla.Structures.Model;
using SD =System.Diagnostics;

namespace Tekla.Technology.Akit.UserScript {
    public class Script {
        public static void Run(Tekla.Technology.Akit.IScript akit)
        {
            SD.Process Process = new SD.Process();
            Process.EnableRaisingEvents=false;
            Process.StartInfo.FileName="iexplore";
            Process.StartInfo.Arguments="https://extranet.tekla.com";
            Process.Start();
        }
    }
}    

32. Как получить выборку объектов определенного типа в модели?

В приведенном примере формиуется список булевых объектов в модели (элементы подрезающие парты):
ModelObjectEnumerator BooleanEnum =
Model.GetModelObjectSelector().GetAllObjectsWithType(
ModelObject.ModelObjectEnum.BOOLEANPART);

33. Reading inp files without restarting TS.

You can read inp files without restarting Tekla Structures by setting XS_DYNAMIC_INPUT_FILE=TRUE, preferable in the …\TeklaStructures\<version>\nt\bin\user.ini file.

This will enable an «update» button in your inp dialog that when clicked will read your new inp file.

Please be careful when using this feature, since there can be problems, like some memory handling problems. So don’t use it during production, only to develop the dialogs for your plugins or custom components.

We don’t recommend to use this feature, but since many users know about it we want to warn you of the risks involved in using it.

Edit: please note that the inp name cannot contain any «_», this will cause the update to fail!

span/pdouble/span/div

34. Как добавить Tekla Component в модель с помощью Tekla Open API

Листинг:

const string PluginName = "FloorTool";
ArrayList points = new ArrayList { new Point(0, 0, 0), new Point(0, 6000, 0), new Point(7200, 6000, 0), new Point(7200, 0, 0) };
Polygon inputPolygon = new Polygon { Points = points };

ComponentInput componentInput = new ComponentInput();
componentInput.AddInputPolygon(inputPolygon);
Component component = new Component(componentInput) { Name = PluginName, Number = -100000 };

component.LoadAttributesFromFile("standard");
component.Insert();

в ComponentInput — нужно добавить все входящие данные из интерфеса, точки, ссылки на объекты и т.п.

Например, если вводные данные компонента, список точек в модели, выбранные пользователем то:

const string PluginName = «Test»;

ComponentInput componentInput = new ComponentInput();
componentInput.AddOneInputPosition(new TSG3D.Point(0,0,0));
componentInput.AddOneInputPosition(new TSG3D.Point(0,1000,0));
componentInput.AddOneInputPosition(new TSG3D.Point(1000,1000,0));
componentInput.AddOneInputPosition(new TSG3D.Point(1000,0,0));
TSM.Component component = new TSM.Component(componentInput) { Name = PluginName, Number = -100000 };

component.Insert();
const string PluginName = "DJhandrails";

35 Плагины, как добавить во входящие данные деталь.

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

        public override List DefineInput()
        {
            List PartList = new List();
            Picker _picker = new Picker();
            TSM.Beam beam1 = (TSM.Beam)_picker.PickObject(Picker.PickObjectEnum.PICK_ONE_PART);
            PartList.Add(new InputDefinition(beam1.Identifier));
            return PartList;
        }

        public override bool Run(List<InputDefinition> input)
        {
               // Get the Input parts to use in this part of the code
                Beam beam = (Beam)_model.SelectModelObject((Identifier)input[0].GetInput())
                ...
        }

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 *
Сайт