• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Обработка события окна 3d документа

Автор Humailz, 10.04.23, 16:09:55

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

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

Humailz

Нужно обработать событие передвижения мыши в DocumentFrameEvent, но событие передвижения мыши (MouseMove) не обрабатывается, в то время как события дабл клика или же нажатия мыши работают отлично, в чём может быть проблема?
Смотрел пример eventCom, даже там не могу решить задачу, например при перемещении мыши запись координат в файл.

В целом это мне нужно чтобы, условно деталь, приклеилась к курсору, и её можно было перемещать без манипуляторов, только в одной из плоскостей, если такого рода задачи решаются, не через обработку курсора или события, прошу напишите в какой стороне искать информацию.

Vi2

Не мог бы ты привести часть кода? Вроде прекрасно всё ловится - и двойной клик мыши, и перемещения мыши.

Humailz

1. Я не могу понять в каких случаях вызывается событие DocumentFrameOpen (Все эти события я тестирую на примере eventCom), исходя из этого я вызываю руками NewDocumentFrameEvent (скрин 1). В этом проекте я прикручиваю API 7 чтобы получить Frames не знаю правильно ли я это делаю, но особо не разбирался с подключением API.
Как видно на 2ром скрине события клика, и некоторые другие события отрабатывают, и координаты нажатия мыши пишутся в txt. Но события 3тьего скрина не работает, и, как я понимаю, событие не отрабатывает вообще.
Прикладываю код частями
Сюда не могу залить сам проект из-за веса.

Часть 1
  IKompasDocumentPtr doc = newKompasAPI->ActiveDocument;
  IDocumentFramesPtr Frames = doc->DocumentFrames;
  if (Frames->Count)
  {
IDocumentFramePtr frame = Frames->GetItem(0);
auto evnt = NewDocumentFrameEvent(doc->Reference, frame);

  }

Часть 2
//-------------------------------------------------------------------------------
// frMouseMove           - Перемещение мыши
// ---
VARIANT_BOOL DocumentFrameEvent::XDocumentFrameNotify::MouseMove( short nShiftState, long x, long y )
{
METHOD_PROLOGUE_EX_(DocumentFrameEvent, DocumentFrameNotify )
pThis->ShowEventName(_T("DocumentFrameEvent::MouseMove"));
std::wofstream ftr; ftr.open(L"D:\\dev\\debug\\d.txt", std::ios::app);
if (ftr.is_open())
{
std::wstring str;
str = std::to_wstring(x) + L"|" + std::to_wstring(y) + L" MouseMove\n";
ftr << str;
ftr.close();
}
  return true;
}
1.JPG

Vi2

У нас ещё проверяется активность фрейма
for (long i = 0, count = frames->Count; i < count; i++)
{
next = frames->Item[i];
if ((bool)next && next->Active)
{
res = next;
break;
}
}
Но это не важно, раз события приходят. Осталось проверить соответствие используемого интерфейса по расположению методов. Наш проект использует dispinterface, а ваш, похоже, vtable. dispinterface не определяет расположение методов и пользуется dispid, а вот vtable интерфейс пользуется виртуальной таблицей, которая может быть неверной.

У меня пример Samples\cpp\Visualc\eventsCom\DocumentFrameEvent.h для класса class DocumentFrameEvent : public BaseEvent содержит такой код:
BEGIN_INTERFACE_PART( DocumentFrameNotify, IDocumentFrameNotify )
INIT_INTERFACE_PART( DocumentFrameEvent, DocumentFrameNotify)
    // frBeginPaint          - Начало отрисовки документа
    STDMETHOD_(VARIANT_BOOL, BeginPaint)( THIS_ IUnknown* paintObj );
...
    // frAddGabarit          - Определение габаритов документа
    STDMETHOD_(VARIANT_BOOL, AddGabarit)( THIS_ IUnknown* gabObj );
    // frBeginCurrentProcess - Начало текущего процесса
    STDMETHOD_(VARIANT_BOOL, BeginCurrentProcess)( THIS_ long id );
    // frStopCurrentProcess  - Окончание текущего процесса
    STDMETHOD_(VARIANT_BOOL, StopCurrentProcess)( THIS_ long id );
    // frActivate            - Окно активизировалось
    STDMETHOD_(VARIANT_BOOL, Activate)(THIS);

Так вот мои tlb говорят, что таких методов BeginCurrentProcess и StopCurrentProcess нет в определении этого интерфейса IDocumentFrameNotify :
    [
      odl,
      uuid(A715A2F6-3210-4890-9EB4-327A06F90EB6),
      helpstring("COM интерфейс : события для окна документа(клавиатура, мышь, события по отрисовке документа)."),
      hidden
    ]
    interface IDocumentFrameNotify : IKompasNotify {
        [helpstring("Начало отрисовки документа.")]
        VARIANT_BOOL _stdcall BeginPaint(IUnknown* paintObj);
...
        [helpstring("Определение габаритов документа.")]
        VARIANT_BOOL _stdcall AddGabarit(IUnknown* gabObj);
        [helpstring("Активизация окна.")]
        VARIANT_BOOL _stdcall Activate();
        [helpstring("Деактивизация окна.")]
        VARIANT_BOOL _stdcall Deactivate();
Поэтому могут вызываться не те методы. Может, в этом причина.

Humailz

#4
Всё так как вы и описали, по поводу нарушении виртуальной таблицы, нашёл 3 метода которых нету в kAPI2D5COM.h, вылезла другая ошибка но суть я понял, буду пробовать это исправить.
Upd: метод IsNotifyProcess нужен тк наследуется классу IDocumentFrameNotify. Программа собирается, но вызов метода MouseMove не производится.

Vi2

Больше вариантов не знаю, но попробуй обработчик из примера \OneWindow\events\DocumentFrameEvent.h
+ Благодарностей: 1

p3452

Цитата: Humailz от 10.04.23, 16:09:55Нужно обработать событие передвижения мыши в DocumentFrameEvent

Цитата: Humailz от 17.04.23, 11:16:34Я не могу понять в каких случаях вызывается событие DocumentFrameOpen

DocumentFrameOpen() это DocumentEvent.
MouseMove() это DocumentFrameEvent.

Humailz

Цитата: p3452 от 17.04.23, 21:54:49DocumentFrameOpen() это DocumentEvent.
MouseMove() это DocumentFrameEvent.
Я имел в виду, что в примере eventCom, для вызова конструктора DocumentFrameEvent, в котором MouseMove(), сначала должно отработать событие DocumentFrameOpen() из, как вы отметили, DocumentEvent, но по каким-то причинам, отловить вызов этого события у меня не вышло.

p3452


Humailz

IKompasDocumentPtr doc = newKompasAPI->ActiveDocument;
  auto devnt = NewDocumentEvent(doc->Reference);
  if (devnt)
  {
  IDocumentFramesPtr Frames = doc->DocumentFrames;
  if (Frames->Count)
  {
  IDocumentFramePtr frame = Frames->GetItem(0);
  auto evnt = NewDocumentFrameEvent(doc->Reference, frame);
  if (evnt)
  {

  }
  else
  {
  MessageT(L"Error DocFrameEvent");
  }
  }


  }
  else
  {
  MessageT(L"Error DocEvent");
  }
 
Подписался на события документа, события документа отрабатывают, клик мыши работает, передвижения мыши нет.

Humailz

Цитата: Vi2 от 17.04.23, 20:49:07Больше вариантов не знаю, но попробуй обработчик из примера \OneWindow\events\DocumentFrameEvent.h
Более менее настроил их этого примера, самое забавное что теперь событие отрабатывает, но
BOOL DocumentFrameEvent::MouseMove( short nShiftState, long x, long y )
в x и y всегда 0, не понимаю нужно чтото дописать или же чтото странное, и так быть не должно ?
код перемещения мыши, из примера \OneWindow\events\DocumentFrameEvent.h который я перенёс в другой проект. Попытка подключить OneWindow вообще крашит компас
//-----------------------------------------------------------------------------
// frMouseMove           - Перемещение мыши
// ---
BOOL DocumentFrameEvent::MouseMove( short nShiftState, long x, long y )
{
    std::ofstream ftr; ftr.open(L"D:\\dev\\debug\\d.txt", std::ios::app);
    if (ftr.is_open())
    {
        std::string str;
        str = std::to_string(x) + "|" + std::to_string(y) + "mouse move \n";
        ftr << str;
        ftr.close();

    }

  return TRUE;
}


Humailz

Сам допустил ошибку в
BEGIN_EVENTSINK_MAP(DocumentFrameEvent, ABaseEvent)
// ON_EVENT (DocumentFrameEvent, (unsigned int)-1, frBeginPaint,          BeginPaint,          VTS_DISPATCH               )
// ON_EVENT (DocumentFrameEvent, (unsigned int)-1, frClosePaint,          ClosePaint,          VTS_DISPATCH               )
 ON_EVENT (DocumentFrameEvent, (unsigned int)-1, frMouseDown,           MouseDown,           VTS_I2 VTS_I2 VTS_I4 VTS_I4)
// ON_EVENT (DocumentFrameEvent, (unsigned int)-1, frMouseUp,             MouseUp,             VTS_I2 VTS_I2 VTS_I4 VTS_I4)
// ON_EVENT (DocumentFrameEvent, (unsigned int)-1, frMouseDblClick,       MouseDblClick,       VTS_I2 VTS_I2 VTS_I4 VTS_I4)
  ON_EVENT (DocumentFrameEvent, (unsigned int)-1, frBeginPaintGL,        BeginPaintGL,        VTS_DISPATCH VTS_I4        )
// ON_EVENT (DocumentFrameEvent, (unsigned int)-1, frClosePaintGL,        ClosePaintGL,        VTS_DISPATCH VTS_I4        )
ON_EVENT (DocumentFrameEvent, (unsigned int)-1, frAddGabarit,          AddGabarit,          VTS_DISPATCH               )
// ON_EVENT (DocumentFrameEvent, (unsigned int)-1, frActivate,            Activate,            VTS_NONE                   )
// ON_EVENT (DocumentFrameEvent, (unsigned int)-1, frDeactivate,          Deactivate,          VTS_NONE                   )
   ON_EVENT (DocumentFrameEvent, (unsigned int)-1, frCloseFrame,          CloseFrame,          VTS_NONE                   )
   ON_EVENT (DocumentFrameEvent, (unsigned int)-1, frMouseMove,           MouseMove,           VTS_I2 VTS_I4 VTS_I4)
определил у MouseMove не тот тип данных