Python & ActiveX/COM Autocad

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

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

Оффлайн Khasan MamaevАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 7
    • Конструктивный диалог
  • Skype: wolfram222
Python & ActiveX/COM Autocad
« : 17-06-2017, 13:17:27 »
Рад приветствовать вас коллеги! Python это язык программирования высокого уровня, который ввиду простоты своего синтаксиса приобрел на сегодняшний день огромную армию пользователей и помогает решать широкий круг задач из различных сфер нашей жизни. Проектирование также не осталось в стороне. В этой теме я хочу делиться с читателями своим опытом использования Python для Autocad. Попытки использовать Питон для Автокад конечно же предпринимались и раньше, нашим соотечественником Романом Харитоновым даже была написана библиотека pyautocad(https://pypi.python.org/pypi/pyautocad), но я покажу более простой способ подключения к Автокад. Начну пожалуй со своего первого урока из цикла "Python for Engineers", который посвящен подключению к Автокад:



А это сам код:
Код - Python [Выбрать]
  1. from math import cos, sin, pi
  2. import System
  3. from System import Array
  4. app = System.Runtime.InteropServices.Marshal.GetActiveObject("Autocad.Application")
  5. AcDoc = app.ActiveDocument
  6. mSp = AcDoc.ModelSpace
  7.  
  8. a = 100
  9. fi = range(0,360,10)
  10. r = 4
  11.  
  12. for i in fi:
  13.         x = (a/360.0)*i*cos(i*pi/180.0)
  14.         y = (a/360.0)*i*sin(i*pi/180.0)
  15.         pt = Array[float]([x,y,0])
  16.         mSp.AddCircle(pt,r*(1+i/360.0))

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #1 : 17-06-2017, 18:18:16 »
Тему закрепил, чтобы её легче было найти. Рекомендую побольше кода выкладывать здесь на форуме, так как с youtube'овского ролика переписывать его не слишком удобно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Khasan MamaevАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 7
    • Конструктивный диалог
  • Skype: wolfram222
Re: Python & ActiveX/COM Autocad
« Ответ #2 : 17-06-2017, 18:22:00 »
Тему закрепил, чтобы её легче было найти. Рекомендую побольше кода выкладывать здесь на форуме, так как с youtube'овского ролика переписывать его не слишком удобно.

Спасибо! Это собственно весь код, который был показан в ролике) могу еще добавить макрос кнопки
Код - Auto/Visual Lisp [Выбрать]
  1. (startapp "C:/Program Files (x86)/IronPython 2.7/ipyw.exe" "g:/Lessons/!PythonForIngeneers/Py4Eng01PythonAutocad/Py4Eng_PythonAutocad.py")

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #3 : 17-06-2017, 18:24:31 »
Спасибо! Это собственно весь код, который был показан в ролике
Это было моё пожелание на будущее. Надеюсь, что это будет не единственный урок. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Khasan MamaevАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 7
    • Конструктивный диалог
  • Skype: wolfram222
Re: Python & ActiveX/COM Autocad
« Ответ #4 : 17-06-2017, 18:26:15 »
Спасибо! Это собственно весь код, который был показан в ролике
Это было моё пожелание на будущее. Надеюсь, что это будет не единственный урок. :)
Будем стараться

Оффлайн Khasan MamaevАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 7
    • Конструктивный диалог
  • Skype: wolfram222
Re: Python & ActiveX/COM Autocad
« Ответ #5 : 18-06-2017, 19:42:33 »
Ну вот, не прошло и года, и новый ролик, вставка выносок Autocad с автоматической нумерацией:



Код - Python [Выбрать]
  1. ### Autocad MLeaders Insertion
  2. ### ©2017, Khasan Mamaev
  3. ### www.dynamobim.ru
  4.  
  5. import System
  6.  
  7. marsh = System.Runtime.InteropServices.Marshal
  8. app = marsh.GetActiveObject("Autocad.Application")
  9. aDoc = app.ActiveDocument
  10. mSp = aDoc.ModelSpace
  11.  
  12. def ptA(p,x1,y1):
  13.         return System.Array[float]([p[0],p[1],p[2],p[0]+x1,p[1]+y1,p[2]])
  14.  
  15. x1 = 500
  16. y1 = 500
  17. p0 = System.Array[float]([0,0,0])
  18.  
  19. pref = aDoc.Utility.GetString(False, "Enter prefix: ")
  20. j = aDoc.Utility.GetInteger("Enter start num: ")
  21.  
  22. while True:
  23.         pt = aDoc.Utility.GetPoint(p0,'GetPoint: ')
  24.         points = ptA(pt,x1,y1)
  25.         lead = mSp.AddMLeader(points, 0)
  26.         lead.TextString = pref + str(j)
  27.         j += 1

Оффлайн Khasan MamaevАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 7
    • Конструктивный диалог
  • Skype: wolfram222
Re: Python & ActiveX/COM Autocad
« Ответ #6 : 03-07-2017, 22:49:30 »
Записал ролик с инструкцией как подключать IronPython к Notepad++


Оффлайн dlobyntsev

  • ADN Club
  • Сообщений: 10
  • Карма: 5
Re: Python & ActiveX/COM Autocad
« Ответ #7 : 05-11-2017, 16:03:23 »
Доступ к AutoCAD можно получить не только из IronPython, дальнейшее развитие которого, мягко говоря, находится под вопросом, но и из стандартной реализации Python, используя модуль pywin32 https://sourceforge.net/projects/pywin32:

Код - Python [Выбрать]
  1. import win32com.client
  2. app = win32com.client.Dispatch("AutoCAD.Application")
  3.  
Дальше - всё по COM модели
« Последнее редактирование: 05-11-2017, 16:51:42 от Александр Ривилис »

Оффлайн Khasan MamaevАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 7
    • Конструктивный диалог
  • Skype: wolfram222
Re: Python & ActiveX/COM Autocad
« Ответ #8 : 05-11-2017, 16:32:35 »
Такой способ подключения из Питон к Автокад для меня не секрет, но возникают трудности при создании дотнетовских массивтв необходимых для СОМ. Ну и разговоры о скорой кончине АйронПайтон имеют давнюю историю, однако АйронПайтон не прекращают прикручивать к различным серьёзным программных  комплексам.

Оффлайн dlobyntsev

  • ADN Club
  • Сообщений: 10
  • Карма: 5
Re: Python & ActiveX/COM Autocad
« Ответ #9 : 06-11-2017, 16:04:18 »
Массивы достаточно просто создаются, наример один из самых распространенных случаев - преобразование в массив чисел с плавающей точкой (variant array of doubles) для координат:

Код - Python [Выбрать]
  1. import win32com.client
  2. from pythoncom import VT_R8, VT_ARRAY
  3. pythoncoord = [x, y, z]
  4. acadcoord = win32com.client.VARIANT(VT_ARRAY | VT_R8, pythoncoord)
IronPython, к сожалению, продолжают прикручивать к различным серьёзным программных комплексам, потому что другой нормально работающей реализации Python для .NET на данный момент просто не существует. Есть несколько проектов, типа pythonnet, но без танцев с бубном они с тем же автокадом не работают. IronPython вряд ли в обозримом будущем перейдёт на поддержку Python 3x, постепенно поддержка ветки 2х будет свёрнута в первую очередь со стороны разработчиков различных модулей (а множество доступных модулей практически на все случаи жизни - одно из самых весомых преимуществ Python для инженера, когда разработка программ - возможность повысить производительность и облегчить себе жизнь). Автодеск, например, с IronPython в Revit, наступает ровно на те же грабли, что и с LISP в автокаде. Кому сейчас реально нужен лисп вне автокада? Никому. Но заменить его чем-то невозможно - у пользователей просто горы кода на лиспе накопилось за все годы.
Для инженера же Python - один из лучших языков за счёт относительной простоты и наличия огромного количества модулей.
« Последнее редактирование: 06-11-2017, 17:02:44 от dlobyntsev »

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #10 : 06-11-2017, 17:02:15 »
dlobyntsev
У меня в подписи написано как следует форматировать код на форуме. Прошу ознакомится и принять к сведению.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Khasan MamaevАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 7
    • Конструктивный диалог
  • Skype: wolfram222
Re: Python & ActiveX/COM Autocad
« Ответ #11 : 07-11-2017, 11:03:47 »
Массивы достаточно просто создаются, наример один из самых распространенных случаев - преобразование в массив чисел с плавающей точкой (variant array of doubles) для координат:

Код - Python [Выбрать]
import win32com.client
from pythoncom import VT_R8, VT_ARRAY
pythoncoord = [x, y, z]
acadcoord = win32com.client.VARIANT(VT_ARRAY | VT_R8, pythoncoord)
IronPython, к сожалению, продолжают прикручивать к различным серьёзным программных комплексам, потому что другой нормально работающей реализации Python для .NET на данный момент просто не существует. Есть несколько проектов, типа pythonnet, но без танцев с бубном они с тем же автокадом не работают. IronPython вряд ли в обозримом будущем перейдёт на поддержку Python 3x, постепенно поддержка ветки 2х будет свёрнута в первую очередь со стороны разработчиков различных модулей (а множество доступных модулей практически на все случаи жизни - одно из самых весомых преимуществ Python для инженера, когда разработка программ - возможность повысить производительность и облегчить себе жизнь). Автодеск, например, с IronPython в Revit, наступает ровно на те же грабли, что и с LISP в автокаде. Кому сейчас реально нужен лисп вне автокада? Никому. Но заменить его чем-то невозможно - у пользователей просто горы кода на лиспе накопилось за все годы.
Для инженера же Python - один из лучших языков за счёт относительной простоты и наличия огромного количества модулей.

Про богатство библиотек Питон я в курсе, поскольку пользуюсь для своей работы Jupyter Notebook. Если АйронПайтон будет убит, то это будет крайне прискорбно, но думаю 3-4 года у нас еще есть, а за это время можно сделать кучу всего, дальше посмотрим. Про создание подобных массивов не знал, спасибо за информацию. Буду чаще использовать работу с СОМ из чистого Питона, очень уж хочется использовать модули numpy, scipy и т п. Кстати, недавно закостылил синтез Питон и АйронПитон, осуществил работу с Автокад из Юпитер ноутбука, в ближайшее время покажу на своем канале.

Оффлайн Khasan MamaevАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 7
    • Конструктивный диалог
  • Skype: wolfram222
Re: Python & ActiveX/COM Autocad
« Ответ #12 : 13-11-2017, 12:14:55 »
dlobyntsev,

Можно ли в чистом Питоне осуществить этот код:

Код - Python [Выбрать]
  1. import System
  2. from System import Array
  3. import clr
  4. clr.AddReferenceToFileAndPath('C:/Program Files/Autodesk/AutoCAD 2016/Autodesk.AutoCAD.Interop.Common')
  5. from Autodesk.AutoCAD.Interop.Common import AcadEntity, AcBooleanType
  6.  
  7. app = System.Runtime.InteropServices.Marshal.GetActiveObject("Autocad.Application")
  8. aDoc = app.ActiveDocument
  9. sset = aDoc.PickfirstSelectionSet
  10. msp = aDoc.ModelSpace
  11.  
  12. elems = list(iter(sset))
  13. def ptA(X,Y,Z):
  14.         return Array[float]([X, Y, Z])
  15.  
  16. def faceToPline(face):
  17.         return msp.AddPolyline(face.Coordinates)
  18.  
  19. def plineToRegion(pl):
  20.         entArr = Array.CreateInstance(AcadEntity,1)
  21.         entArr.SetValue(pl,0)
  22.         return msp.AddRegion(entArr)   
  23.  
  24. def centArea(x):
  25.         return [x.Centroid[0], x.Centroid[1], x.Area]
  26.  
  27. inter = elems[0].Boolean(AcBooleanType.acIntersection, elems[1])

Оффлайн dlobyntsev

  • ADN Club
  • Сообщений: 10
  • Карма: 5
Re: Python & ActiveX/COM Autocad
« Ответ #13 : 13-11-2017, 16:26:50 »
Можно, код с комментариями ниже:
Код - Python [Выбрать]
  1. import win32com.client
  2. from pythoncom import VT_R8, VT_ARRAY, VT_DISPATCH
  3.  
  4. app = win32com.client.Dispatch("AutoCAD.Application")
  5. aDoc = app.ActiveDocument
  6. msp = aDoc.ModelSpace
  7.  
  8. #немного модифицировал функцию ptA(), теперь она преобразует в variant array of doubles
  9. # все аргументы, в т.ч. и представленные в виде списка или кортежа
  10. def convert_coordinates(*args):
  11.     """
  12.    Функция преобразования координат в формат AutoCAD
  13.    :param args: координаты для преобразования, допустима передача списка или кортежа
  14.    :return: Координаты в формате AutoCAD
  15.    """
  16.     if isinstance(args[0], (list, tuple)):
  17.         coords = [item for item in args[0]]
  18.     else:
  19.         coords = args
  20.     return win32com.client.VARIANT(VT_ARRAY | VT_R8, coords)
  21.  
  22. def faceToPline(face):
  23.     #из кода постом выше непонятно, в каком виде передаётся .Coordinates
  24.     #будет работать при условии, что face.Coordinates - это последовательность, список или кортеж
  25.     #не менее чем из шести чисел. Количество аргументов кратно 3 - ограничения .AddPolyline()
  26.     #возможно, необходимы дополнительные преобразования
  27.     return msp.AddPolyline(convert_coordinates(face.Coordinates))
  28.  
  29. def plineToRegion(pl):
  30.     msp.AddRegion(win32com.client.VARIANT(VT_ARRAY | VT_DISPATCH, [pl]))
  31.  
  32. #из кода постом выше непонятно, как работает функция
  33. def centArea(x):
  34.     return [x.Centroid[0], x.Centroid[1], x.Area]
  35.  
  36. #будет работать при условии, что в списке elems содержаться объекты AutoCAD
  37. #возможно, потребуется преобразование win32com.client.VARIANT(VT_DISPATCH, obj)
  38. #для elems[0] и elems[1]
  39. inter = elems[0].Boolean(2, elems[1])
Вообще, основная проблема работы с AutoCAD через COM - преобразование типов данных, но всё вроде решаемо.

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #14 : 22-11-2017, 16:49:58 »
Добрый день!
Пишу скрипт на Python  для черчения в Автокаде.
Столкнулся с проблемой - не могу разобраться с COM моделью AutoCAD, а если конкретнее, не могу настроить создаваемый  мной стиль таблиц. 
Код вроде как работает, стиль создается (хотя и не перезаписывает существующий) :

Код - Python [Выбрать]
  1. import win32com.client
  2.  
  3. app = win32com.client.Dispatch("AutoCAD.Application")
  4. aDoc = app.ActiveDocument
  5. mSp = aDoc.ModelSpace
  6.  
  7. dicts = aDoc.Database.dictionaries
  8.  
  9. ts = dicts.Item("acad_tablestyle")
  10. ts.AddObject("NewStyle", "AcDbTableStyle")

Далее, допустим, мне нужно назначить высоту текста по умолчанию для ячеек с типом  "заголовок" или "данные" этого нового табличного стиля NewStyle.  В справке  по модели COM Автокада читаю:

Цитировать
object.SetTextHeight(rowTypes, TextHeight)

ObjectTable, TableStyle
The object this method applies to.
rowTypesLong; the row types to change.
TextHeight
Double; the text height to use for the specified row types.

Не могу разобраться, что это за rowTypes, и как это реализовать через Пайтон (либо IronPython, либо CPython + win32com)
« Последнее редактирование: 22-11-2017, 17:43:33 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #15 : 22-11-2017, 17:50:12 »
Electric,
Приветствую на форуме!
1. Прочитай у меня в подписи как следует форматировать код на форуме и придерживайся этого правила.
2. Ты нашёл неудачную документацию. Удачная здесь: https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2015/ENU/AutoCAD-ActiveX/files/GUID-35CC52D6-03C1-48EE-90A3-97DFBBAC33C3-htm.html
В частности там сказано, что rowTypes - это одно из значений перечисления (числовые значения я подставил сам):

Код - C++ [Выбрать]
  1. enum AcRowType
  2.     {
  3.         acUnknownRow    = 0,
  4.         acDataRow       = 1,
  5.         acTitleRow      = 2,
  6.         acHeaderRow     = 4
  7.     }   AcRowType;
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #16 : 22-11-2017, 19:05:34 »
Electric,
Приветствую на форуме!

Спасибо за ссылку, помогло!
Но остается проблема, я не могу понять, как реализовать на Пайтоне эту команду  из документации VBA:

Код - Visual Basic [Выбрать]
  1. customObj.SetTextHeight AcRowType.acDataRow + AcRowType.acTitleRow, 1.3

К примеру. у меня все работает, когда передаю "1" или "2" по отдельности , назначая моему табличному стилю newTabStyle высоту 2,5:

Код - Python [Выбрать]
  1. newTabStyle.SetTextHeight("2", 2.5)

 но как передать эти два значения сразу? При попытке передать их в виде списка или кортежа выдает ошибку, когда я передаю "1"+"2" - функция игнорирует  один из них.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #17 : 22-11-2017, 19:18:34 »
К примеру. у меня все работает, когда передаю "1" или "2" по отдельности , назначая моему табличному стилю newTabStyle высоту 2,5:

Код - Python [Выбрать]

    newTabStyle.SetTextHeight("2", 2.5)


 но как передать эти два значения сразу? При попытке передать их в виде списка или кортежа выдает ошибку, когда я передаю "1"+"2" - функция игнорирует  один из них.
Зачем их передавать сразу?
Вот так тебя не устроит:
Код - Python [Выбрать]
  1. newTabStyle.SetTextHeight(1, 2.5)
  2. newTabStyle.SetTextHeight(2, 2.5)

???

Хотя так тоже должно работать:
Код - Python [Выбрать]
  1. newTabStyle.SetTextHeight(3, 2.5)

Не понял зачем ты пытаешься преобразовать число в строку. Этот метод принимает целые числа, а не строки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #18 : 27-11-2017, 05:45:31 »
Вот так тебя не устроит:

Да, спасибо. В тот раз мне это помогло, разобрался с той проблемой.
« Последнее редактирование: 27-11-2017, 06:39:25 от Electric »

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #19 : 27-11-2017, 18:03:00 »
Возник следующий вопрос.
Пользователю нужно выделить какой-то объект в Автокаде, при этом в командной строке  должен отображаться текст вроде "Выделите прямоугольник"

Этот код работает:

Код - Python [Выбрать]
  1. example, _ = aDoc.Utility.GetEntity()

Но этот выдает уже ошибку:

Код - Python [Выбрать]
  1. example, _ = aDoc.Utility.GetEntity('Укажите прямоугольник: ')

Цитировать
example, _ = aDoc.Utility.GetEntity('Укажите объект: ')
  File "<COMObject <unknown>>", line 3, in GetEntity
  File "C:\ProgramData\Anaconda3\lib\site-packages\win32com\client\dynamic.py", line 287, in _ApplyTypes_
    result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)
TypeError: The Python instance can not be converted to a COM object

Кроме того, допустим, пользователю нужно выделить не один, а сразу несколько объектов в Автокаде, через какую команду это реализуется? Если смотрю  в справке по AcadUtility, то там из методов  в основном только выделение единичного объекта или получение чисел, строк, углов и т.п.

Оффлайн Khasan MamaevАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 7
    • Конструктивный диалог
  • Skype: wolfram222
Re: Python & ActiveX/COM Autocad
« Ответ #20 : 27-11-2017, 18:09:55 »
Можно получить предварительно выбранные объекты вот так sset = AcDoc.PickfirstSelectionSet

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #21 : 27-11-2017, 18:16:19 »
Кроме того, допустим, пользователю нужно выделить не один, а сразу несколько объектов в Автокаде, через какую команду это реализуется?
SelectionSet.SelectOnScreen: https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-ActiveX/files/GUID-C4B442A3-D6A9-48FA-8C86-03D49A3B2ED7-htm.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #22 : 27-11-2017, 18:45:03 »
Но этот выдает уже ошибку:

Код - Python [Выбрать]

    example, _ = aDoc.Utility.GetEntity('Укажите прямоугольник: ')
Я не специалист по Python, но может быть так:
Код - Python [Выбрать]
  1. returnObj = aDoc.Utility.GetEntity("Укажите прямоугольник: ")
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #23 : 27-11-2017, 19:16:58 »
Но этот выдает уже ошибку:

Код - Python [Выбрать]

    example, _ = aDoc.Utility.GetEntity('Укажите прямоугольник: ')
Я не специалист по Python, но может быть так:
Код - Python [Выбрать]
  1. returnObj = aDoc.Utility.GetEntity("Укажите прямоугольник: ")

Ну я так понимаю, aDoc.Utility.GetEntity  возвращает и Объект и  координату точки сразу.  Вместе  они с точки зрения Python  являются кортежем tuple, я просто выбирал объект как первую часть кортежа. Без этого выражения у меня ошибка.

Цитировать
AttributeError: 'tuple' object has no attribute 'Layer'

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #24 : 27-11-2017, 19:24:16 »
Так. Я был не прав:
Код - Visual Basic [Выбрать]
  1. object.GetEntity Object, PickedPoint [, Prompt]
Т.е. первые два параметра - это объект и точка и только третий - это подсказка типа "Укажите прямоугольник: "
https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2015/ENU/AutoCAD-ActiveX/files/GUID-69164FAA-F3C7-47A4-962C-5F4B2D5BC583-htm.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн dlobyntsev

  • ADN Club
  • Сообщений: 10
  • Карма: 5
Re: Python & ActiveX/COM Autocad
« Ответ #25 : 30-11-2017, 10:46:46 »
Для того, чтобы метод GetEntity корректно работал с подсказкой при обращении к COM Autocad через pywin32, необходимо вызвать его следующим образом:
Код - Python [Выбрать]
  1. result = aDoc.Utility.GetEntity(None, None, "Укажите прямоугольник: ")
  2. picked_object = result[0]
  3. picked_point = result[1]
Выглядит неочевидно, видимо из-за особенностей реализации вызовов в pywin32, но работает. Причем если вместо None подставить переменные, в них ничего не запишется.
Метод возвращает кортеж из объекта и координаты точки. Координаты точки также представляют собой трёхэлементный кортеж: (picked_object, (X, Y, Z))

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #26 : 30-11-2017, 19:25:36 »
Спасибо. Разобрался.

Еще вопрос.
В автокаде во многих стандартных командах в командной строке есть возможность выбора опций.
К примеру, когда запускаем стандартное черчение прямоугольника, возникают опции  "Фаска", "Уровень", "Сопряжение", "Толщина", "Ширина", которые можно щелкнуть или набрать их ключевую букву с клавиатуры.

Возможно ли через COM  сделать подобного рода опции для своих текстовых команд?

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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #27 : 30-11-2017, 22:48:36 »
Все, что сказано - личное мнение.

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

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

Оффлайн dlobyntsev

  • ADN Club
  • Сообщений: 10
  • Карма: 5
Re: Python & ActiveX/COM Autocad
« Ответ #28 : 01-12-2017, 11:47:44 »
Опции для команд через COM, конечно, доступны. При использовании методов Utility.GetInteger, Utility.GetReal, GetString и т.п. достаточно сформировать строку запроса особым образом. Для автокада наличие в запросе текста вида [Опция1/<оПция2>/опЦия3] означает, что в запросе имеются три опции, причем вторая - опция по-умолчанию. Но, как всегда, дьявол кроется в деталях. И имя его в данном случае - обработка ошибок. Например, ввод опции при использовании Utility.GetReal вызывает ошибку, т.к. автокад ожидает ввода числа, а нажатие опции - это ввод строки. Необходимо этот случай предусмотреть и обработать. Делается это следующим образом:
Код - Python [Выбрать]
  1. from pythoncom import com_error
  2. #Инициируем ввод
  3. doc.Utility.InitializeUserInput(128)
  4. #Запрашиваем ввод числа с плавающей точкой
  5. try:
  6.     inputresult = doc.Utility.GetReal("\nВведите число [Опция1/оПция2]"
  7. except com_error as error:
  8.     #Получаем код COM ошибки
  9.     errnumber = error.excepinfo[-1]
  10.     if errnumber == -2145320928: #Была введена строка вместо числа
  11.         #Запрашиваем введённую строку
  12.         inputresult = doc.Utility.GetInput()
  13.         #Проверяем, соответствует ли введенная строка выбору опций
  14.         if inputresult.upper() == "О" or  inputresult.upper() == "ОПЦИЯ1":
  15.             #Код, выполняемый при выборе "Опция1"
  16.             pass
  17.         elif inputresult.upper() == "П" or  inputresult.upper() == "ОПЦИЯ2":
  18.              #Код, выполняемый при выборе "Опция2"
  19.             pass
  20.         else:
  21.             #Код, выполняемый при вводе любых других символов, кроме относящихся к опциям
  22.             #при наличии опции по умолчанию необходимо сопоставить ей ввод пустой строки ""
  23.             pass
  24.     elif errnumber == -2147352567: #Была нажата кнопка Ecs, обработка приведена для примера
  25.         #Код, выполняемый при нажатии Esc
  26.         pass
  27.     else:
  28.         #Код, выполняемый при любых других ошибках
  29.         pass
Я для себя просто написал функции на основе GetString, и преобразую потом введённое в int, float и т.д. уже средствами pyton, при этом внутри функций предусмотрел автоматический конструктор строки запроса для ввода опций, опций по-умолчанию и т.п., чтобы каждый раз не прописывать, с чем сравнивать введенную строку, чтобы понять, была ли выбрана опция.

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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #29 : 01-12-2017, 13:11:54 »
Опции для команд через COM, конечно, доступны. При использовании методов Utility.GetInteger, Utility.GetReal, GetString и т.п. достаточно сформировать строку запроса особым образом. Для автокада наличие в запросе текста вида [Опция1/<оПция2>/опЦия3] означает, что в запросе имеются три опции, причем вторая - опция по-умолчанию.
Кто сказал? В лиспе, по крайней мере, это не так. И, насколько я помню, в .NET тоже не так.
Вообще-то вот из официальной справки по VBA:
Код - Text [Выбрать]
  1. Sub Example_InitializeUserInput()
  2.     ' This example prompts for user input of a point. By using the
  3.     ' InitializeUserInput method to define a keyword list, the example can also
  4.     ' return keywords entered by the user.
  5.    
  6.     AppActivate ThisDrawing.Application.Caption
  7.    
  8.     On Error Resume Next
  9.    
  10.     ' Define the valid keywords
  11.     Dim keywordList As String
  12.     keywordList = "Line Circle"
  13.    
  14.     ' Call InitializeUserInput to set up the keywords
  15.     ThisDrawing.Utility.InitializeUserInput 128, keywordList
  16.    
  17.     ' Get the user input
  18.     Dim returnPnt As Variant
  19.     returnPnt = ThisDrawing.Utility.GetPoint(, vbLf & "Enter a point [Line/Circle]: ")
  20.     If Err Then
  21.          If StrComp(Err.Description, "User input is a keyword", 1) = 0 Then
  22.          ' One of the keywords was entered
  23.              Dim inputString As String
  24.              Err.Clear
  25.              inputString = ThisDrawing.Utility.GetInput
  26.              MsgBox "You entered the keyword: " & inputString
  27.          Else
  28.              MsgBox "Error selecting the point: " & Err.Description
  29.              Err.Clear
  30.          End If
  31.     Else
  32.         ' Display point coordinates
  33.         MsgBox "The WCS of the point is: " & returnPnt(0) & ", " & returnPnt(1) & ", " & returnPnt(2), , "GetInput Example"
  34.     End If
  35.    
  36. End Sub
Обрати внимание на InitializeUserInput и его обработку.
Все, что сказано - личное мнение.

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

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

Оффлайн dlobyntsev

  • ADN Club
  • Сообщений: 10
  • Карма: 5
Re: Python & ActiveX/COM Autocad
« Ответ #30 : 01-12-2017, 13:39:29 »
Тут ещё накладывается не всегда понятное взаимодействие Python с COM через pywin32.
Когда я с вводом разбирался, особой разницы между
Код - Python [Выбрать]
  1. doc.Utility.InitializeUserInput(128, "Line Circle")
и
Код - Python [Выбрать]
  1. doc.Utility.InitializeUserInput(128)
для последующей обработки не заметил, хотя, может, и упустил что-то.
Моя фраза
Цитировать
достаточно сформировать строку запроса особым образом
относится только к тому,что запрос в командной строке будет выглядеть как запрос с опциями, далее я как раз и показываю, что необходимо предусмотреть в коде, чтобы опции запроса не только выглядели, как опции, но и работали соответствующим образом.
Код из официальной справки VBA действует абсолютно по той же схеме, обрабатывая ошибки при вводе значений опций:
Код - Visual Basic [Выбрать]
  1. If Err Then
  2.          If StrComp(Err.Description, "User input is a keyword", 1) = 0 Then
просто я вместо текста ошибки "User input is a keyword" отслеживаю её по коду -2145320928
Код - Python [Выбрать]
  1. errnumber = error.excepinfo[-1]
  2.     if errnumber == -2145320928:

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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #31 : 01-12-2017, 14:08:43 »
Я в питоне дуб-дубом, немного только соображаю на предмет COM-взаимодействия :)
Насколько я понимаю, если не ввести ключевые слова, пользователь получает возможность вводить любую абракадабру.
Все, что сказано - личное мнение.

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

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

Оффлайн dlobyntsev

  • ADN Club
  • Сообщений: 10
  • Карма: 5
Re: Python & ActiveX/COM Autocad
« Ответ #32 : 01-12-2017, 14:22:28 »
Пользователь в любом случае имеет возможность ввести любую абракадабру, просто если ввод инициализирован как
Код - Python [Выбрать]
  1. doc.Utility.InitializeUserInput(128, "Line Circle")
то при обработке ошибки "User input is a keyword" метод doc.Utility.GetInput() вернет "Circle" при вводе C, c, Circle или CIRCLE, "Line" при вводе L, l, Line или LINE. В остальных случаях - то, что ввёл пользователь.
А если ввод инициализирован как
Код - Python [Выбрать]
  1. doc.Utility.InitializeUserInput(128)
метод doc.Utility.GetInput() будет всегда возвращать то, что ввёл пользователь.
Вся разница только в обработке пользовательского ввода, но она не принципиальна, т.к. обработку, аналогичную той, что выполняет autocad, можно без проблем выполнить и в своём коде.

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #33 : 08-12-2017, 12:13:17 »
Заметил сегодня такую ошибку. Вызываю выделение мышью объектов:

Код - Python [Выбрать]
  1. aDoc.Utility.Prompt("Укажите область на экране")
  2. selection = aDoc.SelectionSets.Add("test")
  3. selection.SelectOnScreen()

Если я выделяю область мышью - все работает. Но если я хочу выделить все объекты и по привычке нажимаю сочетание CNTRL+A - команда выделения в автокаде тут же прерывается. Далее по коду в Python при обращении к selection выдает ошибку, как если selection пуст:

Цитировать
File "C:\Program Files\Python\lib\site-packages\win32com\client\dynamic.py", line 252, in __getitem__
    raise TypeError("This object does not support enumeration")

Возможно ли как-то обработать это исключение в Python  и разрешить выделение сразу всех объектов?

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #34 : 08-12-2017, 19:23:42 »
Но если я хочу выделить все объекты и по привычке нажимаю сочетание CNTRL+A - команда выделения в автокаде тут же прерывается.
Всё правильно. Так и должно быть. У AutoCAD свои правила и их следует соблюдать. Вместо CTRL+A нужно жать _A и пробел/ввод (в английской версии можно просто A (латиница), а в русской В (кириллица)). CTRL+A при стандартных настройках запускает прерывание команды и команду _ai_selall.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн dlobyntsev

  • ADN Club
  • Сообщений: 10
  • Карма: 5
Re: Python & ActiveX/COM Autocad
« Ответ #35 : 10-12-2017, 15:18:30 »
Вместо CTRL+A нужно жать _A и пробел/ввод (в английской версии можно просто A (латиница), а в русской В (кириллица)).
    Небольшое уточнение:
    • Autocad 2018 Eng - A или a не работают, нужно ввести al или all в любом регистре.
    • Autocad 2018 Rus - соответственно не работает _A и _a, необходимы _al или _all в любом регистре, при этом кириллические в, все в любом регистре работают.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #36 : 10-12-2017, 15:51:37 »
Небольшое уточнение:

    Autocad 2018 Eng - A или a не работают, нужно ввести al или all в любом регистре.
    Autocad 2018 Rus - соответственно не работает _A и _a, необходимы _al или _all в любом регистре, при этом кириллические в, все в любом регистре работают.
Мой промах. A, _A не срабатывают, так как воспринимаются как _ADD, а не как _ALL. В русской локализации же эквивалент _ALL - это Все, а эквивалент _ADD - Добавить, т.е. достаточно одной буквы для того, чтобы понять какая опция выбора введена.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #37 : 20-12-2017, 05:51:07 »
Еще такой вопрос по выделению объектов рамкой.
Не могу разобраться с параметрами выделения в object.SelectOnScreen [FilterType][, FilterData]

К примеру, если я хочу выделить не все объекты, а только отрезки и прямоугольники сразу. Любые варианты вроде этого:

Код - Python [Выбрать]
  1. selection.SelectOnScreen(0, "AcDbPolyline")

выдают ошибку:

Цитировать
File "<COMObject Add>", line 3, in SelectOnScreen
pywintypes.com_error: (-2147352567, 'Ошибка.', (0, 'AutoCAD', 'Недопустимый аргумент FilterType в SelectOnScreen', 'C:\\Program Files\\AutoCAD\\HELP\\OLE_ERR.CHM', -2145320939, -2147024809), None)

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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #38 : 20-12-2017, 07:55:19 »
Настоятельно советую изучать справку по VBA - там многое описано:
Код - Visual Basic [Выбрать]
  1. Sub Example_Select()
  2.     ' This example adds members to a selection set, first by crossing and
  3.    ' then by filtering for circles.
  4.    
  5.     ' Create the selection set
  6.    Dim ssetObj As AcadSelectionSet
  7.     Set ssetObj = ThisDrawing.SelectionSets.Add("SSET")
  8.    
  9.     ' Add all object to the selection set that lie within a crossing of (28,17,0) and
  10.    ' (-3.3, -3.6,0)
  11.    Dim mode As Integer
  12.     Dim corner1(0 To 2) As Double
  13.     Dim corner2(0 To 2) As Double
  14.    
  15.     mode = acSelectionSetCrossing
  16.     corner1(0) = 28: corner1(1) = 17: corner1(2) = 0
  17.     corner2(0) = -3.3: corner2(1) = -3.6: corner2(2) = 0
  18.     ssetObj.Select mode, corner1, corner2
  19.    
  20.     ' Add all the Circles to the selection set that lie within the crossing of (28,17,0) and
  21.    ' (-3.3, -3.6,0) by filtering from the current drawing
  22.    Dim gpCode(0) As Integer
  23.     Dim dataValue(0) As Variant
  24.     gpCode(0) = 0
  25.     dataValue(0) = "Circle"
  26.    
  27.     Dim groupCode As Variant, dataCode As Variant
  28.     groupCode = gpCode
  29.     dataCode = dataValue
  30.    
  31.     ssetObj.Select mode, corner1, corner2, groupCode, dataCode
  32.    
  33. End Sub
Тебе нужен последний пример.
Все, что сказано - личное мнение.

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

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

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #39 : 20-12-2017, 17:54:12 »
Настоятельно советую изучать справку по VBA - там многое описано:

Тебе нужен последний пример.

Насколько я понимаю из VBA, эти gpCode и ataValue(0) - это массивы, в нулевое  значение  которых записываются DXF group code  и значение фильтра соответственно. Когда я пытаюсь то же самое проделать в Python, это не приводит ни к какому  результату, ошибка  та же.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #40 : 20-12-2017, 18:04:43 »
Это не массивы, а Variant'ы, в которые всунуты типовые массивы. Для FilterType - это short (не знаю точно как он обозначатся в Python, но это System.Int16 в .NET), для FilterData это Variant (в данном случае строка "LWPOLYLINE", а не "AcDbPolyline").
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #41 : 30-05-2018, 18:17:05 »
Добрый день!
Требуется начертить график в  определенной пустой области пространства модели автокада, которую я хочу выделить прямоугольником. Хочу сделать диалоговое меню, чтобы выделить эту область.
В данный момент я реализовал это через указание нижней  левой и верхней правой точек с помощью Utility.GetPoint(), для получения крайних координат рамки. Но как-то это не эстетичный метод, возможно ли реализовать это через выделение области прямоугольной рамкой? Стандартное выделение SelectByPolygon, как я понимаю, возвращает только набор объектов, но не координаты.
« Последнее редактирование: 30-05-2018, 19:03:34 от Electric »

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #42 : 30-05-2018, 19:39:17 »
В данный момент я реализовал это через указание нижней  левой и верхней правой точек с помощью Utility.GetPoint(), для получения крайних координат рамки. Но как-то это не эстетичный метод, возможно ли реализовать это через выделение области прямоугольной рамкой?
Можно. Посмотри в сторону Utility.GetCorner(). Первую точку через Utility.GetPoint(), вторую через Utility.GetCorner().
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Randum

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #43 : 08-06-2018, 16:00:54 »
Здравстуйте, пытаюсь получить данные из ячейки таблицы используя модуль pywin32.

Код - Python [Выбрать]
  1. tab.GetCellValue(1,1)

Получаю следующую ошибку.

Код - Python [Выбрать]
  1. pywintypes.com_error: (-2147352567, 'Ошибка.', (0, None, None, None, 0, -2147467263), None)

Смотрю в документацию по функции: Function GetCellValue(row As Long, col As Long)
Т.е. я предполагаю что возможно надо python-овский тип данных int перевести в Long
Как это можно сделать?
« Последнее редактирование: 08-06-2018, 17:04:12 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #44 : 08-06-2018, 17:01:23 »
Я не уверен, что проблема в этом, но вроде бы для преобразования в long в Python есть функция long().
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Randum

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #45 : 09-06-2018, 11:54:40 »
Как я понял long был только в Python 2.
Ещё немного поэкспериментировал:

Код - Python [Выбрать]
  1. >>> tab.GetCellValue([1,1])
  2. TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
  3.  
  4. >>> tab.GetCellValue(1,1,1)
  5. TypeError: GetCellValue() takes from 1 to 3 positional arguments but 4 were given
  6.  
  7. >>> tab.GetCellValue('1','1')
  8. pywintypes.com_error: (-2147352567, 'Ошибка.', (0, None, None, None, 0, -2147467263), None)
  9.  
  10. >>> win32api.FormatMessage(-2147467263)
  11. 'Не поддерживается\r\n'

Всё таки похоже на ошибку с типами данными как мне кажется.
Вот пример где явно тип данных не верный:

Код - Python [Выбрать]
  1. >>> tab.Move((0,0,0),(1,0,0))
  2. pywintypes.com_error: (-2147352567, 'Ошибка.', (0, None, None, None, 0, -2147024809), None)
  3.  
  4. >>> win32api.FormatMessage(-2147024809)
  5. 'Параметр задан неверно.\r\n'

Правда код ошибок разный :/

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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #46 : 09-06-2018, 11:56:37 »
А если попробовать tab.GetCellValue(1, 1) ?
Все, что сказано - личное мнение.

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

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

Оффлайн Randum

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #47 : 09-06-2018, 12:03:10 »
Пробовал уже Ответ #43

Код - Python [Выбрать]
  1. >>> tab.GetCellValue(1, 1)
  2. pywintypes.com_error: (-2147352567, 'Ошибка.', (0, None, None, None, 0, -2147467263), None)

Попробовал ещё раз, на всякий случай.))

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #48 : 09-06-2018, 12:09:25 »
А
Код - Python [Выбрать]
  1. tab.GetCellValue(0, 0)
?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Randum

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #49 : 09-06-2018, 12:12:43 »
Код - Python [Выбрать]
  1. >>> tab.Rows
  2. 5
  3. >>> tab.Columns
  4. 3
  5. >>> tab.GetCellValue(0, 0)
  6. pywintypes.com_error: (-2147352567, 'Ошибка.', (0, None, None, None, 0, -2147467263), None)

Оффлайн Khasan MamaevАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 7
    • Конструктивный диалог
  • Skype: wolfram222
Re: Python & ActiveX/COM Autocad
« Ответ #50 : 11-06-2018, 10:46:42 »
Можно Ваш Excel файлик?

Оффлайн Khasan MamaevАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 7
    • Конструктивный диалог
  • Skype: wolfram222
Re: Python & ActiveX/COM Autocad
« Ответ #51 : 11-06-2018, 12:40:16 »
Попробуйте так, еще можно воспользоваться библиотекой xlrd

Код - Python [Выбрать]
  1. import win32com.client
  2.  
  3. app = win32com.client.Dispatch("Excel.Application")
  4.  
  5. wb = app.Workbooks[0]
  6.  
  7. sh = wb.ActiveSheet
  8.  
  9. val = sh.Cells(1,1).value

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #52 : 11-06-2018, 14:53:03 »
Повтор сообщения.
« Последнее редактирование: 12-06-2018, 06:13:12 от Electric »

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #53 : 11-06-2018, 14:54:17 »
Пробовал уже Ответ #43

Код - Python [Выбрать]

    >>> tab.GetCellValue(1, 1)
    pywintypes.com_error: (-2147352567, 'Ошибка.', (0, None, None, None, 0, -2147467263), None)


Попробовал ещё раз, на всякий случай.))

Речь точно идет об автокаде? Если  да, то предложенный вариант obj.GetCellValue(1, 1)  у меня работает.  Ты  точно находишься в нужном пространстве модели/листа, таблица выполнена как  'AcDbTable'  и имеет достаточный диапазон столбцов/строк, в котором находится запрашиваемая ячейка?

Оффлайн Khasan MamaevАвтор темы

  • ADN Club
  • Сообщений: 44
  • Карма: 7
    • Конструктивный диалог
  • Skype: wolfram222
Re: Python & ActiveX/COM Autocad
« Ответ #54 : 11-06-2018, 15:08:21 »
так это таблица Автокада была?)) прошу прощения

Оффлайн Randum

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #55 : 12-06-2018, 17:23:43 »
Речь точно идет об автокаде? Если  да, то предложенный вариант obj.GetCellValue(1, 1)  у меня работает.

Спасибо, что проверили у себя.
Я действительно пытаюсь это реализовать не в AutoCAD-е, а в ZWCAD-е, он претендует на подобие первого но имеет много неприятных особенностей (отличий) и это по видимому ещё одно.
Попробую попытать тех. поддержку. ))

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #56 : 12-06-2018, 17:28:04 »
Я действительно пытаюсь это реализовать не в AutoCAD-е, а в ZWCAD-е
У нас на форуме категорически не обсуждаются "приложения - подобия"!!!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Randum

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #57 : 12-06-2018, 18:34:25 »
Хорошо, можете удалить тогда всё.  :-X

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #58 : 12-06-2018, 19:13:11 »
Хорошо, можете удалить тогда всё.  :-X
Я оставлю всю эту дискуссию. Она очень поучительна.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Archigeo

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #59 : 24-06-2018, 18:46:56 »
Здравствуйте, коллеги!
Я только начинаю осваивать программирование на Python для AutoCAD.
Помогите, пожалуйста, со следующим вопросом.
Пытаюсь успользовать метод AutoCAD.Application.ActiveDocument.Utility.GetEntity().
Ни как не могу пользоваться им в IronPython.
Получилось только при использовании чистого питона с pywin32.
Правда, если пользователь ничего не выбирает, то всеравно получается ошибка.

Код - Python [Выбрать]
  1. >>> import win32com.client
  2. >>> app = win32com.client.Dispatch("AutoCAD.Application")
  3. >>> a = app.ActiveDocument.Utility.GetEntity(None, None, "Select object.")
  4.  
  5. Traceback (most recent call last):
  6.   File "<pyshell#4>", line 1, in <module>
  7.     a = app.ActiveDocument.Utility.GetEntity(None, None, "Select object.")
  8.   File "<COMObject <unknown>>", line 3, in GetEntity
  9.   File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 287, in _ApplyTypes_
  10.     result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)
  11. com_error: (-2147352567, '\xce\xf8\xe8\xe1\xea\xe0.', (0, None, None, None, 0, -2147352567), None)

Хотелось бы программировать на IronPython, поскольку им я пользуюсь для Revit.

В документации сказано, что GetEntity принимает три параметра: объект (как я понимаю, класса AcadObject, массив и строку.)

Как сформировать объект для передачи в метод???
При попытке создать объект "руками" появляется сообщение, что это не возможно т.к. класс AcadObject абстрактный класс. Что это такое я пока не понимаю. Может быть есть метод, который формирует такой объект?

Заранее благодарю за ответы,
Георгий

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #60 : 24-06-2018, 19:59:02 »
Пытаюсь успользовать метод AutoCAD.Application.ActiveDocument.Utility.GetEntity().
Ни как не могу пользоваться им в IronPython.
Обязательно с ним? А почему не подходит Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.GetEntity() ?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Archigeo

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #61 : 24-06-2018, 23:20:12 »
Я подключаюсь к Autocad следующим образом.
Код - Python [Выбрать]
  1. app = System.Runtime.InteropServices.Marshal.GetActiveObject("Autocad.Application")

Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.GetEntity() у меня не видно. Речь идет о другом способе взаимодействия с AutoCAD?

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #62 : 24-06-2018, 23:21:36 »
Я подключаюсь к Autocad следующим образом.
Подключаешься изнутри AutoCAD или снаружи? Если снаружи, то предложенный мной способ недоступен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Archigeo

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #63 : 25-06-2018, 00:07:37 »
Да, я подключаюсь снаружи.

А изнутри, это надо скомилировать код и netload делать?
Есть референс по классам, доступным изнутри?

Еще может быть кто-то питоновую консоль сделал, которая изнутри подключается?

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #64 : 25-06-2018, 00:11:52 »
А изнутри, это надо скомилировать код и netload делать?
Нет. Компилировать ничего не нужно. Точнее создаётся C#-сборка, которая позволяет загрузить и выполнить python'овский-код.
Посмотри эти две темы:
http://through-the-interface.typepad.com/through_the_interface/2009/03/using-ironpython-with-autocad.html
http://through-the-interface.typepad.com/through_the_interface/2009/12/command-line-scripting-of-ironpython-code-in-autocad.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #65 : 25-06-2018, 00:37:35 »
Есть референс по классам, доступным изнутри?
Это всё в документации ObjectARX SDK, а в онлайне здесь: https://help.autodesk.com/view/OARX/2019/ENU/?guid=OREFNET-What_s_New
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Archigeo

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #66 : 25-06-2018, 00:43:32 »
Спасибо! Буду изучать. :)

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #67 : 25-06-2018, 00:54:25 »
Я приложил файлы к уроку на AU 2009 про использование IronPython с AutoCAD. Могут быть полезны.
« Последнее редактирование: 26-06-2018, 00:49:11 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Randum

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #68 : 05-07-2018, 10:11:00 »
Всем доброго времени суток,
Такой вопрос: как можно вывести, что-нибудь в командную строку, типа: код отработан без ошибок, результат такой-то?
На этот раз речь конечно же идёт о ZWAutoCAD.))

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #69 : 05-07-2018, 11:19:13 »
На этот раз речь конечно же идёт о ZWAutoCAD.))
Если это шутка, то неудачная.
Такой вопрос: как можно вывести, что-нибудь в командную строку, типа: код отработан без ошибок, результат такой-то?
Код - Python [Выбрать]
  1. Utility.Prompt("код отработан без ошибок, результат такой-то")
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Randum

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #70 : 05-07-2018, 12:55:15 »
Спасибо Александр, помогло.
На первых порах тяжело идёт, час гуглишь, пишешь строчку кода, ещё час гуглишь, пишешь другую строчку кода и т.д.))

Оффлайн Archigeo

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #71 : 08-07-2018, 12:43:17 »
Добрый день!
У меня такой вопрос.
Можно ли компилировать скрипт на ironpython в библиотеку
и подгружать ее для выполнения к c# с помощью каких-либо средств импорта?
(далее плагин на c# с подключенной библиотекой запускать в autocad.)

Примерно так работают макросы в Revit, на сколько я понимаю.

Хотелось бы получить несколько сборок, которые бы работали на других машинах без установленного питона.

Прошу прощения, если чего-то не понимаю.


В документации к ironpython сказано:
Accessing Python code from other .NET code
Statically-typed languages like C# and VB.Net can be compiled into an assembly that can then be used by other .NET code. However, IronPython code is executed dynamically using ipy.exe. If you want to run Python code from other .NET code, there are a number of ways of doing it.

Меня интересует:
Compiling Python code into an assembly
The pyc sample can be used to compile IronPython code into an assembly. The sample builds on top of clr-CompileModules. The assembly can then be loaded and executed using Python-ImportModule. However, note that the MSIL in the assembly is not CLS-compliant and cannot be directly accessed from other .NET languages.
Но более подробной документации найти не могу. Что это за "Python-ImportModule" и как он работает?

Благодарю за ответы.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #72 : 08-07-2018, 14:40:48 »
Самое главное в этом тексте вот это:
However, note that the MSIL in the assembly is not CLS-compliant and cannot be directly accessed from other .NET languages.
Т.е. эту сборку в AutoCAD загрузить будет нельзя. Так что в компиляции теряется весь смысл.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Archigeo

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #73 : 08-07-2018, 14:46:17 »
Идея в том, чтобы загрузить в автокад сборку на c#, которая загрузит другую сборку на ironpython специальным образом.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #74 : 08-07-2018, 14:51:15 »
Идея в том, чтобы загрузить в автокад сборку на c#, которая загрузит другую сборку на ironpython.
Мне непонятно зачем это всё нужно. Есть традиционные способы работы с AutoCAD API. Если уж смогли сделать сборку на C#, то зачем Python нужен?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Archigeo

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #75 : 08-07-2018, 15:02:40 »
Вопрос в том, можно ли загружать из c# не скрипты на питоне с помощью скриптинджин а скомпилированные dll на питоне. Просто интересно.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #76 : 08-07-2018, 15:09:03 »
Вопрос в том, можно ли загружать из c# не скрипты на питоне с помощью скриптинджин а скомпилированные dll на питоне. Просто интересно.
Я вижу как можно создать exe-файл на IronPython: https://habr.com/post/149621/
Но это совсем не то, что нужно для получения нормальной .NET сборки, которую можно было загрузить в AutoCAD.
Я нигде не нашел информации о том, что можно из (Iron)Python скомпилировать нормальную .NET сборку, т.е. компиляторов как для C#/VB.NET судя по всему не существует. И соответственно это тупиковая ветка. Python хорош именно как скриптовый язык.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Archigeo

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #77 : 08-07-2018, 15:21:31 »
Понятно.
Однако в Revit при создание макроса на ironpython запускается интегрированный SharpDevelop IDE, которая компилирует макрос в dll(он это умеет делать.) И макрос работает как библиотека классов dll.
Интересно, как это работает.
В случае с автокадом нельзя напрямую это делать т.к. питон не поддерживает атрибуты.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #78 : 08-07-2018, 15:24:12 »
Однако в Revit при создание макроса на ironpython запускается интегрированный SharpDevelop IDE, которая компилирует макрос в dll(он это умеет делать.)
Попробуй на SharpDevelop IDE скомпилировать макрос для AutoCAD и посмотри что получится.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #79 : 08-07-2018, 15:35:59 »
В случае с автокадом нельзя напрямую это делать т.к. питон не поддерживает атрибуты.
Атрибуты методов и классов? Т.е. стандартными методами нельзя определить команду. Тогда можно нестандартными:
Код - C# [Выбрать]
  1. Autodesk.AutoCAD.Internal.Utils.AddCommand("GroupName", "MyGlobalCommand", "MyLocalCommand", CommandFlags.UsePickSet | CommandFlags.Redraw, MyCommandHandler);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Archigeo

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #80 : 09-07-2018, 11:09:19 »
Попробовал собрать dll сборку на питоне в sharpdevelop. Все откомпилировалось и загрузилось в автокад. Но ничего не происходит.
Метод Initialize() не работает.

Вот код.

Код - Python [Выбрать]
  1. import clr
  2. clr.AddReferenceToFileAndPath("C:\\ObjectARX 2015\\inc\\AcCoreMgd.dll")
  3. clr.AddReferenceToFileAndPath("C:\\ObjectARX 2015\\inc\\AcDbMgd.dll")
  4. clr.AddReferenceToFileAndPath("C:\\ObjectARX 2015\\inc\\AcMgd.dll")
  5.  
  6. clr.AddReference("System.Windows.Forms")
  7.  
  8. import System.Windows.Forms
  9. import Autodesk.AutoCAD.Runtime
  10.  
  11. from System.Windows.Forms import *
  12. from Autodesk.AutoCAD.Runtime import *
  13.  
  14. class Commands(IExtensionApplication):
  15.     def Initialize():
  16.         MessageBox.Show("Hello!")
  17.    
  18.     def Terminate():
  19.         MessageBox.Show("Goodbye!")
« Последнее редактирование: 09-07-2018, 12:11:24 от Archigeo »

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #81 : 09-07-2018, 12:15:36 »
Выложи сборку, которую ты получил. Посмотрю на неё.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Archigeo

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #82 : 09-07-2018, 12:22:30 »
Выкладываю сборку

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #83 : 09-07-2018, 12:30:32 »
Выкладываю сборку
Понятно. Ничего не получится. Результат компиляции такой, что не совпадает ни имя класса, ни имя метода, который AutoCAD должен при загрузке этой сборки найти...


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #84 : 13-08-2018, 19:57:38 »
Вопрос: как можно запустить комманду Акада, например "_regenall", из пайтона?

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #85 : 13-08-2018, 20:02:50 »
Вопрос: как можно запустить комманду Акада, например "_regenall", из пайтона?
Если черед COM, то AcadDocument.SendCommand("_regenall ") (обрати внимание на пробел после имени команды).
А если через .NET, то Document.SendStringToExecute("_regenall ")
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #86 : 15-08-2018, 16:21:17 »
Если черед COM, то AcadDocument.SendCommand("_regenall ") (обрати внимание на пробел после имени команды).
А если через .NET, то Document.SendStringToExecute("_regenall ")

Спасибо. Использую через pythoncom.
А если допустим я запустил команду "_purge ", появляется меню автокада с возможностью выбора кнопок "Удалить"  "Удалить все"  "Закрыть"  "Справка". Есть ли программная возможность командами выбрать например кнопку "Удалить все", и в  новом открывшемся меню "Удалить все элементы"? Или это невозможно через COM.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #87 : 15-08-2018, 21:28:08 »
Вместо "_purge" попробуй "_-purge". Дальше смотри в командной строке.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #88 : 16-08-2018, 08:42:16 »
Многие команды в AutoCAD имеют вариант работы через ком.строку - достаточно перед именем поставить "-".
Кстати, если хочешь, чтобы командные методы работали в любой локализации AutoCAD, посмотри http://autolisp.ru/2010/03/04/localization/
Все, что сказано - личное мнение.

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

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

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #89 : 22-08-2018, 16:58:51 »
Еще вопрос.
В меню "Поле" (ctrl+F)  Автокада при создании и редактировании формул есть возможность указать мышью ссылку на ячейку, даже ячейку другой таблицы, при этом возвращается адрес столба и строки указанной ячейки. Что за метод используется при этом? Ведь при обычном выделении возвращается только выделенная таблица целиком, а не ее ячейка.

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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #90 : 22-08-2018, 17:08:28 »
Попробуй использовать HitTest (кажется, так называется)
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #91 : 22-08-2018, 17:12:34 »
Что за метод используется при этом?
В COM для этой цели есть только один метод: HitTest.
Описание метода здесь: http://help.autodesk.com/view/OARX/2018/ENU/?guid=GUID-8812BEE2-BD9F-488D-BAA1-A38060FA4D86
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #92 : 23-08-2018, 18:37:34 »
Честно говоря, даже не могу сообразить, как реализовать такой hittest средствами Python, возникает проблема с аргументами функции.

Возможно ли вызвать этот hittest текстовой командой в меню Автокада? по типу _purge или _regenall.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #93 : 23-08-2018, 18:39:51 »
Возможно ли вызвать этот hittest текстовой командой в меню Автокада? по типу _purge или _regenall.
Нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #94 : 26-08-2018, 17:20:44 »
Нет.

Ok, тогда у меня вопрос скорее по документации к HitTest.
Я правильно понимаю, что нужно каким-то способом инициализировать переменные wpt, wviewVec, resultRowIndex, resultColumnIndex, передать их в качестве  аргументов функции object.HitTest(), и если нажатие  было произведено по таблице, функция возвращает True, а  двум последним переменным назаначаются индексы строки и столбца?

Я попробовал с помощью этого кода:

Код - Python [Выбрать]
  1. resultRowIndex = 0
  2. resultColumnIndex = 0
  3.  
  4. py_coord = [0,0,0]
  5. wpt = win32com.client.VARIANT(VT_ARRAY | VT_I4, py_coord)
  6.  
  7. py_vector = [0, 0, 0]
  8. wviewVec = win32com.client.VARIANT(VT_ARRAY | VT_I4, py_vector)
  9.  
  10. if obj.HitTest(wpt, wviewVec, resultRowIndex, resultColumnIndex):
  11.     print(resultRowIndex, resultColumnIndex)

возвращает ошибку:

Цитировать
if obj.HitTest(wpt, wviewVec, resultRowIndex, resultColumnIndex):
  File "<COMObject <unknown>>", line 3, in HitTest
  File "C:\ProgramData\Anaconda64\lib\site-packages\win32com\client\dynamic.py", line 287, in _ApplyTypes_
    result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)
pywintypes.com_error: (-2147352567, 'Ошибка.', (0, None, None, None, 0, -2147024809), None)

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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #95 : 26-08-2018, 17:27:41 »
А как в Python передаются out-параметры?
Все, что сказано - личное мнение.

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

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

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #96 : 26-08-2018, 17:40:25 »
А как в Python передаются out-параметры?

Ок, я  подкорректировал код, я так понимаю, при работе через Python все выходные параметры HitTest выдаются в виде кортежа (неизменяемого списка):

Цитировать
resultRowIndex = 1
resultColumnIndex = 1

py_coord = [0,0,0]
wpt = win32com.client.VARIANT(VT_ARRAY | VT_R8, py_coord)

py_vector = [0, 0, 0]
wviewVec = win32com.client.VARIANT(VT_ARRAY | VT_R8, py_vector)

print(obj.HitTest(wpt, wviewVec))

Теперь результат вывода на экран:

Цитировать
(False, -1, -1)

Не могу понять, какие нужно подобрать wpt, wviewVec, чтобы функция возвращала True.
« Последнее редактирование: 27-08-2018, 04:33:44 от Electric »

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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #97 : 27-08-2018, 08:02:09 »
На dwg.ru были примеры использования HitTest (правда, на лиспе).
Все, что сказано - личное мнение.

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

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

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #98 : 27-08-2018, 08:27:30 »
На dwg.ru были примеры использования HitTest (правда, на лиспе).

Как ни странно, после прочтения примеров LIPS на том сайте, этот вариант у меня сработал  :D

Код - Python [Выбрать]
  1. py_vector = [0.0, 0.0, 1.0]
  2. wviewVec = win32com.client.VARIANT(VT_ARRAY | VT_R8, py_vector)
  3. result = obj.HitTest(cc(aDoc.Utility.GetPoint()), wviewVec)
  4. print(result)

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #99 : 03-09-2018, 19:43:52 »
Вопрос: как можно изменить стиль строк с "Данные" на "Заголовок" или "Название" (чтобы  эти строки повторялись при разбиении таблицы).

Т.е. у меня получилось изменить стиль  ячейки (2,2)  через MyTab.SetCellStyle(2, 2, '_Header'). Но тогда стиль ячейки меняется на "Заголовок", а стиль строки по-прежнему "Данные".

Я нашел метод object.GetRowType(row), который возвращает стиль заданной строки. Но с его помощью не получается изменить  значение стиля строки.  Если  ли обратный метод типа  SetRowType?   Ни во встроенной справке, ни через поиск в гугле, ни на dwg.ru форуме  не могу найти.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #100 : 03-09-2018, 19:57:07 »
Т.е. у меня получилось изменить стиль  ячейки (2,2)  через MyTab.SetCellStyle(2, 2, '_Header'). Но тогда стиль ячейки меняется на "Заголовок", а стиль строки по-прежнему "Данные".
Читаем внимательно документацию для метода Table.SetCellStyle:
Цитировать
Notes
To specify cell pass a valid row and column indices; to specify row pass a valid row index and pass -1 as column index; to specify column pass a valid column index and pass -1 as row index.
Перевод нужен или так понятно?
 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #101 : 04-09-2018, 17:14:27 »
Перевод нужен или так понятно?

Нет, перевод не нужен, с английским на этом уровне проблем нет. Проблема решена.
 
Но в онлайн справке, что я находил через гугл в разделе SetCellStyle Method (ActiveX)   этого пункта notes  нет (или я его в  упор не замечаю?), в моей встроенной chm справке его нет тем более.



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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #102 : 04-09-2018, 17:32:24 »
Но в онлайн справке, что я находил через гугл в разделе SetCellStyle Method (ActiveX)   этого пункта notes  нет (или я его в  упор не замечаю?), в моей встроенной chm справке его нет тем более.
Посмотри здесь: http://help.autodesk.com/view/OARX/2018/ENU/?guid=OREFNET-Autodesk_AutoCAD_DatabaseServices_TableContent_SetCellStyle_int_int_string
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Aleksey

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #103 : 11-09-2018, 10:24:49 »
Подскажите пожалуйста! Как выбрать вхождение блока по имени и считать значение его атрибута (например блок "РАМКА", атрибут PAGE). Пробывал через Blocks.Item, но это не то :o

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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #104 : 11-09-2018, 10:50:31 »
У блока может быть несколько вхождений, и при этом не только в пространство модели / листа. Если нужно выбрать вообще все, то лучше будет пройтись по таблице блоков и внутри каждого блока выполнять поиск соответствующих элементов. Если же надо по какому-то пространству, то см.в сторону фильтров в SelectionSet
Все, что сказано - личное мнение.

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

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

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #105 : 30-01-2019, 16:06:15 »
У меня тоже вопрос по блокам.
Допустим, я в своем скрипте по очереди выделяю текстовые  объекты и аттрибуты  с помощью GetEntity.
Но среди объектов на чертеже у меня попадается блок вроде этого с текстовыми аттрибутами внутри:



если я просто щелкну по его текстовому аттрибуту, GetEntity вернет мне только точку и сам блок в целом. Можно ли как-то таким щелчком сразу получить доступ к текстовому аттрибуту  блока (например, цифре "1") без расчленения самого блока?

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #106 : 30-01-2019, 16:23:00 »
Можно ли как-то таким щелчком сразу получить доступ к текстовому аттрибуту  блока (например, цифре "1") без расчленения самого блока?
Можно. Используй GetSubEntity.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #107 : 30-01-2019, 16:24:04 »
Можно, почему нет? Если действительно ткнули на атрибут - см. GetSubEntity. Если нужен доступ к атрибуту со строго определенным тэгом - то получать атрибуты вхождения блока (GetAttributes и GetConstantAttributes) и фильтровать по тэгу.
Все, что сказано - личное мнение.

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

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

Оффлайн DMA

  • ADN OPEN
  • Сообщений: 35
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #108 : 19-02-2019, 13:21:21 »
Подскажите, при данном варианте работы макроса Питона с Автокадом (как в 1-ом ролике: запуск внешнего файла) время срабатывания макроса примерно секунд 5. Это нормально? Или мне настройки покрутить стоит? Такое время ожидания не сильно комфортно при работе...

Оффлайн Alexll

  • ADN OPEN
  • Сообщений: 11
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #109 : 21-02-2019, 07:09:14 »
Задавал тут вопрос, но как то все само собой решилось. Не хотел питон рисовать в пустом документе, зато без проблем нарисовал в одном из рабочих чертежей. Как удалить сообщение не нашел.
« Последнее редактирование: 21-02-2019, 07:40:49 от Alexll »

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #110 : 21-02-2019, 12:02:04 »
Задавал тут вопрос, но как то все само собой решилось. Не хотел питон рисовать в пустом документе, зато без проблем нарисовал в одном из рабочих чертежей. Как удалить сообщение не нашел.
1. Приветствую на форуме!
2. У нас на форуме не удаляют сообщения. Представьте себе, что задан вопрос и кто-то знает и пишет ответ на этот вопрос, а вопроса уже нет...
3. Рад, что вопрос решился, но думаю неплохо было бы исследовать почему не получалось в пустом документе.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alexll

  • ADN OPEN
  • Сообщений: 11
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #111 : 21-02-2019, 12:12:06 »
По 3 му пункту, согласен, было бы неплохо исследовать этот вопрос. По началу грешил на то что питон 32бит, а автокад64. Потом думал что может версия автокада не та. Потом попробовал с библиотекой pyautocad провести манипуляции, эффект тот же. Причем Эта библиотека возвращала название документа(Чертеж 1). Меня еще больше удивило когда она возвратила название документа при закрытом автокаде, тот же чертеж 1.
Сейчас для того что бы написать этот ответ, провел еще несколько экспериментов, и что библиотека pyautocad, что доступ напрямую через API, нормально отрисовывают элементы.
Даже и не знаю в чем была проблема.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #112 : 21-02-2019, 12:14:38 »
По 3 му пункту, согласен
А по первому и второму? ;)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alexll

  • ADN OPEN
  • Сообщений: 11
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #113 : 21-02-2019, 12:22:30 »
ОК.
Просто воспринимал этот форум как информационный ресурс, а не как площадку для общения. Поэтому пытался быть краток)) Но если вы не возражаете, то
1. Конечно же здравствуйте, и спасибо за форум и эту тему. В общем то начальное видео в этой теме меня побудило к изучению питона
2. То же согласен. На иных форумах такое наблюдал. Но так же видел и такое, что разрешено удалять и редактировать последнее сообщение, если после него не было сообщений.

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #114 : 26-02-2019, 19:14:07 »
По 3 му пункту, согласен, было бы неплохо исследовать этот вопрос. По началу грешил на то что питон 32бит, а автокад64. Потом думал что может версия автокада не та. Потом попробовал с библиотекой pyautocad провести манипуляции, эффект тот же. Причем Эта библиотека возвращала название документа(Чертеж 1). Меня еще больше удивило когда она возвратила название документа при закрытом автокаде, тот же чертеж 1.

У меня наблюдался наверно похожий глюк с win32com библиотекой, когда она выдавала, что автокад или ворд запущены (хотя соответствующие программы были закрыты), при этом в списке процессов в системе действительно висели невидимые процессы с  именами AutoCAD Application или Word. Так и не понял, чем это вызвано.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #115 : 26-02-2019, 20:44:24 »
По 3 му пункту, согласен, было бы неплохо исследовать этот вопрос. По началу грешил на то что питон 32бит, а автокад64. Потом думал что может версия автокада не та. Потом попробовал с библиотекой pyautocad провести манипуляции, эффект тот же. Причем Эта библиотека возвращала название документа(Чертеж 1). Меня еще больше удивило когда она возвратила название документа при закрытом автокаде, тот же чертеж 1.

У меня наблюдался наверно похожий глюк с win32com библиотекой, когда она выдавала, что автокад или ворд запущены (хотя соответствующие программы были закрыты), при этом в списке процессов в системе действительно висели невидимые процессы с  именами AutoCAD Application или Word. Так и не понял, чем это вызвано.
Ну тут всё просто. Приложение не закрылось корректно. При этом они уже не в состоянии отвечать на COM-запросы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #116 : 04-04-2019, 13:54:18 »
Коллеги, прошу помощи.
Пишу на питоне код, с помощью которого, хочу собрать значения атрибутов блоков. По аналогии с VBA пытаюсь сделать это с помощью метода GetAttributes, но в ответ получаю ошибку:

Код - Python [Выбрать]
  1. atrr,_ = blk.GetAttributes()
  2.  
  3. ---------------------------------------------------------------------------
  4. KeyError                                  Traceback (most recent call last)
  5. <ipython-input-14-b127d596e8c4> in <module>
  6. ----> 1 atrr,_ = blk.GetAttributes()
  7.  
  8. D:\Programs\lib\site-packages\comtypes\automation.py in __ctypes_from_outparam__(self)
  9.     504     def __ctypes_from_outparam__(self):
  10.     505         # XXX Manual resource management, because of the VARIANT bug:
  11. --> 506         result = self.value
  12.     507         self.value = None
  13.     508         return result
  14.  
  15. D:\Programs\lib\site-packages\comtypes\automation.py in _get_value(self, dynamic)
  16.     455             return value
  17.     456         elif self.vt & VT_ARRAY:
  18. --> 457             typ = _vartype_to_ctype[self.vt & ~VT_ARRAY]
  19.     458             return cast(self._.pparray, _midlSAFEARRAY(typ)).unpack()
  20.     459         else:
  21.  
  22. KeyError: 9
  23.  
  24.  

Кто нибудь может подсказать, как справиться с ошибкой, либо как по-другому собрать значения атрибутов блоков

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #117 : 04-04-2019, 13:58:24 »
DMuzer,
Посмотри этот код: https://gist.github.com/thengineer/7157510
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #118 : 04-04-2019, 14:02:32 »
DMuzer,
Посмотри этот код: https://gist.github.com/thengineer/7157510

Спасибо!
Это работает.
А не в курсе, с чем связана ошибка? Это Автокад не стыкуется с питоном, или я что то неправльно делаю?

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #119 : 04-04-2019, 14:05:05 »
А не в курсе, с чем связана ошибка? Это Автокад не стыкуется с питоном, или я что то неправльно делаю?
Я же не вижу всего кода, не знаю что такое blk, не знаю есть ли у этой вставки блока атрибуты... Так что затрудняюсь сказать. Но если код, по ссылке которую я дал, работает нормально, то скорее всего это проблема твоего кода.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #120 : 04-04-2019, 14:14:17 »
Привожу весь код.
В  другие операции с объектом выполняются без проблем. Хочется разобраться, т.к. хотелось бы работать через comtypes, потому что я работаю в Jupyter notebook. А при использовании этой библиотекой в интерактивном режиме доступны методы и свойства объектов, это сильно упрощается работу и не нужно каждый раз в справку смотреть.

Код - Python [Выбрать]
  1. import array
  2. import comtypes.client
  3. import comtypes
  4.  
  5. app = comtypes.client.GetActiveObject('AutoCAD.Application')
  6. thisdrawing = app.ActiveDocument
  7.  
  8. blk,_ = thisdrawing.Utility.GetEntity()
  9. print(type(blk))
  10. blk.GetAttributes()
  11.  

Код - Python [Выбрать]
  1. <class 'comtypes.POINTER(IAcadBlockReference)'>
  2.  
  3. ---------------------------------------------------------------------------
  4. KeyError                                  Traceback (most recent call last)
  5. <ipython-input-37-8c74b912e4fb> in <module>
  6.       8 blk,_ = thisdrawing.Utility.GetEntity()
  7.       9 print(type(blk))
  8. ---> 10 blk.GetAttributes()
  9.  
  10. D:\Programs\lib\site-packages\comtypes\automation.py in __ctypes_from_outparam__(self)
  11.     504     def __ctypes_from_outparam__(self):
  12.     505         # XXX Manual resource management, because of the VARIANT bug:
  13. --> 506         result = self.value
  14.     507         self.value = None
  15.     508         return result
  16.  
  17. D:\Programs\lib\site-packages\comtypes\automation.py in _get_value(self, dynamic)
  18.     455             return value
  19.     456         elif self.vt & VT_ARRAY:
  20. --> 457             typ = _vartype_to_ctype[self.vt & ~VT_ARRAY]
  21.     458             return cast(self._.pparray, _midlSAFEARRAY(typ)).unpack()
  22.     459         else:
  23.  
  24. KeyError: 9
  25.  
  26.  

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #121 : 04-04-2019, 14:22:38 »
А что даёт:
Код - Python [Выбрать]
  1. HasAttributes = blk.HasAttributes
?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #122 : 04-04-2019, 14:28:04 »
Возвращает True, атрибуты у этого блока есть.
Может это связано что это динамический блок.



привожу код и вывод:
Код - Python [Выбрать]
  1. import array
  2. import comtypes.client
  3. import comtypes
  4.  
  5. app = comtypes.client.GetActiveObject('AutoCAD.Application')
  6. thisdrawing = app.ActiveDocument
  7.  
  8. # blk,_ = thisdrawing.Utility.GetEntity()
  9. blk = thisdrawing.HandleToObject('332A')
  10. print(blk.Handle)
  11. print(f'Наличие атрибутов у блока: {blk.HasAttributes}')
  12. blk.GetAttributes()
  13.  

332A
Наличие атрибутов у блока: True

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-45-72048c5e4e02> in <module>
     10 print(blk.Handle)
     11 print(f'Наличие атрибутов у блока: {blk.HasAttributes}')
---> 12 blk.GetAttributes()

D:\Programs\lib\site-packages\comtypes\automation.py in __ctypes_from_outparam__(self)
    504     def __ctypes_from_outparam__(self):
    505         # XXX Manual resource management, because of the VARIANT bug:
--> 506         result = self.value
    507         self.value = None
    508         return result

D:\Programs\lib\site-packages\comtypes\automation.py in _get_value(self, dynamic)
    455             return value
    456         elif self.vt & VT_ARRAY:
--> 457             typ = _vartype_to_ctype[self.vt & ~VT_ARRAY]
    458             return cast(self._.pparray, _midlSAFEARRAY(typ)).unpack()
    459         else:

KeyError: 9



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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #123 : 04-04-2019, 14:31:58 »
Может это связано что это динамический блок.
Нет. Это уж точно тут не причем. Если этот же код с этим же блоком у тебя сработает в VBA, то тогда это проблема Python'а.
Особенно интересно вот это:
Цитировать
# XXX Manual resource management, because of the VARIANT bug:
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #124 : 04-04-2019, 14:37:27 »
А может быть это связано с недоработками в библиотеке comtypes?

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #125 : 04-04-2019, 14:38:53 »
А может быть это связано с недоработками в библиотеке comtypes?
Вполне возможно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alexll

  • ADN OPEN
  • Сообщений: 11
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #126 : 24-04-2019, 06:45:30 »
А кто может подсказать как из питона 3.7 работать с цветами.
В букваре есть такой пример:
 
Код - vb.net [Выбрать]
  1.     Dim color As AcadAcCmColor
  2.         Set color = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.16")
  3.     Call color.SetRGB(80, 100, 244)
  4.     layerObj.TrueColor = color

С вижуал бейсиком совсем не знаком, но на сколько понимаю переменная color должна стать каким то специальным автокадовским типом. У меня же не получается запустить подобную конструкцию.

Код - Python [Выбрать]
  1. app = win32com.client.Dispatch("AutoCAD.Application")
  2. color = app.GetInterfaceObject("AutoCAD.AcCmColor.16")

Пробовал и попроще:

Код - Python [Выбрать]
  1. lay.TrueColor = 'Зеленый'
  2. lay.TrueColor = 'Green'
  3. lay.TrueColor=(80,100,244)
  4.  
  5. color = convert_coordinates(80,100,244)
  6. lay.TrueColor=color

И то же ничего не получается. Если кто знает как с цветами работать, подскажите пожалуйста

Оффлайн Alexll

  • ADN OPEN
  • Сообщений: 11
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #127 : 24-04-2019, 15:10:13 »
Разобрался.
Для 15го автокада нужно указывать "AutoCAD.AcCmColor.20". В остальном все работает по букварю

Оффлайн SilverWork

  • ADN OPEN
  • Сообщений: 10
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #128 : 05-05-2019, 21:47:19 »
Подскажите, как в Python использовать функции с необязательными параметрами? Например, Utiliy.GetPoint(Point, Prompt) имеет два параметра, и мне хотелось-бы не указывать Point, но использовать Prompt. Вариант Utility.GetPoint(None, "Сообщение") вызывает ошибку.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #129 : 05-05-2019, 22:18:51 »
Вариант Utility.GetPoint(None, "Сообщение") вызывает ошибку.
А так: Utility.GetPoint("Сообщение") ?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн SilverWork

  • ADN OPEN
  • Сообщений: 10
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #130 : 05-05-2019, 23:29:35 »
Пробовал, тоже не работает. Работает только совсем без аргументов.

Выдает такое вот сообщение об ошибке

return self.aDoc.Utility.GetPoint(Msg)
  File "<COMObject <unknown>>", line 3, in GetPoint
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\dynamic.py", line 287, in _ApplyTypes_
    result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)
pywintypes.com_error: (-2147352567, 'Ошибка.', (0, 'AutoCAD', 'Недопустимый аргумент Point в GetPoint', 'C:\\Program Files\\Autodesk\\AutoCAD 2019\\HELP\\OLE_ERR.CHM', -2145320939, -2147024809), None)


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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #131 : 05-05-2019, 23:35:33 »
Ну тогда что-нибудь типа Utility.GetPoint(pythoncom.Empty,"Сообщение") или Utility.GetPoint(pythoncom.Missing,"Сообщение")
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн SilverWork

  • ADN OPEN
  • Сообщений: 10
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #132 : 06-05-2019, 15:04:36 »
Спасибо. С pythoncom.Empty все отлично работает.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #133 : 06-05-2019, 15:44:14 »
Спасибо. С pythoncom.Empty все отлично работает.
Отлично. Не имея возможности проверить я интуитивно догадался, что именно может помочь. Так как использование Python для AutoCAD мягко говоря не очень распространено и не поддерживается Autodesk, то поиск решений таких казалось бы простых задач очень усложнён.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн SilverWork

  • ADN OPEN
  • Сообщений: 10
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #134 : 07-05-2019, 11:16:05 »
Примерно месяц занимаюсь изучением Python и его применением в AutoCad. Все выглядит не так сложно, даже для непрофессионального программиста. Для меня приемущества Python над LISP перевешивают неудобства связи AutoCad со сторонним приложением. Также я никогда не писал ничего с помощью ObjectARX, но есть несколько идей. Я правильно понимаю, что смогу написать модуль на С++ с использованием ObjectARX и потом им пользоваться в программе на Python?

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #135 : 07-05-2019, 11:19:33 »
Я правильно понимаю, что смогу написать модуль на С++ с использованием ObjectARX и потом им пользоваться в программе на Python?
Я не понимаю к чему такие сложности. Для того, чтобы писать для AutoCAD непрофессиональному программисту оптимально использовать AutoCAD .NET API (C# или VB.NET) . Он позволяет делать большинство из того, что можно сделать при помощи ObjectARX и обладает огромным количеством примеров (большинство из них на C#).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн SilverWork

  • ADN OPEN
  • Сообщений: 10
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #136 : 07-05-2019, 20:51:04 »
Дело в том, что я особо не разбирался с C#, т.к. я не программист, а проектировщик, мне показалось, что в любом случае не буду использовать все его приемущества, а со всеми недостатками придется иметь дело. Python меня привлек простотой изучения, наличием всевозможных плюшек, облегчающих процесс написания программ - динамическая типизация, динамические массивы, множество готовых функций для работы со строками и списками и тд. Также иногда делюсь своими наработками с коллегами и при использовании AutoLisp или Python не надо задумываться над совместимостью с разными версиями AutoCad. Пробовал также VBA, но не пошло.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #137 : 07-05-2019, 22:55:35 »
SilverWork,
Еще раз.
1) Python не поддерживается Autodesk для AutoCAD.
2) Примеров использования Python с AutoCAD очень мало. Во всяком слуачае по сравнению с VisualLisp/VBA/C#/C++
3) Непрограммисту (да и программисту) разбираться с тонкостями использования COM через Python в AutoCAD очень проблематично.
Так что всё на свой страх и риск.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн SilverWork

  • ADN OPEN
  • Сообщений: 10
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #138 : 08-05-2019, 11:25:10 »
Ну мы находимся в теме  Python & ActiveX/COM Autocad, следовательно она для тех, кто хочет разобраться в этих тонкостях. Да, конечно, есть свои плюсы и минусы. Все зависит от конкретной задачи. В моем случае не требуется много взаимодействовать с Autocad. Приложение собирает какие-то данные из чертежа (атрибуты блоков, значения из таблиц, длины линий и тд), потом внутри себя из обрабатывает и выдает результат обратно в Autocad в нужном мне виде (расчеты, таблицы, рисует каки-либо примитивы). И основная часть работы - это и есть обработка данных и в этом у Python есть преимущества, остается только написать интерфейс взаимодействия с Autocad, что вызывает трудности, но не смертельно.

Оффлайн SilverWork

  • ADN OPEN
  • Сообщений: 10
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #139 : 10-05-2019, 21:37:35 »
Столкнулся с проблемой, что очень медленно осуществляется взаимодействие программы с Autocad. Например, получение атрибутов сотни блоков занимает секунд 10-15, рисование объектов также заметно медленнее, чем через AutoLisp. Есть способы исправить это или это особенности работы через COM?

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #140 : 10-05-2019, 22:22:29 »
Есть способы исправить это или это особенности работы через COM?
COM между процессами приводит к таким задержкам. Особенно если эти процессы разной разрядности (32/64).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн dlobyntsev

  • ADN Club
  • Сообщений: 10
  • Карма: 5
Re: Python & ActiveX/COM Autocad
« Ответ #141 : 17-05-2019, 16:46:23 »
Есть способы исправить это или это особенности работы через COM?
Для ускорения нужно максимально пользоваться средствами самого када, например select с фильтрами вместо select + перебор, и т.п. Но работа через COM будет всегда несколько медленной, хотя для большинства инженерных задач и достаточной.
Передача через COM каду данных и параметров с преобразованием к нужному типу - отдельная головная боль, но это больше камень в огород com библиотек питона.
Организовать запуск команды на питоне из када - тоже квест. Решаемый, но я нашёл путь только через жуткие костыли.
Питон удобно использовать, если нужно вывести результаты расчётов или построений в кад и получить dwg. Плотно работать с кадом можно, но не совсем удобно.
К сожалению, на данный момент с точки зрения Autodesk в их продуктах нет места не .net языкам и питону в частности. В автокад - только через COM, который непонятно сколько ещё проживёт. В ревите реализована только поддержка .net  вариации питона версии 2, и переход на третью ветку даже в перспективе не виден.
Если нужно плотно программировать под продукты Autodesk, лучше выбрать C#. Порог входа чуть выше, но потенциальных проблем намного меньше.

Оффлайн SilverWork

  • ADN OPEN
  • Сообщений: 10
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #142 : 17-05-2019, 17:22:26 »
Тут будет небольшой оффтоп. Я поразбирался с C# и вроде все выглядит не сложно, но один момент меня смущает - это отладка кода. С лиспом и питоном все ясно: запустил, увидел косяки, исправил, повторил... и так хоть 100 раз. В случае с C#, как я понимаю, придется после каждой попытки перезагружать AutoCad, т.к. нет возможности выгрузить dll. Пытался поискать на форумах, также здесь была тема о выгрузке, но, как я понял, способ не простой и не всегда работает. Хочется сразу писать на том, что будет работать хорош и быстро, но вот процесс отладки кода меня, скажем прямо, пугает.

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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #143 : 17-05-2019, 17:38:59 »
Off-Topic: показать
Такая же беда... Ну что, написал лиспик для автозагрузки библиотеки - и вперед, с песнями ;)
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #144 : 17-05-2019, 20:58:48 »
Хочется сразу писать на том, что будет работать хорош и быстро, но вот процесс отладки кода меня, скажем прямо, пугает.
Не пугайся. Все так делают. Нужно писать максимально чистый код сразу - это сократит количество запусков AutoCAD для отладки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #145 : 19-05-2019, 22:51:20 »
Это если есть понимание, что и как работает. А вот если его нет или оно вызывает сомнения...
Все, что сказано - личное мнение.

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

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

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #146 : 08-06-2019, 11:56:38 »
Добрый день!
Подскажите, как обработать события автокада из python.
Есть ли подходящие примеры?

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #147 : 08-06-2019, 16:22:16 »
Есть ли подходящие примеры?
Примеров нет. Во всяком случае мне они не известны. Так что пробуй делать по аналогии с Word/Excel:
https://win32com.goermezer.de/microsoft/ms-office/events-in-microsoft-word-and-excel.html
Подписка на события происходит через win32com.client.DispatchWithEvents
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #148 : 08-06-2019, 17:10:13 »
Спасибо, попробую!

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #149 : 11-07-2019, 13:23:40 »
Допустим, у меня активирован режим объектной привязки, а конкретно "конточка", "центр", "узел", для удобства выделения объектов на чертеже я программно деактивирую на время привязку с помощью:

Код - Python [Выбрать]
  1. aDoc.ObjectSnapMode = False

Но когда потом я программно пытаюсь восстановить привязку, установив этому свойству значение True, режим привязки не активируется, все поставленные галочки типа  "конточка", "центр", "узел" пропадают. Есть ли способ получить доступ к настройкам привязки и активировать их программно? Либо как вариант, эмулировать нажатие F3 с клавиатуры. Не могу найти этот момент в документации.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #150 : 11-07-2019, 13:27:26 »
Есть ли способ получить доступ к настройкам привязки и активировать их программно?
Это системная переменная OSMODE: https://knowledge.autodesk.com/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2018/ENU/AutoCAD-Core/files/GUID-DD9B3216-A533-4D47-95D8-7585F738FD75-htm.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #151 : 11-07-2019, 14:07:37 »
Попробуй получить системную переменную osmode, и работать с ней.
Не увидел предыдущего ответа...
Все, что сказано - личное мнение.

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

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

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #152 : 11-07-2019, 18:22:23 »
Спасибо!
Сочетание GetVariable и SetVariable с этой системной переменной - то, что мне было нужно.

Код - Python [Выбрать]
  1. OSMODE = aDoc.GetVariable('OSMODE')
  2.  
  3. aDoc.SetVariable('OSMODE', OSMODE)
  4.  

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #153 : 22-08-2019, 14:18:39 »
Добрый день!
Прошу подсказать. Например, мне нужно изменить порядок отрисовки объектов а чертеже. Я попробовал следующий код:
Код - Python [Выбрать]
  1.  
  2. acad = Dispatch('autocad.application.23')
  3. doc = acad.ActiveDocument
  4.  
  5. ent, _ = doc.Utility.GetEntity()
  6.  
  7. order_dict = doc.ModelSpace.GetExtensionDictionary()
  8. st = order_dict.GetObject("ACAD_SORTENTS")
  9.  
  10. arr = VARIANT(VT_ARRAY | VT_VARIANT, [ent])
  11.  
  12. st.MoveToTop(arr)



Но в результате получаю такое сообщение:


com_error                                 Traceback (most recent call last)
<ipython-input-365-c2e46e7e77cf> in <module>
      9 arr = VARIANT(VT_ARRAY | VT_VARIANT, [ent])
     10
---> 11 st.MoveToTop(arr)

d:\Prorams\Anaconda\lib\site-packages\win32com\client\dynamic.py in MoveToTop(self, Objects)

com_error: (-2147352567, 'Ошибка.', (0, 'AutoCAD.Application', 'Неверный массив объектов', 'D:\\Program Files\\Autodesk\\AutoCAD 2020\\HELP\\OLE_ERR.CHM', -2145320837, -2145320837), None)


Мне понятно, что проблема здесь в упаковке параметров функции. Но вот уже все известные мне варианты перепробовал, результат тот же самый.
Может быть найдется у кого работающий кусок кода, чтобы понять как правильно передать параметры?
Пробовал и объекты в вариант упаковывать и получить через SelectionSets. В общем не получается.
« Последнее редактирование: 22-08-2019, 14:27:11 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #154 : 22-08-2019, 15:16:22 »
Могу лишь предположить, что вместо:
Код - Python [Выбрать]
  1. arr = VARIANT(VT_ARRAY | VT_VARIANT, [ent])
должно быть:
Код - Python [Выбрать]
  1. arr = VARIANT(VT_ARRAY | VT_DISPATCH, [ent])
Но больше ничем не помогу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #155 : 22-08-2019, 15:45:01 »
Да, именно так, все работает! Спасибо огромное!

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #156 : 26-08-2019, 12:08:07 »
Добрый день!
Нужен совет.

при использовании кода

Код - Python [Выбрать]
  1.    
  2.     ss = doc.SelectionSets.Add("DM_take")
  3.  
  4.     ss.Select(
  5.         acad_mod.constants.acSelectionSetAll,
  6.         None, None        
  7.     )
  8.  
  9.     for e in ss :
  10.         ….  
  11.  

при переборе объектов в SelectionSet получаем e как IAcadEntity instance, при этом получается, что специфичные для объекта методы недоступны, например InsertionPoint если это блок.
Мне приходися делать примерно так:
Код - Python [Выбрать]
  1. e = doc.HandleToObject(e.Handle)

И тогда в e я получаю нужный объект. Но мне кажется что это не самый оптимальный способ, потому что опять же приходится обращаться к ActiveX, как бы лишний запрос.
Может быть кто знает как решать эту задачу поэлегантнее?
« Последнее редактирование: 26-08-2019, 12:20:29 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #157 : 26-08-2019, 12:10:34 »
DMuzer,
Прочитай у меня в подписи как следует форматировать код на форуме. Я уже несколько раз исправлял форматирование твоего кода.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #158 : 26-08-2019, 12:23:06 »
Хорошо, я разобрался как это делать, исправлюсь.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #159 : 26-08-2019, 12:25:47 »
На VBA этот вопрос решается так:
Код - Visual Basic [Выбрать]
  1. Dim obj As AcadEntity
  2. Dim poly As Polyline
  3. Dim polyLength As Double
  4.  
  5. For Each obj In ssetObj
  6.      If TypeOf obj Is AcadPolyline Then
  7.         Set poly = obj
  8.         MsgBox "Длина полилинии " & poly.Length
  9.      End If
  10. Next
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #160 : 10-09-2019, 13:53:02 »
Доброго дня!
Есть ли у кого опыт подключения к AutoCad из Python для обработки событий? Может быть есть какие-нибудь работающие примеры. Мои попытки самостоятельно это сделать пока были неудачные.
Было бы здорово посмотреть примеры обработку событий, например двойного щелчка по объекту, удаления, создания и т.п.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #161 : 10-09-2019, 16:19:24 »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #162 : 10-09-2019, 17:12:50 »
Ну да, так по аналогии с Word не заработало. Так не смог добиться какого-то работоспособного варианта.

Оффлайн Aleksey

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #163 : 13-09-2019, 12:42:07 »
Здравствуйте! Подскажите пожалуйста по методу Select!
Хочу выбрать все вхождения блока, но не получается задать правильно аргументы FilterType и FilterData!
Код - Python [Выбрать]
  1. import array
  2. from win32com.client import Dispatch, CastTo, VARIANT
  3. from pythoncom import  VT_DISPATCH, VT_ARRAY, VT_UI2,VT_VARIANT,VT_BSTR
  4.  
  5.  
  6.  
  7. acad=Dispatch("Autocad.Application")
  8. doc=acad.ActiveDocument
  9. ms=doc.ModelSpace
  10.  
  11. try:
  12.     for i in doc.SelectionSets:
  13.         i.Delete()
  14. except: pass
  15.        
  16.  
  17. myss=doc.SelectionSets.Add("myss")
  18.  
  19. dxfcode,data=0,"Insert"
  20.  
  21. FilterType=VARIANT(VT_ARRAY|VT_UI2,dxfcode)
  22.  
  23. FilterData=VARIANT(VT_ARRAY|VT_VARIANT,data)
  24.  
  25. SELECT_ALL=5
  26.  
  27. myss.Select(SELECT_ALL,None,None,FilterType,FilterData)


Traceback (most recent call last):
  File "D:\Мои документы\Работа\python exp\AutoCAD\BlocksInBlockCount\block_count2.py", line 27, in <module>
    myss.Select(SELECT_ALL,None,None,FilterType,FilterData)
  File "C:\Program Files\Python34\lib\site-packages\win32com\gen_py\852B2D4E-B1F4-4BD6-8672-9993177C1A40x0x1x0\IAcadSelectionSet.py", line 73, in Select
    , Point1, Point2, FilterType, FilterData)
TypeError: Objects for SAFEARRAYS must be sequences (of sequences), or a buffer object.

Научите, что я делаю не так!
« Последнее редактирование: 13-09-2019, 12:52:39 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #164 : 13-09-2019, 12:53:37 »
Aleksey,
Прочитай у меня в подписи о правильном форматировании кода на форуме и соблюдай это правило!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #165 : 13-09-2019, 13:27:27 »
Здравствуйте! Подскажите пожалуйста по методу Select!
Хочу выбрать все вхождения блока, но не получается задать правильно аргументы FilterType и FilterData!
Код - Python [Выбрать]
  1. import array
  2. from win32com.client import Dispatch, CastTo, VARIANT
  3. from pythoncom import  VT_DISPATCH, VT_ARRAY, VT_UI2,VT_VARIANT,VT_BSTR
  4.  
  5.  
  6.  
  7. acad=Dispatch("Autocad.Application")
  8. doc=acad.ActiveDocument
  9. ms=doc.ModelSpace
  10.  
  11. try:
  12.     for i in doc.SelectionSets:
  13.         i.Delete()
  14. except: pass
  15.        
  16.  
  17. myss=doc.SelectionSets.Add("myss")
  18.  
  19. dxfcode,data=0,"Insert"
  20.  
  21. FilterType=VARIANT(VT_ARRAY|VT_UI2,dxfcode)
  22.  
  23. FilterData=VARIANT(VT_ARRAY|VT_VARIANT,data)
  24.  
  25. SELECT_ALL=5
  26.  
  27. myss.Select(SELECT_ALL,None,None,FilterType,FilterData)


Traceback (most recent call last):
  File "D:\Мои документы\Работа\python exp\AutoCAD\BlocksInBlockCount\block_count2.py", line 27, in <module>
    myss.Select(SELECT_ALL,None,None,FilterType,FilterData)
  File "C:\Program Files\Python34\lib\site-packages\win32com\gen_py\852B2D4E-B1F4-4BD6-8672-9993177C1A40x0x1x0\IAcadSelectionSet.py", line 73, in Select
    , Point1, Point2, FilterType, FilterData)
TypeError: Objects for SAFEARRAYS must be sequences (of sequences), or a buffer object.

Научите, что я делаю не так!

В функцию VARIANT нужно передавать список, а ты передаешь обычные значения. Поставь их либо в круглые либо в квадратные скобки

Код - Python [Выбрать]
  1. FilterType=VARIANT(VT_ARRAY|VT_UI2,[dxfcode])
  2.  
  3. FilterData=VARIANT(VT_ARRAY|VT_VARIANT,[data])
  4.  

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #166 : 13-09-2019, 13:27:37 »
Aleksey,
Подозреваю, что вместо None следует использовать pythoncom.Empty
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Aleksey

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #167 : 13-09-2019, 13:48:24 »
Код - Python [Выбрать]
  1. FilterType=VARIANT(VT_ARRAY|VT_UI2,[dxfcode])
  2.  
  3. FilterData=VARIANT(VT_ARRAY|VT_VARIANT,[data])
  4.  
  5. SELECT_ALL=5
  6.  
  7. myss.Select(SELECT_ALL,pythoncom.Empty,pythoncom.Empty,FilterType,FilterData)

Traceback (most recent call last):
  File "D:\Мои документы\Работа\python exp\AutoCAD\BlocksInBlockCount\block_count2.py", line 32, in <module>
    myss.Select(SELECT_ALL,pythoncom.Empty,pythoncom.Empty,FilterType,FilterData)
  File "C:\Program Files\Python34\lib\site-packages\win32com\gen_py\852B2D4E-B1F4-4BD6-8672-9993177C1A40x0x1x0\IAcadSelectionSet.py", line 73, in Select
    , Point1, Point2, FilterType, FilterData)
pywintypes.com_error: (-2147352567, 'Ошибка.', (0, 'AutoCAD', 'Недопустимый аргумент FilterType в Select', 'C:\\Program Files\\Autodesk\\AutoCAD 2014\\HELP\\OLE_ERR.CHM', -2145320939, -2147024809), None)

Не получается :-[

Меня этот метод интересует в том смысле, что мне кажется так будет быстрее выбирать элементы, чем через перебор всех элементов документа. Дает ли он выигрыш в скорости или может не стоит мучиться:)

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #168 : 13-09-2019, 14:00:10 »
А если:
Код - Python [Выбрать]
  1. FilterType=VARIANT(VT_ARRAY|VT_I2,[0])
  2. FilterData=VARIANT(VT_ARRAY|VT_VARIANT,['INSERT'])
?
Вообще же вроде не VT_UI2, а VT_I2
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #169 : 13-09-2019, 14:04:30 »
Не нужно pythoncom.Empty, нужно None оставить,
Код - Python [Выбрать]
  1. myss.Select(SELECT_ALL,None,None,FilterType,FilterData)
  2.  

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #170 : 13-09-2019, 14:26:26 »
Не нужно pythoncom.Empty, нужно None оставить,
Код - Python [Выбрать]
  1. myss.Select(SELECT_ALL,None,None,FilterType,FilterData)
  2.  
Здесь None не прокатило: https://adn-cis.org/forum/index.php?topic=7864.msg38367#msg38367
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #171 : 13-09-2019, 14:30:57 »
У меня работает, по 100 раз в день убеждаюсь в этом,
возможно, дело как раз в том, что нужно заменить VT_UI2 на VT_I2.
Опять же может быть дело в версии AutoCad. у меня 2018, и в 2020 тоже будет работать.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #172 : 13-09-2019, 14:33:44 »
возможно, дело как раз в том, что нужно заменить VT_UI2 на VT_I2.
Наиболее вероятно, т.к. сообщает об ошибке именно в параметре FilterType
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Aleksey

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #173 : 13-09-2019, 15:24:29 »
Спасибо большое! Заработало! :)
Код - Python [Выбрать]
  1. FilterType=VARIANT(VT_ARRAY|VT_I2,[dxfcode])
  2.  
  3. FilterData=VARIANT(VT_ARRAY|VT_VARIANT,[data])
  4.  
  5. SELECT_ALL=5
  6.  
  7. myss.Select(SELECT_ALL,None,None,FilterType,FilterData)

Оффлайн Alexll

  • ADN OPEN
  • Сообщений: 11
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #174 : 28-10-2019, 11:40:51 »
Всем здравствуйте.
Подскажите можно как то из питона передать набор в автокад?
То есть выделить один или несколько объектов в открытом документе автокада из питона.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #175 : 28-10-2019, 12:17:43 »
То есть выделить один или несколько объектов в открытом документе автокада из питона.
Имеется в виду выбрать и подсветить, как выбранное? Средствами только COM/ActiveX это сделать нельзя. И соответственно питоном тоже. В VBA это делалось через запуск lisp-функции (sssetfirst).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alexll

  • ADN OPEN
  • Сообщений: 11
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #176 : 28-10-2019, 12:31:24 »
Понял. А из питона же то же можно некую лисп функцию запустить? Только вот я не уверен что она переварит питоновский массив...

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #177 : 28-10-2019, 12:33:35 »
А из питона же то же можно некую лисп функцию запустить?
Запустить можно. Document.SendCommand. Сложность будет только с передачей параметров.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alexll

  • ADN OPEN
  • Сообщений: 11
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #178 : 28-10-2019, 12:35:07 »
Я понял. Спасибо

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #179 : 28-10-2019, 18:53:59 »
Подскажите пожалуйста! Как выбрать вхождение блока по имени и считать значение его атрибута (например блок "РАМКА", атрибут PAGE). Пробывал через Blocks.Item, но это не то :o

Возник схожий вопрос по динамическим атрибутам блока.
Допустим я выбрал мышкой  динамический блок и среди его динамических свойств  есть параметр "Ширина"

AllowedValues: (210.0, 297.0, 420.0, 594.0, 630.0, 841.0, 891.0, 1051.0, 1189.0, 1261.0, 1471.0, 1486.0, 1682.0, 1783.0, 1892.0, 2080.0, 2102.0, 2378.0, 2523.0)
Description: Ширина внешней рамки
PropertyName: Ширина
ReadOnly: False
Show: False
UnitsType: 2
Value  : 594.0

Как-то можно получить к нему доступ напрямую по имени без перебора всех свойств блока? Пока я получаю  их таким способом, но выглядит это не очень рационально:

Код - Python [Выбрать]
  1. width = [attr.value for attr in obj.GetDynamicBlockProperties() if attr.PropertyName=='Ширина'][0]

P.S. без использования GetBoundingBox()

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #180 : 28-10-2019, 21:13:30 »
Как-то можно получить к нему доступ напрямую по имени без перебора всех свойств блока?
Никак. Такой возможности в API нет. Впрочем это и логично - теоретически может быть несколько свойств с одним именем.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Alexll

  • ADN OPEN
  • Сообщений: 11
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #181 : 29-10-2019, 05:29:30 »
Я надеюсь что я не сильно злоупотребляю вниманием сообщества, у меня еще один вопрос.
Есть ли возможность изменить видимость атрибута в блоке? И есть ли у кого то для этого уже готовый рецепт?
Судя по доке, параметр "Invisible" - изменяемый, нельзя ли его как то изменить тем же способом что и просматриваю?
Код - Python [Выбрать]
  1. object.GetAttributes()[y1].Invisible

Еще нашел метод вот такой:
Код - Python [Выбрать]
  1. object.SetVariable(Invisible, False)
То же не получается изменить параметр

И еще один метод, но я вообще не могу его применить, потому и прошу пример на питоне
Код - Python [Выбрать]
  1. object.AddAttribute(1, acAttributeModeInvisible, Prompt, InsertionPoint, Tag, Value)

Был настроен на питон, но сталкиваюсь со сложностью с реализацией каждой небольшой идеи. Может выбрать какой то более простой и документированный способ автоматизации автокада? Для Вижуал-бейсика хоть примеры есть, но не уверен что это оптимальный подход. В общем прошу проконсультировать.

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #182 : 29-10-2019, 06:58:16 »
Я надеюсь что я не сильно злоупотребляю вниманием сообщества, у меня еще один вопрос.
Есть ли возможность изменить видимость атрибута в блоке? И есть ли у кого то для этого уже готовый рецепт?
Судя по доке, параметр "Invisible" - изменяемый, нельзя ли его как то изменить тем же способом что и просматриваю?

Не могу прямо сейчас проверить, но если параметр изменяемый, то разве нельзя ему просто присвоить логическое значение напрямую, без всяких сеттеров?

Код - Python [Выбрать]
  1. object.GetAttributes()[y1].Invisible = False

Оффлайн Alexll

  • ADN OPEN
  • Сообщений: 11
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #183 : 29-10-2019, 07:05:53 »
Вот - вот. Я и думал что как то так можно )
Спасибо, так получилось:
Код - Python [Выбрать]
  1. object.GetAttributes()[y1].Invisible = False

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #184 : 29-10-2019, 09:19:10 »
Был настроен на питон, но сталкиваюсь со сложностью с реализацией каждой небольшой идеи. Может выбрать какой то более простой и документированный способ автоматизации автокада? Для Вижуал-бейсика хоть примеры есть, но не уверен что это оптимальный подход. В общем прошу проконсультировать.
Рекомендую заняться изучением C#. И писать плагины, которые грузятся внутрь AutoCAD, т.к. AutoCAD .NET API значительно мощнее, чем AutoCAD COM/ActiveX
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #185 : 29-10-2019, 18:16:49 »
Рекомендую заняться изучением C#. И писать плагины, которые грузятся внутрь AutoCAD, т.к. AutoCAD .NET API значительно мощнее, чем AutoCAD COM/ActiveX

Тоже задумываюсь над изучением Си шарпа  для этих целей. Интересно, будет ли на практике какой-то прирост в скорости по сравнению с работой с COM в AutoCAD?
И как я понимаю, программа, написанная  на C# будет сильно зависеть от версии Автокада, в отличие от COM, разницу в работе которой в автокаде я не замечал с 2010 по 2020 версии.

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #186 : 29-10-2019, 18:23:39 »
Интересно, будет ли на практике какой-то прирост в скорости по сравнению с работой с COM в AutoCAD?
Да. Причем если сравнивать COM/ActiveX из внешнего приложения и .NET из плагина, загружаемого в сам AutoCAD, то прирост скорости может быть и на порядок.
И как я понимаю, программа, написанная  на C# будет сильно зависеть от версии Автокада, в отличие от COM, разницу в работе которой в автокаде я не замечал с 2010 по 2020 версии.
По хорошему нужно под каждую версию AutoCAD делать свою dll, но если не использовать некоторые особенности (точнее не нарваться на них случайно), то с 2013 и по 2020 должна работать одна dll. Ну и могут быть особенности с версией .NET Framework, так как каждая из версий AutoCAD требует свою (а точнее "не меньшую чем" версию .NET Framework: https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2020/ENU/AutoCAD-Customization/files/GUID-A6C680F2-DE2E-418A-A182-E4884073338A-htm.html).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #187 : 06-11-2019, 19:18:14 »
Есть идея написать на Пайтоне аналог скрипта AL для создания листов с видовыми экранами из рамок/блоков в пространстве модели. Предложенный там скрипт не вполне корректно работает с используемым мной динамическим блоком для рамки, а переделывать LISP пока желания не возникает  :D

Так вот, своим Python скриптом, получаю координату базовой точки рамки-блока (правый нижний угол)  x, y в пространстве модели, ширину width, высоту height, поворот orientation. Далее удаляю существующие листы кроме пространства модели и пустого листа по умолчанию "Лист1".

Затем создаю лист c именем pagename и пытаюсь создать видовой  экран в нем (за основу взял этот код):

Код - Python [Выбрать]
  1. newPage = aDoc.Layouts.Add(pagename)
  2.  
  3. aDoc.ActiveLayout = newPage
  4.  
  5. # Установить активным пространство листа
  6. aDoc.ActiveSpace = 0 #acPaperSpace
  7.                                
  8. center = win32com.client.VARIANT(VT_ARRAY | VT_R8, (x-width/2, y+height/2, 0))
  9.  
  10. # Видовой экран
  11. newVport = aDoc.PaperSpace.AddPViewport(center, width, height)  
  12.  
  13. # направление взгляда на viewport
  14.  newVport.Direction = win32com.client.VARIANT(VT_ARRAY | VT_R8, (1,1,1))
  15.  
  16. # Отобразить viewport
  17. newVport.Display(True)
  18.  
  19. # Переключение в пространство модели
  20. aDoc.MSpace = True  
  21.  
  22. # Установить viewport текущим
  23. aDoc.ActivePViewport = newVport
  24.  
  25. # попытка сделать ZoomExtents
  26. win32com.client.Dispatch("AutoCAD.Application").ZoomExtents()
  27.  
  28. # Деактивация пространства модели
  29. aDoc.MSpace = False
  30.  


В результате все вылетает на строчке "aDoc.ActivePViewport = newVport"
Цитировать
0, 'AutoCAD', 'Нет активного видового экрана в пространстве модели. Переключение в пространство листа'

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

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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #188 : 06-11-2019, 19:31:29 »
Насколько я помню, средствами ActiveX создавать ВЭ нельзя.
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #189 : 06-11-2019, 22:09:00 »
Насколько я помню, средствами ActiveX создавать ВЭ нельзя.
Вообще-то AddPViewport это делает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 11968
  • Карма: 1560
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #190 : 06-11-2019, 22:18:09 »
Electric,
Посмотри в каком состоянии у тебя системная переменная LAYOUTCREATEVIEWPORT: https://knowledge.autodesk.com/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-Core/files/GUID-799745E4-9804-41A7-BC48-E67CF2615111-htm.html
Если не 1, то установи её в 1.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #191 : 07-11-2019, 11:12:47 »
сть идея написать на Пайтоне аналог скрипта AL для создания листов с видовыми экранами из рамок/блоков в пространстве модели. Предложенный там скрипт не вполне корректно работает с используемым мной динамическим блоком для рамки, а переделывать LISP пока желания не возникает  Так вот, своим Python скриптом, получаю координату базовой точки рамки-блока (правый нижний угол)  x, y в пространстве модели, ширину width, высоту height, поворот orientation. Далее удаляю существующие листы кроме пространства модели и пустого листа по умолчанию "Лист1". Затем создаю лист c именем pagename и пытаюсь создать видовой  экран в нем (за основу взял этот код):

Думаю проблема в настройках листа,
вот этого не нужно:
aDoc.ActivePViewport = newVport

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




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

  • Administrator
  • *****
  • Сообщений: 898
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #192 : 07-11-2019, 11:19:53 »
Абсолютно не знаю Python, но почему бы не попробовать использовать вместо
Код - Python [Выбрать]
  1.     doc.SendCommand("_PSLTSCALE 0 ")
  2.     doc.SendCommand("ВСЕРЕГЕН ")
нечто типа
Код - Python [Выбрать]
  1. doc.SetVariable("PSLTSCALE", 0)
  2. doc.Regen 1
P.S. acActiveViewport = 0
acAllViewports = 1
Все, что сказано - личное мнение.

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

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

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 132
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #193 : 07-11-2019, 11:31:15 »
Абсолютно не знаю Python, но почему бы не попробовать использовать вместоКод - Python [Выбрать]    doc.SendCommand("_PSLTSCALE 0 ")    doc.SendCommand("ВСЕРЕГЕН ")нечто типаКод - Python [Выбрать]doc.SetVariable("PSLTSCALE", 0)doc.Regen 1P.S. acActiveViewport = 0acAllViewports = 1

Думаю, так было бы лучше, команду отправлял потому не было времени разбираться в тонкостях переменных, было понимание что такая команда работает правильно поэтому сделал так, с тех пор не трогал)))
 только так работать не будет

Код - Python [Выбрать]
  1. doc.Regen 1

нужно

Код - Python [Выбрать]
  1. doc.Regen(1)