diff --git a/app/__init__.py b/app/__init__.py index 4fa2949..5a34485 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -18,7 +18,8 @@ from app.commands import ( load_property, gen_image_cache, gen_model_cache, - fix_clone_ids + fix_clone_ids, + split_ugc ) from app.models import Account, AccountInvitation, AuditLog @@ -89,6 +90,7 @@ def create_app(): app.cli.add_command(gen_image_cache) app.cli.add_command(gen_model_cache) app.cli.add_command(fix_clone_ids) + app.cli.add_command(split_ugc) register_logging(app) register_settings(app) diff --git a/app/commands.py b/app/commands.py index aaa2e65..31cd69d 100644 --- a/app/commands.py +++ b/app/commands.py @@ -15,6 +15,8 @@ from multiprocessing import Pool from functools import partial from sqlalchemy import func import time +import xml.etree.ElementTree as ET +import xmltodict @click.command("init_db") @@ -267,3 +269,120 @@ def find_or_create_account(name, email, password, gm_level=9): db.session.add(play_key) db.session.commit() return # account + + +@click.command("split_ugc") +@click.argument('path') +def split_ugc(path): + base = """ + + + + + + + + + + + + + + + +""" + # create element tree object + orig_lxfml = ET.parse(path) + + rigidsystems = orig_lxfml.findall('.//RigidSystem') + # print(len(rigidsystems)) + rigids_parts = {} + i = 0 + for rigidsytem in rigidsystems: + rigids = rigidsytem.findall('.//Rigid') + rigids_parts[i] = [] + for rigid in rigids: + rigids_parts[i].extend(rigid.attrib['boneRefs'].split(',')) + i += 1 + # print(rigids_parts) + groups = orig_lxfml.findall('.//Group') + + # print(len(groups)) + groups_parts = [] + for group in groups: + groups_parts.append(group.attrib['partRefs'].split(',')) + # print(groups_parts) + + # our output + models = [] + g = 0 + # get things by group + if len(groups_parts) > 0: + for group in groups_parts: + tmp_model = {"bricks": [], "rigidsystems": [], "group": g} + + for brick in group: + # find rigids + rigid = None + for k, v in rigids_parts.items(): + if brick in v: + tmp_model["rigidsystems"].extend(str(k)) + tmp_model["bricks"].extend(rigids_parts[k]) + # delete the rigid so that we do dupe it in the next step + del rigids_parts[k] + break + models.append(tmp_model) + g += 1 + # get stuff by rigids + if len(rigids_parts) > 0: + for k, v in rigids_parts.items(): + tmp_model = {"bricks": [], "rigidsystems": []} + tmp_model["rigidsystems"].extend(str(k)) + tmp_model["bricks"].extend(rigids_parts[k]) + models.append(tmp_model) + # print(models) + + # make out lxfml files + output_xmls = [] + if len(models) > 0: + for model in models: + new_xml = ET.fromstring(base) + for key, v in model.items(): + if key == "bricks": + bricks = new_xml.find(".//Bricks") + for brick in model[key]: + # get brick and then add it to our new xml + bricks.append(orig_lxfml.find(f".//Brick[@refID='{brick}']")) + if key == "rigidsystems": + new_rigidsystems = new_xml.find(".//RigidSystems") + for rigidsystem in model[key]: + new_rigidsystems.append(rigidsystems[int(rigidsystem)]) + if key == "group": + new_groupsystem = new_xml.find(".//GroupSystem") + new_groupsystem.append(groups[v]) + output_xmls.append(new_xml) + else: + raise Exception("WHY ARE THERE NO MODELS????") + + for xml in output_xmls: + rigidsystems = xml.findall('.//RigidSystem') + rigids_parts = {} + i = 0 + for rigidsytem in rigidsystems: + rigids = rigidsytem.findall('.//Rigid') + for rigid in rigids: + bricks = rigid.attrib['boneRefs'].split(',') + transformation = list(map(float, rigid.attrib['transformation'].split(','))) + print(f"x: {transformation[-3]}") + print(f"y: {transformation[-2]}") + print(f"z: {transformation[-1]}") + for brickID in bricks: + brick = xml.find(f".//Bone[@refID='{brickID}']") + old_transform = list(map(float, brick.attrib['transformation'].split(','))) + old_transform[-1] = old_transform[-1] - transformation[-1] + old_transform[-2] = old_transform[-2] - transformation[-2] + old_transform[-3] = old_transform[-3] - transformation[-3] + new_transform = ','.join(map(str, old_transform)) + brick.set("transformation", new_transform) + + print(ET.tostring(xml)) diff --git a/weedeater.lxfml b/weedeater.lxfml new file mode 100644 index 0000000..802bcc4 --- /dev/null +++ b/weedeater.lxfml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +