Browse Source

Support for explicit length unit override in X3D header

Seva Alekseyev 8 years ago
parent
commit
87bff34eb6
1 changed files with 24 additions and 4 deletions
  1. 24 4
      plugins/X3DReader/X3DReader.py

+ 24 - 4
plugins/X3DReader/X3DReader.py

@@ -32,11 +32,31 @@ class X3DReader(MeshReader):
         try:
             self.sceneNodes = []
             self.fileName = file_name
-            self.transform = Matrix()
-            self.transform.setByScaleVector(Vector(1000, 1000, 1000))
             
             tree = ET.parse(file_name)
-            self.processNode(tree.getroot())
+            root = tree.getroot()
+            
+            if root.tag != "X3D":
+                return None
+
+            scale = 1000 # Default X3D unit it one meter, while Cura's is one mm            
+            if root[0].tag == "head":
+                for headNode in root[0]:
+                    if headNode.tag == "unit" and headNode.attrib.get("category") == "length":
+                        scale *= float.parse(headNode.attrib["conversionFactor"])
+                        break 
+                scene = root[1]
+            else:
+                scene = root[0]
+                
+            if scene.tag != "Scene":
+                return None 
+            
+            self.transform = Matrix()
+            self.transform.setByScaleVector(Vector(scale, scale, scale))
+            
+            # This will populate the sceneNodes array
+            self.processChildNodes(scene)
             
             if len(self.sceneNodes) > 1:
                 theScene = SceneNode()
@@ -68,7 +88,7 @@ class X3DReader(MeshReader):
             return
         
         tag = xmlNode.tag
-        if tag in ("X3D", "Scene", "Group", "StaticGroup", "CADAssembly", "CADFace", "CADLayer", "CADPart", "Collision"):
+        if tag in ("Group", "StaticGroup", "CADAssembly", "CADFace", "CADLayer", "CADPart", "Collision"):
             self.processChildNodes(xmlNode)
         elif tag == "LOD":
             self.processNode(xmlNode[0])