[x3d-public] JSON import for x3d.py.

John Carlson yottzumm at gmail.com
Sat Dec 4 21:11:08 PST 2021


# Early preview release.

# JSON import for x3d.py.  Still needs much work, waiting for VRML export.

# struggling with MFNode not being an iterable currently.

import json
from x3d import *
from x3d import _X3DGeometryNode

class JSON_X3D(X3D):
     def parseJSON(self, data):
         self.version = data["@version"]
         self.profile = data["@profile"]
         self.head = JSON_head()
         self.head.parseJSON(data["head"])
         self.Scene = JSON_Scene()
         self.Scene.parseJSON(data["Scene"])
         return self

class JSON_head(head):
     def parseJSON(self, data):
         self.children = JSON_MFNode()
         self.children.parseJSON(data)
         for m in data["meta"]:
             metachild = JSON_meta()
             metachild.parseJSON(m)
             self.children.append(metachild)
         return self

class JSON_Scene(Scene):
     def parseJSON(self, data):
         self.children = JSON_MFNode()
         self.children.parseJSON(data)
         return self

class JSON_Geometry(_X3DGeometryNode):
     def parseJSON(self, data):
         return self

class JSON_Appearance(Appearance):
     def parseJSON(self, data):
         return self

class JSON_Material(Material):
     def parseJSON(self, data):
         return self

class JSON_Shape(Shape):
     def parseJSON(self, data):
         self.appearance = JSON_Appearance()
         self.appearance.parseJSON(data["-appearance"])
         self.geometry = JSON_Geometry(DEF='', USE='', class_='', 
id_='', style_='', IS='', metadata='')
         self.geometry.parseJSON(data["-geometry"])
         return self

class JSON_Group(Group):
     def parseJSON(self, data):
         self.children = JSON_MFNode()
         self.children.parseJSON(data)
         return self

class JSON_Transform(Transform):
     def parseJSON(self, data):
         self.children = JSON_MFNode()
         self.children.parseJSON(data)
         return self

class JSON_component(SFNode):
     def parseJSON(self, data):
         self.name = data["@name"]
         self.content = data["@level"]
         return self

class JSON_unit(unit):
     def parseJSON(self, data):
         self.name = data["@name"]
         self.content = data["@category"]
         return self

class JSON_meta(meta):
     def parseJSON(self, data):
         self.name = data["@name"]
         self.content = data["@content"]
         return self

class JSON_WorldInfo(WorldInfo):
     def parseJSON(self, data):
         self.info = data["@info"]
         self.title = data["@title"]
         return self

class JSON_SFVec3f(SFVec3f):
     def parseJSON(self, data):
         self.value = tuple(data)
         return self

class JSON_Viewpoint(Viewpoint):
     def parseJSON(self, data):
         self.DEF = data["@DEF"]
         self.centerOfRotation = JSON_SFVec3f()
self.centerOfRotation.parseJSON((data["@centerOfRotation"]))
         self.description = data["@description"]
         self.position = JSON_SFVec3f()
         self.position.parseJSON(data["@position"])
         return self


class JSON_SFNode(SFNode):
     def parseJSON(self, data):
         k = 0
         for key in data:
             #print(k)
             #print(key)
             #print(data[key])
             k = k + 1
             if key.startswith('-'):
                 self.value = eval("JSON_"+key[1:2].toupper()+key[2:])
             elif key.startswith('#'):
                 pass
             else:
                 self.value = eval("JSON_"+key)()
                 self.value.parseJSON(data[key])
         return self

class JSON_MFNode(MFNode):
     def parseJSON(self, data):
         print("")
         self.value = []
         for c in data["-children"]:
             sfnode = JSON_SFNode()
             # print(c)
             sfnode.parseJSON(c)
             self.value.append(sfnode)
         print(self.value)
         print("")
         return self.value

with open('HelloWorld.json', encoding="utf-8") as json_file:
     data = json.load(json_file)
     print(data)
     newscene = JSON_X3D()
     scene = newscene.parseJSON(data["X3D"])
     # print("")
     # print(scene)
     print(scene.XML())




More information about the x3d-public mailing list