Python & ActiveX/COM Autocad

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

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

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #315 : 27-04-2020, 00:18:46 »
Так это же ошибка синтаксиса, а не типа данных.
Ох, да , не отметил, что в питоне нужно добавлять скобки!

Спасибо!

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #316 : 30-04-2020, 16:28:05 »
Возможно я задавал этот вопрос раньше, точно не помню. В AutoCAD последних версий есть полезная возможность импортировать геометрию PDF документов, как раз появилась необходимость автоматизировать этот процесс. Существует ли какая-нибудь возможность через COM работать с этой новой функцией распознавания геометрии? Или COM слишком стар для этого?

Единственное, что я нашел, это возможность через текстовую строку отправить  команду AcadDocument.SendCommand("_-ПДФИМПОРТ "), но далее возникают проблемы с  аргументами. На запрос "Выберите подложку PDF или <Файл>" я могу отправить Ф и AutoCAD тут  же открывает графическое окно выбора файла. Если ли способ передать путь к этому файлу в виде текстовой строки вроде "F:\\target.pdf" в обход графического меню?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #317 : 30-04-2020, 17:32:08 »
Существует ли какая-нибудь возможность через COM работать с этой новой функцией распознавания геометрии?
Нет.
Единственное, что я нашел, это возможность через текстовую строку отправить  команду AcadDocument.SendCommand("_-ПДФИМПОРТ ")
Нужно послать такое lisp-выражение в качестве строки:
Код - Auto/Visual Lisp [Выбрать]
  1. (command "_-pdfimport" "_f" "C:/test.pdf" "1" "0,0" "1" "0")
Не забудь:
1) двойные кавычки следует сдублировать;
2) после закрывающейся круглой скобки нужен еще один пробел;
3) "C:/test.pdf" - полный путь к pdf-файлу и обратные слеши заменяем на прямые;
4) первая "1" в команде - номер страницы из pdf-файла;
5) "0,0" - точка вставки страницы;
6) вторая "1" - масштабный коэффициент;
7) "0" - угол поворота.
Наверное это будет как-то так:

Код - Python [Выбрать]
  1. AcadDocument.SendCommand('(command "_-pdfimport" "_f" "C:/test.pdf" "1" "0,0" "1" "0") ')
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #318 : 30-04-2020, 18:33:42 »
AcadDocument.SendCommand('(command "_-pdfimport" "_f" "C:/test.pdf" "1" "0,0" "1" "0") ')

Спасибо, это то, что нужно!
А если бы, чисто теоретически, мне потребовалось бы применить больше настроек ("Данные PDF для импорта", "Слои", "Параметры импорта"), то эти настройки так же следовало бы вписывать в эту текстовую команду? Есть ли документация на подобные lisp команды?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #319 : 30-04-2020, 18:46:49 »
А если бы, чисто теоретически, мне потребовалось бы применить больше настроек ("Данные PDF для импорта", "Слои", "Параметры импорта"), то эти настройки так же следовало бы вписывать в эту текстовую команду?
Думаю, что это через системные переменные:


Есть ли документация на подобные lisp команды?
На какие команды?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #320 : 01-05-2020, 10:39:29 »
Есть ли документация на подобные lisp команды?
На какие команды?

Все, я разобрался. Вопрос снят. Спасибо!

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #321 : 06-05-2020, 22:31:49 »
Всем добра!

Подскажите, как воспользоваться командой ВСТСПЕЦ через COM? Т.е. у меня есть скопированный диапазон ячеек в excel, как его вставить питоном в автокад, используя команду ВСТСПЕЦ/Объекты AutoCad?                  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #322 : 06-05-2020, 22:38:57 »
Эту команду нельзя запустить в режиме командной строки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #323 : 06-05-2020, 22:42:03 »
Эту команду нельзя запустить в режиме командной строки.
Можно каким-то другим способом вставить таблицу эксел как объект автокад питоном?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #324 : 06-05-2020, 22:58:16 »
Если на Python можно прочитать excel-файл, то на основе его можно создать таблицу в AutoCAD. Подозреваю, что если это даже и возможно, то очень не просто.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #325 : 07-05-2020, 04:31:44 »
Если на Python можно прочитать excel-файл, то на основе его можно создать таблицу в AutoCAD. Подозреваю, что если это даже и возможно, то очень не просто.

Я так кстати и делал недавно. Питоновская библиотека openpyxl +  создание таблицы по полученным данным через COM.

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #326 : 08-05-2020, 18:03:23 »
Я так кстати и делал недавно.
Electric, прошу выслать данные наработки, если сохранились.

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #327 : 08-05-2020, 20:57:51 »
Electric, прошу выслать данные наработки, если сохранились.

Минимальный пример без повтора объединения ячеек, считывания по диапазону и т.д.

Код - Python [Выбрать]
  1. from openpyxl import load_workbook
  2. import win32com.client
  3.  
  4. def readFromExcelFile(filename, page_name):
  5.     ''' Функция чтения Excel файла
  6.    filename - полный путь к файлу xlsx
  7.    page_name - название листа в документе    
  8.    '''
  9.     wb = load_workbook(filename, data_only=True)
  10.     sheet = wb[page_name]
  11.  
  12.     # Номер максимальной строки и столбца с данными на листе
  13.     row_count = sheet.max_row
  14.     column_count = sheet.max_column
  15.  
  16.     # Считывание текстовых данных по ячейкам, нумерация начинается c 1
  17.     data = [[sheet.cell(row=row_num, column=col_num).value for col_num in range(1, column_count+1)] for row_num in range(1, row_count+1)]
  18.     return data
  19.  
  20.  
  21. def writeAcadTable(data):
  22.     ''' Функция записи таблицы в Autocad '''
  23.  
  24.     app = win32com.client.Dispatch("AutoCAD.Application")    
  25.     aDoc = app.ActiveDocument
  26.     mSp = aDoc.ModelSpace
  27.  
  28.     # Число строк и столбцов в таблице
  29.     row_count = len(data)    
  30.     column_count = len(data[0])
  31.  
  32.     insertion_point = aDoc.Utility.GetPoint(convert_coordinates(0, 0, 0), 'Укажите точку вставки в пространстве  модели: ')
  33.     table = mSp.AddTable(convert_coordinates(insertion_point), row_count, column_count, 10, 30)
  34.     table.UnmergeCells(0, 0, 0, column_count-1)
  35.  
  36.     # Заполнение таблицы AutoCAD текстовыми данными
  37.     for i in range(row_count):        
  38.         for j in range(column_count):            
  39.             if data[i][j]:                
  40.                 table.SetText(i, j, data[i][j])
  41.  
  42. if __name__=='__main__':
  43.     data = readFromExcelFile('C:\\test.xlsx', 'Лист1')
  44.     writeAcadTable(data)
  45.  
  46.  

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

Код - Python [Выбрать]
  1. sheet = wb.worksheets[0]

В функции записи writeAcadTable  функция "convert_coordinates" - взята из начала темы.

Оффлайн DFG2020

  • ADN OPEN
  • Сообщений: 34
  • Карма: 1
Re: Python & ActiveX/COM Autocad
« Ответ #328 : 12-05-2020, 22:24:26 »
Electric, спасибо!!!

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 10
Re: Python & ActiveX/COM Autocad
« Ответ #329 : 24-05-2020, 17:59:15 »
Заметил странное поведение при попытке установить выравнивание ячеек таблицы.
Есть таблица AutoCAD  5 строк, 4 столбца, выравнивание во всех ячейках  по умолчанию стоит "середина по центру".
Если я хочу назначить выравнивание "4" (середина влево) для строки с индексом "2" я пишу  "-1" в  качестве  индекса столбца:

Код - Python [Выбрать]
  1. table.SetCellAlignment(2, -1, 4)

и тогда по всей строке 2 выравнивание становится серединой влево.
Но если я пытаюсь применить подобный трюк с колонкой, а именно назначить всем ячейкам в  колонке с индексом 2 такое  выравнивание:

Код - Python [Выбрать]
  1. table.SetCellAlignment(-1, 2, 4)

у меня ничего не происходит. Что я делаю не так?