Python & ActiveX/COM Autocad

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

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

Оффлайн loban_iv

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #390 : 19-02-2021, 13:15:28 »
Loft решил добавлением временных групп. Наверно несколько топорно
Может можно было через SelectSet?и смущают кириллические буквы в тексте вызываемой команды
Нет какой нибудь установки чтоб Autocad понимал латинские буквы для дополнения команд?
Код - Python [Выбрать]
  1. app = win32com.client.Dispatch("AutoCAD.Application")
  2. doc = app.ActiveDocument
  3. model = doc.ModelSpace
  4.  
  5. cds = convert_coordinates([0, 0, 0])
  6. c = model.AddCircle(cds, 500)
  7. cds = convert_coordinates([0, 0, 300])
  8. c1 = model.AddCircle(cds, 250)
  9.  
  10. g = doc.Groups.Add("1")
  11. g1 = doc.Groups.Add("2")
  12.  
  13. g.AppendItems(win32com.client.VARIANT(VT_ARRAY | VT_DISPATCH, [c]))
  14. g1.AppendItems(win32com.client.VARIANT(VT_ARRAY | VT_DISPATCH, [c1]))
  15.  
  16. doc.SendCommand("_LOFT Г " + g.Name + "\n" + "Г " + g1.Name + "\n" + "Ж" + "\n" + "Т" + "\n\n\n")
  17.  
  18. g.Delete()
  19. g1.Delete()

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

  • Administrator
  • *****
  • Сообщений: 12750
  • Карма: 1647
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #391 : 19-02-2021, 16:11:12 »
Нет какой нибудь установки чтоб Autocad понимал латинские буквы для дополнения команд?

Это не дополнительные команды, а опции команд. И можно (так же, как и для команд) использовать их глобальные имена - английские с подчеркиванием спереди.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 12750
  • Карма: 1647
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #392 : 19-02-2021, 16:12:27 »
Вроде бы я не прав и все объекты продолжают строится относительно глобальной системы координат. Это так?
Да.
Если нет, мое решение - трансформировать все объекты матрицей 4х4?
Да.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн loban_iv

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #393 : 19-02-2021, 21:05:41 »
Александр, а нет мыслей по поводу как передать матрицу4х4 в TransformBy?
4х компонентный массив 4х компонентных массивов

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

  • Administrator
  • *****
  • Сообщений: 12750
  • Карма: 1647
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #394 : 19-02-2021, 21:20:12 »
loban_iv,
Как в Python - понятия не имею. На VBA есть пример в документации. Вообще же эта матрица должна быть VARIANT.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 12750
  • Карма: 1647
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #395 : 19-02-2021, 21:33:58 »
Подозреваю, что через Utility.CreateTypedArray(matrix, vbDouble, [16 плавающих чисел, образующих матрицу 4x4])
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Marik

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #396 : 15-06-2021, 00:48:31 »
Господа, подскажите! Читал, читал тему...в голове каша. Подскажите как начертить полилинию? Можно код? Что нужно вставить в AddLightweightPolyline?

Код:
Код - Python [Выбрать]
  1. import win32com.client
  2. from pythoncom import  VT_R8, VT_ARRAY, VT_DISPATCH, VT_VARIANT
  3.  
  4. appAutocad = win32com.client.GetActiveObject("AutoCAD.Application")
  5. aDoc = appAutocad.ActiveDocument
  6. mSp = aDoc.ModelSpace
  7.  
  8. def acadcoord(x,y,z): # преобразование координат
  9.     return win32com.client.VARIANT(VT_ARRAY | VT_R8, [x, y, z])
  10.  
  11. mSp.AddLightweightPolyline(??????)

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 8
Re: Python & ActiveX/COM Autocad
« Ответ #397 : 15-06-2021, 08:19:12 »
Господа, подскажите! Читал, читал тему...в голове каша. Подскажите как начертить полилинию? Можно код? Что нужно вставить в AddLightweightPolyline?

Код:
Код - Python [Выбрать]
  1. import win32com.client
  2. from pythoncom import  VT_R8, VT_ARRAY, VT_DISPATCH, VT_VARIANT
  3.  
  4. appAutocad = win32com.client.GetActiveObject("AutoCAD.Application")
  5. aDoc = appAutocad.ActiveDocument
  6. mSp = aDoc.ModelSpace
  7.  
  8. def acadcoord(x,y,z): # преобразование координат
  9.     return win32com.client.VARIANT(VT_ARRAY | VT_R8, [x, y, z])
  10.  
  11. mSp.AddLightweightPolyline(??????)

Примерно так:

Код - Python [Выбрать]
  1. import win32com.client
  2. from pythoncom import  VT_R8, VT_ARRAY, VT_DISPATCH, VT_VARIANT
  3.  
  4. appAutocad = win32com.client.GetActiveObject("AutoCAD.Application")
  5. aDoc = appAutocad.ActiveDocument
  6. mSp = aDoc.ModelSpace
  7.  
  8. def acadcoord(*args): # преобразование координат
  9.     if isinstance(args[0], (list, tuple)):
  10.         coords = [item for item in args[0]]
  11.     else:
  12.         coords = args
  13.     return win32com.client.VARIANT(VT_ARRAY | VT_R8, coords)
  14.  
  15.  
  16. line_coords = [0, 0, 300, 100]  # В списке или в кортеже передаешь координаты точек x, y вершин полилинии
  17.  
  18. if __name__=='__main__':
  19.     mSp.AddLightweightPolyline(acadcoord(line_coords))
  20.  
« Последнее редактирование: 15-06-2021, 10:51:12 от Electric »

Оффлайн Marik

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #398 : 15-06-2021, 09:27:56 »
Спасибо! Работает!

Оффлайн Aleks_199513

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #399 : 08-07-2021, 09:33:21 »
Добрый день. Подскажите как вставить блок в таблицу? пробовал метод tab.SetBlockTableRecordId2(1,1,1928560679024,True) выдает ошибку. И как можно найти ID блока? ObjectID не срабатывает

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

  • Administrator
  • *****
  • Сообщений: 12750
  • Карма: 1647
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #400 : 08-07-2021, 12:09:52 »
И как можно найти ID блока? ObjectID не срабатывает
Что значит не срабатывает?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Aleks_199513

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #401 : 08-07-2021, 14:53:14 »
И как можно найти ID блока? ObjectID не срабатывает
Что значит не срабатывает?
Пишет, что у объекта нет ID.

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

  • Administrator
  • *****
  • Сообщений: 12750
  • Карма: 1647
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #402 : 08-07-2021, 15:03:01 »
Пишет, что у объекта нет ID.
Покажи код и сообщение об ошибке.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Aleks_199513

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #403 : 08-07-2021, 15:20:36 »
Пишет, что у объекта нет ID.
Покажи код и сообщение об ошибке.
Код - Python [Выбрать]
  1. import clr
  2. import System
  3. from System import Array
  4. # Add Assemblies for AutoCAD and Civil3D
  5. clr.AddReference('AcMgd')
  6. clr.AddReference('AcCoreMgd')
  7. clr.AddReference('AcDbMgd')
  8. clr.AddReference('AecBaseMgd')
  9. clr.AddReference('AecPropDataMgd')
  10. clr.AddReference('AeccDbMgd')
  11. import Autodesk
  12.  
  13.  
  14.  
  15. app = System.Runtime.InteropServices.Marshal.GetActiveObject("Autocad.Application.24")
  16. aDoc = app.ActiveDocument
  17. mSp = aDoc.PaperSpace
  18.  
  19.  
  20. tname = IN[0]
  21. bb = IN[1]
  22.  
  23. tab = None
  24. for i in mSp:
  25.         if i.EntityName == 'AcDbTable':
  26.                 if i.GetCellValue(0, 0) == tname:
  27.                         tab = i
  28.  
  29. lenght = 1
  30. r= bb.ObjectID
  31.  
  32. #k=tab.SetBlockTableRecordId(1,1,1928560679024,True)
  33. OUT = r

« Последнее редактирование: 08-07-2021, 15:21:40 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 12750
  • Карма: 1647
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #404 : 08-07-2021, 15:25:56 »
Что в IN[0] и в IN[1]? То что у Block есть свойство ObjectID - это 100%.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение