Arch: Added ellipses support to IFC export

This commit is contained in:
Yorik van Havre 2014-05-18 15:16:03 -03:00
parent 19440ceae0
commit 2e24d5b122
3 changed files with 36 additions and 17 deletions

View File

@ -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

View File

@ -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)

View File

@ -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: