Подскажите:
1. Как получить в документе список внешних ссылок на файлы деталей и сборок?
Правильно ли это делать через GetExternalFilesNamesEx?
2. Есть ли в детали и сборке внешние ссылки на файлы чертежей?
1.
function GetModelsFromDrawing(doc: IKompasDocument):TStringList; //doc - указатель на документ чертежа, api7
var
K5: KompasObject;
doc2D: ksDocument2D;
iAssociationViewParam: ksAssociationViewParam;
k_ViewAndLayersManager: IViewsAndLayersManager;
k_Views: IViews;
k_View: IView;
i: Integer;
SL: TStringList;
tempF: string;
begin
Result := nil;
K5 := KompasObject(CreateKompasObject);
if K5 = nil then
Exit;
if doc = nil then
Exit;
if doc.DocumentType <> ksDocumentDrawing then //1
Exit;
SL := TStringList.Create;
SL.Sorted := True;
SL.Duplicates := dupIgnore;
try
k_ViewAndLayersManager := (doc as IKompasDocument2D).ViewsAndLayersManager;
if k_ViewAndLayersManager = nil then
Exit;
k_Views := k_ViewAndLayersManager.Views;
if k_Views = nil then
Exit;
iAssociationViewParam := ksAssociationViewParam(K5.GetParamStruct(ko_AssociationViewParam));
if iAssociationViewParam = nil then
Exit;
iAssociationViewParam.Init;
doc2D := ksDocument2D(K5.ksGetDocumentByReference(doc.Reference)); //получение указателя на чертеж в api5 через api7
if doc2D = nil then
Exit;
for i := 1 to k_Views.Count -1 do //0 - главный вид. IAssociationView отсутсвует
begin
k_View := k_Views.View[i];
if doc2D.ksGetObjParam(k_View.Reference, iAssociationViewParam, ASSOCIATION_VIEW_PARAM) <> 0 then
tempF := iAssociationViewParam.fileName; //БЕЗ ПЕРЕМЕННОЙ НЕ ВЫЧИСЛЯЕТСЯ ДЛЯ СРАВНЕНИЯ!!!
if (not tempF.IsEmpty) then
SL.Add(tempF);
//если doc не нужен в дальнейшем для работы, то его можно закрыть здесь
//doc.Active := true;
//doc2D.ksCloseDocument; //закрывая doc2D закрываем doc
end;
K5 := nil;
//doc2D := nil;
iAssociationViewParam := nil;
k_ViewAndLayersManager := nil;
k_Views := nil;
k_View := nil;
Result := SL; //SL содержит ссылки на внешние документы
except
FreeAndNil(SL);
end;
end;
2. Нет.
дополнение:
1. При использовании метода GetExternalFilesNamesEx можно получить все внешние объекты (библиотека оформления.lyt, модели/сборки(m3d/a3d), модели стандартных изделий, библиотека типов атрибутов). Указатель на документ может быть любой (модель/сборка/чертеж/спецификация).
function GetExternal(doc: IkompasDocument): TStringList;
var
files, types: OleVariant;
array_size, idx: Integer;
begin
Result := nil;
if doc = nil then
Exit;
SL := TStringList.Create;
SL.Sorted := True;
SL.Duplicates := dupIgnore;
try
(doc as IKompasDocument1).GetExternalFilesNamesEx(True, files, types);
array_size := VarArrayHighBound(files, 1);
idx := 0;
while idx <> array_size + 1 do
begin
//if (types[idx] = ksEFTPartFile) or (types[idx] = ksEFTAssemblyFile) or (types[idx] = ksEFTModelsLibrary) then //если нужно искать по типу. Подключить ksConstTLB
SL.Add(files[idx]);
end;
Inc(idx);
Result := SL; //SL содержит ссылки на внешние документы
except
FreeAndNil(SL);
end;
end;