python直接打开SolidWorks零件报错

环境:python3.8,SolidWorks2018,win10

错误描述:程序直接打开零件时报错(打开SolidWorks+零件),但单独打开SolidWorks应用程序或者手动打开软件,然后利用python打开零件是没有问题的

错误图片:

img

代码:


```python
import win32com.client
import pythoncom


def opendoc():
    # SolidWorks年份版本
    sldver = 2018
    # 建立com连接,如只有一个版本,可以只写"SldWorks.Application"
    swApp = win32com.client.Dispatch(f'SldWorks.Application.{sldver-1992}')
    # 提升API交互效率
    swApp.CommandInProgress = True
    # 显示SolidWorks界面
    swApp.Visible =True
    # 打开文件
    Errors = win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
    Warnings = win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
    swApp.OpenDoc6("t1.SLDPRT", 1, 1, "", Errors, Warnings)


if __name__ == '__main__':
    swApp = opendoc()

```

修改文件路径为绝对路径,如下所示:
swApp.OpenDoc6(r"F:\t1.SLDPRT", 1, 1, "", Errors, Warnings)

正确注册dll
在64位Windows下:
64位exe和dll在目录c:\windows\system32目录下;
32位exe和dll在目录c:\windows\syswow64目录下;
所以要注意:
    在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。
    且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll


【相关推荐】



  • 这篇文章讲的很详细,请看:基于Python的Solidworks二次开发小尝试(一)
  • 除此之外, 这篇博客: 基于Python的Solidworks二次开发方法中的 关于python简易二次开发Solidworks的小程序 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    第一次动手开发了一个Solidworks的小程序,实验的功能也很简单,出来分享一下,第一次大佬们也可以指出一些问题,来帮助我改进~

    此处特别感谢 飛影大佬 的指导!

    项目实现思路
    我所做的功能非常的简单,就是通过python,来打开Solidworks文件(对已经存在的零件图进行修改),并且使用其自带的函数来进行对Soildworks的简单控制,我所实现的思路就是通过TK模块生成一个简单的GUI界面,通过SW内部的active属性来进行控制。我控制的大致思路还是通过SW内置的宏录制系统,但是由于SW内置的宏录制所出现的代码是VB的,大部分不能直接使用(部分代码包含坐标,如果获取不到是可以直接用的)

    如何使用python连接solidworks

    此处代码由大佬传授(

    https://mp.weixin.qq.com/s/xf_lDViBEt0IR-sxPlQVRA不明白可以关注一下大佬的公众号的原文!

    首先找到你python路径下的Python38\Lib\site-packages\win32com\client \makepy.py的设置文件
    在这里插入图片描述
    选择SOLIDWORKS 2018 Type library和SOLIDWORKS 2018 Constant type library的文件 ,打开终端会出现一行地址 例如(AppData\Local\Temp\gen_py\3.8\83A33D31-27C5-11CE-BFD4-00400513BB57x0x26x0.py)
    前往该地址,保存两个文件

    在这里插入图片描述
    这是其中一个文件的内容,该内容就是python在SW中的内置函数格式和参数。

    import win32com.client as win32 
    import pythoncom
    #sw VBA接口引入  
    sw_app = win32.Dispatch("Sldworks.application")            #引入sldworks接口
    sw_app.Visible = True                                      #是否可视化
    arg_Nothing = win32.VARIANT(pythoncom.VT_DISPATCH, None)   #转义VBA中不同变量nothing
    sw_app.OpenDoc(r'C:\Users\11927\Desktop\Solidworks二次开发\test1.SLDPRT',1)     #打开二次开发源文件
    part = sw_app.ActiveDoc                                    #sldworks 最高访问权限
    

    上面的代码是通过python来进行访问 SW的最高权限,从而使得PYTHON获得控制SW的能力

    tk控制界面

    在这里插入图片描述
    这是我自己做的一个TK界面,十分的简陋了

    以下是实现的代码

    from PIL import Image,ImageTk
    import tkinter as tk
    #运用PIL的Iamge方法和tkinter模块进行本项目的编写
    window = tk.Tk()
    window.title(' 生成器')
    window.geometry('500x300')
    #建立一个窗体并给重命名修改窗口的大小
    j=tk.Label(window,text='high',font=('Arial',12),width=5,height=2)
    j.place(x=0,y=50,anchor='w')
    l=tk.Label(window,text='long',font=('Arial',12),width=5,height=2)
    l.place(x=0,y=100,anchor='w')
    K=tk.Label(window,text='wide',font=('Arial',12),width=5,height=2)
    K.place(x=0,y=150,anchor='w'#以上三句为为窗口添加标签(anchor参数为方位)
    entry1 = tk.Entry(window, show="")  
    entry1.place(x=50,y=100,anchor='w')
    entry2 = tk.Entry(window, show="")
    entry2.place(x=50,y=150,anchor='w')
    entry3 = tk.Entry(window, show="")  
    entry3.place(x=50,y=50,anchor='w')
    #以上三句为添加entry
    im=Image.open(r'C:\Users\11927\Desktop\test.GIF')
    img=ImageTk.PhotoImage(im)
    imLabel=tk.Label(window,image=img).place(x=255,y=125,anchor='w')
    b=tk.Button(window,text='run',width=10,height=1,command=hit_command)
    b.place(x=200,y=250,anchor='w')
    window.mainloop()
    #以上三句为为窗口添加button按钮以及实现窗体的循环
    #以上代码为插入图片
    

    控制函数

    由SW内置自带的宏录制函数,会产生一个VB代码块

    例如下列这个 改变长度的VB函数块

    Sub main()
    
    Set swApp = Application.SldWorks
    
    Set Part = swApp.ActiveDoc
    Dim myModelView As Object
    Set myModelView = Part.ActiveView
    myModelView.FrameState = swWindowState_e.swWindowMaximized
    boolstatus = Part.Extension.SelectByRay(-0.216369440159241, 0.034531910687619, 5.50000000000068E-02, 0.147359869979909, 8.99053212180621E-02, -0.98498837654877, 3.26516300139265E-03, 2, False, 0, 0)
    Part.FeatEdit
    Part.ClearSelection2 True
    boolstatus = Part.Extension.SelectByID2("D1@草图1@test2.6.SLDPRT", "DIMENSION", -5.34756715564095E-02, 0.108438751744452, 4.78676892114677E-02, False, 0, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("D1@草图1@test2.6.SLDPRT", "DIMENSION", -5.34756715564095E-02, 0.108438751744452, 4.78676892114677E-02, False, 0, Nothing, 0)
    Dim myDimension As Object
    Set myDimension = Part.Parameter("D1@草图1")
    myDimension.SystemValue = 0.5
    Part.ClearSelection2 True
    Part.SketchManager.InsertSketch True
    End Sub
    
    

    通过查阅我们上面SOLIDWORKS 2018 Type library所产生的函数库,可以在其中找到改线的函数SelectByRay
    在这里插入图片描述
    由此定义可知,在python中如何使用该函数块,并且该函数中的左边也可以直接使用

    以下为完整的代码展示

    from PIL import Image,ImageTk
    import tkinter as tk
    import win32com.client as win32 
    import pythoncom
    #sw VBA接口引入  
    sw_app = win32.Dispatch("Sldworks.application")            #引入sldworks接口
    sw_app.Visible = True                                      #是否可视化
    arg_Nothing = win32.VARIANT(pythoncom.VT_DISPATCH, None)   #转义VBA中不同变量nothing
    sw_app.OpenDoc(r'C:\Users\11927\Desktop\Solidworks二次开发\test1.SLDPRT',1)     #打开二次开发源文件
    part = sw_app.ActiveDoc                                    #sldworks 最高访问权限
    #定义选择修改长度函数
    def modify_long():
        myDimension = part.Parameter('D1@草图1')       #对修改的对象进行赋值
        myDimension.SystemValue = entry1.get()       #修改   长  尺寸
    #定义选择修改宽度函数
    def modify_wide():
        myDimension2 = part.Parameter("D2@草图1")           #对修改的对象进行赋值
        myDimension2.SystemValue = entry2.get()             #修改   宽  尺寸
    #定义拉伸函数(改高)
    def modify_high():
        part.Extension.SelectByRay(0.249999999999829, 3.66326533407744E-02, 0.042461906089045, -0.525746397352897, -0.288152592392952, -0.800349179525831, 2.39088438353342E-03, 2, False, 0, 0)
        part.ActivateSelectedFeature
        part.Extension.SelectByID2("D1@拉伸1@test1.SLDPRT", "DIMENSION", 0.219736964536031, -0.127304044251369, -5.40747833103912E-02, False, 0, arg_Nothing, 0)
        myDimension3 = part.Parameter("D1@拉伸1")
        myDimension3.SystemValue = entry3.get()
    
    #定义修改总命令函数
    def modify_commands():
        modify_long()
        modify_wide()
        modify_high()
        
    #建立tk窗口文件
    window = tk.Tk()
    window.title(' 生成器')
    window.geometry('500x300')
    #建立标签
    j = tk.Label(window,text='high',font=('Arial',12),width=5,height=2)
    j.place(x=0,y=50,anchor='w')
    l = tk.Label(window,text='long',font=('Arial',12),width=5,height=2)
    l.place(x=0,y=100,anchor='w')
    K = tk.Label(window,text='wide',font=('Arial',12),width=5,height=2)
    K.place(x=0,y=150,anchor='w')
    #建立entry
    entry1 = tk.Entry(window, show="")  
    entry1.place(x=50,y=100,anchor='w')
    entry2 = tk.Entry(window, show="")  
    entry2.place(x=50,y=150,anchor='w')
    entry3 = tk.Entry(window, show="")  
    entry3.place(x=50,y=50,anchor='w')
    #插入图片
    im=Image.open(r'C:\Users\11927\Desktop\test.GIF')
    img=ImageTk.PhotoImage(im)
    imLabel=tk.Label(window,image=img).place(x=255,y=125,anchor='w')
    #命令函数
    def hit_command():
        modify_commands()
        part.SaveAs3(r"C:\Users\11927\Desktop\test2.6.SLDPRT", 0, 2)
    #按钮定义
    b=tk.Button(window,text='run',width=10,height=1,command=hit_command)
    b.place(x=200,y=250,anchor='w')
    window.mainloop()
    

    在这里插入图片描述
    在这里插入图片描述
    以上为实现后的样子

    声明:
    未经本人许可,任何单位及个人不得以任何形式对本文的全部或部分内容做转载、复制或商业用途。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^