Первоначально планировалось проводить интеграцию с Tekla Structures именно на Delphi. Но после того, как была проделана некоторая работа в этом направлении, было принято решение перейти на c# (см. Tekla Structure API (c#): подключение и получение дерева объектов).
Возможно, кому-то пригодится результат, полученный при работе с Delphi.
Если программа Tekla Structures установлена корректно, то в Project->Import Type Library... находим:
Скорее всего, сразу они не установятся и придётся изменить несколько Class names. Не забудьте подключить Tekla_Structures_TLB и Tekla_Structures_Model_TLB в uses к проекту.
Для подключения необходимо, чтобы Tekla Structures была запущена и в ней была открыта нужная модель.
Существует несколько вариантов получения объектов из модели:
Обратите внимание, что во всех вариантах, элементы модели берутся с повторением, т.е. если сборка К-1 встречается в модели пять раз, то и в objEnum она встретиться столько же раз.
При написании кода была использована справка по api, распространяемая вместе с Tekla Structures.
Возможно, кому-то пригодится результат, полученный при работе с 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.