Python & ActiveX/COM Autocad

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

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

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

  • Administrator
  • *****
  • Сообщений: 11756
  • Карма: 1536
  • Рыцарь 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
  • *****
  • Сообщений: 11756
  • Карма: 1536
  • Рыцарь 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
  • *****
  • Сообщений: 11756
  • Карма: 1536
  • Рыцарь 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
  • *****
  • Сообщений: 897
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #188 : 06-11-2019, 19:31:29 »
Насколько я помню, средствами ActiveX создавать ВЭ нельзя.
Все, что сказано - личное мнение.

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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 11756
  • Карма: 1536
  • Рыцарь 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
  • *****
  • Сообщений: 897
  • Карма: 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)

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

  • Administrator
  • *****
  • Сообщений: 897
  • Карма: 148
Re: Python & ActiveX/COM Autocad
« Ответ #194 : 07-11-2019, 11:48:25 »
Ну, я в Python ни бум-бум :)
Все, что сказано - личное мнение.

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

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