Arch: Support for object colors in DAE importer/exporter
This commit is contained in:
parent
64912a59cc
commit
402aef2e63
|
@ -116,10 +116,31 @@ 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 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():
|
||||
#for prim in geom.primitives:
|
||||
#print(prim, dir(prim))
|
||||
meshdata = []
|
||||
if hasattr(prim,"triangles"):
|
||||
|
@ -139,18 +160,20 @@ def read(filename):
|
|||
#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)
|
||||
|
|
Loading…
Reference in New Issue
Block a user