независимая экранная копия детали/сборки/документа в realtime работе с Компас

Автор SerGoVec, 12.04.16, 15:45:19

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

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

SerGoVec

Всем привет!

Вот задался вопросом: можно ли сделать независимую экранную копию (клон) детали/сборки/документа в realtime работе с Компас. Что я имею ввиду - предположим пользователь работает со сборкой (a3d) в Компас и меняет геометрию, атрибуты как самой сборки, так и частей сборки (творческий процесс). При этом, он не сохраняет изменения, а хочет сделать экспорт, то есть полную копию того, что он видит на экране (выгрузку в другой каталог, отличный от каталога, где лежит оригинальня сборка, с которой он работает) и, при этом, после выгрузки, активный документ в компасе, сбока и ее части, это та самая сборка, с которой он изначально работал, а сохранит он изменения в ней или нет это уже его дело. По факту, у пользователя Компас есть выгруженная сборка со всеми изменениями на момент выгрузки и активный документ (сборка и части) находящийся в памяти компас, не имеющий никакого отношения к экспортированной сборке.

Еще один пример: Пользователь создает сборку, она в памяти компаса, не сохранена и пути ее расположения нет. Пользователь накидывает в эту сборку частей (компонент) из разных мест. Сборка в памяти. Потом он ее экспортирует. Потом он еще накидывает компонет, меняет их геометрию, некоторые компоненты удаляет и сохраняет сборку. У него должны быть 2 независимые сборки - экспортированная и сохраненная.

Вот, надеюсь суть понятна. Можно ли сдлать? если да, то как, куда копать?)

Можно посмотреть в сторону KompasInvisible - ksInvisible.exe, но файл сборки должен иметь имя, чтобы его можно было в невидимом режиме параллельно загрузить и сохранить, как душе угодно.


SerGoVec

не пинайте если глупый вопрос). Предположим я открыл параллельно сборку. У меня два процесса: один - компас со брокой 1.a3d, а второй инвизибал компас с той же открытой сборокой 1.a3d, так? Это позволяетяся? Потом я чего-то там делаю со сборкой в компасе и параллельно изменения у меня будут "отображатся" в сборке инвизибал космпас ?

ps.
процесс инвизибл компас создаю в компас через апи, естественно.

Перечитать придётся, чтобы изменения увидеть. Ван нужно сохранить в другую папку, сохранили выгрузили. Можете открыть сборку в компасе и сохранить библиотекой пакетного сохранения, при открытой сборке в другую версию, и другую папку.

SerGoVec

вопрос вскользь (задаю здесь, чтобы новую тему не создавать).
Мне необходимо поменять значение наименования в штампе документа. В обычном компасе все выходит на раз, а вот в Insible компасе не выходит. Я запускаю invisible компас из вне (не из обычного компаса), делаю pdf представление чертежа. Теперь мне надо поменять некоторые значения в штампе. Если я правильно понял, основной косяк это получение активного документа. В invisible компас нет активного документа? Как тогда быть?

Код:
var
   k_Invisible: KompasObject;  //api5
   k_api7: IApplication;
   
  doc2D_api5: ksDocument2D;
  stamp_api5: ksStamp;
  itemParam_api5: ksTextItemParam;  //компонент строки текста (тип символа, массив символов...)
  itemFont_api5:  ksTextItemFont;   //свойства шрифта в док. компаса (наклон, ширина, толщина...)

    ...
     k_Invisible := KompasObject(CreateOleObject('KSINVISIBLE.Application.5'));
   ...
     if k_Invisible.ActiveDocument2D <> nil then
    begin
      doc2D_api5 := ksDocument2D(k_Invisible.ActiveDocument2D);
        //параметры для заполнения текста
      itemParam_api5 := ksTextItemParam(k_Invisible.GetParamStruct(ko_TextItemParam));
      if (itemParam_api5 <> nil) then
      begin
        itemParam_api5.Init;
        itemFont_api5 := ksTextItemFont(itemParam_api5.GetItemFont);
        itemFont_api5.SetBitVectorValue(NEW_LINE, true);  //вектор - новая строка

        stamp_api5 := ksStamp(doc2D_api5.GetStamp);
        if (stamp_api5 <> nil) then
        begin
          if (stamp_api5.ksOpenStamp <> 0) then //открытие штапма док.
          begin
            stamp_api5.ksColumnNumber(1); //наименование (указываем ячейку в штампе)
            if (itemFont_api5 <> nil) then
            begin
              itemParam_api5.s := 'тест обозначения'; //s - массив символов для компоненты текста
              doc2D_api5.ksTextLine(itemParam_api5); // записываем текст в док.
            end;
          end;
          stamp_api5.ksCloseStamp;            //закрытие штампа док.
        end;
      end;
    end;

  ...
  k_api7 := (k_Invisible.ksGetApplication7) as IApplication; //... далее формирование pdf

штамп не заполняется, а если убрать условие - if k_Invisible.ActiveDocument2D <> nil then то появится ошибка выполнения - EAccessViolation: Access violation at address 004E1147 in module 'kompasInvisibl
e.exe'. Read of address 00000000 из чего я делаю вывод, что с активным документом invisible компас не работает.

SerGoVec

попробовал проделать через api7 - то же самое.
код:
...
    doc := k_api7.ActiveDocument;
    if not (ksGetDocumentType(doc.Reference) in [lt_DocAssemble3D, lt_DocPart3D, lt_DocTechnologyAssemble3D]) then
    begin
      sheets := doc.LayoutSheets; //все листы документа
      sheet := sheets.ItemByNumber[1]; //первый лист
      stamp := sheet.Stamp;
      text := stamp.Text[1]; //наименование
      text.Clear;
      text.Str := 'тест обозначения';
      stamp.Update;
    end;
...

Документ сначала нужно открыть в Компас Insible, а затем менять.
+ Благодарностей: 1

SerGoVec


SerGoVec

еще вопрос по ходу пьесы:
я пытаюсь в штампе присвоить инвентарный номер подразделения (Инв. № Подр.) это 19 id, назначаю строку, а в ответ тишина? Почему?
      ...
      sheets := doc.LayoutSheets; //все листы документа
      sheet := sheets.ItemByNumber[1]; //первый лист
      stamp := sheet.Stamp;


      text := stamp.Text[19];
      text.Clear;
      text.str := '100'; //инвентарный номер подразделения
 
в тоже самое время подпись (id =200) и дата (id=201) (основная надпись - инвертарные номера заполняются без проблем)

      text := stamp.Text[200];
      text.Clear;
      text.Str := 'Курочка ряба';

      text := stamp.Text[201];
      text.Clear;
      text.Str := '21.04.16';


SerGoVec