Python SolidWorks 二次开发---SolidWorks工程图中遍历视图(GetViews)踩坑

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、问题总结

问题出现的原因其实很简单,就是调用的对象接口不正确,查找到相应的接口,调用其属性就很容易解决了

猜你喜欢

转载自blog.csdn.net/Bluma/article/details/129175190