由于我第一次尝试使用Python进行二次开发,主要参考以下大佬文章进行尝试和发表以下在实践过程中理解和看法。
大佬文章链接分别如下:
1、飛影大佬:用 Python 玩转 SolidWorks
2、派大星人大佬:
基于Python的Solidworks二次开发方法_派大星仙人的博客-CSDN博客_python solidworks二次开发
1、开发前准备:先安装pywin32模块,然后在第三方库路径找出makepy.py。(文件路径为Python安装目录下\Lib\site-packages\win32com\client。)
2、分别先后两次双击makepy.py,在弹出的的库类型对话框中选中 (SLIDWORKS 20XX Type library和SOLIDWORKS 20xx Constant type library)生成对应的com对象隐函数的py文档和常量描述py文档,然后分别将对应文件改名为swcommands.py和swconst.py。至于为什么改名字,该与不该有什么用我无从知晓,上面大佬都是这么讲的。但是写程序时并没看到直接调用。
3、为Solidworks提供接口,并以可视化打开,并为不支持变量进行变量替换,具体如何查询,暂时不是很清楚,知道大佬可以告诉我,谢谢!
代码如下:
import win32com.client as win32
import pythoncom
swApp=win32.Dispatch('sldworks.application')
swApp.Visible=True
Nothing=win32.VARIANT(pythoncom.VT_DISPATCH,None)
SolidWorks二次开发一般使用录制宏产生代码进行修改的,所以在尝试过程中发现,编写变量名尽量跟SolidWorks宏录制相同,就可以省掉很多替换工作。上面飞影大佬都是使用arg_Nothing作为变量,但VBA产生代码都是Nothing,为了减少替换工作,我干脆直接使用Nothing,不过不理解之前,建议还是备注一下此Nothing并不是VBA中"Nothing",仅仅是一个变量名,不是关键字。
4、使用宏来进行生成代码。详细操作可以借鉴SolidWorks二次开发的高级教程。这里我仅仅提一下如何查看VBA中函数参数的定义。SolidWorks VBA中的同一类方法有新旧版本。虽然SolidWorks类对象的方法是向下兼容的,但是有时旧方法参数没有列举定义,此时可以通过查看新方法参数定义来了解。
![旧方法](https://i-blog.csdnimg.cn/blog_migrate/81e1913a16ba4aab17a04211e4b43707.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a51d395f823c2d6e42c512004fc8d3c1.png)
4、编程语言语法转换:至少要对VBA和Python基础语法有了解。一般VBA的关键字是以大写字母开头比较多,所以有时改写成Python版本时就要注意区分大小写。如果熟悉后,我才可以写一个语法转换模块进行大部分代码的格式转换。
5、也就是飞影大佬提到减法方式,通过将VBA代码进行合适删减,在进行第4步转换就可以啦。
6、像这种报错"pywintypes.com_error: (-2147352571, '类型不匹配。', None, 3)",通过查询变量而后进行变量的替换改写。
7、尝试改写代码时,可以先运行后,确认VBA程序无问题后,再改写成Python程序。此时你可以通过SolidWorks VBA帮助的搜索获得相应VBA程序进行改写。这里经常遇到调用路径报错问题,因为路径中含‘\’,往往在Python程序中被转义而失效。此时,可以路径字符串前加r即可。r"调用文件全路径"
最后,我呈现出我尝试最简单Python二次开发案例VBA代码和Python代码进行对比。
Option Explicit
Dim swApp As Object
Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long
Sub main()
Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc
boolstatus = Part.Extension.SelectByID2("前视基准面", "PLANE", 0, 0, 0, False, 0, Nothing, 0)
Part.SketchManager.InsertSketch True
Part.ClearSelection2 True
Dim mySketchText As Object
Set mySketchText = Part.InsertSketchText(0, 0, 0, "欢迎使用PYTHON进行二次开发", 0, 0, 0, 100, 100)
Part.ShowNamedView2 "*上下二等角轴测", 8
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("SketchText1", "SKETCHTEXT", 0, 0, 0, False, 0, Nothing, 0)
Dim myFeature As Object
Set myFeature = Part.FeatureManager.FeatureExtrusion2(True, False, False, 0, 0, 0.005, 0.01, False, False, False, False, 1.74532925199433E-02, 1.74532925199433E-02, False, False, False, False, True, True, True, 0, 0, False)
Part.SelectionManager.EnableContourSelection = False
End Sub
import win32com.client as win32
import pythoncom
swApp=win32.Dispatch('sldworks.application')
swApp.Visible=True
Nothing=win32.VARIANT(pythoncom.VT_DISPATCH,None)
Part = swApp.ActiveDoc
boolstatus = Part.Extension.SelectByID2("前视基准面", "PLANE", 0, 0, 0, False, 0, Nothing, 0)
Part.SketchManager.InsertSketch(True)
Part.ClearSelection2(True)
Part.InsertSketchText(0, 0, 0, "欢迎使用PYTHON进行二次开发", 0, 0, 0, 100, 100)
boolstatus = Part.Extension.SelectByID2("SketchText1", "SKETCHTEXT", 0, 0, 0, False, 0, Nothing, 0)
Part.FeatureManager.FeatureExtrusion2(True, False, False, 0, 0, 0.005, 0.01, False, False, False, False, 1.74532925199433E-02, 1.74532925199433E-02, False, False, False, False, True, True, True, 0, 0, False)