Внешние ссылки документа

Автор PS, 15.04.18, 09:04:52

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

PS

15.04.18, 09:04:52 Последнее редактирование: 15.04.18, 09:37:42 от PS
Подскажите:
1. Как получить в документе список внешних ссылок на файлы деталей и сборок?
Правильно ли это делать через GetExternalFilesNamesEx?
2. Есть ли в детали и сборке внешние ссылки на файлы чертежей?

SerGoVec

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

SerGoVec

дополнение:

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;

+ Благодарностей: 2