From 2e24d5b122dc6728ba60268ad7d33edc1405dbb3 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Sun, 18 May 2014 15:16:03 -0300 Subject: [PATCH] Arch: Added ellipses support to IFC export --- src/Mod/Arch/ArchCommands.py | 9 ++++++-- src/Mod/Arch/ifcWriter.py | 42 +++++++++++++++++++++++------------- src/Mod/Arch/importIFC.py | 2 ++ 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/Mod/Arch/ArchCommands.py b/src/Mod/Arch/ArchCommands.py index 51fd7e2d5..87a6987b6 100644 --- a/src/Mod/Arch/ArchCommands.py +++ b/src/Mod/Arch/ArchCommands.py @@ -655,12 +655,17 @@ def getIfcExtrusionData(obj,scale=1): #b = obj.Placement.multVec(FreeCAD.Vector()) #r.Rotation = DraftVecUtils.getRotation(v,FreeCAD.Vector(0,0,1)) d = [r.Base,DraftVecUtils.rounded(r.Rotation.multVec(FreeCAD.Vector(1,0,0))),DraftVecUtils.rounded(r.Rotation.multVec(FreeCAD.Vector(0,0,1)))] - r = r.inverse() + #r = r.inverse() #print "getExtrusionData: computed placement:",r import Part if len(p.Edges) == 1: if isinstance(p.Edges[0].Curve,Part.Circle): - return "circle", [getTuples(p.Edges[0].Curve.Center,scale), p.Edges[0].Curve.Radius*scale], getTuples(v,scale), d + r1 = p.Edges[0].Curve.Radius*scale + return "circle", [getTuples(p.Edges[0].Curve.Center,scale), r1], getTuples(v,scale), d + elif isinstance(p.Edges[0].Curve,Part.Ellipse): + r1 = p.Edges[0].Curve.MajorRadius*scale + r2 = p.Edges[0].Curve.MinorRadius*scale + return "ellipse", [getTuples(p.Edges[0].Curve.Center,scale), r1, r2], getTuples(v,scale), d return "polyline", getTuples(p,scale), getTuples(v,scale), d return None diff --git a/src/Mod/Arch/ifcWriter.py b/src/Mod/Arch/ifcWriter.py index e6aa3e490..a7a3ee766 100644 --- a/src/Mod/Arch/ifcWriter.py +++ b/src/Mod/Arch/ifcWriter.py @@ -505,20 +505,21 @@ class IfcDocument(object): psa = create(self._fileobject,"IfcPresentationStyleAssignment",[[iss]]) isi = create(self._fileobject,"IfcStyledItem",[rep,[psa],None]) return isi - - def addPolyline(self,points): - """addPolyline(points): creates a polyline from the given points""" - pts = [create(self._fileobject,"IfcCartesianPoint",getTuple(p)[:2]) for p in points] - pol = create(self._fileobject,"IfcPolyline",[pts]) - area = create(self._fileobject,"IfcArbitraryClosedProfileDef",["AREA",None,pol]) - return area + + def addProfile(self,ifctype,data): + """addProfile(ifctype,data): creates a 2D profile of the given type, with the given + data as arguments, which must be formatted correctly according to the type.""" + if ifctype == "IfcPolyline": + pts = [create(self._fileobject,"IfcCartesianPoint",getTuple(p)[:2]) for p in data] + pol = create(self._fileobject,"IfcPolyline",[pts]) + profile = create(self._fileobject,"IfcArbitraryClosedProfileDef",["AREA",None,pol]) + else: + if not isinstance(data,list): + data = [data] + p = self.addPlacement(local=False,flat=True) + profile = create(self._fileobject,ifctype,["AREA",None,p]+data) + return profile - def addCircle(self,radius): - """addCircle(radius): creates a polyline from the given points""" - lpl = self.addPlacement(local=False,flat=True) - cir = create(self._fileobject,"IfcCircleProfileDef",["AREA",None,lpl,float(radius)]) - return cir - def addExtrusion(self,profile,extrusion,placement=None): """addExtrusion(profile,extrusion,[placement]): makes an extrusion of the given polyline with the given extrusion vector""" @@ -532,7 +533,7 @@ class IfcDocument(object): def addExtrudedPolyline(self,points,extrusion,placement=None,color=None): """addExtrudedPolyline(points,extrusion,[placement,color]): makes an extruded polyline from the given points and the given extrusion vector""" - pol = self.addPolyline(points) + pol = self.addProfile("IfcPolyline",points) if not placement: placement = self.addPlacement(local=False) exp = self.addExtrusion(pol,extrusion,placement) @@ -543,7 +544,18 @@ class IfcDocument(object): def addExtrudedCircle(self,center,radius,extrusion,placement=None,color=None): """addExtrudedCircle(radius,extrusion,[placement,color]): makes an extruded circle from the given radius and the given extrusion vector""" - cir = self.addCircle(radius) + cir = self.addProfile("IfcCircleProfileDef",radius) + if not placement: + placement = self.addPlacement(origin=center,local=False) + exp = self.addExtrusion(cir,extrusion,placement) + if color: + self.addColor(color,exp) + return exp + + def addExtrudedEllipse(self,center,radiusx,radiusy,extrusion,placement=None,color=None): + """addExtrudedEllipse(radiusx,radiusy,extrusion,[placement,color]): makes an extruded ellipse + from the given radii and the given extrusion vector""" + cir = self.addProfile("IfcEllipseProfileDef",[radiusx,radiusy]) if not placement: placement = self.addPlacement(origin=center,local=False) exp = self.addExtrusion(cir,extrusion,placement) diff --git a/src/Mod/Arch/importIFC.py b/src/Mod/Arch/importIFC.py index 57ba58b53..4a2f28bc7 100644 --- a/src/Mod/Arch/importIFC.py +++ b/src/Mod/Arch/importIFC.py @@ -1046,6 +1046,8 @@ def export(exportList,filename): representation = ifc.addExtrudedPolyline(gdata[1], gdata[2], color=color) elif gdata[0] == "circle": representation = ifc.addExtrudedCircle(gdata[1][0], gdata[1][1], gdata[2], color=color) + elif gdata[0] == "ellipse": + representation = ifc.addExtrudedEllipse(gdata[1][0], gdata[1][1], gdata[1][2], gdata[2], color=color) else: print "debug: unknow extrusion type" elif fdata: