| |
| |
| |
|
|
| import argparse |
| import base64 |
| from flask import Flask, render_template, request |
| import json |
| import os |
| import sys |
| import yaml |
|
|
| global cfg_path |
| global char_folder |
| app = Flask(__name__, template_folder=os.path.abspath("./fixer_app/")) |
|
|
|
|
| def load_cfg(path): |
| with open(path, "r") as f: |
| cfg_text = f.read() |
| cfg_yaml = yaml.load(cfg_text, Loader=yaml.Loader) |
| return cfg_yaml |
|
|
|
|
| def write_cfg(path, cfg): |
| with open(path, "w") as f: |
| yaml.dump(cfg, f) |
|
|
|
|
| @app.route("/") |
| def index(): |
| global cfg_path |
| global char_folder |
| cfg = load_cfg(cfg_path) |
|
|
| base64_img = {"data": ""} |
| with open(os.path.join(char_folder, "texture.png"), "rb") as image_file: |
| base64_img['data'] = str(base64.b64encode(image_file.read()), "utf-8") |
|
|
| return render_template('dist/index.html', cfg=cfg, image=base64_img) |
|
|
|
|
| @app.route("/annotations/submit", methods=["POST"]) |
| def post_cfg(): |
| output, message = process(request) |
| if output: |
| print(output) |
| return render_template('submit.html', code=output, message=message) |
|
|
|
|
| def process(request): |
| try: |
| formdata = request.form.get('data') |
| except Exception as e: |
| return None, f"Error parsing data from request. No JSON data was found: {e}" |
|
|
| try: |
| jsondata = json.loads(formdata) |
| except Exception as e: |
| return None, f"Error parsing submission data into JSON. Invalid format?: {e}" |
|
|
| |
| for joint in jsondata['skeleton']: |
| joint['loc'][0] = round(joint['loc'][0]) |
| joint['loc'][1] = round(joint['loc'][1]) |
|
|
| try: |
| new_cfg = yaml.dump(jsondata) |
| except Exception as e: |
| return None, f"Error converting submission to YAML data. Invalid format?: {e}" |
|
|
| try: |
| write_cfg(os.path.join(cfg_path), jsondata) |
| except Exception as e: |
| return None, f"Error saving down file to `{cfg_path}: {e}`" |
|
|
| return new_cfg, f"Successfully saved config to `{cfg_path}`" |
|
|
|
|
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser() |
| parser.add_argument('char_folder', type=str, help="the location of the character bundle") |
| parser.add_argument('--port', type=int, default=5050, help="the port the tool launches on") |
| args = parser.parse_args() |
|
|
| char_folder = args.char_folder |
| cfg_path = os.path.join(char_folder, "char_cfg.yaml") |
|
|
| if not os.path.isfile(cfg_path): |
| print(f"[Error] File not found. Expected config file at: {cfg_path}") |
| sys.exit(1) |
| app.run(port=args.port, debug=False) |
|
|