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

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

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

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

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

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

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

Потеря подключения к Компасу

Автор midreyk, 22.11.23, 14:21:56

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

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

midreyk

Здравствуйте.

Столкнулся с такой проблемой:
- Работает программа для вставки стандартных изделий написанная на Питоне. Всё хорошо - к Компасу подключается, функции выполняются, детали вставляются.
- Потом работаю в Компасе какое-то время. Программа всё это время запущена
- Хочу опять выполнить действие через программу.

И тут перестает работать подключение к Компасу (получения модуля и апи). Причём даже апи получает, а вот модуля нет. Он даже не None, а его вообще нет!

Помогает только перезагрузка Компаса.

В чем проблема может быть?

Компас 18.1, Питон 3.10

feron

Напишите макрос сюда что бы воспроизвести ошибку.

Nipal

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

Вират Лакх

Если нет модуля - это не значит, что не удалось подключиться к Компасу. Подключение к компасу осуществляет Dispatch, коннектится к существующему или создаёт новый экземпляр.
gencache.EnsureModule создаёт при необходимости библиотеку типов. Это сделать достаточно один раз, только если кто-то или что-то не стирает их в gen_py.
Можно пользоваться только одним интерфейсом компаса без библиотеки типов, если макрос простой, не требующий преобразования типов.
У вас срабатывает "if not module" ?
"Он даже не None, а его вообще нет!" - это не одно и то же? Если вообще нет, значит переменная где-то используется до её объявления в коде или удаляется.

feron

#4
Есть еще одно НО - при работе скрипта от админа - Dispatch не подключается к запущенному Компасу или при условии что Компас не запущен от админа.
И наоборот. При другом пользователе Dispatch не сможет запустить Компас если он не запущен.

midreyk

Цитата: Nipal от 22.11.23, 15:36:03А зачем подключатся по новой, если у Вас есть уже полученный экземпляр, так и контролируйте его пока он не умрёт.
Да попробую глобальными переменными чтобы не переподключаться. Просто раньше всё работало...

Цитата: Вират Лакх от 22.11.23, 18:31:26Можно пользоваться только одним интерфейсом компаса без библиотеки типов, если макрос простой, не требующий преобразования типов.
Наверное не получится, т.к. есть строчки типа таких:
kompas_document_3d = module_7.IKompasDocument3D(kompas_document)
kompas_document_2d = module_7.IKompasDocument2D(kompas_document)
kompas_document_2d1 = module_7.IKompasDocument2D1(kompas_document_2d)

Цитата: Вират Лакх от 22.11.23, 18:31:26У вас срабатывает "if not module" ?
"Он даже не None, а его вообще нет!" - это не одно и то же? Если вообще нет, значит переменная где-то используется до её объявления в коде или удаляется.
Так в том то и дело, что не срабатывает. А уже дальше по коду вылетает ошибка совсем на других объектах что они None. Например Parts от kompas_document_3d. Хотя минуту назад всё было. Просто я заметил, что такой переменной (module) нет в дебаггере и подумал что в этом причина.

Спасибо за советы буду пробовать дальше. Программу выложу чуть попозже.


Михаил88

у вас функция возвращает module и api
Как у вас называются переменные, в которые записываются возвращенные значения?

например:

module_, api_ = get_kompas_api7()

У вас переменная module (локальная) существует пока работает функция.


Вират Лакх

IPart7.Parts - это коллекция, а коллекции не отображаются через Print(). Через дебаг, видимо, тоже. Как она у вас минуту назад "была"? Как она выглядела?
Чтобы коллекцию проверить, получайте IParts7.Count.
Ваши переменные точно есть в globals(), если вы их объявили и не удаляли до вызова этой функции.

Михаил88

А если попробовать использовать стандартное подключение, которое использует Аскон.

#  Получи API интерфейсов версии 7
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))

Попробовать по тестировать.
Я посмотрел в исходниках, которые вы раннее скидывали. Там вы каждый раз подключаетесь при выполнении функции. Я бы тоже переписал, как и советовал Nipal и сделал подключение разово.