API
CAD/CAM
October 2015 21

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.
-1
5.4k 10
Leave a comment