Python SolidWorks 二次开发—SolidWorks工程图中遍历视图(GetViews)踩坑
文章目录
前言
遍历作为二次开发中必不可少的环节,基本不能直接获取的都需要遍历获得,之前已经对零部件的四种遍历进行了总结,感兴趣的可以翻看之前的文章,这里研究下工程图中的视图遍历,其中有个地方需要特别处理下,详见后文
1、工程图的遍历
直接贴代码,代码中有注释
import win32com.client
from swconst import constants
def main():
sldver=2018
swApp=win32com.client.Dispatch(f'SldWorks.Application.{
sldver-1992}')
swApp.CommandInProgress =True
swApp.Visible =True
# 注意此处当前文档是工程图文档
swModel = swApp.ActiveDoc
# 获取所有sheet页以及内部视图对象
views = swModel.GetViews
# 遍历工程图中sheet页
for sheet in views:
# 遍历每页中的视图
for view in sheet:
# 输出视图名称
print(view.GetName2)
# 遍历视图中的注释
for note in view.GetNotes:
# 输出注释内容
print(note.GetText)
if __name__ == '__main__':
main()
2、运行后报错
以上代码在运行到第二个for循环时会报如下错误:
AttributeError: ‘PyIDispatch’ object has no attribute ‘GetName2’
3、问题原因
为什么会出现此问题,先查看view类型,发现是:
<class ‘PyIDispatch’>
打印view是如下结果:
<PyIDispatch at 0x000001AB1A712DD0 with obj at 0x000001AB1A599CE8>
说明此时对象发生了更改,自然是找不到相关属性的
扫描二维码关注公众号,回复:
16732134 查看本文章
4、解决措施
解决措施其实也很简答,就是让view类型返回com对象即可,增加以下代码即可:
view=win32com.client.Dispatch(view)
此时查看view类型为:
<COMObject >
相关方法也可以正常调用,返回正常值
完成代码如下:
import win32com.client
from swconst import constants
def main():
sldver=2018
swApp=win32com.client.Dispatch(f'SldWorks.Application.{
sldver-1992}')
swApp.CommandInProgress =True
swApp.Visible =True
# 注意此处当前文档是工程图文档
swModel = swApp.ActiveDoc
# 获取所有sheet页以及内部视图对象
views = swModel.GetViews
# 遍历工程图中sheet页
for sheet in views:
# 遍历每页中的视图
for view in sheet:
# 新增行
view=win32com.client.Dispatch(view)
# 输出视图名称
print(view.GetName2)
# 遍历视图中的注释
for note in view.GetNotes:
# 输出注释内容
print(note.GetText)
if __name__ == '__main__':
main()
5、问题总结
问题出现的原因其实很简单,就是调用的对象接口不正确,查找到相应的接口,调用其属性就很容易解决了