Python & ActiveX/COM Autocad

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

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

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

  • Administrator
  • *****
  • Сообщений: 10387
  • Карма: 1315
  • Рыцарь 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
  • *****
  • Сообщений: 822
  • Карма: 134
Re: Python & ActiveX/COM Autocad
« Ответ #151 : 11-07-2019, 14:07:37 »
Попробуй получить системную переменную osmode, и работать с ней.
Не увидел предыдущего ответа...
Все, что сказано - личное мнение.

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

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

Оффлайн Electric

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
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
  • **
  • Сообщений: 74
  • Карма: 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
  • *****
  • Сообщений: 10387
  • Карма: 1315
  • Рыцарь 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
  • **
  • Сообщений: 74
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #155 : 22-08-2019, 15:45:01 »
Да, именно так, все работает! Спасибо огромное!

Оффлайн DMuzer

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

Оффлайн DMuzer

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

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

  • Administrator
  • *****
  • Сообщений: 10387
  • Карма: 1315
  • Рыцарь 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
  • **
  • Сообщений: 74
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #160 : 10-09-2019, 13:53:02 »
Доброго дня!
Есть ли у кого опыт подключения к AutoCad из Python для обработки событий? Может быть есть какие-нибудь работающие примеры. Мои попытки самостоятельно это сделать пока были неудачные.
Было бы здорово посмотреть примеры обработку событий, например двойного щелчка по объекту, удаления, создания и т.п.

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

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

Оффлайн DMuzer

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