Arch: Support for object colors in DAE importer/exporter

This commit is contained in:
Yorik van Havre 2017-02-23 22:46:32 -03:00
parent 64912a59cc
commit 402aef2e63

View File

@ -116,41 +116,64 @@ def read(filename):
# Read the unitmeter info from dae file and compute unit to convert to mm # Read the unitmeter info from dae file and compute unit to convert to mm
unitmeter = col.assetInfo.unitmeter or 1 unitmeter = col.assetInfo.unitmeter or 1
unit = unitmeter / 0.001 unit = unitmeter / 0.001
for geom in col.scene.objects('geometry'):
#for geom in col.geometries: #for geom in col.geometries:
for prim in geom.primitives(): #for geom in col.scene.objects('geometry'):
#for prim in geom.primitives: for node in col.scene.nodes:
#print(prim, dir(prim)) if list(node.objects("geometry")):
meshdata = [] color = None
if hasattr(prim,"triangles"): # retrieving material
tset = prim.triangles() if "}" in node.xmlnode.tag:
elif hasattr(prim,"triangleset"): bt = node.xmlnode.tag.split("}")[0]+"}"
tset = prim.triangleset() gnode = node.xmlnode.find(bt+"instance_geometry")
else: if gnode is not None:
tset = [] bnode = gnode.find(bt+"bind_material")
for tri in tset: if bnode is not None:
face = [] tnode = bnode.find(bt+"technique_common")
for v in tri.vertices: if tnode is not None:
v = [x * unit for x in v] mnode = tnode.find(bt+"instance_material")
face.append([v[0],v[1],v[2]]) if mnode is not None:
meshdata.append(face) if "target" in mnode.keys():
#print(meshdata) mname = mnode.get("target").strip("#")
newmesh = Mesh.Mesh(meshdata) for m in col.materials:
#print(newmesh) if m.id == mname:
obj = FreeCAD.ActiveDocument.addObject("Mesh::Feature","Mesh") e = m.effect
obj.Mesh = newmesh 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): def export(exportList,filename,tessellation=1):
"called when freecad exports a file" "called when freecad exports a file"
if not checkCollada(): return if not checkCollada(): return
p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch") p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch")
scale = p.GetFloat("ColladaScalingFactor",1.0) 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 = collada.Collada()
colmesh.assetInfo.upaxis = collada.asset.UP_AXIS.Z_UP colmesh.assetInfo.upaxis = collada.asset.UP_AXIS.Z_UP
effect = collada.material.Effect("effect0", [], "phong", diffuse=(.7,.7,.7), specular=(1,1,1)) defaultmat = None
mat = collada.material.Material("material0", "mymaterial", effect)
colmesh.effects.append(effect)
colmesh.materials.append(mat)
objind = 0 objind = 0
scenenodes = [] scenenodes = []
objectslist = Draft.getGroupContents(exportList,walls=True,addgroups=True) 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 = collada.source.InputList()
input_list.addInput(0, 'VERTEX', "#cubeverts-array"+str(objind)) input_list.addInput(0, 'VERTEX', "#cubeverts-array"+str(objind))
input_list.addInput(1, 'NORMAL', "#cubenormals-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) geom.primitives.append(triset)
colmesh.geometries.append(geom) colmesh.geometries.append(geom)
matnode = collada.scene.MaterialNode("materialref", mat, inputs=[])
geomnode = collada.scene.GeometryNode(geom, [matnode]) geomnode = collada.scene.GeometryNode(geom, [matnode])
node = collada.scene.Node("node"+str(objind), children=[geomnode]) node = collada.scene.Node("node"+str(objind), children=[geomnode])
scenenodes.append(node) scenenodes.append(node)