Python & ActiveX/COM Autocad

Автор Тема: Python & ActiveX/COM Autocad  (Прочитано 69663 раз)

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

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 129
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #120 : 04-04-2019, 14:14:17 »
Привожу весь код.
В  другие операции с объектом выполняются без проблем. Хочется разобраться, т.к. хотелось бы работать через comtypes, потому что я работаю в Jupyter notebook. А при использовании этой библиотекой в интерактивном режиме доступны методы и свойства объектов, это сильно упрощается работу и не нужно каждый раз в справку смотреть.

Код - Python [Выбрать]
  1. import array
  2. import comtypes.client
  3. import comtypes
  4.  
  5. app = comtypes.client.GetActiveObject('AutoCAD.Application')
  6. thisdrawing = app.ActiveDocument
  7.  
  8. blk,_ = thisdrawing.Utility.GetEntity()
  9. print(type(blk))
  10. blk.GetAttributes()
  11.  

Код - Python [Выбрать]
  1. <class 'comtypes.POINTER(IAcadBlockReference)'>
  2.  
  3. ---------------------------------------------------------------------------
  4. KeyError                                  Traceback (most recent call last)
  5. <ipython-input-37-8c74b912e4fb> in <module>
  6.       8 blk,_ = thisdrawing.Utility.GetEntity()
  7.       9 print(type(blk))
  8. ---> 10 blk.GetAttributes()
  9.  
  10. D:\Programs\lib\site-packages\comtypes\automation.py in __ctypes_from_outparam__(self)
  11.     504     def __ctypes_from_outparam__(self):
  12.     505         # XXX Manual resource management, because of the VARIANT bug:
  13. --> 506         result = self.value
  14.     507         self.value = None
  15.     508         return result
  16.  
  17. D:\Programs\lib\site-packages\comtypes\automation.py in _get_value(self, dynamic)
  18.     455             return value
  19.     456         elif self.vt & VT_ARRAY:
  20. --> 457             typ = _vartype_to_ctype[self.vt & ~VT_ARRAY]
  21.     458             return cast(self._.pparray, _midlSAFEARRAY(typ)).unpack()
  22.     459         else:
  23.  
  24. KeyError: 9
  25.  
  26.  

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 11601
  • Карма: 1504
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #121 : 04-04-2019, 14:22:38 »
А что даёт:
Код - Python [Выбрать]
  1. HasAttributes = blk.HasAttributes
?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 129
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #122 : 04-04-2019, 14:28:04 »
Возвращает True, атрибуты у этого блока есть.
Может это связано что это динамический блок.



привожу код и вывод:
Код - Python [Выбрать]
  1. import array
  2. import comtypes.client
  3. import comtypes
  4.  
  5. app = comtypes.client.GetActiveObject('AutoCAD.Application')
  6. thisdrawing = app.ActiveDocument
  7.  
  8. # blk,_ = thisdrawing.Utility.GetEntity()
  9. blk = thisdrawing.HandleToObject('332A')
  10. print(blk.Handle)
  11. print(f'Наличие атрибутов у блока: {blk.HasAttributes}')
  12. blk.GetAttributes()
  13.  

332A
Наличие атрибутов у блока: True

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-45-72048c5e4e02> in <module>
     10 print(blk.Handle)
     11 print(f'Наличие атрибутов у блока: {blk.HasAttributes}')
---> 12 blk.GetAttributes()

D:\Programs\lib\site-packages\comtypes\automation.py in __ctypes_from_outparam__(self)
    504     def __ctypes_from_outparam__(self):
    505         # XXX Manual resource management, because of the VARIANT bug:
--> 506         result = self.value
    507         self.value = None
    508         return result

D:\Programs\lib\site-packages\comtypes\automation.py in _get_value(self, dynamic)
    455             return value
    456         elif self.vt & VT_ARRAY:
--> 457             typ = _vartype_to_ctype[self.vt & ~VT_ARRAY]
    458             return cast(self._.pparray, _midlSAFEARRAY(typ)).unpack()
    459         else:

KeyError: 9



Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 11601
  • Карма: 1504
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #123 : 04-04-2019, 14:31:58 »
Может это связано что это динамический блок.
Нет. Это уж точно тут не причем. Если этот же код с этим же блоком у тебя сработает в VBA, то тогда это проблема Python'а.
Особенно интересно вот это:
Цитировать
# XXX Manual resource management, because of the VARIANT bug:
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 129
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #124 : 04-04-2019, 14:37:27 »
А может быть это связано с недоработками в библиотеке comtypes?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 11601
  • Карма: 1504
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #125 : 04-04-2019, 14:38:53 »
А может быть это связано с недоработками в библиотеке comtypes?
Вполне возможно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alexll

  • ADN OPEN
  • Сообщений: 11
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #126 : 24-04-2019, 06:45:30 »
А кто может подсказать как из питона 3.7 работать с цветами.
В букваре есть такой пример:
 
Код - vb.net [Выбрать]
  1.     Dim color As AcadAcCmColor
  2.         Set color = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.16")
  3.     Call color.SetRGB(80, 100, 244)
  4.     layerObj.TrueColor = color

С вижуал бейсиком совсем не знаком, но на сколько понимаю переменная color должна стать каким то специальным автокадовским типом. У меня же не получается запустить подобную конструкцию.

Код - Python [Выбрать]
  1. app = win32com.client.Dispatch("AutoCAD.Application")
  2. color = app.GetInterfaceObject("AutoCAD.AcCmColor.16")

Пробовал и попроще:

Код - Python [Выбрать]
  1. lay.TrueColor = 'Зеленый'
  2. lay.TrueColor = 'Green'
  3. lay.TrueColor=(80,100,244)
  4.  
  5. color = convert_coordinates(80,100,244)
  6. lay.TrueColor=color

И то же ничего не получается. Если кто знает как с цветами работать, подскажите пожалуйста

Оффлайн Alexll

  • ADN OPEN
  • Сообщений: 11
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #127 : 24-04-2019, 15:10:13 »
Разобрался.
Для 15го автокада нужно указывать "AutoCAD.AcCmColor.20". В остальном все работает по букварю

Оффлайн SilverWork

  • ADN OPEN
  • Сообщений: 10
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #128 : 05-05-2019, 21:47:19 »
Подскажите, как в Python использовать функции с необязательными параметрами? Например, Utiliy.GetPoint(Point, Prompt) имеет два параметра, и мне хотелось-бы не указывать Point, но использовать Prompt. Вариант Utility.GetPoint(None, "Сообщение") вызывает ошибку.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 11601
  • Карма: 1504
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #129 : 05-05-2019, 22:18:51 »
Вариант Utility.GetPoint(None, "Сообщение") вызывает ошибку.
А так: Utility.GetPoint("Сообщение") ?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн SilverWork

  • ADN OPEN
  • Сообщений: 10
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #130 : 05-05-2019, 23:29:35 »
Пробовал, тоже не работает. Работает только совсем без аргументов.

Выдает такое вот сообщение об ошибке

return self.aDoc.Utility.GetPoint(Msg)
  File "<COMObject <unknown>>", line 3, in GetPoint
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\dynamic.py", line 287, in _ApplyTypes_
    result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)
pywintypes.com_error: (-2147352567, 'Ошибка.', (0, 'AutoCAD', 'Недопустимый аргумент Point в GetPoint', 'C:\\Program Files\\Autodesk\\AutoCAD 2019\\HELP\\OLE_ERR.CHM', -2145320939, -2147024809), None)


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 11601
  • Карма: 1504
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #131 : 05-05-2019, 23:35:33 »
Ну тогда что-нибудь типа Utility.GetPoint(pythoncom.Empty,"Сообщение") или Utility.GetPoint(pythoncom.Missing,"Сообщение")
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн SilverWork

  • ADN OPEN
  • Сообщений: 10
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #132 : 06-05-2019, 15:04:36 »
Спасибо. С pythoncom.Empty все отлично работает.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 11601
  • Карма: 1504
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #133 : 06-05-2019, 15:44:14 »
Спасибо. С pythoncom.Empty все отлично работает.
Отлично. Не имея возможности проверить я интуитивно догадался, что именно может помочь. Так как использование Python для AutoCAD мягко говоря не очень распространено и не поддерживается Autodesk, то поиск решений таких казалось бы простых задач очень усложнён.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн SilverWork

  • ADN OPEN
  • Сообщений: 10
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #134 : 07-05-2019, 11:16:05 »
Примерно месяц занимаюсь изучением Python и его применением в AutoCad. Все выглядит не так сложно, даже для непрофессионального программиста. Для меня приемущества Python над LISP перевешивают неудобства связи AutoCad со сторонним приложением. Также я никогда не писал ничего с помощью ObjectARX, но есть несколько идей. Я правильно понимаю, что смогу написать модуль на С++ с использованием ObjectARX и потом им пользоваться в программе на Python?