<div dir="ltr">Aaron:<div><br></div><div>Following up on the x3d.py loader.  I started working on a generateable loader in python, just laying out some classes.    I have a couple of other projects which are more difficult intellectually.  Generating something like this might be easy, given your expertise.<div><br></div><div>import json<br>from x3d import *<br>from x3d import _X3DNode<br><br>class JSON_X3D(X3D):<br>    def parseJSON(self, data):<br>        if '@version' in data:<br>            self.version = data["@version"]<br>        if '@profile' in data:<br>            self.profile = data["@profile"]<br>        if 'head' in data:<br>            self.head = JSON_head()<br>            self.head.parseJSON(data["head"])<br>        if 'Scene' in data:<br>            self.Scene = JSON_Scene()<br>            self.Scene.parseJSON(data["Scene"])<br>        return self<br><br>class JSON_head(head):<br>    def parseJSON(self, data):<br>        self.children = JSON_MFNode("head")<br>        self.children.parseJSON(data)<br>        self.children = tuple(self.children.value)<br>        return self<br><br>class JSON_Scene(Scene):<br>    def parseJSON(self, data):<br>        if '-children' in data:<br>            self.children = JSON_MFNode("Scene")<br>            self.children.parseJSON(data)<br>            self.children = tuple(self.children.value)<br>        return self<br><br>class JSON_FontStyle(FontStyle):<br>    def parseJSON(self, data):<br>        if '@justify' in data:<br>            self.justify = '" "'.join(data["@justify"])<br>        return self<br><br>class JSON_Text(Text):<br>    def parseJSON(self, data):<br>        if '@DEF' in data:<br>            self.DEF = data["@DEF"]<br>        if '@string' in data:<br>            self.string = '" "'.join(data["@string"])<br>        if '-fontStyle' in data:<br>            self.fontStyle = JSON_FontStyle()<br>            self.fontStyle.parseJSON(data["-fontStyle"]["FontStyle"])<br>        return self<br><br>class JSON_Sphere(Sphere):<br>    def parseJSON(self, data):<br>        if '@radius' in data:<br>            self.radius = JSON_SFFloat()<br>            self.radius.parseJSON(data["@radius"])<br>        return self<br><br>class JSON_Appearance(Appearance):<br>    def parseJSON(self, data):<br>        if '-children' in data:<br>            self.children = JSON_MFNode("Appearance")<br>            self.children.parseJSON(data)<br>            self.children = tuple(self.children.value)<br>        if '-material' in data:<br>            self.material = JSON_Material()<br>            self.material.parseJSON(data["-material"]["Material"])<br>        if '-texture' in data:<br>            self.texture = JSON_ImageTexture()<br>            self.texture.parseJSON(data["-texture"]["ImageTexture"])<br>        return self<br><br>class JSON_ImageTexture(ImageTexture):<br>    def parseJSON(self, data):<br>        if '@DEF' in data:<br>            self.DEF = data["@DEF"]<br>        if '@url' in data:<br>            self.url = '" "'.join(data["@url"])<br>        return self<br><br>class JSON_Material(Material):<br>    def parseJSON(self, data):<br>        if '@DEF' in data:<br>            self.DEF = data["@DEF"]<br>        if '@USE' in data:<br>            self.USE = data["@USE"]<br>        if '@diffuseColor' in data:<br>            self.diffuseColor = tuple(data["@diffuseColor"])<br>        return self<br><br>class JSON_Shape(Shape):<br>    def parseJSON(self, data):<br>        if '-appearance' in data:<br>            self.appearance = JSON_Appearance()<br>            self.appearance.parseJSON(data["-appearance"]["Appearance"])<br>        if '-geometry' in data:<br>            # note that this loop should only do one iteration, otherwise<br>            for key in data["-geometry"]:<br>                self.geometry = eval("JSON_"+key)()<br>                self.geometry.parseJSON(data["-geometry"][key])<br>        return self<br><br>class JSON_Group(Group):<br>    def parseJSON(self, data):<br>        if '-children' in data:<br>            self.children = JSON_MFNode("Group")<br>            self.children.parseJSON(data)<br>            self.children = tuple(self.children.value)<br>        return self<br><br>class JSON_Transform(Transform):<br>    def parseJSON(self, data):<br>        if '@rotation' in data:<br>            self.rotation = JSON_SFRotation()<br>            self.rotation.parseJSON(data["@rotation"])<br>        if '@translation' in data:<br>            self.translation = JSON_SFVec3f()<br>            self.translation.parseJSON(data["@translation"])<br>        if '-children' in data:<br>            self.children = JSON_MFNode("Transform")<br>            self.children.parseJSON(data)<br>            self.children = tuple(self.children.value)<br>        return self<br><br>class JSON_component(component):<br>    def parseJSON(self, data):<br>        if '@name' in data:<br>            <a href="http://self.name">self.name</a> = data["@name"]<br>        if '@level' in data:<br>            self.level = data["@level"]<br>        return self<br><br>class JSON_unit(unit):<br>    def parseJSON(self, data):<br>        if '@name' in data:<br>            <a href="http://self.name">self.name</a> = data["@name"]<br>        if '@category' in data:<br>            self.category = data["@category"]<br>        return self<br><br>class JSON_meta(meta):<br>    def parseJSON(self, data):<br>        if '@name' in data:<br>            <a href="http://self.name">self.name</a> = data["@name"]<br>        if '@content' in data:<br>            self.content = data["@content"]<br>        return self<br><br>class JSON_WorldInfo(WorldInfo):<br>    def parseJSON(self, data):<br>        if '@info' in data:<br>            <a href="http://self.info">self.info</a> = data["@info"]<br>        if '@title' in data:<br>            self.title = data["@title"]<br>        return self<br><br>class JSON_SFRotation(SFRotation):<br>    def parseJSON(self, data):<br>        self.value = tuple(data)<br>        return self<br><br>class JSON_Comment(Comment):<br>    def parseJSON(self, data):<br>        self.value = str(data)<br>        return self<br><br>class JSON_SFFloat(SFFloat):<br>    def parseJSON(self, data):<br>        self.value = float(data)<br>        return self<br><br>class JSON_SFVec3f(SFVec3f):<br>    def parseJSON(self, data):<br>        self.value = tuple(data)<br>        return self<br><br>class JSON_Viewpoint(Viewpoint):<br>    def parseJSON(self, data):<br>        if '@DEF' in data:<br>            self.DEF = data["@DEF"]<br>        if '@centerOfRotation' in data:<br>            self.centerOfRotation = JSON_SFVec3f()<br>            self.centerOfRotation.parseJSON((data["@centerOfRotation"]))<br>        if '@description' in data:<br>            self.description = data["@description"]<br>        if '@position' in data:<br>            self.position = JSON_SFVec3f()<br>            self.position.parseJSON(data["@position"])<br>        return self<br><br><br>class JSON_SFNode(SFNode, _X3DNode):<br>    def parseJSON(self, data):<br>        for key in data:<br>            if key.startswith('-') or key.startswith('#'):<br>                self.value = eval("JSON_"+key[1:2].upper()+key[2:])()<br>            else:<br>                self.value = eval("JSON_"+key)()<br>            self.value.parseJSON(data[key])<br>        return self<br><br>class JSON_MFNode(MFNode):<br>    def __init__(self, parent=None, value=None):<br>        super().__init__(value=value)<br>        self.parent = parent<br>    def parseJSON(self, data):<br>        self.value = []<br>        if '-children' in data:<br>            for c in data["-children"]:<br>                sfnode = JSON_SFNode()<br>                sfnode.parseJSON(c)<br>                self.value.append(sfnode)<br>        if self.parent == 'head':<br>            if 'component' in data:<br>                for p in data["component"]:<br>                    componentchild = JSON_component()<br>                    componentchild.parseJSON(m)<br>                    self.value.append(componentchild)<br>            if 'unit' in data:<br>                for u in data["unit"]:<br>                    unitchild = JSON_unit()<br>                    unitchild.parseJSON(m)<br>                    self.value.append(unitchild)<br>            if 'meta' in data:<br>                for m in data["meta"]:<br>                    metachild = JSON_meta()<br>                    metachild.parseJSON(m)<br>                    self.value.append(metachild)<br>        return self<br><br>with open('../data/HelloWorld.json', encoding="utf-8") as json_file:<br>    data = json.load(json_file)<br>    newscene = JSON_X3D()<br>    scene = newscene.parseJSON(data["X3D"])<br>    print(scene.JSON(indentLevel=0, syntax="XML"))<br><br>with open('../personal/rubik.json', encoding="utf-8") as json_file:<br>    data = json.load(json_file)<br>    newscene = JSON_X3D()<br>    scene = newscene.parseJSON(data["X3D"])<br>    print(scene.JSON(indentLevel=0, syntax="XML"))<br></div></div></div>