You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
3.5 KiB
102 lines
3.5 KiB
import platform,sys,redis,time,requests,json,atexit |
|
sys.path.append('../libs/') |
|
|
|
import config,libs,libs_db_temp,common |
|
|
|
import os, sys, time, argparse, requests, json, re, oss2, probreg |
|
import bpy, bmesh |
|
import open3d as o3d |
|
import numpy as np |
|
import cupy as cp |
|
from mathutils import Matrix |
|
import math |
|
import logging |
|
import matplotlib.pyplot as plt |
|
|
|
#获取真实身高 |
|
def get_real_height(input_path): |
|
get_real_height_url = 'https://mp.api.suwa3d.com/api/physical/infoByPid' |
|
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: Getting real height from {input_path}') |
|
pid = re.findall(r'(\d+)', input_path)[0] |
|
print(f'pid: {pid}') |
|
res = requests.get(get_real_height_url, params={'pid': pid}) |
|
res = json.loads(res.text) |
|
if res['code'] == -1: |
|
print(f'Error: {res["message"]}, return default height 160') |
|
return 160 |
|
height = res['data']['height'] |
|
if height == 0: |
|
print(f'Error: height=0, return default height 160') |
|
return 160 |
|
print(f'height: {height}') |
|
return height |
|
|
|
|
|
def base_fix(input_path): |
|
if not os.path.exists(input_path): |
|
print(f'Error: {input_path} does not exist.') |
|
sys.exit(1) |
|
|
|
bpy.ops.wm.read_homefile() |
|
bpy.ops.object.delete(use_global=False, confirm=False) |
|
bpy.ops.wm.obj_import(filepath=input_path) |
|
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) |
|
|
|
# 脚底贴地 |
|
bpy.ops.object.align(align_mode='OPT_1', relative_to='OPT_1', align_axis={'Z'}) |
|
bpy.ops.object.transform_apply(location=True, rotation=True, scale=True) |
|
|
|
real_height = get_real_height(input_path) |
|
print(obj.dimensions) |
|
scale = real_height / obj.dimensions[2] / 100 # 除以100是因为单位是厘米 |
|
bpy.context.object.scale = (scale, scale, scale) |
|
bpy.context.object.rotation_euler = (0, 0, 0) |
|
bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_VOLUME', center='MEDIAN') |
|
bpy.context.object.location[0] = 0 # 移动到特定位置(1m, 1m)是为了让human3d可以正确识别 |
|
bpy.context.object.location[1] = 0 |
|
bpy.ops.object.transform_apply(location=True, rotation=True, scale=True) |
|
|
|
# # bpy.ops.wm.save_mainfile(filepath=args.input_path.replace('.obj', '.blend')) |
|
output_file = input_path.replace('.obj', '_baseFixed.obj') |
|
bpy.ops.wm.obj_export(filepath=output_file) |
|
return obj |
|
|
|
|
|
def readTask(): |
|
# #读取数据库的任务 |
|
# pid = libs_db_temp.get_task_by_level() |
|
# pid = str(pid) |
|
# #下载pid的对应的oss端的文件 |
|
# tempName = libs.down_obj_from_oss_for_fix("E://obj_fix", pid, "print") |
|
# if tempName == "": |
|
# print("找不到对应的obj文件") |
|
# #记录状态为异常 -1 |
|
# libs_db_temp.update_fix_status(pid,-1) |
|
# return "" |
|
|
|
# #记录状态为处理中 |
|
# libs_db_temp.update_fix_status(pid,1) |
|
# #处理逻辑 |
|
# return pid |
|
pid=7013 |
|
|
|
base_fix(f'E://obj_fix/{pid}/{pid}.obj') |
|
|
|
# print(pid) |
|
# print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+"-读取数据库任务") |
|
|
|
#程序主入口 |
|
if __name__ == '__main__': |
|
#atexit.register(common.notify,"处理数据校准任务已经停止") |
|
readTask() |
|
# while True: |
|
# print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+"-开始执行任务") |
|
# pid = readTask() |
|
# if pid != "": |
|
# break |