示例#1
0
    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]))
示例#2
0
文件: ArchRoof.py 项目: 5263/FreeCAD
 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]))
示例#3
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
示例#4
0
    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]))
示例#5
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
示例#6
0
文件: ArchRoof.py 项目: 5263/FreeCAD
 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))
示例#7
0
 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))
示例#8
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
示例#9
0
    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]))
示例#10
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()]
示例#11
0
 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() ]
示例#13
0
 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))
示例#14
0
 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]))
示例#15
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]))
示例#16
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)
示例#17
0
 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]))
示例#18
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))
示例#19
0
文件: ArchRoof.py 项目: 5263/FreeCAD
 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]))
示例#20
0
文件: ArchRoof.py 项目: 5263/FreeCAD
 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]))
示例#21
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]))
示例#22
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
示例#23
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
示例#24
0
 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)