1
This commit is contained in:
1 parent
e04998394d
commit
53f24d1085
1 file changed
+209
@@ -0,0 +1,209 @@
|
||||
from ctypes import util
|
||||
import os, oss2, time, redis, requests, shutil, sys, subprocess, json, platform
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
from retrying import retry
|
||||
import atexit,platform
|
||||
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)
|
||||
|
||||
@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)
|
||||
#请求接口 获取 对应的 oss 地址
|
||||
tempUrl = f'https://mp.api.suwa3d.com/api/order/getOssSuffixByOrderId?order_id={order_id}'
|
||||
#发起请求
|
||||
res = requests.get(tempUrl)
|
||||
ossPath = ""
|
||||
if res.json()['code'] == 1000:
|
||||
ossPath = res.json()['data']
|
||||
|
||||
path = os.path.join(workdir, 'print', pid)
|
||||
if not os.path.exists(path): os.makedirs(path)
|
||||
|
||||
# 根据前缀获取文件列表
|
||||
prefix = f'objs/print/{pid}/'
|
||||
if ossPath != "":
|
||||
prefix = os.path.join("objs","print",pid,ossPath)
|
||||
filelist = oss2.ObjectIteratorV2(oss_client, prefix=prefix)
|
||||
#判断filelist是否为空
|
||||
if len(list(filelist)) == 0:
|
||||
filelist = oss2.ObjectIteratorV2(oss_client, prefix=f'objs/print/{pid}/')
|
||||
print(f"从 objs/print/{pid}/ 下载数据")
|
||||
else:
|
||||
print(f"从 objs/print/{pid}/{ossPath} 下载数据")
|
||||
|
||||
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
|
||||
localfile = os.path.join(path, filename)
|
||||
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'):
|
||||
print('找到其他obj文件,采用这个文件来生成需要的尺寸', file)
|
||||
shutil.copy(os.path.join(path, file), os.path.join(path, f'{pid}.obj'))
|
||||
find = True
|
||||
break
|
||||
if not find:
|
||||
print('找不到obj文件,异常退出')
|
||||
sys.exit(1)
|
||||
|
||||
# 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 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 = create_redis_connection()
|
||||
return
|
||||
repair_id = r.lpop('model:IndependentRepairTeamcheckGLBQueue')
|
||||
if repair_id is None: return
|
||||
repair_id = repair_id.decode('utf-8')
|
||||
|
||||
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', )
|
||||
down_obj_fromoss(pid,orderId)
|
||||
obj_filename = f'{pid}.obj'
|
||||
glb_filename = f'{pid}.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)} -vt 16 -vc 16')
|
||||
|
||||
#处理封面图
|
||||
#执行获取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}')
|
||||
|
||||
#判断文件是否存在,存在则上传到oss, 更新数据库内容
|
||||
if os.path.exists(f'D://print/{pid}/{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}/{pid}_pic.png')
|
||||
|
||||
|
||||
|
||||
#os.system(f'FBX2glTF -i {os.path.join(workdir, "print", pid, obj_filename)} -o {os.path.join(workdir, "print", pid, glb_filename)}')
|
||||
#如果压缩后的glb文件小于2M,文件贴图异常,需要重新生成,直到成功
|
||||
# while os.path.getsize(os.path.join(workdir, "print", pid, glb_filename)) < 2 * 1024 * 1024:
|
||||
# print(f'{pid}glb文件大小:{os.path.getsize(os.path.join(workdir, "print", pid, glb_filename))}')
|
||||
# print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 压缩后的glb文件小于2M,文件贴图异常,重新生成glb文件')
|
||||
# # 将有异常的pid相关文件全部移动到异常文件夹,然后重新下载重新生成
|
||||
# if not os.path.exists(os.path.join(workdir, 'print', 'error', pid)):
|
||||
# os.makedirs(os.path.join(workdir, 'print', 'error', pid))
|
||||
# for file in os.listdir(os.path.join(workdir, 'print', pid)):
|
||||
# shutil.move(os.path.join(workdir, 'print', pid, file), os.path.join(workdir, 'print', 'error', pid, file))
|
||||
# down_obj_fromoss(pid)
|
||||
# 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))
|
||||
|
||||
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)
|
||||
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), f'pid:{pid} 生成团队审核模型 end')
|
||||
|
||||
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)
|
||||
|
||||
|
||||
def main(r):
|
||||
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), '模型生成程序 start')
|
||||
while True:
|
||||
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'
|
||||
Bucket = 'suwa3d-securedata'
|
||||
oss_client = oss2.Bucket(oss2.Auth(AccessKeyId, AccessKeySecret), Endpoint, Bucket)
|
||||
update_check_url = 'https://mp.api.suwa3d.com/api/customerP3dLog/updateStatusToWaitingPlatformCheckingStatus'
|
||||
update_team_check_url = 'https://mp.api.suwa3d.com/api/customerP3dLog/updateStatusToWaitingTeamCheckingStatus'
|
||||
update_status_printstatus_url = 'https://mp.api.suwa3d.com/api/customerP3dLog/updateBuildPrintModelStatus'
|
||||
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'
|
||||
if platform.system() == 'Windows':
|
||||
workdir = 'D:\\'
|
||||
else:
|
||||
workdir = '/data/datasets/'
|
||||
blenderbin = find_blender_bin_path()
|
||||
r = create_redis_connection()
|
||||
main(r)
|
||||
Reference in new issue
Block a user