97 lines
3.7 KiB
Python
97 lines
3.7 KiB
Python
import os
|
|
from glob import glob
|
|
from datetime import datetime
|
|
import random
|
|
from tqdm import tqdm
|
|
from pathlib import Path
|
|
import yaml
|
|
import json
|
|
|
|
import argparse
|
|
|
|
from assets.garment_programs.meta_garment import MetaGarment
|
|
from assets.bodies.body_params import BodyParameters
|
|
from pygarment.data_config import Properties
|
|
|
|
_BODY_MEASUREMENTS = {
|
|
# Our model
|
|
'neutral': './assets/bodies/mean_all.yaml',
|
|
'mean_female': './assets/bodies/mean_female.yaml',
|
|
'mean_male': './assets/bodies/mean_male.yaml',
|
|
|
|
# SMPL
|
|
'f_smpl': './assets/bodies/f_smpl_average_A40.yaml',
|
|
'm_smpl': './assets/bodies/m_smpl_average_A40.yaml',
|
|
|
|
}
|
|
|
|
|
|
def _parse_file_path(filepath, fmt='*.yaml'):
|
|
if os.path.isfile(filepath): return [filepath]
|
|
elif os.path.isdir(filepath):
|
|
return glob(os.path.join(filepath, '**', fmt), recursive=True)
|
|
else:
|
|
return [x for x in filepath.split(',') if os.path.exists(x)]
|
|
|
|
|
|
if __name__ == '__main__':
|
|
parser = argparse.ArgumentParser(description="Convert GarmentCode spec to pattern.json")
|
|
parser.add_argument("-f", "--files", default="design_yamls", type=str, help="Path to design files.") # The folder where the design data is stored
|
|
parser.add_argument("-b", "--body", type=str, choices=['avg', 'thin', 'full-bodied', 'man','neutral'], default='neutral', help="Body to use.")
|
|
parser.add_argument("-o", "--output", default='./Logs', type=str, help="Output file path.")
|
|
parser.add_argument("-n", "--num_samples", default=-1, type=int, help="Number of samples to generate.")
|
|
parser.add_argument('--fmt', default="*_params.yaml", type=str, help="Design file name format, used in glob.")
|
|
|
|
args, cfg_cmd = parser.parse_known_args()
|
|
|
|
body = BodyParameters(_BODY_MEASUREMENTS[args.body])
|
|
design_files = _parse_file_path(args.files, args.fmt)
|
|
print("Found %d design files: \n"%(len(design_files)), '\n'.join(design_files))
|
|
|
|
if args.num_samples > 0 and len(design_files) > args.num_samples:
|
|
# design_files = design_files[:args.num_samples]
|
|
design_files = random.sample(design_files, args.num_samples)
|
|
|
|
succeed_cnt = 0
|
|
|
|
for design_file in tqdm(design_files):
|
|
|
|
try:
|
|
with open(design_file, 'rb') as f:
|
|
design_data = yaml.safe_load(f)['design']
|
|
|
|
piece = MetaGarment(os.path.basename(design_file).split('.')[0], body, design_data)
|
|
pattern = piece.assembly()
|
|
|
|
if piece.is_self_intersecting():
|
|
print(f'{piece.name} is Self-intersecting')
|
|
|
|
pattern_tag = '_' + datetime.now().strftime("%y%m%d-%H-%M-%S")
|
|
folder = pattern.serialize(
|
|
args.output,
|
|
tag=pattern_tag,
|
|
to_subfolder=True,
|
|
with_3d=False, with_text=False, view_ids=False)
|
|
|
|
print(f"\n[SUCCEED] Saved to {folder}.")
|
|
|
|
# # [OPTIONAL] copy original render views to the output folder
|
|
# shutil.copyfile(
|
|
# design_file.replace('_design_params.yaml', '_render_front.png'),
|
|
# os.path.join(folder, 'render_front.png'))
|
|
# shutil.copyfile(
|
|
# design_file.replace('_design_params.yaml', '_render_back.png'),
|
|
# os.path.join(folder, 'render_back.png'))
|
|
|
|
# # [OPTIONAL] save body measurements
|
|
# body.save(folder)
|
|
|
|
# # [OPTIONAL] save design parameters
|
|
# shutil.copy(design_file, folder)
|
|
|
|
except Exception as e:
|
|
print(f'[ERROR] {design_file}: {e}')
|
|
|
|
succeed_cnt += 1
|
|
|
|
print(f"Processing {len(design_files)} design files, {succeed_cnt} succeed.") |