Python & ActiveX/COM Autocad

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #285 : 01-04-2020, 12:45:57 »
Пробую так:
Код - Python [Выбрать]
  1. block_1 = acadDoc.Blocks.Item("блок 1")
  2. block_1.Name = 'блок 2'

Выдает ошибку. Имя можно менять только на новое, например "блок 3", тогда ошибку не выдает.
Имя нужно присваивать не Block (описание блока), а BlockReference (вставка блока), о чем я выше и писал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #286 : 01-04-2020, 13:44:27 »
Имя нужно присваивать не Block (описание блока), а BlockReference (вставка блока), о чем я выше и писал.
Ох, никак не могу понять, как применить BlockReference в питоне...
Может есть ссылка на подобные примеры?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #287 : 01-04-2020, 13:58:30 »
Ох, никак не могу понять, как применить BlockReference в питоне...
На питоне вообще практически нет примеров для работы с AutoCAD.
Алгоритм такой. Тебе нужно найти все BlokReference в чертеже. Для этого ты можешь воспользоваться SelectionSet.Select и указать в качестве фильтра "INSERT" (это и есть BlockReference). Дальше проходишься по всем элементам полученного набора и проверяешь свойство Name - если "Блок 1", то меняешь на "Блок 2".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #288 : 01-04-2020, 14:14:56 »
Начни отсюда и еще несколько следующих сообщений: https://adn-cis.org/forum/index.php?topic=7864.msg40087#msg40087
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #289 : 01-04-2020, 17:40:09 »
Ура! Все заработало, но без SelectionSets, и очень долго, когда в файле много объектов.
Код - Python [Выбрать]
  1. import win32com.client
  2. import pythoncom
  3.  
  4. acad = win32com.client.Dispatch("AutoCAD.Application")
  5. doc = acad.ActiveDocument
  6.  
  7. for entity in acad.ActiveDocument.ModelSpace:
  8.     name = entity.EntityName
  9.     if name == 'AcDbBlockReference':
  10.         NameAttributes = entity.Name
  11.         if NameAttributes == 'блок 1':
  12.             entity.Name = 'блок 2'

Как можно сделать значительно быстрее? Использование SelectionSets поможет убыстрить процес?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #290 : 01-04-2020, 17:43:43 »
Как можно сделать значительно быстрее? Использование SelectionSets поможет убыстрить процес?
Не думаю, что что-то может этот код ускорить. Разве что отказ от Python, который выполняется в отдельном процессе от AutoCAD, что приводит к замедлению.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #291 : 01-04-2020, 17:58:37 »
Не думаю, что что-то может этот код ускорить.
Может быть как-то можно сделать перебор не всех элементов в Модели, а только вставок блока?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #292 : 01-04-2020, 19:34:56 »
Не думаю, что что-то может этот код ускорить.
Может быть как-то можно сделать перебор не всех элементов в Модели, а только вставок блока?
А это как раз можно, но только через SelectionSet
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн mvv_010

  • ADN OPEN
  • Сообщений: 2
  • Карма: 3
Re: Python & ActiveX/COM Autocad
« Ответ #293 : 02-04-2020, 22:53:15 »
Код - Python [Выбрать]
  1. from comtypes.client import CreateObject, GetActiveObject
  2. from array import array
  3.  
  4. try:
  5.     acad = GetActiveObject("AutoCAD.Application", dynamic=True)
  6. except:
  7.     acad = CreateObject("AutoCAD.Application", dynamic=True)
  8.  
  9. try:
  10.     select = acad.ActiveDocument.SelectionSets.Add("SSET_Blocks")
  11. except:
  12.     select = acad.ActiveDocument.SelectionSets.Item("SSET_Blocks")
  13.     select.Clear()
  14.  
  15. # all_block = [block.Name for block in acad.ActiveDocument.Blocks]
  16. # Имена всех блоков в чертеже включая ModelSpace и PaperSpace
  17.  
  18. Name_Block = ""# Имя вашего блока
  19. FilterType = array("h", [0, 2])# Коды в документации к DXF
  20. FilterDate = ["INSERT", Name_Block]
  21. SelectAll = 5# Режим выбора
  22. point = array("d", [0, 0, 0])
  23.  
  24. select.Select(SelectAll, point, point, FilterType, FilterDate)
  25. print("Select blocks:", select.Count)
  26. for obj in select:# Перебор выбранных элементов
  27.     pass
  28.  
  29. acad = None
  30.  

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #294 : 02-04-2020, 23:03:58 »
mvv_010,
Код 100 не нужен. И вообще фильтрация по этому коду не работает в большинстве случаев.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #295 : 04-04-2020, 01:19:41 »
Подскажите, как можно поменять прорисовку текста, а точнее вынести на передний план?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #296 : 04-04-2020, 15:01:10 »
Подскажите, как можно поменять прорисовку текста, а точнее вынести на передний план?
Посмотри в документации метод MoveToTop. Там и пример есть на VBA: https://knowledge.autodesk.com/ru/search-result/caas/CloudHelp/cloudhelp/2016/RUS/AutoCAD-ActiveX/files/GUID-0FA80CF9-427C-40F1-A400-BFD4AE81EE99-htm.html
« Последнее редактирование: 04-04-2020, 17:39:53 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 152
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #297 : 10-04-2020, 15:16:01 »
Доброго дня!
Подскажите, куда копать,
У меня в чертеже два блока, разбиваю оба функцией

Код - Python [Выбрать]
  1. blk.Explode()

При этом оба блока разбиваются, но при выполнении этой функции с одним из блоков, функция возвращает список элементов получившихся при рабивании,
а для другого блока возвращается пустой список. Причем фактически в чертеже оба блока разбиваются. Есть ли идеи с чем это может быть связано? (Может быть связано с масштабами?)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #298 : 10-04-2020, 15:19:44 »
DMuzer,
Нужно смотреть на блоки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 152
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #299 : 10-04-2020, 15:20:18 »
Да, странное дело, у того блока, который не возвращал массива элементов установлен масштаб 110, меняю на 100, функция начинает возвращать элементы.
Почему?
Выяснилась такая штука, ошибочно  масштаб по Z отличался от масштабав по Х и Y. В этой ситуации функция не возвращает списка объектов.