Python & ActiveX/COM Autocad

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

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

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #270 : 24-03-2020, 23:50:12 »
Пример, как я пробовал. Подскажите, как что можно исправить.

Код - Python [Выбрать]
  1. import win32com.client
  2. import pythoncom
  3.  
  4. app = win32com.client.Dispatch("AutoCAD.Application")
  5. acadDoc = app.ActiveDocument
  6. mSp = acadDoc.ModelSpace
  7.  
  8. block_1 = acadDoc.Blocks.Item("блок 1")
  9. block_2 = acadDoc.Blocks.Item("блок 2")
  10.  
  11. lst_1 = [e for e in block_1]
  12. lst_2 = [e for e in block_2]
  13.  
  14. def BLOCK(list):
  15.     return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (list))
  16.  
  17. v_lst_1 = BLOCK(lst_1)
  18. v_lst_2 = BLOCK(lst_2)
  19.  
  20. acadDoc.CopyObjects(v_lst_2, v_lst_1)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #271 : 24-03-2020, 23:52:09 »
В примере выше есть строка: b_name = f"{o_blk.Name}_{i:02d}", это на JSON. Как это интерпретировать для питона?
Это к теме не имеет отношения - это лишь для формата имени блока.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #272 : 24-03-2020, 23:56:19 »
1. Почему pythoncom.VT_R8 ???
2. Должно быть как-то так  (если копировать объекты блока 1 в блок 2):
Код - Python [Выбрать]
  1. acadDoc.CopyObjects(v_lst_1, block_2)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #273 : 25-03-2020, 00:00:21 »
2. Должно быть как-то так  (если копировать объекты блока 1 в блок 2):
Пробовал и так. Выдает:
TypeError: float() argument must be a string or a number, not 'CDispatch'

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #274 : 25-03-2020, 00:02:50 »
1. Почему pythoncom.VT_R8
Честно и сам не очень понимаю этот момент. Брал из другого примера для преобразования данных в массив.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #275 : 25-03-2020, 00:13:41 »
1. Почему pythoncom.VT_R8
Честно и сам не очень понимаю этот момент. Брал из другого примера для преобразования данных в массив.
Не нужно бездумно копипастить. Объекты AutoCAD - это не плавающие числа. Поэтому вместо pythoncom.VT_R8 должно быть (скорее всего) pythoncom.VT_DISPATCH.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #276 : 25-03-2020, 00:26:51 »
И вообще в этом примере есть всё, что нужно: https://adn-cis.org/forum/index.php?topic=7864.msg42066#msg42066
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #277 : 25-03-2020, 00:29:17 »
это на JSON
Это он случайно выбрал не тот тип форматирования - вместо Python указал JSON.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #278 : 26-03-2020, 23:29:49 »
Не нужно бездумно копипастить. Объекты AutoCAD - это не плавающие числа. Поэтому вместо pythoncom.VT_R8 должно быть (скорее всего) pythoncom.VT_DISPATCH.
Благодарю за этот комментарий! Основная часть пройдена: в блок 1 вставились все элементы блока 2! Теперь нужно удалить (или это нужно было сделать сначала), все первоначальные элементы из блока 1. Как это можно сделать?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Python & ActiveX/COM Autocad
« Ответ #279 : 26-03-2020, 23:57:03 »
ИМХО лучше будет удалить все вхождения "Блок1", а потом уже удалить его описание.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #280 : 27-03-2020, 00:02:21 »
ИМХО лучше будет удалить все вхождения "Блок1", а потом уже удалить его описание.
А это не приведет к удалению блока 1 из тех мест, где он находится в файле? Задача стоит в том, что бы элементы блока 1 заменились на элементы блока 2, при этом все местоположения блока 1 в модели должны сохраниться.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #281 : 27-03-2020, 00:14:10 »
Задача стоит в том, что бы элементы блока 1 заменились на элементы блока 2, при этом все местоположения блока 1 в модели должны сохраниться.
Так может достаточно у вставок блока поменять свойство Name с "Блок 1" на "Блок 2" ???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #282 : 27-03-2020, 00:19:19 »
Так может достаточно у вставок блока поменять свойство Name с "Блок 1" на "Блок 2"
Идея правильная, но как это сделать через питон?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #283 : 27-03-2020, 12:31:15 »
Так может достаточно у вставок блока поменять свойство Name с "Блок 1" на "Блок 2"
Идея правильная, но как это сделать через питон?
Выбрать все вставки блока с именем "Блок 1" и изменить им свойство Name на "Блок 2". На питоне не пишу, поэтому код не предоставлю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #284 : 01-04-2020, 12:41:35 »
Пробую так:
Код - Python [Выбрать]
  1. block_1 = acadDoc.Blocks.Item("блок 1")
  2. block_1.Name = 'блок 2'

Выдает ошибку. Имя можно менять только на новое, например "блок 3", тогда ошибку не выдает.