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

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

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

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

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

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

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

Что если открыто 2 и более окон Kompas-3D?

Автор LevYNWA, 30.11.23, 16:59:36

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

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

LevYNWA

Немного вводных данных. Речь пойдет о макросах, в которых интерфейсы компаса определяются также, как в шаблоне, получаемом через "Приложения -> Компас-Макро -> Макросы -> Создать". То есть вот с таким кодом в начале:


# -*- coding: utf-8 -*-
#|1

import pythoncom
from win32com.client import Dispatch, gencache

import LDefin2D
import MiscellaneousHelpers as MH

#  Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants

#  Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))
MH.iKompasObject  = kompas_object

#  Подключим описание интерфейсов API7
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))
MH.iApplication  = application


Documents = application.Documents
#  Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
iDocument2D = kompas_object.ActiveDocument2D()


К сути вопроса! Если запущено 2 и более окон Компаса, могут возникнуть проблемы с выполнением макроса.
Насколько понял, макрос выполняется всегда только для первого окна компаса, даже если вызван через меню "Приложения" во втором окне.
Активный документ или коллекцию открытых документов от интерфейса IApplication также можно получить только для первого окна.
А если перед этим (каким-то странным образом) был запущен объект приложения в скрытом режиме (с IApplication.Visible = False)(например другим макросом, где создатель не позаботился о закрытии по завершению выполнения кода), то и все интерфейсы будут определяться именно для него.
Почти всегда подобное приводит к ошибке при работе программы.

Чтобы предупредить пользователя (то есть себя) о возможности неоднозначного определения документа, для которого будет выполнен макрос, попробовал следующие способы:

1 Искал все окна, содержащие "KOMPAS-3D" в наименовании. И если их больше 1, останавливал работу программы с просьбой закрыть "лишние".

Минусы способа: некоторые вспомогательные окна (например, азбука) тоже содержат эту подстроку.
Можно конечно искать подстроку со значением, полученным свойством IApplication.ApplicationName(True).
Признаюсь, этот способ не пробовал, но думаю недостаток будет тот же - какое-нибудь вспомогательное окно может содержать и "КОМПАС-3D v..." в наименовании.

2 Через CLSID приложения Компас, определял с помощью реестра Windows путь к исполняемому файлу Компаса. Затем искал все процессы, которые запущены с этого файла. Если их больше одного, опять же останавливал работу программы с просьбой закрыть "лишние" (это я делал уже не в Python-Portable, а в VSStudio и С++, но думаю что-то подобное и в питоне можно придумать).

Минусы: в этом способе я не уверен, так как не знаю, какие компоненты компаса могут использовать тот же exe-шник.

В общем, прошу поделиться идеями и опытом, как при создании макросов Вы обеспечиваете то, что он будет выполнен точно для того документа, о котором думает пользователь)

p3452

На квадратных колесах можно пытаться ездить, но тогда не надо жаловаться на некоторые неудобства...

Вират Лакх

Не окон, а экземпляров компаса.
Компоненты компаса не создают новые экземпляры.
import os
tasks = os.popen('tasklist').read()
# или
import subprocess
tasks = subprocess.getoutput('tasklist')

print(tasks.lower().count('kompas.exe'))

feron

Цитата: p3452 от 30.11.23, 17:06:03но тогда не надо жаловаться на некоторые неудобства...

ну почему же ? к тому же привели пример как получить массив экземпляров - пусть хоть и не явно но намек дан.

Nipal

Цитата: feron от 01.12.23, 18:59:56ну почему же ? к тому же привели пример как получить массив экземпляров - пусть хоть и не явно но намек дан.

Массив.