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

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

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

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

Вират Лакх

Slaviation, ну так поможете подписаться на события? Кроме Вас, думаю, никто не умеет на форуме.

Slaviation

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

ТрындецЪ

Цитата: Slaviation от 10.01.18, 09:12:53
У меня в работе есть проект - запись макросов на Python. Код самого проекта написан на python.
Проект основан именно на подписках на события КОМПАС-3D.
Предлагаю его вашему вниманию.
Ехешник для х64 систем? У меня на х32 на запустился.

Slaviation

ЦитироватьЕхешник для х64 систем? У меня на х32 на запустился.
Да, все верно, не запустится. Для создания такого exe мне нужно будет устанавливать 32-битный питон и его 32-битное расширение pywin.

pr0100

Цитата: Slaviation от 10.01.18, 09:12:53
Подписка на события из 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.
Если его запустить - записанные в макросе действия должны быть воспроизведены.
Пытаюсь скачать не удается. Не грузит файлобменник.
У меня такой вопрос, а он будет работать если к примеру библиотека кампас-макро отключена или не установлена? Просто столкнулся с тем, что пробовал сделать *.exe и там где не установлена библиотека компас-макро. Экзэшник не срабатывал. Хочется чтобы была возможность запуска исполняемых файлов написанных на пайтоне без подключенной библиотеки.

pr0100

Цитата: Вират Лакх от 10.01.18, 09:40:26
Еще вопрос. Как питон компилировать в exe?


можно попробовать cx freeze

Вират Лакх

Цитата: pr0100 от 10.01.18, 11:05:17
Пытаюсь скачать не удается. Не грузит файлобменник.
У меня в браузере Опера, где была блокировка рекламы и пр., тоже не хотел качать. Открыл страницу через хром без блокировки рекламы и скачал.
cx freeze и PyInstaller могут пригодиться тем, у кого глюки с питоном не удалось побороть. Или при использовании разных питонов 2.х и 3.х

Slaviation

ЦитироватьХочется чтобы была возможность запуска исполняемых файлов написанных на пайтоне без подключенной библиотеки.

Вот перевод кусочка с главной страницы PyInstaller
ЦитироватьОсновная цель PyInstaller - быть совместимой с сторонними пакетами из коробки. Это означает, что с PyInstaller все необходимые трюки для работы с внешними пакетами уже интегрированы в PyInstaller, так что не требуется вмешательства пользователя. Вам никогда не придется искать трюки в вики и применять пользовательскую модификацию к вашим файлам или вашим сценариям установки. Например, библиотеки, такие как PyQt, Django или matplotlib, полностью поддерживаются без необходимости обрабатывать плагины или внешние файлы данных вручную. Подробнее см. Наш список совместимых пакетов.

ainis

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

Vi2

Цитата: ainis от 20.09.19, 15:25:00
Та же проблема. Имеется внешнее приложение, написанное на Visual Basic.NET, нужно подписаться в нем на события Компаса. В SDK как-то непонятно это описано.
Для Visual Basic.NET подписка осуществляется естественным образом: при описании объекта указывается ключевое слово WithEvents и тип объекта должен быть указанием имени кокласса (в Обозревателя объектов коклассы имеют события, обозначаемые "молниями". Я приведу картинку во вложении, не знаю, будет ли она доступна)

    Private WithEvents obj5 As Kompas6API5.Application
    Private WithEvents obj7 As KompasAPI7._Application
...
        ' после создания объект подключается к событиям автоматически
        obj5 = GetObject(, "Kompas.Application.5")
        obj7 = obj5.ksGetApplication7
...
    Private Function obj5_OpenDocument(newDoc As Object, docType As Integer) As Boolean Handles obj5.OpenDocument
        ' обработка
    End Function
...
    Private Function obj7_OpenDocument(newDoc As Object, docType As Integer) As Boolean Handles obj7.OpenDocument
        ' обработка. понятно, что нужно что-то одно, зачем две
    End Function

Если объект объявить так obj7 As KompasAPI7.IApplication, то никаких событий не будет, т.к. сам интерфейс не имеет способа оповестить о событиях, которые поддерживает его реализующий объект.

Вот и вся премудрость.

Ах да, после описания объекта с WithEvents список объектов с событиями пополнится объявленным именем объекта. Я не знаю как оно называется, но вверху окна кода. Можно там выбирать объект, рядом в окне появятся доступные события. Выбираете, VB добавляет код, которые дополняется нужными действиями. Вторая картинка во вложении.
+ Благодарностей: 1

alex_python

Цитата: Slaviation от 10.01.18, 09:12:53Подписка на события из 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.
Если его запустить - записанные в макросе действия должны быть воспроизведены.


Вы бы хоть поделились с народом, как осуществить подписку на события в Python. Например, событие ksDocumentFrameNotify?

Slaviation

#31
Добрый день.
Вы бы хоть поделились с народом,
Да, уже более трех лет тому назад:

# -*- coding: utf-8 -*-
# !usr/bin/env python

import pythoncom, win32com.client.connect, win32com.server.util
from win32com.client import Dispatch, gencache
from tkinter import Tk
from tkinter.ttk import Frame, Button

def on_app_notify_event(command_id, params):
    print("on_app_notify_event call with ", command_id, params)
   
class MainDialog(Frame):
     def __init__(self, master=None):
        self.__root = Tk()
        self.__root.resizable(0, 0)
        self.__root.title("Гест подписки на события")
        self.__root.wm_attributes("-topmost", 1)
        Frame.__init__(self, master)

        kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
        application = kompas_api7_module.IApplication(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))
        application.Visible = True
        app_notify_event = BaseEvent(kompas_api7_module.ksKompasObjectNotify, on_app_notify_event, application)
        app_notify_event.advise()
       
class BaseEvent(object):

    _public_methods_ = ["__on_event"]

    def __init__(self, event, event_handler, event_source):

        self.__event = event
        self.__event_handler = event_handler
        self.__connection = None
        self.event_source = event_source

    def __del__(self):

        if not (self.__connection is None):
            self.__connection.Disconnect()
            del self.__connection

    def _invokeex_(self, command_id, locale_id, flags, params, result, exept_info):
        return self.__on_event(command_id, params)

    def _query_interface_(self, iid):
        if iid == self.__event.CLSID:
            return win32com.server.util.wrap(self)

    def advise(self):
        if self.__connection is None and not (self.event_source is None):
            self.__connection = win32com.client.connect.SimpleConnection(self.event_source, self, self.__event.CLSID)

    def unadvise(self):
        if self.__connection is not None and self.event_source is not None:
            self.__connection.Disconnect()
            self.__connection = None

    def __on_event(self, command_id, params):
        return self.__event_handler(command_id, params)
       
def main():
    main_app = MainDialog()
    main_app.mainloop()

if __name__ == "__main__":
    main()
+ Благодарностей: 2

Slaviation

Так а куда нажимать-то?
Тест подписывается на события приложения.
Выполните в КОМПАС-3D любое действие из ksKompasObjectNotify/IKompasObjectNotify
Тест их и обработает

Slaviation