Python для AutoCAD реальность или утопия?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Python для AutoCAD реальность или утопия?

Python для AutoCAD реальность или утопия?

Ответ
Поиск в этой теме
Непрочитано 25.08.2025, 15:24 #1
Python для AutoCAD реальность или утопия?
posetitel
 
Регистрация: 16.10.2013
Сообщений: 401

Здравствуйте, коллеги!
Который день пытаюсь накидать простенькую программку на питоне для автокада.
Смысл программки простой: подключились к акаду, запросили у пользователя выбрать объекты, потом запустили первую функцию (пусть будет преобразовать полилинии в отрезки), запустили вторую функцию (пусть будет назначить масштаб мультивыноскам), завершили работу.
Кое-что получается, но работает нестабильно, постоянно отваливается (как я понял) COM-соединение. То после выбора объектов, то на одной из функций. Чего я только не делал (по совету отечественного гигачата):
- и запускал повторные попытки ком-соединения,
- и подгружал объекты в память питона, отключался от акада, выполнял все операции в памяти, далее подключался к акаду, чтобы обновить объекты,
- и пытался удерживать соединение,
все тщетно.
Сбои случаются не сразу и не регулярно, вроде как даже можно мириться с периодическим падением скрипта и запускать его повторно.
Но может я захожу не в ту дверь? Как можно добиться стабильной работы скрипта без ошибок ком-соединения?

Последний раз редактировалось posetitel, 25.08.2025 в 16:28.
Просмотров: 1796
 
Непрочитано 26.08.2025, 07:52
| 1 #2
trir


 
Регистрация: 18.12.2010
Сообщений: 5,116


Используй C#, Python для мазохистов
trir вне форума  
 
Непрочитано 26.08.2025, 08:14
#3
gumel


 
Регистрация: 20.04.2011
Сообщений: 502


Цитата:
Сообщение от trir Посмотреть сообщение
Используй C#, Python для мазохистов
А C# использует какой-то особый способ связи с AutoCAD?

Я вот например учил Delphi, и большинство программ связанных с AutoCAD написаны на Паскале и связь через OLE компоненты.
Но матёрые программисты мне всегда говорили, что COM это для извращенцев и для Автокада надо делать на Лиспе..
gumel вне форума  
 
Непрочитано 26.08.2025, 09:07
1 | #4
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616


Цитата:
Сообщение от gumel Посмотреть сообщение
А C# использует какой-то особый способ связи с AutoCAD?
Ага. Если по простому, то Dll написанные на C# грузятся внутрь автокада и там, внутри, работают.
Цитата:
Сообщение от gumel Посмотреть сообщение
Но матёрые программисты мне всегда говорили, что COM это для извращенцев и для Автокада надо делать на Лиспе..
Так было лет 20 назад, с тех пор мир вокруг и автокад немного поменялись.
Boxa вне форума  
 
Автор темы   Непрочитано 26.08.2025, 10:28
#5
posetitel


 
Регистрация: 16.10.2013
Сообщений: 401


Советы перейти на шарп звучат ото всюду, и я уверен, что они хорошие эти советы, ничего против не имею. Даже скачал себе VS Studio (тяжелая, доложу я вам, прога) и стал пытаться что-то там налабать. Не взлетело так с наскока. Нужно погружаться.
Если упрощенно представить мои такие обывательские попытки в разных языках под акад, то Пайтон, VBA - это такие железобетонные готовые панели, целые блоки кода в одном методе, а C# да и лисп где-то рядом - это маленькие кирпичики, каждый метод нужно набирать из более мелких. Отсюда следствие - из кирпичиков можно собрать гораздо более разнообразное строение, более удобное и приспособленное под конкретного обывателя, нежели типовые коробки по серии, но и трудозатраты будут соответствующие.
Возвращаясь к примеру из темы, я решил, что не стоит упарываться в подробную детальную разработку довольно простенького приложеница, немного упрощающего процесс черчения. В конечном счете затраты на выполнение сих операций руками с помощью меню автокада, будут куда меньше по сравнению даже с процессом просто скачивания и установки VS Studio. Вокруг все говорят про питон. Так может питон уже и в автокаде есть, может такие простенькие программки уже давно люди пишут на питоне путем указания всего лишь двух методов, типа скачай замени, молодец, выведи отчет в консоль? Но не тут то было. И здесь встретились подводные камни. Потому и вопрос. Может я что-то не то делаю в этих питонах?

----- добавлено через ~4 мин. -----
ПС: ну и в довесок, что сильно разочаровало, так это необходимость выключать и заново запускать автокад, чтобы попробовать изменения в коде. Питон переписал и запускаешь на уже открытом чертеже, а вот библиотеку dll надо пересобрать, загрузить и запустить. В режиме отладки все равно каждый раз автокад стартует с нуля.

Последний раз редактировалось posetitel, 26.08.2025 в 10:35.
posetitel вне форума  
 
Непрочитано 26.08.2025, 10:43
1 | #6
trir


 
Регистрация: 18.12.2010
Сообщений: 5,116


Цитата:
В режиме отладки все равно каждый раз автокад стартует с нуля.
я пришёл к тому, что отделил методы работы c AutoCAD от остальной программы - это позволило тестировать код без запуска AutoCAD
https://github.com/triroakenshield/RosReestrImpLib
trir вне форума  
 
Непрочитано 26.08.2025, 10:45
1 | #7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,452


Через COM далеко не все можно сделать, к сожалению.
А так - в гугле забанили? Чуть ли не на первых строках поиска : https://adn-cis.org/forum/index.php?topic=7864.0
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.09.2025, 13:24
#8
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 730


Цитата:
Сообщение от posetitel Посмотреть сообщение
Кое-что получается, но работает нестабильно, постоянно отваливается (как я понял) COM-соединение. То после выбора объектов, то на одной из функций.
Цитата:
Сообщение от posetitel Посмотреть сообщение
Сбои случаются не сразу и не регулярно, вроде как даже можно мириться с периодическим падением скрипта и запускать его повторно.
Очень похоже на отсутствие контроля за временем жизни переменных. Это когда сборщик мусора удаляет данные которые не нужно удалять.

У автокада своя жизнь и своя память и у питона своя. Может получиться так, что в питоне вам переменная уже не нужна, вы её обнулили или уничтожили после чего сборщик мусора питона прошелся по данным этой переменной и сделал не валидными данные связанные с COM соединением в то время как автокад думает, что на стороне питона эти данные валидны.

Это мнение может быть ошибочным. Но в технологиях COM и FFI именно сборщики мусора являются причиной по которым нештатные ситуации происходят неожиданно и незакономерно.

В питоне есть функция gc.collect(). Попробуйте вызывать её там где ожидаете сбой и посмотрите не станут ли сбои контролируемыми.
mmax вне форума  
 
Автор темы   Непрочитано 08.09.2025, 14:02
#9
posetitel


 
Регистрация: 16.10.2013
Сообщений: 401


Вроде зацепился за соломинку, попытался найти закономерность падения, раза три запустил программу, чтобы добиться падения и подловить момент. Обнаружил, что прога падает иногда даже до предполагаемой очистки памяти, т.е. по логике программы нужно сначала выбрать объекты, потом ввести масштаб для этих объектов и только потом стартует алгоритм выполнения программы, но ошибка вылетает между выбором объектов и вводом масштабов. Значит очистка памяти еще не может стартовать.
Вот что в консоль выдает:
Загружено объектов: 393
Ошибка ввода масштаба: (-2147418111, 'Вызов был отклонен.', None, None)
ЧатЖПТ говорит, что это может быть из-аз проблем с COM-соединением.
Опять повторюсь, что чаще программа срабатывает, падения происходят непредсказуемо и не всегда в одном месте.
posetitel вне форума  
 
Непрочитано 08.09.2025, 14:45
1 | 1 #10
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 730


Всё ясно. Это гонка данных при асинхронных операциях.
Питон отправляет в автокад команды не дожидаясь когда выполнится предыдущая. Автокад отклоняет новые запросы пока не завершит предыдущие.

Из рекомендаций что советует интернет:
Увеличить паузы между отправками запросов в автокад. Это очень плохое решение так как не защищает на 100% от сбоя.
Или
В цикле отправлять команду с перехватом ошибки до тех пор пока она не выполнится корректно без ошибки. Это конечно gовногкод (поллинг) но дает 100% результат.

Я рекомендую изучить документацию к библиотекам и найти там штатные способы ожидания завершения команд. Возможно там есть callback функции или что-то на них похожее. Может функции отправки команд в com соединение возвращают ответ в какой-то буфер. Может там есть какой-то контейнер-очередь.

Создатели питоновских библиотек наверняка не оставили этот момент без внимания.

Или тогда использовать цикл с перехватом ошибки и добавить в него паузу чтобы соединение не спамилось бесполезными запросами.
mmax вне форума  
 
Непрочитано 08.09.2025, 15:14
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,452


Ошибка ввода масштаба: (-2147418111
Похоже на переполнение int32. И для тех, кто в шарит в теме (я не шарю, если что!) было бы неплохо посмотреть на код.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.09.2025, 15:26
#12
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 730


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Похоже на переполнение int32
не оно, иначе это была бы постоянная ошибка.
mmax вне форума  
 
Автор темы   Непрочитано 08.09.2025, 15:37
#13
posetitel


 
Регистрация: 16.10.2013
Сообщений: 401


Переполнение целочисленной переменной (int32) тоже вряд ли могло быть, вводил всегда одинаковый масштаб (100, хотя и это не принципиально).
Понимаю желание посмотреть код, но как бы так выразиться, я пытаюсь получить не конкретный совет по нерабочему коду (его сейчас очень много стало и погружаться туда то еще удовольствие), а услышать общие принципы, если такие есть, по подключению питона к автокаду, потому что ошибки COM-соединения - это распространенное явление, как я понял.
К совету mmax про асинхронность и многопоточность прислушиваюсь. Буду пробовать изолировать запросы и выполнять их последовательно.
До этого пытался сделать выгрузку всех примитивов в память питона, там все обработать независимо от автокада и потом вернуть в автокад, применить изменения, но и тут что-то пошло не так. Возможно, просто криво реализовал свое начинание.
posetitel вне форума  
 
Непрочитано 08.09.2025, 17:14
#14
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 730


Цитата:
Сообщение от posetitel Посмотреть сообщение
До этого пытался сделать выгрузку всех примитивов в память питона, там все обработать независимо от автокада и потом вернуть в автокад, применить изменения, но и тут что-то пошло не так.
Мне кажется это плохая затея. Потому-что "примитивы в питоне" они только только для чтения в питоне.
Если в пионе у вас есть объект в котором перечислены ключи => значения объекта автокад, то это просто дамп свойств этого объекта. А с автокадом можно работать только через методы которые принимает com соединение
mmax вне форума  
 
Непрочитано 08.09.2025, 17:31
#15
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,502


Имхо, единственный плюс в вашем варианте - возможность использовать один экземпляр программы для многих версий AutoCAD и при этом пользоваться всей функциональностью питона (в отличии от давно остановившихся в развитии lisp/vba). На этом плюсы заканчиваются и начинается головная боль)

Цитата:
Сообщение от mmax Посмотреть сообщение
Возможно там есть callback функции или что-то на них похожее. Может функции отправки команд в com соединение возвращают ответ в какой-то буфер. Может там есть какой-то контейнер-очередь.
Можно попробовать использовать метод GetAcadState() com-объекта приложения акада (AcadApplication, если не ошибаюсь). Этот метод как раз позволяет узнать - готов акад принять команды через com-интерфейс либо нет.

Цитата:
Сообщение от posetitel Посмотреть сообщение
До этого пытался сделать выгрузку всех примитивов в память питона, там все обработать независимо от автокада и потом вернуть в автокад, применить изменения,
Соовершено верно. В современных языках программирования достаточно средств для комплексной обработки данных - а акад пускай играет роль интерфейса пользователя и функцию вывода результатов.
Сергей812 вне форума  
 
Непрочитано 08.09.2025, 17:41
#16
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 730


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Соовершено верно.
вопрос только умеет ли автокад принимать структуры данных питона и десериализовать их в acad object.
Насколько я помню в com приложения уходит только дамп объекта в виде key-value массива и носит только информационный характер
mmax вне форума  
 
Непрочитано 08.09.2025, 17:52
#17
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,502


Цитата:
Сообщение от mmax Посмотреть сообщение
вопрос только умеет ли автокад принимать структуры данных питона и десериализовать их в acad object.
Насколько я помню в com приложения уходит только дамп объекта в виде key-value массива и носит только информационный характер
нет - можно работать через интерфейс с com-объектами отдельных примитивов чертежа как с объектами классов, представляющими эти примитивы. Но это все грустно - взять современный ЯП Питон и работать при этом с акадом через "замочную скважину" com-интерфейса.
Сергей812 вне форума  
 
Непрочитано 08.09.2025, 20:28
#18
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 730


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Но это все грустно - взять современный ЯП Питон и работать при этом с акадом через "замочную скважину" com-интерфейса.
Ну а как по другому? Можно еще клиент-сервер на сокетах замутить и получится примерно то же самое. Может даже лучше потому-что асинхронные вызовы на сокетах выстраиваются в очередь и не будут конфликтовать. Кроссплатформенность полная будет. Все вычисления можно делегировать веб-серверам и делать браузерные версии автокада.
mmax вне форума  
 
Непрочитано вчера, 07:12
#19
trir


 
Регистрация: 18.12.2010
Сообщений: 5,116


Цитата:
и делать браузерные версии автокада
или не связываться с ним и просто писать dxf

Последний раз редактировалось trir, вчера в 08:32.
trir вне форума  
 
Автор темы   Непрочитано вчера, 08:49
#20
posetitel


 
Регистрация: 16.10.2013
Сообщений: 401


Может быть среди обитателей форума найдутся питонисты, которые поделятся секретом: как, с помощью каких функций, методов или принципов подключаться к автокаду из питона, чтобы избегать ошибок COM-соединения?
posetitel вне форума  
 
Непрочитано вчера, 09:52
#21
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,502


Цитата:
Сообщение от posetitel Посмотреть сообщение
Может быть среди обитателей форума найдутся питонисты, которые поделятся секретом: как, с помощью каких функций, методов или принципов подключаться к автокаду из питона, чтобы избегать ошибок COM-соединения?
избегать не получиться (надо просто обрабатывать ошибки), а ссылку же Алексей в п.7 давал. Можно еще, наверно, попробовать поискать примеры работы с MSOffice из питона через com - основы совершенно одинаковые.
Сергей812 вне форума  
 
Непрочитано вчера, 09:54
#22
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 730


Цитата:
Сообщение от posetitel Посмотреть сообщение
с помощью каких функций, методов или принципов подключаться к автокаду из питона, чтобы избегать ошибок COM-соединения?
Выше говорили.
Повторять один и тот же запрос в цикле до тех пор пока запрос не станет успешным.

Если разрыв соединения вызывает исключение в питоне то использовать try..except

Так жк выше сказали попробовать GetAcadState()

Так же в цикле перед запросом метода работы с примитивами сделать запрос GetAcadState(). Если он успешный, то выполнить команду и выйти из цикла, если безуспешный - повторят пока не станет успешным.
mmax вне форума  
 
Непрочитано вчера, 09:54
#23
румата


 
Регистрация: 06.04.2015
Сообщений: 2,756


Цитата:
Сообщение от posetitel Посмотреть сообщение
Может быть среди обитателей форума найдутся питонисты, которые поделятся секретом: как, с помощью каких функций, методов или принципов подключаться к автокаду из питона, чтобы избегать ошибок COM-соединения?
Секрет простой - нет такого секрета. Питон не для автокада
румата вне форума  
 
Непрочитано вчера, 10:34
#24
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 730


Цитата:
Сообщение от румата Посмотреть сообщение
Питон не для автокада
если в лисп до сих пор не завезли классы, хештаблицы, многопоточность или хотя бы асинхронные функции. То дела у языков для автокада совсем плохи.

А ведь лисп это самый простой язык с безграничными возможностями.
Для понимания синтаксиса надо усвоить лишь одну базу: после открывающей скобки идет имя функции, всё остальное её аргументы. Никаких ключевых слов, операторов, конструкций, ничего больше. Только функции, аргументы и всё. Жаль конечно этого добряка.
mmax вне форума  
 
Непрочитано вчера, 11:42
#25
румата


 
Регистрация: 06.04.2015
Сообщений: 2,756


Цитата:
Сообщение от mmax Посмотреть сообщение
если в лисп до сих пор не завезли классы, хештаблицы, многопоточность или хотя бы асинхронные функции. То дела у языков для автокада совсем плохи.
В с++ и c# все это есть. Никаких плохих дел
румата вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Python для AutoCAD реальность или утопия?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Плагин создания кабельных линий и генерации КЖ раздела КИПиА. Протестировано на AutoCAD 2015...2022 и офис 2013...2019. NanoCAD 23 petro_f Готовые программы 244 26.09.2024 10:25
Видеоуроки AutoCAD kosmax AutoCAD 173 17.02.2017 15:08
AutoCAD 2008: Проблема при печати файла с неизвестным форматом листа Fredyk AutoCAD 3 12.07.2012 12:26
AutoCAD 2008, Функция "Последние Файлы" никак не хочет работать Fredyk AutoCAD 4 05.07.2012 08:35
Стандарт использования AutoCAD в приборостроении (советы и обсуждение) Immortal_6666 AutoCAD 9 06.06.2012 10:11