diff --git a/src/Mod/Arch/Resources/ui/preferences-ifc.ui b/src/Mod/Arch/Resources/ui/preferences-ifc.ui
index 234742523e..90d44731a1 100644
--- a/src/Mod/Arch/Resources/ui/preferences-ifc.ui
+++ b/src/Mod/Arch/Resources/ui/preferences-ifc.ui
@@ -6,8 +6,8 @@
0
0
- 456
- 728
+ 445
+ 748
@@ -40,44 +40,36 @@
-
-
-
-
-
-
- Show verbose information during import and export of IFC files
-
-
- Show debug messages
-
-
- ifcDebug
-
-
- Mod/Arch
-
-
-
-
+
+
+ Show verbose information during import and export of IFC files
+
+
+ Show debug messages
+
+
+ ifcDebug
+
+
+ Mod/Arch
+
+
-
-
-
-
-
-
- Create clones when objects have shared geometry
-
-
- true
-
-
- ifcCreateClones
-
-
- Mod/Arch
-
-
-
-
+
+
+ Create clones when objects have shared geometry
+
+
+ true
+
+
+ ifcCreateClones
+
+
+ Mod/Arch
+
+
@@ -209,124 +201,100 @@
-
-
-
-
-
-
- If this is checked, openings will be imported as subtractions, otherwise wall shapes will already have their openings subtracted
-
-
- Separate openings
-
-
- ifcSeparateOpenings
-
-
- Mod/Arch
-
-
-
-
+
+
+ If this is checked, openings will be imported as subtractions, otherwise wall shapes will already have their openings subtracted
+
+
+ Separate openings
+
+
+ ifcSeparateOpenings
+
+
+ Mod/Arch
+
+
-
-
-
-
-
-
- If this is checked, the importer will try to detect extrusions. This might slow things down...
-
-
- Detect extrusions
-
-
- ifcGetExtrusions
-
-
- Mod/Arch
-
-
-
-
+
+
+ If this is checked, the importer will try to detect extrusions. This might slow things down...
+
+
+ Detect extrusions
+
+
+ ifcGetExtrusions
+
+
+ Mod/Arch
+
+
-
-
-
-
-
-
- Split walls made of multiple layers
-
-
- Split multilayer walls
-
-
- ifcSplitLayers
-
-
- Mod/Arch
-
-
-
-
+
+
+ Split walls made of multiple layers
+
+
+ Split multilayer walls
+
+
+ ifcSplitLayers
+
+
+ Mod/Arch
+
+
-
-
-
-
-
-
- If this is checked, object names will be prefixed with the IFC ID number
-
-
- Prefix names with ID number
-
-
- ifcPrefixNumbers
-
-
- Mod/Arch
-
-
-
-
+
+
+ If this is checked, object names will be prefixed with the IFC ID number
+
+
+ Prefix names with ID number
+
+
+ ifcPrefixNumbers
+
+
+ Mod/Arch
+
+
-
-
-
-
-
-
- If several materials with the same name are found in the IFC file, they will be treated as one.
-
-
- Merge materials with same name
-
-
- ifcMergeMaterials
-
-
- Mod/Arch
-
-
-
-
+
+
+ If several materials with the same name are found in the IFC file, they will be treated as one.
+
+
+ Merge materials with same name
+
+
+ ifcMergeMaterials
+
+
+ Mod/Arch
+
+
-
-
-
-
-
-
- If checked each object will have their Ifc Properties stored in a spreadsheet object.
-
-
- Import Ifc Properties in spreadsheet
-
-
- ifcImportProperties
-
-
- Mod/Arch
-
-
-
-
+
+
+ If checked each object will have their Ifc Properties stored in a spreadsheet object.
+
+
+ Import Ifc Properties in spreadsheet
+
+
+ ifcImportProperties
+
+
+ Mod/Arch
+
+
-
@@ -359,24 +327,20 @@
-
-
-
-
-
-
- Fit view during import on the imported objects. This will slow down the import, but one can watch the import.
-
-
- Fit view while importing
-
-
- ifcFitViewOnImport
-
-
- Mod/Arch
-
-
-
-
+
+
+ Fit view during import on the imported objects. This will slow down the import, but one can watch the import.
+
+
+ Fit view while importing
+
+
+ ifcFitViewOnImport
+
+
+ Mod/Arch
+
+
@@ -388,164 +352,142 @@
-
-
-
-
-
-
- Some IFC viewers don't like objects exported as extrusions. Use this to force all objects to be exported as BREP geometry.
-
-
- Force export as Brep
-
-
- ifcExportAsBrep
-
-
- Mod/Arch
-
-
-
-
+
+
+ Some IFC viewers don't like objects exported as extrusions. Use this to force all objects to be exported as BREP geometry.
+
+
+ Force export as Brep
+
+
+ ifcExportAsBrep
+
+
+ Mod/Arch
+
+
-
-
-
-
-
-
- Use triangulation options set in the DAE options page
-
-
- Use DAE triangulation options
-
-
- ifcUseDaeOptions
-
-
- Mod/Arch
-
-
-
-
+
+
+ Use triangulation options set in the DAE options page
+
+
+ Use DAE triangulation options
+
+
+ ifcUseDaeOptions
+
+
+ Mod/Arch
+
+
-
-
-
-
-
-
- Curved shapes that cannot be represented as curves in IFC are decomposed into flat facets. If this is checked, some additional calculation is done to join coplanar facets.
-
-
- Join coplanar facets when triangulating
-
-
- ifcJoinCoplanarFacets
-
-
- Mod/Arch
-
-
-
-
+
+
+ Curved shapes that cannot be represented as curves in IFC are decomposed into flat facets. If this is checked, some additional calculation is done to join coplanar facets.
+
+
+ Join coplanar facets when triangulating
+
+
+ ifcJoinCoplanarFacets
+
+
+ Mod/Arch
+
+
-
-
-
-
-
-
- When exporting objects without UID, the generated UID will be stored inside the FreeCAD object for reuse next time that object is exported, which gives smaller diffs between versions
-
-
- Store IFC universal ID in FreeCAD objects
-
-
- true
-
-
- ifcStoreUid
-
-
- Mod/Arch
-
-
-
-
+
+
+ When exporting objects without UID, the generated UID will be stored inside the FreeCAD object for reuse next time that object is exported, which gives smaller diffs between versions
+
+
+ Store IFC universal ID in FreeCAD objects
+
+
+ true
+
+
+ ifcStoreUid
+
+
+ Mod/Arch
+
+
-
-
-
-
-
-
- Warning, experimental feature!
-
-
- Use IfcOpenShell serializer if available
-
-
- ifcSerialize
-
-
- Mod/Arch
-
-
-
-
+
+
+ Warning, experimental feature!
+
+
+ Use IfcOpenShell serializer if available
+
+
+ ifcSerialize
+
+
+ Mod/Arch
+
+
-
-
-
-
-
-
- Export 2D objects as IfcAnnotations
-
-
- true
-
-
- ifcExport2D
-
-
- Mod/Arch
-
-
-
-
+
+
+ Export 2D objects as IfcAnnotations
+
+
+ true
+
+
+ ifcExport2D
+
+
+ Mod/Arch
+
+
-
-
-
-
-
-
- If this is checked, all FreeCAD object properties will be stored inside the exported objects, allowing to recreate a full parametric model on reimport.
-
-
- Export full FreeCAD parametric model
-
-
- IfcExportFreeCADProperties
-
-
- Mod/Arch
-
-
-
-
+
+
+ If this is checked, all FreeCAD object properties will be stored inside the exported objects, allowing to recreate a full parametric model on reimport.
+
+
+ Export full FreeCAD parametric model
+
+
+ IfcExportFreeCADProperties
+
+
+ Mod/Arch
+
+
+
+ -
+
+
+ If this is checked, when possible, similar entities will be used only once in the file. This can reduce the file size a lot, but will make it less easily readable by humans
+
+
+ Reuse similar entities
+
+
+ true
+
+
+ ifcCompress
+
+
+ Mod/Arch
+
+
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
diff --git a/src/Mod/Arch/importIFC.py b/src/Mod/Arch/importIFC.py
index a36713ff30..912c856896 100644
--- a/src/Mod/Arch/importIFC.py
+++ b/src/Mod/Arch/importIFC.py
@@ -1125,6 +1125,123 @@ def insert(filename,docname,skip=[],only=[],root=None):
return doc
+
+class recycler:
+
+ "a mechanism to reuse ifc entities if needed"
+
+ def __init__(self,ifcfile):
+
+ self.ifcfile = ifcfile
+ self.compress = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch").GetBool("ifcCompress",True)
+ self.cartesianpoints = {}
+ self.directions = {}
+ self.polylines = {}
+ self.propertysinglevalues = {}
+ self.axis2placement3ds = {}
+ self.localplacements = {}
+ self.rgbs = {}
+ self.ssrenderings = {}
+ self.transformationoperators = {}
+ self.spared = 0
+
+ def createIfcCartesianPoint(self,points):
+ if self.compress and points in self.cartesianpoints:
+ self.spared += 1
+ return self.cartesianpoints[points]
+ else:
+ c = self.ifcfile.createIfcCartesianPoint(points)
+ if self.compress:
+ self.cartesianpoints[points] = c
+ return c
+
+ def createIfcDirection(self,points):
+ if self.compress and points in self.directions:
+ self.spared += 1
+ return self.directions[points]
+ else:
+ c = self.ifcfile.createIfcDirection(points)
+ if self.compress:
+ self.directions[points] = c
+ return c
+
+ def createIfcPolyline(self,points):
+ key = "".join([str(p.Coordinates) for p in points])
+ if self.compress and key in self.polylines:
+ self.spared += 1
+ return self.polylines[key]
+ else:
+ c = self.ifcfile.createIfcPolyline(points)
+ if self.compress:
+ self.polylines[key] = c
+ return c
+
+ def createIfcPropertySingleValue(self,name,ptype,pvalue):
+ key = name + ptype + pvalue
+ if self.compress and key in self.propertysinglevalues:
+ self.spared += 1
+ return self.propertysinglevalues[key]
+ else:
+ c = self.ifcfile.createIfcPropertySingleValue(key,None,ifcfile.create_entity(ptype,pvalue),None)
+ if self.compress:
+ self.propertysinglevalues[key] = c
+ return c
+
+ def createIfcAxis2Placement3D(self,p1,p2,p3):
+ key = str(p1.Coordinates) + str(p2.DirectionRatios) + str(p3.DirectionRatios)
+ if self.compress and key in self.axis2placement3ds:
+ self.spared += 1
+ return self.axis2placement3ds[key]
+ else:
+ c = self.ifcfile.createIfcAxis2Placement3D(p1,p2,p3)
+ if self.compress:
+ self.axis2placement3ds[key] = c
+ return c
+
+ def createIfcLocalPlacement(self,gpl):
+ key = str(gpl.Location.Coordinates) + str(gpl.Axis.DirectionRatios) + str(gpl.RefDirection.DirectionRatios)
+ if self.compress and key in self.localplacements:
+ self.spared += 1
+ return self.localplacements[key]
+ else:
+ c = self.ifcfile.createIfcLocalPlacement(None,gpl)
+ if self.compress:
+ self.localplacements[key] = c
+ return c
+
+ def createIfcColourRgb(self,r,g,b):
+ key = (r,g,b)
+ if self.compress and key in self.rgbs:
+ self.spared += 1
+ return self.rgbs[key]
+ else:
+ c = self.ifcfile.createIfcColourRgb(None,r,g,b)
+ if self.compress:
+ self.rgbs[key] = c
+ return c
+
+ def createIfcSurfaceStyleRendering(self,col):
+ key = (col.Red,col.Green,col.Blue)
+ if self.compress and key in self.ssrenderings:
+ self.spared += 1
+ return self.ssrenderings[key]
+ else:
+ c = self.ifcfile.createIfcSurfaceStyleRendering(col,None,None,None,None,None,None,None,"FLAT")
+ if self.compress:
+ self.ssrenderings[key] = c
+ return c
+
+ def createIfcCartesianTransformationOperator3D(self,axis1,axis2,origin,scale,axis3):
+ key = str(axis1.DirectionRatios) + str(axis2.DirectionRatios) + str(origin.Coordinates) + str(scale) + str(axis3.DirectionRatios)
+ if self.compress and key in self.transformationoperators:
+ self.spared += 1
+ return self.transformationoperators[key]
+ else:
+ c = self.ifcfile.createIfcCartesianTransformationOperator3D(axis1,axis2,origin,scale,axis3)
+ if self.compress:
+ self.transformationoperators[key] = c
+ return c
+
def export(exportList,filename):
@@ -1197,6 +1314,11 @@ def export(exportList,filename):
groups = {} # { Host: [Child,Child,...] }
profiledefs = {} # { ProfileDefString:profiledef,...}
shapedefs = {} # { ShapeDefString:[shapes],... }
+
+ # reusable entity system
+
+ global ifcbin
+ ifcbin = recycler(ifcfile)
# build clones table
@@ -1266,9 +1388,9 @@ def export(exportList,filename):
for axg in obj.Proxy.getAxisData(obj):
ifcaxg = []
for ax in axg:
- p1 = ifcfile.createIfcCartesianPoint(tuple(FreeCAD.Vector(ax[0]).multiply(0.001)))
- p2 = ifcfile.createIfcCartesianPoint(tuple(FreeCAD.Vector(ax[1]).multiply(0.001)))
- pol = ifcfile.createIfcPolyline([p1,p2])
+ p1 = ifcbin.createIfcCartesianPoint(tuple(FreeCAD.Vector(ax[0]).multiply(0.001)))
+ p2 = ifcbin.createIfcCartesianPoint(tuple(FreeCAD.Vector(ax[1]).multiply(0.001)))
+ pol = ifcbin.createIfcPolyline([p1,p2])
ifcpols.append(pol)
axis = ifcfile.createIfcGridAxis(ax[2],pol,True)
ifcaxg.append(axis)
@@ -1286,11 +1408,11 @@ def export(exportList,filename):
if len(ifcaxes) > 2:
v = ifcaxes[2]
if DEBUG: print(str(count).ljust(3)," : ", ifctype, " (",str(len(ifcpols)),"axes ) : ",name)
- xvc = ifcfile.createIfcDirection((1.0,0.0,0.0))
- zvc = ifcfile.createIfcDirection((0.0,0.0,1.0))
- ovc = ifcfile.createIfcCartesianPoint((0.0,0.0,0.0))
- gpl = ifcfile.createIfcAxis2Placement3D(ovc,zvc,xvc)
- plac = ifcfile.createIfcLocalPlacement(None,gpl)
+ xvc = ifcbin.createIfcDirection((1.0,0.0,0.0))
+ zvc = ifcbin.createIfcDirection((0.0,0.0,1.0))
+ ovc = ifcbin.createIfcCartesianPoint((0.0,0.0,0.0))
+ gpl = ifcbin.createIfcAxis2Placement3D(ovc,zvc,xvc)
+ plac = ifcbin.createIfcLocalPlacement(gpl)
cset = ifcfile.createIfcGeometricCurveSet(ifcpols)
#subc = ifcfile.createIfcGeometricRepresentationSubContext('FootPrint','Model',context,None,"MODEL_VIEW",None,None,None,None,None)
srep = ifcfile.createIfcShapeRepresentation(context,'FootPrint',"GeometricCurveSet",ifcpols)
@@ -1438,7 +1560,7 @@ def export(exportList,filename):
except:
pvalue = pvalue.encode("utf8")
if DEBUG:print(" warning: unable to export property as numeric value:",key,pvalue)
- p = ifcfile.createIfcPropertySingleValue(str(key),None,ifcfile.create_entity(str(ptype),pvalue),None)
+ p = ifcbin.createIfcPropertySingleValue(str(key),str(ptype),pvalue)
psets.setdefault(pset,[]).append(p)
for pname,props in psets.items():
pset = ifcfile.createIfcPropertySet(ifcopenshell.guid.compress(uuid.uuid1().hex),history,pname,None,props)
@@ -1495,7 +1617,7 @@ def export(exportList,filename):
print("key",prop["key"],type(prop["key"]))
print("tp",prop["tp"],type(prop["tp"]))
print("val",prop["val"],type(prop["val"]))
- props.append(ifcfile.createIfcPropertySingleValue(prop["key"],None,ifcfile.create_entity(prop["tp"],prop["val"]),None))
+ props.append(ifcbin.createIfcPropertySingleValue(prop["key"],prop["tp"],prop["val"]))
pset = ifcfile.createIfcPropertySet(ifcopenshell.guid.compress(uuid.uuid1().hex),history,cat,None,props)
ifcfile.createIfcRelDefinesByProperties(ifcopenshell.guid.compress(uuid.uuid1().hex),history,None,None,[product],pset)
@@ -1531,7 +1653,7 @@ def export(exportList,filename):
val = int(val)
else:
val = float(val)
- props.append(ifcfile.createIfcPropertySingleValue(str(key),None,ifcfile.create_entity(str(tp),val),None))
+ props.append(ifcbin.createIfcPropertySingleValue(str(key),str(tp),val))
if props:
pset = ifcfile.createIfcPropertySet(ifcopenshell.guid.compress(uuid.uuid1().hex),history,'PropertySet',None,props)
ifcfile.createIfcRelDefinesByProperties(ifcopenshell.guid.compress(uuid.uuid1().hex),history,None,None,[product],pset)
@@ -1544,18 +1666,18 @@ def export(exportList,filename):
# exporting all the object properties
FreeCADProps = []
FreeCADGuiProps = []
- FreeCADProps.append(ifcfile.createIfcPropertySingleValue("FreeCADType",None,ifcfile.create_entity("IfcText",obj.TypeId),None))
- FreeCADProps.append(ifcfile.createIfcPropertySingleValue("FreeCADName",None,ifcfile.create_entity("IfcText",obj.Name),None))
+ FreeCADProps.append(ifcbin.createIfcPropertySingleValue("FreeCADType","IfcText",obj.TypeId))
+ FreeCADProps.append(ifcbin.createIfcPropertySingleValue("FreeCADName","IfcText",obj.Name))
sets = [("App",obj)]
if hasattr(obj,"Proxy"):
if obj.Proxy:
- FreeCADProps.append(ifcfile.createIfcPropertySingleValue("FreeCADAppObject",None,ifcfile.create_entity("IfcText",str(obj.Proxy.__class__)),None))
+ FreeCADProps.append(ifcbin.createIfcPropertySingleValue("FreeCADAppObject","IfcText",str(obj.Proxy.__class__)))
if FreeCAD.GuiUp:
if obj.ViewObject:
sets.append(("Gui",obj.ViewObject))
if hasattr(obj.ViewObject,"Proxy"):
if obj.ViewObject.Proxy:
- FreeCADGuiProps.append(ifcfile.createIfcPropertySingleValue("FreeCADGuiObject",None,ifcfile.create_entity("IfcText",str(obj.ViewObject.Proxy.__class__)),None))
+ FreeCADGuiProps.append(ifcbin.createIfcPropertySingleValue("FreeCADGuiObject","IfcText",str(obj.ViewObject.Proxy.__class__)))
for realm,ctx in sets:
if ctx:
for prop in ctx.PropertiesList:
@@ -1597,9 +1719,9 @@ def export(exportList,filename):
if itype:
# TODO add description
if realm == "Gui":
- FreeCADGuiProps.append(ifcfile.createIfcPropertySingleValue("FreeCADGui_"+prop,None,ifcfile.create_entity(itype,ivalue),None))
+ FreeCADGuiProps.append(ifcbin.createIfcPropertySingleValue("FreeCADGui_"+prop,itype,ivalue))
else:
- FreeCADProps.append(ifcfile.createIfcPropertySingleValue("FreeCAD_"+prop,None,ifcfile.create_entity(itype,ivalue),None))
+ FreeCADProps.append(ifcbin.createIfcPropertySingleValue("FreeCAD_"+prop,itype,ivalue))
if FreeCADProps:
pset = ifcfile.createIfcPropertySet(ifcopenshell.guid.compress(uuid.uuid1().hex),history,'FreeCADPropertySet',None,FreeCADProps)
ifcfile.createIfcRelDefinesByProperties(ifcopenshell.guid.compress(uuid.uuid1().hex),history,None,None,[product],pset)
@@ -1715,8 +1837,8 @@ def export(exportList,filename):
rgb = tuple([float(f) for f in m.Material[colorslot].strip("()").split(",")])
break
if rgb:
- col = ifcfile.createIfcColourRgb(None,rgb[0],rgb[1],rgb[2])
- ssr = ifcfile.createIfcSurfaceStyleRendering(col,None,None,None,None,None,None,None,"FLAT")
+ col = ifcbin.createIfcColourRgb(rgb[0],rgb[1],rgb[2])
+ ssr = ifcbin.createIfcSurfaceStyleRendering(col)
iss = ifcfile.createIfcSurfaceStyle(m.Label.encode("utf8"),"BOTH",[ssr])
psa = ifcfile.createIfcPresentationStyleAssignment([iss])
isi = ifcfile.createIfcStyledItem(None,[psa],None)
@@ -1761,10 +1883,10 @@ def export(exportList,filename):
curvestyles = {}
if annotations and DEBUG: print("exporting 2D objects...")
for anno in annotations:
- xvc = ifcfile.createIfcDirection((1.0,0.0,0.0))
- zvc = ifcfile.createIfcDirection((0.0,0.0,1.0))
- ovc = ifcfile.createIfcCartesianPoint((0.0,0.0,0.0))
- gpl = ifcfile.createIfcAxis2Placement3D(ovc,zvc,xvc)
+ xvc = ifcbin.createIfcDirection((1.0,0.0,0.0))
+ zvc = ifcbin.createIfcDirection((0.0,0.0,1.0))
+ ovc = ifcbin.createIfcCartesianPoint((0.0,0.0,0.0))
+ gpl = ifcbin.createIfcAxis2Placement3D(ovc,zvc,xvc)
if anno.isDerivedFrom("Part::Feature"):
reps = []
sh = anno.Shape.copy()
@@ -1779,8 +1901,8 @@ def export(exportList,filename):
reps.append(createCurve(ifcfile,e))
elif anno.isDerivedFrom("App::Annotation"):
l = anno.Position
- pos = ifcfile.createIfcCartesianPoint((l.x,l.y,l.z))
- tpl = ifcfile.createIfcAxis2Placement3D(pos,None,None)
+ pos = ifcbin.createIfcCartesianPoint((l.x,l.y,l.z))
+ tpl = ifcbin.createIfcAxis2Placement3D(pos,None,None)
txt = ifcfile.createIfcTextLiteral(";".join(anno.LabelText).encode("utf8"),tpl,"LEFT")
reps = [txt]
@@ -1790,10 +1912,10 @@ def export(exportList,filename):
if rgb in curvestyles:
psa = curvestyles[rgb]
else:
- col = ifcfile.createIfcColourRgb(None,rgb[0],rgb[1],rgb[2])
- cvf = ifcfile.createIfcDraughtingPredefinedCurveFont("CONTINUOUS")
- ics = ifcfile.createIfcCurveStyle('Line',cvf,None,col)
- psa = ifcfile.createIfcPresentationStyleAssignment([ics])
+ col = ifcbin.createIfcColourRgb(rgb[0],rgb[1],rgb[2])
+ cvf = ifcbin.createIfcDraughtingPredefinedCurveFont("CONTINUOUS")
+ ics = ifcbin.createIfcCurveStyle('Line',cvf,None,col)
+ psa = ifcbin.createIfcPresentationStyleAssignment([ics])
curvestyles[rgb] = psa
for rep in reps:
isi = ifcfile.createIfcStyledItem(rep,[psa],None)
@@ -1821,6 +1943,14 @@ def export(exportList,filename):
FreeCAD.ActiveDocument.recompute()
os.remove(templatefile)
+
+ if DEBUG and ifcbin.compress:
+ f = pyopen(filename,"rb")
+ s = len(f.read().split("\n"))
+ f.close()
+ print("Compression ratio:",int((float(ifcbin.spared)/(s+ifcbin.spared))*100),"%")
+ del ifcbin
+
def createFromProperties(propsets,ifcfile):
@@ -1933,10 +2063,10 @@ def createCurve(ifcfile,wire):
p2 = 360 + p2
if da > 0:
follow = not(follow)
- xvc = ifcfile.createIfcDirection((1.0,0.0))
- ovc = ifcfile.createIfcCartesianPoint(tuple(e.Curve.Center))
- plc = ifcfile.createIfcAxis2Placement2D(ovc,xvc)
- cir = ifcfile.createIfcCircle(plc,e.Curve.Radius)
+ xvc = ifcbin.createIfcDirection((1.0,0.0))
+ ovc = ifcbin.createIfcCartesianPoint(tuple(e.Curve.Center))
+ plc = ifcbin.createIfcAxis2Placement2D(ovc,xvc)
+ cir = ifcbin.createIfcCircle(plc,e.Curve.Radius)
curve = ifcfile.createIfcTrimmedCurve(cir,[ifcfile.createIfcParameterValue(p1)],[ifcfile.createIfcParameterValue(p2)],follow,"PARAMETER")
else:
verts = [vertex.Point for vertex in e.Vertexes]
@@ -1948,8 +2078,8 @@ def createCurve(ifcfile,wire):
last = e.Vertexes[-1].Point
else:
last = e.Vertexes[-1].Point
- pts = [ifcfile.createIfcCartesianPoint(tuple(v)) for v in verts]
- curve = ifcfile.createIfcPolyline(pts)
+ pts = [ifcbin.createIfcCartesianPoint(tuple(v)) for v in verts]
+ curve = ifcbin.createIfcPolyline(pts)
segment = ifcfile.createIfcCompositeCurveSegment("CONTINUOUS",True,curve)
segments.append(segment)
if segments:
@@ -1964,9 +2094,9 @@ def getProfile(ifcfile,p):
import Part,DraftGeomUtils
profile = None
if len(p.Edges) == 1:
- pxvc = ifcfile.createIfcDirection((1.0,0.0))
- povc = ifcfile.createIfcCartesianPoint((0.0,0.0))
- pt = ifcfile.createIfcAxis2Placement2D(povc,pxvc)
+ pxvc = ifcbin.createIfcDirection((1.0,0.0))
+ povc = ifcbin.createIfcCartesianPoint((0.0,0.0))
+ pt = ifcbin.createIfcAxis2Placement2D(povc,pxvc)
if isinstance(p.Edges[0].Curve,Part.Circle):
# extruded circle
profile = ifcfile.createIfcCircleProfileDef("AREA",None,pt,p.Edges[0].Curve.Radius)
@@ -1980,8 +2110,8 @@ def getProfile(ifcfile,p):
outerwire = createCurve(ifcfile,f.OuterWire)
else:
w = Part.Wire(Part.__sortEdges__(f.OuterWire.Edges))
- pts = [ifcfile.createIfcCartesianPoint(tuple(v.Point)[:2]) for v in w.Vertexes+[w.Vertexes[0]]]
- outerwire = ifcfile.createIfcPolyline(pts)
+ pts = [ifcbin.createIfcCartesianPoint(tuple(v.Point)[:2]) for v in w.Vertexes+[w.Vertexes[0]]]
+ outerwire = ifcbin.createIfcPolyline(pts)
innerwires = []
for w in f.Wires:
if w.hashCode() != f.OuterWire.hashCode():
@@ -1989,8 +2119,8 @@ def getProfile(ifcfile,p):
innerwires.append(createCurve(ifcfile,w))
else:
w = Part.Wire(Part.__sortEdges__(w.Edges))
- pts = [ifcfile.createIfcCartesianPoint(tuple(v.Point)[:2]) for v in w.Vertexes+[w.Vertexes[0]]]
- innerwires.append(ifcfile.createIfcPolyline(pts))
+ pts = [ifcbin.createIfcCartesianPoint(tuple(v.Point)[:2]) for v in w.Vertexes+[w.Vertexes[0]]]
+ innerwires.append(ifcbin.createIfcPolyline(pts))
profile = ifcfile.createIfcArbitraryProfileDefWithVoids("AREA",None,outerwire,innerwires)
else:
if DraftGeomUtils.hasCurves(p):
@@ -1999,8 +2129,8 @@ def getProfile(ifcfile,p):
else:
# extruded polyline
w = Part.Wire(Part.__sortEdges__(p.Wires[0].Edges))
- pts = [ifcfile.createIfcCartesianPoint(tuple(v.Point)[:2]) for v in w.Vertexes+[w.Vertexes[0]]]
- pol = ifcfile.createIfcPolyline(pts)
+ pts = [ifcbin.createIfcCartesianPoint(tuple(v.Point)[:2]) for v in w.Vertexes+[w.Vertexes[0]]]
+ pol = ifcbin.createIfcPolyline(pts)
profile = ifcfile.createIfcArbitraryClosedProfileDef("AREA",None,pol)
return profile
@@ -2026,11 +2156,11 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
# base shape already exists
repmap = sharedobjects[k]
pla = obj.Placement
- axis1 = ifcfile.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(1,0,0))))
- axis2 = ifcfile.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(0,1,0))))
- axis3 = ifcfile.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(0,0,1))))
- origin = ifcfile.createIfcCartesianPoint(tuple(FreeCAD.Vector(pla.Base).multiply(0.001)))
- transf = ifcfile.createIfcCartesianTransformationOperator3D(axis1,axis2,origin,1.0,axis3)
+ axis1 = ifcbin.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(1,0,0))))
+ axis2 = ifcbin.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(0,1,0))))
+ axis3 = ifcbin.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(0,0,1))))
+ origin = ifcbin.createIfcCartesianPoint(tuple(FreeCAD.Vector(pla.Base).multiply(0.001)))
+ transf = ifcbin.createIfcCartesianTransformationOperator3D(axis1,axis2,origin,1.0,axis3)
mapitem = ifcfile.createIfcMappedItem(repmap,transf)
shapes = [mapitem]
solidType = "MappedRepresentation"
@@ -2085,11 +2215,11 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
pl2 = FreeCAD.Placement(obj.Placement)
pl2.Base = pl2.Base.multiply(0.001)
pli = pl2.multiply(pli)
- xvc = ifcfile.createIfcDirection(tuple(pli.Rotation.multVec(FreeCAD.Vector(1,0,0))))
- zvc = ifcfile.createIfcDirection(tuple(pli.Rotation.multVec(FreeCAD.Vector(0,0,1))))
- ovc = ifcfile.createIfcCartesianPoint(tuple(pli.Base))
- lpl = ifcfile.createIfcAxis2Placement3D(ovc,zvc,xvc)
- edir = ifcfile.createIfcDirection(tuple(FreeCAD.Vector(evi).normalize()))
+ xvc = ifcbin.createIfcDirection(tuple(pli.Rotation.multVec(FreeCAD.Vector(1,0,0))))
+ zvc = ifcbin.createIfcDirection(tuple(pli.Rotation.multVec(FreeCAD.Vector(0,0,1))))
+ ovc = ifcbin.createIfcCartesianPoint(tuple(pli.Base))
+ lpl = ifcbin.createIfcAxis2Placement3D(ovc,zvc,xvc)
+ edir = ifcbin.createIfcDirection(tuple(FreeCAD.Vector(evi).normalize()))
shape = ifcfile.createIfcExtrudedAreaSolid(profile,lpl,edir,evi.Length)
shapes.append(shape)
solidType = "SweptSolid"
@@ -2159,11 +2289,11 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
productdef = ifcfile.add(p)
for rep in productdef.Representations:
rep.ContextOfItems = context
- xvc = ifcfile.createIfcDirection((1.0,0.0,0.0))
- zvc = ifcfile.createIfcDirection((0.0,0.0,1.0))
- ovc = ifcfile.createIfcCartesianPoint((0.0,0.0,0.0))
- gpl = ifcfile.createIfcAxis2Placement3D(ovc,zvc,xvc)
- placement = ifcfile.createIfcLocalPlacement(None,gpl)
+ xvc = ifcbin.createIfcDirection((1.0,0.0,0.0))
+ zvc = ifcbin.createIfcDirection((0.0,0.0,1.0))
+ ovc = ifcbin.createIfcCartesianPoint((0.0,0.0,0.0))
+ gpl = ifcbin.createIfcAxis2Placement3D(ovc,zvc,xvc)
+ placement = ifcbin.createIfcLocalPlacement(gpl)
shapetype = "advancedbrep"
shapes = None
serialized = True
@@ -2219,8 +2349,8 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
else:
tris = fcsolid.tessellate(tessellation)
for tri in tris[1]:
- pts = [ifcfile.createIfcCartesianPoint(tuple(tris[0][i])) for i in tri]
- loop = ifcfile.createIfcPolyLoop(pts)
+ pts = [ifcbin.createIfcCartesianPoint(tuple(tris[0][i])) for i in tri]
+ loop = ifcbin.createIfcPolyLoop(pts)
bound = ifcfile.createIfcFaceOuterBound(loop,True)
face = ifcfile.createIfcFace([bound])
faces.append(face)
@@ -2235,8 +2365,8 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
n = fcface.normalAt(0,0)
if DraftVecUtils.angle(v2,v1,n) >= 0:
verts.reverse() # inverting verts order if the direction is couterclockwise
- pts = [ifcfile.createIfcCartesianPoint(tuple(v)) for v in verts]
- loop = ifcfile.createIfcPolyLoop(pts)
+ pts = [ifcbin.createIfcCartesianPoint(tuple(v)) for v in verts]
+ loop = ifcbin.createIfcPolyLoop(pts)
bound = ifcfile.createIfcFaceOuterBound(loop,True)
loops.append(bound)
for wire in fcface.Wires:
@@ -2247,8 +2377,8 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
v2 = verts[1].sub(c)
if DraftVecUtils.angle(v2,v1,DraftVecUtils.neg(n)) >= 0:
verts.reverse()
- pts = [ifcfile.createIfcCartesianPoint(tuple(v)) for v in verts]
- loop = ifcfile.createIfcPolyLoop(pts)
+ pts = [ifcbin.createIfcCartesianPoint(tuple(v)) for v in verts]
+ loop = ifcbin.createIfcPolyLoop(pts)
bound = ifcfile.createIfcFaceBound(loop,True)
loops.append(bound)
else:
@@ -2267,17 +2397,17 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
if tostore:
subrep = ifcfile.createIfcShapeRepresentation(context,'Body',solidType,shapes)
- xvc = ifcfile.createIfcDirection((1.0,0.0,0.0))
- zvc = ifcfile.createIfcDirection((0.0,0.0,1.0))
- ovc = ifcfile.createIfcCartesianPoint((0.0,0.0,0.0))
- gpl = ifcfile.createIfcAxis2Placement3D(ovc,zvc,xvc)
+ xvc = ifcbin.createIfcDirection((1.0,0.0,0.0))
+ zvc = ifcbin.createIfcDirection((0.0,0.0,1.0))
+ ovc = ifcbin.createIfcCartesianPoint((0.0,0.0,0.0))
+ gpl = ifcbin.createIfcAxis2Placement3D(ovc,zvc,xvc)
repmap = ifcfile.createIfcRepresentationMap(gpl,subrep)
pla = obj.Placement
- axis1 = ifcfile.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(1,0,0))))
- axis2 = ifcfile.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(0,1,0))))
- origin = ifcfile.createIfcCartesianPoint(tuple(FreeCAD.Vector(pla.Base).multiply(0.001)))
- axis3 = ifcfile.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(0,0,1))))
- transf = ifcfile.createIfcCartesianTransformationOperator3D(axis1,axis2,origin,1.0,axis3)
+ axis1 = ifcbin.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(1,0,0))))
+ axis2 = ifcbin.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(0,1,0))))
+ origin = ifcbin.createIfcCartesianPoint(tuple(FreeCAD.Vector(pla.Base).multiply(0.001)))
+ axis3 = ifcbin.createIfcDirection(tuple(pla.Rotation.multVec(FreeCAD.Vector(0,0,1))))
+ transf = ifcbin.createIfcCartesianTransformationOperator3D(axis1,axis2,origin,1.0,axis3)
mapitem = ifcfile.createIfcMappedItem(repmap,transf)
shapes = [mapitem]
sharedobjects[tostore] = repmap
@@ -2303,19 +2433,19 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
if obj.Material:
if obj.Material.isDerivedFrom("App::MaterialObject"):
m = obj.Material.Label.encode("utf8")
- col = ifcfile.createIfcColourRgb(None,rgb[0],rgb[1],rgb[2])
- ssr = ifcfile.createIfcSurfaceStyleRendering(col,None,None,None,None,None,None,None,"FLAT")
+ col = ifcbin.createIfcColourRgb(rgb[0],rgb[1],rgb[2])
+ ssr = ifcbin.createIfcSurfaceStyleRendering(col)
iss = ifcfile.createIfcSurfaceStyle(m,"BOTH",[ssr])
psa = ifcfile.createIfcPresentationStyleAssignment([iss])
surfstyles[rgb] = psa
for shape in shapes:
isi = ifcfile.createIfcStyledItem(shape,[psa],None)
- xvc = ifcfile.createIfcDirection((1.0,0.0,0.0))
- zvc = ifcfile.createIfcDirection((0.0,0.0,1.0))
- ovc = ifcfile.createIfcCartesianPoint((0.0,0.0,0.0))
- gpl = ifcfile.createIfcAxis2Placement3D(ovc,zvc,xvc)
- placement = ifcfile.createIfcLocalPlacement(None,gpl)
+ xvc = ifcbin.createIfcDirection((1.0,0.0,0.0))
+ zvc = ifcbin.createIfcDirection((0.0,0.0,1.0))
+ ovc = ifcbin.createIfcCartesianPoint((0.0,0.0,0.0))
+ gpl = ifcbin.createIfcAxis2Placement3D(ovc,zvc,xvc)
+ placement = ifcbin.createIfcLocalPlacement(gpl)
representation = ifcfile.createIfcShapeRepresentation(context,'Body',solidType,shapes)
productdef = ifcfile.createIfcProductDefinitionShape(None,None,[representation])
diff --git a/src/Mod/Material/MaterialEditor.py b/src/Mod/Material/MaterialEditor.py
index 62440efa9b..c68b8b05db 100644
--- a/src/Mod/Material/MaterialEditor.py
+++ b/src/Mod/Material/MaterialEditor.py
@@ -142,10 +142,11 @@ class MaterialEditor:
self.getMaterialResources()
self.cards = {}
for p in self.resources:
- for f in os.listdir(p):
- b, e = os.path.splitext(f)
- if e.upper() == ".FCMAT":
- self.cards[b] = p + os.sep + f
+ if os.path.exists(p):
+ for f in os.listdir(p):
+ b, e = os.path.splitext(f)
+ if e.upper() == ".FCMAT":
+ self.cards[b] = p + os.sep + f
# self.outputCards()
if self.cards:
self.widget.ComboMaterial.clear()