Tekla Structures API (Delphi): подключение и простые примеры

    Первоначально планировалось проводить интеграцию с Tekla Structures именно на Delphi. Но после того, как была проделана некоторая работа в этом направлении, было принято решение перейти на c# (см. Tekla Structure API (c#): подключение и получение дерева объектов).

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

    Подключение библиотек Tekla Structures


    Если программа Tekla Structures установлена корректно, то в Project->Import Type Library... находим:

    • Tekla_Structures (Version __)
    • Tekla_Structures_Model (Version __)

    Скорее всего, сразу они не установятся и придётся изменить несколько Class names. Не забудьте подключить Tekla_Structures_TLB и Tekla_Structures_Model_TLB в uses к проекту.

    Подключение к Tekla Structures


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

    procedure TeklaConnect;
    var
      appModel: TModel;
      pi: ProjectInfo;
      mi: ModelInfo;
      mainInfo: String;
    begin
      appModel := TModel.Create(self);  //подключение к открытой в Tekla модели
      if appModel.GetConnectionStatus then  //проверяем статус подключения
        begin  
            pi := appModel.GetProjectInfo; // получаем свойства проекта - номер, имя, разработчик и т.д.
            mi := appModel.GetInfo;   // получаем свойства модели - название и место нахождения файлов
            mainInfo := 'ModelName: ' + mi.ModelName;
            mainInfo := mainInfo + ' ModelPath: ' + mi.ModelPath;
            mainInfo := mainInfo + ' ProjectNumber: ' + pi.ProjectNumber;
        end
    end;
    

    Получение объектов модели


    Существует несколько вариантов получения объектов из модели:

    procedure TeklaConnect;
    var
       objEnum: ModelObjectEnumerator;
       appModel: TModel;
       mainInfo: String;
    begin
       ...
       objEnum := appModel.GetModelObjectSelector.GetAllObjects; //вариант №1 
       objEnum := appModel.GetModelObjectSelector.GetAllObjectsWithType(ModelObjectEnum_BEAM); //вариант №2
       mainInfo := mainInfo + ' Size: ' + IntToStr(objEnum.GetSize); 
    end;
    

    Обратите внимание, что во всех вариантах, элементы модели берутся с повторением, т.е. если сборка К-1 встречается в модели пять раз, то и в objEnum она встретиться столько же раз.

    Анализ полученных объектов модели


    procedure TeklaConnect;
    var
       appModel: TModel;   
       objEnum, objEnumChild: ModelObjectEnumerator;  
       objModel: ModelObject;
       BeamObject: Beam;
       objectInfo: String;
       p: Profile;
       m: Material;
       profile, material: WideString;
       length,profile_width: Double;
    begin
       objEnum := appModel.GetModelObjectSelector.GetAllObjects;
       while (objEnum.MoveNext) do
               begin
                    if objEnum.Current <> nil then
                        begin
                            objModel := objEnum.Current;
                            profile := '';
                            objModel.GetReportProperty('PROFILE',profile);  //информация о типе объекта - балка, двутавр, швеллер и др.
                            material := '';
                            objModel.GetReportProperty('MATERIAL',material);  //материал, из которого сделан объект  
                            length := 0.0;
                            objModel.GetReportProperty_2('LENGTH',length);  //длина
                            profile_width := 0.0;
                            objModel.GetReportProperty_2('PROFILE.WIDTH',profile_width);   //ширина  
                            objEnumChild := objModel.GetChildren;    //получаем все дочерние элементы                  
                        end;            
               end;
       //или для второго варианта
       objEnum := appModel.GetModelObjectSelector.GetAllObjectsWithType(ModelObjectEnum_BEAM);
       while (objEnum.MoveNext) do
               begin
                  BeamObject := objEnum.Current as Beam;          
                  if (BeamObject <> nil) then
                     begin
                        p := BeamObject.Profile;  //информация о типе объекта - балка, двутавр, швеллер и др.
                        m := BeamObject.Material; //материал, из которого сделан объект  
                        objectInfo := BeamObject.GetPartMark;
                        objectInfo := objectInfo + ' ' + p.ProfileString + ' ' + m.MaterialString;
                        objEnumChild := BeamObject.GetChildren; //получаем все дочерние элементы
                     end;
               end;
    end;
    

    При написании кода была использована справка по api, распространяемая вместе с Tekla Structures.
    Поделиться публикацией

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

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

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