Tekla Structure API (c #): Verbinden und Abrufen eines Objektbaums

Tekla Structure ( siehe off.site ) - ein System, das den Prozess der Gebäudeplanung automatisiert. Beim Einsatz in großen Unternehmen ist es selbstverständlich, Tekl in ein bestehendes Unternehmensmanagementsystem integrieren zu wollen.

Die erste Aufgabe besteht also darin, einen Baum von Modellobjekten zu erhalten. Der Baum sollte die folgende Form haben - Modell -> Baugruppen ( Baugruppe ), aus denen das Modell besteht -> Details, aus denen Baugruppen ( Teil ) bestehen . Der Objektbaum muss aus vorhandenen Zeichnungen erhalten werden, d.h. Wir werden das Modell durch das Prisma der Zeichnungsliste analysieren (es klingt dunkel, aber wenn der Artikel fortschreitet, wird alles klar).

Verwendetes Entwicklungssystem Visual Studio 2013 Community, Sprache c #.

Tekla Structure hat eine eigene API und sogar ein spezielles Startup-Paket (das Sie nach der Registrierung auf der Site herunterladen können). Nach der Installation werden in dem Verzeichnis, in dem Tekla installiert ist, DeveloperGuide, API-Hilfe und Beispiele angezeigt.

Fügen Sie nach dem Erstellen eines neuen Projekts zunächst die erforderliche * .dll zu den Referenzen hinzu. Für die aktuelle Aufgabe benötigen wir Folgendes:
  1. Tekla.Structures.dll (gemeinsame Funktionen)
  2. Tekla.Structures.Model.dll (für die Arbeit mit dem Modell selbst)
  3. Tekla.Structures.Drawing.dll (zum Arbeiten mit Zeichnungen)

Herstellen einer Verbindung zu Tekla Structure
Zum Herstellen einer Verbindung muss Tekla Structure gestartet und das gewünschte Modell darin geöffnet werden.

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

Liste der Zeichnungen abrufen


Es wurden zwei Optionen entwickelt, um die Liste zu erhalten.
            ...
            DrawingEnumerator drawingsEnum;
            if (rbSelectedDrawings.Checked)
                drawingsEnum = CurrentDrawingHandler.GetDrawingSelector().GetSelected(); //получение чертежей, выбранных пользователем
            else
                drawingsEnum = CurrentDrawingHandler.GetDrawings();  //получение всех имеющихся чертежей
            ...

Einen Baum bauen


Besonders hervorzuheben ist hier die Methode, ein Zeichenobjekt ( Drawing ) als Objekt eines Modells ( Model ) zu erhalten, weil Alle Informationen (Zusammensetzung, Gewicht, Länge, Marken, Materialien usw.) befinden sich im Objekt des Modells.

Zu bauen:

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

Für Details:

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

Um Parameter aus dem Bericht zu erhalten, wird die folgende Methode verwendet: ( Alle verfügbaren Parameter können in Tekl angezeigt werden, wenn eine Zeichnungsvorlage berücksichtigt wird. )

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

Die Konstruktion des Baumes selbst:

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

Montagedetails abrufen


Beachten Sie, dass die Assembly einen Hauptteil assembly.GetMainPart () und viele untergeordnete Assembly.GetSecondaries () enthält. Wir müssen beides bekommen.

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

Es ist erwähnenswert, dass wir aus allen Details ( Teil ) auch Kinder mit der Methode bekommen können:

ModelObjectEnumerator modelObjectEnum = part.GetChildren();

Das erste Problem ist gelöst.

Quellen, die beim Schreiben von Code verwendet werden


  1. cadsupport.ru
  2. software-solutions-online.com
  3. topengineer.ru
  4. und natürlich Hilfe zu API, Beispielen und anderen Daten, die Tekl selbst zur Verfügung stellt

Jetzt auch beliebt: