diff --git a/src/Mod/Arch/importIFC.py b/src/Mod/Arch/importIFC.py index 46fdf38a8d04..ab6d3b11b85c 100644 --- a/src/Mod/Arch/importIFC.py +++ b/src/Mod/Arch/importIFC.py @@ -895,87 +895,88 @@ def getRepresentation(ifcfile,context,obj,forcebrep=False,subtraction=False,tess if hasattr(obj.Proxy,"getProfiles"): p = obj.Proxy.getProfiles(obj,noplacement=True) extrusionv = obj.Proxy.getExtrusionVector(obj,noplacement=True) - extrusionv.multiply(0.001) # to meters - if (len(p) == 1) and extrusionv: - p = p[0] - p.scale(0.001) # to meters - r = obj.Proxy.getPlacement(obj) - r.Base = r.Base.multiply(0.001) # to meters - - if len(p.Edges) == 1: - - pxvc = ifcfile.createIfcDirection((1.0,0.0)) - povc = ifcfile.createIfcCartesianPoint((0.0,0.0)) - pt = ifcfile.createIfcAxis2Placement2D(povc,pxvc) + if not DraftVecUtils.isNull(extrusionv): + extrusionv.multiply(0.001) # to meters + if (len(p) == 1) and extrusionv: + p = p[0] + p.scale(0.001) # to meters + r = obj.Proxy.getPlacement(obj) + r.Base = r.Base.multiply(0.001) # to meters - # extruded circle - if isinstance(p.Edges[0].Curve,Part.Circle): - profile = ifcfile.createIfcCircleProfileDef("AREA",None,pt, p.Edges[0].Curve.Radius) + if len(p.Edges) == 1: - # extruded ellipse - elif isinstance(p.Edges[0].Curve,Part.Ellipse): - profile = ifcfile.createIfcEllipseProfileDef("AREA",None,pt, p.Edges[0].Curve.MajorRadius, p.Edges[0].Curve.MinorRadius) + pxvc = ifcfile.createIfcDirection((1.0,0.0)) + povc = ifcfile.createIfcCartesianPoint((0.0,0.0)) + pt = ifcfile.createIfcAxis2Placement2D(povc,pxvc) - else: - curves = False - for e in p.Edges: - if isinstance(e.Curve,Part.Circle): - curves = True + # extruded circle + if isinstance(p.Edges[0].Curve,Part.Circle): + profile = ifcfile.createIfcCircleProfileDef("AREA",None,pt, p.Edges[0].Curve.Radius) + + # extruded ellipse + elif isinstance(p.Edges[0].Curve,Part.Ellipse): + profile = ifcfile.createIfcEllipseProfileDef("AREA",None,pt, p.Edges[0].Curve.MajorRadius, p.Edges[0].Curve.MinorRadius) - # extruded polyline - if not curves: - w = Part.Wire(DraftGeomUtils.sortEdges(p.Edges)) - pts = [ifcfile.createIfcCartesianPoint(tuple(v.Point)[:2]) for v in w.Vertexes+[w.Vertexes[0]]] - pol = ifcfile.createIfcPolyline(pts) - - # extruded composite curve else: - segments = [] - last = None - edges = DraftGeomUtils.sortEdges(p.Edges) - for e in edges: + curves = False + for e in p.Edges: if isinstance(e.Curve,Part.Circle): - follow = True - if last: - if not DraftVecUtils.equals(last,e.Vertexes[0].Point): - follow = False - last = e.Vertexes[0].Point + curves = True + + # extruded polyline + if not curves: + w = Part.Wire(DraftGeomUtils.sortEdges(p.Edges)) + pts = [ifcfile.createIfcCartesianPoint(tuple(v.Point)[:2]) for v in w.Vertexes+[w.Vertexes[0]]] + pol = ifcfile.createIfcPolyline(pts) + + # extruded composite curve + else: + segments = [] + last = None + edges = DraftGeomUtils.sortEdges(p.Edges) + for e in edges: + if isinstance(e.Curve,Part.Circle): + follow = True + if last: + if not DraftVecUtils.equals(last,e.Vertexes[0].Point): + follow = False + last = e.Vertexes[0].Point + else: + last = e.Vertexes[-1].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)) + if p1 < 0: + p1 = 360 + p1 + if p2 < 0: + p2 = 360 + p2 + if da > 0: + follow = not(follow) + xvc = ifcfile.createIfcDirection((1.0,0.0)) + ovc = ifcfile.createIfcCartesianPoint(tuple(e.Curve.Center)[:2]) + plc = ifcfile.createIfcAxis2Placement2D(ovc,xvc) + cir = ifcfile.createIfcCircle(plc,e.Curve.Radius) + curve = ifcfile.createIfcTrimmedCurve(cir,[ifcfile.createIfcParameterValue(p1)],[ifcfile.createIfcParameterValue(p2)],follow,"PARAMETER") + 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)) - if p1 < 0: - p1 = 360 + p1 - if p2 < 0: - p2 = 360 + p2 - if da > 0: - follow = not(follow) - xvc = ifcfile.createIfcDirection((1.0,0.0)) - ovc = ifcfile.createIfcCartesianPoint(tuple(e.Curve.Center)[:2]) - plc = ifcfile.createIfcAxis2Placement2D(ovc,xvc) - cir = ifcfile.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] - if last: - if not DraftVecUtils.equals(last,verts[0]): - verts.reverse() - last = e.Vertexes[0].Point + verts = [vertex.Point for vertex in e.Vertexes] + if last: + if not DraftVecUtils.equals(last,verts[0]): + verts.reverse() + last = e.Vertexes[0].Point + else: + last = e.Vertexes[-1].Point else: last = e.Vertexes[-1].Point - else: - last = e.Vertexes[-1].Point - pts = [ifcfile.createIfcCartesianPoint(tuple(v)[:2]) for v in verts] - curve = ifcfile.createIfcPolyline(pts) - segment = ifcfile.createIfcCompositeCurveSegment("CONTINUOUS",True,curve) - segments.append(segment) - - pol = ifcfile.createIfcCompositeCurve(segments,False) - profile = ifcfile.createIfcArbitraryClosedProfileDef("AREA",None,pol) + pts = [ifcfile.createIfcCartesianPoint(tuple(v)[:2]) for v in verts] + curve = ifcfile.createIfcPolyline(pts) + segment = ifcfile.createIfcCompositeCurveSegment("CONTINUOUS",True,curve) + segments.append(segment) + + pol = ifcfile.createIfcCompositeCurve(segments,False) + profile = ifcfile.createIfcArbitraryClosedProfileDef("AREA",None,pol) if profile: xvc = ifcfile.createIfcDirection(tuple(r.Rotation.multVec(FreeCAD.Vector(1,0,0))))