Подписка на события Kompas

Автор Nevegiy, 17.02.07, 12:37:39

« предыдущая - следующая »

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

Nevegiy

Подскажите, кто знает, каким образом можно получить сообщение от приложения о его выполнении. В SDK сказано, что подписаться на события можно с помощью интерфейса ksKompasObjectNotify - интерфейса событий приложения. При этом говорится, что источником в Automation является KompasObject или IApplication в зависимости от версии интерфейсов. Однако на этом пояснения заканчиваются, хотя мне, например, таких сжатых объеснений маловато. Как я не пытался разобраться в перехвате таких событий приложения как CreateDocument или OpenDocument - воз и ныне там (в смысле не удалось). Если у кого есть опыт в решении таких задач - помогите, кто чем может, пожалуйста.

Nevegiy

Неужели никто не сталкивался с необходимостью обработать события приложения? Или мой вопрос не правильно (не понятно) сформулирован?

Nevegiy

В справке по КОМПАС-МАСТЕР имеются сведения о интерфейсе событий приложения
ksKompasObjectNotify. однако метода, которым можно было бы получить этот интерфейс
нет. (Например, для получения событий документа - модели существует метод
ksDocument3D::GetDocument2DNotify). Кто-нибудь может подсказать как получить этот интерфейс?

bmiho

Не слишком давно я пытался найти ответ на этот вопрос, товарищи из Аскона похоже сами не знают как это делать :)
Сам дошел до следующего:

Компас предоставлят пользователям интерфейсы событий в виде абстрактных
классов. Чтобы воспользоваться этими интерфейсами необходимо создать
класс-наследник от соответствующего интерфейса Компаса и переопределить в
нем все чисто виртуальные функции, которые как раз и являются обработчиками
событий.
После этого необходимо подключиться к этому интерфейсу, используя функцию
ksConnectionAdvise. В эту функцию следует передать предварительно
сформированный первый параметр - указатель на структуру
NotifyConnectionParam, про нее есть информация в хелпнике; и второй
параметр - указатель на IUnknoun, в качестве этого указателя нужно передать
указатель на ваш новоиспеченный класс-наследник. Если вы все передали
правильно ksConnectionAdvise выполнит функцию QueryInterface и с этого
момента вы будете подключены к событиям. Вот пример на С++:

//---------------------------------------------------------------------------
class KompasEvents : public IKompasObjectNotify

  NotifyConnectionParam  m_Params;

  public:
   KompasEvents()
   {
     memset( &m_Params,0,sizeof(NotifyConnectionParam) );
     m_Params.ifType = ntKompasObjectNotify;
     ksConnectionAdvise(&m_Params,this);
   }
   ~KompasEvents()
   {
     ksConnectionUnadvise(&m_Params);
     Message("Отключились от Компаса");
   }

  protected:
   unsigned long __stdcall AddRef( void )  { return 1; }
   unsigned long __stdcall Release( void ) { return 1; }
   VARIANT_BOOL __stdcall IsNotifyProcess( int ) { return TRUE; }
   HRESULT __stdcall QueryInterface(const IID&, void **ppvObject)
   {
     Message("Подключились к Компасу");
     *ppvObject = this;
     return S_OK;
   }
   VARIANT_BOOL __stdcall CreateDocument( long pDoc, int docType )
   { return TRUE; }
   VARIANT_BOOL __stdcall BeginOpenDocument( LPCSTR )
   { return TRUE; }
   VARIANT_BOOL __stdcall OpenDocument( long pDoc, int docType)
   { return TRUE; }
   VARIANT_BOOL __stdcall ChangeActiveDocument( long pDoc, int docType)
   { return TRUE; }
   VARIANT_BOOL __stdcall ApplicationDestroy( void ) { return TRUE; }
   VARIANT_BOOL __stdcall BeginCreate( long ) { return TRUE; }
   VARIANT_BOOL __stdcall BeginOpenFile(void) { return TRUE; }
   VARIANT_BOOL __stdcall BeginCloseAllDocument(void) { return TRUE; }
};
//---------------------------------------------------------------------------
KompasEvents* ksEvnts=0;
//---------------------------------------------------------------------------
extern "C" bool far __export WINAPI LibInterfaceNotifyEntry( IDispatch* )
{
  ksEvnts=new KompasEvents();
  return false;
}
//---------------------------------------------------------------------------

Здесь вы подключаетесь к событиям Компаса. Не забывайте отключаться от
событий, иначе Компас вылетает... Желаю успехов.

AndreySt

Это как я понимаю пример написан для "*.rtw" библиотек, для них все прекрассно работает. Но почему то не происходит "Подписка на события Kompas" для моего приложения(exe) :!: В чем причина может кто знает, кто подстажет :?: Заранее благодарен за любую помощь.

компас10. delphi7.

bmiho

Верно, пример для rtw библиотеки. Из под exe это работать естественно не будет. Тут дело в том, что rtw это не что иное как dll и, соответственно размещается в памяти процесса Компас и способна перехватывать ВНУТРЕННИЕ сообщения Компаса. exe-шник представляет собой совершенно другой процесс windows, поэтому и не имеет доступа к сообщениям Компаса. Тут можно предложить написать rtw библиотеку, которая будет слать пользовательские сообщения windows при отработке внутренних сообщений Компаса, запускать ее при запуске Компаса из под exe-шника и в ехе-шнике перехватывать уже эти новые сообщения... :um:

AndreySt

спасибо попробую так :)

prog1

Получилось ли подписаться на события из ехе-шника? Или другим путем пошли? Тоже возникла необходимость...

AndreySt

из exe не получилось, получилось из rtw библиотеки и от туда по факту наступления события посылал postmessage приложению

andi

Уважаемый AndreySt не могли бы выложить пример небольшой. А то замучался уже :(

AndreySt

в SDK есть пример этой самой rtw-библиотеки (EventsAuto).

в unit BaseEvents есть оброботчик закрытия документа
function ApplicationEvent.OnApplicationDestroy() : boolean;
var
    ff: integer;
begin
  ff := FindWindow(nil,'MyProg');
  if ff <> 0 then
    PostMessage(ff, wm_user + 5005, 0, 0);
  Result := true;
end;


в твоем приложении делаешь следующее
private
procedure Proc_wm_KomClose(var Msg: TMessage); message wm_user + 5005;
....
procedure TMainForm.Proc_wm_KomClose(var Msg: TMessage);
begin
  if closeKompas then //--если мы закрываем сначала компас
  begin
    MainForm.close;
  end;
end;

prog1

Извиняюсь, если кому-то покажется вопрос не по теме... По-моему на "околособытийную" тему.
Получилось ли реализовать механизм редактирования с помощью характ-х точек из "exe"? (HPoints основ-ся на COM). Через Win API...

Вират Лакх

Подписаться на события в макросе Python вообще реально? Есть у кого-нибудь опыт?
Всё, что нашел в СДК. И что с этим делать?..
ЦитироватьksNotifyTypeEnum - Перечень интерфейсов событий
ntSelectionMngNotify    5    События менеджера выделенных объектов.

ksSelectionMngNotifyEnum - События менеджера выделенных объектов
ksmSelect    1    - объект выделен,
ksmUnselect    2    - снято выделение с объекта,
ksmUnselectAll    3    - снято выделение со всех объектов.

Интерфейс событий менеджера выделенных объектов ksSelectionMngNotify/ISelectionMngNotify
ksSelectionMngNotify - интерфейс Automation

Подписаться на события или отменить подписку можно стандартным способом при помощи методов интерфейса IConnectionPoint: IConnectionPoint::Advise и IConnectionPoint::Unadvise.

Для документа-модели источником является Менеджер выделенных объектов ksSelectionMng.

ksConnectionAdvise - Подписаться на событие
Синтаксис: int ksConnectionAdvise(NotifyConnectionParam * param, LPUNKNOWN object);

Sabahs

09.01.18, 10:11:06 #13 Последнее редактирование: 09.01.18, 10:28:22 от Sabahs
По поводу реальности подписки на события в Питоне, не скажу, т.к. с ним не работаю, но скорее всего не получится, т.к. нужна dll с предопределённой функцией LibInterfaceNotifyEntry.
Событий будет по больше. Можно посмотреть примеры и переделать их по аналогии.
Примеры для COM:
- c:/Program Files/ASCON/KOMPAS-3D v17/SDK/Samples/Pascal/Delphi/Cube
- c:/Program Files/ASCON/KOMPAS-3D v17/SDK/Samples/Pascal/Delphi/EventsCom
- c:/Program Files/ASCON/KOMPAS-3D v17/SDK/Samples/Pascal/Delphi/step12.
Пример для Automation: c:/Program Files/ASCON/KOMPAS-3D v17/SDK/Samples/Pascal/DELPHIAUTO/EventsAuto.
Если у Вас, есть вопросы, то их можно задать тут:
- "Оборудование: Развёртки";
- "Библиотека пакетного сохранения файлов".

Вират Лакх

То, что на картинке, я видел. Примеры на других языках для меня - темный лес. Тем более их переделывать.
Короче говоря, видимо нет такого простого пути аля Интерфейс компаса -> Интерфейс активного документа -> вуаля подписка на события менеджера выделенных объектов... Тогда трудозатраты на освоение подписки несопостовимы с выхлопом. ТрындецЪ решил задачу путем проверки SelectionManager.SelectedObjects в цикле с задержкой Nцать мс, а я думал, может будет по зубам подписка. Чтобы без задержки было, ну и комп не напрягать.

ТрындецЪ

Для меня не понятно что из себя представляет событие?
Подписка на событие - это привязка выполнения функции в момент наступления какого-то события или это автоматическое присвоение какой-то переменной значения True/False в момент наступления события?

Петрович-47

Цитата: ТрындецЪ от 09.01.18, 13:22:55
Для меня не понятно что из себя представляет событие?
... - это привязка выполнения функции в момент наступления какого-то события ....



В моё время было именно так...
Тему не читал... поиском пользоваться не умею...

Slaviation

10.01.18, 09:12:53 #17 Последнее редактирование: 10.01.18, 10:54:37 от Slaviation
ЦитироватьПодписаться на события в макросе Python вообще реально? Есть у кого-нибудь опыт?


Подписка на события из python возможна.
У меня в работе есть проект - запись макросов на Python. Код самого проекта написан на python.
Проект основан именно на подписках на события КОМПАС-3D.
Предлагаю его вашему вниманию. Ссылка на проект http://wdfiles.ru/5dx3
Исходники проекта (по понятным причинам) преобразованы в исполняемый exe.

Текущие ограничения:
Запись макросов по созданию только 2D объектов на API версии 7.
Путь к файлу записанного макроса макроса фиксированный.
Исполняемый exe для win x64.

Инструкция:
Скачать проект по указанной ссылке.
Распаковать PyRecorder.zip.
Открыть КОМПАС-3D.
Запустить main.exe из каталога PyRecorder.
Выполнить в КОМПАС-3D действия по созданию 2D-объектов.
В каталоге PyRecorder появится файл макроса temporary.pyw.
Если его запустить - записанные в макросе действия должны быть воспроизведены.

Вират Лакх

Вау. Эдакая замена КОМПАС-Макро. Вы его распространяете как-то? Платно, бесплатно или по donation? Или еще не допилен? Но это совсем другая история.
Можете поделиться кусочком кода как её заветную (подписку) организовать для менеджера выделенных объектов?
Назревает продолжение макроса "Оформление детали БЧ", но уже более общей направленности и под новым названием "Обозначение компонентов". Хотелось бы определиться, заниматься заменой цикла на подписку или забыть этот пункт.
Еще вопрос. Как питон компилировать в exe? Чем exe лучше байт-кода?

Slaviation

ЦитироватьКак питон компилировать в exe? Чем exe лучше байт-кода?

Проект преобразован в exe утилитой PyInstaller http://www.pyinstaller.org
В моем случае exe ни чем не лучше байт-кода, проект представлен в exe из-за моей неготовности просто отдать его исходники.