|
|
|
|
@ -1,6 +1,7 @@
@@ -1,6 +1,7 @@
|
|
|
|
|
import os, sys, bpy, math, time, platform, cairosvg, ppf.datamatrix, shutil, requests, json, redis, oss2, cv2,qrcode |
|
|
|
|
from retrying import retry |
|
|
|
|
import subprocess |
|
|
|
|
import multiprocessing |
|
|
|
|
import random |
|
|
|
|
import numpy as np |
|
|
|
|
import matplotlib.pyplot as plt |
|
|
|
|
@ -403,48 +404,9 @@ def remove_gray_and_sharpening(jpg_path):
@@ -403,48 +404,9 @@ def remove_gray_and_sharpening(jpg_path):
|
|
|
|
|
# show_histogram(input_image, img_id, low_x_thresh, high_x_thresh) |
|
|
|
|
cv2.imwrite(jpg_path, high_output_image, [cv2.IMWRITE_JPEG_QUALITY, 95]) # 保存图片的质量是原图的 95% |
|
|
|
|
|
|
|
|
|
def main(workdir, r, print_id): |
|
|
|
|
print('脚底板二维码程序开始运行...') |
|
|
|
|
only_one = False |
|
|
|
|
while True: |
|
|
|
|
#随机休眠 1- 9 |
|
|
|
|
time.sleep(random.uniform(1, 9)) |
|
|
|
|
if print_id == '0': |
|
|
|
|
try: |
|
|
|
|
if r.llen('model:foot') == 0: |
|
|
|
|
# print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), '队列为空,5秒后重试') |
|
|
|
|
time.sleep(5) |
|
|
|
|
continue |
|
|
|
|
except Exception as e: |
|
|
|
|
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), 'redis连接异常,5秒后重试') |
|
|
|
|
print(e) |
|
|
|
|
time.sleep(5) |
|
|
|
|
r = redis.Redis(host='106.14.158.208', password='kcV2000', port=6379, db=6) |
|
|
|
|
# r = redis.Redis(host='172.31.1.254', password='', port=6379, db=6) |
|
|
|
|
# continue |
|
|
|
|
# 打印队列里面的全部内容 |
|
|
|
|
print(f'当前model:foot队列长度:{r.llen("model:foot")}') |
|
|
|
|
for i in r.lrange('model:foot', 0, -1): |
|
|
|
|
print(i) |
|
|
|
|
print_id = r.lpop('model:foot') |
|
|
|
|
if print_id is None: |
|
|
|
|
print_id = '0' |
|
|
|
|
continue |
|
|
|
|
#判断是否存在相同的值 |
|
|
|
|
isHaveAlready = 0 |
|
|
|
|
for i in r.lrange('model:foot', 0, -1): |
|
|
|
|
if i == print_id: |
|
|
|
|
isHaveAlready = 1 |
|
|
|
|
|
|
|
|
|
if isHaveAlready == 1: |
|
|
|
|
print_id = '0' |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
print_id = print_id.decode('utf-8') |
|
|
|
|
else: |
|
|
|
|
print(f'接收到运行一个{print_id}任务') |
|
|
|
|
only_one = True |
|
|
|
|
|
|
|
|
|
#获取该笔订单的信息,判断是否存在,不存在就跳过 |
|
|
|
|
def getInfoByPrintId(print_id): |
|
|
|
|
res = requests.get(f'{get_pid_by_printid_url}?print_id={print_id}') |
|
|
|
|
print('获取pid:', f'{get_pid_by_printid_url}?print_id={print_id}', res.text) |
|
|
|
|
resCode = json.loads(res.text)['code'] |
|
|
|
|
@ -455,57 +417,46 @@ def main(workdir, r, print_id):
@@ -455,57 +417,46 @@ def main(workdir, r, print_id):
|
|
|
|
|
if tempMesg == "打印订单不存在": |
|
|
|
|
print(f"打印ID{print_id}打印订单不存在,跳过") |
|
|
|
|
# res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}') |
|
|
|
|
os.system(f'blender -b -P fill_dm_code.py') |
|
|
|
|
return |
|
|
|
|
#os.system(f'blender -b -P fill_dm_code.py') |
|
|
|
|
return False |
|
|
|
|
|
|
|
|
|
print("获取打印任务信息有问题,重新任务队列,打印id-",print_id,"重新执行脚底板任务,等待20s") |
|
|
|
|
time.sleep(20) |
|
|
|
|
#将pid 重新扔进队列 |
|
|
|
|
r.lpush("model:foot", print_id) |
|
|
|
|
#重新调用脚底板程序 |
|
|
|
|
#os.system(f'blender -b -P fill_dm_code.py') |
|
|
|
|
continue |
|
|
|
|
use_foot_type = json.loads(res.text)['data']['use_foot_type'] |
|
|
|
|
pid = json.loads(res.text)['data']['pid'] |
|
|
|
|
order_id = json.loads(res.text)['data']['order_id'] |
|
|
|
|
return False |
|
|
|
|
return res.text |
|
|
|
|
|
|
|
|
|
filename = os.path.join(workdir, f'{pid}_{order_id}', find_obj(pid, order_id)) |
|
|
|
|
print('导入obj文件:', filename) |
|
|
|
|
# return |
|
|
|
|
if only_one: |
|
|
|
|
print(f'接收到运行一个{print_id}任务,强制调用cal_foot_position.py计算并上传qr_position') |
|
|
|
|
os.system(f'blender -b -P cal_foot_position.py -- {pid}_{order_id}_{print_id}') |
|
|
|
|
print("延时20s,等待计算脚底板坐标") |
|
|
|
|
time.sleep(20) |
|
|
|
|
res = requests.get(f'{get_qr_position_url}?print_id={print_id}') |
|
|
|
|
print('从云端获取的qr_position1:', res.text) |
|
|
|
|
codeTemp = json.loads(res.text)['code'] |
|
|
|
|
if str(codeTemp) == "-1": |
|
|
|
|
#移除该脚底板的面积处理 |
|
|
|
|
res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}') |
|
|
|
|
os.system(f'blender -b -P fill_dm_code.py') |
|
|
|
|
return |
|
|
|
|
qr_position = json.loads(res.text)['data']['position_data'] |
|
|
|
|
else: |
|
|
|
|
#获取订单的坐标信息,判断是否有,没有的话就重新生成坐标信息 |
|
|
|
|
def getQrPosition(print_id): |
|
|
|
|
#从云端获取qr_position,如果获取为空,调用cal_foot_position.py计算并上传qr_position,再重新读取qr_position.txt |
|
|
|
|
res = requests.get(f'{get_qr_position_url}?print_id={print_id}') |
|
|
|
|
print('从云端获取的qr_position2:', res.text) |
|
|
|
|
|
|
|
|
|
print('从云端获取的qr_position1:', res.text) |
|
|
|
|
codeTemp = json.loads(res.text)['code'] |
|
|
|
|
if str(codeTemp) == "-1": |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
print(f"获取打印ID{print_id}的脚底板坐标失败,进行下一笔订单的处理") |
|
|
|
|
return False |
|
|
|
|
qr_position = json.loads(res.text)['data']['position_data'] |
|
|
|
|
print("云端获取的坐标数据",qr_position) |
|
|
|
|
if qr_position == '': |
|
|
|
|
print(f"pid={pid},打印id={print_id} order_id={order_id},云端获取的坐标数据为空,进行重新计算") |
|
|
|
|
time.sleep(3) |
|
|
|
|
print('qr_position为空,调用cal_foot_position.py计算并上传qr_position') |
|
|
|
|
os.system(f'blender -b -P cal_foot_position.py -- {pid}_{order_id}_{print_id}') |
|
|
|
|
print("延时20s,等待计算脚底板坐标") |
|
|
|
|
time.sleep(20) |
|
|
|
|
res = requests.get(f'{get_qr_position_url}?print_id={print_id}') |
|
|
|
|
print(f"pid={pid},打印id={print_id} order_id={order_id},重新获取qr_position",res.text) |
|
|
|
|
print('从云端获取的qr_position3:', res.text) |
|
|
|
|
if str(json.loads(res.text)['code']) == "-1": |
|
|
|
|
print(f"pid={pid},打印id={print_id} order_id={order_id},重新获取qr_position 失败",res.text) |
|
|
|
|
return False |
|
|
|
|
qr_position = json.loads(res.text)['data']['position_data'] |
|
|
|
|
if qr_position == '': |
|
|
|
|
#跳过该笔订单 |
|
|
|
|
print(f"pid={pid},打印id={print_id} order_id={order_id},重新获取qr_position 为空,跳过脚底板的处理,执行下一笔任务") |
|
|
|
|
#移除该脚底板的面积处理 |
|
|
|
|
res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}') |
|
|
|
|
return False |
|
|
|
|
else: |
|
|
|
|
qr_position = json.loads(qr_position) |
|
|
|
|
|
|
|
|
|
@ -513,9 +464,31 @@ def main(workdir, r, print_id):
@@ -513,9 +464,31 @@ def main(workdir, r, print_id):
|
|
|
|
|
print("获取脚底坐标数据为空,重新任务队列,打印id-",print_id,"重新执行脚底板任务") |
|
|
|
|
#将pid 重新扔进队列 |
|
|
|
|
r.lpush("model:foot", print_id) |
|
|
|
|
#重新调用脚底板程序 |
|
|
|
|
#os.system(f'blender -b -P fill_dm_code.py') |
|
|
|
|
continue |
|
|
|
|
return False |
|
|
|
|
|
|
|
|
|
return qr_position |
|
|
|
|
|
|
|
|
|
def main(workdir, r, print_id): |
|
|
|
|
|
|
|
|
|
resText = getInfoByPrintId(print_id) |
|
|
|
|
print(f"根据打印ID{print_id}获取订单信息-内容{resText}") |
|
|
|
|
if resText == False: |
|
|
|
|
print(f"根据打印ID{print_id}获取订单信息失败") |
|
|
|
|
return |
|
|
|
|
arrResText = json.loads(resText) |
|
|
|
|
#订单的相关信息 |
|
|
|
|
use_foot_type = arrResText['data']['use_foot_type'] #构建类型 |
|
|
|
|
pid = arrResText['data']['pid'] #pid |
|
|
|
|
order_id = arrResText['data']['order_id'] # order_id |
|
|
|
|
|
|
|
|
|
#文件路劲 |
|
|
|
|
filename = os.path.join(workdir, f'{pid}_{order_id}', find_obj(pid, order_id)) |
|
|
|
|
print('导入obj文件:', filename) |
|
|
|
|
|
|
|
|
|
#获取该笔订单的坐标 |
|
|
|
|
qr_position = getQrPosition(print_id) |
|
|
|
|
if qr_position == False: |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
if type(qr_position) == str: qr_position = json.loads(qr_position) |
|
|
|
|
print(f'type of qr_position:{type(qr_position)}') |
|
|
|
|
@ -535,14 +508,16 @@ def main(workdir, r, print_id):
@@ -535,14 +508,16 @@ def main(workdir, r, print_id):
|
|
|
|
|
# print(f'temp_foot_data---{temp_foot_data}') |
|
|
|
|
gen_data_matrix(print_id,pid, qr_path) |
|
|
|
|
#休眠1秒 |
|
|
|
|
time.sleep(1) |
|
|
|
|
time.sleep(2) |
|
|
|
|
#判断是否存在 qr_path,不存在就执行下一个任务 |
|
|
|
|
if not os.path.exists(qr_path): |
|
|
|
|
#移除该脚底板的面积处理 |
|
|
|
|
print(f"pid={pid},打印id={print_id} order_id={order_id},生成的二维码为空,跳过脚底板的处理,执行下一笔任务") |
|
|
|
|
res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}') |
|
|
|
|
os.system(f'blender -b -P fill_dm_code.py') |
|
|
|
|
#os.system(f'blender -b -P fill_dm_code.py') |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
#在blender中贴上脚底板二维码的信息 |
|
|
|
|
|
|
|
|
|
# 导入obj文件,重置到标准单位 |
|
|
|
|
bpy.ops.wm.read_homefile() |
|
|
|
|
@ -584,7 +559,7 @@ def main(workdir, r, print_id):
@@ -584,7 +559,7 @@ def main(workdir, r, print_id):
|
|
|
|
|
if not os.path.exists(jpg_path): |
|
|
|
|
#移除该脚底板的面积处理 |
|
|
|
|
res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}') |
|
|
|
|
os.system(f'blender -b -P fill_dm_code.py') |
|
|
|
|
#os.system(f'blender -b -P fill_dm_code.py') |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
jpg_img = Image.open(jpg_path) |
|
|
|
|
@ -602,7 +577,7 @@ def main(workdir, r, print_id):
@@ -602,7 +577,7 @@ def main(workdir, r, print_id):
|
|
|
|
|
if not os.path.exists(qr_path): |
|
|
|
|
#移除该脚底板的面积处理 |
|
|
|
|
res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}') |
|
|
|
|
os.system(f'blender -b -P fill_dm_code.py') |
|
|
|
|
#os.system(f'blender -b -P fill_dm_code.py') |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
qr_img = Image.open(qr_path) |
|
|
|
|
@ -634,7 +609,7 @@ def main(workdir, r, print_id):
@@ -634,7 +609,7 @@ def main(workdir, r, print_id):
|
|
|
|
|
print_id = '0' |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
restart_current_process("blender -b -P fill_dm_code.py") |
|
|
|
|
# restart_current_process("blender -b -P fill_dm_code.py") |
|
|
|
|
|
|
|
|
|
#根据print_id 获取 短网址 |
|
|
|
|
def get_short_url(print_id): |
|
|
|
|
@ -683,6 +658,49 @@ def upload_jpg_mtl(pid, order_id, print_id):
@@ -683,6 +658,49 @@ def upload_jpg_mtl(pid, order_id, print_id):
|
|
|
|
|
print("迁移文件出 yichang ") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def worker(workdir, r, print_id): |
|
|
|
|
"""每个子进程的工作函数,用于处理单个 print_id。""" |
|
|
|
|
try: |
|
|
|
|
main(workdir, r, print_id) |
|
|
|
|
except Exception as e: |
|
|
|
|
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), f"处理 print_id {print_id} 时出错: {e}") |
|
|
|
|
|
|
|
|
|
def process_print_ids(workdir, r, pool_size): |
|
|
|
|
"""监控 Redis 队列并并行处理 print_id,同时控制进程池的大小。""" |
|
|
|
|
# 创建进程池 |
|
|
|
|
pool = multiprocessing.Pool(processes=pool_size) |
|
|
|
|
|
|
|
|
|
while True: |
|
|
|
|
try: |
|
|
|
|
# 如果队列为空,等待10秒后重试 |
|
|
|
|
if r.llen('model:foot') == 0: |
|
|
|
|
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), '队列为空,10秒后重试') |
|
|
|
|
time.sleep(10) |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
# 从队列中取出一个 print_id |
|
|
|
|
print_id = r.lpop('model:foot') |
|
|
|
|
if print_id is None: |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
# 判断该 print_id 是否已经存在,避免重复处理 |
|
|
|
|
isHaveAlready = 0 |
|
|
|
|
for i in r.lrange('model:foot', 0, -1): |
|
|
|
|
if i == print_id: |
|
|
|
|
isHaveAlready = 1 |
|
|
|
|
break |
|
|
|
|
if isHaveAlready == 1: |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
# 如果 print_id 是唯一的,则将任务提交给进程池处理 |
|
|
|
|
print(f"正在处理 print_id: {print_id}") |
|
|
|
|
pool.apply_async(worker, args=(workdir, r, print_id)) # 使用 apply_async 异步执行任务 |
|
|
|
|
|
|
|
|
|
except Exception as e: |
|
|
|
|
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), f"出现异常错误: {e}") |
|
|
|
|
r = create_redis_connection() |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
|
atexit.register(common.notify,"打印工厂-本地虚拟木脚底板处理程序已停止一个") |
|
|
|
|
low_y_limit = 25000 |
|
|
|
|
@ -714,17 +732,51 @@ if __name__ == '__main__':
@@ -714,17 +732,51 @@ if __name__ == '__main__':
|
|
|
|
|
sourceFilePath = '/data/datasets/print' |
|
|
|
|
#脚底板最终保存的路径 |
|
|
|
|
resFilePath = '/data/datasets/complate/objs' |
|
|
|
|
|
|
|
|
|
print("Usage: blender -b -P fill_dm_code.py") |
|
|
|
|
|
|
|
|
|
# 控制进程池的大小 |
|
|
|
|
pool_size = 2 # 设置最大并发进程数为4(根据需求调整) |
|
|
|
|
|
|
|
|
|
# 创建一个进程池 |
|
|
|
|
pool = multiprocessing.Pool(processes=pool_size) |
|
|
|
|
|
|
|
|
|
# 如果传递了参数,则处理特定的 print_ids |
|
|
|
|
if len(sys.argv) == 5: |
|
|
|
|
print_ids = sys.argv[-1] |
|
|
|
|
else: |
|
|
|
|
print_ids = '0' |
|
|
|
|
|
|
|
|
|
print(f"print_ids--{print_ids}") |
|
|
|
|
for print_id in print_ids.split(','): |
|
|
|
|
main(workdir, r, print_id) |
|
|
|
|
|
|
|
|
|
else: |
|
|
|
|
# 启动进程池,监控队列并并行处理 print_id |
|
|
|
|
process_print_ids(workdir, r, pool_size) |
|
|
|
|
|
|
|
|
|
# if len(sys.argv) == 5: |
|
|
|
|
# print_ids = sys.argv[-1] |
|
|
|
|
# for print_id in print_ids.split(','): |
|
|
|
|
# main(workdir, r, print_id) |
|
|
|
|
# else: |
|
|
|
|
# while True: |
|
|
|
|
# try: |
|
|
|
|
# #判断队列是否为空 |
|
|
|
|
# if r.llen('model:foot') == 0: |
|
|
|
|
# print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), '队列为空,10秒后重试') |
|
|
|
|
# time.sleep(10) |
|
|
|
|
# continue |
|
|
|
|
# #不为空,取出队列的第一个值 |
|
|
|
|
# print_id = r.lpop('model:foot') |
|
|
|
|
# if print_id is None: |
|
|
|
|
# continue |
|
|
|
|
# #判断是否存在相同的值 |
|
|
|
|
# isHaveAlready = 0 |
|
|
|
|
# for i in r.lrange('model:foot', 0, -1): |
|
|
|
|
# if i == print_id: |
|
|
|
|
# isHaveAlready = 1 |
|
|
|
|
# break |
|
|
|
|
# if isHaveAlready == 1: |
|
|
|
|
# continue |
|
|
|
|
# #如果是唯一值, 则调用main函数 |
|
|
|
|
# main(workdir, r, print_id) |
|
|
|
|
# except Exception as e: |
|
|
|
|
# print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), '出现异常错误,5秒后重试',e) |
|
|
|
|
# r = create_redis_connection() |
|
|
|
|
# continue |
|
|
|
|
|
|
|
|
|
|