Exceção: matriz de objetos inválida com comtypes
Eu tento implementar uma operação de cópia simples entre dois documentos do Autocad via COM em Python.
from pyautocad import Autocad, APoint
from comtypes.client import GetBestInterface
# 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))
doc1.Application.ZoomExtents()
# create another document
doc2 = GetBestInterface(acad.Application.Documents.Add())
# and copy the circle to the new document
doc1.CopyObjects([circle], doc2.ModelSpace)
Isso lança:
Traceback (most recent call last):
File "copy_bug.py", line 13, in <module>
doc1.CopyObjects([circle], doc2.ModelSpace)
File "Anaconda2\lib\site-packages\comtypes\__init__.py", line 655, in call_with_inout
rescode = func(self_, *args, **kw)
_ctypes.COMError: (-2145320837, None, (u'Invalid object array', u'AutoCAD.Application', u'C:\\Program Files\\Autodesk\\AutoCAD 2015\\HELP\\OLE_ERR.CHM', -2145320837, None))
O mesmo pode ser feito no VBA com:
Dim doc1 As AcadDocument
Set doc1 = ThisDrawing.Application.Documents.add
Dim pt(0 To 2) As Double
pt(0) = 0#: pt(1) = 0#: pt(2) = 0#
Dim circ As AcadCircle
Set circ = doc1.ModelSpace.AddCircle(pt, 1)
ThisDrawing.Application.ZoomExtents
Dim doc2 As AcadDocument
Set doc2 = ThisDrawing.Application.Documents.add
Dim arry(0 To 0) As AcadEntity
Set arry(0) = circ
doc1.CopyObjects arry, doc2.ModelSpace
Tentei matrizes numpy, tentei transmitir para oIDispatch
interface, oIAcadEntity
interface eIAcadObject
sem sucesso (provavelmente uma tentativa boba).
circle = circle.QueryInterface(IAcadEntity)
Eu também tentei olhar para dentrosite-packages\comtypes\automation.py
mas isso está acima da minha nota de pagamento. Configurando oself.vt
paraVT_ARRAY | VT_DISPATCH
no_set_value
não adianta, mas desconfio que o problema esteja nesse sentido porque, se mudarmosDim arry(0 To 0) As AcadEntity
paraDim arry(0 To 0) As Variant
o exemplo do VBA também lançaráInvalid object array
.
Devo mencionar que não comentei duas linhas nosite-packages\comtypes\automation.py
:
# These are not yet implemented:
POINTER(IUnknown): VT_UNKNOWN,
POINTER(IDispatch): VT_DISPATCH,
Então .... ajuda ?!