Tekla Structure API (c#): подключение и получение дерева объектов

Tekla Structure (см. оф.сайт) — система, автоматизирующая процесс проектирования зданий. При использовании её в больших компаниях естественным является желание интегрировать Tekl'у в уже существующую систему управления предприятием.

Итак, первая задача — получить дерево объектов модели. Дерево должно иметь следующий вид — модель -> сборки (Assembly), из которых состоит модель -> детали, из которых состоят сборки (Part). Дерево объектов должно быть получено из существующих чертежей, т.е. разбирать модель мы будем через призму списка чертежей (звучит малопонятно, но по ходу статьи все станет ясно).

Используемая система разработки Visual Studio 2013 Community, язык c#.

Tekla Structure имеет свой api и даже специальный StartUp Package (скачать его можно после регистрации на сайте), после установки которого, в директории, где установлена Tekla, появляются DeveloperGuide, справка по api и примеры.

После создания нового проекта, первым делом добавляем нужные *.dll в References. Для текущей задачи нам понадобятся следующие:
  1. Tekla.Structures.dll (общие функции)
  2. Tekla.Structures.Model.dll (для работы с самой моделью)
  3. Tekla.Structures.Drawing.dll (для работы с чертежами)

Подключение к Tekla Structure
Для подключения необходимо, чтобы Tekla Structure была запущена и в ней была открыта нужная модель.

...
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!");                   
        }

Получение списка чертежей


Было разработано два варианта получения списка
            ...
            DrawingEnumerator drawingsEnum;
            if (rbSelectedDrawings.Checked)
                drawingsEnum = CurrentDrawingHandler.GetDrawingSelector().GetSelected(); //получение чертежей, выбранных пользователем
            else
                drawingsEnum = CurrentDrawingHandler.GetDrawings();  //получение всех имеющихся чертежей
            ...

Построение дерева


Здесь особо стоит отметить метод получения объекта чертежа (Drawing) как объекта модели (Model), т.к. все сведения (состав, вес, длина, марки, материалы и т.д.) находятся именно в объекте модели.

Для сборки:

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

Для детали:

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

Для получения параметров из отчета, используется следующий метод: (все имеющиеся параметры можно посмотреть в Tekl'е при рассмотрении шаблона чертежа):

                    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); //получаем толщину детали
                    ...

Само построение дерева:

            ...
            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);
            }
            ...

Получение деталей сборки


Обратите внимание на то, что сборка имеет одну основную деталь assembly.GetMainPart() и много второстепенных assembly.GetSecondaries(). Нам нужно получить и те и другие.

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);
            }         
        }

Стоит заметить, что из всех деталей (Part) мы также можем получить дочерние элементы, используя метод:

ModelObjectEnumerator modelObjectEnum = part.GetChildren();

Первая задача решена.

Используемые при написании кода источники


  1. cadsupport.ru
  2. software-solutions-online.com
  3. topengineer.ru
  4. ну и, конечно, справка по api, example и другие данные, предоставляемые самой Tekl'ой
Поделиться публикацией

Комментарии 2

    0
    Для чего вы используете полученное дерево объектов?
      +1
      Мы автоматизируем работу отдела разработки технологий. Т.е. раньше разбор дерева модели, после того, как она была разработана конструкторами, происходил вручную (по чертежам) и все объекты (сборки, детали) с нужными параметрами, и их взаимосвязи, заводились в системе предприятия людьми. Теперь это происходит автоматически.

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое