pyautocad如何工作,而使用win32com却不行?

问题描述 投票:0回答:1

我正在使用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'类是否缺少某种翻译?

最终,我的问题是,“我想念什么?”

python win32com variant
1个回答
0
投票

1个简单而手动的解决方案是使用python调试器或ipydb运行代码,并逐步执行代码,直到找到pyautocad真正调用的地方。

但是,如果运气不好,当pyautocad调用编译的C代码时,单步跟踪将停止。但是,如果幸运的话,它将使用win32com,然后您将看到带有确切参数的确切调用。

只需添加行

import pdb; pdb.set_trace()

直接在行前

acad.model.AddCircle(p1, 5)

您将使用pdb模式。

'?'将显示帮助文本。您想使用

逐步遍历代码

s的序列(进入功能)和n功能的下一行。您可以随时输入变量名称以查看其内容

© www.soinside.com 2019 - 2024. All rights reserved.