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()) … }

36 Как получить список выбраных чертежей из списка Drawing List.

var CurrentDrawingHandler = new TSD.DrawingHandler(); //получаем доступ к чертежам

var drawingsEnum = CurrentDrawingHandler.GetDrawingSelector().GetSelected(); //получение чертежей, выбранных пользователем

while(drawingsEnum.MoveNext()) //перебираем перебираем полученый список
{
var _drawing = drawingsEnum.Current as TSD.Drawing;  //получили доступ к конкретному чертежу.
string some_string = string.Empty;
_drawing .GetUserProperty(«Default», ref some_string );//сделаем с ним что нибудь, например получим UDA.

MessageBox.Show(some_string ); //И выведем его, чтобы убедится что все работает.
}