подписка на событие IObject3DNotify

Автор SerGoVec, 18.09.17, 15:56:56

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

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

SerGoVec

Всем привет!

Мне необходимо перехватить событие "Исключить из расчета" - см. картинку 1.
Для перехвата данного события необходимо реализовать интерфейс IObject3DNotify, что и было сделано - был сделан класс Object3DEvent. Старт подписки на событие происходит при открытии документа компас. (через ApplicationEvents).
При успешной подписке (Advice) класса IObject3DNotify на событие компас3D, должна вернуться 1 или 0 в случае неудачи.

                   //int ksConnectionAdvise (NotifyConnectionParam * param, LPUNKNOWN object);//

У меня постоянно возвращается 0 - подписки на событие нет.
В чем ошибка? Как произвести подписку?

Последовательность выполнения кода - см. картинки 2-7

SerGoVec

продолжение

SerGoVec

Итак, продолжение истории...

Посмотрел пример step 12 в SDK для всех платформ: Delphi, C++, C#. Намек на подписку IObject3DNotify есть только: SDK\C++\Visualc и  SDK\C#\Automation.
Пример на С++ компилироваться не захотел (собирал в VS 2010). Собрал step 12 на С#. Казалось бы, пример на то и дан, чтобы посмотреть как работает...Увы, подписка также не производится, хотя логика подписки отличается от той, которую я использовал ранее в Delphi.

Последовательность:

SerGoVec

Итак, подписка не осуществляется!

SerGoVec

Поменял логику подписки в Delphi, в надежде, что все-таки сработает...

SerGoVec

Подписка по прежнему не осуществляется!

SerGoVec

Поэтому вопрос: а можно ли в обще осуществить эту подписку, как? И зачем в примерах (step 12) давать не рабочие решения? Или я не правильно готовлю?

#7
Вы лучше проект, прикрепите, такие вещи, по картинкам разбирать неактуально.
В Step12 (Delphi) - работа с 2D, но не 3D.

SerGoVec

в архиве проекты и на delphi и на cs. (cs на всякий случай)
+ Благодарностей: 1

Подписка есть, но у Вас там есть немного ошибок.

SerGoVec

То, что подписка осуществляется у вас это хорошо, то есть это возможно. Покажите, пожалуйста, в чем ошибки. Если вас не затруднит, пришлите код.

#11
Чуть позже, прикреплю четыре файла из проекта, где были правки.

SerGoVec


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

SerGoVec

Здорово! Спасибо большое! Есть над чем подумать.
Подписка есть. Вот только не пойму - операция "исключить из расчета" отлично перехватывается для тел самой сборки/детали. Если вставить компонент в сборку и "исключить из расчета" его, то события нет. Почему так?


SerGoVec

Добрый день!

Как можно получить объект (нужно получить filename) в методе function Object3DEvent.BeginProcess(pType: Integer; const obj: IInterface): WordBool; ?
Пробовал получить из IFeatureCollection -> IFeature, а из него получить IPart (пробовал и IPart, IPart7 и ksPart).

function Object3DEvent.BeginProcess(pType: Integer; const obj: IInterface): WordBool;
begin
  var
      pFeatureCollection: IFeatureCollection;
      pPart: IPart;
      pFeature: IFeature;
      pEntity: IEntity;
      s1,s2: string;
      I, J, K: Integer;

  pFeatureCollection := Obj as IFeatureCollection;
  if pFeatureCollection <> nil then
  begin
    J := pFeatureCollection.GetCount - 1;
    pFeature := IFeature(pFeatureCollection.GetByIndex(j));
    s1 := pFeature.GetName; //название из дерева есть
    pPart := IPart(pFeature);
    s1 := pPart.GetFileName;  //ошибка

    //пробовал еще так
    //pPart := IPart(pFeature.GetObject);
   //s1 := pPart.GetFileName; //ошибка
end ;

Можно, так.
+ Благодарностей: 1

SerGoVec

pPart := IUnknown(LtDefine.PIUnknown(pFeature.GetObject))as IPart;
вот в этой строчке вся магия). Спасибо!!!.
ps. а что можно почитать по интерфейсам компаса, есть литература?

SerGoVec

Добрый день!
Уже неделю ломаю голову отработки компонента  на событие "Исключить из расчета". Трабла в том, что какие-то компоненты отрабатывают событие "Исключить из расчета", а какие-то нет. При этом все компоненты имеют подписку на события Obj3DEvent.
В чем же может быть ньюанс?

В качестве тестируемой сборки использовал сборку из ASCON\KOMPAS-3D V16\Samples\Reducer.
Как видно из картинок ниже, компонент Крышка отрабатывает событие "Исключить из расчета", а вот, например, компоненты Вал или Корпус не реагируют на него.

Еще попробовал сделать так - перебрать все компоненты дерева и подписать их. Подписаны. Результату ноль.


          Doc3D := K7.ActiveDocument as IKompasDocument3D;
          if Doc3D <> nil then
            pDocument3D := IUnknown(ksTransferInterface(LtDefine.PIUnknown(Doc3D), ksAPI3DCom, 0)) as IDocument3D;
          if pDocument3D <> nil then
            pPart := IPart(pDocument3D.GetPart(pTop_Part)); {pInPlace_Part - компонент, редактируемый на месте;
                                                              pNew_Part - новый компонент;
                                                              pEdit_Part - редактируемый компонент;
                                                              pTop_Part - главный компонент, в составе которо­го
                                                                находится новый или редактируе­мый или указанный
                                                                компонент (напри­мер, сборка, в составе которой
                                                                находится редактируемая деталь)}
          if pPart <> nil then
            if not Dic.ContainsKey(pPart.GetName) then
              NewObj3DEvent(docRef, o3d_unknown, Doc3D, pPart, nil);

          pFeature := IFeature(pPart.GetFeature);                                       //корневая
          pFeatureCollection := IFeatureCollection(pFeature.SubFeatureCollection(1, 1)); //масив объектов корневой (выдавать скрытые, выдавать библиотечные)
          if pFeatureCollection <> nil then
          begin
            for I := 0 to pFeatureCollection.GetCount - 1 do
            begin
              pFeature := IUnknown(pFeatureCollection.GetByIndex(i)) as IFeature;
              if pFeature <> nil then
                NewObj3DEvent(docRef, o3d_unknown, Doc3D, pFeature, nil);

            end;
          end;