Python & ActiveX/COM Autocad

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

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

Оффлайн DMuzer

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь 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
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь 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
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь 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
  • **
  • Сообщений: 70
  • Карма: 10
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()