|
|
|
|
|
|
|
|
|
|
|
|
|
|
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) |
|
|
|