Arch: Fixed IFC export of rebars

This commit is contained in:
Yorik van Havre
2019-03-19 19:54:51 -03:00
parent 20f3c124f7
commit b533c64361
3 changed files with 44 additions and 26 deletions

View File

@@ -737,7 +737,11 @@ def pruneIncluded(objectslist,strict=False):
if parent.isDerivedFrom("Part::Feature") and not (Draft.getType(parent) in ["Facebinder","Window","Roof"]):
if not parent.isDerivedFrom("Part::Part2DObject"):
# don't consider 2D objects based on arch elements
if hasattr(parent,"CloneOf"):
if hasattr(parent,"Host") and (parent.Host == obj):
pass
elif hasattr(parent,"Hosts") and (obj in parent.Hosts):
pass
elif hasattr(parent,"CloneOf"):
if parent.CloneOf:
if parent.CloneOf.Name != obj.Name:
toplevel = False

View File

@@ -226,11 +226,11 @@ class _Rebar(ArchComponent.Component):
def getRebarData(self,obj):
if len(obj.InList) != 1:
if not obj.Host:
return
if Draft.getType(obj.InList[0]) != "Structure":
if Draft.getType(obj.Host) != "Structure":
return
if not obj.InList[0].Shape:
if not obj.Host.Shape:
return
if not obj.Base:
return
@@ -242,9 +242,13 @@ class _Rebar(ArchComponent.Component):
return
if not obj.Amount:
return
father = obj.InList[0]
father = obj.Host
wire = obj.Base.Shape.Wires[0]
axis = obj.Base.Placement.Rotation.multVec(FreeCAD.Vector(0,0,-1))
if Draft.getType(obj.Base) == "Wire": # Draft Wires can have "wrong" placement
import DraftGeomUtils
axis = DraftGeomUtils.getNormal(obj.Base.Shape)
else:
axis = obj.Base.Placement.Rotation.multVec(FreeCAD.Vector(0,0,-1))
size = (ArchCommands.projectToVector(father.Shape.copy(),axis)).Length
if hasattr(obj,"Direction"):
if not DraftVecUtils.isNull(obj.Direction):

View File

@@ -2535,27 +2535,36 @@ def createCurve(ifcfile,wire):
edges = Part.__sortEdges__(wire.Edges)
for e in edges:
if isinstance(e.Curve,Part.Circle):
xaxis = e.Curve.XAxis
zaxis = e.Curve.Axis
follow = True
if last:
if not DraftVecUtils.equals(last,e.Vertexes[0].Point):
follow = False
last = e.Vertexes[0].Point
prev = e.Vertexes[-1].Point
else:
last = e.Vertexes[-1].Point
prev = e.Vertexes[0].Point
else:
last = e.Vertexes[-1].Point
p1 = math.degrees(-DraftVecUtils.angle(e.Vertexes[0].Point.sub(e.Curve.Center)))
p2 = math.degrees(-DraftVecUtils.angle(e.Vertexes[-1].Point.sub(e.Curve.Center)))
da = DraftVecUtils.angle(e.valueAt(e.FirstParameter+0.1).sub(e.Curve.Center),e.Vertexes[0].Point.sub(e.Curve.Center))
prev = e.Vertexes[0].Point
p1 = math.degrees(-DraftVecUtils.angle(prev.sub(e.Curve.Center),xaxis,zaxis))
p2 = math.degrees(-DraftVecUtils.angle(last.sub(e.Curve.Center),xaxis,zaxis))
da = DraftVecUtils.angle(e.valueAt(e.FirstParameter+0.1).sub(e.Curve.Center),prev.sub(e.Curve.Center))
#print("curve params:",p1,",",p2,"da=",da)
if p1 < 0:
p1 = 360 + p1
if p2 < 0:
p2 = 360 + p2
if da > 0:
follow = not(follow)
xvc = ifcbin.createIfcDirection((1.0,0.0))
#follow = not(follow) # now we always draw segments in the correct order, so follow is always true
pass
#print(" circle from",prev,"to",last,"a1=",p1,"a2=",p2)
ovc = ifcbin.createIfcCartesianPoint(tuple(e.Curve.Center))
plc = ifcbin.createIfcAxis2Placement2D(ovc,xvc)
zvc = ifcbin.createIfcDirection(tuple(zaxis))
xvc = ifcbin.createIfcDirection(tuple(xaxis))
plc = ifcbin.createIfcAxis2Placement3D(ovc,zvc,xvc)
cir = ifcfile.createIfcCircle(plc,e.Curve.Radius)
curve = ifcfile.createIfcTrimmedCurve(cir,[ifcfile.createIfcParameterValue(p1)],[ifcfile.createIfcParameterValue(p2)],follow,"PARAMETER")
else:
@@ -2568,6 +2577,7 @@ def createCurve(ifcfile,wire):
last = e.Vertexes[-1].Point
else:
last = e.Vertexes[-1].Point
#print(" polyline:",verts)
pts = [ifcbin.createIfcCartesianPoint(tuple(v)) for v in verts]
curve = ifcbin.createIfcPolyline(pts)
segment = ifcfile.createIfcCompositeCurveSegment("CONTINUOUS",True,curve)
@@ -2705,7 +2715,20 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
profile = None
ev = FreeCAD.Vector()
if hasattr(obj,"Proxy"):
if hasattr(obj.Proxy,"getExtrusionData"):
if hasattr(obj.Proxy,"getRebarData"):
# export rebars as IfcSweptDiskSolid
rdata = obj.Proxy.getRebarData(obj)
if rdata:
# convert to meters
r = rdata[1] * 0.001
for w in rdata[0]:
w.scale(0.001)
cur = createCurve(ifcfile,w)
shape = ifcfile.createIfcSweptDiskSolid(cur,r)
shapes.append(shape)
solidType = "SweptSolid"
shapetype = "extrusion"
if (not shapes) and hasattr(obj.Proxy,"getExtrusionData"):
extdata = obj.Proxy.getExtrusionData(obj)
if extdata:
#print(extdata)
@@ -2757,19 +2780,6 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess
shapes.append(shape)
solidType = "SweptSolid"
shapetype = "extrusion"
elif hasattr(obj.Proxy,"getRebarData"):
# export rebars as IfcSweptDiskSolid
rdata = obj.Proxy.getRebarData(obj)
if rdata:
# convert to meters
r = rdata[1] * 0.001
for w in rdata[0]:
w.scale(0.001)
cur = createCurve(ifcfile,w)
shape = ifcfile.createIfcSweptDiskSolid(cur,r)
shapes.append(shape)
solidType = "SweptSolid"
shapetype = "extrusion"
if not shapes: