我正在使用win32com和python进行自动化,并且遇到了一个有趣的问题,该问题定义了与AutoCAD应用程序一起使用的要点。
仔细研究,我发现'pyautocad'库为这些点提供了一个包装类,称为“ APoint”,将这些点定义为array.array('d', (x, y, z))
据我所知,pyautocad仍然使用com接口,但是会发生以下情况:
acad = pyautocad.Autocad(create_if_not_exists=True)
p1 = array.array('d', (0.0, 0.0, 0.0))
acad.model.AddCircle(p1, 5)
# The circle is correctly added
这两个分别运行
app = win32com.client.gencache.EnsureDispatch('AutoCAD.Application')
path = 'C:\\test.dxf'
doc = app.Documents.Open(path)
p1 = array.array('d', (0.0, 0.0, 0.0))
doc.ModelSpace.AddCircle(p1, 5)
#File "...Temp\gen_py\...\IAcadModelSpace.py", line 93, in AddCircle
# , Radius)
#TypeError: Internal error - the buffer length is not the sequence length!
我希望我的代码能模拟与包装库相同的结构,但是明显不同。即使我似乎在库源代码中找不到类似的内容,库是否引用了其他“ AddCircle”方法?如何跟踪该库用于该方法的实现?或者,'Apoint'类是否缺少某种翻译?
最终,我的问题是,“我想念什么?”
1个简单而手动的解决方案是使用python调试器或ipydb运行代码,并逐步执行代码,直到找到pyautocad真正调用的地方。
但是,如果运气不好,当pyautocad调用编译的C代码时,单步跟踪将停止。但是,如果幸运的话,它将使用win32com,然后您将看到带有确切参数的确切调用。
只需添加行
import pdb; pdb.set_trace()
直接在行前
acad.model.AddCircle(p1, 5)
您将使用pdb模式。
'?'将显示帮助文本。您想使用
逐步遍历代码s
的序列(进入功能)和n
功能的下一行。您可以随时输入变量名称以查看其内容