增加预安装供料器功能、路径规划模型支持单点、整线优化支持批量处理
This commit is contained in:
@ -3,32 +3,36 @@ import copy
|
||||
from base_optimizer.optimizer_common import *
|
||||
|
||||
|
||||
def load_data(filename: str, load_feeder=True, auto_register=True):
|
||||
def load_data(filename: str, load_feeder=False, auto_register=True):
|
||||
filename = 'data/' + filename
|
||||
part_content, step_content = False, False
|
||||
part_start_line, step_start_line, part_end_line, step_end_line = -1, -1, -1, -1
|
||||
part_content, step_content, feeder_content = False, False, False
|
||||
part_start_line, step_start_line, feeder_start_line = -1, -1, -1
|
||||
part_end_line, step_end_line, feeder_end_line = -1, -1, -1
|
||||
|
||||
line_counter = 0
|
||||
with open(filename, 'r') as file:
|
||||
line = file.readline()
|
||||
while line:
|
||||
if line == '[Part]\n':
|
||||
part_content = True
|
||||
part_start_line = line_counter
|
||||
part_content, part_start_line = True, line_counter
|
||||
elif line == '[Step]\n':
|
||||
step_content = True
|
||||
step_start_line = line_counter
|
||||
step_content, step_start_line = True, line_counter
|
||||
elif line == '[Feeder]\n':
|
||||
feeder_content, feeder_start_line = True, line_counter
|
||||
elif line == '\n':
|
||||
if part_content:
|
||||
part_content = False
|
||||
part_end_line = line_counter
|
||||
part_content, part_end_line = False, line_counter
|
||||
elif step_content:
|
||||
step_content = False
|
||||
step_end_line = line_counter
|
||||
step_content, step_end_line = False, line_counter
|
||||
elif feeder_content:
|
||||
feeder_content, feeder_end_line = False, line_counter
|
||||
line_counter += 1
|
||||
line = file.readline()
|
||||
|
||||
if part_content:
|
||||
part_end_line = line_counter
|
||||
elif feeder_content:
|
||||
feeder_end_line = line_counter
|
||||
else:
|
||||
step_end_line = line_counter
|
||||
|
||||
@ -64,7 +68,8 @@ def load_data(filename: str, load_feeder=True, auto_register=True):
|
||||
machine_index = machine_name[data['machine']]
|
||||
else:
|
||||
machine_index = 0
|
||||
pcb_data[machine_index] = pcb_data[machine_index]._append(data[step_col], ignore_index=True)
|
||||
# pcb_data[machine_index] = pcb_data[machine_index]._append(data[step_col], ignore_index=True)
|
||||
pcb_data[machine_index] = pd.concat([pcb_data[machine_index], pd.DataFrame(data[step_col]).T], ignore_index=True)
|
||||
|
||||
part_col = ["part", "fdr", "nz", 'fdn']
|
||||
try:
|
||||
@ -121,8 +126,10 @@ def load_data(filename: str, load_feeder=True, auto_register=True):
|
||||
part_index = component_data[machine_index][component_data[machine_index].part == data.part].index.tolist()[
|
||||
0]
|
||||
if component_data[machine_index].loc[part_index].nz != data.nz:
|
||||
component_data[machine_index].loc[part_index].nz = data.nz
|
||||
warning_info = 'the nozzle type of component ' + data.part + ' is not consistent with the pcb data'
|
||||
warnings.warn(warning_info, UserWarning)
|
||||
component_data[machine_index].loc[part_index].fdr = data.fdr
|
||||
|
||||
if data.fdn == 0:
|
||||
continue
|
||||
@ -140,24 +147,21 @@ def load_data(filename: str, load_feeder=True, auto_register=True):
|
||||
# pcb_data[machine_index].reset_index(inplace=True)
|
||||
|
||||
# 读取供料器基座数据
|
||||
feeder_data = defaultdict(pd.DataFrame)
|
||||
feeder_columns = ['slot', 'part']
|
||||
if load_feeder:
|
||||
feeder_columns = ['slot', 'part', 'arg']
|
||||
for machine_index in range(machine_num):
|
||||
feeder_data[machine_index] = pd.DataFrame(columns=feeder_columns) # arg表示是否为预分配,不表示分配数目
|
||||
for _, data in pcb_data[machine_index].iterrows():
|
||||
slot, part = data['fdr'].split(' ')
|
||||
if slot[0] != 'F' and slot[0] != 'R':
|
||||
continue
|
||||
slot = int(slot[1:]) if slot[0] == 'F' else int(slot[1:]) + max_slot_index // 2
|
||||
feeder_data[machine_index] = pd.concat([feeder_data[machine_index], pd.DataFrame([slot, part, 1], index=feeder_columns).T], ignore_index=True)
|
||||
|
||||
feeder_data[machine_index].drop_duplicates(subset='slot', inplace=True, ignore_index=True)
|
||||
# 随机移除部分已安装的供料器
|
||||
# drop_index = random.sample(list(range(len(feeder_data))), len(feeder_data) // 2)
|
||||
# feeder_data[machine_index].drop(index=drop_index, inplace=True)
|
||||
|
||||
feeder_data[machine_index].sort_values(by='slot', ascending=True, inplace=True, ignore_index=True)
|
||||
try:
|
||||
if feeder_start_line != -1:
|
||||
feeder_data = pd.DataFrame(
|
||||
pd.read_csv(filepath_or_buffer=filename, sep='\t', header=None, skiprows=feeder_start_line + 1,
|
||||
nrows=feeder_end_line - feeder_start_line - 1))
|
||||
feeder_data.columns = feeder_columns
|
||||
else:
|
||||
feeder_data = pd.DataFrame(columns=feeder_columns)
|
||||
except:
|
||||
feeder_data = pd.DataFrame(columns=feeder_columns)
|
||||
else:
|
||||
feeder_data = pd.DataFrame(columns=feeder_columns)
|
||||
feeder_data.sort_values(by='slot', ascending=True, inplace=True, ignore_index=True)
|
||||
|
||||
return pcb_data, component_data, feeder_data
|
||||
|
||||
|
Reference in New Issue
Block a user