Python & ActiveX/COM Autocad

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

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

Оффлайн Aleks_199513

  • ADN OPEN
  • Сообщений: 21
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #435 : 05-08-2021, 13:50:00 »
Не видя Ваш код - никак
Код - Python [Выбрать]
  1. import System
  2. import clr
  3. # Add Assemblies for AutoCAD and Civil3D
  4. #LinkDWG Core DYF by Koz Jono YEOH
  5. #kozmosovia@hotmail.com
  6. #Copyright(C) 1994-2020 KozMos Inc.
  7. #Copyright(C) 2011-2020 Neila Heaven Networks
  8. #Copyright(C) 2017-2020 Tachyon Intelligent Design Institute
  9. clr.AddReference('AcMgd')
  10. clr.AddReference('AcCoreMgd')
  11. clr.AddReference('AcDbMgd')
  12. clr.AddReference('AecBaseMgd')
  13. clr.AddReference('AecPropDataMgd')
  14. clr.AddReference('AeccDbMgd')
  15. clr.AddReference('ProtoGeometry')
  16.  
  17. from Autodesk.AutoCAD.Runtime import *
  18. from Autodesk.AutoCAD.ApplicationServices import *
  19. from Autodesk.AutoCAD.EditorInput import *
  20. from Autodesk.AutoCAD.DatabaseServices import *
  21. from Autodesk.AutoCAD.Geometry import *
  22.  
  23. # Import references from Civil3D
  24. from Autodesk.Civil.ApplicationServices import *
  25. from Autodesk.Civil.DatabaseServices import *
  26.  
  27. marsh = System.Runtime.InteropServices.Marshal
  28. app = marsh.GetActiveObject("Autocad.Application.24.1")
  29. aDoc = app.ActiveDocument
  30. mSp = aDoc.ModelSpace
  31. adoc = Application.DocumentManager.MdiActiveDocument
  32.  
  33. def ptA(p,x1,y1):
  34.         return System.Array[float]([p.X,p.Y,p.Z,p.X+x1,p.Y+y1,p.Z])
  35.  
  36. x1 = 5
  37. y1 = 5
  38. blockItem = None
  39. # Координаты блоков
  40. listOfPoints = IN[0]
  41. numbeTable= IN[1]
  42. Coord=[]
  43. logFile = []
  44.  
  45. import Autodesk
  46. outList = []
  47.  
  48. with adoc.LockDocument():
  49.     with adoc.Database as db:
  50.         with db.TransactionManager.StartTransaction() as t:
  51.             # Place your code below
  52.                         for i in listOfPoints:    
  53.                                 bufferOut = []
  54.                                 locOrigin = i.Origin
  55.                                 points = ptA(locOrigin,x1,y1)
  56.                                 lead = mSp.AddMLeader(points, 0)
  57.                                 bufferOut.append(lead)
  58.                                 leaderBlocks = aDoc.Blocks(lead.ContentBlockName)
  59.                                
  60.                                 if lead and hasattr(lead,"ObjectName") and lead.ObjectName=="AcDbMLeader":
  61.                                         blocks=lead.Document.Blocks.Item(lead.ContentBlockName)
  62.                                         for block in blocks:
  63.                                                 if block.ObjectName == "AcDbAttributeDefinition" and block.TagString.upper() == "НОМЕРЯРЛЫКА".upper():
  64.                                                         lead.SetBlockAttributeValue(block.ObjectId, str(numbeTable[listOfPoints.index(i)]))
  65.                                                        
  66.                                                        
  67.                                 blockItem = block
  68.             # Commit before end transaction
  69.                         t.Commit()
  70.  
  71. #lead.TextString = str(numbeTable[listOfPoints.index(i)])
  72. #ID_Name1 = (aDoc.Blocks("_TagCircle").ObjectID)
  73. #lead1= mSp.SetBlockAttributeValue(lead.ObjectID,)
  74. #lead.GetBlockAttributeValue(ID_Name1)
  75. #coord.append(points)
  76. outList = []
  77. OUT = blockItem
« Последнее редактирование: 05-08-2021, 14:58:05 от Александр Ривилис »

Оффлайн Nutson

  • ADN OPEN
  • Сообщений: 44
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #436 : 05-08-2021, 14:08:01 »
Интересное поведение. Даже если при создании мульти выноски я указываю
Код - Visual Basic [Выбрать]
  1.              MleaderObj.BlockConnectionType = acConnectBase
  2.  
  3.  
Выноска создается с значением acConnectExtents.

Попробуйте после создания пошевелить это свойство выноски. Может отдельной транзакцией или регеня чертеж.
В моем случае даже так не помогло. Зато ручкой у выноски меняешь расположение блока и он сразу подтягивается к выноске
Код - Visual Basic [Выбрать]
  1.              MleaderObj.BlockConnectionType = acConnectExtents
  2.              MleaderObj.Update
  3.              MleaderObj.BlockConnectionType = acConnectBase
  4.  

Оффлайн Nutson

  • ADN OPEN
  • Сообщений: 44
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #437 : 05-08-2021, 14:09:28 »
Интересное поведение. Даже если при создании мульти выноски я указываю
Код - Visual Basic [Выбрать]
  1.              MleaderObj.BlockConnectionType = acConnectBase
  2.  
  3.  
Выноска создается с значением acConnectExtents.

Попробуйте после создания пошевелить это свойство выноски. Может отдельной транзакцией или регеня чертеж.
В моем случае даже так не помогло. Зато ручкой у выноски меняешь расположение блока и он сразу подтягивается к выноске
Код - Visual Basic [Выбрать]
  1.              MleaderObj.BlockConnectionType = acConnectExtents
  2.              MleaderObj.Update
  3.              MleaderObj.BlockConnectionType = acConnectBase
  4.  

забыл , если что значения констант:
acConnectBase=1
acConnectExtents=0

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #438 : 05-08-2021, 15:04:52 »
Aleks_199513,
Не забывайте про правило форматирования кода на форуме (у меня в подписи)!
Код - какая-то дикая смесь AutoCAD COM/ActiveX и AutoCAD .NET API
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Aleks_199513

  • ADN OPEN
  • Сообщений: 21
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #439 : 05-08-2021, 15:50:17 »
Aleks_199513,
Не забывайте про правило форматирования кода на форуме (у меня в подписи)!
Код - какая-то дикая смесь AutoCAD COM/ActiveX и AutoCAD .NET API
Извините.

Оффлайн Aleks_199513

  • ADN OPEN
  • Сообщений: 21
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #440 : 05-08-2021, 15:51:14 »
забыл , если что значения констант:
acConnectBase=1
acConnectExtents=0
нет, к сожалению ничего не получилось. А может есть какой-то способ переместить блок?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #441 : 05-08-2021, 16:08:36 »
Aleks_199513,
Не увидел в коде назначения ContentBlockName и ContentBlockType
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Nutson

  • ADN OPEN
  • Сообщений: 44
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #442 : 05-08-2021, 16:10:39 »
Я сейчас перепроверил, все работает оказывается. Не заметил On error goto exit , код спотыкался об мою попытку настроить свойства текста выноски.
Так как в выноске блок вместо текста, код выходил из процедуры не доходя до настройки MleaderObj.BlockConnectionType = acConnectExtents.
Так что проверяйте код на ошибки, в цитировании помечу вероятные места

попытался выделить цветом в код блоке -не срабатывает.
строки с моими комментариям:
58, 61, 62, 63 (ошибка тут скорее всего) , 67


Не видя Ваш код - никак
Код - Python [Выбрать]
  1. import System
  2. import clr
  3. # Add Assemblies for AutoCAD and Civil3D
  4. #LinkDWG Core DYF by Koz Jono YEOH
  5. #kozmosovia@hotmail.com
  6. #Copyright(C) 1994-2020 KozMos Inc.
  7. #Copyright(C) 2011-2020 Neila Heaven Networks
  8. #Copyright(C) 2017-2020 Tachyon Intelligent Design Institute
  9. clr.AddReference('AcMgd')
  10. clr.AddReference('AcCoreMgd')
  11. clr.AddReference('AcDbMgd')
  12. clr.AddReference('AecBaseMgd')
  13. clr.AddReference('AecPropDataMgd')
  14. clr.AddReference('AeccDbMgd')
  15. clr.AddReference('ProtoGeometry')
  16.  
  17. from Autodesk.AutoCAD.Runtime import *
  18. from Autodesk.AutoCAD.ApplicationServices import *
  19. from Autodesk.AutoCAD.EditorInput import *
  20. from Autodesk.AutoCAD.DatabaseServices import *
  21. from Autodesk.AutoCAD.Geometry import *
  22.  
  23. # Import references from Civil3D
  24. from Autodesk.Civil.ApplicationServices import *
  25. from Autodesk.Civil.DatabaseServices import *
  26.  
  27. marsh = System.Runtime.InteropServices.Marshal
  28. app = marsh.GetActiveObject("Autocad.Application.24.1")
  29. aDoc = app.ActiveDocument
  30. mSp = aDoc.ModelSpace
  31. adoc = Application.DocumentManager.MdiActiveDocument
  32.  
  33. def ptA(p,x1,y1):
  34.         return System.Array[float]([p.X,p.Y,p.Z,p.X+x1,p.Y+y1,p.Z])
  35.  
  36. x1 = 5
  37. y1 = 5
  38. blockItem = None
  39. # Координаты блоков
  40. listOfPoints = IN[0]
  41. numbeTable= IN[1]
  42. Coord=[]
  43. logFile = []
  44.  
  45. import Autodesk
  46. outList = []
  47.  
  48. with adoc.LockDocument():
  49.     with adoc.Database as db:
  50.         with db.TransactionManager.StartTransaction() as t:
  51.             # Place your code below
  52.                         for i in listOfPoints:    
  53.                                 bufferOut = []
  54.                                 locOrigin = i.Origin
  55.                                 points = ptA(locOrigin,x1,y1)
  56.                                 lead = mSp.AddMLeader(points, 0)
  57.                                 bufferOut.append(lead)
  58.                                 leaderBlocks = aDoc.Blocks(lead.ContentBlockName)  [color=red] [u]Вот эта строка повторяется тремя строками ниже[/u][/color]
  59.                                
  60.                                 if lead and hasattr(lead,"ObjectName") and lead.ObjectName=="AcDbMLeader":
  61.                                         blocks=lead.Document.Blocks.Item(lead.ContentBlockName)  [color=red] здесь[/color]
  62.                                         for block in blocks:  // здесь block по факту это acadEntity, то есть элементы из которых состоит определение блока
  63.                                                 if block.ObjectName == "AcDbAttributeDefinition" and block.TagString.upper() == "НОМЕРЯРЛЫКА".upper():  [color=red]   block.TagString.upper() == "НОМЕРЯРЛЫКА".upper()  - вот тут скорее всего спотыкается код. Так как ентити может быть линией и у нее нет такого свойства[/color]
  64.                                                         lead.SetBlockAttributeValue(block.ObjectId, str(numbeTable[listOfPoints.index(i)]))
  65.                                                        
  66.                                                        
  67.                                 blockItem = block[color=red]  ну это тоже не то пальто[/color]
  68.             # Commit before end transaction
  69.                         t.Commit()
  70.  
  71. #lead.TextString = str(numbeTable[listOfPoints.index(i)])
  72. #ID_Name1 = (aDoc.Blocks("_TagCircle").ObjectID)
  73. #lead1= mSp.SetBlockAttributeValue(lead.ObjectID,)
  74. #lead.GetBlockAttributeValue(ID_Name1)
  75. #coord.append(points)
  76. outList = []
  77. OUT = blockItem

Оффлайн Aleks_199513

  • ADN OPEN
  • Сообщений: 21
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #443 : 05-08-2021, 16:21:55 »
Я сейчас перепроверил, все работает оказывается. Не заметил On error goto exit , код спотыкался об мою попытку настроить свойства текста выноски.
Так как в выноске блок вместо текста, код выходил из процедуры не доходя до настройки MleaderObj.BlockConnectionType = acConnectExtents.
Так что проверяйте код на ошибки, в цитировании помечу вероятные места

попытался выделить цветом в код блоке -не срабатывает.
строки с моими комментариям:
58, 61, 62, 63 (ошибка тут скорее всего) , 67



Не видя Ваш код - никак
Код - Python [Выбрать]
  1. import System
  2. import clr
  3. # Add Assemblies for AutoCAD and Civil3D
  4. #LinkDWG Core DYF by Koz Jono YEOH
  5. #kozmosovia@hotmail.com
  6. #Copyright(C) 1994-2020 KozMos Inc.
  7. #Copyright(C) 2011-2020 Neila Heaven Networks
  8. #Copyright(C) 2017-2020 Tachyon Intelligent Design Institute
  9. clr.AddReference('AcMgd')
  10. clr.AddReference('AcCoreMgd')
  11. clr.AddReference('AcDbMgd')
  12. clr.AddReference('AecBaseMgd')
  13. clr.AddReference('AecPropDataMgd')
  14. clr.AddReference('AeccDbMgd')
  15. clr.AddReference('ProtoGeometry')
  16.  
  17. from Autodesk.AutoCAD.Runtime import *
  18. from Autodesk.AutoCAD.ApplicationServices import *
  19. from Autodesk.AutoCAD.EditorInput import *
  20. from Autodesk.AutoCAD.DatabaseServices import *
  21. from Autodesk.AutoCAD.Geometry import *
  22.  
  23. # Import references from Civil3D
  24. from Autodesk.Civil.ApplicationServices import *
  25. from Autodesk.Civil.DatabaseServices import *
  26.  
  27. marsh = System.Runtime.InteropServices.Marshal
  28. app = marsh.GetActiveObject("Autocad.Application.24.1")
  29. aDoc = app.ActiveDocument
  30. mSp = aDoc.ModelSpace
  31. adoc = Application.DocumentManager.MdiActiveDocument
  32.  
  33. def ptA(p,x1,y1):
  34.         return System.Array[float]([p.X,p.Y,p.Z,p.X+x1,p.Y+y1,p.Z])
  35.  
  36. x1 = 5
  37. y1 = 5
  38. blockItem = None
  39. # Координаты блоков
  40. listOfPoints = IN[0]
  41. numbeTable= IN[1]
  42. Coord=[]
  43. logFile = []
  44.  
  45. import Autodesk
  46. outList = []
  47.  
  48. with adoc.LockDocument():
  49.     with adoc.Database as db:
  50.         with db.TransactionManager.StartTransaction() as t:
  51.             # Place your code below
  52.                         for i in listOfPoints:    
  53.                                 bufferOut = []
  54.                                 locOrigin = i.Origin
  55.                                 points = ptA(locOrigin,x1,y1)
  56.                                 lead = mSp.AddMLeader(points, 0)
  57.                                 bufferOut.append(lead)
  58.                                 leaderBlocks = aDoc.Blocks(lead.ContentBlockName)  [color=red] [u]Вот эта строка повторяется тремя строками ниже[/u][/color]
  59.                                
  60.                                 if lead and hasattr(lead,"ObjectName") and lead.ObjectName=="AcDbMLeader":
  61.                                         blocks=lead.Document.Blocks.Item(lead.ContentBlockName)  [color=red] здесь[/color]
  62.                                         for block in blocks:  // здесь block по факту это acadEntity, то есть элементы из которых состоит определение блока
  63.                                                 if block.ObjectName == "AcDbAttributeDefinition" and block.TagString.upper() == "НОМЕРЯРЛЫКА".upper():  [color=red]   block.TagString.upper() == "НОМЕРЯРЛЫКА".upper()  - вот тут скорее всего спотыкается код. Так как ентити может быть линией и у нее нет такого свойства[/color]
  64.                                                         lead.SetBlockAttributeValue(block.ObjectId, str(numbeTable[listOfPoints.index(i)]))
  65.                                                        
  66.                                                        
  67.                                 blockItem = block[color=red]  ну это тоже не то пальто[/color]
  68.             # Commit before end transaction
  69.                         t.Commit()
  70.  
  71. #lead.TextString = str(numbeTable[listOfPoints.index(i)])
  72. #ID_Name1 = (aDoc.Blocks("_TagCircle").ObjectID)
  73. #lead1= mSp.SetBlockAttributeValue(lead.ObjectID,)
  74. #lead.GetBlockAttributeValue(ID_Name1)
  75. #coord.append(points)
  76. outList = []
  77. OUT = blockItem
  а вы проверяли работу на VBA?

Оффлайн Nutson

  • ADN OPEN
  • Сообщений: 44
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #444 : 05-08-2021, 16:42:07 »
Ваш код полностью моделить не буду, но вот вам наглядно что когда вы пишите For each по block, происходит перебор составляющих определения блока. Среди них не только атрибуты поэтому обращать к свойству которое есть только у атрибута это ошибка.  Я ведь уже написал.
Вообще советую тестироваться самому на ВБА так как в питоне(в данном случае из под динамо) просто нет функций по дебагу кода, отсюда такие ошибки


Оффлайн Aleks_199513

  • ADN OPEN
  • Сообщений: 21
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #445 : 05-08-2021, 17:10:21 »
Ваш код полностью моделить не буду, но вот вам наглядно что когда вы пишите For each по block, происходит перебор составляющих определения блока. Среди них не только атрибуты поэтому обращать к свойству которое есть только у атрибута это ошибка.  Я ведь уже написал.
Вообще советую тестироваться самому на ВБА так как в питоне(в данном случае из под динамо) просто нет функций по дебагу кода, отсюда такие ошибки
Спасибо. Решил проблему просто изменением стиля выноски.

Оффлайн Nutson

  • ADN OPEN
  • Сообщений: 44
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #446 : 05-08-2021, 17:12:16 »
Не сказать что решили, отсрочили)

Оффлайн Шашлык

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #447 : 01-09-2021, 01:43:14 »
Подскажите, пожалуйста, что-то я уже изломал голову или просто не внимательно смотрю инфу
Я хочу создать видовой лист, например А3
Как мне указать для видового экрана границу именно для данного формата + вписать туда чертёж ?
Я могу создать лист с параметрами, но не понимаю какими методами сделать границу (как понимаю масштаб)
Руками я это делаю как: подгоняю границу под формат листа и через ПОКАЗАТЬ зумирую необходимую область модели
Хотелось бы это делать на автомате
Искать блоки рамок я могу


найти и скачать картинки

Оффлайн Nutson

  • ADN OPEN
  • Сообщений: 44
  • Карма: 6
Re: Python & ActiveX/COM Autocad
« Ответ #448 : 02-09-2021, 06:46:14 »

Оффлайн Aleks_199513

  • ADN OPEN
  • Сообщений: 21
  • Карма: 0
Re: Python & ActiveX/COM Autocad
« Ответ #449 : 08-10-2021, 17:06:57 »
Добрый день. Подскажите пожалуйста, как можно получить координаты вершин полилинии в Python?