Python & ActiveX/COM Autocad

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #525 : 22-04-2022, 17:26:47 »
choppylion,
Вместо
Код - Python [Выбрать]
  1. src_doc.CopyObjects(src_obj_array, new_block)
должно быть
Код - Python [Выбрать]
  1. src_doc.CopyObjects(src_obj_array, dst_doc.Blocks)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн choppylion

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #526 : 23-04-2022, 21:08:29 »
choppylion,
Вместо
Код - Python [Выбрать]
  1. src_doc.CopyObjects(src_obj_array, new_block)
должно быть
Код - Python [Выбрать]
  1. src_doc.CopyObjects(src_obj_array, dst_doc.Blocks)
Пробовал так. Код успешно отрабатывает, но блок так и не появляется среди доступных в панели Insert.

Но обнаружил интересную вещь: мой изначальный блок состоит из 6 отдельных объектов, все они передаются в функцию CopyObjects как один блок в таком виде:
Код - Python [Выбрать]
  1. win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_DISPATCH, block)

и CopyObjects возвращает мне не 1 блок, как я ожидаю, а 6 отдельных объектов:
Цитировать
result = {tuple: 6} (<COMObject CopyObjects>, <COMObject CopyObjects>, <COMObject CopyObjects>, <COMObject CopyObjects>, <COMObject CopyObjects>, <COMObject CopyObjects>)
 0 = {CDispatch} <COMObject CopyObjects>
 1 = {CDispatch} <COMObject CopyObjects>
 2 = {CDispatch} <COMObject CopyObjects>
 3 = {CDispatch} <COMObject CopyObjects>
 4 = {CDispatch} <COMObject CopyObjects>
 5 = {CDispatch} <COMObject CopyObjects>

Может быть, я как-то не так "подготавливаю" свой динамический блок для копирования, что он потом распадается на составные объекты?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #527 : 23-04-2022, 21:49:43 »
new_block = dst_doc.Blocks.Add(insertion_point, name)
Этого быть не должно. Иначе ты сразу создаешь блок, который неможет быть динамическим.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн choppylion

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #528 : 23-04-2022, 22:35:49 »
Танцы с бубном вокруг Array не привели к успеху — Автокад жаловался на некорректный размер массива.
Проблема была в том, что при передаче описания блока с составными объектами через Array в CopyObjects, сама сущность блока терялась, и передавались уже его внутренние объекты.

Удалось костыльно пофиксить следующим образом: создаем в исходном документе еще один блок, в который включаем референс нужного нам блока.
Если "запаковать" исходный блок в еще один блок упомянутым способом, то при его распаковке для передачи в CopyObjects уже остается нужный нам исходный блок, который успешно появляется в меню Insert.
« Последнее редактирование: 24-04-2022, 11:14:38 от choppylion »

Оффлайн Шашлык

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #529 : 25-05-2022, 03:19:04 »
Всем привет!
Никто не сталкивался выбором одного из запущенных экземпляров autocad?
Если в автокаде включена настройка, что при запуске файла запускается новый экземпляр автокада, есть ли возможность подключится к нужному мне экземпляру? То есть это не новый документ открывается в уже созданном, а именно новый процесс.
 

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #530 : 25-05-2022, 08:54:50 »
Шашлык,
Если вкратце, то возможности выбрать один из запущенных экземпляров одной и той же версии AutoCAD нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Yn.rza

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #531 : 06-08-2022, 19:40:51 »
Здравствуйте, я новичок в этой теме и очень прошу помочь с следующей проблемой. У блоков которые я использую в чертежах есть свойство "Отраженное состояние", которое получается прочитать, но при попытке изменить - ошибка, хотя разрешенные состояния "AllowedValues" выводятся как int ноль и единица
Код - Python [Выбрать]
  1. def selection_user():
  2.         try:
  3.             cad.ActiveDocument.SelectionSets.Item("SS1").Delete()
  4.         except Exception:
  5.             logger.debug('Delete selection failed')
  6.         selection = cad.ActiveDocument.SelectionSets.Add('SS1')
  7.         selection.SelectOnScreen(FilterType, FilterData)
  8.         return selection
  9. ssget = selection_user()
  10. #print(ssget.Count)
  11. for obj in ssget:
  12.     if obj.EffectiveName == "KLEMMA_1":
  13.          prop = obj.GetDynamicBlockProperties()
  14.          prop[3].Value = 1

com_error: (-2147352567, 'Ошибка.', (0, 'AutoCAD.Application', 'Неверный ввод', 'C:\\Program Files\\Autodesk\\AutoCAD 2017\\HELP\\OLE_ERR.CHM', -2145386493, -2145386493), None)
проблем с изменением других свойств блоков нет
« Последнее редактирование: 06-08-2022, 19:46:47 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #532 : 06-08-2022, 19:46:11 »
Yn.rza,
А какие значения у FilterType и FilterData?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Yn.rza

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #533 : 06-08-2022, 19:51:10 »
Код - Python [Выбрать]
  1. FilterType = [0]
  2. FilterData = ["INSERT"]
  3. FilterType = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_I2, FilterType)
  4. FilterData = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, FilterData)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #534 : 06-08-2022, 19:53:59 »
Yn.rza,
Новый вопрос. А какое значение у prop[3].Value перед тем, как ты пытаешься его изменить?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Yn.rza

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #535 : 06-08-2022, 20:13:00 »
у него значение 0,
Отраженное состояние = Без отражения - это в автокаде в панеле свойств блока

Код - Python [Выбрать]
  1. print(prop[3].PropertyName, prop[3].Value)
  2. print(type(prop[3].Value))
  3. print(prop[3].AllowedValues)
  4. print(prop[3].ReadOnly)
дает следующее:

Отраженное состояние 0
<class 'int'>
(0, 1)
False

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #536 : 06-08-2022, 20:18:58 »
у него значение 0,
Я правильно понимаю, что ты распечатал это значение и убедился, что оно 0?
У DynamicBlockReferenceProperty значение должно быть типа Variant (смотри документацию). Так что думаю, что должно быть как-то так:
Код - Python [Выбрать]
  1. prop[3].Value = win32com.client.VARIANT(pythoncom.VT_I2, 1)
Возможно вместо pythoncom.VT_I2 должно быть pythoncom.VT_I4
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Yn.rza

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #537 : 06-08-2022, 20:52:57 »
Спасибо огромное, так работает!
а я до этого пробовал
prop[3].Value = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_I2, [1])

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #538 : 06-08-2022, 20:55:45 »
а я до этого пробовал
prop[3].Value = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_I2, [1])
Пытался массив подсунуть? ;)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Yn.rza

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #539 : 06-08-2022, 20:58:44 »
получается да, по аналогии с FilterType