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.
 

162 lines
7.0 KiB

import os
import shutil
import time
def merged_obj_for_group(input_folder,output_folder):
""""""
group_size = 5
obj_pid_list = os.listdir(input_folder)
group_obj_list = [obj_pid_list[i:i + group_size] for i in range(0, len(obj_pid_list), group_size)]
print(group_obj_list)
for group_obj in group_obj_list:
print(group_obj)
group_pid = "_".join(group_obj)
print(group_pid)
output_group_folder = os.path.join(output_folder,group_pid)
os.makedirs(output_group_folder, exist_ok=True)
#input_root_folder = "/data/datasets_20t/obj_merger_test_data/"
#output_folder = "/data/datasets_20t/obj_merger_result/"
output_obj = os.path.join(output_group_folder, f"{group_pid}.obj")
output_mtl = os.path.join(output_group_folder, f"{group_pid}.mtl")
# 初始化
merged_obj = []
merged_mtl = []
texture_files = set()
material_offset = 0
vertex_offset = 0
texture_offset = 0
normal_offset = 0
current_materials = {}
# 遍历每个子文件夹
for folder_name in group_obj:
folder_path = os.path.join(input_folder, folder_name)
if not os.path.isdir(folder_path):
continue
obj_file = None
mtl_file = None
texture_file = None
# 寻找 .obj、.mtl 和 .jpg 文件
for file_name in os.listdir(folder_path):
if file_name.endswith(".obj"):
obj_file = os.path.join(folder_path, file_name)
elif file_name.endswith(".mtl"):
mtl_file = os.path.join(folder_path, file_name)
elif file_name.endswith(".jpg"):
texture_file = os.path.join(folder_path, file_name)
# 跳过不完整的文件夹
if not obj_file or not mtl_file or not texture_file:
print(f"跳过不完整的文件夹:{folder_path}")
continue
# 读取 .obj 文件
with open(obj_file, "r") as obj_f:
obj_lines = obj_f.readlines()
for line in obj_lines:
if line.startswith("mtllib"):
# 替换材质文件名
merged_obj.append(f"mtllib {os.path.basename(output_mtl)}\n")
elif line.startswith("usemtl"):
# 重命名材质名称,避免冲突
original_material = line.split()[1]
new_material = f"{original_material}_{material_offset}"
print(f"original_material---{original_material}")
print(f"new_material---{new_material}")
merged_obj.append(f"usemtl {new_material}\n")
current_materials[original_material] = new_material
elif line.startswith("v "): # 顶点
vertex = line.split()[1:]
merged_obj.append(f"v {' '.join(vertex)}\n")
elif line.startswith("vt "): # 纹理坐标
texture = line.split()[1:]
merged_obj.append(f"vt {' '.join(texture)}\n")
elif line.startswith("vn "): # 法线
normal = line.split()[1:]
merged_obj.append(f"vn {' '.join(normal)}\n")
elif line.startswith("f "): # 面数据
face = line.split()[1:]
updated_face = []
for vertex in face:
indices = vertex.split("/")
indices = [
str(int(indices[0]) + vertex_offset) if indices[0] else "",
str(int(indices[1]) + texture_offset) if len(indices) > 1 and indices[1] else "",
str(int(indices[2]) + normal_offset) if len(indices) > 2 and indices[2] else "",
]
updated_face.append("/".join(indices))
merged_obj.append(f"f {' '.join(updated_face)}\n")
# 更新偏移量
vertex_offset += sum(1 for line in obj_lines if line.startswith("v "))
texture_offset += sum(1 for line in obj_lines if line.startswith("vt "))
normal_offset += sum(1 for line in obj_lines if line.startswith("vn "))
# 读取 .mtl 文件
with open(mtl_file, "r") as mtl_f:
mtl_lines = mtl_f.readlines()
for line in mtl_lines:
if line.startswith("newmtl"):
# 重命名材质
original_material = line.split()[1]
new_material = current_materials.get(original_material, original_material)
merged_mtl.append(f"newmtl {new_material}\n")
elif line.startswith(("map_Kd", "map_Ka", "map_bump")):
# 替换贴图路径为相对路径
texture_name = os.path.basename(texture_file)
merged_mtl.append(f"{line.split()[0]} {texture_name}\n")
texture_files.add(texture_file)
else:
merged_mtl.append(line)
material_offset += 1
# 写入合并后的 .obj 和 .mtl 文件
with open(output_obj, "w") as obj_out:
obj_out.writelines(merged_obj)
with open(output_mtl, "w") as mtl_out:
mtl_out.writelines(merged_mtl)
print(f"texture_files====={texture_files}")
# 将纹理文件复制到输出目录
for texture_file in texture_files:
shutil.copy(texture_file, output_group_folder)
print(f"合并完成:{output_obj}{output_mtl}")
print(f"纹理文件已复制到:{output_group_folder}")
def move_compact_obj_to_file(input_folder,output_folder):
""""""
group_size = 50
obj_pid_list = os.listdir(input_folder)
group_obj_list = [obj_pid_list[i:i + group_size] for i in range(0, len(obj_pid_list), group_size)]
print(group_obj_list)
for group_obj in group_obj_list:
print(f"group_obj{group_obj}")
out_obj_file_name = group_obj[0]+"_"+group_obj[-1]
print(f"out_obj_file_name:::{out_obj_file_name}")
group_out_put_dir = os.path.join(output_folder,out_obj_file_name)
os.makedirs(group_out_put_dir,exist_ok=True)
for obj_name in group_obj:
original_obj_dir = os.path.join(input_folder,obj_name)
for file_name in os.listdir(original_obj_dir):
original_path = os.path.join(original_obj_dir,file_name)
dis_path = os.path.join(group_out_put_dir,file_name)
shutil.copy(original_path,dis_path)
print("分组完成。")
if __name__ == '__main__':
input_folder = "/data/datasets_20t/type_setting_test_data/print_compact_obj/"
output_folder = "/data/datasets_20t/type_setting_test_data/obj_merger_result/"
#merged_obj_for_group(input_folder,output_folder)
move_compact_obj_to_file(input_folder, output_folder)