Python & ActiveX/COM Autocad

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

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

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Python & ActiveX/COM Autocad
« Ответ #510 : 15-04-2022, 22:00:10 »
Derie1, а удаление выполняется только для "обычных" вхождений? А состояние слоев игнорируется специально? А описания блоков удалять не надо?
P.S. Я в питоне как известное животное в известных плодах.
P.P.S. Я бы не стал делать ставку на именованные наборы примитивов.
Все, что сказано - личное мнение.

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

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

Оффлайн dlobyntsev

  • ADN Club
  • Сообщений: 18
  • Карма: 8
Re: Python & ActiveX/COM Autocad
« Ответ #511 : 15-04-2022, 23:01:12 »
Ну и так далее. При этом у меня на домашнем компе, код намного более стабильно работает, чем на рабочем..
Пока не получается повторить ошибки. Протестирую на доступных компьютерах, подумаю как сделать диагностику у вас поинформативней и отпишусь.

Оффлайн Derie1

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #512 : 15-04-2022, 23:23:34 »
Derie1, а удаление выполняется только для "обычных" вхождений? А состояние слоев игнорируется специально? А описания блоков удалять не надо?
Не совсем понял, что имеете в виду под "обычными" вхождениями?
Слои, даже не знаю, нужно ли их учитывать. По идее же все равно на слои.
Описания блоков удалять не надо, т.к. потом они же должны вставляться с новыми значениями параметров. Скрипт строит однолинейную схему электрических щитов. Удаление блоков нужно для внесения изменений в ранее созданный щит.
Задумка такая у меня. Вообще скрипт состоит из 2-х больших частей.
1 - открытие файла, удаление всех целевых блоков;
2 - вставка блоков и заполнение текстовых параметров из расчетной таблицы эксель.
Удаление целевых блоков нужно для внесения изменений (изменится может и количество блоков в схеме, поэтому, никак кроме как удаление всех элементов и вставка по новой с заполнением параметров не знаю как это сделать).

Протестирую на доступных компьютерах, подумаю как сделать диагностику у вас поинформативней и отпишусь.
Вот ссылка на мой GitHub по этому скрипту. Там в подпапке test_files есть файл SLD_full.dwg. На нем можно протестировать удаление блоков этих.

Оффлайн dlobyntsev

  • ADN Club
  • Сообщений: 18
  • Карма: 8
Re: Python & ActiveX/COM Autocad
« Ответ #513 : 15-04-2022, 23:32:16 »
Вот ссылка на мой GitHub по этому скрипту. Там в подпапке test_files есть файл SLD_full.dwg
Ничто не ново под луной. Аналогичную штуку написал лет 5 назад :)

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Python & ActiveX/COM Autocad
« Ответ #514 : 16-04-2022, 09:02:08 »
Я про то, что обрабатывать вхождения блоков внутрь других блоков не надо?
Если заранее известно, что надо обрабатывать только пространство модели, то почему бы не получить указатель именно на него и проходить по нему? Без создания / удаления именованных наборов.
Примерно так:
Код - Python [Выбрать]
  1. app = QtWidgets.QApplication([])
  2. # acad = win32com.client.Dispatch("AutoCAD.Application")
  3. acad = pyacadcom.AutoCAD()
  4. dwg_file = QtWidgets.QFileDialog.getOpenFileName(caption="Выберите файл шаблона или схемы в AutoCAD... ",
  5.                                                  filter="DWG (*.dwg)")[0]  # выбираем исхоный файл
  6. doc = acad.Documents.Open(dwg_file)
  7. for obj in doc.ModelSpace:
  8.     if obj.ObjecName="AcDbBlockReference" and (obj.EffectiveName == "TOTAL" or obj.EffectiveName == "KNF" or obj.EffectiveName == "INCOMER" or obj.EffectiveName == "AUTOMAT" or obj.EffectiveName == "LINE"):
  9.         obj.Delete()
  10.  
Касаемо слоев - если блок вдруг окажется на заблокированном / замороженном слое, удалить его не получится подобным образом.
Все, что сказано - личное мнение.

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

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

Оффлайн Derie1

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #515 : 19-04-2022, 12:06:53 »
Примерно так:
Ваш вариант имеет место быть. Он работает, но у него все те же проблемы. Периодически, рандомно, вылетают ошибки типа "pywintypes.com_error: (-2147418111, 'Вызов был отклонен.', None, None)"

А я вот подумал, а нельзя ли при создании SelectionSet в фильтр прописать не просто все блоки в файле, а все блоки с определенным именем, после чего просто стереть все элементы сета через Erase()? Или сперва сделать сет со всеми блоками, а потом их перебрать и блоки с нужными именами закинуть в другой сет и потом его целиком удалить.
Такой подход сократит количество обращений к автокаду, а соответственно, сократит количество возможных ошибок этих.

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Python & ActiveX/COM Autocad
« Ответ #516 : 19-04-2022, 12:22:56 »
При таком подходе не удастся получить вхождения динамических блоков.
В одном из чатов мелькнуло (цитирую):
"Добрый день, коллеги.
Думаю, все сталкивались с ошибкой -2147418111 "Call was rejected by callee"/"Вызов был отклонен" при работе с кадом из чистого питона. Удалось решить проблему. Для удобства оформил модуль pyacadcom. Устанавливается стандартно через pip.
В коде нужно импортировать модуль и создать объект:
import pyacadcom
acad = pyacadcom.AutoCAD()
Дальше все как обычно согласно объектной модели автокад."
Что это, с чем его едят и как устанавливают - лично я без понятия. Может, и сработает?
Все, что сказано - личное мнение.

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

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

Оффлайн Derie1

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #517 : 19-04-2022, 12:28:55 »
Алексей Кулик,
Да, я перешел на этот модуль, но все равно ошибки случаются...

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Python & ActiveX/COM Autocad
« Ответ #518 : 19-04-2022, 12:34:18 »
Ну тогда сорри, дальше идей нет :(
Все, что сказано - личное мнение.

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

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

Оффлайн dlobyntsev

  • ADN Club
  • Сообщений: 18
  • Карма: 8
Re: Python & ActiveX/COM Autocad
« Ответ #519 : 19-04-2022, 14:15:20 »
Алексей Кулик,
Да, я перешел на этот модуль, но все равно ошибки случаются...
Модуль допилим :)

Оффлайн Derie1

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #520 : 20-04-2022, 09:38:23 »
Модуль допилим :)

Огромное спасибо, dlobyntsev!

После пары обновлений модуля pyacadcom ошибки пропали. Конечно, я продолжу тестировать, и распространю свой скрипт среди коллег - тоже будут тесты. Но пока в версии модуля 0.0.9 ошибок не наблюдается. Огромное спасибо dlobyntsev!

Просто обращаемся к Автокаду через модуль, а дальше все как обычно:
Код - Python [Выбрать]
  1. import pyacadcom
  2.  
  3. acad = pyacadcom.AutoCAD()

Оффлайн choppylion

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #521 : 22-04-2022, 13:36:32 »
Добрый день. Возникла проблема с копированием описания динамического блока из одного документа в другой — после "вставки" описания блока, он перестает быть динамическим.

Код скрипта:
Код - Python [Выбрать]
  1. src_obj = src_doc.Blocks.Item(block_name)
  2. print("Src:", src_obj.IsDynamicBlock)
  3.  
  4. src_obj_array = ARRAY(src_obj)
  5. insertion_point = POINT(src_obj.Origin)
  6. name = src_obj.Name
  7.  
  8. new_block = dst_doc.Blocks.Add(insertion_point, name)
  9. src_doc.CopyObjects(src_obj_array, new_block)
  10. print("New:", new_block.IsDynamicBlock)

И на выходе соответственно получаю:
Код - Python [Выбрать]
  1. Src: True
  2. New: False

Подскажите, пожалуйста, каким же образом правильно копировать динамические блоки? Со статическими проблем не было, и данного кода хватало

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Python & ActiveX/COM Autocad
« Ответ #522 : 22-04-2022, 13:38:37 »
А в питоне нет метода CopyObjects ?
Все, что сказано - личное мнение.

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

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

Оффлайн choppylion

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #523 : 22-04-2022, 15:37:10 »
А в питоне нет метода CopyObjects ?
А какой встроенный питоновский метод вы имеете в виду?
Я пользуюсь методом CopyObjects объекта типа Document: https://help.autodesk.com/view/OARX/2019/ENU/?guid=GUID-D9E0A89C-2D81-4141-8B88-B9AC6EAABD62

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Python & ActiveX/COM Autocad
« Ответ #524 : 22-04-2022, 15:45:43 »
А, сорри, не увидел сначала. Мне кажется, что копируется вхождение блока, а надо копировать описание. На лиспе-то я напишу, а вот на питоне - увы и ах.
Все, что сказано - личное мнение.

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

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