Python & ActiveX/COM Autocad

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

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

Оффлайн Marik

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #480 : 15-01-2022, 14:12:44 »
Может и с "\\", только все равно ошибка. Пробовал и с "/" - тоже ошибка.

Отмечено как Решение Александр Ривилис 16-01-2022, 01:07:15

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #481 : 15-01-2022, 16:47:08 »
Marik,
1. К этому каталогу есть доступ по записи?
2. Этот dwg-файл открывается нормально в этой же версии AutoCAD?
3. Нет ли ошибки в пути доступа к файлу?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #482 : 15-01-2022, 18:02:02 »
Может и с "\\", только все равно ошибка. Пробовал и с "/" - тоже ошибка.

Я на диске "G:\" создал папку "Python", в ней файл "d1020ntr.dwg".
Твой код с предложенными изменениями от Александра работает, геометрия из "d1020ntr.dwg" вставляется внешней ссылкой.

Попробуй как вариант с добавлением "r" перед строкой:

Код - Python [Выбрать]
  1. mSp.AttachExternalReference(r"G:\Python\d1020ntr.dwg", "Xref01", acadcoord(0, 0, 0), 1, 1, 1, 0, False)

если не хочешь дублировать слэш каждый раз.

Оффлайн Marik

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #483 : 16-01-2022, 00:26:53 »
Спасибо за помощь! Работает без "r" и с "\". Файл - ссылка был поврежден почему-то.
« Последнее редактирование: 16-01-2022, 01:02:15 от Marik »

Оффлайн qwertyqwertevich

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #484 : 25-03-2022, 15:40:51 »
Добрый день. Подскажите, пожалуйста, как получить цвет объекта в чём-то помимо ACI? Искал по этой теме, видел только применение RGB, но получить TrueColor объекта у меня не получилось. В общем надо чтобы программа понимала в какой RAL выкрашен объект

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #485 : 25-03-2022, 16:02:31 »
Добрый день. Подскажите, пожалуйста, как получить цвет объекта в чём-то помимо ACI? Искал по этой теме, видел только применение RGB, но получить TrueColor объекта у меня не получилось. В общем надо чтобы программа понимала в какой RAL выкрашен объект
В COM/ActiveX API, которое использует Python, таких средств нет. Тут необходимо создать массив, в котором будет соответствие ACI номера и цвета RGB. Например, как сделано здесь: https://forums.autodesk.com/t5/vba/converting-colors-to-rgb/td-p/350909
Но вообще-то соответствия ACI-номеров и RGB разные в разных версиях AutoCAD и еще зависят от цветовой схемы AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн qwertyqwertevich

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #486 : 25-03-2022, 16:58:22 »
Добрый день. Подскажите, пожалуйста, как получить цвет объекта в чём-то помимо ACI? Искал по этой теме, видел только применение RGB, но получить TrueColor объекта у меня не получилось. В общем надо чтобы программа понимала в какой RAL выкрашен объект
В COM/ActiveX API, которое использует Python, таких средств нет. Тут необходимо создать массив, в котором будет соответствие ACI номера и цвета RGB. Например, как сделано здесь: https://forums.autodesk.com/t5/vba/converting-colors-to-rgb/td-p/350909
Но вообще-то соответствия ACI-номеров и RGB разные в разных версиях AutoCAD и еще зависят от цветовой схемы AutoCAD.
Спасибо. К сожалению через соответствие ACI не получится определять RAL, ибо первые же RAL'ы в RGB эквиваленте определяются одним и тем же ACI (близкие оттенки). Что ж, еще один "за" в сторону С#, в котором такие мелочи реализуемы?
Хотя в данном случае обойдусь называнием слоя нужным RAL'ом

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #487 : 25-03-2022, 20:18:30 »
Что ж, еще один "за" в сторону С#, в котором такие мелочи реализуемы?
Средствами ObjectARX или AutoCAD .NET API для каждого ACI можно получить RGB.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Derie1

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #488 : 07-04-2022, 18:07:41 »
Добрый день.
Хотел бы вернуться к вопросу выбора и удаления определенных блоков в чертеже. Вроде бы тщательно изучил в этой ветке комментарии по этой теме, написал скрипт согласно этому и столкнулся с проблемой. Иногда скрипт отрабатывает и удаляет все нужные (ненужные) блоки, а иногда застревает на каком то шаге и вылетает с ошибкой. В чем может быть проблема?
Пробовал перебирать блоки двумя способами, в обоих одинаковая проблема возникает. Второй способ закомментирован.


Код - Python [Выбрать]
  1. import win32com.client
  2. import pythoncom
  3. from PyQt5 import QtWidgets
  4.  
  5.  
  6. app = QtWidgets.QApplication([])
  7. acad = win32com.client.Dispatch("AutoCAD.Application")
  8. dwg_file = QtWidgets.QFileDialog.getOpenFileName(caption="Выберите файл шаблона или схемы в AutoCAD... ", filter="DWG (*.dwg)")[0]  # выбираем исхоный файл
  9. doc = acad.Documents.Open(dwg_file)
  10.  
  11. try:
  12.     for i in doc.SelectionSets:
  13.         i.Delete()
  14. except:
  15.     pass
  16.  
  17. objSS = doc.SelectionSets.Add("toErase")
  18.  
  19. FilterType = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_I2, [0])
  20. FilterData = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, ['INSERT'])
  21. SELECT_ALL = 5
  22.  
  23. objSS.Select(SELECT_ALL, pythoncom.Empty, pythoncom.Empty, FilterType, FilterData)
  24.  
  25. i = 0
  26. while i < objSS.Count:
  27.     if objSS[i].EffectiveName == "TOTAL" or objSS[i].EffectiveName == "KNF" or objSS[i].EffectiveName == "INCOMER" or objSS[i].EffectiveName == "AUTOMAT" or objSS[i].EffectiveName == "LINE":
  28.         objSS[i].Delete()
  29.     i += 1
  30.  
  31. # for obj in objSS:
  32. #     if obj.EffectiveName == "TOTAL" or obj.EffectiveName == "KNF" or obj.EffectiveName == "INCOMER" or obj.EffectiveName == "AUTOMAT" or obj.EffectiveName == "LINE":
  33. #         obj.Delete()
  34.  
  35. objSS.Delete()

Вот текст ошибки:
Цитировать
Traceback (most recent call last):
  File "c:\Users\m.davydov\Dropbox\MyProg\SLD_Builder\deleting_selected_blocks.py", line 35, in <module>
    if objSS.EffectiveName == "TOTAL" or objSS.EffectiveName == "KNF" or objSS.EffectiveName == "INCOMER" or objSS.EffectiveName == "AUTOMAT" or objSS.EffectiveName == "LINE":
  File "C:\Users\m.davydov\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\win32com\client\dynamic.py", line 324, in __getitem__
    return self._get_good_object_(self._enum_.__getitem__(index))
  File "C:\Users\m.davydov\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\win32com\client\util.py", line 41, in __getitem__
    return self.__GetIndex(index)
  File "C:\Users\m.davydov\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\win32com\client\util.py", line 62, in __GetIndex
    result = self._oleobj_.Next(1)
pywintypes.com_error: (-2147418111, 'Вызов был отклонен.', None, None)
« Последнее редактирование: 07-04-2022, 18:09:35 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #489 : 07-04-2022, 18:11:02 »
Derie1,
Приветствую на форуме! Обрати внимание на правило форматирования кода, ссылка на которое у меня в подписи.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Derie1

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #490 : 07-04-2022, 18:13:49 »
Derie1,
Приветствую на форуме! Обрати внимание на правило форматирования кода, ссылка на которое у меня в подписи.

Да, спасибо. Не понял сразу как сделать. Теперь разобрался.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #491 : 07-04-2022, 18:14:10 »
а иногда застревает на каком то шаге и вылетает с ошибкой.
С какой ошибкой?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Derie1

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #492 : 07-04-2022, 18:16:28 »
С какой ошибкой?
Добавил текст ошибки в своё сообщение.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #493 : 07-04-2022, 18:19:16 »
С какой ошибкой?
Добавил текст ошибки в своё сообщение.
При этой ошибке можешь попробовать сделать небольшую задержку и повторить вызов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #494 : 07-04-2022, 18:21:04 »
Кроме того могу посоветовать сделать цикл не от 0 до objSS.Count, а от objSS.Count до 0 с уменьшением i
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение