Python & ActiveX/COM Autocad

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

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

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #195 : 07-11-2019, 18:57:50 »
Я приведу свою функцию для формирования листа, там присутствуют ссылки на другие функции но в целом понять как работает можно.

Благодарю! Пока подгоняю эту функцию под свой код, застрял на этом моменте:

Цитировать
Код - Python [Выбрать]
  1.     doc.Application.ZoomWindow(vtr(bb[0]), vtr(bb[1]))  
  2.  


Я так понимаю, vtr в этом фрагменте - это аналог convert_coordinates из начала темы?

Код - Python [Выбрать]
  1. def convert_coordinates(*args):
  2.     """
  3.    Функция преобразования координат в формат AutoCAD
  4.    :param args: координаты для преобразования, допустима передача списка или кортежа
  5.    :return: Координаты в формате AutoCAD
  6.    """
  7.     if isinstance(args[0], (list, tuple)):
  8.         coords = [item for item in args[0]]
  9.     else:
  10.         coords = args
  11.     return win32com.client.VARIANT(VT_ARRAY | VT_R8, coords)

Если применить её, получаю в вышеупомянутой строке:

Цитировать
Ошибка здесь float() argument must be a string or a number, not 'VARIANT'

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #196 : 08-11-2019, 09:41:44 »
Кроме того, у меня на разных современных компах, в различающихся версиях AutoCAD, python-скрипты, например связанные с созданием и обновлением листов, непредсказуемо вылетают во время этих операций с ошибкой:

Цитировать
-2147418111, 'Вызов был отклонен'

Спасает только введение пауз в наиболее проблемные места в коде после длительных действий:

Код - Python [Выбрать]
  1. time.sleep(2)

Это такой глюк только у меня или это в принципе нормально для взаимодействия с AutoCAD  через COM? Если я смотрю существующий аналогичный код на LISP, никаких временных пауз там не вводится.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #197 : 08-11-2019, 09:54:47 »
Это такой глюк только у меня или это в принципе нормально для взаимодействия с AutoCAD  через COM?
Нормально через COM из внешнего приложения.
Если я смотрю существующий аналогичный код на LISP, никаких временных пауз там не вводится.
Lisp работает внутри AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 152
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #198 : 08-11-2019, 19:20:33 »
Я так понимаю, vtr в этом фрагменте - это аналог convert_coordinates из начала темы?

vtr у  меня функция получения массива VARIANT double. я этот код выделил в функцию, поскольку очень часто требуется такое преобразование

Код - Python [Выбрать]
  1.  
  2. def vtr (x) :
  3.     """
  4.        Возвращает variant массив double
  5.        x - массив двоичных чисел
  6.    """
  7.     return VARIANT(VT_ARRAY | VT_R8, x)
  8.  
  9.  

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #199 : 13-11-2019, 18:18:58 »
Исправил все ошибки в своем скрипте для рамок, благодаря  коду выше. Дома работает идеально, но на чуть более слабом компе вылетает со случайными ошибками на разных участках кода при обращении к Автокаду. Похоже, что работа через COM подходит только для простейших операций.

Возможно ли через COM очистить командную строку и остановить выполняемую в  данный момент операцию в Автокаде? При тестировании скриптов постоянна ситуация, что командная строка занята незавершенной командой от предыдущей запуска с ошибкой, и пространство модели таким образом недоступно.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #200 : 13-11-2019, 18:23:38 »
Возможно ли через COM очистить командную строку и остановить выполняемую в  данный момент операцию в Автокаде?
Попробуй через SendCommand("\003\003"). Это единственный, но негарантированный способ.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #201 : 15-11-2019, 18:50:13 »
Возможно ли через COM очистить командную строку и остановить выполняемую в  данный момент операцию в Автокаде?
Попробуй через SendCommand("\003\003"). Это единственный, но негарантированный способ.

Действительно, этот способ очень негарантированн, у меня он либо не работает, либо  выдает ошибку. Если бы я писал через C#  - у меня было бы больше возможностей для этого?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #202 : 15-11-2019, 19:03:37 »
Действительно, этот способ очень негарантированн, у меня он либо не работает, либо  выдает ошибку.
Это аналог двойного нажатия ESC в AutoCAD - так что сообщение об ошибке должно быть и должна прерываться активная команда.
Если бы я писал через C#  - у меня было бы больше возможностей для этого?
Если через COM/ActiveX - возможностей столько же. Если использовать AutoCAD .NET API, то необходимости прерывать команду быть не должно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 152
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #203 : 03-12-2019, 11:13:03 »
Вот такой вопрос, хочу разобраться, связан с формированием листов.
Я программно генерирую листы, лист создается, настраивается и т.п. и затем я распечатываю в pdf
(используется dwg to pdf принтер). Если распечатать сразу, то все ок, если документ закрывается и потом снова открывается, то может появиться такая фигня, что все листы пустые.
Причем так бывает не всегда, иногда листы остаются. Я не могу понять закономерность, может кто знает почему такая ерунда может быть? Ну или по крайней мере
подскажет направление в каком нужно копать.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #204 : 03-12-2019, 11:51:08 »
Возможно поможет эта статья: https://adn-cis.org/pechat-granicz-okna-pri-pomoshhi-vba.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #205 : 07-12-2019, 13:22:56 »
Нормально через COM из внешнего приложения.
Lisp работает внутри AutoCAD.

А если подключаться к AutoCAD не через COM, а через .NET, но не на C#, а например на Python с помощью библиотеки pythonnet - это даст какие-то преимущества? Т.е. с точки зрения Автокад это будет отличасть от написания .NET  на C#?
Просмотрел видеоуроки по C#, вроде синтаксис  понимаю и базовые вещи. Но как только увидел на этом форуме  урок по написанию простейшей программы на C# к AutoCAD -  понимаю, что ничего не понимаю  :D

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #206 : 07-12-2019, 15:02:28 »
А если подключаться к AutoCAD не через COM, а через .NET, но не на C#, а например на Python с помощью библиотеки pythonnet - это даст какие-то преимущества?
Я не пишу на Python, не знаю возможностей PythonNet. Поэтому затрудняюсь ответить на этот вопрос. В любом случае это неподдерживаемый со стороны Autodesk интерфейс.
Но как только увидел на этом форуме  урок по написанию простейшей программы на C# к AutoCAD -  понимаю, что ничего не понимаю 
Да ладно. Ничего сложного в нём нет - нужно просто разобраться в этом первом примере, а дальше будет проще...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн dlobyntsev

  • ADN Club
  • Сообщений: 18
  • Карма: 8
Re: Python & ActiveX/COM Autocad
« Ответ #207 : 13-12-2019, 13:14:32 »
А если подключаться к AutoCAD не через COM, а через .NET, но не на C#, а например на Python с помощью библиотеки pythonnet
Не получится подключится. В Autocad что-то делать извне можно только через COM. Написать с помощью pythonnet .NET код для AutoCAD можно, только никак не скомпилировать его в dll, чтобы запустить из AutoCAD.

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 152
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #208 : 13-12-2019, 13:57:42 »
Возможно поможет эта статья: https://adn-cis.org/pechat-granicz-okna-pri-pomoshhi-vba.html
Может быть что то в этом есть,  возможно где то несостыковка именно с координатами. В примере показана печать из пространства модели как я понимаю, и преобразование
применяется когда используется метод печати окна. Я же применяю метод печати листа. После того как настройка выполняется, все нормально, можно печатать. После того как закрываеш чертеж и снова его открываешь, приходится все листы сносить и заново делать. А это бывает довольно много времени для этого требуется.
В общем вот мой код, по возможности посоветуйте где имеет смысл воспользоваться преобразованием координат. Я бы прислал и файл, но не вижу как прицепить чертеж. попробую вставить ссылку на файл на облаке

https://1drv.ms/u/s!Aj6-EzSXLgqnhMYM6Tv1iEobI8uxQg?e=ggJbFg

Код - Python [Выбрать]
  1. def CreateLayout(doc, h, i, scale = 100) :
  2.     """
  3.    Создает новый лист и выводит на него область полилинии
  4.    Подбирает размер, исходя из масштаба
  5.    i - число, из которого создается имя листа. Имена листов всегда будут числовые
  6.  
  7.    """
  8.     import time
  9.     pl = doc.HandleToObject(h)
  10.     bb = pl.GetBoundingBox()
  11.  
  12.     dt, dx = pl.GetXData('DM_Page')
  13.  
  14.     try :
  15.         page_scale = dx[2]
  16.     except :
  17.         page_scale = scale  
  18.    
  19.     size = (bb[1][0] - bb[0][0], bb[1][1]-bb[0][1])
  20.     mn = GetMediaName(size, scale = page_scale)
  21.    
  22.     try :
  23.         lo = doc.Layouts.Add(f'{i:05}')
  24.     except Exception as ex:        
  25.         lo = doc.Layouts(f'{i:05}')
  26.        
  27.        
  28.     lo.ConfigName = "DWG To PDF.pc3"
  29.     lo.RefreshPlotDeviceInfo()
  30.     lo.CanonicalMediaName = mn
  31.     lo.RefreshPlotDeviceInfo()
  32.     lo.PaperUnits = acad_mod.constants.acMillimeters
  33.     lo.PlotType = acad_mod.constants.acLayout
  34.    
  35.     lo.PlotRotation = acad_mod.constants.ac0degrees
  36.        
  37.     doc.Regen(0)
  38.    
  39.     doc.ActiveLayout = lo
  40.     doc.MSpace = False
  41.    
  42.     for e in lo.Block :
  43.         e.Delete()
  44.        
  45.     #     Создаем вид
  46.  
  47.     psize = lo.GetPaperSize()
  48.     margins = lo.GetPaperMargins()
  49.     pvsize = (psize[0] - margins[0][0] - margins[1][0], psize[1] - margins[0][1] - margins[1][1])    
  50.    
  51.     center = (pvsize[0] / 2 , pvsize[1] / 2, 0)    
  52.  
  53.     pv = doc.PaperSpace.AddPViewport(vtr(center), pvsize[0], pvsize[1])
  54.     pv.Layer = 'defpoints'
  55.     pv.Display(True)
  56.    
  57.     doc.MSpace = True
  58.     doc.Application.ZoomWindow(vtr(bb[0]), vtr(bb[1]))
  59.     doc.MSpace = False
  60.     doc.Application.ZoomExtents()
  61.     doc.Regen(0)    
  62.  
  63.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #209 : 13-12-2019, 14:49:36 »
После того как закрываеш чертеж и снова его открываешь, приходится все листы сносить и заново делать.
Зачем?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение