Python & ActiveX/COM Autocad

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

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

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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь 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
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #92 : 23-08-2018, 18:37:34 »
Честно говоря, даже не могу сообразить, как реализовать такой hittest средствами Python, возникает проблема с аргументами функции.

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

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

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

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
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
  • *****
  • Сообщений: 1093
  • Карма: 172
Re: Python & ActiveX/COM Autocad
« Ответ #95 : 26-08-2018, 17:27:41 »
А как в Python передаются out-параметры?
Все, что сказано - личное мнение.

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

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

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
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
  • *****
  • Сообщений: 1093
  • Карма: 172
Re: Python & ActiveX/COM Autocad
« Ответ #97 : 27-08-2018, 08:02:09 »
На dwg.ru были примеры использования HitTest (правда, на лиспе).
Все, что сказано - личное мнение.

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

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

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
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
  • **
  • Сообщений: 70
  • Карма: 10
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
  • *****
  • Сообщений: 13827
  • Карма: 1784
  • Рыцарь 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
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #101 : 04-09-2018, 17:14:27 »
Перевод нужен или так понятно?

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



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

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

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

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