|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Python для AutoCAD реальность или утопия?
Регистрация: 16.10.2013
Сообщений: 401
|
||
Просмотров: 1796
|
|
||||
Регистрация: 20.04.2011
Сообщений: 502
|
А C# использует какой-то особый способ связи с AutoCAD?
Я вот например учил Delphi, и большинство программ связанных с AutoCAD написаны на Паскале и связь через OLE компоненты. Но матёрые программисты мне всегда говорили, что COM это для извращенцев и для Автокада надо делать на Лиспе.. |
|||
![]() |
|
||||
КЖ; C# Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616
|
Ага. Если по простому, то Dll написанные на C# грузятся внутрь автокада и там, внутри, работают.
Так было лет 20 назад, с тех пор мир вокруг и автокад немного поменялись. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 401
|
Советы перейти на шарп звучат ото всюду, и я уверен, что они хорошие эти советы, ничего против не имею. Даже скачал себе VS Studio (тяжелая, доложу я вам, прога) и стал пытаться что-то там налабать. Не взлетело так с наскока. Нужно погружаться.
Если упрощенно представить мои такие обывательские попытки в разных языках под акад, то Пайтон, VBA - это такие железобетонные готовые панели, целые блоки кода в одном методе, а C# да и лисп где-то рядом - это маленькие кирпичики, каждый метод нужно набирать из более мелких. Отсюда следствие - из кирпичиков можно собрать гораздо более разнообразное строение, более удобное и приспособленное под конкретного обывателя, нежели типовые коробки по серии, но и трудозатраты будут соответствующие. Возвращаясь к примеру из темы, я решил, что не стоит упарываться в подробную детальную разработку довольно простенького приложеница, немного упрощающего процесс черчения. В конечном счете затраты на выполнение сих операций руками с помощью меню автокада, будут куда меньше по сравнению даже с процессом просто скачивания и установки VS Studio. Вокруг все говорят про питон. Так может питон уже и в автокаде есть, может такие простенькие программки уже давно люди пишут на питоне путем указания всего лишь двух методов, типа скачай замени, молодец, выведи отчет в консоль? Но не тут то было. И здесь встретились подводные камни. Потому и вопрос. Может я что-то не то делаю в этих питонах? ----- добавлено через ~4 мин. ----- ПС: ну и в довесок, что сильно разочаровало, так это необходимость выключать и заново запускать автокад, чтобы попробовать изменения в коде. Питон переписал и запускаешь на уже открытом чертеже, а вот библиотеку dll надо пересобрать, загрузить и запустить. В режиме отладки все равно каждый раз автокад стартует с нуля. Последний раз редактировалось posetitel, 26.08.2025 в 10:35. |
|||
![]() |
|
||||
Регистрация: 18.12.2010
Сообщений: 5,116
|
Цитата:
https://github.com/triroakenshield/RosReestrImpLib |
|||
![]() |
|
||||
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-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 730
|
Цитата:
Цитата:
У автокада своя жизнь и своя память и у питона своя. Может получиться так, что в питоне вам переменная уже не нужна, вы её обнулили или уничтожили после чего сборщик мусора питона прошелся по данным этой переменной и сделал не валидными данные связанные с COM соединением в то время как автокад думает, что на стороне питона эти данные валидны. Это мнение может быть ошибочным. Но в технологиях COM и FFI именно сборщики мусора являются причиной по которым нештатные ситуации происходят неожиданно и незакономерно. В питоне есть функция gc.collect(). Попробуйте вызывать её там где ожидаете сбой и посмотрите не станут ли сбои контролируемыми. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 401
|
Вроде зацепился за соломинку, попытался найти закономерность падения, раза три запустил программу, чтобы добиться падения и подловить момент. Обнаружил, что прога падает иногда даже до предполагаемой очистки памяти, т.е. по логике программы нужно сначала выбрать объекты, потом ввести масштаб для этих объектов и только потом стартует алгоритм выполнения программы, но ошибка вылетает между выбором объектов и вводом масштабов. Значит очистка памяти еще не может стартовать.
Вот что в консоль выдает: Загружено объектов: 393 Ошибка ввода масштаба: (-2147418111, 'Вызов был отклонен.', None, None) ЧатЖПТ говорит, что это может быть из-аз проблем с COM-соединением. Опять повторюсь, что чаще программа срабатывает, падения происходят непредсказуемо и не всегда в одном месте. |
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 730
|
Всё ясно. Это гонка данных при асинхронных операциях.
Питон отправляет в автокад команды не дожидаясь когда выполнится предыдущая. Автокад отклоняет новые запросы пока не завершит предыдущие. Из рекомендаций что советует интернет: Увеличить паузы между отправками запросов в автокад. Это очень плохое решение так как не защищает на 100% от сбоя. Или В цикле отправлять команду с перехватом ошибки до тех пор пока она не выполнится корректно без ошибки. Это конечно gовногкод (поллинг) но дает 100% результат. Я рекомендую изучить документацию к библиотекам и найти там штатные способы ожидания завершения команд. Возможно там есть callback функции или что-то на них похожее. Может функции отправки команд в com соединение возвращают ответ в какой-то буфер. Может там есть какой-то контейнер-очередь. Создатели питоновских библиотек наверняка не оставили этот момент без внимания. Или тогда использовать цикл с перехватом ошибки и добавить в него паузу чтобы соединение не спамилось бесполезными запросами. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,452
|
Ошибка ввода масштаба: (-2147418111
Похоже на переполнение int32. И для тех, кто в шарит в теме (я не шарю, если что!) было бы неплохо посмотреть на код.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 401
|
Переполнение целочисленной переменной (int32) тоже вряд ли могло быть, вводил всегда одинаковый масштаб (100, хотя и это не принципиально).
Понимаю желание посмотреть код, но как бы так выразиться, я пытаюсь получить не конкретный совет по нерабочему коду (его сейчас очень много стало и погружаться туда то еще удовольствие), а услышать общие принципы, если такие есть, по подключению питона к автокаду, потому что ошибки COM-соединения - это распространенное явление, как я понял. К совету mmax про асинхронность и многопоточность прислушиваюсь. Буду пробовать изолировать запросы и выполнять их последовательно. До этого пытался сделать выгрузку всех примитивов в память питона, там все обработать независимо от автокада и потом вернуть в автокад, применить изменения, но и тут что-то пошло не так. Возможно, просто криво реализовал свое начинание. |
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 730
|
Цитата:
Если в пионе у вас есть объект в котором перечислены ключи => значения объекта автокад, то это просто дамп свойств этого объекта. А с автокадом можно работать только через методы которые принимает com соединение |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,502
|
Имхо, единственный плюс в вашем варианте - возможность использовать один экземпляр программы для многих версий AutoCAD и при этом пользоваться всей функциональностью питона (в отличии от давно остановившихся в развитии lisp/vba). На этом плюсы заканчиваются и начинается головная боль)
Цитата:
Соовершено верно. В современных языках программирования достаточно средств для комплексной обработки данных - а акад пускай играет роль интерфейса пользователя и функцию вывода результатов. |
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 730
|
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,502
|
нет - можно работать через интерфейс с com-объектами отдельных примитивов чертежа как с объектами классов, представляющими эти примитивы. Но это все грустно - взять современный ЯП Питон и работать при этом с акадом через "замочную скважину" com-интерфейса.
|
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 730
|
Ну а как по другому? Можно еще клиент-сервер на сокетах замутить и получится примерно то же самое. Может даже лучше потому-что асинхронные вызовы на сокетах выстраиваются в очередь и не будут конфликтовать. Кроссплатформенность полная будет. Все вычисления можно делегировать веб-серверам и делать браузерные версии автокада.
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,502
|
избегать не получиться (надо просто обрабатывать ошибки), а ссылку же Алексей в п.7 давал. Можно еще, наверно, попробовать поискать примеры работы с MSOffice из питона через com - основы совершенно одинаковые.
|
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 730
|
Цитата:
Повторять один и тот же запрос в цикле до тех пор пока запрос не станет успешным. Если разрыв соединения вызывает исключение в питоне то использовать try..except Так жк выше сказали попробовать GetAcadState() Так же в цикле перед запросом метода работы с примитивами сделать запрос GetAcadState(). Если он успешный, то выполнить команду и выйти из цикла, если безуспешный - повторят пока не станет успешным. |
|||
![]() |
|
||||
Регистрация: 06.04.2015
Сообщений: 2,756
|
|
|||
![]() |
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 730
|
если в лисп до сих пор не завезли классы, хештаблицы, многопоточность или хотя бы асинхронные функции. То дела у языков для автокада совсем плохи.
А ведь лисп это самый простой язык с безграничными возможностями. Для понимания синтаксиса надо усвоить лишь одну базу: после открывающей скобки идет имя функции, всё остальное её аргументы. Никаких ключевых слов, операторов, конструкций, ничего больше. Только функции, аргументы и всё. Жаль конечно этого добряка. |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |