Python & ActiveX/COM Autocad

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

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

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #375 : 24-12-2020, 19:38:29 »
Для эксперимента, скачал и установил ObjectARX последней версии, установил питоновскую библиотеку pythonnet. Переделал найденный в интернете кусок кода.

Код - Python [Выбрать]
  1. import sys
  2. path = u'F:\\ObjectARX\\ObjectARX_for_AutoCAD_2021_Win_64bit_dlm\\inc\\'
  3. #path to the .NET assemblies
  4. sys.path.append(path)
  5.  
  6. import clr
  7.  
  8. from System.Reflection import Assembly
  9. Assembly.LoadFrom(path + 'AcDbMgd.dll')
  10. Assembly.LoadFrom(path + 'AcCoreMgd.dll')
  11. Assembly.LoadFrom(path + 'AcMgd.dll')
  12.  
  13. import Autodesk
  14. import Autodesk.AutoCAD.DatabaseServices as ads
  15. import Autodesk.AutoCAD.Runtime as ar
  16. import Autodesk.AutoCAD.ApplicationServices as aas
  17. import Autodesk.AutoCAD.DatabaseServices as ads
  18. import Autodesk.AutoCAD.Geometry as ag
  19. import Autodesk.AutoCAD.Internal as ai
  20. from Autodesk.AutoCAD.Internal import Utils
  21.  
  22. print('Hello world!')

Пока ошибок не выдает, "Hello World!" в конце выводит... В какую сторону дальше копать? Хотя бы что бы получить активный  документ и нарисовать отрезок в Автокаде таким  образом.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #376 : 24-12-2020, 20:25:28 »
Electric,
Если она не грузится внутрь AutoCAD, то ты ничего не сделаешь. Все эти сборки можно использовать только в плагине, загруженном внутрь AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #377 : 25-12-2020, 07:12:48 »
Если она не грузится внутрь AutoCAD, то ты ничего не сделаешь. Все эти сборки можно использовать только в плагине, загруженном внутрь AutoCAD.

Я рассчитывал на возможность изучить ObjectARX взаимодействуя с помощью обычного пайтона, без применения сложных Си-подобных языков или атавизмов вроде IronPython.
Если я все правильно понимаю, этот вариант недоступен в принципе, то значит только C++/C#. только хардкор  8)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #378 : 25-12-2020, 13:56:27 »
Electric,
Чтобы изучить ObjectARX нужно изучать ObjectARX. Python тут может только мешать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #379 : 25-01-2021, 00:38:24 »
Всем добра!

Прошу ответить на такой вопрос: С++ открывает больше возможностей для использования автокада или питон покрывает все возможные расширения использования? Проще: какой язык заметно лучше позволит использовать автокад, С++ или питон? Или этот вопрос не корректен и все зависит от уровня владения языком?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #380 : 25-01-2021, 00:43:54 »
DFG2020,
ObjectARX C++ даёт на порядок больше возможностей. Про быстродействие я вообще молчу...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #381 : 25-01-2021, 07:26:35 »
А если сравнивать .NET и ObjectARX - то по скорости работы и по  своим возможностям первый вариант не сильно уступает второму? Мне не требуется создавать свои объекты в AutoCAD и как мне кажется, C# легче в освоении, там нет необходимости работать с ссылками и указателями. Или я снова ошибаюсь?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #382 : 25-01-2021, 09:49:40 »
А если сравнивать .NET и ObjectARX - то по скорости работы и по  своим возможностям первый вариант не сильно уступает второму?
Не сильно если используется AutoCAD .NET API, а не COM/ActiveX
Мне не требуется создавать свои объекты в AutoCAD и как мне кажется, C# легче в освоении, там нет необходимости работать с ссылками и указателями. Или я снова ошибаюсь?
Не ошибаешься.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #383 : 25-01-2021, 12:56:57 »
DFG2020,
ObjectARX C++ даёт на порядок больше возможностей. Про быстродействие я вообще молчу...

Александр, спасибо за ответ! Начинаю изучать С++!

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 389
  • Карма: 21
Re: Python & ActiveX/COM Autocad
« Ответ #384 : 02-02-2021, 13:56:11 »
После опыта MEL/Python, когда работал в Maya, и написания САПРа на AutoLISP для AutoCAD, стал осваивать C# и мне он очень понравился, так как открывает возможность написания плагинов не только для AutoCAD, но и различных приложений, в том числе для мобильной платформы. C# стал изучать из-за невозможности на DCL(AutoLISP) писать нормальные интерфейсы.

Оффлайн loban_iv

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #385 : 18-02-2021, 16:41:31 »
Добрый день
возможно ли с помощью Python осуществить выдавливание области?
документация по ActiveX говорит что это возможно

RetVal = object.AddExtrudedSolid(Profile, Height, TaperAngle)

Получаю ошибку TypeError: The Python instance can not be converted to a COM object
я так понимаю ошибка в передаче объекта Python в Profile


Код - Python [Выбрать]
  1. import win32com
  2. import win32com.client
  3. from pythoncom import VT_R8, VT_ARRAY, VT_DISPATCH, VT_VARIANT
  4.  
  5. def convert_coordinates(*args):
  6.     """
  7.    Функция преобразования координат в формат AutoCAD
  8.    :param args: координаты для преобразования, допустима передача списка или кортежа
  9.    :return: Координаты в формате AutoCAD
  10.    """
  11.     if isinstance(args[0], (list, tuple)):
  12.         coords = [item for item in args[0]]
  13.     else:
  14.         coords = args
  15.     return win32com.client.VARIANT(VT_ARRAY | VT_R8, coords)
  16.  
  17. app = win32com.client.Dispatch("AutoCAD.Application")
  18. doc = app.ActiveDocument
  19. model = doc.ModelSpace
  20.  
  21. cds = convert_coordinates([0,0,0])
  22. c = model.AddCircle(cds,500)
  23. reg = model.AddRegion(win32com.client.VARIANT(VT_ARRAY | VT_DISPATCH, [c]))
  24. exsol1 = model.AddExtrudedSolid(reg, 100, 2)# TypeError: The Python instance can not be converted to a COM object
  25.  

Спасибо

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #386 : 18-02-2021, 16:53:42 »
reg = model.AddRegion(win32com.client.VARIANT(VT_ARRAY | VT_DISPATCH, [c]))
reg - это не один Region, а коллекция. Так что нужно использовать элемент с нулевым индексом.
Ну и кроме того угол в радианах, так что 2 - это 114.591559 градусов. Подозреваю, что ты хотел не это.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн loban_iv

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #387 : 18-02-2021, 17:01:48 »
reg - это не один Region, а коллекция. Так что нужно использовать элемент с нулевым индексом.
Ну и кроме того угол в радианах, так что 2 - это 114.591559 градусов. Подозреваю, что ты хотел не это.

Спасибо! да конечно
все работает
Код - Python [Выбрать]
  1. exsol1 = model.AddExtrudedSolid(reg[0], 100, 0)

Оффлайн loban_iv

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #388 : 18-02-2021, 23:52:16 »
И еще вопрос если можно
Пытаюсь выполнить команду Loft с помощью Питона. В документации к  ActiveX говориться что это не поддерживается.
Пытаюсь создать 2 окружности, выбрать их, и послать в командную строку команду Loft
Но объекты не выбираются. Реально воплотить задуманное?
спасибо

Код - Python [Выбрать]
  1. import win32com
  2. import win32com.client
  3. from pythoncom import VT_R8, VT_ARRAY, VT_DISPATCH, VT_VARIANT
  4.  
  5. def convert_coordinates(*args):
  6.         """
  7.         Функция преобразования координат в формат AutoCAD
  8.         :param args: координаты для преобразования, допустима передача списка или кортежа
  9.         :return: Координаты в формате AutoCAD
  10.         """
  11.         if isinstance(args[0], (list, tuple)):
  12.                 coords = [item for item in args[0]]
  13.         else:
  14.                 coords = args
  15.         return win32com.client.VARIANT(VT_ARRAY | VT_R8, coords)
  16.  
  17.  
  18. app = win32com.client.Dispatch("AutoCAD.Application")
  19. doc = app.ActiveDocument
  20. model = doc.ModelSpace
  21.  
  22. cds = convert_coordinates([0, 0, 0])
  23. c = model.AddCircle(cds, 500)
  24. cds = convert_coordinates([0, 0, 200])
  25. c1 = model.AddCircle(cds, 250)
  26.  
  27. doc.SelectionSets.Item("MySelectionSet").Delete()
  28. ss = doc.SelectionSets.Add("MySelectionSet")
  29.  
  30. ss.AddItems(win32com.client.VARIANT(VT_ARRAY | VT_DISPATCH, [c, c1]))
  31. ss.Update()
  32. doc.SendCommand("_Loft\n\n")

Оффлайн loban_iv

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #389 : 19-02-2021, 08:43:29 »
И еще не могу трансформировать объект((
например точку
это возможно?
Код - Python [Выбрать]
  1. app = win32com.client.Dispatch("AutoCAD.Application")
  2. doc = app.ActiveDocument
  3. model = doc.ModelSpace
  4.  
  5. origin = convert_coordinates([200, 0, 0])
  6. xaxis = convert_coordinates([201, 0, 0])
  7. yaxis = convert_coordinates([200, 1, 0])
  8.  
  9. ucs = doc.UserCoordinateSystems.Add(origin, xaxis, yaxis, "TestUCS")
  10. doc.ActiveUCS = ucs
  11. m4x4 = ucs.GetUCSMatrix()
  12.  
  13. cds = convert_coordinates([0, 0, 0])
  14. p1 = model.AddPoint(cds)
  15. p1.TransformBy(m4x4)
  16. # Traceback (most recent call last):
  17. #   File "C:/Users/lobanov/PycharmProjects/AutoCAD_proj/main.py", line 34, in <module>
  18. #     p1.TransformBy(m4x4)
  19. #   File "<COMObject AddPoint>", line 2, in TransformBy
  20. # pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147024809), None)

Спасибо!
А может есть какое то более элегантное решение касательно трансформации?
мне нужно будет строить геометрию в разных системах координат. Я думал что создав временную ПСК и активируя ее,  далее в коде используя координаты они будут трансформироваться относительно активной ПСК. Вроде бы я не прав и все объекты продолжают строится относительно глобальной системы координат. Это так?или есть какая нибудь переменная - переключатель - от чего  считать координаты?Если нет, мое решение - трансформировать все объекты матрицей 4х4?