Импорт step файла в Autocad (Python)

Автор Тема: Импорт step файла в Autocad (Python)  (Прочитано 1509 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 71
  • Карма: 0
  • Skype: izhgtumekhanik@gmail.com
Добрый день!
Как импортировать Step файл в Autocad Mechanical 2016 x64 ?

Вот часть кода - рабочий:

Код - Python [Выбрать]
  1. from win32com.client import Dispatch, gencache
  2.  
  3. AcadAPI = gencache.EnsureModule('{4E3F492A-FB57-4439-9BF0-1567ED84A3A9}', 0, 1, 0)
  4. AcadObject = Dispatch('AutoCAD.Application.20.1', None, AcadAPI.IAcadApplication.CLSID)
  5. AcadObject.Visible = True
  6.  
  7. # Открываем ГОСТ-шаблон
  8. template_path = r"C:\Users\ZeroHour\AppData\Local\Autodesk\AutoCAD Mechanical 2016\R20.1\rus\Acadm\Template\am_gost.dwt"
  9. doc = AcadObject.Documents.Add(template_path)
  10.  
  11. # Импортируем STEP
  12. AcadObject.ActiveDocument.SetVariable("FILEDIA", 0)  # отключаем диалог выбора файла
  13. AcadObject.ActiveDocument.SendCommand(f'._IMPORT\r"{r"C:\cadеталь.stp"}"\r')
  14.  

А дальше я так понимаю Autocad тратит время на обработку этого файла и выходит всплывающее окошко о готовности с гиперссылкой по которому надо кликнуть и модель открывается. Фото окошка прикладываю.



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

  • ADN OPEN
  • **
  • Сообщений: 71
  • Карма: 0
  • Skype: izhgtumekhanik@gmail.com
Re: Импорт step файла в Autocad (Python)
« Ответ #1 : 11-08-2025, 15:56:01 »
Через события средствами api Autocad не могу подойти.

Отмечено как Решение izhgtumekhanik 11-08-2025, 16:14:36

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

  • ADN OPEN
  • **
  • Сообщений: 71
  • Карма: 0
  • Skype: izhgtumekhanik@gmail.com
Re: Импорт step файла в Autocad (Python)
« Ответ #2 : 11-08-2025, 16:14:33 »
Вот вторя часть - рабочий.

Код - Python [Выбрать]
  1. time.sleep(4)
  2.  
  3. # Открываем готовый результат (аналог клика по уведомлению)
  4. AcadObject.ActiveDocument.SendCommand("IMPORTTRANSLATIONRESULT\r")
  5.  
  6. # Перестраиваем вид
  7. AcadObject.ActiveDocument.SendCommand("._REGEN\r")
  8.  

Остается каким то образом отловить событие окончания импорта.


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

  • ADN OPEN
  • **
  • Сообщений: 71
  • Карма: 0
  • Skype: izhgtumekhanik@gmail.com
Re: Импорт step файла в Autocad (Python)
« Ответ #3 : 11-08-2025, 17:31:16 »
Так как отловить событие конца импорта ?

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

  • ADN OPEN
  • **
  • Сообщений: 71
  • Карма: 0
  • Skype: izhgtumekhanik@gmail.com
Re: Импорт step файла в Autocad (Python)
« Ответ #4 : 12-08-2025, 13:43:56 »
Наверно кто то заметил что получил объект doc, но работа идет через AcadObject.ActiveDocument..

Объект doc во время активного перестраивания недоступен и вылетает ошибка:

Код - Python [Выбрать]
  1. Reloaded modules: win32com.gen_py.4E3F492A-FB57-4439-9BF0-1567ED84A3A9x0x1x0
  2. Traceback (most recent call last):
  3.  
  4.   File C:\Python3.13.5x64\Lib\site-packages\spyder_kernels\py3compat.py:356 in compat_exec
  5.     exec(code, globals, locals)
  6.  
  7.   File c:\cad\безымянный1.py:31
  8.     doc.SetVariable("FILEDIA", 0)  # отключаем диалог выбора файла
  9.  
  10.   File ~\AppData\Local\Temp\gen_py\3.13\4E3F492A-FB57-4439-9BF0-1567ED84A3A9x0x1x0.py:7038 in SetVariable
  11.     return self._oleobj_.InvokeTypes(52, LCID, 1, (24, 0), ((8, 1), (12, 1)),Name
  12.  
  13. com_error: (-2147418111, 'Вызов был отклонен.', None, None)
  14.  

НО! После вызова

Код - Python [Выбрать]
  1. AcadObject.ActiveDocument.SendCommand(f'._IMPORT\r"{step_file}"\r')

объект doc доступен после ожидания 0.1 сек и доступен до момента завершения импорта!

значит потеря доступа к doc - признак завершения импорта!

Код - Python [Выбрать]
  1. from win32com.client import Dispatch, gencache
  2. # import pythoncom
  3. import time
  4.  
  5. AcadAPI = gencache.EnsureModule('{4E3F492A-FB57-4439-9BF0-1567ED84A3A9}', 0, 1, 0)
  6. AcadObject = Dispatch('AutoCAD.Application.20.1', None, AcadAPI.IAcadApplication.CLSID)
  7. # AcadObject = DispatchWithEvents('AutoCAD.Application.20.1', AcadAPI.IAcadApplication)
  8.  
  9. AcadObject.Visible = True
  10.  
  11. # Открываем ГОСТ-шаблон
  12. template_path = r"C:\Users\ZeroHour\AppData\Local\Autodesk\AutoCAD Mechanical 2016\R20.1\rus\Acadm\Template\am_gost.dwt"
  13. doc = AcadObject.Documents.Add(template_path)
  14.  
  15. # AcadObject.ActiveDocument.SetVariable("FILEDIA", 0)  # отключаем диалог выбора файла
  16.  
  17. time.sleep(0.1)
  18. doc.SetVariable("FILEDIA", 0)
  19.  
  20. # Импортируем STEP
  21. step_file = r"C:\cadеталь.stp"
  22. # Импортируем STEP
  23. # AcadObject.ActiveDocument.SendCommand(f'._IMPORT\r"{step_file}"\r')
  24.  
  25. time.sleep(0.1)
  26. doc.SendCommand(f'._IMPORT\r"{step_file}"\r')
  27.  
  28. flag = True
  29.  
  30. # for i in range(20):
  31. #     # pythoncom.PumpWaitingMessages()
  32.    
  33. #     print(doc.ModelSpace.Count)
  34. #     time.sleep(0.2)
  35.  
  36. while flag:
  37.     try:
  38.         tmp = doc.ModelSpace.Count
  39.         time.sleep(0.2)
  40.     except:
  41.         flag = False
  42.         time.sleep(1)
  43.  
  44. print('модель импортирована')
  45.  
  46. # Открываем готовый результат (аналог клика по уведомлению)
  47. AcadObject.ActiveDocument.SendCommand("IMPORTTRANSLATIONRESULT\r")
  48.  
  49. # Перестраиваем вид
  50. AcadObject.ActiveDocument.SendCommand("._REGEN\r")
  51.  
  52. AcadObject.ActiveDocument.SetVariable("FILEDIA", 1)  # возвращаем диалог выбора файла
  53.