def backPignon(self, i): import DraftGeomUtils profilCurrent = self.findProfil(i) profilBack1 = self.findProfil(i - 1) profilBack2 = self.findProfil(i - 2) pt1 = DraftGeomUtils.findIntersection( profilCurrent["edge"], profilBack1["eave"], infinite1=True, infinite2=True ) pt2 = DraftGeomUtils.findIntersection(profilBack2["edge"], profilBack1["eave"], infinite1=True, infinite2=True) eaveWithoutOverhang = DraftGeomUtils.edg(pt1[0], pt2[0]) if profilCurrent["run"] + profilBack2["run"] != eaveWithoutOverhang.Length: points = [FreeCAD.Vector(0.0, 0.0, 0.0)] points.append(FreeCAD.Vector(profilCurrent["run"], profilCurrent["height"], 0.0)) rampantCurrent = DraftGeomUtils.edg(points[0], points[1]) points = [FreeCAD.Vector(eaveWithoutOverhang.Length, 0.0, 0.0)] points.append(FreeCAD.Vector(eaveWithoutOverhang.Length - profilBack2["run"], profilBack2["height"], 0.0)) rampantBack2 = DraftGeomUtils.edg(points[0], points[1]) point = DraftGeomUtils.findIntersection(rampantCurrent, rampantBack2, infinite1=True, infinite2=True) ridgeCurrent = DraftGeomUtils.offset( profilCurrent["edge"], self.getPerpendicular(profilCurrent["vec"], profilCurrent["rot"], point[0].x) ) point = DraftGeomUtils.findIntersection(ridgeCurrent, profilBack1["eave"], infinite1=True, infinite2=True) else: point = DraftGeomUtils.findIntersection( profilCurrent["ridge"], profilBack1["eave"], infinite1=True, infinite2=True ) self.ptsPaneProject.append(FreeCAD.Vector(point[0])) point = DraftGeomUtils.findIntersection( profilCurrent["eave"], profilBack1["eave"], infinite1=True, infinite2=True ) self.ptsPaneProject.append(FreeCAD.Vector(point[0]))
def nextPignon(self, i): print("Next : pignon") profilCurrent = self.findProfil(i) profilNext1 = self.findProfil(i+1) profilNext2 = self.findProfil(i+2) point = DraftGeomUtils.findIntersection(profilCurrent["eave"],profilNext1["eave"],infinite1=True,infinite2=True,) print "a ",FreeCAD.Vector(point[0]) self.ptsPaneProject.append(FreeCAD.Vector(point[0])) pt1 = DraftGeomUtils.findIntersection(profilCurrent["edge"],profilNext1["eave"],infinite1=True,infinite2=True,) pt2 = DraftGeomUtils.findIntersection(profilNext2["edge"],profilNext1["eave"],infinite1=True,infinite2=True,) eaveWithoutOverhang = DraftGeomUtils.edg(pt1[0],pt2[0]) if profilCurrent["run"]+profilNext2["run"] != eaveWithoutOverhang.Length : points = [FreeCAD.Vector(0.0,0.0,0.0),] points.append(FreeCAD.Vector(profilCurrent["run"],profilCurrent["height"],0.0)) rampantCurrent = DraftGeomUtils.edg(points[0],points[1]) points = [FreeCAD.Vector(eaveWithoutOverhang.Length,0.0,0.0),] points.append(FreeCAD.Vector(eaveWithoutOverhang.Length-profilNext2["run"],profilNext2["height"],0.0)) rampantNext2 = DraftGeomUtils.edg(points[0],points[1]) point = DraftGeomUtils.findIntersection(rampantCurrent,rampantNext2,infinite1=True,infinite2=True,) ridgeCurrent = DraftGeomUtils.offset(profilCurrent["edge"],self.getPerpendicular(profilCurrent["vec"],profilCurrent["rot"],point[0].x)) point = DraftGeomUtils.findIntersection(ridgeCurrent,profilNext1["eave"],infinite1=True,infinite2=True,) else: point = DraftGeomUtils.findIntersection(profilCurrent["ridge"],profilNext1["eaveD"],infinite1=True,infinite2=True,) print "b ",FreeCAD.Vector(point[0]) self.ptsPaneProject.append(FreeCAD.Vector(point[0]))
def calcEave(self, i): import DraftGeomUtils pt0Eave1 = DraftGeomUtils.findIntersection(self.findProfil(i-1)["eaveD"],self.findProfil(i)["eaveD"],infinite1=True,infinite2=True,) pt1Eave1 = DraftGeomUtils.findIntersection(self.findProfil(i)["eaveD"],self.findProfil(i+1)["eaveD"],infinite1=True,infinite2=True,) eave = DraftGeomUtils.edg(FreeCAD.Vector(pt0Eave1[0]),FreeCAD.Vector(pt1Eave1[0])) self.profilsDico[i]["eave"] = eave
def backSmaller(self, i): import DraftGeomUtils profilCurrent = self.findProfil(i) profilBack1 = self.findProfil(i - 1) dec = profilBack1["height"] / math.tan(math.radians(profilCurrent["angle"])) edgeRidgeOnPane = DraftGeomUtils.offset( profilCurrent["edge"], self.getPerpendicular(profilCurrent["vec"], profilCurrent["rot"], dec) ) ptInter1 = DraftGeomUtils.findIntersection( edgeRidgeOnPane, profilBack1["ridge"], infinite1=True, infinite2=True ) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInter1[0]), profilCurrent["edge"].Vertexes[0].Point) ptInter2 = edgeHip.Vertexes[0].Point vecInterRidges = DraftGeomUtils.findPerpendicular(ptInter2, [profilCurrent["ridge"].Edges[0]], force=0) ptInterRidges = ptInter2.add(vecInterRidges[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInterRidges)) self.ptsPaneProject.append(FreeCAD.Vector(ptInter1[0])) ptInterHipEave = DraftGeomUtils.findIntersection( edgeHip, profilCurrent["eave"], infinite1=True, infinite2=False ) if ptInterHipEave: self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) else: ptInterHipEave = DraftGeomUtils.findIntersection( edgeHip, profilBack1["eaveD"], infinite1=True, infinite2=True ) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) self.ptsPaneProject.append(FreeCAD.Vector(profilCurrent["eave"].Vertexes[0].Point[0]))
def flipEdges(self, edges): edges.reverse() newEdges = [] for edge in edges: NewEdge = DraftGeomUtils.edg(edge.Vertexes[1].Point, edge.Vertexes[0].Point) newEdges.append(NewEdge) return newEdges
def nextSmaller(self, i): print("Next : ht2 < ht1") profilCurrent = self.findProfil(i) profilNext1 = self.findProfil(i+1) dec = profilNext1["height"]/math.tan(math.radians(profilCurrent["angle"])) edgeRidgeOnPane = DraftGeomUtils.offset(profilCurrent["edge"],self.getPerpendicular(profilCurrent["vec"],profilCurrent["rot"],dec)) ptInter = DraftGeomUtils.findIntersection(profilNext1["ridge"],edgeRidgeOnPane,infinite1=True,infinite2=True,) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInter[0]),profilCurrent["edge"].Vertexes[-1].Point) ptInterHipEave = DraftGeomUtils.findIntersection(edgeHip,profilCurrent["eave"],infinite1=True,infinite2=False,) if ptInterHipEave: print "a ",FreeCAD.Vector(ptInterHipEave[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) else: ptInterHipEave = DraftGeomUtils.findIntersection(edgeHip,profilNext1["eaveD"],infinite1=True,infinite2=True,) print "b ",FreeCAD.Vector(profilCurrent["eave"].Vertexes[-1].Point[0]) print "c ",FreeCAD.Vector(ptInterHipEave[0]) self.ptsPaneProject.append(FreeCAD.Vector(profilCurrent["eave"].Vertexes[-1].Point[0])) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) print "d ",FreeCAD.Vector(ptInter[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInter[0])) ptInter = edgeHip.Vertexes[0].Point vecInterRidges = DraftGeomUtils.findPerpendicular(ptInter, [profilCurrent["ridge"].Edges[0],], force=0) ptInterRidges = ptInter.add(vecInterRidges[0]) print "e ",FreeCAD.Vector(ptInterRidges) self.ptsPaneProject.append(FreeCAD.Vector(ptInterRidges))
def backSameHeight(self, i): import DraftGeomUtils profilCurrent = self.findProfil(i) profilBack1 = self.findProfil(i - 1) ptInterRidges = DraftGeomUtils.findIntersection( profilCurrent["ridge"], profilBack1["ridge"], infinite1=True, infinite2=True, ) self.ptsPaneProject.append(FreeCAD.Vector(ptInterRidges[0])) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInterRidges[0]), profilCurrent["edge"].Vertexes[0].Point) ptInterHipEave = DraftGeomUtils.findIntersection( edgeHip, profilCurrent["eave"], infinite1=True, infinite2=False, ) if ptInterHipEave: self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) else: ptInterHipEave = DraftGeomUtils.findIntersection( edgeHip, profilBack1["eaveD"], infinite1=True, infinite2=True, ) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) self.ptsPaneProject.append( FreeCAD.Vector(profilCurrent["eave"].Vertexes[0].Point))
def nextHigher(self, i): import DraftGeomUtils profilCurrent = self.findProfil(i) profilNext1 = self.findProfil(i + 1) dec = profilCurrent["height"] / math.tan(math.radians(profilNext1["angle"])) edgeRidgeOnPane = DraftGeomUtils.offset( profilNext1["edge"], self.getPerpendicular(profilNext1["vec"], profilNext1["rot"], dec) ) ptInter = DraftGeomUtils.findIntersection( profilCurrent["ridge"], edgeRidgeOnPane, infinite1=True, infinite2=True ) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInter[0]), profilCurrent["edge"].Vertexes[-1].Point) ptInterHipEave = DraftGeomUtils.findIntersection( edgeHip, profilCurrent["eave"], infinite1=True, infinite2=False ) if ptInterHipEave: self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) else: ptInterHipEave = DraftGeomUtils.findIntersection( edgeHip, profilNext1["eaveD"], infinite1=True, infinite2=True ) self.ptsPaneProject.append(FreeCAD.Vector(profilCurrent["eave"].Vertexes[-1].Point[0])) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) self.ptsPaneProject.append(FreeCAD.Vector(ptInter[0])) ptInterRidges = DraftGeomUtils.findIntersection( profilCurrent["ridge"], profilNext1["ridge"], infinite1=True, infinite2=True ) self.ptsPaneProject.append(FreeCAD.Vector(ptInterRidges[0]))
def smoothChordCommands(self, inChord, outChord, side, smooth): if smooth == 0: return [inChord.g1Command(), outChord.g1Command()] debugPrint("(%.2f, %.2f) -> (%.2f, %.2f) -> (%.2f, %.2f)" % (inChord.Start.x, inChord.Start.y, inChord.End.x, inChord.End.y, outChord.End.x, outChord.End.y)) inAngle = inChord.getAngleXY() outAngle = outChord.getAngleXY() debugPrint(" inAngle = %.2f outAngle = %.2f" % (inAngle / math.pi, outAngle / math.pi)) if inAngle == outAngle: # straight line, outChord includes inChord debugPrint(" ---> (%.2f, %.2f)" % (outChord.End.x, outChord.End.y)) return [outChord.g1Command()] debugPrint("%s :: %s" % (inChord, outChord)) inEdge = DraftGeomUtils.edg(inChord.Start, inChord.End) outEdge = DraftGeomUtils.edg(outChord.Start, outChord.End) #wire = Part.Wire([inEdge, outEdge]) #debugPrint(" => %s" % wire) #wire = wire.makeOffset2D(self.toolRadius) #debugPrint(" ==> %s" % wire) #wire = wire.makeOffset2D(-self.toolRadius) #debugPrint(" ===> %s" % wire) radius = self.toolRadius while radius > 0: lastpt = None commands = "" edges = DraftGeomUtils.fillet([inEdge, outEdge], radius) if DraftGeomUtils.isSameLine(edges[0], inEdge) or DraftGeomUtils.isSameLine( edges[1], inEdge): debugPrint("Oh, we got a problem, try smaller radius") radius = radius - 0.1 * self.toolRadius continue debugPrint("we're good") #for edge in wire.Edges[:-1]: # makeOffset2D closes the wire for edge in edges: if not lastpt: lastpt = edge.Vertexes[0].Point lastpt, cmds = PathUtils.edge_to_path(lastpt, edge, inChord.Start.z) commands += cmds path = Path.Path(commands) return path.Commands return [inChord.g1Command(), outChord.g1Command()]
def backSmaller(self, i): import DraftGeomUtils print("Back : ht0 < ht1") profilCurrent = self.findProfil(i) profilBack1 = self.findProfil(i - 1) dec = profilBack1["height"] / math.tan( math.radians(profilCurrent["angle"])) edgeRidgeOnPane = DraftGeomUtils.offset( profilCurrent["edge"], self.getPerpendicular(profilCurrent["vec"], profilCurrent["rot"], dec)) ptInter1 = DraftGeomUtils.findIntersection( edgeRidgeOnPane, profilBack1["ridge"], infinite1=True, infinite2=True, ) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInter1[0]), profilCurrent["edge"].Vertexes[0].Point) ptInter2 = edgeHip.Vertexes[0].Point vecInterRidges = DraftGeomUtils.findPerpendicular(ptInter2, [ profilCurrent["ridge"].Edges[0], ], force=0) ptInterRidges = ptInter2.add(vecInterRidges[0]) print "a ", FreeCAD.Vector(ptInterRidges) print "b ", FreeCAD.Vector(ptInter1[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInterRidges)) self.ptsPaneProject.append(FreeCAD.Vector(ptInter1[0])) ptInterHipEave = DraftGeomUtils.findIntersection( edgeHip, profilCurrent["eave"], infinite1=True, infinite2=False, ) if ptInterHipEave: print "c ", FreeCAD.Vector(ptInterHipEave[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) else: ptInterHipEave = DraftGeomUtils.findIntersection( edgeHip, profilBack1["eaveD"], infinite1=True, infinite2=True, ) print "d ", FreeCAD.Vector(ptInterHipEave[0]) print "e ", FreeCAD.Vector( profilCurrent["eave"].Vertexes[0].Point[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) self.ptsPaneProject.append( FreeCAD.Vector(profilCurrent["eave"].Vertexes[0].Point[0]))
def smoothChordCommands(self, inChord, outChord, side, smooth): if smooth == 0: return [ inChord.g1Command(), outChord.g1Command() ] debugPrint("(%.2f, %.2f) -> (%.2f, %.2f) -> (%.2f, %.2f)" % (inChord.Start.x, inChord.Start.y, inChord.End.x, inChord.End.y, outChord.End.x, outChord.End.y)) inAngle = inChord.getAngleXY() outAngle = outChord.getAngleXY() debugPrint(" inAngle = %.2f outAngle = %.2f" % (inAngle/math.pi, outAngle/math.pi)) if inAngle == outAngle: # straight line, outChord includes inChord debugPrint(" ---> (%.2f, %.2f)" %(outChord.End.x, outChord.End.y)) return [ outChord.g1Command() ] debugPrint("%s :: %s" % (inChord, outChord)) inEdge = DraftGeomUtils.edg(inChord.Start, inChord.End) outEdge = DraftGeomUtils.edg(outChord.Start, outChord.End) #wire = Part.Wire([inEdge, outEdge]) #debugPrint(" => %s" % wire) #wire = wire.makeOffset2D(self.toolRadius) #debugPrint(" ==> %s" % wire) #wire = wire.makeOffset2D(-self.toolRadius) #debugPrint(" ===> %s" % wire) radius = self.toolRadius while radius > 0: lastpt = None commands = "" edges = DraftGeomUtils.fillet([inEdge, outEdge], radius) if DraftGeomUtils.isSameLine(edges[0], inEdge) or DraftGeomUtils.isSameLine(edges[1], inEdge): debugPrint("Oh, we got a problem, try smaller radius") radius = radius - 0.1 * self.toolRadius continue debugPrint("we're good") #for edge in wire.Edges[:-1]: # makeOffset2D closes the wire for edge in edges: if not lastpt: lastpt = edge.Vertexes[0].Point lastpt, cmds = PathUtils.edge_to_path(lastpt, edge, inChord.Start.z) commands += cmds path = Path.Path(commands) return path.Commands return [ inChord.g1Command(), outChord.g1Command() ]
def backSameHeight(self, i): import DraftGeomUtils profilCurrent = self.findProfil(i) profilBack1 = self.findProfil(i-1) ptInterRidges = DraftGeomUtils.findIntersection(profilCurrent["ridge"],profilBack1["ridge"],infinite1=True,infinite2=True,) self.ptsPaneProject.append(FreeCAD.Vector(ptInterRidges[0])) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInterRidges[0]),profilCurrent["edge"].Vertexes[0].Point) ptInterHipEave = DraftGeomUtils.findIntersection(edgeHip,profilCurrent["eave"],infinite1=True,infinite2=False,) if ptInterHipEave: self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) else: ptInterHipEave = DraftGeomUtils.findIntersection(edgeHip,profilBack1["eaveD"],infinite1=True,infinite2=True,) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) self.ptsPaneProject.append(FreeCAD.Vector(profilCurrent["eave"].Vertexes[0].Point))
def backPignon(self, i): import DraftGeomUtils profilCurrent = self.findProfil(i) profilBack1 = self.findProfil(i-1) profilBack2 = self.findProfil(i-2) pt1 = DraftGeomUtils.findIntersection(profilCurrent["edge"],profilBack1["eave"],infinite1=True,infinite2=True,) pt2 = DraftGeomUtils.findIntersection(profilBack2["edge"],profilBack1["eave"],infinite1=True,infinite2=True,) eaveWithoutOverhang = DraftGeomUtils.edg(pt1[0],pt2[0]) if profilCurrent["run"]+profilBack2["run"] != eaveWithoutOverhang.Length : points = [FreeCAD.Vector(0.0,0.0,0.0),] points.append(FreeCAD.Vector(profilCurrent["run"],profilCurrent["height"],0.0)) rampantCurrent = DraftGeomUtils.edg(points[0],points[1]) points = [FreeCAD.Vector(eaveWithoutOverhang.Length,0.0,0.0),] points.append(FreeCAD.Vector(eaveWithoutOverhang.Length-profilBack2["run"],profilBack2["height"],0.0)) rampantBack2 = DraftGeomUtils.edg(points[0],points[1]) point = DraftGeomUtils.findIntersection(rampantCurrent,rampantBack2,infinite1=True,infinite2=True,) ridgeCurrent = DraftGeomUtils.offset(profilCurrent["edge"],self.getPerpendicular(profilCurrent["vec"],profilCurrent["rot"],point[0].x)) point = DraftGeomUtils.findIntersection(ridgeCurrent,profilBack1["eave"],infinite1=True,infinite2=True,) else: point = DraftGeomUtils.findIntersection(profilCurrent["ridge"],profilBack1["eave"],infinite1=True,infinite2=True,) self.ptsPaneProject.append(FreeCAD.Vector(point[0])) point = DraftGeomUtils.findIntersection(profilCurrent["eave"],profilBack1["eave"],infinite1=True,infinite2=True,) self.ptsPaneProject.append(FreeCAD.Vector(point[0]))
def nextHigher(self, i): import DraftGeomUtils print("Next : ht2 > ht1") profilCurrent = self.findProfil(i) profilNext1 = self.findProfil(i + 1) dec = profilCurrent["height"] / math.tan( math.radians(profilNext1["angle"])) edgeRidgeOnPane = DraftGeomUtils.offset( profilNext1["edge"], self.getPerpendicular(profilNext1["vec"], profilNext1["rot"], dec)) ptInter = DraftGeomUtils.findIntersection( profilCurrent["ridge"], edgeRidgeOnPane, infinite1=True, infinite2=True, ) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInter[0]), profilCurrent["edge"].Vertexes[-1].Point) ptInterHipEave = DraftGeomUtils.findIntersection( edgeHip, profilCurrent["eave"], infinite1=True, infinite2=False, ) if ptInterHipEave: print "a ", FreeCAD.Vector(ptInterHipEave[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) else: ptInterHipEave = DraftGeomUtils.findIntersection( edgeHip, profilNext1["eaveD"], infinite1=True, infinite2=True, ) print "b ", FreeCAD.Vector( profilCurrent["eave"].Vertexes[-1].Point[0]) print "c ", FreeCAD.Vector(ptInterHipEave[0]) self.ptsPaneProject.append( FreeCAD.Vector(profilCurrent["eave"].Vertexes[-1].Point[0])) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) print "d ", FreeCAD.Vector(ptInter[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInter[0])) ptInterRidges = DraftGeomUtils.findIntersection( profilCurrent["ridge"], profilNext1["ridge"], infinite1=True, infinite2=True, ) print "e ", FreeCAD.Vector(ptInterRidges[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInterRidges[0]))
def helperSloped(self, profilCurr, profilOther, ridgeCurr, ridgeOther, isBack, otherIsLower=False): if isBack: i = 0 else: i = 1 ptIntLst = find_inters(ridgeCurr, ridgeOther) if ptIntLst: # the edges of the roof segments are not parallel ptInt = ptIntLst[0] if otherIsLower: ptRidgeLst = find_inters(profilCurr["ridge"], profilOther["ridge"]) ptProjLst = [ptRidgeLst[0], ptInt] else: ptProjLst = [ptInt] hip = DraftGeomUtils.edg(ptInt, profilCurr["edge"].Vertexes[i].Point) ptEaveCurrLst = find_inters(hip, profilCurr["eaveDraft"]) ptEaveOtherLst = find_inters(hip, profilOther["eaveDraft"]) if ptEaveCurrLst and ptEaveOtherLst: # both roof segments are sloped lenToEaveCurr = ptEaveCurrLst[0].sub(ptInt).Length lenToEaveOther = ptEaveOtherLst[0].sub(ptInt).Length if lenToEaveCurr < lenToEaveOther: ptProjLst = ptProjLst + [ptEaveCurrLst[0]] else: ptProjLst = ptProjLst + [ ptEaveOtherLst[0], profilCurr["eavePtLst"][i] ] elif ptEaveCurrLst: # current angle is 0 ptProjLst = ptProjLst + [ptEaveCurrLst[0]] elif ptEaveOtherLst: # other angle is 0 ptProjLst = ptProjLst + [ ptEaveOtherLst[0], profilCurr["eavePtLst"][i] ] else: print("Error determining outline") else: # the edges of the roof segments are parallel ptProjLst = [ profilCurr["ridge"].Vertexes[i].Point, profilCurr["eavePtLst"][i] ] if not isBack: ptProjLst.reverse() for ptProj in ptProjLst: self.ptsPaneProject.append(ptProj)
def backHigher(self, i): import DraftGeomUtils profilCurrent = self.findProfil(i) profilBack1 = self.findProfil(i-1) dec = profilCurrent["height"]/math.tan(math.radians(profilBack1["angle"])) edgeRidgeOnPane = DraftGeomUtils.offset(profilBack1["edge"],self.getPerpendicular(profilBack1["vec"],profilBack1["rot"],dec)) ptInterRidges = DraftGeomUtils.findIntersection(edgeRidgeOnPane,profilCurrent["ridge"],infinite1=True,infinite2=True,) self.ptsPaneProject.append(FreeCAD.Vector(ptInterRidges[0])) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInterRidges[0]),profilCurrent["edge"].Vertexes[0].Point) ptInterHipEave = DraftGeomUtils.findIntersection(edgeHip,profilCurrent["eave"],infinite1=True,infinite2=False,) if ptInterHipEave: self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) else: ptInterHipEave = DraftGeomUtils.findIntersection(edgeHip,profilBack1["eaveD"],infinite1=True,infinite2=True,) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) self.ptsPaneProject.append(FreeCAD.Vector(profilCurrent["eave"].Vertexes[0].Point[0]))
def nextSmaller(self, i): import DraftGeomUtils profilCurrent = self.findProfil(i) profilNext1 = self.findProfil(i + 1) dec = profilNext1["height"] / math.tan( math.radians(profilCurrent["angle"])) edgeRidgeOnPane = DraftGeomUtils.offset( profilCurrent["edge"], self.getPerpendicular(profilCurrent["vec"], profilCurrent["rot"], dec)) ptInter = DraftGeomUtils.findIntersection( profilNext1["ridge"], edgeRidgeOnPane, infinite1=True, infinite2=True, ) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInter[0]), profilCurrent["edge"].Vertexes[-1].Point) ptInterHipEave = DraftGeomUtils.findIntersection( edgeHip, profilCurrent["eave"], infinite1=True, infinite2=False, ) if ptInterHipEave: self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) else: ptInterHipEave = DraftGeomUtils.findIntersection( edgeHip, profilNext1["eaveD"], infinite1=True, infinite2=True, ) self.ptsPaneProject.append( FreeCAD.Vector(profilCurrent["eave"].Vertexes[-1].Point[0])) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) self.ptsPaneProject.append(FreeCAD.Vector(ptInter[0])) ptInter = edgeHip.Vertexes[0].Point vecInterRidges = DraftGeomUtils.findPerpendicular(ptInter, [ profilCurrent["ridge"].Edges[0], ], force=0) ptInterRidges = ptInter.add(vecInterRidges[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInterRidges))
def nextSameHeight(self, i): print("Next : ht1 = ht2") profilCurrent = self.findProfil(i) profilNext1 = self.findProfil(i+1) ptInterRidges = DraftGeomUtils.findIntersection(profilCurrent["ridge"],profilNext1["ridge"],infinite1=True,infinite2=True,) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInterRidges[0]),profilCurrent["edge"].Vertexes[-1].Point) ptInterHipEave = DraftGeomUtils.findIntersection(edgeHip,profilCurrent["eave"],infinite1=True,infinite2=False,) if ptInterHipEave: print "a ",FreeCAD.Vector(ptInterHipEave[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) else: ptInterHipEave = DraftGeomUtils.findIntersection(edgeHip,profilNext1["eaveD"],infinite1=True,infinite2=True,) print "b ",FreeCAD.Vector(profilCurrent["eave"].Vertexes[-1].Point) print "c ",FreeCAD.Vector(ptInterHipEave[0]) self.ptsPaneProject.append(FreeCAD.Vector(profilCurrent["eave"].Vertexes[-1].Point)) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) print "d ",FreeCAD.Vector(ptInterRidges[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInterRidges[0]))
def backHigher(self, i): print("Back : ht1 < ht0") profilCurrent = self.findProfil(i) profilBack1 = self.findProfil(i-1) dec = profilCurrent["height"]/math.tan(math.radians(profilBack1["angle"])) edgeRidgeOnPane = DraftGeomUtils.offset(profilBack1["edge"],self.getPerpendicular(profilBack1["vec"],profilBack1["rot"],dec)) ptInterRidges = DraftGeomUtils.findIntersection(edgeRidgeOnPane,profilCurrent["ridge"],infinite1=True,infinite2=True,) print "a ",FreeCAD.Vector(ptInterRidges[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInterRidges[0])) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInterRidges[0]),profilCurrent["edge"].Vertexes[0].Point) ptInterHipEave = DraftGeomUtils.findIntersection(edgeHip,profilCurrent["eave"],infinite1=True,infinite2=False,) if ptInterHipEave: print "b ",FreeCAD.Vector(ptInterHipEave[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) else: ptInterHipEave = DraftGeomUtils.findIntersection(edgeHip,profilBack1["eaveD"],infinite1=True,infinite2=True,) print "c ",FreeCAD.Vector(ptInterHipEave[0]) print "d ",FreeCAD.Vector(profilCurrent["eave"].Vertexes[0].Point[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) self.ptsPaneProject.append(FreeCAD.Vector(profilCurrent["eave"].Vertexes[0].Point[0]))
def nextSameHeight(self, i): import DraftGeomUtils print("Next : ht1 = ht2") profilCurrent = self.findProfil(i) profilNext1 = self.findProfil(i + 1) ptInterRidges = DraftGeomUtils.findIntersection( profilCurrent["ridge"], profilNext1["ridge"], infinite1=True, infinite2=True, ) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInterRidges[0]), profilCurrent["edge"].Vertexes[-1].Point) ptInterHipEave = DraftGeomUtils.findIntersection( edgeHip, profilCurrent["eave"], infinite1=True, infinite2=False, ) if ptInterHipEave: print "a ", FreeCAD.Vector(ptInterHipEave[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) else: ptInterHipEave = DraftGeomUtils.findIntersection( edgeHip, profilNext1["eaveD"], infinite1=True, infinite2=True, ) print "b ", FreeCAD.Vector( profilCurrent["eave"].Vertexes[-1].Point) print "c ", FreeCAD.Vector(ptInterHipEave[0]) self.ptsPaneProject.append( FreeCAD.Vector(profilCurrent["eave"].Vertexes[-1].Point)) self.ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave[0])) print "d ", FreeCAD.Vector(ptInterRidges[0]) self.ptsPaneProject.append(FreeCAD.Vector(ptInterRidges[0]))
def execute(self,obj): import Part, math, DraftGeomUtils pl = obj.Placement self.baseface = None base = None if obj.Base and obj.Angles: w = None if obj.Base.isDerivedFrom("Part::Feature"): if (obj.Base.Shape.Faces and obj.Face): w = obj.Base.Shape.Faces[obj.Face-1].Wires[0] elif obj.Base.Shape.Wires: w = obj.Base.Shape.Wires[0] if w: if w.isClosed(): self.profilsDico = [] self.shps = [] self.subVolshps = [] heights = [] edges = DraftGeomUtils.sortEdges(w.Edges) l = len(edges) print("le contour contient "+str(l)+" aretes") for i in range(l): self.makeRoofProfilsDic(i, obj.Angles[i], obj.Runs[i], obj.IdRel[i], obj.Overhang[i], obj.Thickness[i]) for i in range(l): self.calcMissingData(i) for p in self.profilsDico: heights.append(p["height"]) obj.Heights = heights for i in range(l): edgesForward = edges[:] edgesForward.append(edges[0]) ptsPaneProject=[] profil0 =self.profilsDico[i-1] profil1 =self.profilsDico[i] if i == l-1: profil2 =self.profilsDico[0] else: profil2 =self.profilsDico[i+1] vec0 = edges[i-1].Vertexes[-1].Point.sub(edges[i-1].Vertexes[0].Point) vec1 = edges[i].Vertexes[-1].Point.sub(edges[i].Vertexes[0].Point) vec2 = edgesForward[i+1].Vertexes[-1].Point.sub(edgesForward[i+1].Vertexes[0].Point) rotEdge0 = math.degrees(DraftVecUtils.angle(vec0)) rotEdge1 = math.degrees(DraftVecUtils.angle(vec1)) rotEdge2 = math.degrees(DraftVecUtils.angle(vec2)) edgeEave0 = DraftGeomUtils.offset(edges[i-1],self.getPerpendicular(vec0,rotEdge0,profil0["overhang"]).negative()) edgeEave1 = DraftGeomUtils.offset(edges[i],self.getPerpendicular(vec1,rotEdge1,profil1["overhang"]).negative()) edgeEave2 = DraftGeomUtils.offset(edgesForward[i+1],self.getPerpendicular(vec2,rotEdge2,profil2["overhang"]).negative()) pt0Eave1 = DraftGeomUtils.findIntersection(edgeEave0,edgeEave1,infinite1=True,infinite2=True,) pt1Eave1 = DraftGeomUtils.findIntersection(edgeEave1,edgeEave2,infinite1=True,infinite2=True,) edgeEave1 = DraftGeomUtils.edg(FreeCAD.Vector(pt0Eave1[0]),FreeCAD.Vector(pt1Eave1[0])) edgeRidge0 = DraftGeomUtils.offset(edges[i-1],self.getPerpendicular(vec0,rotEdge0,profil0["run"])) edgeRidge1 = DraftGeomUtils.offset(edges[i],self.getPerpendicular(vec1,rotEdge1,profil1["run"])) edgeRidge2 = DraftGeomUtils.offset(edgesForward[i+1],self.getPerpendicular(vec2,rotEdge2,profil2["run"])) midpoint = DraftGeomUtils.findMidpoint(edges[i]) pt0Edge1 = edges[i].Vertexes[0].Point pt1Edge1 = edges[i].Vertexes[-1].Point print("Analyse profil " + str(i)) if profil1["angle"] != 90.: if profil2["angle"] == 90. : print("situation a droite : pignon") ptsPaneProject.append(FreeCAD.Vector(pt1Eave1[0])) point = DraftGeomUtils.findIntersection(edgeRidge1,edgeEave2,infinite1=True,infinite2=True,) ptsPaneProject.append(FreeCAD.Vector(point[0])) elif profil1["height"] == profil2["height"] : print("situation a droite : ht1 = ht2") ptInterRidges = DraftGeomUtils.findIntersection(edgeRidge1,edgeRidge2,infinite1=True,infinite2=True,) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInterRidges[0]),pt1Edge1) ptInterHipEave1 = DraftGeomUtils.findIntersection(edgeHip,edgeEave1,infinite1=True,infinite2=False,) if ptInterHipEave1: ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave1[0])) else: ptInterHipEave2 = DraftGeomUtils.findIntersection(edgeHip,edgeEave2,infinite1=True,infinite2=True,) ptsPaneProject.append(FreeCAD.Vector(pt1Eave1[0])) ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave2[0])) ptsPaneProject.append(FreeCAD.Vector(ptInterRidges[0])) elif profil1["height"] > profil2["height"]: print("situation a droite : ht1 > ht2") dec = profil2["height"]/math.tan(math.radians(profil1["angle"])) edgeRidge2OnPane = DraftGeomUtils.offset(edges[i],self.getPerpendicular(vec1,rotEdge1,dec)) ptInter1 = DraftGeomUtils.findIntersection(edgeRidge2,edgeRidge2OnPane,infinite1=True,infinite2=True,) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInter1[0]),pt1Edge1) ptInterHipEave1 = DraftGeomUtils.findIntersection(edgeHip,edgeEave1,infinite1=True,infinite2=False,) if ptInterHipEave1: ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave1[0])) else: ptInterHipEave2 = DraftGeomUtils.findIntersection(edgeHip,edgeEave2,infinite1=True,infinite2=True,) ptsPaneProject.append(FreeCAD.Vector(pt1Eave1[0])) ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave2[0])) ptsPaneProject.append(FreeCAD.Vector(ptInter1[0])) ptInter2 = edgeHip.Vertexes[0].Point vecInterRidges = DraftGeomUtils.findPerpendicular(ptInter2, [edgeRidge1.Edges[0],], force=0) ptInterRidges = ptInter2.add(vecInterRidges[0]) ptsPaneProject.append(FreeCAD.Vector(ptInterRidges)) elif profil1["height"] < profil2["height"]: print("situation a droite : ht1 < ht2") dec = profil1["height"]/math.tan(math.radians(profil2["angle"])) edgeRidge2OnPane = DraftGeomUtils.offset(edgesForward[i+1],self.getPerpendicular(vec2,rotEdge2,dec)) ptInter1 = DraftGeomUtils.findIntersection(edgeRidge1,edgeRidge2OnPane,infinite1=True,infinite2=True,) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInter1[0]),pt1Edge1) ptInterHipEave1 = DraftGeomUtils.findIntersection(edgeHip,edgeEave1,infinite1=True,infinite2=False,) if ptInterHipEave1: ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave1[0])) else: ptInterHipEave2 = DraftGeomUtils.findIntersection(edgeHip,edgeEave2,infinite1=True,infinite2=True,) ptsPaneProject.append(FreeCAD.Vector(pt1Eave1[0])) ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave2[0])) ptsPaneProject.append(FreeCAD.Vector(ptInter1[0])) ptInterRidges = DraftGeomUtils.findIntersection(edgeRidge1,edgeRidge2,infinite1=True,infinite2=True,) ptsPaneProject.append(FreeCAD.Vector(ptInterRidges[0])) else: print("Cas de figure non pris en charge") if profil0["angle"] == 90. : print("situation a gauche : pignon") point = DraftGeomUtils.findIntersection(edgeRidge1,edgeEave0,infinite1=True,infinite2=True,) ptsPaneProject.append(FreeCAD.Vector(point[0])) ptsPaneProject.append(FreeCAD.Vector(pt0Eave1[0])) elif profil0["height"] == profil1["height"]: print("situation a gauche : ht1 = ht0") edgeRidge0 = DraftGeomUtils.offset(edges[i-1],self.getPerpendicular(vec0,rotEdge0,profil0["run"])) ptInterRidges = DraftGeomUtils.findIntersection(edgeRidge1,edgeRidge0,infinite1=True,infinite2=True,) ptsPaneProject.append(FreeCAD.Vector(ptInterRidges[0])) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInterRidges[0]),pt0Edge1) ptInterHipEave3 = DraftGeomUtils.findIntersection(edgeHip,edgeEave1,infinite1=True,infinite2=False,) if ptInterHipEave3: ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave3[0])) else: ptInterHipEave4 = DraftGeomUtils.findIntersection(edgeHip,edgeEave0,infinite1=True,infinite2=True,) ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave4[0])) ptsPaneProject.append(FreeCAD.Vector(pt0Eave1[0])) elif profil1["height"] > profil0["height"]: print("situation a gauche : ht1 > ht0") dec = profil0["height"]/math.tan(math.radians(profil1["angle"])) edgeRidge0OnPane = DraftGeomUtils.offset(edges[i],self.getPerpendicular(vec1,rotEdge1,dec)) ptInter1 = DraftGeomUtils.findIntersection(edgeRidge0OnPane,edgeRidge0,infinite1=True,infinite2=True,) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInter1[0]),pt0Edge1) ptInter2 = edgeHip.Vertexes[0].Point vecInterRidges = DraftGeomUtils.findPerpendicular(ptInter2, [edgeRidge1.Edges[0],], force=0) ptInterRidges = ptInter2.add(vecInterRidges[0]) ptsPaneProject.append(FreeCAD.Vector(ptInterRidges)) ptsPaneProject.append(FreeCAD.Vector(ptInter1[0])) ptInterHipEave3 = DraftGeomUtils.findIntersection(edgeHip,edgeEave1,infinite1=True,infinite2=False,) if ptInterHipEave3: ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave3[0])) else: ptInterHipEave4 = DraftGeomUtils.findIntersection(edgeHip,edgeEave0,infinite1=True,infinite2=True,) ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave4[0])) ptsPaneProject.append(FreeCAD.Vector(pt0Eave1[0])) elif profil1["height"] < profil0["height"]: print("situation a gauche : ht1 < ht0") dec = profil1["height"]/math.tan(math.radians(profil0["angle"])) edgeRidge0OnPane = DraftGeomUtils.offset(edges[i-1],self.getPerpendicular(vec0,rotEdge0,dec)) ptInterRidges = DraftGeomUtils.findIntersection(edgeRidge0OnPane,edgeRidge1,infinite1=True,infinite2=True,) ptsPaneProject.append(FreeCAD.Vector(ptInterRidges[0])) edgeHip = DraftGeomUtils.edg(FreeCAD.Vector(ptInterRidges[0]),pt0Edge1) ptInterHipEave3 = DraftGeomUtils.findIntersection(edgeHip,edgeEave1,infinite1=True,infinite2=False,) if ptInterHipEave3: ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave3[0])) else: ptInterHipEave4 = DraftGeomUtils.findIntersection(edgeHip,edgeEave0,infinite1=True,infinite2=True,) ptsPaneProject.append(FreeCAD.Vector(ptInterHipEave4[0])) ptsPaneProject.append(FreeCAD.Vector(pt0Eave1[0])) else: print("Cas de figure non pris en charge") ptsPaneProject = DraftVecUtils.removeDoubles(ptsPaneProject) print("ptsPaneProject",ptsPaneProject) print("Fin Analyse profil " + str(i)) self.profilsDico[i]["points"] = ptsPaneProject lp = len(ptsPaneProject) ptsPaneProject.append(ptsPaneProject[0]) edgesWire = [] for i in range(lp): edge = Part.makeLine(ptsPaneProject[i],ptsPaneProject[i+1]) edgesWire.append(edge) wire = Part.Wire(edgesWire) d = wire.BoundBox.DiagonalLength thicknessV = profil1["thickness"]/(math.cos(math.radians(profil1["angle"]))) overhangV = profil1["overhang"]*math.tan(math.radians(profil1["angle"])) if wire.isClosed(): f = Part.Face(wire) f = f.extrude(FreeCAD.Vector(0,0,profil1["height"]+2*thicknessV+2*overhangV)) f.translate(FreeCAD.Vector(0.0,0.0,-2*overhangV)) ptsPaneProfil=[FreeCAD.Vector(-profil1["overhang"],-overhangV,0.0),FreeCAD.Vector(profil1["run"],profil1["height"],0.0),FreeCAD.Vector(profil1["run"],profil1["height"]+thicknessV,0.0),FreeCAD.Vector(-profil1["overhang"],-overhangV+thicknessV,0.0)] self.createProfilShape (ptsPaneProfil, midpoint, rotEdge1, vec1, profil1["run"], d, self.shps, f) ## subVolume shape ptsSubVolumeProfil=[FreeCAD.Vector(-profil1["overhang"],-overhangV,0.0),FreeCAD.Vector(profil1["run"],profil1["height"],0.0),FreeCAD.Vector(profil1["run"],profil1["height"]+10000,0.0),FreeCAD.Vector(0.0,profil1["height"]+10000,0.0)] self.createProfilShape (ptsSubVolumeProfil, midpoint, rotEdge1, vec1, profil1["run"], d, self.subVolshps, f) else: #TODO PIGNON pass ## SubVolume self.sub = self.subVolshps.pop() for s in self.subVolshps: self.sub = self.sub.fuse(s) self.sub = self.sub.removeSplitter() if not self.sub.isNull(): if not DraftGeomUtils.isNull(pl): self.sub.Placement = pl ## BaseVolume base = Part.makeCompound(self.shps) if not base.isNull(): if not DraftGeomUtils.isNull(pl): base.Placement = pl base = self.processSubShapes(obj,base) if base: if not base.isNull(): obj.Shape = base
def execute(self, obj): import Part, math, DraftGeomUtils pl = obj.Placement self.baseface = None base = None if obj.Base and obj.Angles: w = None if obj.Base.isDerivedFrom("Part::Feature"): if (obj.Base.Shape.Faces and obj.Face): w = obj.Base.Shape.Faces[obj.Face - 1].Wires[0] elif obj.Base.Shape.Wires: w = obj.Base.Shape.Wires[0] if w: if w.isClosed(): self.profilsDico = [] self.shps = [] self.subVolshps = [] heights = [] edges = DraftGeomUtils.sortEdges(w.Edges) l = len(edges) print("le contour contient " + str(l) + " aretes") for i in range(l): self.makeRoofProfilsDic(i, obj.Angles[i], obj.Runs[i], obj.IdRel[i], obj.Overhang[i], obj.Thickness[i]) for i in range(l): self.calcMissingData(i) for p in self.profilsDico: heights.append(p["height"]) obj.Heights = heights for i in range(l): edgesForward = edges[:] edgesForward.append(edges[0]) ptsPaneProject = [] profil0 = self.profilsDico[i - 1] profil1 = self.profilsDico[i] if i == l - 1: profil2 = self.profilsDico[0] else: profil2 = self.profilsDico[i + 1] vec0 = edges[i - 1].Vertexes[-1].Point.sub( edges[i - 1].Vertexes[0].Point) vec1 = edges[i].Vertexes[-1].Point.sub( edges[i].Vertexes[0].Point) vec2 = edgesForward[i + 1].Vertexes[-1].Point.sub( edgesForward[i + 1].Vertexes[0].Point) rotEdge0 = math.degrees(DraftVecUtils.angle(vec0)) rotEdge1 = math.degrees(DraftVecUtils.angle(vec1)) rotEdge2 = math.degrees(DraftVecUtils.angle(vec2)) edgeEave0 = DraftGeomUtils.offset( edges[i - 1], self.getPerpendicular( vec0, rotEdge0, profil0["overhang"]).negative()) edgeEave1 = DraftGeomUtils.offset( edges[i], self.getPerpendicular( vec1, rotEdge1, profil1["overhang"]).negative()) edgeEave2 = DraftGeomUtils.offset( edgesForward[i + 1], self.getPerpendicular( vec2, rotEdge2, profil2["overhang"]).negative()) pt0Eave1 = DraftGeomUtils.findIntersection( edgeEave0, edgeEave1, infinite1=True, infinite2=True, ) pt1Eave1 = DraftGeomUtils.findIntersection( edgeEave1, edgeEave2, infinite1=True, infinite2=True, ) edgeEave1 = DraftGeomUtils.edg( FreeCAD.Vector(pt0Eave1[0]), FreeCAD.Vector(pt1Eave1[0])) edgeRidge0 = DraftGeomUtils.offset( edges[i - 1], self.getPerpendicular(vec0, rotEdge0, profil0["run"])) edgeRidge1 = DraftGeomUtils.offset( edges[i], self.getPerpendicular(vec1, rotEdge1, profil1["run"])) edgeRidge2 = DraftGeomUtils.offset( edgesForward[i + 1], self.getPerpendicular(vec2, rotEdge2, profil2["run"])) midpoint = DraftGeomUtils.findMidpoint(edges[i]) pt0Edge1 = edges[i].Vertexes[0].Point pt1Edge1 = edges[i].Vertexes[-1].Point print("Analyse profil " + str(i)) if profil1["angle"] != 90.: if profil2["angle"] == 90.: print("situation a droite : pignon") ptsPaneProject.append( FreeCAD.Vector(pt1Eave1[0])) point = DraftGeomUtils.findIntersection( edgeRidge1, edgeEave2, infinite1=True, infinite2=True, ) ptsPaneProject.append(FreeCAD.Vector(point[0])) elif profil1["height"] == profil2["height"]: print("situation a droite : ht1 = ht2") ptInterRidges = DraftGeomUtils.findIntersection( edgeRidge1, edgeRidge2, infinite1=True, infinite2=True, ) edgeHip = DraftGeomUtils.edg( FreeCAD.Vector(ptInterRidges[0]), pt1Edge1) ptInterHipEave1 = DraftGeomUtils.findIntersection( edgeHip, edgeEave1, infinite1=True, infinite2=False, ) if ptInterHipEave1: ptsPaneProject.append( FreeCAD.Vector(ptInterHipEave1[0])) else: ptInterHipEave2 = DraftGeomUtils.findIntersection( edgeHip, edgeEave2, infinite1=True, infinite2=True, ) ptsPaneProject.append( FreeCAD.Vector(pt1Eave1[0])) ptsPaneProject.append( FreeCAD.Vector(ptInterHipEave2[0])) ptsPaneProject.append( FreeCAD.Vector(ptInterRidges[0])) elif profil1["height"] > profil2["height"]: print("situation a droite : ht1 > ht2") dec = profil2["height"] / math.tan( math.radians(profil1["angle"])) edgeRidge2OnPane = DraftGeomUtils.offset( edges[i], self.getPerpendicular(vec1, rotEdge1, dec)) ptInter1 = DraftGeomUtils.findIntersection( edgeRidge2, edgeRidge2OnPane, infinite1=True, infinite2=True, ) edgeHip = DraftGeomUtils.edg( FreeCAD.Vector(ptInter1[0]), pt1Edge1) ptInterHipEave1 = DraftGeomUtils.findIntersection( edgeHip, edgeEave1, infinite1=True, infinite2=False, ) if ptInterHipEave1: ptsPaneProject.append( FreeCAD.Vector(ptInterHipEave1[0])) else: ptInterHipEave2 = DraftGeomUtils.findIntersection( edgeHip, edgeEave2, infinite1=True, infinite2=True, ) ptsPaneProject.append( FreeCAD.Vector(pt1Eave1[0])) ptsPaneProject.append( FreeCAD.Vector(ptInterHipEave2[0])) ptsPaneProject.append( FreeCAD.Vector(ptInter1[0])) ptInter2 = edgeHip.Vertexes[0].Point vecInterRidges = DraftGeomUtils.findPerpendicular( ptInter2, [ edgeRidge1.Edges[0], ], force=0) ptInterRidges = ptInter2.add(vecInterRidges[0]) ptsPaneProject.append( FreeCAD.Vector(ptInterRidges)) elif profil1["height"] < profil2["height"]: print("situation a droite : ht1 < ht2") dec = profil1["height"] / math.tan( math.radians(profil2["angle"])) edgeRidge2OnPane = DraftGeomUtils.offset( edgesForward[i + 1], self.getPerpendicular(vec2, rotEdge2, dec)) ptInter1 = DraftGeomUtils.findIntersection( edgeRidge1, edgeRidge2OnPane, infinite1=True, infinite2=True, ) edgeHip = DraftGeomUtils.edg( FreeCAD.Vector(ptInter1[0]), pt1Edge1) ptInterHipEave1 = DraftGeomUtils.findIntersection( edgeHip, edgeEave1, infinite1=True, infinite2=False, ) if ptInterHipEave1: ptsPaneProject.append( FreeCAD.Vector(ptInterHipEave1[0])) else: ptInterHipEave2 = DraftGeomUtils.findIntersection( edgeHip, edgeEave2, infinite1=True, infinite2=True, ) ptsPaneProject.append( FreeCAD.Vector(pt1Eave1[0])) ptsPaneProject.append( FreeCAD.Vector(ptInterHipEave2[0])) ptsPaneProject.append( FreeCAD.Vector(ptInter1[0])) ptInterRidges = DraftGeomUtils.findIntersection( edgeRidge1, edgeRidge2, infinite1=True, infinite2=True, ) ptsPaneProject.append( FreeCAD.Vector(ptInterRidges[0])) else: print("Cas de figure non pris en charge") if profil0["angle"] == 90.: print("situation a gauche : pignon") point = DraftGeomUtils.findIntersection( edgeRidge1, edgeEave0, infinite1=True, infinite2=True, ) ptsPaneProject.append(FreeCAD.Vector(point[0])) ptsPaneProject.append( FreeCAD.Vector(pt0Eave1[0])) elif profil0["height"] == profil1["height"]: print("situation a gauche : ht1 = ht0") edgeRidge0 = DraftGeomUtils.offset( edges[i - 1], self.getPerpendicular( vec0, rotEdge0, profil0["run"])) ptInterRidges = DraftGeomUtils.findIntersection( edgeRidge1, edgeRidge0, infinite1=True, infinite2=True, ) ptsPaneProject.append( FreeCAD.Vector(ptInterRidges[0])) edgeHip = DraftGeomUtils.edg( FreeCAD.Vector(ptInterRidges[0]), pt0Edge1) ptInterHipEave3 = DraftGeomUtils.findIntersection( edgeHip, edgeEave1, infinite1=True, infinite2=False, ) if ptInterHipEave3: ptsPaneProject.append( FreeCAD.Vector(ptInterHipEave3[0])) else: ptInterHipEave4 = DraftGeomUtils.findIntersection( edgeHip, edgeEave0, infinite1=True, infinite2=True, ) ptsPaneProject.append( FreeCAD.Vector(ptInterHipEave4[0])) ptsPaneProject.append( FreeCAD.Vector(pt0Eave1[0])) elif profil1["height"] > profil0["height"]: print("situation a gauche : ht1 > ht0") dec = profil0["height"] / math.tan( math.radians(profil1["angle"])) edgeRidge0OnPane = DraftGeomUtils.offset( edges[i], self.getPerpendicular(vec1, rotEdge1, dec)) ptInter1 = DraftGeomUtils.findIntersection( edgeRidge0OnPane, edgeRidge0, infinite1=True, infinite2=True, ) edgeHip = DraftGeomUtils.edg( FreeCAD.Vector(ptInter1[0]), pt0Edge1) ptInter2 = edgeHip.Vertexes[0].Point vecInterRidges = DraftGeomUtils.findPerpendicular( ptInter2, [ edgeRidge1.Edges[0], ], force=0) ptInterRidges = ptInter2.add(vecInterRidges[0]) ptsPaneProject.append( FreeCAD.Vector(ptInterRidges)) ptsPaneProject.append( FreeCAD.Vector(ptInter1[0])) ptInterHipEave3 = DraftGeomUtils.findIntersection( edgeHip, edgeEave1, infinite1=True, infinite2=False, ) if ptInterHipEave3: ptsPaneProject.append( FreeCAD.Vector(ptInterHipEave3[0])) else: ptInterHipEave4 = DraftGeomUtils.findIntersection( edgeHip, edgeEave0, infinite1=True, infinite2=True, ) ptsPaneProject.append( FreeCAD.Vector(ptInterHipEave4[0])) ptsPaneProject.append( FreeCAD.Vector(pt0Eave1[0])) elif profil1["height"] < profil0["height"]: print("situation a gauche : ht1 < ht0") dec = profil1["height"] / math.tan( math.radians(profil0["angle"])) edgeRidge0OnPane = DraftGeomUtils.offset( edges[i - 1], self.getPerpendicular(vec0, rotEdge0, dec)) ptInterRidges = DraftGeomUtils.findIntersection( edgeRidge0OnPane, edgeRidge1, infinite1=True, infinite2=True, ) ptsPaneProject.append( FreeCAD.Vector(ptInterRidges[0])) edgeHip = DraftGeomUtils.edg( FreeCAD.Vector(ptInterRidges[0]), pt0Edge1) ptInterHipEave3 = DraftGeomUtils.findIntersection( edgeHip, edgeEave1, infinite1=True, infinite2=False, ) if ptInterHipEave3: ptsPaneProject.append( FreeCAD.Vector(ptInterHipEave3[0])) else: ptInterHipEave4 = DraftGeomUtils.findIntersection( edgeHip, edgeEave0, infinite1=True, infinite2=True, ) ptsPaneProject.append( FreeCAD.Vector(ptInterHipEave4[0])) ptsPaneProject.append( FreeCAD.Vector(pt0Eave1[0])) else: print("Cas de figure non pris en charge") ptsPaneProject = DraftVecUtils.removeDoubles( ptsPaneProject) print("ptsPaneProject", ptsPaneProject) print("Fin Analyse profil " + str(i)) self.profilsDico[i]["points"] = ptsPaneProject lp = len(ptsPaneProject) ptsPaneProject.append(ptsPaneProject[0]) edgesWire = [] for i in range(lp): edge = Part.makeLine(ptsPaneProject[i], ptsPaneProject[i + 1]) edgesWire.append(edge) wire = Part.Wire(edgesWire) d = wire.BoundBox.DiagonalLength thicknessV = profil1["thickness"] / (math.cos( math.radians(profil1["angle"]))) overhangV = profil1["overhang"] * math.tan( math.radians(profil1["angle"])) if wire.isClosed(): f = Part.Face(wire) f = f.extrude( FreeCAD.Vector( 0, 0, profil1["height"] + 2 * thicknessV + 2 * overhangV)) f.translate( FreeCAD.Vector(0.0, 0.0, -2 * overhangV)) ptsPaneProfil = [ FreeCAD.Vector(-profil1["overhang"], -overhangV, 0.0), FreeCAD.Vector(profil1["run"], profil1["height"], 0.0), FreeCAD.Vector(profil1["run"], profil1["height"] + thicknessV, 0.0), FreeCAD.Vector(-profil1["overhang"], -overhangV + thicknessV, 0.0) ] self.createProfilShape(ptsPaneProfil, midpoint, rotEdge1, vec1, profil1["run"], d, self.shps, f) ## subVolume shape ptsSubVolumeProfil = [ FreeCAD.Vector(-profil1["overhang"], -overhangV, 0.0), FreeCAD.Vector(profil1["run"], profil1["height"], 0.0), FreeCAD.Vector(profil1["run"], profil1["height"] + 10000, 0.0), FreeCAD.Vector(0.0, profil1["height"] + 10000, 0.0) ] self.createProfilShape(ptsSubVolumeProfil, midpoint, rotEdge1, vec1, profil1["run"], d, self.subVolshps, f) else: #TODO PIGNON pass ## SubVolume self.sub = self.subVolshps.pop() for s in self.subVolshps: self.sub = self.sub.fuse(s) self.sub = self.sub.removeSplitter() if not self.sub.isNull(): if not DraftGeomUtils.isNull(pl): self.sub.Placement = pl ## BaseVolume base = Part.makeCompound(self.shps) if not base.isNull(): if not DraftGeomUtils.isNull(pl): base.Placement = pl base = self.processSubShapes(obj, base) if base: if not base.isNull(): obj.Shape = base
def getBeamNodes(self, obj): #print("nodes", obj.Structure.Nodes ) nodes = obj.Nodes edg = DraftGeomUtils.edg(nodes[0],nodes[1]) edg.Placement = obj.Placement return edg
def getBasewireOfStirrupWithExtendedEdges( stirrup, view_plane: WorkingPlane.Plane, extension_offset: float) -> Part.Wire: """Returns stirrup base wire after adding extension_offset to stirrup extended edges, so that end edges of stirrup with 90 degree bent angle do not overlap with stirrup edges. Parameters ---------- stirrup: <ArchRebar._Rebar> The stirrup with 90 degree bent angle. view_plane: WorkingPlane.Plane The view plane from which stirrup shape is visible. extension_offset: float The distance to move extended end edges of stirrup apart. Returns ------- Part.Wire The generated stirrup base wire. """ basewire = stirrup.Base.Shape.Wires[0].copy() # This function is meant for stirrup with bent angle 90 degree if stirrup.BentAngle != 90: return basewire min_x, min_y, max_x, max_y = getVertexesMinMaxXY(basewire.Vertexes, view_plane) def getModifiedEndEdgePoints(end_edge, coincident_edge): p1 = getProjectionToSVGPlane(end_edge.firstVertex().Point, view_plane) p2 = getProjectionToSVGPlane(end_edge.lastVertex().Point, view_plane) p3 = getProjectionToSVGPlane(coincident_edge.firstVertex().Point, view_plane) p4 = getProjectionToSVGPlane(coincident_edge.lastVertex().Point, view_plane) # The extended edge is vertical and is left side of stirrup And # coincident edge is horizontal if (round(p1.x) == round(p2.x) == round(min_x)) and (round(p3.y) == round(p4.y)): mod_p1 = end_edge.firstVertex().Point.add( extension_offset * view_plane.u.negative().normalize()) mod_p2 = end_edge.lastVertex().Point.add( extension_offset * view_plane.u.negative().normalize()) # The extended edge is vertical and is right side of stirrup And # coincident edge is horizontal elif (round(p1.x) == round(p2.x) == round(max_x)) and (round(p3.y) == round(p4.y)): mod_p1 = end_edge.firstVertex().Point.add(extension_offset * view_plane.u.normalize()) mod_p2 = end_edge.lastVertex().Point.add(extension_offset * view_plane.u.normalize()) # The extended edge is horizontal and is top side of stirrup And # coincident edge is vertical elif (round(p1.y) == round(p2.y) == round(min_y)) and (round(p3.x) == round(p4.x)): mod_p1 = end_edge.firstVertex().Point.add( extension_offset * view_plane.v.negative().normalize()) mod_p2 = end_edge.lastVertex().Point.add( extension_offset * view_plane.v.negative().normalize()) # The extended edge is horizontal and is bottom side of stirrup And # coincident edge is vertical elif (round(p1.y) == round(p2.y) == round(max_y)) and (round(p3.x) == round(p4.x)): mod_p1 = end_edge.firstVertex().Point.add(extension_offset * view_plane.v.normalize()) mod_p2 = end_edge.lastVertex().Point.add(extension_offset * view_plane.v.normalize()) else: # Don't modify any point mod_p1 = end_edge.firstVertex().Point mod_p2 = end_edge.lastVertex().Point return mod_p1, mod_p2 edges = Part.__sortEdges__(basewire.Edges) # Modify one end edge point_1, point_2 = getModifiedEndEdgePoints(edges[0], edges[1]) edges[0] = DraftGeomUtils.edg(point_1, point_2) edges[1] = DraftGeomUtils.edg(point_2, edges[1].lastVertex().Point) # Modify second end edge extension_offset = -1 * extension_offset point_1, point_2 = getModifiedEndEdgePoints(edges[-1], edges[-2]) edges[-1] = DraftGeomUtils.edg(point_1, point_2) edges[-2] = DraftGeomUtils.edg(edges[-2].firstVertex().Point, point_1) return DraftGeomUtils.connect(edges)