Первоначально планировалось проводить интеграцию с 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/
Добавить комментарий