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.

ссылка на оригинал статьи http://habrahabr.ru/post/262333/