From bb767caddd7cb9badb9d1d36cf4cb0e7a02701e1 Mon Sep 17 00:00:00 2001 From: dongchangxi <458593490@qq.com> Date: Fri, 1 Aug 2025 17:37:16 +0800 Subject: [PATCH] 1 --- apps/auto_convert3d_new.py | 2 + timer/test_external_order.py | 287 +++++++++++++++++++++++++++++++++++ 2 files changed, 289 insertions(+) create mode 100644 timer/test_external_order.py diff --git a/apps/auto_convert3d_new.py b/apps/auto_convert3d_new.py index 5df101d..c9d2695 100644 --- a/apps/auto_convert3d_new.py +++ b/apps/auto_convert3d_new.py @@ -139,6 +139,8 @@ def team_check(r): os.system(f'python D:\\make2\\apps\\white_purification.py -i {imagePath}') print("贴图文件白色提纯完成",imagePath) + # + time.sleep(5) #提纯完重新上传提纯图片 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) diff --git a/timer/test_external_order.py b/timer/test_external_order.py new file mode 100644 index 0000000..cd0dfed --- /dev/null +++ b/timer/test_external_order.py @@ -0,0 +1,287 @@ +import os, sys, time, bpy, math, requests, bmesh, json, shutil,oss2 +from PIL import Image +import platform,redis +if platform.system() == 'Windows': + sys.path.append('e:\\libs\\') + #sys.path.append('libs') +else: + sys.path.append('/data/deploy/make3d/make2/libs/') +import config, libs, libs_db,main_service_db,common,foot_mark_seam,libs_db_gpu + +def bmesh_copy_from_object(obj, transform=True, triangulate=True, apply_modifiers=False): + """Returns a transformed, triangulated copy of the mesh""" + assert obj.type == 'MESH' + if apply_modifiers and obj.modifiers: + import bpy + depsgraph = bpy.context.evaluated_depsgraph_get() + obj_eval = obj.evaluated_get(depsgraph) + me = obj_eval.to_mesh() + bm = bmesh.new() + bm.from_mesh(me) + obj_eval.to_mesh_clear() + else: + me = obj.data + if obj.mode == 'EDIT': + bm_orig = bmesh.from_edit_mesh(me) + bm = bm_orig.copy() + else: + bm = bmesh.new() + bm.from_mesh(me) + if transform: + matrix = obj.matrix_world.copy() + if not matrix.is_identity: + bm.transform(matrix) + matrix.translation.zero() + if not matrix.is_identity: + bm.normal_update() + if triangulate: + bmesh.ops.triangulate(bm, faces=bm.faces) + return bm + +def find_pid_objname(pid): + print(bpy.data.objects) + for obj in bpy.data.objects: + print(obj) + if obj.name.startswith(str(pid)): + return obj.name + + +def down_obj_from_oss(workdir, pid, action): + if os.path.exists(os.path.join(workdir, action, pid)): + print(f'目录{os.path.join(workdir, action, pid)}已存在,跳过') + return + else: + os.makedirs(os.path.join(workdir, action, pid)) + + # 根据前缀获取文件列表 + prefix = f'objs/print/{pid}/base/model/' + filelist = oss2.ObjectIteratorV2(config.oss_bucket, prefix=prefix) + print('正在下载:', prefix) + obj_filename = "" + for file in filelist: + + + filename = file.key.split('/')[-1] + if filename.endswith(".exr"): + continue + + if filename.endswith("_1.jpg") or filename.endswith("_8.jpg"): + continue + + if filename.endswith('.obj'): + obj_filename = filename + # print('正在下载:', file.key) + localfile = os.path.join(workdir, action, pid, filename) + config.oss_bucket.get_object_to_file(file.key, localfile) + + return obj_filename + +#加载obj文件 +def reload_obj(pid,order_ids): + + #下载obj文件 + down_obj_from_oss(config.workdir, pid, "print") + for order_id in order_ids: + print(order_id) + #url 请求 + url = f"https://mp.api.suwa3d.com/api/printOrder/infoByOrderId?id={order_id}" + response = requests.get(url) + response = response.json() + if response['code'] != 1000: + continue + + #获取打印尺寸 + printdata = response['data']['data'] + for key,value in printdata.items(): + #去掉cm + key = key.replace('cm','') + key = float(key)*10 + print(key) + print(f'执行脚本--- "python D:/make2/tools/cal_weight.py print {pid} {key} {order_id}"') + #发起计算请求 + os.system(f"python D:/make2/tools/cal_weight.py print {pid} {key} {order_id}") + #计算克重信息 + + + obj_filename = os.path.join(config.workdir,'print',pid,f'{pid}.obj') + bpy.ops.wm.read_homefile() + bpy.ops.object.delete(use_global=False, confirm=False) + bpy.ops.import_scene.obj(filepath=obj_filename) + bpy.context.scene.unit_settings.scale_length = 1 + bpy.context.scene.unit_settings.length_unit = 'CENTIMETERS' + bpy.context.scene.unit_settings.mass_unit = 'GRAMS' + + obj = bpy.context.selected_objects[0] + bpy.context.view_layer.objects.active = obj + obj.select_set(True) + +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 base_fix(pid,order_ids): + # 统一blender环境 + print("BBBBBBBBBBBBB") + reload_obj(pid,order_ids) + # 统一模型方向、位置、大小... + pid_objname = find_pid_objname(pid) + print("AAAAAAAAAAAAA",pid_objname) + obj = bpy.context.selected_objects[0] #bpy.data.objects[pid_objname] + obj.rotation_euler = (0, 0, 0) + # 检查当前模型是否正确使用 z 轴作为高度轴 + if obj.dimensions.z < obj.dimensions.y: + # 如果 z 轴比 y 轴小,说明高度错误,应该旋转调整模型 + print(f"警告:模型的高度轴(z)似乎不正确,使用 y 轴作为高度。正在修正模型方向...") + bpy.ops.object.transform_apply(location=True, rotation=True, scale=True) # 应用当前变换 + obj.rotation_euler[0] = math.radians(90) # 旋转模型 90 度,交换 z 和 y 轴 + bpy.ops.object.transform_apply(rotation=True) # 应用旋转 + + + + bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_VOLUME', center='MEDIAN') + bpy.context.object.location[0] = 0 + bpy.context.object.location[1] = 0 + bpy.ops.object.transform_apply(location=True, rotation=True, scale=True) + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 模型基础校正完成') + + +def export_and_update_glbs(pid,order_ids): + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 开始导出并上传审核模型和3D相册模型glb文件...') + start_time = time.time() + #headcount = libs.getHeadCount(pid) + headcount = 1 + pid_objname = find_pid_objname(pid) + obj = bpy.context.selected_objects[0] + obj.select_set(True) + + model_info = {} + model_info['headcount'] = headcount + model_info['faces'] = round(len(obj.data.polygons) / 10000) + model_info['height'] = round(obj.dimensions.y * 100) + + # bpy.ops.wm.save_as_mainfile(filepath=os.path.join(config.workdir, pid, f'{pid}.blend')) + + # 统一缩放到9cm标准尺寸 + scale = 90 / obj.dimensions.y + obj.scale = (scale, scale, scale) + bpy.ops.object.transform_apply(scale=True) + + # bpy.ops.wm.save_as_mainfile(filepath=os.path.join(config.workdir, pid, f'{pid}-9cm.blend')) + + bm = bmesh_copy_from_object(obj) + model_info['volume'] = round(bm.calc_volume(), 2) + model_info['weight'] = round(model_info['volume'] * 1.226, 2) + print(f'{pid}的模型数据:{model_info}') + + #res = requests.get(f'{config.urls["upload_model_info_url"]}?pid={pid}&headcount={headcount}&faces={model_info["faces"]}&volume={model_info["volume"]}&weight={model_info["weight"]}&height={model_info["height"]}') + #print('上传模型数据:', res.text) + # with open(os.path.join(config.sharedir, 'model_info', f'{pid}.json'), 'w') as f: + # json.dump(model_info, f) + # f.close() + + # 先生成审核模型 + faces_dest = 500000 * headcount + # 减面 + faces_current = len(obj.data.polygons) + print(f'当前面数:{faces_current},目标面数:{faces_dest}') + + bpy.ops.object.modifier_add(type='DECIMATE') + bpy.context.object.modifiers["Decimate"].ratio = faces_dest / faces_current + bpy.ops.object.modifier_apply(modifier="Decimate") + + glb_filename = os.path.join(config.workdir, 'print',pid, f'{pid}.glb') + bpy.ops.export_scene.gltf(filepath=glb_filename, export_format='GLB', export_apply=True, export_jpeg_quality=75, export_draco_mesh_compression_enable=False) + + # glb_filename = os.path.join(config.workdir, pid, 'output', f'{pid}.glb') + # bpy.ops.export_scene.gltf(filepath=glb_filename, export_format='GLB', export_apply=True, export_jpeg_quality=75, export_draco_mesh_compression_enable=False) + + # 再生成数字模型 + faces_dest = 120000 * headcount + + # 减面 + faces_current = len(obj.data.polygons) + print(f'当前面数:{faces_current},目标面数:{faces_dest}') + + bpy.ops.object.modifier_add(type='DECIMATE') + bpy.context.object.modifiers["Decimate"].ratio = faces_dest / faces_current + bpy.ops.object.modifier_apply(modifier="Decimate") + + glb_filename = os.path.join(config.workdir,'print',pid,f'{pid}-3d.glb') + bpy.ops.export_scene.gltf(filepath=glb_filename, export_format='GLB', export_apply=True, export_jpeg_quality=75, export_draco_mesh_compression_enable=False) + + os.system(f'gltfpack -c -i {os.path.join(config.workdir, "print",pid, f"{pid}.glb")} -o {os.path.join(config.workdir, "print",pid, f"{pid}-pack.glb")}') + config.oss_bucket.put_object_from_file(f'glbs/auto/{pid}.glb', os.path.join(config.workdir, 'print',pid, f'{pid}-pack.glb')) + config.oss_bucket.put_object_from_file(f'glbs/print/{pid}.glb', os.path.join(config.workdir, 'print',pid, f'{pid}-pack.glb')) + config.oss_bucket.put_object_from_file(f'glbs/3d/{pid}.glb', os.path.join(config.workdir,'print',pid, f'{pid}-3d.glb')) + + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} glb文件导出并上传完成,共费时{libs.diff_time(start_time)}') + + #移除文件夹 + #shutil.rmtree(os.path.join(config.workdir,'print',pid)) + + #更新该笔订单的状态为 3000 + # order_ids 逗号隔开 + print(order_ids) + order_ids = ",".join(map(str,order_ids)) + strRequest = f"https://shop.api.suwa3d.com/api/printOrder/updateExternalOrderStatusV2?pid={pid}&order_ids={order_ids}" + print(strRequest) + res = requests.post("https://shop.api.suwa3d.com/api/printOrder/updateExternalOrderStatusV2", data={'pid': pid,"order_ids":order_ids}) + print(res.text) + #执行获取obj缩略图 + print("执行获取obj全身缩略图脚本") + os.system(f'python d:\\make2\\tools\pic_for_obj\image_rander_small.py -pid {pid} -i D://print/{pid} -o D://print/{pid}') + print("判断获取封面图是否存在0") + #判断文件是否存在,存在则上传到oss, 更新数据库内容 + if os.path.exists(f'D://print/{pid}/{pid}_pic.png'): + #获取拍照订单的信息,从中得到拍照订单的信息 + uuid = get_p3d_info(str(pid)) + print("判断获取封面图是否存在1") + 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}/{pid}_pic.png') + +def createGlb(pid,order_ids): + + + base_fix(pid,order_ids) + export_and_update_glbs(pid,order_ids) + #移除文件夹 + # try: + # shutil.rmtree(os.path.join(config.workdir,'print',pid)) + # except: + # pass + + +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) + +if __name__ == '__main__': + # pid = "296088" + # order_ids = [866533] + arrData = { + #"300862":873459, + "302335":874472, + "302314":874446, + } + for k in arrData: + + createGlb(str(k),[arrData[k]]) + + +