使用pyqt5 编写一个脚本程序,程序用途:为一个国产贴片机生产对应需要的格式文件,根据cadence的水晶BOM和位置文件
使用pyqt5 编写一个脚本程序,程序用途:为一个国产贴片机生产对应需要的格式文件,根据cadence的水晶BOM和位置文件。主程序
'''
Author: your name
Date: 2021-06-23 14:09:00
LastEditTime: 2021-07-16 10:43:27
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \mounter\deal_bom_data.py
'''
# from PyQt5.QtWidgets import (QAbstractItemView, QWidget, QTableWidget, QHBoxLayout,QVBoxLayout,
# QApplication, QTableWidgetItem,QLineEdit, QPushButton,
# QFileDialog, QMainWindow)
from PyQt5.QtWidgets import (QApplication, QTableWidgetItem, QFileDialog, QMainWindow)
from PyQt5.QtCore import QDir, bom #, QRect
# import sys
# import docx
# from PyQt5.QtCore import pyqtSlot
from mounter_qt_20210623 import Ui_MainWindow
import pandas as pd
from docx import Document
import re
from win32com import client as wc
import copy
import time
import os
import numpy as np
class Table(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(Table, self).__init__(parent)
self.cadence_bom_file_data = None #保存导入BOM文件的数据
self.cadence_bom_config_file_data = None #配置好料站之后,保存配置好的所有数据
self.cadence_ic_position_mesage = None #用于保存器件的位置信息
self.tip_mouth_excel_file_data = None #保存导入位置文件的数据
self.save_config_welded_station_data = None #保存配号是否焊接的数据
self.save_config_tip_mounter_data = None #保存配置好的吸盘类型
self.project_name = None
# self.cadence_bom_file_data = None #保存导入BOM文件的数据
self.setupUi(self)
self.open_bom_file_push_button.clicked.connect(self.open_bom_file_push_button_function) #打开BOM文件信号槽函数
self.open_position_file_push_button.clicked.connect(self.open_position_file_push_button_function) #打开位置文件信号槽函数
self.configuration_and_generate_file.clicked.connect(self.configuration_and_generate_file_function) #配置文件和生产不和要求的文件的信号槽函数
self.open_configure_tip_mounter_file_push_button.clicked.connect(self.open_configure_tip_mounter_file_push_button_function) #配置信号贴片机的吸头槽函数
self.config_tip_mounter_pushButton.clicked.connect(self.config_tip_mounter_pushButton_function) ##配置料站号
self.configuration_welded_station_push_button.clicked.connect(self.configuration_welded_station_push_button_function) #配置芯片焊接状态
self.configure_tip_mounter_station_push_button.clicked.connect(self.configure_tip_mounter_station_push_button_function) #配置贴片机吸嘴型号
def open_bom_file_push_button_function(self):
'''
#打开BOM文件,并且处理bom文件数据
#设置打开文件格式
# QFileDialog(self, '打开文件', 'doc文件(*.doc);;docx文件(*.docx)')
# '葵花宝典','../','所有文件(*.*);;Python文件(*.py);;图片(*.png *.jpg)'
# ( 父控件 , '对话框标题', '文件路径' , ' 过滤器名称1(*.后缀名1 *.后缀名2 g);;过滤器名称2(*.后缀名1 *.后缀名2 ) ')
'''
# dlg = QFileDialog(self, '打开文件','./', '*.doc;;*.docx') #设置导入文件的类型
dlg = QFileDialog(self, '打开文件','D:/BOM/', '*.doc;;*.docx') #设置导入文件的类型,打开制定位置
dlg.setFileMode(QFileDialog.AnyFile) #设置打开文件格式
dlg.setFilter(QDir.Files)
if dlg.exec_():
filenames = dlg.selectedFiles()
f = open(filenames[0], 'r')
#导入文件数据
docx_file_name = self.doc_file_save_as_docx(f.name)
# print(docx_file_name)
if docx_file_name == None:
self.show_all_mesage.append('请先关闭文件,再操作!!!')
return
res = re.search('\.docx',docx_file_name) #保证导入的文件是.docx格式
if f.name and res != None:
show_txt = (docx_file_name).split('/')[-1]
# show_txt = docx_file_name
self.show_bom_file_name.setText(show_txt)
#下表是使用document 库 读取水晶BOM 文件数据
document = Document(docx_file_name)
# table=document.tables
crystal_bom_input_data_list = []
title = ['序号','料带号','使用位置','数量','型号规格','名称','物料编码'] #显示的表格表头
crystal_bom_input_data_list.append(title)
mid_list = []
j = 1
flag = 0
flag_1 = 0
flag_2 = 0
for i in range(0,len(document.paragraphs)): #直接去除开头表头信息,数值20的含义
# print('第%s行'%i ,document.paragraphs[i].text) #用于调试显示
#bom 表格第13行是项目名称,如果名称为空,则直接使用时间命名
if flag_1 == 0 and document.paragraphs[i].text == '名称':
flag_1 = 1
#获取项目名称
res_2 = re.search('英文名称',document.paragraphs[i].text)
if flag_2 == 0 and res_2 != None:
flag_2 = 1
continue
if flag_2 == 1 and document.paragraphs[i].text != '序号':
self.project_name = document.paragraphs[i].text
flag_2 = 3
elif flag_2 == 1 and document.paragraphs[i].text == '序号':
self.project_name = (time.strftime('%Y_%m_%d_%H_%M',time.localtime(time.time())))
flag_2 = 3
if flag_1 == 1: #bom表格从第一次出现名称,才开始是正式数据
text_data = document.paragraphs[i].text
if text_data == '页':
flag = 1
if text_data == '名称':
flag = 0
continue
if flag == 1:
continue
if len(mid_list) < 6:
mid_list.append(text_data)
res_1 = re.search('备注',mid_list[0])
if len(mid_list) == 6:
res_1 = re.search('备注',mid_list[0])
if res_1 == None:
mid_data = list([mid_list[0],"79",mid_list[2],mid_list[1],mid_list[3],mid_list[4],mid_list[5]]) #测试代码最后注销,料站号默认设置为79,
# mid_data = list([mid_list[0],0,mid_list[2],mid_list[1],mid_list[3],mid_list[4],mid_list[5]])
crystal_bom_input_data_list.append(mid_data)
mid_list.clear()
else:
mid_list.clear()
if len(crystal_bom_input_data_list) == 0:
self.show_all_mesage.append('导入BOM表格为空,请重新导入')
return
# self.cadence_bom_file_data = crystal_bom_input_data_list #将导入的数据赋值给类变量
cadence_bom_raw_number = len(crystal_bom_input_data_list) #获取行数目
cadence_bom_column_number = len(crystal_bom_input_data_list[1]) #获取列数目
if cadence_bom_raw_number != 0 and cadence_bom_column_number != 0: #保证导入的文件有数据
self.cadence_bom_file_data = crystal_bom_input_data_list #将导入的数据赋值给类变量
#先初始化行号和列号,然后在赋值,否则无效
self.show_ic_bom_form.setRowCount(cadence_bom_raw_number) #设置列表行个数
self.show_ic_bom_form.setColumnCount(cadence_bom_column_number) #设置列表列
#将所要显示的内容添加到对应表格中
for i in range(cadence_bom_raw_number):
cadence_raw_data = self.cadence_bom_file_data[i] #获取行数据
for j in range(cadence_bom_column_number): #有8列数据
newItem = QTableWidgetItem(cadence_raw_data[j])
self.show_ic_bom_form.setItem(i,j,newItem)
# if j != 1:
# self.show_ic_bom_form.setEditTriggers(QAbstractItemView.NoEditTriggers) #设置表格是否可以编辑, 设置编辑规则的枚举值,代表不可以被编辑
self.show_ic_bom_form.resizeColumnsToContents() #将行和列设置为所显示内容的宽度。让行和列设置为自适应宽度模式
self.show_ic_bom_form.resizeRowsToContents() #将行和列的宽度、高度设置为与所显示内容的宽度、高度相匹配
self.show_ic_bom_form.verticalHeader().setVisible(False) #隐藏水平方向的表头
self.show_ic_bom_form.horizontalHeader().setVisible(False) #隐藏垂直方向的表头
# print(0)
self.show_all_mesage.append('BOM信息导入成功')
else:
self.show_all_mesage.append('请导入正确的水晶BOM格式文件!!! BOM 表格后缀格式doc或者docx')
return
# self.cadence_bom_file_data = pd.read_csv(f.name,header=None,keep_default_na= False) #读取cadence软件csv格式的bom.
def doc_file_save_as_docx(self, file_name):
#如果BOm表格是doc格式,则将文件另存为docx,然后再处理
try:
try:
docx_file_name = file_name.replace('doc', "docx")
if os.path.exists(docx_file_name):
return docx_file_name
word = wc.Dispatch('Word.Application')
doc = word.Documents.Open(file_name) # 目标路径下的文件
doc.SaveAs(docx_file_name, 12, False, "", True, "", False, False, False, False) # 转化后路径下的文件
doc.Close()
word.Quit()
except AttributeError as e: #doc 文件转换为 docs 文件时,有出现转换不成功情况。
self.show_all_mesage.append('导入BOM文件出错!!!,请尝试重新导入')
return
except TypeError as e: #如果文件没有关闭则会报错 typeerror
self.show_all_mesage.append('请先关闭文件,再操作!!!!!')
return
return docx_file_name
def config_tip_mounter_pushButton_function(self):
'''
导入bom 表格之后配置料站号,配置好之后才可以点击
'''
if self.cadence_bom_file_data == None: #保证有BOM表格数据导入
self.show_all_mesage.append('请先导入BOM数据,再进行配置料站号')
return
cadence_bom_raw_number = self.show_ic_bom_form.rowCount() #获取Qtablewidet 表格控件的行数
cadence_bom_column_number = self.show_ic_bom_form.columnCount() #获取Qtablewidet 表格控件的列数
if cadence_bom_column_number != 7:
self.show_all_mesage.append('请确认文件格式!!!!')
return
if cadence_bom_raw_number == 0 or cadence_bom_column_number == 0:
self.show_all_mesage.append('BOM数据为空!!!!!,请导入BOM数据')
return
else:
bom_tabel_data = [[] for i in range(cadence_bom_raw_number)] #创建一个 cadence_bom_column_number 行的列表,用于保存表格数据
for i in range(cadence_bom_raw_number):
for j in range(cadence_bom_column_number):
#*************************下述功能最后开放,功能检测已经没有问题***************************************
if 1: #*************************************************************
if self.show_ic_bom_form.item(i,1).text() == '': #如果料站没有配置,则配置完成之后再进行后续操作
self.show_all_mesage.append('第%s行的料站号没有配置,请配置!!!!'%i)
return
if i > 1:
res = re.search('\D', self.show_ic_bom_form.item(i,1).text()) #配置好的料站,保证数据是数字,不是字符串,\D 匹配任意非数字
if res != None:
self.show_all_mesage.append('料站号只能配置数字,请确认第%s行的配置!!!'%i)
return
#保存输入的输入的料站号在1~29和60~99,如果为零则不焊接
# if int(self.show_ic_bom_form.item(i,1).text()) != 0:
# if int(self.show_ic_bom_form.item(i,1).text()) > 99 or (int(self.show_ic_bom_form.item(i,1).text()) > 29 and int(self.show_ic_bom_form.item(i,1).text()) < 60):
# self.show_all_mesage.append('料站号只能配置为大于0小于99,和30~59之间的数字,请确认第%s行的配置!!!'%i)
# return
#根据器件名称,增加料站编码号
bom_tabel_data[i].append((self.show_ic_bom_form.item(i,j).text())) #获取配置好的数据
#相同器件增加,料站使用相同的 料站号标识
# ic_bom_form_data = ic_bom_form_data.split(' ')
# save_bom_tabel_data_list = []
for i in range(0, len(bom_tabel_data)):
ic_bom_form_data = bom_tabel_data[i][2].split(' ')
if i== 0:
ic_name_reverse_data = '料带号编码'
else:
for ic_bom_form in ic_bom_form_data:
if ic_bom_form != '':
ic_name = ic_bom_form
break
ic_name_reverse = copy.deepcopy(ic_name) #为了不改变原始数据,使用深度copy
ic_name_reverse_data = ic_name_reverse[::-1] #将器件名称逆序排序
bom_tabel_data[i].append(ic_name_reverse_data)
# save_bom_tabel_data_list.append([bom_tabel_data[i], ic_name_reverse_data]) #增加料站号编号
# bom_tabel_data[i].append(ic_name_reverse_data)
# print(0)
self.cadence_bom_config_file_data = bom_tabel_data
self.show_all_mesage.append('器件料号位置配置完成')
#
def open_position_file_push_button_function(self):
'''
#打开位置文件文件,并且处理位置文件数据
'''
if 1: #下述功能是为了,保证BOM表格和位置文件都已经导入,并且功能已经测试完成,最后在开放
if self.cadence_bom_file_data == None:
self.show_all_mesage.append('请先导入BOM表格数据!!!')
return
# dlg = QFileDialog(self, '打开文件','./', '*.txt') #设置导入文件的类型
dlg = QFileDialog(self, '打开文件','D:/BOM/', '*.txt') #设置导入文件的类型 打开指定位置文件
# (self, '打开文件','./', '*.doc;;*.docx') #设置导入文件的类型
dlg.setFileMode(QFileDialog.AnyFile) #设置打开文件格式
dlg.setFilter(QDir.Files)
if dlg.exec_():
filenames = dlg.selectedFiles()
f = open(filenames[0], 'r')
#导入文件数据
res = re.search('\.txt',f.name) #保证后缀格式是.txt
if f.name and res != None:
show_txt = (f.name).split('/')[-1]
self.show_position_file_name.setText(show_txt)
cadence_position_file_data = pd.read_csv(f.name,header=None,keep_default_na= False) #读取cadence软件csv格式的bom.
# position_Column = cadence_position_file_data.shape[1] #获取文件有多少行
position_raw = cadence_position_file_data.shape[0] #获取文件有多少行
if position_raw == 0 :
self.show_all_mesage.append('导入的位置文件有问题!!!,请确认文件')
return
cadence_position_list_data = []
title = ['器件编号','横坐标','纵坐标','角度','正反面标识','封装信息','是否焊接']
cadence_position_list_data.append(title) #为了便于知道每一列的含义,特添加表头
ic_x_position_list = []
ic_y_posiiton_list = []
mid_position_data_list = []
#下述循环 为了寻找最大的器件IC坐标
for position_file_raw_data in cadence_position_file_data.values[1:]: ##由于位置文件可能是英寸也可能是毫米,需要将英寸换算成毫米
mid_data = list(position_file_raw_data) #需要将数据先转换为列表再处理
mid_data = mid_data[0].split(' ')
for j in range(len(mid_data)):
# print(mid_data[j])
if mid_data[j] != '':
mid_position_data_list.append(mid_data[j])
if len(mid_position_data_list) != 0:
ic_x_position_list.append(float(copy.deepcopy(mid_position_data_list[1])))
ic_y_posiiton_list.append(float(copy.deepcopy(mid_position_data_list[2])))
mid_position_data_list.clear()
# if unit_flag == 1: #当位置文件是英寸是,需要将坐标文件转换
# index_m = 0
# for index_m in range(len(ic_x_position_list)):
# x_position_mid_data = ic_x_position_list[index_m] / 25.4 #英寸换算毫米
# ic_x_position_list[index_m] = copy.deepcopy(x_position_mid_data)
# y_position_mid_data = ic_y_posiiton_list[index_m] / 25.4 #英寸换算毫米
# ic_y_posiiton_list[index_m] = copy.deepcopy(y_position_mid_data)
ic_max_x_position = max(ic_x_position_list) #x 轴最大坐标
ic_min_x_position = min(ic_x_position_list) #x 轴最小坐标
ic_avr_x_position = (ic_max_x_position + ic_min_x_position) / 2 #镜像处理,如果器件是背面镜像处理
ic_max_y_position = max(ic_y_posiiton_list) #x 轴最大坐标
ic_min_y_position = min(ic_y_posiiton_list) #x 轴最小坐标
ic_avr_y_position = (ic_max_y_position + ic_min_y_position) / 2 #镜像处理
mid_data_list = []
unit_flag = 0 #单位标志位
flag_0 = 0
for position_file_raw_data in cadence_position_file_data.values[0:]: ##由于第一行数单位信息,第一行仅用于识别单位信息
mid_data = list(position_file_raw_data) #需要将数据先转换为列表再处理
mid_data = mid_data[0].split(' ')
if flag_0 == 0: #只允许进来第一次
if mid_data[2] == 'MILS':
unit_flag = 1 #单位标志位,如果是英寸标志位置一 否则为零
flag_0 = 1
continue
for j in range(len(mid_data)):
# print(mid_data[j])
if mid_data[j] != '':
mid_data_list.append(mid_data[j])
if len(mid_data_list) != 0 and unit_flag == 1:
x_position_mid_data = str(format(float(mid_data_list[1]) * 0.0254, ' .3f')) #格式化输出,保留三位小数
y_position_mid_data = str(format(float(mid_data_list[2]) * 0.0254, ' .3f')) #格式化输出,保留三位小数
#此功能是否保留待确认 ************************************************************************************
if float(x_position_mid_data) + 100 > 400 or float(y_position_mid_data) + 100 > 400:
self.show_all_mesage.append('器件%s的坐标超出仪器最大位置,请确认器件位置是否正确'%(mid_data_list[0]))
mid_data_list.clear()
continue
mid_data_list[1] = copy.deepcopy(x_position_mid_data) #如果是mil,使用换算之后的坐标,如果是毫米,则直接使用 mil(中文译音:密耳),即千分之一英寸,等于0.0254mm(毫米)。
mid_data_list[2] = copy.deepcopy(y_position_mid_data) #如果是mil,使用换算之后的坐标,如果是毫米,则直接使用
if len(mid_data_list) == 5:
#此功能是否保留待确认 ************************************************************************************
if float(x_position_mid_data) + 100 > 400 or float(y_position_mid_data) + 100 > 400:
self.show_all_mesage.append('器件%s的坐标超出仪器最大位置,请确认器件位置是否正确'%(mid_data_list[0]))
mid_data_list.clear()
continue
mid_data_list.insert(4,'T') #正面器件 T 标识, X轴坐标不做任何处理
mid_data_list.append("1")
cadence_position_list_data.append(copy.deepcopy(mid_data_list)) #需要使用深度copy
mid_data_list.clear()
elif len(mid_data_list) == 6:
mid_data_list[4] = 'B' #正面器件 B 标识, X轴坐标跟中间值比较,如果大于中间值,坐标减去中间值,如果小于中间值 则加上中间值
#坐标镜像处理
# if float(mid_data_list[1]) < ic_avr_x_position:
# mid_data_list[1] = str(format((ic_avr_x_position * 2 - float(mid_data_list[1])), ' .3f'))
# elif float(mid_data_list[1]) > ic_avr_x_position:
# mid_data_list[1] = str(format((float(mid_data_list[1]) * 2 - ic_avr_x_position), ' .3f'))
#此功能是否保留待确认 ************************************************************************************
if float(x_position_mid_data) + 100 > 400 or float(y_position_mid_data) + 100 > 400:
self.show_all_mesage.append('器件%s的坐标超出仪器最大位置,请确认器件位置是否正确'%(mid_data_list[0]))
mid_data_list.clear()
continue
mid_data_list[1] = str(format((ic_avr_x_position * 2 - float(mid_data_list[1])), ' .3f'))
mid_data_list.append("1")
cadence_position_list_data.append(copy.deepcopy(mid_data_list))
mid_data_list.clear()
elif len(mid_data_list) != 0 and unit_flag == 0: #导入位置文件单位是毫米直接使用
if len(mid_data_list) == 5:
#此功能是否保留待确认 ************************************************************************************
if float(mid_data_list[1]) + 100 > 400 or float(mid_data_list[2]) + 100 > 400:
self.show_all_mesage.append('器件%s的坐标超出仪器最大位置,请确认器件位置是否正确'%(mid_data_list[0]))
mid_data_list.clear()
continue
mid_data_list.insert(4,'T') #正面器件 T 标识, X轴坐标不做任何处理
mid_data_list.append("1")
cadence_position_list_data.append(copy.deepcopy(mid_data_list)) #需要使用深度copy
mid_data_list.clear()
elif len(mid_data_list) == 6:
mid_data_list[4] = 'B' #正面器件 B 标识, X轴坐标跟中间值比较,如果大于中间值,坐标减去中间值,如果小于中间值 则加上中间值
#坐标镜像处理
# if float(mid_data_list[1]) < ic_avr_x_position:
# mid_data_list[1] = str(format((ic_avr_x_position * 2 - float(mid_data_list[1])), ' .3f'))
# elif float(mid_data_list[1]) > ic_avr_x_position:
# mid_data_list[1] = str(format((float(mid_data_list[1]) * 2 - ic_avr_x_position), ' .3f'))
#此功能是否保留带确认 ************************************************************************************
if float(mid_data_list[1]) + 100 > 400 or float(mid_data_list[2]) + 100 > 400:
self.show_all_mesage.append('器件%s的坐标超出仪器最大位置,请确认器件位置是否正确'%(mid_data_list[0]))
mid_data_list.clear()
continue
mid_data_list[1] = str(format((ic_avr_x_position * 2 - float(mid_data_list[1])), ' .3f'))
mid_data_list.append("1")
cadence_position_list_data.append(copy.deepcopy(mid_data_list))
mid_data_list.clear()
else:
self.show_all_mesage.append('位置文件数据不符合正确的格式!!! 请确认')
return
# print(0)
#表格显示信息
if len(cadence_position_list_data) == 0:
self.show_all_mesage.append('导入BOM表格为空,请重新导入')
return
cadence_position_raw_number = len(cadence_position_list_data) #获取行数目
cadence_position_column_number = len(cadence_position_list_data[1]) #获取列数目
if cadence_position_raw_number != 0 and cadence_position_column_number != 0: #保证导入的文件有数据
self.cadence_ic_position_mesage = cadence_position_list_data #将最终位置信息保存
#先初始化行号和列号,然后在赋值,否则无效
self.show_ic_bom_form.setRowCount(cadence_position_raw_number) #设置列表行个数
self.show_ic_bom_form.setColumnCount(cadence_position_column_number) #设置列表列
#将所要显示的内容添加到对应表格中
for i in range(cadence_position_raw_number):
cadence_position_raw_data = cadence_position_list_data[i] #获取行数据
for j in range(cadence_position_column_number): #有8列数据
newItem = QTableWidgetItem(cadence_position_raw_data[j])
self.show_ic_bom_form.setItem(i,j,newItem)
# if j != 1:
# self.show_ic_bom_form.setEditTriggers(QAbstractItemView.NoEditTriggers) #设置表格是否可以编辑, 设置编辑规则的枚举值,代表不可以被编辑
self.show_ic_bom_form.resizeColumnsToContents() #将行和列设置为所显示内容的宽度。让行和列设置为自适应宽度模式
self.show_ic_bom_form.resizeRowsToContents() #将行和列的宽度、高度设置为与所显示内容的宽度、高度相匹配
self.show_ic_bom_form.verticalHeader().setVisible(False) #隐藏水平方向的表头
self.show_ic_bom_form.horizontalHeader().setVisible(False) #隐藏垂直方向的表头
# print(0)
self.show_all_mesage.append('位置文件信息导入成功')
# self.show_all_mesage.append('位置文件信息处理完成')
else:
self.show_all_mesage.append('请导入正确的位置文件!!! 位置文件后缀格式txt')
return
def open_configure_tip_mounter_file_push_button_function(self):
'''
配置贴片机器的吸头信息,
默认情况下在文件路径下有一个文件名称:tip_mounter_mouth.xlsx
文件中存储,贴片机,每一个料带,对应的吸头,表格可以更改
'''
if 1: #下述功能是为了,保证BOM表格和位置文件都已经导入,并且功能已经测试完成,最后在开放
if self.cadence_bom_file_data == None:
self.show_all_mesage.append('请先导入BOM表格数据!!!')
return
elif self.cadence_ic_position_mesage == None:
self.show_all_mesage.append('请先导入器件位置数据!!!')
return
# dlg = QFileDialog(self, '打开文件','./', '*.xlsx') #设置导入文件的类型
dlg = QFileDialog(self, '打开文件','D:/BOM/', '*.xlsx') #设置导入文件的类型 打开制定位置文件
# (self, '打开文件','./', '*.doc;;*.docx') #设置导入文件的类型
dlg.setFileMode(QFileDialog.AnyFile) #设置打开文件格式
dlg.setFilter(QDir.Files)
if dlg.exec_():
filenames = dlg.selectedFiles()
f = open(filenames[0], 'r')
#导入文件数据
res = re.search('\.xlsx',f.name) #保证后缀格式是.txt
if f.name and res != None:
show_txt = (f.name).split('/')[-1]
self.show_tip_mounter_file_name.setText(show_txt)
cadence_tip_mounter_mouth_file_data = pd.read_excel(f.name,header=None,keep_default_na= False) #读取cadence软件csv格式的bom.
position_Column = cadence_tip_mounter_mouth_file_data.shape[1] #获取文件有多少列
position_raw = cadence_tip_mounter_mouth_file_data.shape[0] #获取文件有多少行
if position_raw == 0 :
self.show_all_mesage.append('导入的位置文件有问题!!!,请确认文件')
return
tip_mounter_list_data = []
mid_data_list = []
for position_file_raw_data in cadence_tip_mounter_mouth_file_data.values[:]: ##由于第一行数单位信息,所以直接不读取
mid_data = (list(position_file_raw_data)) #需要将数据先转换为列表再处理
for i in range(2):
mid_data_list.append(mid_data[i])
tip_mounter_list_data.append(copy.deepcopy(mid_data_list)) #保存数据
mid_data_list.clear()
if len(tip_mounter_list_data) == 0:
self.show_all_mesage.append('导入贴片机吸嘴信息有误,请重新导入')
return
cadence_tip_mounter_raw_number = len(tip_mounter_list_data) #获取行数目
cadence_tip_mounter_column_number = len(tip_mounter_list_data[1]) #获取列数目
if cadence_tip_mounter_raw_number != 0 and cadence_tip_mounter_column_number != 0: #保证导入的文件有数据
self.tip_mouth_excel_file_data = tip_mounter_list_data #将最终位置信息保存
#先初始化行号和列号,然后在赋值,否则无效
self.show_ic_bom_form.setRowCount(cadence_tip_mounter_raw_number) #设置列表行个数
self.show_ic_bom_form.setColumnCount(cadence_tip_mounter_column_number) #设置列表列
#将所要显示的内容添加到对应表格中
for i in range(cadence_tip_mounter_raw_number):
cadence_tip_mounter_raw_data = tip_mounter_list_data[i] #获取行数据
for j in range(cadence_tip_mounter_column_number): #有2列数据
newItem = QTableWidgetItem(str(cadence_tip_mounter_raw_data[j])) #表格中只能显示字符串
self.show_ic_bom_form.setItem(i,j,newItem)
self.show_ic_bom_form.resizeColumnsToContents() #将行和列设置为所显示内容的宽度。让行和列设置为自适应宽度模式
self.show_ic_bom_form.resizeRowsToContents() #将行和列的宽度、高度设置为与所显示内容的宽度、高度相匹配
self.show_ic_bom_form.verticalHeader().setVisible(False) #隐藏水平方向的表头
self.show_ic_bom_form.horizontalHeader().setVisible(False) #隐藏垂直方向的表头
# print(0)
self.show_all_mesage.append('贴片机吸嘴信息导入成功')
# self.show_all_mesage.append('贴片机吸嘴配置信息完成')
def configuration_welded_station_push_button_function(self):
'''
函数功能:配置器件是否焊接
'''
if self.cadence_ic_position_mesage == None: #保证位置文件数据导入
self.show_all_mesage.append('请先导入器件位置文件,再进行配置是否焊接')
return
cadence_bom_raw_number = self.show_ic_bom_form.rowCount() #获取Qtablewidet 表格控件的行数
cadence_bom_column_number = self.show_ic_bom_form.columnCount() #获取Qtablewidet 表格控件的列数
if cadence_bom_column_number != 7:
self.show_all_mesage.append('请确认文件格式!!!!')
return
if cadence_bom_raw_number == 0 or cadence_bom_column_number == 0:
self.show_all_mesage.append('位置文件数据为空!!!!!,请导入位置文件数据')
return
else:
position_tabel_data = [[] for i in range(cadence_bom_raw_number)] #创建一个 cadence_bom_column_number 行的列表,用于保存表格数据
for i in range(cadence_bom_raw_number):
for j in range(cadence_bom_column_number):
if i >= 1:
if self.show_ic_bom_form.item(i,6).text() != "1":
if self.show_ic_bom_form.item(i,6).text() != "0":
self.show_all_mesage.append("是否焊接只能配置为0或者1,请重新配置数据!!!")
return
position_tabel_data[i].append(self.show_ic_bom_form.item(i,j).text()) #获取配置好的数据
self.save_config_welded_station_data = position_tabel_data
self.show_all_mesage.append('配置器件焊接状态数据成功')
def configure_tip_mounter_station_push_button_function(self):
'''
配置器件吸嘴型号
'''
if self.tip_mouth_excel_file_data == None: #保证位置文件数据导入
self.show_all_mesage.append('请先导入贴片机吸盘配置文件')
return
cadence_bom_raw_number = self.show_ic_bom_form.rowCount() #获取Qtablewidet 表格控件的行数
cadence_bom_column_number = self.show_ic_bom_form.columnCount() #获取Qtablewidet 表格控件的列数
if cadence_bom_column_number != 2:
self.show_all_mesage.append('请确认文件格式!!!!')
return
if cadence_bom_raw_number == 0 or cadence_bom_column_number == 0:
self.show_all_mesage.append('贴片机吸盘配置文件为空!!!请确认文件')
return
else:
tip_mouth_tabel_data = [[] for i in range(cadence_bom_raw_number)] #创建一个 cadence_bom_column_number 行的列表,用于保存表格数据
for i in range(cadence_bom_raw_number):
for j in range(cadence_bom_column_number):
if i >= 1:
if self.show_ic_bom_form.item(i,1).text() != "1":
if self.show_ic_bom_form.item(i,1).text() != "2":
self.show_all_mesage.append("贴片机吸盘只能配置为1或者2,请重新配置数据!!!")
return
tip_mouth_tabel_data[i].append(self.show_ic_bom_form.item(i,j).text()) #获取配置好的数据
self.save_config_tip_mounter_data = tip_mouth_tabel_data
self.show_all_mesage.append('配置器件焊接状态数据成功')
def configuration_and_generate_file_function(self):
'''
# 将所有的配置好的数据,按照规定格式生成 lpv格式文件
# 打开位置文件文件,并且处理位置文件数据
'''
if self.cadence_bom_file_data == None: #保存导入BOM文件的数据
self.show_all_mesage.append('请先导入BOM文件!!!')
return
elif self.cadence_bom_config_file_data == None: #配置器件的料站号
self.show_all_mesage.append('请先配置器件的料站号!!!')
return
elif self.cadence_ic_position_mesage == None: #保存导入BOM文件的数据
self.show_all_mesage.append('请先导入器件的位置文件!!!')
return
elif self.tip_mouth_excel_file_data == None: #保存导入BOM文件的数据
self.show_all_mesage.append('请先导入贴片机吸头的配置文件!!!')
return
elif self.save_config_welded_station_data == None: #保存配号是否焊接的数据
self.show_all_mesage.append('请先配置是否焊接!!!')
return
elif self.save_config_tip_mounter_data == None: #保存配置好的吸盘类型
self.show_all_mesage.append('请先配置吸盘类型!!!')
return
first_part_file_config_message_block = []
#第一块文件信息列表
if self.project_name != None:
first_part_file_config_message_block.append('separated')
first_part_file_config_message_block.append('FILE,%s'%(self.project_name)) #文件信息
first_part_file_config_message_block.append('PCBFILE,%s'%(self.project_name)) #文件信息
first_part_file_config_message_block.append('DATE,%s'%(time.strftime('%Y/%m/%d',time.localtime(time.time())))) #日期
first_part_file_config_message_block.append('TIME,%s'%(time.strftime('%H:%M:%S',time.localtime(time.time())))) #时间信息
first_part_file_config_message_block.append('PANELYPE,0') #其他信息,具体含义,还不清楚
first_part_file_config_message_block.append(' ')
else:
self.show_all_mesage.append('工程文件名称为空!!,请确认')
return
#用于保存第二部分数据
second_part_file_config_message_block = []
second_title = ["Table,No,ID.,DeltX,DeltY,FeedRates,Note,Height,Speed,Status,SizeX,SizeY"] #第二部分表头信息
# second_title = eval(second_title)
second_part_file_config_message_block.append(second_title) #添加表头信息
#用于保存第四部数据
fourth_part_file_config_message_block = []
fourth_title = ["Table,No,ID.,PHead,STNo.,DeltX,DeltY,Angle,Height,Skip,Speed,Explain,Note"] #第四部分表头信息
fourth_part_file_config_message_block.append(fourth_title)
first_anchor_point = self.positioning_ic_1.text() #第一个定位点,默认为空
second_ancher_point = self.positioning_ic_2.text() #第二个定位点,默认为空
first_anchor_point_position = [] #保存定位点的位置
second_ancher_point_position = [] #保存定点点的位置
#从位置文件和BOM数据,获取信息,
k = 0
flag_1 = 0
flag_2 = 0
for i in range(1,len(self.cadence_ic_position_mesage)): #去除表头信息,所以从1开始
# for j in range(len(self.cadence_ic_position_mesage[i])):
ic_name = self.cadence_ic_position_mesage[i][0] #取出器件的名称
positon_mid_data = self.cadence_ic_position_mesage[i]
flag = 0
for j in range(1,len(self.cadence_bom_config_file_data)): #去除表头信息,所以从1开始 ,遍历BOM 表格 IC name
bom_ic_name_mid_data = copy.deepcopy(self.cadence_bom_config_file_data[j][2]) #为了避免改变原先数据,使用深度copy
bom_ic_name_mid_data = bom_ic_name_mid_data.split(' ')
for m in range(len(bom_ic_name_mid_data)):
if ic_name == bom_ic_name_mid_data[m]:
bom_mid_data = self.cadence_bom_config_file_data[j] #根据器件名称查找器件
flag = 1
break
if positon_mid_data[0] == first_anchor_point: #获取第一个位置点坐标
first_anchor_point_mid_data = ["CalibPoint",1,k,positon_mid_data[1],positon_mid_data[2],ic_name]
first_anchor_point_position.append(first_anchor_point_mid_data)
flag_1 = 1
if positon_mid_data[0] == second_ancher_point: #获取第二个位置点坐标
second_ancher_point_mid_data = ["CalibPoint",1,k,positon_mid_data[1],positon_mid_data[2],ic_name]
second_ancher_point_position.append(second_ancher_point_mid_data)
flag_2 = 1
if flag == 1:
ic_name_reverse = copy.deepcopy(ic_name) #为了不改变原始数据,使用深度copy
ic_name_reverse_data = ic_name_reverse[::-1] #将器件名称逆序排序
skip = 0
if positon_mid_data[6] == "1": #是否焊接 5为焊接 0为不焊接
skip = 4
# elif bom_mid_data[1] == 0:
# skip = 0 #器件是否焊接
else:
skip = 6
#角度大于180读时需要角度值减去180读,
angle = float(positon_mid_data[3])
if angle > 180:
angle = angle -360
material_station_number = bom_mid_data[1] #器件料站号
if bom_mid_data[1] == '79': #79是默认料站号
ic_name_reverse_data = '79' #后续不允许使用79料站号
skip = 6 #如果;料带号为79则器件不焊接
else:
ic_name_reverse_data = bom_mid_data[7] #料带号
#按照第四部分格式化输出数据 料站号 X坐标 y 坐标 角度 高度 skip 速度(他俩顺序需要确定) 器件名称 器件名称逆序 延时
fourth_block_mid_data = ["EComponent",k,k+1,1,material_station_number,positon_mid_data[1],positon_mid_data[2],angle,0.5,skip,0,ic_name,ic_name_reverse_data] #
# fourth_block_mid_data = eval(fourth_block_mid_data)
fourth_part_file_config_message_block.append(fourth_block_mid_data)
#按照第二部分格式化输出数据 料站号
#是否焊接
second_block_mid_data = ["Station",k,bom_mid_data[1],0,0,2,ic_name_reverse_data,0.5,0,8,0,0] #
# second_block_mid_data = eval(second_block_mid_data)
second_part_file_config_message_block.append(second_block_mid_data)
k += 1
second_part_file_config_message_block_list = []
second_title = ["Table,No,ID.,DeltX,DeltY,FeedRates,Note,Height,Speed,Status,SizeX,SizeY"] #第二部分表头信息
# second_title = eval(second_title)
second_part_file_config_message_block_list.append(second_title) #添加表头信息
flag_3 = 0
# flag_4 = 0
for i in range(1,len(second_part_file_config_message_block)-1):
for j in range(i+1,len(second_part_file_config_message_block)):
if second_part_file_config_message_block[i] != '':
if second_part_file_config_message_block[i][6] == second_part_file_config_message_block[j][6]:
# second_part_file_config_message_block_list.append(second_part_file_config_message_block[i])
# del second_part_file_config_message_block[j]
flag_3 += 1
# else:
# flag_4 += 1
if flag_3 == 0:
second_part_file_config_message_block_list.append(second_part_file_config_message_block[i])
flag_3 = 0
else:
flag_3 = 0
#用于保存第三部数据
third_part_file_config_message_block = []
third_title = "Table,No.,ID,DeltX,DeltY"
third_part_file_config_message_block.append(third_title)
third_title = "Panel_Coord,0,1,0,0"
third_part_file_config_message_block.append(third_title)
#用于保存第五部数据
fifth_part_file_config_message_block = []
fifth_title = "Table,No.,ID,CenterX,CenterY,IntervalX,IntervalY,NumX,NumY,Start"
fifth_part_file_config_message_block.append(fifth_title)
fifth_part_file_config_message_block.append(" ")
fifth_part_file_config_message_block.append(" ")
fifth_title_0 = "Table,No.,nType,nAlg,nFinished"
fifth_part_file_config_message_block.append(fifth_title_0)
fifth_part_file_config_message_block.append("PcbCalib,0,0,0,0")
fifth_title_1 = "Table,No.,ID,offsetX,offsetY,Note"
fifth_part_file_config_message_block.append(fifth_title_1)
#下面数据,要根据 positioning_ic_1 和 positioning_ic_2 的器件填写,先查找器件的位置信息,然后在查询位置信息,
#功能待完善
# if first_anchor_point != '' and flag_1 == 0:
# self.show_all_mesage.append('IC 位置1 配置有问题,请确认!!!!!!!!')
# return
# if second_ancher_point != '' and flag_2 == 0:
# self.show_all_mesage.append('IC 位置2 配置有问题,请确认!!!!!!!!')
# return
if first_anchor_point != '' and flag_1 == 0:
fifth_title_2 = "CalibPoint,0,0,0,0"
fifth_part_file_config_message_block.append(fifth_title_2)
self.show_all_mesage.append('IC 位置1 配置有问题,请确认!!!!!!!!')
return
else:
fifth_part_file_config_message_block.append(first_anchor_point_position)
if second_ancher_point != '' and flag_2 == 0: #待处理
fifth_title_2 = "CalibPoint,0,0,0,0"
fifth_part_file_config_message_block.append(fifth_title_2)
self.show_all_mesage.append('IC 位置2 配置有问题,请确认!!!!!!!!')
return
else:
fifth_part_file_config_message_block.append(second_ancher_point_position)
fifth_title_3 = 'Table,No.,DeltX,DeltY,AlphaX,AlphaY,BetaX,BetaY,DeltaAngle'
fifth_part_file_config_message_block.append(fifth_title_3)
all_save_data = []
all_save_data.extend(first_part_file_config_message_block)
all_save_data.extend(second_part_file_config_message_block_list)
all_save_data.extend(' ')
all_save_data.extend(third_part_file_config_message_block)
all_save_data.extend(' ')
all_save_data.extend(fourth_part_file_config_message_block)
all_save_data.extend(' ')
all_save_data.extend(fifth_part_file_config_message_block)
all_save_data.extend(' ')
#下述为了去除列表中的方括号
# all_save_data_list = []
# for i in range(len(all_save_data)):
# if type(all_save_data[i]) == list :
# if len(all_save_data[i]) > 0:
# print(i)
# all_save_data_list.append(copy.deepcopy(all_save_data[i][0]))
# else:
# all_save_data_list.append(all_save_data)
save_all_data_to_file= pd.DataFrame(all_save_data)
#文件名称中不能有点号存在
res = re.search('.',self.project_name)
if res!= None:
project_name = (self.project_name).replace('.', '')
else:
project_name = self.project_name
#***************************文件生产位置*************************************************************************
try:
file_path = 'D:/CHJD_SMT/Files' #电脑目录,最后使用
save_path_last = file_path + '\\' + project_name + '.dpv'
save_all_data_to_file.to_csv(save_path_last, index = False, header = False)
except FileNotFoundError:
file_path = os.getcwd()
save_path_last = file_path + '\\' + project_name + '.dpv'
save_all_data_to_file.to_csv(save_path_last, index = False, header = False)
#***************************文件生产位置*************************************************************************
all_save_data_list = []
with open(save_path_last,'r') as f:
line_data = f.readlines()
# line_data = ''.join(line_data).strip('\n') #去除读入文件 \n
for raw_data in line_data:
# print(raw_data)
mid_data = copy.deepcopy(raw_data)
res = re.search('\'',mid_data)
if res != None:
mid_data = mid_data.replace('\'', ' ')
all_save_data_list.append(mid_data[:])
all_save_data_list_1 = []
for raw_data in all_save_data_list:
mid_data = copy.deepcopy(raw_data)
res = re.search('"',mid_data)
if res != None:
mid_data = mid_data.replace('"', ' ')
all_save_data_list_1.append(mid_data)
all_save_data_list_2 = []
for raw_data in all_save_data_list_1:
mid_data = copy.deepcopy(raw_data)
res = re.search('\[',mid_data)
if res != None:
mid_data = mid_data.replace('[', ' ')
all_save_data_list_2.append(mid_data)
all_save_data_list_3 = []
for raw_data in all_save_data_list_2:
mid_data = copy.deepcopy(raw_data)
res = re.search('\]',mid_data)
if res != None:
mid_data = mid_data.replace(']', ' ')
all_save_data_list_3.append(mid_data)
all_save_data_list_4 = []
for raw_data in all_save_data_list_3:
mid_data = copy.deepcopy(raw_data)
res = re.search(' ',mid_data)
if res != None:
mid_data = mid_data.replace(' ', '')
all_save_data_list_4.append(mid_data)
# save_all_data_to_file= pd.DataFrame(all_save_data_list_4)
# save_path_last = os.getcwd() + project_name + '.dpv'
# save_all_data_to_file.to_csv(save_path_last, index = False, header = False)
save_path_last = file_path + '\\' + project_name +'.dpv'
np.savetxt(save_path_last, all_save_data_list_4, fmt = '%s')
self.show_all_mesage.append('配置文件生成成功')
if __name__ == "__main__":
app = QApplication([])
example = Table()
example.show()
app.exec_()
UI程序
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'mounter_qt_20210623.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1276, 771)
MainWindow.setMaximumSize(QtCore.QSize(1276, 771))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
self.layoutWidget.setGeometry(QtCore.QRect(30, 20, 921, 661))
self.layoutWidget.setObjectName("layoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.label_4 = QtWidgets.QLabel(self.layoutWidget)
self.label_4.setMaximumSize(QtCore.QSize(16777215, 16777215))
font = QtGui.QFont()
font.setPointSize(20)
font.setBold(True)
font.setWeight(75)
self.label_4.setFont(font)
self.label_4.setAlignment(QtCore.Qt.AlignCenter)
self.label_4.setObjectName("label_4")
self.verticalLayout.addWidget(self.label_4)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self.layoutWidget)
self.label.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.show_bom_file_name = QtWidgets.QLineEdit(self.layoutWidget)
self.show_bom_file_name.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.show_bom_file_name.setText("")
self.show_bom_file_name.setReadOnly(True)
self.show_bom_file_name.setObjectName("show_bom_file_name")
self.horizontalLayout.addWidget(self.show_bom_file_name)
self.open_bom_file_push_button = QtWidgets.QPushButton(self.layoutWidget)
self.open_bom_file_push_button.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.open_bom_file_push_button.setObjectName("open_bom_file_push_button")
self.horizontalLayout.addWidget(self.open_bom_file_push_button)
self.verticalLayout.addLayout(self.horizontalLayout)
self.label_2 = QtWidgets.QLabel(self.layoutWidget)
self.label_2.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.verticalLayout.addWidget(self.label_2)
self.show_ic_bom_form = QtWidgets.QTableWidget(self.layoutWidget)
self.show_ic_bom_form.setObjectName("show_ic_bom_form")
self.show_ic_bom_form.setColumnCount(0)
self.show_ic_bom_form.setRowCount(0)
self.verticalLayout.addWidget(self.show_ic_bom_form)
self.layoutWidget1 = QtWidgets.QWidget(self.centralwidget)
self.layoutWidget1.setGeometry(QtCore.QRect(960, 20, 271, 691))
self.layoutWidget1.setObjectName("layoutWidget1")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget1)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.label_3 = QtWidgets.QLabel(self.layoutWidget1)
self.label_3.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.label_3.setAlignment(QtCore.Qt.AlignCenter)
self.label_3.setObjectName("label_3")
self.verticalLayout_2.addWidget(self.label_3)
self.show_position_file_name = QtWidgets.QLineEdit(self.layoutWidget1)
self.show_position_file_name.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.show_position_file_name.setText("")
self.show_position_file_name.setReadOnly(True)
self.show_position_file_name.setObjectName("show_position_file_name")
self.verticalLayout_2.addWidget(self.show_position_file_name)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_10 = QtWidgets.QLabel(self.layoutWidget1)
self.label_10.setMaximumSize(QtCore.QSize(16777215, 16777215))
font = QtGui.QFont()
font.setPointSize(20)
font.setBold(True)
font.setWeight(75)
self.label_10.setFont(font)
self.label_10.setAlignment(QtCore.Qt.AlignCenter)
self.label_10.setObjectName("label_10")
self.horizontalLayout_2.addWidget(self.label_10)
self.open_position_file_push_button = QtWidgets.QPushButton(self.layoutWidget1)
self.open_position_file_push_button.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.open_position_file_push_button.setObjectName("open_position_file_push_button")
self.horizontalLayout_2.addWidget(self.open_position_file_push_button)
self.verticalLayout_2.addLayout(self.horizontalLayout_2)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.label_11 = QtWidgets.QLabel(self.layoutWidget1)
self.label_11.setMaximumSize(QtCore.QSize(16777215, 16777215))
font = QtGui.QFont()
font.setPointSize(20)
font.setBold(True)
font.setWeight(75)
self.label_11.setFont(font)
self.label_11.setAlignment(QtCore.Qt.AlignCenter)
self.label_11.setObjectName("label_11")
self.horizontalLayout_3.addWidget(self.label_11)
self.configuration_welded_station_push_button = QtWidgets.QPushButton(self.layoutWidget1)
self.configuration_welded_station_push_button.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.configuration_welded_station_push_button.setObjectName("configuration_welded_station_push_button")
self.horizontalLayout_3.addWidget(self.configuration_welded_station_push_button)
self.verticalLayout_2.addLayout(self.horizontalLayout_3)
self.label_8 = QtWidgets.QLabel(self.layoutWidget1)
self.label_8.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.label_8.setAlignment(QtCore.Qt.AlignCenter)
self.label_8.setObjectName("label_8")
self.verticalLayout_2.addWidget(self.label_8)
self.show_tip_mounter_file_name = QtWidgets.QLineEdit(self.layoutWidget1)
self.show_tip_mounter_file_name.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.show_tip_mounter_file_name.setText("")
self.show_tip_mounter_file_name.setReadOnly(True)
self.show_tip_mounter_file_name.setObjectName("show_tip_mounter_file_name")
self.verticalLayout_2.addWidget(self.show_tip_mounter_file_name)
self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.label_12 = QtWidgets.QLabel(self.layoutWidget1)
self.label_12.setMaximumSize(QtCore.QSize(16777215, 16777215))
font = QtGui.QFont()
font.setPointSize(20)
font.setBold(True)
font.setWeight(75)
self.label_12.setFont(font)
self.label_12.setAlignment(QtCore.Qt.AlignCenter)
self.label_12.setObjectName("label_12")
self.horizontalLayout_4.addWidget(self.label_12)
self.open_configure_tip_mounter_file_push_button = QtWidgets.QPushButton(self.layoutWidget1)
self.open_configure_tip_mounter_file_push_button.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.open_configure_tip_mounter_file_push_button.setObjectName("open_configure_tip_mounter_file_push_button")
self.horizontalLayout_4.addWidget(self.open_configure_tip_mounter_file_push_button)
self.verticalLayout_2.addLayout(self.horizontalLayout_4)
self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
self.horizontalLayout_7.setObjectName("horizontalLayout_7")
self.label_13 = QtWidgets.QLabel(self.layoutWidget1)
self.label_13.setMaximumSize(QtCore.QSize(16777215, 16777215))
font = QtGui.QFont()
font.setPointSize(20)
font.setBold(True)
font.setWeight(75)
self.label_13.setFont(font)
self.label_13.setAlignment(QtCore.Qt.AlignCenter)
self.label_13.setObjectName("label_13")
self.horizontalLayout_7.addWidget(self.label_13)
self.configure_tip_mounter_station_push_button = QtWidgets.QPushButton(self.layoutWidget1)
self.configure_tip_mounter_station_push_button.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.configure_tip_mounter_station_push_button.setObjectName("configure_tip_mounter_station_push_button")
self.horizontalLayout_7.addWidget(self.configure_tip_mounter_station_push_button)
self.verticalLayout_2.addLayout(self.horizontalLayout_7)
self.label_14 = QtWidgets.QLabel(self.layoutWidget1)
self.label_14.setMaximumSize(QtCore.QSize(16777215, 16777215))
font = QtGui.QFont()
font.setPointSize(20)
font.setBold(True)
font.setWeight(75)
self.label_14.setFont(font)
self.label_14.setAlignment(QtCore.Qt.AlignCenter)
self.label_14.setObjectName("label_14")
self.verticalLayout_2.addWidget(self.label_14)
self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.label_15 = QtWidgets.QLabel(self.layoutWidget1)
self.label_15.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.label_15.setObjectName("label_15")
self.horizontalLayout_5.addWidget(self.label_15)
self.positioning_ic_1 = QtWidgets.QLineEdit(self.layoutWidget1)
self.positioning_ic_1.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.positioning_ic_1.setText("")
self.positioning_ic_1.setAlignment(QtCore.Qt.AlignCenter)
self.positioning_ic_1.setReadOnly(False)
self.positioning_ic_1.setObjectName("positioning_ic_1")
self.horizontalLayout_5.addWidget(self.positioning_ic_1)
self.verticalLayout_2.addLayout(self.horizontalLayout_5)
self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
self.horizontalLayout_6.setObjectName("horizontalLayout_6")
self.label_6 = QtWidgets.QLabel(self.layoutWidget1)
self.label_6.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.label_6.setObjectName("label_6")
self.horizontalLayout_6.addWidget(self.label_6)
self.positioning_ic_2 = QtWidgets.QLineEdit(self.layoutWidget1)
self.positioning_ic_2.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.positioning_ic_2.setText("")
self.positioning_ic_2.setAlignment(QtCore.Qt.AlignCenter)
self.positioning_ic_2.setReadOnly(False)
self.positioning_ic_2.setObjectName("positioning_ic_2")
self.horizontalLayout_6.addWidget(self.positioning_ic_2)
self.verticalLayout_2.addLayout(self.horizontalLayout_6)
self.label_7 = QtWidgets.QLabel(self.layoutWidget1)
self.label_7.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.label_7.setAlignment(QtCore.Qt.AlignCenter)
self.label_7.setObjectName("label_7")
self.verticalLayout_2.addWidget(self.label_7)
self.show_all_mesage = QtWidgets.QTextBrowser(self.layoutWidget1)
self.show_all_mesage.setObjectName("show_all_mesage")
self.verticalLayout_2.addWidget(self.show_all_mesage)
self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
self.horizontalLayout_8.setObjectName("horizontalLayout_8")
self.label_16 = QtWidgets.QLabel(self.layoutWidget1)
self.label_16.setMaximumSize(QtCore.QSize(16777215, 16777215))
font = QtGui.QFont()
font.setPointSize(20)
font.setBold(True)
font.setWeight(75)
self.label_16.setFont(font)
self.label_16.setAlignment(QtCore.Qt.AlignCenter)
self.label_16.setObjectName("label_16")
self.horizontalLayout_8.addWidget(self.label_16)
self.configuration_and_generate_file = QtWidgets.QPushButton(self.layoutWidget1)
self.configuration_and_generate_file.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.configuration_and_generate_file.setObjectName("configuration_and_generate_file")
self.horizontalLayout_8.addWidget(self.configuration_and_generate_file)
self.verticalLayout_2.addLayout(self.horizontalLayout_8)
self.layoutWidget2 = QtWidgets.QWidget(self.centralwidget)
self.layoutWidget2.setGeometry(QtCore.QRect(750, 680, 201, 41))
self.layoutWidget2.setObjectName("layoutWidget2")
self.horizontalLayout_9 = QtWidgets.QHBoxLayout(self.layoutWidget2)
self.horizontalLayout_9.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_9.setObjectName("horizontalLayout_9")
self.label_9 = QtWidgets.QLabel(self.layoutWidget2)
self.label_9.setMaximumSize(QtCore.QSize(16777215, 16777215))
font = QtGui.QFont()
font.setPointSize(20)
font.setBold(True)
font.setWeight(75)
self.label_9.setFont(font)
self.label_9.setAlignment(QtCore.Qt.AlignCenter)
self.label_9.setObjectName("label_9")
self.horizontalLayout_9.addWidget(self.label_9)
self.config_tip_mounter_pushButton = QtWidgets.QPushButton(self.layoutWidget2)
self.config_tip_mounter_pushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.config_tip_mounter_pushButton.setObjectName("config_tip_mounter_pushButton")
self.horizontalLayout_9.addWidget(self.config_tip_mounter_pushButton)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1276, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label_4.setText(_translate("MainWindow", "步骤1"))
self.label.setText(_translate("MainWindow", "BOM文件名称"))
self.open_bom_file_push_button.setText(_translate("MainWindow", "打开BOM文件"))
self.label_2.setText(_translate("MainWindow", "请在下表配置信息"))
self.label_3.setText(_translate("MainWindow", "位置文件名称"))
self.label_10.setText(_translate("MainWindow", "步骤3"))
self.open_position_file_push_button.setText(_translate("MainWindow", "打开器件位置文件"))
self.label_11.setText(_translate("MainWindow", "步骤4"))
self.configuration_welded_station_push_button.setText(_translate("MainWindow", "配置位置文件"))
self.label_8.setText(_translate("MainWindow", "贴片机吸盘文件名称"))
self.label_12.setText(_translate("MainWindow", "步骤5"))
self.open_configure_tip_mounter_file_push_button.setText(_translate("MainWindow", "打开贴片机吸盘文件"))
self.label_13.setText(_translate("MainWindow", "步骤6"))
self.configure_tip_mounter_station_push_button.setText(_translate("MainWindow", "配置贴片机吸盘文件"))
self.label_14.setText(_translate("MainWindow", "步骤7 选配"))
self.label_15.setText(_translate("MainWindow", "定位器件1 "))
self.label_6.setText(_translate("MainWindow", "定位器件2 "))
self.label_7.setText(_translate("MainWindow", "信息显示"))
self.label_16.setText(_translate("MainWindow", "步骤8"))
self.configuration_and_generate_file.setText(_translate("MainWindow", "生成文件"))
self.label_9.setText(_translate("MainWindow", "步骤2"))
self.config_tip_mounter_pushButton.setText(_translate("MainWindow", "配置料号"))
UI源码
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1253</width>
<height>771</height>
</rect>
</property>
<property name="maximumSize">
<size>
<width>1276</width>
<height>771</height>
</size>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>30</x>
<y>20</y>
<width>921</width>
<height>661</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label_4">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>步骤1</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>BOM文件名称</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="show_bom_file_name">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="open_bom_file_push_button">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>打开BOM文件</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>请在下表配置信息</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QTableWidget" name="show_ic_bom_form"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>960</x>
<y>20</y>
<width>271</width>
<height>691</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_3">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>位置文件名称</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="show_position_file_name">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_10">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>步骤3</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="open_position_file_push_button">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>打开器件位置文件</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_11">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>步骤4</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="configuration_welded_station_push_button">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>配置位置文件</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_8">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>贴片机吸盘文件名称</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="show_tip_mounter_file_name">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_12">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>步骤5</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="open_configure_tip_mounter_file_push_button">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>打开贴片机吸盘文件</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QLabel" name="label_13">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>步骤6</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="configure_tip_mounter_station_push_button">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>配置贴片机吸盘文件</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_14">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>步骤7 选配</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_15">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>定位器件1 </string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="positioning_ic_1">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLabel" name="label_6">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>定位器件2 </string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="positioning_ic_2">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_7">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>信息显示</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QTextBrowser" name="show_all_mesage"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<widget class="QLabel" name="label_16">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>步骤8</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="configuration_and_generate_file">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>生成文件</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>750</x>
<y>680</y>
<width>201</width>
<height>41</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_9">
<item>
<widget class="QLabel" name="label_9">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>步骤2</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="config_tip_mounter_pushButton">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>配置料号</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1253</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>