2016-06-09 8 views
1

Я пишу программу Python3 для работы с AutoCAD. Я использую pyautocad и comtypes.Как я могу получить конкретный интерфейс объекта Acad с comtypes (Python)

Я могу взять любой объект на чертеж и получить его лучший интерфейс. Например, я могу взорваться некоторыми блок ссылок и работать с новыми объектами AutoCAD создает:

for NewItem in BlockReference.Explode(): 
    # NewItem is unusable unknown object here 
    NewItem = comtypes.client.GetBestInterface(NewItem) 
    # Now NewItem is what it is in Acad (text, line or so on) 
    if NewItem.ObjectName == 'AcDbMText': 
    .... 

метод GetBestInterface идеально подходит, если я хочу, чтобы получить «лучший» интерфейс, который поддерживает методы, необходимые для выполнения итерации с ним, как с конкретным объектом Acad (например, AcDbMText). Но если я хочу, например, взорвать MText или Dimension, мне нужны методы AcDbEntity.

Итак, может кто угодно, пожалуйста, посоветуйте мне, как я могу получить не «лучший», а необходимый интерфейс объекта ?. И, как идеальный, список интерфейсов, которые он поддерживает.

ответ

0

Это был протестирован только с Python 2.7:

from pyautocad import Autocad, APoint 
from comtypes.client import GetBestInterface 
from comtypes.gen.AutoCAD import IAcadEntity, IAcadObject 

# Get acad application 
acad = Autocad(create_if_not_exists=True) 
# Create a new document 
doc1 = GetBestInterface(acad.Application.Documents.Add()) 
# add a circle in this document and make it visible 
circle = GetBestInterface(doc1.ModelSpace.AddCircle(APoint(0.0, 0.0), 1.0)) 

# to cast to a different interface: 
circle = circle.QueryInterface(IDispatch) 
circle = circle.QueryInterface(IAcadEntity) 
circle = circle.QueryInterface(IAcadObject) 

Должно работать, Тхо. Держитесь подальше от CopyObjects. Просто говорю'.

+0

Добро пожаловать. Вы должны принять ответ, чтобы другие, которые наткнулись на ваш вопрос, знали, что решение работает. И потому, что я получаю очки за это;) –