Python & ActiveX/COM Autocad

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #240 : 23-01-2020, 11:09:23 »
Вот как решается эта задача в .NET: https://adn-cis.org/forum/index.php?topic=2933.msg12071#msg12071
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 152
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #241 : 23-01-2020, 14:34:05 »
Ну даже и с помощью .NET не все так просто...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #242 : 23-01-2020, 17:54:25 »
В .NET в последних версиях AutoCAD есть метод BlockReference.GeometryExtentsBestFit - я не проверял, но вполне возможно, что он учитывает и установленную видимость в динамическом блоке.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #243 : 27-01-2020, 12:45:21 »
Возможно ли в AutoCAD с помощью COM или .Net определить, что объект на чертеже (например,  отрезок или блок, как на рисунке ниже) находится внутри прямоугольной рамки-полилинии без применения математических расчетов с координатами и границами boundingbox?
Я нашел IntersectWith метод, но если применить его к блоку и синей полилинии ниже - метод просто возвращает пустой список пересечений, т.к. объекты формально не пересекаются. То же самое, если рамка выполнена блоком.



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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #244 : 27-01-2020, 12:50:49 »
Код - Visual Basic [Выбрать]
  1. SelectionSet.Select acSelectionSetWindow p1 p2
Точки p1 и p2 должны быть видимы на экране.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #245 : 27-01-2020, 12:56:39 »
Да нет, не выделить объекты на чертеже, а определить, что уже нарисованный блок находится внутри уже нарисованной полилинии. Я так понимаю, такого метода нет, но хочу убедиться наверняка.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #246 : 27-01-2020, 13:05:25 »
Electric,
Ты таким образом не выделяешь, а находишь все объекты внутри окна (т.е. твоего прямоугольника). Если объект внутри окна, то он попадёт в набор, если нет - нет. Другого способа нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #247 : 27-01-2020, 16:08:05 »
Понял. Спасибо за наводку!

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 152
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #248 : 25-02-2020, 21:12:42 »
Добрый день!
Сталкиваюсь с такой проблемой, например, если программа довольно продолжительное время работает, существует проблема, что
если пользователь ткнет в чертеж или нажмет на клавишу, то при обращении к AutoCad выпадет исключение.
Можно ли как то заблокировать работу автокад на время работы скрипта?
Можно, конечно ловить исключения, но тогда придется ловить каждое обращение к автокаду, что сильно усложняет программу...
Может есть какой нибудь стандартный способ уйти от этого?
Ну и если есть такой, то сразу возникнет обратная задача, прервать работу скрипта и разблокировать автокад...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #249 : 25-02-2020, 21:44:04 »
Можно ли как то заблокировать работу автокад на время работы скрипта?
Заблокировать через COM/ActiveX нельзя. Можно сделать его невидимым: Application.Visible = False
Ну или контролировать его состояние через Application.GetAcadState().IsQuiescent  - если True, то можно выполнять очередное действие.
Но исключения нужно ловить в любом случае.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 152
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #250 : 25-02-2020, 23:37:26 »
То есть получается, в любом случае нужно разбивать код на участки, отлавливать исключения и если исключение возникает, код повторять заново? Ну либо вообще все сбрасывать.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #251 : 25-02-2020, 23:46:30 »
То есть получается, в любом случае нужно разбивать код на участки, отлавливать исключения и если исключение возникает, код повторять заново? Ну либо вообще все сбрасывать.
Именно так. Вот пример, как это делается в C++: https://adn-cis.org/kak-ispolzuya-visual-c-zapustit-autocad-i-zastavit-ego-vyipolnyat-nekotoryie-dejstviya.html
Для Python в принципе аналогично.
« Последнее редактирование: 26-02-2020, 00:36:46 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #252 : 26-02-2020, 04:11:48 »
Добрый день!
Сталкиваюсь с такой проблемой, например, если программа довольно продолжительное время работает, существует проблема, что
если пользователь ткнет в чертеж или нажмет на клавишу, то при обращении к AutoCad выпадет исключение.
Можно ли как то заблокировать работу автокад на время работы скрипта?
Можно, конечно ловить исключения, но тогда придется ловить каждое обращение к автокаду, что сильно усложняет программу...
Может есть какой нибудь стандартный способ уйти от этого?
Ну и если есть такой, то сразу возникнет обратная задача, прервать работу скрипта и разблокировать автокад...

Я как-то для подобных целей использовал такой танец с бубном. Вставляю функцию в наиболее проблемные участки кода, когда нужно дождаться AutoCAD, а он занят черчением или может не ответить на запрос, пытаюсь получить доступ к пространству модели, иначе жду в цикле:

Код - Python [Выбрать]
  1. def dynamicPause():
  2.     wait_time = 0.1
  3.     while wait_time<10:
  4.         try:
  5.             app = win32com.client.Dispatch("AutoCAD.Application")
  6.             aDoc = app.ActiveDocument
  7.             mSp = aDoc.ModelSpace
  8.             break
  9.         except:
  10.             sleep(wait_time)
  11.             wait_time *= 2

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 152
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #253 : 26-02-2020, 12:07:14 »
Спасибо за ответы!

В принципе я так и так я и предполагал... просто надеялся, что может быть в автокаде есть что то для упрощения этой задачи...

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 152
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #254 : 26-02-2020, 12:08:23 »
А это неплохое решение, возьму на вооружение... спасибо!

Я как-то для подобных целей использовал такой танец с бубном. Вставляю функцию в наиболее проблемные участки кода, когда нужно дождаться AutoCAD, а он занят черчением или может не ответить на запрос, пытаюсь получить доступ к пространству модели, иначе жду в цикле:

Код - Python [Выбрать]
def dynamicPause():
    wait_time = 0.1
    while wait_time<10:
        try:
            app = win32com.client.Dispatch("AutoCAD.Application")
            aDoc = app.ActiveDocument
            mSp = aDoc.ModelSpace
            break
        except:
            sleep(wait_time)
            wait_time *= 2