Python & ActiveX/COM Autocad

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

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

Оффлайн vxv

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #465 : 25-10-2021, 23:57:36 »
Спасибо, большое. Заработало, стоило было чуть подправить под себя, а именно, вдруг кто не знает:

Код - Python [Выбрать]
  1. import win32com.client
  2. from pythoncom import VT_ARRAY, VT_R8, VT_DISPATCH
  3. acad = win32com.client.Dispatch("AutoCAD.Application")
  4. doc = acad.ActiveDocument
  5.  
  6. try:
  7.     doc.Blocks.Item("Blo_STSM")
  8. except:
  9.     creatBlock_STSM() #функция создания блока

Оффлайн vxv

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #466 : 26-10-2021, 23:47:35 »
Доброго времени суток, не пойму почему не загружается тип линии по следующему коду:
Код - Python [Выбрать]
  1. import win32com.client
  2. acad = win32com.client.Dispatch("AutoCAD.Application")
  3. doc = acad.ActiveDocument
  4. acCurDb = doc.Database
  5. acCurDb.LoadLineTypeFile('ограждение1', 'acadiso.lin')

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

  • Administrator
  • *****
  • Сообщений: 13197
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #467 : 26-10-2021, 23:52:07 »
vxv,
Наверное потому, что метода LoadLineTypeFile нет у Database.
Зато есть метод Load (пример из документации):
Код - Visual Basic [Выбрать]
  1. Sub Example_Load()
  2.     ' This example attempts to load the linetype "CENTER" from
  3.    ' the acad.lin file. If the linetype already exists, then
  4.    ' a message is displayed.
  5.    
  6.     Dim linetypeName As String
  7.     linetypeName = "CENTER"
  8.    
  9.     ' Load "CENTER" line type from acad.lin file
  10.    On Error Resume Next    ' trap any load errors
  11.    ThisDrawing.Linetypes.Load linetypeName, "acad.lin"
  12.    
  13.     ' If the name already exists, then notify user
  14.    If Err.Description = "Duplicate record name" Then
  15.         MsgBox "A line type named '" & linetypeName & "' already exists.", , "Load Example"
  16.     End If
  17.    
  18. End Sub
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн vxv

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #468 : 27-10-2021, 06:22:32 »
Спасибо за наводку. Заработало. Вот что получилось:
Код - Python [Выбрать]
  1. import win32com.client
  2. acad = win32com.client.Dispatch("AutoCAD.Application")
  3. doc = acad.ActiveDocument
  4. try:
  5.     doc.Linetypes.Load('ограждение1', 'acadiso.lin')
  6. except:
  7.     pass

Оффлайн vxv

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #469 : 28-10-2021, 16:23:17 »
Доброго времени суток, подскажите пожалуйста, почему не получается создать символ стрелки стиля выноски методом object.ArrowSymbol

Код - Python [Выбрать]
  1. acad = win32com.client.Dispatch("AutoCAD.Application")
  2. doc = acad.ActiveDocument
  3. Dictionary = doc.Dictionaries.Item("ACAD_MLEADERSTYLE")
  4. NewStyle = Dictionary.AddObject("NewStyle", "AcDbMLeaderStyle")
  5. NewStyle.ArrowSymbol =  "_Dot"

А выдает следующую ошибку:
 self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value)pywintypes.com_error: (-2147352567, 'Ошибка.', (0, 'AutoCAD.Application', 'Ключ не найден', 'C:\\Program Files\\Autodesk\\AutoCAD 2017\\HELP\\OLE_ERR.CHM', -2145386476, -2145386476), None)

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: Python & ActiveX/COM Autocad
« Ответ #470 : 28-10-2021, 16:26:05 »
Сначала надо установить системную переменную DIMBLK, а потом уже назначать ArrowSymbol. Естественно, не забыв вернуть DIMBLK обратно.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн vxv

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #471 : 28-10-2021, 16:27:48 »
Сначала надо установить системную переменную DIMBLK, а потом уже назначать ArrowSymbol. Естественно, не забыв вернуть DIMBLK обратно.
Разобрался, спасибо большое. Вот так будет выглядеть код:

Код - Python [Выбрать]
  1. acad = win32com.client.Dispatch("AutoCAD.Application")
  2. doc = acad.ActiveDocument
  3. Dictionary = doc.Dictionaries.Item("ACAD_MLEADERSTYLE")
  4. NewStyle = Dictionary.AddObject("NewStyle", "AcDbMLeaderStyle")
  5. doc.SetVariable('DIMBLK', "_Dot")
  6. NewStyle.ArrowSymbol =  "_Dot"
  7. doc.SetVariable('DIMBLK', ".")
« Последнее редактирование: 28-10-2021, 17:12:30 от vxv »

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

  • Administrator
  • *****
  • Сообщений: 13197
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #472 : 28-10-2021, 18:22:32 »
vxv,
Очень желательно эту системную переменную вернуть в исходное состояние (как и практически любую другую системную переменную).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Aleks_199513

  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #473 : 29-10-2021, 09:30:11 »
Доброго времени суток, Может кто-нибудь знает как получить доступ к именам блоков которые входят в состав многовидового блока?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: Python & ActiveX/COM Autocad
« Ответ #474 : 29-10-2021, 09:40:57 »
Многовидовой блок - это же вроде что-то из вертикалок типа AA / MEP ?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13197
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #475 : 29-10-2021, 14:27:28 »
Доброго времени суток, Может кто-нибудь знает как получить доступ к именам блоков которые входят в состав многовидового блока?
Нашел такое в документации. Попробуй адаптировать:

Код - Visual Basic [Выбрать]
  1. Sub Example_Name_AecViewBlocks()
  2.  
  3. 'This example shows the number of colors of the owner of the Viewblock collection
  4.  
  5.     Dim obj As Object
  6.     Dim pt As Variant
  7.     Dim blockRef As AecMVBlockRef
  8.     Dim viewBlocks As AecViewBlocks
  9.    
  10.     ThisDrawing.Utility.GetEntity obj, pt, "Select a Multiview Block"
  11.     If TypeOf obj Is AecMVBlockRef Then
  12.         Set blockRef = obj
  13.         Set viewBlocks = blockRef.viewBlocks
  14.         MsgBox "Colors of MVBlockRef Owner: " & viewBlocks.MVBlockRef.Color, vbInformation, "MVBlockRef Example"
  15.     Else
  16.         MsgBox "Not a Multiview Block", vbInformation, "MVBlockRef Example"
  17.     End If
  18.  
  19. End Sub
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн vxv

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #476 : 11-11-2021, 21:24:56 »
Здравствуйте, кто-нибудь работал с СПДС GraphiCS от Csoft? В нем присутствует такой элемент как "Формат". Нужно как то добраться до значения всех атрибутов основной надписи или штампа по простому и прочитать значения всех ячеек из него.

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

  • Administrator
  • *****
  • Сообщений: 13197
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #477 : 11-11-2021, 21:48:27 »
Здравствуйте, кто-нибудь работал с СПДС GraphiCS от Csoft? В нем присутствует такой элемент как "Формат". Нужно как то добраться до значения всех атрибутов основной надписи или штампа по простому и прочитать значения всех ячеек из него.
Код - Auto/Visual Lisp [Выбрать]
  1. (progn
  2.  (vl-load-com)
  3.  (vlax-dump-object (vlax-ename->vla-object (car (entsel))))
  4. )
Если это что-то полезное даст в командной строке AutoCAD, то это полезное ты сможешь получить и в Python.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Marik

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #478 : 14-01-2022, 22:13:40 »
Подскажите, пожалуйста. Пытаюсь загрузить внешнюю ссылку в открытый файл dwg. Программа выдает такую ошибку:
"File "<COMObject <unknown>>", line 5, in AttachExternalReference
pywintypes.com_error: (-2147352567, 'Ошибка.', (0, 'AutoCAD.Application', 'Ошибка при доступе к файлу', 'C:\\Program Files\\Autodesk\\AutoCAD 2016\\HELP\\OLE_ERR.CHM', -2145386426, -2145386426), None)".
Что делаю не так? Вот код:

Код - 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. mSp.AttachExternalReference("G:\Python\d1020ntr.dwg","Xref01",acadcoord(0, 0, 0),1,1,1,0,False)

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

  • Administrator
  • *****
  • Сообщений: 13197
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #479 : 14-01-2022, 22:40:48 »
Marik,
А разве не так должно быть:
Код - Python [Выбрать]
  1. mSp.AttachExternalReference("G:\\Python\\d1020ntr.dwg","Xref01",acadcoord(0, 0, 0),1,1,1,0,False)
?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение