Arch: Support for object colors in DAE importer/exporter
This commit is contained in:
parent
64912a59cc
commit
402aef2e63
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user