1
我嘗試通過Python中的COM實現兩個Autocad文檔之間的簡單複製操作。異常:帶有comtypes的無效對象數組
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)
此拋出:
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))
同樣的事情可以在VBA與實現:
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
我試過numpy的陣列,我試圖鑄造到IDispatch
接口方面,IAcadEntity
接口和IAcadObject
沒有成功(可能是一個愚蠢的嘗試)。
circle = circle.QueryInterface(IAcadEntity)
我也想看看裏面site-packages\comtypes\automation.py
但是這是我上面的薪酬等級。將self.vt
設置爲VT_ARRAY | VT_DISPATCH
in _set_value
沒有什麼好處,但我懷疑問題出在這些方面,因爲如果我們將Dim arry(0 To 0) As AcadEntity
更改爲Dim arry(0 To 0) As Variant
,那麼VBA示例也會拋出Invalid object array
。
我要指出,我取消註釋中site-packages\comtypes\automation.py
兩行:
# These are not yet implemented:
POINTER(IUnknown): VT_UNKNOWN,
POINTER(IDispatch): VT_DISPATCH,
所以....幫助?