diff --git a/src/Mod/Arch/importDAE.py b/src/Mod/Arch/importDAE.py index c40360651..843b61746 100644 --- a/src/Mod/Arch/importDAE.py +++ b/src/Mod/Arch/importDAE.py @@ -116,41 +116,64 @@ def read(filename): # Read the unitmeter info from dae file and compute unit to convert to mm unitmeter = col.assetInfo.unitmeter or 1 unit = unitmeter / 0.001 - for geom in col.scene.objects('geometry'): #for geom in col.geometries: - for prim in geom.primitives(): - #for prim in geom.primitives: - #print(prim, dir(prim)) - meshdata = [] - if hasattr(prim,"triangles"): - tset = prim.triangles() - elif hasattr(prim,"triangleset"): - tset = prim.triangleset() - else: - tset = [] - for tri in tset: - face = [] - for v in tri.vertices: - v = [x * unit for x in v] - face.append([v[0],v[1],v[2]]) - meshdata.append(face) - #print(meshdata) - newmesh = Mesh.Mesh(meshdata) - #print(newmesh) - obj = FreeCAD.ActiveDocument.addObject("Mesh::Feature","Mesh") - obj.Mesh = newmesh + #for geom in col.scene.objects('geometry'): + for node in col.scene.nodes: + if list(node.objects("geometry")): + color = None + # retrieving material + if "}" in node.xmlnode.tag: + bt = node.xmlnode.tag.split("}")[0]+"}" + gnode = node.xmlnode.find(bt+"instance_geometry") + if gnode is not None: + bnode = gnode.find(bt+"bind_material") + if bnode is not None: + tnode = bnode.find(bt+"technique_common") + if tnode is not None: + mnode = tnode.find(bt+"instance_material") + if mnode is not None: + if "target" in mnode.keys(): + mname = mnode.get("target").strip("#") + for m in col.materials: + if m.id == mname: + e = m.effect + if isinstance(e.diffuse,tuple): + color = e.diffuse + for geom in node.objects("geometry"): + for prim in geom.primitives(): + #print(prim, dir(prim)) + meshdata = [] + if hasattr(prim,"triangles"): + tset = prim.triangles() + elif hasattr(prim,"triangleset"): + tset = prim.triangleset() + else: + tset = [] + for tri in tset: + face = [] + for v in tri.vertices: + v = [x * unit for x in v] + face.append([v[0],v[1],v[2]]) + meshdata.append(face) + #print(meshdata) + newmesh = Mesh.Mesh(meshdata) + #print(newmesh) + obj = FreeCAD.ActiveDocument.addObject("Mesh::Feature","Mesh") + obj.Mesh = newmesh + if color and FreeCAD.GuiUp: + obj.ViewObject.ShapeColor = color def export(exportList,filename,tessellation=1): "called when freecad exports a file" if not checkCollada(): return p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch") scale = p.GetFloat("ColladaScalingFactor",1.0) + p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/View") + c = p.GetUnsigned("DefaultShapeColor",4294967295) + defaultcolor = (float((c>>24)&0xFF)/255.0,float((c>>16)&0xFF)/255.0,float((c>>8)&0xFF)/255.0) colmesh = collada.Collada() colmesh.assetInfo.upaxis = collada.asset.UP_AXIS.Z_UP - effect = collada.material.Effect("effect0", [], "phong", diffuse=(.7,.7,.7), specular=(1,1,1)) - mat = collada.material.Material("material0", "mymaterial", effect) - colmesh.effects.append(effect) - colmesh.materials.append(mat) + defaultmat = None objind = 0 scenenodes = [] objectslist = Draft.getGroupContents(exportList,walls=True,addgroups=True) @@ -185,10 +208,39 @@ def export(exportList,filename,tessellation=1): input_list = collada.source.InputList() input_list.addInput(0, 'VERTEX', "#cubeverts-array"+str(objind)) input_list.addInput(1, 'NORMAL', "#cubenormals-array"+str(objind)) - triset = geom.createTriangleSet(numpy.array(findex), input_list, "materialref") + matnode = None + matref = "materialref" + if hasattr(obj,"BaseMaterial"): + if obj.BaseMaterial: + if hasattr(obj.BaseMaterial,"Material"): + if "DiffuseColor" in obj.BaseMaterial.Material: + kd = tuple([float(k) for k in obj.BaseMaterial.Material["DiffuseColor"].strip("()").split(",")]) + effect = collada.material.Effect("effect_"+obj.BaseMaterial.Name, [], "phong", diffuse=kd, specular=(1,1,1)) + mat = collada.material.Material("mat_"+obj.BaseMaterial.Name, obj.BaseMaterial.Name, effect) + colmesh.effects.append(effect) + colmesh.materials.append(mat) + matref = "ref_"+obj.BaseMaterial.Name + matnode = collada.scene.MaterialNode(matref, mat, inputs=[]) + if not matnode: + if FreeCAD.GuiUp: + if hasattr(obj.ViewObject,"ShapeColor"): + kd = obj.ViewObject.ShapeColor[:3] + effect = collada.material.Effect("effect_"+obj.Name, [], "phong", diffuse=kd, specular=(1,1,1)) + mat = collada.material.Material("mat_"+obj.Name, obj.Name, effect) + colmesh.effects.append(effect) + colmesh.materials.append(mat) + matref = "ref_"+obj.Name + matnode = collada.scene.MaterialNode(matref, mat, inputs=[]) + if not matnode: + if not defaultmat: + effect = collada.material.Effect("effect_default", [], "phong", diffuse=defaultcolor, specular=(1,1,1)) + defaultmat = collada.material.Material("mat_default", "default_material", effect) + colmesh.effects.append(effect) + colmesh.materials.append(defaultmat) + matnode = collada.scene.MaterialNode(matref, defaultmat, inputs=[]) + triset = geom.createTriangleSet(numpy.array(findex), input_list, matref) geom.primitives.append(triset) colmesh.geometries.append(geom) - matnode = collada.scene.MaterialNode("materialref", mat, inputs=[]) geomnode = collada.scene.GeometryNode(geom, [matnode]) node = collada.scene.Node("node"+str(objind), children=[geomnode]) scenenodes.append(node)