建模程序 多个定时程序
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.
 
 

157 lines
7.4 KiB

import os, sys, time, argparse, requests, json, re, oss2
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_auto_obj_bake_vertex_ply(obj_filepath, save_ply_path):
start_time = time.time()
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: Getting ply vertex from {obj_filepath}')
bpy.ops.object.select_all(action='DESELECT')
bpy.ops.object.select_by_type(type='MESH')
bpy.ops.object.delete(use_global=False, confirm=False)
bpy.ops.wm.obj_import(filepath=obj_filepath)
obj_original = [obj for obj in bpy.data.objects if obj.type == 'MESH'][0]
bpy.context.view_layer.objects.active = obj_original
obj_original.select_set(True)
pid = obj_original.name
obj_num_vertices = len(obj_original.data.vertices)
# print(f"模型 {pid} 顶点数量:", len(obj_original.data.vertices))
# 选择新分离出来的网格对象,并将该对象设为进活动对象
bpy.ops.object.select_all(action='DESELECT')
bpy.context.view_layer.objects.active = obj_original
obj_original.select_set(True)
# 添加颜色属性
bpy.ops.geometry.color_attribute_add()
# 节点的创建:
nodes = bpy.context.active_object.active_material.node_tree.nodes
links = bpy.context.active_object.active_material.node_tree.links
tex_coord = nodes.new("ShaderNodeTexCoord")
Mapping = nodes.new('ShaderNodeMapping')
vertex_color = nodes.new("ShaderNodeVertexColor")
tex_coord.location = (-800, 600)
Mapping.location = (-500, 200)
vertex_color.location = (-200, 600)
# 节点之间的连接:
# 纹理坐标的UV 连接 映射的矢量;映射的矢量 连接 纹理贴图的矢量;原理化BSDF删除;纹理贴图的矢量 连接 表(曲)面。
links.new(tex_coord.outputs[2], nodes['Mapping'].inputs[0])
links.new(Mapping.outputs[0], nodes['Image Texture'].inputs[0])
principled_bsdf = nodes.get("Principled BSDF")
nodes.remove(principled_bsdf)
links.new(nodes['Image Texture'].outputs[0], nodes['Material Output'].inputs[0])
# 4.渲染烘焙相关操作
bpy.context.scene.render.engine = 'CYCLES'
bpy.context.scene.cycles.device = 'GPU'
bpy.context.scene.cycles.preview_samples = 1
bpy.context.scene.cycles.samples = 1
bpy.context.scene.cycles.bake_type = 'EMIT'
bpy.context.scene.render.bake.use_selected_to_active = False
bpy.context.scene.render.bake.target = 'VERTEX_COLORS'
bpy.ops.object.bake(type='EMIT') # 开始 Bake
# 连接节点 Color Attribute 和 节点 Material Output
links.new(nodes['Color Attribute'].outputs[0], nodes['Material Output'].inputs[0])
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: Bake EMIT time: ', time.time() - start_time)
start_time = time.time()
# 5.输出模型
# bpy.ops.wm.save_as_mainfile(filepath='/data/datasets/plys/121614.bend')
bpy.ops.wm.ply_export(filepath=save_ply_path, apply_modifiers=True, export_selected_objects=True, export_uv=False,
export_normals=False, export_colors='SRGB', export_triangulated_mesh=False, ascii_format=True)
bpy.data.objects.remove(obj_original, do_unlink=True)
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: Save ply time: ', time.time() - start_time)
return obj_num_vertices
if __name__ == '__main__':
# workdir = '/data/datasets/suwa_cut/data/auto/'
# output = '/data/datasets/plys/auto/'
workdir = 'G:\obj_fix\print'
output = 'G:\obj_fix\ply\whole_obj_bake_vertex_high_ply'
directory = f'G:\obj_fix/print/right'
#遍历获取 G:\obj_fix\print\right 目录的文件,根据文件名获取 pid
for file_name in os.listdir(directory):
# 获取文件的完整路径
file_path = os.path.join(directory, file_name)
# 检查是否是文件
if os.path.isfile(file_path):
#
arrFileName = file_name.split('_')
pid = arrFileName[0]
if int(pid) == 0:
continue
print(f"File: {file_name}, PID: {pid}")
#判断文件是否存在
file_path = os.path.join(output, f'{pid}.ply')
if os.path.exists(file_path) and os.path.isfile(file_path):
print("文件已存在,跳过循环!!!")
continue
obj_filepath = os.path.join(workdir, f'{pid}/{pid}.obj')
save_ply_path = os.path.join(output, f'{pid}.ply')
if not os.path.exists(obj_filepath):
print(f"{obj_filepath} 文件不存在,跳过循环!!!")
continue
obj_num_vertices = get_auto_obj_bake_vertex_ply(obj_filepath, save_ply_path)
if obj_num_vertices == 0:
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: 模型 {pid} 程序getHeadCount()无法找到模型人数!总共运行时间: ', time.time() - start_time0)
logging.info(f'模型 {pid} 顶点数量: {obj_num_vertices},程序getHeadCount()无法找到模型人数!,程序总共运行时间: {time.time() - start_time0:.2f}')
continue
# # 从文件名中提取 pid
# pid = extract_pid(file_name)
# if pid:
# print(f"File: {file_name}, PID: {pid}")
# else:
# print(f"Unable to extract PID from file: {file_name}")
# return
# listdir_pids = os.listdir(workdir)
# for pid in listdir_pids:
# file_path = os.path.join(output, f'{pid}/{pid}.ply')
# if os.path.exists(file_path) and os.path.isfile(file_path):
# print("文件已存在,跳过循环!!!")
# continue
# print(pid)
# logging.basicConfig(filename=f'/data/datasets/plys/auto_vertex_time.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# start_time0 = time.time()
# print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: 模型 {pid} 开始运行时间: ', start_time0)
# # 判断输出目录是否存在
# if not os.path.exists(os.path.join(output, f'{pid}/')):
# os.makedirs(os.path.join(output, f'{pid}/'))
# obj_filepath = os.path.join(workdir, f'{pid}/{pid}_cpd.obj')
# save_ply_path = os.path.join(output, f'{pid}/{pid}.ply')
# if not os.path.exists(obj_filepath):
# print(f"{obj_filepath} 文件不存在,跳过循环!!!")
# continue
# obj_num_vertices = get_auto_obj_bake_vertex_ply(obj_filepath, save_ply_path)
# if obj_num_vertices == 0:
# print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: 模型 {pid} 程序getHeadCount()无法找到模型人数!总共运行时间: ', time.time() - start_time0)
# logging.info(f'模型 {pid} 顶点数量: {obj_num_vertices},程序getHeadCount()无法找到模型人数!,程序总共运行时间: {time.time() - start_time0:.2f} 秒')
# continue
# print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: 模型 {pid} 顶点数量: {obj_num_vertices} 程序总共运行时间: ', time.time() - start_time0)
# logging.info(f'模型 {pid} 顶点数量: {obj_num_vertices},程序总共运行时间: {time.time() - start_time0:.2f} 秒')
# # 退出 Blender 并释放资源
# bpy.ops.wm.quit_blender()