AttributeError: 'NoneType' object has no attribute 'constants'

Автор seravkin, 07.12.17, 02:58:46

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

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

seravkin

День добрый!
КОМПАС-ЗD Учебная версия 17.1.0 (64-разрядная версия).
Записал макрос, пытаюсь запустить.

Практически сразу ошибка:

kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants

AttributeError: 'NoneType' object has no attribute 'constants'      

Отладка показывает, что вываливается функция __import__("win32com.gen_py.75C9F5D0-B5B8-4526-8681-9903C567D2EDx0x1x0"). Видимо, ничего не находит.

Куда копать?       


Slaviation

Попробуйте сначала запустить свой КОМПАС с ключом -register.
+ Благодарностей: 1

seravkin

#2
Огромная благодарность! Сам бы никогда до этого не додумался! Интересно, как, по мнению разработчиков, я должен был до этого догадаться? Об этом где-нибудь написано?

Теперь текст ошибки изменился. Что уже радует. Похоже на отсутствие регистрации COM объекта:
C:\Program Files\ASCON\KOMPAS-3D v17 Study\Libs\Kompas-Macro\Python 3\App\lib\site-packages\win32com\client\__init__.py   423      
    oobj = pythoncom.new(self.CLSID)
pywintypes.com_error: (-2147221164, 'Класс не зарегистрирован', None, None)


seravkin

Прямой поиск текста ошибки не помог. А что разные ошибки могут иметь одну причину (отсутствие запуска -register), я, конечно, предугадать не смог. Регистрация успешно прошла, но теперь другая ошибка. Даже частичный поиск не помогает. Стоит 64х Компас, 64х Python и 64х pywin32-221.win-amd64-py3.6. Что теперь не так, снова в ступоре

UPD. "Родной" питон Компаса 32х битный 3.2.5, похоже, дело в этом, буду разбираться.

Всем благ, кто ответил

Slaviation

Предполагаю некую неразбериху с установленными Python и предлагаю такое решение:
1. Установщиком КОМПАС деинсталлировать библиотеку КОМПАС-Макро.
2. Деинсталлировать установки Python, и его расширений (PyWin32) если таковые остались после выполнения п.1.
3. Установщиком КОМПАС инсталлировать библиотеку КОМПАС-Макро.
+ Благодарностей: 1

seravkin

Ещё раз благодарю всем, кто откликнулся!!! Можно сказать, проблема топика полностью решена!

Последняя ошибка оказалась гораздо прозаичнее (а может переустановка Компас-Макро помогла или перезагрузка ноута). Я просто пытался запустить сгенерированный макрос, не понимая, что он делает.  Прошелся в отладке, оказалось, что успешно получены интерфейсы API5, API7. Ошибка возникает при получении активного документа, если Компас не открыт (хотя до перезагрузки ноута он был открыт).

#  Подключим описание интерфейсов 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  #  тут NoneType

kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iDocument3D = kompas_object.ActiveDocument3D()

Имеет ли принципиальное значение, что kompas_object получается из API5, а application из API7?

Куда после запуска -register пропало меню "Макросы"?

Ё

 "Имеет ли принципиальное значение, что kompas_object получается из API5, а application из API7?"
Заядлые программеры молчат. ПридЁтся "своими силами": нет. Не в этом дело. Посмотрите на Хабрахабре: кто-то, "ассоциированный" с "АСКОН"-ом, давал пример на С++, когда программка сама запускает "Компас". Примерно то же самое д.б. написано и в "Пайтоне".( Правда, что-то сомнительно, чтоб "Компас" запустился из-под "Пайтона"...)

Slaviation

#8
Какая-то часть функционала покрывается API7, какая-то - только API5.
Если конкретная задача решается использованием только API7, то рекомендую получить и использовать только IApplication.
Если решение задачи невозможно с использованием только API7, ищем решение с использованием API5 и получаем интерфейс KompasObject.
Кто-то поднаторел использовать какое-то одно из этих API.
На мой взгляд - по возможности используйте какое-то одно, не миксуйте.

ЦитироватьПравда, что-то сомнительно, чтоб "Компас" запустился из-под "Пайтона"...)
Не сомневайтесь - запустится.

iimport pythoncom
from win32com.client import Dispatch, gencache
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
kompas_api_object = kompas_api7_module.IKompasAPIObject(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch))
application = kompas_api_object.Application
application.Visible = True

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