solidworks多实体零件转装配体-python实现

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已经打开转好的装配体,设计树的零件没有固定需要手动全选+固定。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荆棘巢凤@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值