Arch: Enabled materials in IFC import & export

This commit is contained in:
Yorik van Havre 2015-04-17 19:43:54 -03:00
parent 017e0f38d1
commit 3e82f69ca5
3 changed files with 69 additions and 40 deletions

View File

@ -51,6 +51,18 @@ def getMaterialContainer():
return obj
def getDocumentMaterials():
'''getDocumentMaterials(): returns all the arch materials of the document'''
for obj in FreeCAD.ActiveDocument.Objects:
if obj.Name == "MaterialContainer":
mats = []
for o in obj.Group:
if o.isDerivedFrom("App::MaterialObjectPython"):
mats.append(o)
return mats
return []
class _CommandArchMaterial:
"the Arch Material command definition"
def GetResources(self):

View File

@ -157,29 +157,6 @@
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="Gui::PrefCheckBox" name="checkBox_3">
<property name="toolTip">
<string>Check this to retrieve object colors.</string>
</property>
<property name="text">
<string>Read colors</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>ifcReadColors</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Arch</cstring>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_13">
<item>

View File

@ -275,7 +275,6 @@ def insert(filename,docname,skip=[],only=[],root=None):
MERGE_MODE = p.GetInt("ifcImportMode",0)
if MERGE_MODE > 0:
SEPARATE_OPENINGS = False
READ_COLORS = p.GetBool("ifcReadColors",True)
if not SEPARATE_OPENINGS:
SKIP.append("IfcOpeningElement")
@ -312,6 +311,7 @@ def insert(filename,docname,skip=[],only=[],root=None):
products = ifcfile.by_type(ROOT_ELEMENT)
openings = ifcfile.by_type("IfcOpeningElement")
annotations = ifcfile.by_type("IfcAnnotation")
materials = ifcfile.by_type("IfcMaterial")
if DEBUG: print "Building relationships table...",
@ -322,6 +322,7 @@ def insert(filename,docname,skip=[],only=[],root=None):
properties = {} # { host:[property, ...], ... }
colors = {} # { id:(r,g,b) }
shapes = {} # { id:shaoe } only used for merge mode
mattable = {} # { objid:matid }
for r in ifcfile.by_type("IfcRelContainedInSpatialStructure"):
additions.setdefault(r.RelatingStructure.id(),[]).extend([e.id() for e in r.RelatedElements])
for r in ifcfile.by_type("IfcRelAggregates"):
@ -332,13 +333,16 @@ def insert(filename,docname,skip=[],only=[],root=None):
for obj in r.RelatedObjects:
if r.RelatingPropertyDefinition.is_a("IfcPropertySet"):
properties.setdefault(obj.id(),[]).extend([e.id() for e in r.RelatingPropertyDefinition.HasProperties])
if READ_COLORS:
for r in ifcfile.by_type("IfcStyledItem"):
if r.Item and r.Styles[0].is_a("IfcPresentationStyleAssignment"):
if r.Styles[0].Styles[0].is_a("IfcSurfaceStyle"):
if r.Styles[0].Styles[0].Styles[0].is_a("IfcSurfaceStyleRendering"):
if r.Styles[0].Styles[0].Styles[0].SurfaceColour:
c = r.Styles[0].Styles[0].Styles[0].SurfaceColour
for r in ifcfile.by_type("IfcRelAssociatesMaterial"):
for o in r.RelatedObjects:
mattable[o.id()] = r.RelatingMaterial.id()
for r in ifcfile.by_type("IfcStyledItem"):
if r.Styles[0].is_a("IfcPresentationStyleAssignment"):
if r.Styles[0].Styles[0].is_a("IfcSurfaceStyle"):
if r.Styles[0].Styles[0].Styles[0].is_a("IfcSurfaceStyleRendering"):
if r.Styles[0].Styles[0].Styles[0].SurfaceColour:
c = r.Styles[0].Styles[0].Styles[0].SurfaceColour
if r.Item:
for p in ifcfile.by_type("IfcProduct"):
if p.Representation:
for it in p.Representation.Representations:
@ -348,6 +352,13 @@ def insert(filename,docname,skip=[],only=[],root=None):
elif it.Items[0].is_a("IfcBooleanResult"):
if (it.Items[0].FirstOperand.id() == r.Item.id()):
colors[p.id()] = (c.Red,c.Green,c.Blue)
else:
for m in ifcfile.by_type("IfcMaterialDefinitionRepresentation"):
for it in m.Representations:
if it.Items:
if it.Items[0].id() == r.id():
colors[m.RepresentedMaterial.id()] = (c.Red,c.Green,c.Blue)
if only: # only import a list of IDs and their children
ids = []
while only:
@ -416,7 +427,7 @@ def insert(filename,docname,skip=[],only=[],root=None):
continue
else:
if DEBUG: print " no brep "
if DEBUG: print " no brep ",
if MERGE_MODE == 0:
@ -457,12 +468,8 @@ def insert(filename,docname,skip=[],only=[],root=None):
for freecadtype,ifctypes in typesmap.items():
if ptype in ifctypes:
obj = getattr(Arch,"make"+freecadtype)(baseobj=None,name=name)
obj.Label = name
objects[pid] = obj
elif baseobj:
obj = Arch.makeComponent(baseobj,name=name)
obj.Label = name
objects[pid] = obj
elif MERGE_MODE == 2:
@ -471,16 +478,15 @@ def insert(filename,docname,skip=[],only=[],root=None):
for freecadtype,ifctypes in typesmap.items():
if ptype in ifctypes:
obj = getattr(Arch,"make"+freecadtype)(baseobj=None,name=name)
obj.Label = name
objects[pid] = obj
elif baseobj:
obj = FreeCAD.ActiveDocument.addObject("Part::Feature",name)
obj.Label = name
obj.Shape = shape
if obj:
obj.Label = name
objects[pid] = obj
# properties
if pid in properties:
if hasattr(obj,"IfcAttributes"):
@ -592,6 +598,26 @@ def insert(filename,docname,skip=[],only=[],root=None):
FreeCAD.ActiveDocument.recompute()
# Materials
if DEBUG and materials: print "Creating materials..."
for material in materials:
name = material.Name or "Material"
mat = Arch.makeMaterial(name=name)
mdict = {}
if material.id() in colors:
mdict["Color"] = str(colors[material.id()])
if mdict:
mat.Material = mdict
for o,m in mattable.items():
if m == material.id():
if o in objects:
if hasattr(objects[o],"BaseMaterial"):
objects[o].BaseMaterial = mat
FreeCAD.ActiveDocument.recompute()
if FreeCAD.GuiUp:
import FreeCADGui
FreeCADGui.SendMsgToActiveView("ViewFit")
@ -798,6 +824,20 @@ def export(exportList,filename):
ifcfile.createIfcRelAggregates(ifcopenshell.guid.compress(uuid.uuid1().hex),history,'SiteLink','',sites[0],buildings)
ifcfile.createIfcRelContainedInSpatialStructure(ifcopenshell.guid.compress(uuid.uuid1().hex),history,'BuildingLink','',products.values(),buildings[0])
# materials
materials = {}
for m in Arch.getDocumentMaterials():
mat = ifcfile.createIfcMaterial(str(m.Label))
materials[m.Label] = mat
if "Color" in m.Material:
rgb = tuple([float(f) for f in m.Material['Color'].strip("()").split(",")])
col = ifcfile.createIfcColourRgb(None,rgb[0],rgb[1],rgb[2])
ssr = ifcfile.createIfcSurfaceStyleRendering(col,None,None,None,None,None,None,None,"FLAT")
iss = ifcfile.createIfcSurfaceStyle(None,"BOTH",[ssr])
psa = ifcfile.createIfcPresentationStyleAssignment([iss])
isi = ifcfile.createIfcStyledItem(None,[psa],None)
isr = ifcfile.createIfcStyledRepresentation(context,"Style","Material",[isi])
imd = ifcfile.createIfcMaterialDefinitionRepresentation(None,None,[isr],mat)
if DEBUG: print "writing ",filename,"..."
ifcfile.write(filename)