1,准备一个待转装配体格式的零件,注意左侧设计树实体的名称,需要‘输入1’、‘输入2’
、‘曲面-输入1’、‘曲面-输入2’类似的命名规则,否则会报错;
2,准备一个空的装配体文件,记住保存的位置;
3,准备一个空的文件夹,缓存用;
4,执行代码;
solidworks多实体零件转装配体.py
import win32com.client as win32
import pythoncom
from tkinter import Tk,Label,Button,Entry,IntVar,Checkbutton,Radiobutton
from tkinter.ttk import Combobox
from tkinter import filedialog,Menu,messagebox,Text,StringVar
import threading
import pyautogui
import time
import os
from tqdm import tqdm
from swconst import constants as swconst
swerrors = win32.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, 3)
swwarnings = win32.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, 3)
#转义VBA中不同变量nothing
arg_Nothing = win32.VARIANT(pythoncom.VT_DISPATCH, None)
class MyThread(threading.Thread): #多线程
def __init__(self, func, *args):
super().__init__()
self.func = func
self.args = args
self.setDaemon(True)
self.start() # 在这里开始
def run(self):
self.func(*self.args)
class Sw(): #solidworks
def __init__(self):
self.data = []
def connect_sw(self):
#连接solidworks
print('正在连接solidworks')
swapp = win32.Dispatch("Sldworks.application")#引入sldworks接口
swapp.Visible = True #是否可视化
print('成功连接solidworks')
swapp.CommandInProgress = True
return(swapp)
def disconnect_sw(self,swapp):
swapp.Visible = False #是否可视化
print('已断开连接solidworks')
swapp.CommandInProgress = False
def openpart(self,path,swapp):
filetype = FileCtrl().getfileextension(path).upper()
print('正在打开:' + str(path))
if filetype == '.SLDPRT':
if os.path.exists(path):
swapp.OpenDoc(path,1)
print('已打开:' + str(path))
else:
print(str(path) + '文件不存在')
elif filetype == '.SLDDRW':
if os.path.exists(path):
swapp.OpenDoc(path,3)
print('已打开:' + str(path))
else:
print(str(path) + '文件不存在')
elif filetype == '.SLDASM':
if os.path.exists(path):
swapp.OpenDoc6(path,2,0,'',swerrors,swwarnings)
print('已打开:' + str(path))
else:
print(str(path) + '文件不存在')
def saveas(self,path,swapp): #连接solidworks另存文件
filetype = FileCtrl().getfileextension(path)
print('正在转换:' + str(path))
if filetype.lower() == '.sldprt':
if os.path.exists(str(path)):
print(str(path)+ '.sldprt 文件已存在')
else:
part = swapp.ActiveDoc
part.SaveAs3(path, 0, 2)
print('已转换:' + str(path))
elif filetype.lower() == '.step':
if os.path.exists(str(path)):
print(str(path)+ '.step 文件已存在')
else:
part = swapp.ActiveDoc
part.SaveAs3(path, 0, 0)
print('已转换:' + str(path))
elif filetype.lower() == '.dwg':
if os.path.exists(str(path)):
print(str(path)+ '.dwg 文件已存在')
else:
part = swapp.ActiveDoc
part.SaveAs3(path, 0, 0)
print('已转换:' + str(path))
elif filetype.lower() == '.pdf':
if os.path.exists(str(path)):
print(str(path)+ '.pdf 文件已存在')
else:
part = swapp.ActiveDoc
part.SaveAs3(path, 0, 0)
print('已转换:' + str(path))
def cm87(self,asmpath,asmname): #拆分零件特征保存为单个零件
swapp = self.connect_sw()
swModel = swapp.ActiveDoc
print(swModel.GetPathName)
swSelMgr = swModel.SelectionManager
swFeat = swModel.FirstFeature
print('特征:' + str(swFeat.Name))
featname = []
try:
for i in range(1000):
swFeat = swFeat.GetNextFeature
print('特征:' + str(swFeat.Name))
featname.append(str(swFeat.Name))
try:
swSubFeat =swFeat.GetFirstSubFeature
print(' 特征依赖:' + str(swSubFeat.Name))
for i in range(1000):
#nextSubFeat = swSubFeat.GetNextSubFeature
swSubFeat = swSubFeat.GetNextSubFeature
print(' 特征依赖:' + str(swSubFeat.Name))
except AttributeError:
pass
except AttributeError:
pass
featname1 = []
for i in range(len(featname)):
if featname[i] == '原点':
j = i+1
break
for i in range(j,len(featname)):
featname1.append(featname[i])
print(featname1)
print('开始另存:')
for i in tqdm(range(len(featname1))):
#print('正在另存:' + str(asmpath) + featname1[i] + '.sldprt')
swModel.SaveAs3(str(asmpath) + featname1[i] + '.sldprt',0,2) #另存
#print('OK')
swapp.CloseDoc(str(os.path.splitext(os.path.basename(str(swModel.GetPathName)))[0]) + '.sldprt')
print('开始拆分:')
for i in tqdm(range(len(featname1))):
swapp.OpenDoc(str(asmpath) + featname1[i] + '.sldprt',1)
swModel = swapp.ActiveDoc
featname2 = []
for j in range(len(featname1)):
if featname1[j] != featname1[i]:
featname2.append(featname1[j])
for k in range(len(featname2)):
if featname2[k][:2] == '输入':
swModel.Extension.SelectByID2(featname2[k], "BODYFEATURE", 0, 0, 0, True, 0, arg_Nothing, 0)
elif featname2[k][:2] == '曲面':
swModel.Extension.SelectByID2(featname2[k], "REFSURFACE", 0, 0, 0, True, 0, arg_Nothing, 0)
swModel.EditDelete() #删除
swModel.Save3(1,swerrors,swwarnings)
swapp.CloseDoc(str(featname1[i]) + '.sldprt')
self.disconnect_sw(swapp)
return(featname1)
def cm88(self,asmpath,asmname,featname1): #零件合并成装配体
swapp = self.connect_sw()
swapp.OpenDoc6(asmname,2,0,'',swerrors,swwarnings)
swModel = swapp.ActiveDoc
path0 = swModel.GetPathName
print(swModel.GetPathName)
swSelMgr = swModel.SelectionManager
print('生成装配体:')
for i in tqdm(range(len(featname1))):
path1 = asmpath + featname1[i] + '.sldprt'
path2 = featname1[i]+ '.sldprt'
swapp.OpenDoc(path1,1)
swModel = swapp.ActiveDoc
swmodel = swModel
try:
xmax = swmodel.GetPartBox(True)[3]
xmin = swmodel.GetPartBox(True)[0]
ymax = swmodel.GetPartBox(True)[4]
ymin = swmodel.GetPartBox(True)[1]
zmax = swmodel.GetPartBox(True)[5]
zmin = swmodel.GetPartBox(True)[2]
x = (xmax+xmin)/2
z = (zmax+zmin)/2
y = (ymax+ymin)/2
swapp.ActivateDoc2(os.path.basename(str(path0)),False,swerrors)
swModel = swapp.ActiveDoc
swModel.AddComponent5(path2,0,'',False,'',x,y,z)
swapp.CloseDoc(path2)
except BaseException:
swapp.CloseDoc(path2)
self.disconnect_sw(swapp)
class Cm(): #按钮函数
def __init__(self):
self.data = []
def cm1(self,label1): #获取鼠标当前位置
for i in range(20):
#global text1
screenwidth,screenheight = pyautogui.size()
currentmousex,currentmousey = pyautogui.position()
text1 = str(screenwidth) + 'x' + str(screenheight) + \
'(' + str(currentmousex) + ',' + str(currentmousey) + ')'
label1.config(text=text1)
time.sleep(0.1)
print(text1)
def cm2(self,label3): #源文件夹
global path1
path1 = filedialog.askdirectory()
label3.config(text=path1)
def cm3(self,label5): #目标文件夹
global path2
#global path2_1
path2 = filedialog.askdirectory()
label5.config(text=path2)
def cm4(self,label7): #目标文件
global msg_file
msg_file = filedialog.askopenfilename(initialdir=\
os.path.dirname(__file__))
label7.config(text=msg_file)
def cm89(self): #零件转装配体
asmpath = path1 + '/'
asmname = msg_file
featname1 = Sw().cm87(asmpath,asmname)
Sw().cm88(asmpath,asmname,featname1)
def main():
global window
global labelj1
global var1,var2,var3,var4,var5,var6,var30
global e1,e12,e13,e14,e15,e16,e17,e18,e19,e20,e21
window = Tk()
window.title('pyautogui')
###
scale = 1
sc = scale #显示屏比例
windowwidth = 600 * sc
windowheight = 600 * sc
windowsize = str(int(windowwidth)) + 'x' + str(int(windowheight))
window.geometry(windowsize)
###
#window.geometry('600x600')
btn1 = Button(window,text = '获取当前鼠标位置',bg = 'white',\
fg = 'black',command = lambda :MyThread(Cm().cm1,label1))
btn1.place(x=40*sc,y=40*sc)
btn2 = Button(window,text = '选择',bg = 'white',fg = 'black',\
command = lambda :MyThread(Cm().cm2,label3))
btn2.place(x=425*sc,y=70*sc)
btn3 = Button(window,text = '选择',bg = 'white',fg = 'black',\
command = lambda :MyThread(Cm().cm3,label5))
btn3.place(x=425*sc,y=100*sc)
btn4 = Button(window,text = '选择',bg = 'white',fg = 'black',\
command = lambda :MyThread(Cm().cm4,label7))
btn4.place(x=425*sc,y=130*sc)
btn80 = Button(window,text = '零件转装配体',bg = 'white',\
fg = 'black',command = Cm().cm89)
btn80.place(x=40*sc,y=500*sc)
label1 = Label(window, bg='yellow', width=57, text='label1')
label1.place(x=40*sc,y=10*sc)
label2 = Label(window, bg='yellow', width=9, text='源文件夹:')
label2.place(x=40*sc,y=70*sc)
label3 = Label(window, bg='yellow', width=40, text='label3')
label3.place(x=120*sc,y=70*sc)
label4 = Label(window, bg='yellow', width=10, text='目标文件夹:')
label4.place(x=40*sc,y=100*sc)
label5 = Label(window, bg='yellow', width=40, text='label5')
label5.place(x=120*sc,y=100*sc)
label6 = Label(window, bg='yellow', width=9, text='目标文件:')
label6.place(x=40*sc,y=130*sc)
label7 = Label(window, bg='yellow', width=40, text='label7')
label7.place(x=120*sc,y=130*sc)
window.mainloop()
main()
注:需要按照代码头部内容安装相应的第三方库,需要将swconst.py放在代码文件同目录下
swconst.py
运行solidworks多实体零件转装配体.py,会弹出两个框框
5、三个步骤:
①、源文件夹,选择第3步的空文件夹;
②、目标文件,选择第2步的空装配体文件;
③,打开solidworks,仅打开第1步的待转格式的零件;
6、点击零件转装配体,等待程序自动运行结束;
7,程序自动运行结束,solidworks已经打开转好的装配体,设计树的零件没有固定需要手动全选+固定。