[X3D-Ecosystem] Follow up. x3d.py loader
John Carlson
yottzumm at gmail.com
Thu Apr 10 15:51:43 PDT 2025
Aaron:
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.
import json
from x3d import *
from x3d import _X3DNode
class JSON_X3D(X3D):
def parseJSON(self, data):
if '@version' in data:
self.version = data["@version"]
if '@profile' in data:
self.profile = data["@profile"]
if 'head' in data:
self.head = JSON_head()
self.head.parseJSON(data["head"])
if 'Scene' in data:
self.Scene = JSON_Scene()
self.Scene.parseJSON(data["Scene"])
return self
class JSON_head(head):
def parseJSON(self, data):
self.children = JSON_MFNode("head")
self.children.parseJSON(data)
self.children = tuple(self.children.value)
return self
class JSON_Scene(Scene):
def parseJSON(self, data):
if '-children' in data:
self.children = JSON_MFNode("Scene")
self.children.parseJSON(data)
self.children = tuple(self.children.value)
return self
class JSON_FontStyle(FontStyle):
def parseJSON(self, data):
if '@justify' in data:
self.justify = '" "'.join(data["@justify"])
return self
class JSON_Text(Text):
def parseJSON(self, data):
if '@DEF' in data:
self.DEF = data["@DEF"]
if '@string' in data:
self.string = '" "'.join(data["@string"])
if '-fontStyle' in data:
self.fontStyle = JSON_FontStyle()
self.fontStyle.parseJSON(data["-fontStyle"]["FontStyle"])
return self
class JSON_Sphere(Sphere):
def parseJSON(self, data):
if '@radius' in data:
self.radius = JSON_SFFloat()
self.radius.parseJSON(data["@radius"])
return self
class JSON_Appearance(Appearance):
def parseJSON(self, data):
if '-children' in data:
self.children = JSON_MFNode("Appearance")
self.children.parseJSON(data)
self.children = tuple(self.children.value)
if '-material' in data:
self.material = JSON_Material()
self.material.parseJSON(data["-material"]["Material"])
if '-texture' in data:
self.texture = JSON_ImageTexture()
self.texture.parseJSON(data["-texture"]["ImageTexture"])
return self
class JSON_ImageTexture(ImageTexture):
def parseJSON(self, data):
if '@DEF' in data:
self.DEF = data["@DEF"]
if '@url' in data:
self.url = '" "'.join(data["@url"])
return self
class JSON_Material(Material):
def parseJSON(self, data):
if '@DEF' in data:
self.DEF = data["@DEF"]
if '@USE' in data:
self.USE = data["@USE"]
if '@diffuseColor' in data:
self.diffuseColor = tuple(data["@diffuseColor"])
return self
class JSON_Shape(Shape):
def parseJSON(self, data):
if '-appearance' in data:
self.appearance = JSON_Appearance()
self.appearance.parseJSON(data["-appearance"]["Appearance"])
if '-geometry' in data:
# note that this loop should only do one iteration, otherwise
for key in data["-geometry"]:
self.geometry = eval("JSON_"+key)()
self.geometry.parseJSON(data["-geometry"][key])
return self
class JSON_Group(Group):
def parseJSON(self, data):
if '-children' in data:
self.children = JSON_MFNode("Group")
self.children.parseJSON(data)
self.children = tuple(self.children.value)
return self
class JSON_Transform(Transform):
def parseJSON(self, data):
if '@rotation' in data:
self.rotation = JSON_SFRotation()
self.rotation.parseJSON(data["@rotation"])
if '@translation' in data:
self.translation = JSON_SFVec3f()
self.translation.parseJSON(data["@translation"])
if '-children' in data:
self.children = JSON_MFNode("Transform")
self.children.parseJSON(data)
self.children = tuple(self.children.value)
return self
class JSON_component(component):
def parseJSON(self, data):
if '@name' in data:
self.name = data["@name"]
if '@level' in data:
self.level = data["@level"]
return self
class JSON_unit(unit):
def parseJSON(self, data):
if '@name' in data:
self.name = data["@name"]
if '@category' in data:
self.category = data["@category"]
return self
class JSON_meta(meta):
def parseJSON(self, data):
if '@name' in data:
self.name = data["@name"]
if '@content' in data:
self.content = data["@content"]
return self
class JSON_WorldInfo(WorldInfo):
def parseJSON(self, data):
if '@info' in data:
self.info = data["@info"]
if '@title' in data:
self.title = data["@title"]
return self
class JSON_SFRotation(SFRotation):
def parseJSON(self, data):
self.value = tuple(data)
return self
class JSON_Comment(Comment):
def parseJSON(self, data):
self.value = str(data)
return self
class JSON_SFFloat(SFFloat):
def parseJSON(self, data):
self.value = float(data)
return self
class JSON_SFVec3f(SFVec3f):
def parseJSON(self, data):
self.value = tuple(data)
return self
class JSON_Viewpoint(Viewpoint):
def parseJSON(self, data):
if '@DEF' in data:
self.DEF = data["@DEF"]
if '@centerOfRotation' in data:
self.centerOfRotation = JSON_SFVec3f()
self.centerOfRotation.parseJSON((data["@centerOfRotation"]))
if '@description' in data:
self.description = data["@description"]
if '@position' in data:
self.position = JSON_SFVec3f()
self.position.parseJSON(data["@position"])
return self
class JSON_SFNode(SFNode, _X3DNode):
def parseJSON(self, data):
for key in data:
if key.startswith('-') or key.startswith('#'):
self.value = eval("JSON_"+key[1:2].upper()+key[2:])()
else:
self.value = eval("JSON_"+key)()
self.value.parseJSON(data[key])
return self
class JSON_MFNode(MFNode):
def __init__(self, parent=None, value=None):
super().__init__(value=value)
self.parent = parent
def parseJSON(self, data):
self.value = []
if '-children' in data:
for c in data["-children"]:
sfnode = JSON_SFNode()
sfnode.parseJSON(c)
self.value.append(sfnode)
if self.parent == 'head':
if 'component' in data:
for p in data["component"]:
componentchild = JSON_component()
componentchild.parseJSON(m)
self.value.append(componentchild)
if 'unit' in data:
for u in data["unit"]:
unitchild = JSON_unit()
unitchild.parseJSON(m)
self.value.append(unitchild)
if 'meta' in data:
for m in data["meta"]:
metachild = JSON_meta()
metachild.parseJSON(m)
self.value.append(metachild)
return self
with open('../data/HelloWorld.json', encoding="utf-8") as json_file:
data = json.load(json_file)
newscene = JSON_X3D()
scene = newscene.parseJSON(data["X3D"])
print(scene.JSON(indentLevel=0, syntax="XML"))
with open('../personal/rubik.json', encoding="utf-8") as json_file:
data = json.load(json_file)
newscene = JSON_X3D()
scene = newscene.parseJSON(data["X3D"])
print(scene.JSON(indentLevel=0, syntax="XML"))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-ecosystem_web3d.org/attachments/20250410/1bcfe16b/attachment.html>
More information about the X3D-Ecosystem
mailing list