Python & ActiveX/COM Autocad

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

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

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #255 : 28-02-2020, 22:44:09 »
Всем добра!
Подскажите, как вставить блок в Autocad при помощи метода InsertBlock?
В VBA работала строка:

Код - Visual Basic [Выбрать]
  1. insertionPnt(0) = 377.7541: insertionPnt(1) = 304.5495: insertionPnt(2) = 0
  2. Set blockRefObj = acadDoc.ModelSpace.InsertBlock(insertionPnt, "сектор-план", 1#, 1#, 1#, a1r)

Как данную строку перевести в питон?
« Последнее редактирование: 28-02-2020, 22:50:14 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 11009
  • Карма: 1396
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #256 : 28-02-2020, 22:56:03 »
DFG2020,
Приветствую на форуме!
Обрати внимание на правило форматирования кода у нас на форуме (у меня в подписи) и соблюдай его.
Что касается вопроса, то как-то так наверное:
Код - Python [Выбрать]
  1. import array
  2. import comtypes.client
  3. app = comtypes.client.GetActiveObject("AutoCAD.Application")
  4. ms = app.ActiveDocument
  5. files = r"сектор-план"
  6. insertionPnt = array.array('d', [377.7541,304.5495,0])
  7. ms.ModelSpace.InsertBlock(insertionPnt, files, 1, 1, 1, 0)
P.S.: На Python я не пишу. Этот код - результат двухминутного поиска в интернет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #257 : 28-02-2020, 23:31:28 »
Что касается вопроса, то как-то так наверное:
Получаю ошибку:
    import comtypes.client
ModuleNotFoundError: No module named 'comtypes'

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #258 : 28-02-2020, 23:36:08 »
А если использовать
import win32com.client
т.е. так:
Код - Python [Выбрать]
  1. import win32com.client
  2. import array
  3.  
  4. app = win32com.client.Dispatch("AutoCAD.Application")
  5. acadDoc = app.ActiveDocument
  6.  
  7. files = r"сектор-план"
  8. insertionPnt = array.array('d', [377.7541,304.5495,0])
  9. acadDoc.ModelSpace.InsertBlock(insertionPnt, files, 1, 1, 1, 0)

получаю ошибку:
    acadDoc.ModelSpace.InsertBlock(insertionPnt, files, 1, 1, 1, 0)
  File "<COMObject <unknown>>", line 5, in InsertBlock
pywintypes.com_error: (-2147352567, 'Ошибка.', (0, None, None, None, 0, -2147024809), None)
« Последнее редактирование: 29-02-2020, 00:24:25 от Александр Ривилис »

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #259 : 28-02-2020, 23:51:06 »
А если использовать
import win32com.client
т.е. так:
Код - Python [Выбрать]
import win32com.client
import array
 
app = win32com.client.Dispatch("AutoCAD.Application")
acadDoc = app.ActiveDocument
 
files = r"сектор-план"
insertionPnt = array.array('d', [377.7541,304.5495,0])
acadDoc.ModelSpace.InsertBlock(insertionPnt, files, 1, 1, 1, 0)

получаю ошибку:
    acadDoc.ModelSpace.InsertBlock(insertionPnt, files, 1, 1, 1, 0)
  File "<COMObject <unknown>>", line 5, in InsertBlock
pywintypes.com_error: (-2147352567, 'Ошибка.', (0, None, None, None, 0, -2147024809), None)

Нашел решение, правда сам не до конца понял, как оно работает, но оно работает!))

Код - Python [Выбрать]
  1. import win32com.client
  2. import pythoncom
  3.  
  4. def POINT(x,y,z):
  5.     return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x,y,z))
  6.  
  7. acad = win32com.client.Dispatch("AutoCAD.Application")
  8. doc = acad.ActiveDocument
  9. ms = doc.ModelSpace
  10. files = "сектор-план"
  11. doc.Utility.Prompt("hello World\n")
  12. pt1= POINT(0.0,0.0,0.0)
  13. ms.InsertBlock(pt1, files, 1.0,1.0,1.0, 0)
« Последнее редактирование: 29-02-2020, 00:25:22 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 11009
  • Карма: 1396
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #260 : 29-02-2020, 00:33:41 »
правда сам не до конца понял, как оно работает, но оно работает!
Функция POINT на основе переданных трёх чисел (x, y, z) формирует VARIANT, соответствующий массиву (VT_ARRAY) из чисел типа double (плавающие с двойной точностью VT_R8). Ну а дальше всё аналогично тому примеру, который я давал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #261 : 02-03-2020, 21:30:30 »
Спасибо, Александр!

Не смог найти кнопку Решение, подскажите, где она.

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

  • Administrator
  • *****
  • Сообщений: 11009
  • Карма: 1396
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #262 : 02-03-2020, 21:37:24 »
DFG2020,
Кнопка <<Решение>> есть только у того, кто создал тему и у Администраторов/Модераторов. Так что у вас в распоряжении только кнопочки [+].
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • Сообщений: 39
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #263 : 04-03-2020, 08:25:00 »
Существует ли способ программно определить не пользовательскую, а фактическую ширину MText? Т.е. размеры выделенной области с текстом, а не саму ширину рамки-рулетки на рисунке:


Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 507
  • Карма: 114
    • ПГСу Бложик
Re: Python & ActiveX/COM Autocad
« Ответ #264 : 04-03-2020, 09:00:11 »
В VBA, такое не сделали, а вот в .NET вроде бы есть:
MText.ActualHeight
MText.ActualWidth

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #265 : 23-03-2020, 22:34:02 »
Всем здоровья!)

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

Спасибо!

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

  • Administrator
  • *****
  • Сообщений: 11009
  • Карма: 1396
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #266 : 23-03-2020, 22:39:57 »
Всем здоровья!)

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

Спасибо!

Посмотри метод CopyObjects для копирования объектов из одного блока в другой (есть пример в этой теме). Ну а ненужное потом удалишь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #267 : 24-03-2020, 00:01:47 »
Посмотри метод CopyObjects для копирования объектов из одного блока в другой (есть пример в этой теме).
У блока нет метода CopyObjects, в примере этот метод применяется к документу и , как я понял, создается копия блока в документе, но мне нужно "перезаписать" содержимое уже существующего блока.

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

  • Administrator
  • *****
  • Сообщений: 11009
  • Карма: 1396
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #268 : 24-03-2020, 00:35:02 »
Посмотри метод CopyObjects для копирования объектов из одного блока в другой (есть пример в этой теме).
У блока нет метода CopyObjects, в примере этот метод применяется к документу и , как я понял, создается копия блока в документе, но мне нужно "перезаписать" содержимое уже существующего блока.
Ну значит ты не понял как работает этот метод. Ему нужно указать какой объект будет владельцем новых копий объектов. Вот этим владельцем и должен стать второй блок. Ну а из первого ничего удалять не нужно, так как ты собираешься удалить сам этот блок. В этом случае ты должен будешь сначала удалить все вставки (BlockReference) первого блока, а затем удалить сам блок (из таблицы Blocks)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #269 : 24-03-2020, 23:48:14 »
Ну значит ты не понял как работает этот метод. Ему нужно указать какой объект будет владельцем новых копий объектов. Вот этим владельцем и должен стать второй блок. Ну а из первого ничего удалять не нужно, так как ты собираешься удалить сам этот блок. В этом случае ты должен будешь сначала удалить все вставки (BlockReference) первого блока, а затем удалить сам блок (из таблицы Blocks)

пробую назначить владельца - блок 1, но не выходит, не тот тип данных для владельца, пробовал и первый блок перевести в массив, но тоже не тот тип данных. В примере выше есть строка: b_name = f"{o_blk.Name}_{i:02d}", это на JSON. Как это интерпретировать для питона?