""" Run or Resume simulation of a pattern dataset with MayaPy standalone mode Note that this module is executed in Maya (or by mayapy) How to use: * fill out system.json with approppriate paths Running itself: ./datasim.py --data --minibatch --config """ import argparse import sys import shutil from pathlib import Path # My modules import pygarment.data_config as data_config import pygarment.meshgen.datasim_utils as sim def get_command_args(): """command line arguments to control the run""" # https://stackoverflow.com/questions/40001892/reading-named-command-arguments parser = argparse.ArgumentParser() parser.add_argument('--data', '-d', help='name of dataset folder', type=str) parser.add_argument('--config', '-c', help='name of .json file with desired simulation&rendering config', type=str, default=None) parser.add_argument('--minibatch', '-b', help='number of examples to simulate in this run', type=int, default=None) parser.add_argument('--default_body', action='store_true', help='run dataset on default body') parser.add_argument('--caching', action='store_true', help='cache intermediate simulation') parser.add_argument('--rewrite_config', action='store_true', help='cache intermediate simulation') args = parser.parse_args() print(args) return args def gather_renders(out_data_path: Path, verbose=False): renders_path = out_data_path / 'renders' renders_path.mkdir(exist_ok=True) render_files = list(out_data_path.glob('**/*render*.png')) for file in render_files: try: shutil.copy(str(file), str(renders_path)) except shutil.SameFileError: if verbose: print(f'File {file} already exists') pass if __name__ == "__main__": command_args = get_command_args() system_config = data_config.Properties('./system.json') # ------ Dataset ------ dataset = command_args.data datapath = Path(system_config['datasets_path']) / dataset init_dataset_file = datapath / 'dataset_properties.yaml' # Create dataset_file in correct folder (default_body or random_body) body_type = 'default_body' if command_args.default_body else 'random_body' datapath = datapath / body_type / 'data' # Overwrite datapath to specific body type output_path = Path(system_config['datasets_sim']) / dataset / body_type output_path.mkdir(parents=True, exist_ok=True) dataset_file_body = output_path / f'dataset_properties_{body_type}.yaml' if not dataset_file_body.exists(): shutil.copy(str(init_dataset_file), str(dataset_file_body)) dataset_file = dataset_file_body props = data_config.Properties(dataset_file_body) if 'frozen' in props and props['frozen']: #Where is this set? # avoid accidential re-runs of data print('Warning: dataset is frozen, processing is skipped') sys.exit(0) # ------- Defining sim props ----- props.set_basic(data_folder=dataset) # in case data properties are from other dataset/folder, update info if command_args.config is not None: props.merge( Path(system_config['sim_configs_path']) / command_args.config, re_write=command_args.rewrite_config) # Re-write sim config only explicitly # ----- Main loop ---------- finished = sim.batch_sim( datapath, output_path, props, run_default_body=command_args.default_body, num_samples=command_args.minibatch, # run in mini-batch if requested caching=command_args.caching, force_restart=False) # ----- Try and resim fails once ----- if finished: # NOTE: Could be larger than a regular batch finished = sim.resim_fails( datapath, output_path, props, run_default_body=command_args.default_body, caching=command_args.caching) props.add_sys_info() # Save system information props.serialize(dataset_file) # ------ Gather renders ------- gather_renders(output_path) # -------- fin -------- if finished: # finished processing the dataset print('Dataset processing finished') sys.exit(0) else: sys.exit(1) # not finished dataset processing