как получить информацию по каждому файлу внутри сборки?

Автор posdnyaa, 18.08.15, 14:10:47

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

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

posdnyaa

подскажите, пожалуйста, как получить информацию по каждому файлу внутри сборки не открывая каждый из них?
Т.е. я понимаю как вытащить инфу из активного файла:


var
KompasAPI: IApplication;
doc: IKompasDocument;

begin

  KompasAPI := IDispatch(CreateKompasApplication) as IApplication;
  doc := KompasAPI.ActiveDocument;

и дальше из этого doc получаю все нужные свойства.


var
    PropMng: IPropertyMng;
    PropKeep: IPropertyKeeper;

begin
PropMng := KompasAPI As IPropertyMng;
    PropKeep := getPropertyKeeper(doc);

     for i := 0 to 23 do
    begin
      Prop := PropMng.GetProperty(doc, i) as IProperty;
      PropKeep.GetPropertyValue(Prop, v2, false, b1);
      text := string(Prop.name) + ' = ' + string(v2);
      LogForm1.LogText.Lines.Add(text)
    end;
end

А как в этот doc "загрузить" не активный документ, а а другой документ, зная путь к его файлу?
Спасибо.

Slaviation

В сборке перебираете ее компоненты (IPart7). От каждого компонента получаете PropertyKeeper и читаете свойства компонента не открывая его документ.

Из справки SDK:
ЦитироватьПримечание:
Дополнительный интерфейс. Данный интерфейс можно получить у IPart7 ...

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

posdnyaa

Спасибо, но вопрос на новичка:
Можно пример простенький?

Я не могу понять, как вместо активного документа в doc записать имя файла?
Т.е. на что поменять строку doc := KompasAPI.ActiveDocument; чтобы в любой момент "дёрнуть" неактивный файл?

Slaviation

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

posdnyaa

Я очень извиняюсь, но в Питоне я ноль вообще.
Вот мой пример из Делфи:

Есть открытая сборка.
Этот код берет её и показывает ее свойства. Здесь нет проблем (LogForm1 - это Мемо, в который записываю информацию)
procedure ShowPropValue(doc: IKompasDocument);
var
  PropMng: IPropertyMng;
  PropKeep: IPropertyKeeper;
  doc2d: IKompasDocument2D;
  doc3d: IKompasDocument3D;
  ass: IPart7;
  Prop: IProperty;
  i: integer;
  v2: OleVariant;
  b1: WordBool;
  text: string;
begin
  PropMng := KompasAPI As IPropertyMng;
  doc3d := doc as IKompasDocument3D;
  PropKeep := doc3d.TopPart as IPropertyKeeper;

  Application.CreateForm(TLogForm1, LogForm1);

  for i := 0 to 23 do
  begin
    Prop := PropMng.GetProperty(doc, i) as IProperty;
    PropKeep.GetPropertyValue(Prop, v2, false, b1);
    text :=FloatToStr(Prop.Id) + ' '+ string(Prop.Name) + ' = ' + string(v2);
    LogForm1.LogText.Lines.Add(text)
  end;
  LogForm1.ShowModal;
end;


Усложняю. Получаю файлы (с путем к ним) внутри сборки. Это работает без проблем.
procedure test(doc: IKompasDocument);
var
  doctype: integer;
  pPart7: IPart7;
  pParts7: IParts7;
  pPartsEx: variant;
  pModelObject: IModelObject;
  ksAllParts: variant;
  iii: PAnsiChar;
  i1, ii: integer;
  i: integer;
  v2: OleVariant;
  b1: WordBool;
  doc3d: IKompasDocument3D;
  mytext: string;
begin

  PropMng := KompasAPI As IPropertyMng;
  doc3d := doc as IKompasDocument3D;
  PropKeep := doc3d.TopPart as IPropertyKeeper;
  pPart7 := doc3d.TopPart;
  pPartsEx := pPart7.PartsEx[ksAllParts];
  Application.CreateForm(TLogForm1, LogForm1);

  If VarType(pPartsEx) = (VT_ARRAY or VT_DISPATCH) then
    pModelObject := IDispatch(pPartsEx[0]) as IModelObject;
  i1 := VarArrayHighBound(pPartsEx, 1);

  pPart7 := pModelObject.Part;
  pParts7 := pPart7.Parts;
  LogForm1.LogText.Lines.Add('Вх. файлов: ' + IntToStr(pParts7.Count));

  for ii := 0 to pParts7.Count - 1 do
  begin
    LogForm1.LogText.Lines.Add(pParts7.Part[ii].FileName);
  LogForm1.ShowModal;
end;

А дальше то, что не получается. Получить свойства для каждого файла внутри сборки.
В цикл for ii := 0 to pParts7.Count - 1 do добавляю код получения всех 23-х свойств.

for ii := 0 to pParts7.Count - 1 do
  begin
    LogForm1.LogText.Lines.Add(pParts7.Part[ii].FileName);

    for i := 0 to 23 do
    begin
      Prop := PropMng.GetProperty(doc, i) as IProperty;
      PropKeep.GetPropertyValue(Prop, v2, false, b1);
      mytext := FloatToStr(Prop.Id) + ' ' + string(Prop.Name) + ' = ' +
        string(v2);
      LogForm1.LogText.Lines.Add(mytext)
    end;
  end;


Проблема в том, что в строке
Prop := PropMng.GetProperty(doc, i) as IProperty;
стоит doc, в котором находится сборка (ну и все свойства её соответственно).

Я понять не могу как сюда детали из сборки положить (pParts7.Part[ii]).
Подскажите, пожалуйста.

Slaviation

for ii := 0 to pParts7.Count - 1 do
  begin
    LogForm1.LogText.Lines.Add(pParts7.Part[ii].FileName);
   
    PropKeep := pParts7.Part[ii] as IPropertyKeeper; //Добавить эту строку

    for i := 0 to 23 do
    begin
+ Благодарностей: 1

posdnyaa

Спасибо.
Еще вопрос.
Задача: в дополнение к этой процедуре проверить тип файла doctype := ksGetDocumentType(doc.Reference);
Вот фрагмент, работающий с активным файлом:
doctype := ksGetDocumentType(doc.Reference);
  if doctype = lt_DocSheetStandart then
    ksMessage('чертеж стандартный');
  if doctype = lt_DocSheetUser then
    ksMessage('чертеж нестандартный');
  if doctype = lt_DocAssemble3D then
    ksMessage('сборка');
  if doctype = lt_DocPart3D then
    ksMessage('деталь');
  if doctype = lt_DocSpc then
    ksMessage('спецификация');


А как получить doctype (чтобы потом также его проверить) для перебираемых файлов, которые я не открываю (из состава сборки, например) ?
Такой тупой вариант, как doctype := ksGetDocumentType(pParts7.Part[ii] as IKompasDocument); не проходит.
Опять надо doc заменять на что-то.
Среди свойств и методов pParts7.Part[ii] - не нашел, и PropKeep этого не хранит.
Подскажите, пожалуйста, как получить тип документа в формате для сравнения с lt_DocSheetStandart, lt_DocAssemble3D  и т.д.?

Slaviation

Наверно так:
Документ, принадлежащий pParts7.Part[ii] может быть только 3D-моделью, поэтому прочие типы можно отбросить.
Если pParts7.Part[ii].Detail = True, то тип его документа lt_DocPart3D.
Если pParts7.Part[ii].Detail = False, то тип его документа lt_DocAssemble3D или lt_DocTechnologyAssemble3D. Эту пару можно распознать по расширению из pParts7.Part[ii].Detail.FileName.



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

СергейМартыненко


pr0100

Цитата: Slaviation от 19.08.15, 10:05:41
Пример и и его листинг (python).


Тоже самое только на Python3, для работы в 17й версии.
+ Благодарностей: 1