diff --git a/apps/auto_convert3d_new.py b/apps/auto_convert3d_new.py index bfcd238..132d7e4 100644 --- a/apps/auto_convert3d_new.py +++ b/apps/auto_convert3d_new.py @@ -66,6 +66,8 @@ def down_obj_fromoss(pid,order_id): if filename.endswith(f'{pid}.obj'): find = True localfile = os.path.join(path, filename) + if "process" in file.key or "human" in file.key: + continue res = oss_client.get_object_to_file(file.key, localfile) print(f'下载文件:{file.key},状态:{res.status}') diff --git a/apps/auto_convert3d_test.py b/apps/auto_convert3d_test.py index 386ac7d..0ec0cd1 100644 --- a/apps/auto_convert3d_test.py +++ b/apps/auto_convert3d_test.py @@ -1,53 +1,78 @@ from ctypes import util -import os, oss2, time, redis, requests, shutil, sys, subprocess, json, qrcode +import os, oss2, time, redis, requests, shutil, sys, subprocess, json, platform from PIL import Image, ImageDraw, ImageFont +from retrying import retry +import atexit,platform +import white_purification_v4,white_purification +if platform.system() == 'Windows': + sys.path.append('e:\\libs\\') +import common +import config +def find_blender_bin_path(): + if platform.system() == 'Linux': return 'blender' + base_path = 'C:\\Program Files\\Blender Foundation\\' + if os.path.exists(base_path): + for dir in os.listdir(base_path): + if dir.startswith('Blender'): + blender_bin_path = base_path + dir + '\\blender.exe' + return f'"{blender_bin_path}"' + else: + print('未找到blender安装目录') + exit(1) - -def gen_qrcode(pid): - fontHeightMax = 40 - fontsize = 1 - qr = qrcode.QRCode() - qr.border = 2 - qr.add_data(pid) - img = qr.make_image(fit=True) - img = img.transform((250, 294), Image.Transform.EXTENT, (0, 0, 250, 294), fillcolor='white') - - cwd = os.path.dirname(os.path.abspath(__file__)) - fontfile = os.path.join(cwd, 'fonts', 'Helvetica.ttf') - font = ImageFont.truetype(fontfile, fontsize) - while font.getsize(pid)[1] <= fontHeightMax and font.getsize(pid)[0] <= 240: - fontsize += 1 - font = ImageFont.truetype(fontfile, fontsize) - fontsize -= 1 - - captionx = (250 - font.getsize(pid)[0]) / 2 - draw = ImageDraw.Draw(img) - draw.text((captionx, 242), pid, font=font) - # img.show() - path = os.path.join(workdir, 'print', pid) - img.save(f'{path}/{pid}.png') - -def down_obj_fromoss(pid, print_type=1): +@retry(stop_max_attempt_number=10, wait_fixed=3000) +def down_obj_fromoss(pid,order_id): # print_type:// 打印状态 1:正常打印 2:重打 3:加打,4: 样品 print('开始下载obj文件...' , pid) - if not os.path.exists(os.path.join(workdir, 'print')): - os.mkdir(os.path.join(workdir, 'print')) - path = os.path.join(workdir, 'print', pid) - if not os.path.exists(path): os.mkdir(path) + #请求接口 获取 对应的 oss 地址 + tempUrl = f'https://mp.api.suwa3d.com/api/order/getOssSuffixByOrderId?order_id={order_id}' + print(tempUrl) + #发起请求 + res = requests.get(tempUrl) + ossPath = "" + if res.json()['code'] == 1000: + ossPath = res.json()['data'] + ossPath = ossPath.replace("\\","/") + print("AAAAAAAAA",ossPath) + + + path = os.path.join(workdir, 'print', pid,order_id) + if not os.path.exists(path): os.makedirs(path) # 根据前缀获取文件列表 prefix = f'objs/print/{pid}/' + if ossPath != "": + prefix = os.path.join("objs","print",pid,ossPath) + if "base/" in ossPath: + prefix = os.path.join("objs","print",pid,ossPath) + prefix = prefix.replace("\\","/") + + print(f'prefix:{prefix}') filelist = oss2.ObjectIteratorV2(oss_client, prefix=prefix) + + if len(list(filelist)) == 0: + filelist = oss2.ObjectIteratorV2(oss_client, prefix=f"objs/print/{pid}") + else: + filelist = oss2.ObjectIteratorV2(oss_client, prefix=prefix) + + find = False for file in filelist: filename = file.key.split('/')[-1] if filename == '': continue + if filename.endswith(f'.obj') and find == True: + continue + if filename.endswith(f'{pid}.obj'): find = True - print('正在下载:', file.key) localfile = os.path.join(path, filename) - oss_client.get_object_to_file(file.key, localfile) + if "process" in file.key or "human" in file.key: + continue + + res = oss_client.get_object_to_file(file.key, localfile) + print(f'下载文件:{file.key},状态:{res.status}') + if not find and print_type == 3: for file in os.listdir(path): if file.endswith('.obj'): @@ -58,138 +83,131 @@ def down_obj_fromoss(pid, print_type=1): if not find: print('找不到obj文件,异常退出') sys.exit(1) - + + return ossPath + # print('下载完成后静默10秒,等待文件写入完成') + # time.sleep(10) + def getPidFromOrderId(orderId): getPidFromOrderId_url = 'https://mp.api.suwa3d.com/api/printOrder/info' print(f'{getPidFromOrderId_url}?id={orderId}') res = requests.get(f'{getPidFromOrderId_url}?id={orderId}') + resCode = res.json()['code'] + if int(resCode) != 1000: + return -1 print(res.text) return res.json()['data'] -def detect_obj4print(pid): - for file in os.listdir(os.path.join(workdir, 'print', pid)): - if file.endswith('.obj') and 'x' in file: - return True -def make3d4print_task(r): - try: - if r.llen('model:printOrder') == 0: - time.sleep(5) - return - except Exception as e: - print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), 'redis连接异常,重新连接') - print(e) - time.sleep(5) - r = redis.Redis(host='106.14.158.208', password='kcV2000', port=6379, db=6) - return - orderId = r.lpop('model:printOrder') - if orderId is None: return - orderId = orderId.decode('utf-8') - res = getPidFromOrderId(orderId) - pid = str(res['pid']) - print_type = res['print_type'] - digital_type = res['digital_type'] # 0: 只有手办 1: 只有数字模型 2: 手办+数字模型 - - print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), f'orderId:{orderId} pid:{pid} 生成待打印模型 start', ) - down_obj_fromoss(pid, print_type) - gen_qrcode(pid) - os.system(f'{blenderbin} -b -P d:\\apps\\blender\\resize_model.py -- {orderId}') - if not detect_obj4print(pid): - print('obj文件生成异常,退出') - sys.exit(1) - print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), f'orderId:{orderId} pid:{pid} 生成待打印模型 end') - print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), f'orderId:{orderId} pid:{pid} 上传生成的模型 start', ) - for file in os.listdir(os.path.join(workdir, 'print', pid)): - if file.endswith('.obj') and (not file.endswith(f'{pid}.obj')): - oss_client.put_object_from_file(f'objs/print/{pid}/{file}', os.path.join(workdir, 'print', pid, file)) - if file.endswith('.glb'): - oss_client.put_object_from_file(f'glbs/3d/{pid}.glb', os.path.join(workdir, 'print', pid, file)) - - oss_client.delete_object(f'objs/print/{pid}/{pid}.obj') - shutil.rmtree(os.path.join(workdir, 'print', pid), ignore_errors=True) - print(f'{update_makeprintobj_status_url}?id={orderId}') - if digital_type == 1: - print('只有数字模型,不需要推送手办打印任务') - else: - res = requests.get(f'{update_makeprintobj_status_url}?id={orderId}') - print('更新打印状态:', res.text) - if res.json()['code'] != 1000: - print('更新打印状态失败') - sys.exit(1) - print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), f'orderId:{orderId} pid:{pid} 上传生成的模型 end') def team_check(r): - try: - if r.llen('model:IndependentRepairTeamcheckGLBQueue') == 0: - time.sleep(5) - return - 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) - return - repair_id = r.lpop('model:IndependentRepairTeamcheckGLBQueue') - if repair_id is None: return - repair_id = repair_id.decode('utf-8') + # try: + # if r.llen('model:IndependentRepairTeamcheckGLBQueue') == 0: + # time.sleep(5) + # return + # except Exception as e: + # print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), 'redis连接异常,5秒后重试') + # print(e) + # time.sleep(5) + # r = create_redis_connection() + # return + # repair_id = r.lpop('model:IndependentRepairTeamcheckGLBQueue') + # if repair_id is None: return + # repair_id = repair_id.decode('utf-8') + + repair_id = "66682" res = requests.get(f'{getRepairInfo_url}?id={repair_id}') + print(f'getRepairInfo_url:{getRepairInfo_url}?id={repair_id}') print(res.text) pid = res.json()['data']['pid'] + orderId = res.json()['data']['order_id'] pid = str(pid) + orderId = str(orderId) + + #print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), f'pid:{pid} repair_id:{repair_id} 生成团队审核模型 start model:IndependentRepairTeamcheckGLBQueue', ) + ossPath = down_obj_fromoss(pid,orderId) + - print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), f'pid:{pid} 生成团队审核模型 start', ) - down_obj_fromoss(pid) obj_filename = f'{pid}.obj' - glb_filename = f'{pid}.glb' + glb_filename = f'{orderId}.glb' print('开始转换obj文件为glb文件...') - os.system(f'gltfpack -c -i {os.path.join(workdir, "print", pid, obj_filename)} -o {os.path.join(workdir, "print", pid, glb_filename)}') - print('上传glb文件到oss...') - oss_client.put_object_from_file(f'glbs/print/{glb_filename}', os.path.join(workdir, "print", pid, glb_filename)) + os.system(f'gltfpack -c -i {os.path.join(workdir, "print", pid,orderId, obj_filename)} -o {os.path.join(workdir, "print", pid,orderId, glb_filename)} -vt 16 -vc 16') + + #处理封面图 + #执行获取obj缩略图 + print("执行获取obj全身缩略图脚本1111111111") + os.system(f'python d:\\make2\\tools\pic_for_obj\image_rander_small.py -pid {pid} -i D://print/{pid}/{orderId} -o D://print/{pid}/{orderId}') + print("判断是否存在封面图") + #判断文件是否存在,存在则上传到oss, 更新数据库内容 + if os.path.exists(f'D://print/{pid}/{orderId}/{pid}_pic.png'): + #获取拍照订单的信息,从中得到拍照订单的信息 + uuid = get_p3d_info(str(pid)) + if uuid != 0 and uuid != None and uuid != "": + print("uuid",uuid) + config.oss_bucket_3d_view.put_object_from_file(f'{uuid}/3d_view.png', f'D://print/{pid}/{orderId}/{pid}_pic.png') + + + + oss_client.put_object_from_file(f'glbs/print/order_id/{glb_filename}', os.path.join(workdir, "print", pid,orderId, glb_filename)) + + #对文件进行白色提纯处理 + imagePath = os.path.join(workdir, 'print', pid,orderId,pid+"Tex1.jpg") + print("开始处理白色提纯") + #white_purification.white_purification_utils(imagePath) + os.system(f'python D:\\make2\\apps\white_purification_v4.py -i {imagePath}') + + print("贴图文件白色提纯完成",imagePath) + #提纯完重新上传提纯图片 + ossImagePath = os.path.join("objs/print", pid,ossPath,"texture","process_"+pid+"Tex1.jpg") + oss_client.put_object_from_file(f"objs/print/{pid}/{ossPath}/texture/process_{pid}Tex1.jpg",imagePath) + print("白色提纯上传图片路径-",ossImagePath,imagePath) + + print(f'{update_repair_status_url}?id={repair_id}') res = requests.get(f'{update_repair_status_url}?id={repair_id}') print('更新团队审核状态:', res.text) - shutil.rmtree(os.path.join(workdir, 'print', pid), ignore_errors=True) + shutil.rmtree(os.path.join(workdir, 'print', pid,orderId), ignore_errors=True) print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), f'pid:{pid} 生成团队审核模型 end') -def platform_check(r): - try: - if r.llen('model:modelRepairGLBQueue') == 0: - time.sleep(5) - return - 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) - return - pid = r.lpop('model:modelRepairGLBQueue') - if pid is None: return - print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), f'pid:{pid} 生成平台审核模型 start', ) - - pid = pid.decode('utf-8') - down_obj_fromoss(pid) - obj_filename = f'{pid}.obj' - glb_filename = f'{pid}.glb' - os.system(f'gltfpack -c -i {os.path.join(workdir, "print", pid, obj_filename)} -o {os.path.join(workdir, "print", pid, glb_filename)}') - oss_client.put_object_from_file(f'glbs/print/{glb_filename}', os.path.join(workdir, "print", pid, glb_filename)) +def get_p3d_info(pid): + url = "https://mp.api.suwa3d.com/api/customerP3dLog/info?id="+pid + res = requests.get(url) + res = res.json() + if res["code"] == 1000: + return res["data"]["guid"] + else: + return 0 + +def create_redis_connection(): + """创建 Redis 连接,若连接失败则重试""" + while True: + try: + r = redis.Redis(host='106.14.158.208', password='kcV2000', port=6379, db=6) + # 尝试进行一次操作,检查连接是否有效 + r.ping() # ping 操作是一个简单的连接测试 + print("Redis连接成功!") + return r + except ConnectionError: + print("Redis连接失败,正在重试...") + time.sleep(5) - print(f'{update_check_url}?id={pid}') - res = requests.get(f'{update_check_url}?id={pid}') - print(res.text) - shutil.rmtree(os.path.join(workdir, 'print', pid), ignore_errors=True) - print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), f'pid:{pid} 生成平台审核模型 end') def main(r): print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), '模型生成程序 start') while True: - # team_check(r) - # platform_check(r) - make3d4print_task(r) + try: + team_check(r) + except Exception as e: + print('出现异常:', e) + time.sleep(5) + r = create_redis_connection() + continue if __name__ == '__main__': + atexit.register(common.notify,"R13-修模师审核通过,生成打印任务程序停止") AccessKeyId = 'LTAI5tSReWm8hz7dSYxxth8f' AccessKeySecret = '8ywTDF9upPAtvgXtLKALY2iMYHIxdS' Endpoint = 'oss-cn-shanghai.aliyuncs.com' @@ -201,8 +219,10 @@ if __name__ == '__main__': update_makeprintobj_status_url = 'https://mp.api.suwa3d.com/api/printOrder/updateMakePrintObjSucceed' getRepairInfo_url = 'https://repair.api.suwa3d.com/api/modelRepairOrder/teamCheckGLBInfo' update_repair_status_url = 'https://repair.api.suwa3d.com/api/modelRepairOrder/updateStatusToWaitingTeamCheckingStatus' - workdir = 'D:\\' - blenderbin = '"C:\\Program Files\\Blender Foundation\\Blender 3.3\\blender.exe"' - - r = redis.Redis(host='106.14.158.208', password='kcV2000', port=6379, db=6) + if platform.system() == 'Windows': + workdir = 'D:\\' + else: + workdir = '/data/datasets/' + blenderbin = find_blender_bin_path() + r = create_redis_connection() main(r) \ No newline at end of file