Tekla Structure API (c #): connecting and retrieving an object tree

Tekla Structure ( see off.site ) - a system that automates the process of building design. When used in large companies, it is natural to want to integrate Tekl into an existing enterprise management system.

So, the first task is to get a tree of model objects. The tree must have the following form - Model -> Assembly ( Assembly ), of which the model -> the details that make up the assembly ( Part ). The tree of objects must be obtained from existing drawings, i.e. we will disassemble the model through the prism of the list of drawings (it sounds obscure, but in the course of the article everything will become clear).

Used development system Visual Studio 2013 Community, c # language.

Tekla Structure has its own api and even a special StartUp Package (you can download it after registering on the site), after installing which, in the directory where Tekla is installed, DeveloperGuide, api help and examples appear.

After creating a new project, first of all add the necessary * .dll to References. For the current task, we need the following:
  1. Tekla.Structures.dll (common functions)
  2. Tekla.Structures.Model.dll (for working with the model itself)
  3. Tekla.Structures.Drawing.dll (for working with drawings)

Connecting to Tekla Structure
To connect, it is necessary that Tekla Structure is launched and the desired model is opened in it.

...
using Tekla.Structures;
using Tekla.Structures.Drawing;
using Tekla.Structures.Model;
...
        Model model;
        DrawingHandler CurrentDrawingHandler;
        public MainForm()
        {
            model = new Model();  //получаем доступ к модели
            CurrentDrawingHandler = new DrawingHandler();  //получаем доступ к чертежам
            //если подключение прошло успешно
            if (model.GetConnectionStatus() &&
                CurrentDrawingHandler.GetConnectionStatus())
            {
                InitializeComponent();
            }
            else
                MessageBox.Show("Tekla Structures must be opened!");                   
        }

Getting a list of drawings


Two options were developed to get the list.
            ...
            DrawingEnumerator drawingsEnum;
            if (rbSelectedDrawings.Checked)
                drawingsEnum = CurrentDrawingHandler.GetDrawingSelector().GetSelected(); //получение чертежей, выбранных пользователем
            else
                drawingsEnum = CurrentDrawingHandler.GetDrawings();  //получение всех имеющихся чертежей
            ...

Building a tree


Here, it is especially worth noting the method of obtaining a drawing object ( Drawing ) as an object of a model ( Model ), because All information (composition, weight, length, brands, materials, etc.) is located in the model’s object.

To build:

Assembly assembly = model.SelectModelObject(((drawingsEnum.Current as AssemblyDrawing)).AssemblyIdentifier) as Assembly; 

For detail:

Tekla.Structures.Model.Part part = model.SelectModelObject((drawingsEnum.Current as SinglePartDrawing).PartIdentifier) as Tekla.Structures.Model.Part;

To obtain parameters from the report, the following method is used: ( all available parameters can be viewed in Tekl when considering a drawing template ):

                    int number = 0;
                    assembly.GetReportProperty("MODEL_TOTAL", ref number); //получаем количество сборок модели
                    string assembly_pos = "";
                    assembly.GetReportProperty("ASSEMBLY_POS", ref assembly_pos); // получаем название сборки
                    double thickness = 0.0;
                    part.GetReportProperty("PROFILE.WIDTH", ref thickness); //получаем толщину детали
                    ...

The construction of the tree itself:

            ...
            NameElement = "";
            ProjectInfo projectInfo = model.GetProjectInfo(); // получаем свойства проекта - номер, имя, разработчик и т.д.
            ModelInfo modelInfo = model.GetInfo(); // получаем свойства модели - название и место нахождения файлов
            TreeNode parentNode = new TreeNode(); 
            parentNode.Text = projectInfo.ProjectNumber; //верхний уровень дерева - сама модель (отображаем её номер)
            while (drawingsEnum.MoveNext())   //перебираем полученные чертежи
            {            
                if (drawingsEnum.Current is AssemblyDrawing) // если это чертеж сборки
                {
                        Assembly assembly = model.SelectModelObject(((drawingsEnum.Current as AssemblyDrawing)).AssemblyIdentifier) as Assembly; 
                        string assembly_pos = "";
                        assembly.GetReportProperty("ASSEMBLY_POS", ref assembly_pos);                      
                        NameElement = assembly_pos;                     
                }
                else
                if (drawingsEnum.Current is SinglePartDrawing)  // если это чертеж детали    
                {              
                    Tekla.Structures.Model.Part part = model.SelectModelObject((drawingsEnum.Current as SinglePartDrawing).PartIdentifier) as Tekla.Structures.Model.Part;
                    string part_pos = "";
                    part.GetReportProperty("PART_POS", ref part_pos); 
                    NameElement = part_pos;  
                }
                TreeNode drawingNode = new TreeNode();
                drawingNode.Tag = drawingsEnum.Current;
                drawingNode.Text = NameElement;   
                if (drawingsEnum.Current is AssemblyDrawing)
                            AddChildDrawingObjectsToTreeNode(drawingNode, drawing as AssemblyDrawing); //процедура получает все дочерние элементы сборки                               
                parentNode.Nodes.Add(drawingNode);
            }
            ...

Getting assembly details


Note that the assembly has one main part assembly.GetMainPart () and many minor assembly.GetSecondaries (). We need to get both.

private void AddChildDrawingObjectsToTreeNode(TreeNode parentNode, AssemblyDrawing parentDrawing)
        {
            Assembly assembly = model.SelectModelObject(parentDrawing.AssemblyIdentifier) as Assembly;
            Tekla.Structures.Model.Part part = assembly.GetMainPart() as Tekla.Structures.Model.Part;
            string part_pos = "";
            part.GetReportProperty("PART_POS", ref part_pos);
            TreeNode objectNode = new TreeNode();
            objectNode.Tag = part;
            objectNode.Text = part_pos;
            parentNode.Nodes.Add(objectNode);
            ArrayList secondaries = assembly.GetSecondaries();
            for (int i = 0; i < secondaries.Count; i++)
            {
                Tekla.Structures.Model.ModelObject modelObject = secondaries[i] as Tekla.Structures.Model.ModelObject;
                part_pos = "";
                modelObject.GetReportProperty("PART_POS", ref part_pos);
                objectNode = new TreeNode();
                objectNode.Tag = modelObject;
                objectNode.Text = part_pos;
                parentNode.Nodes.Add(objectNode);
            }         
        }

It is worth noting that from all the details ( Part ) we can also get children using the method:

ModelObjectEnumerator modelObjectEnum = part.GetChildren();

The first problem is solved.

Sources Used When Writing Code


  1. cadsupport.ru
  2. software-solutions-online.com
  3. topengineer.ru
  4. and, of course, help on api, example and other data provided by Tekl itself

Also popular now: