From 9453b7d6bc9809172ed7a70b9e37f2251035bf33 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Thu, 12 Sep 2013 22:56:38 -0300 Subject: [PATCH] Arch:Stairs can now have stringers --- src/Mod/Arch/ArchStairs.py | 110 +++++++++++++++++++++++++++---------- 1 file changed, 82 insertions(+), 28 deletions(-) diff --git a/src/Mod/Arch/ArchStairs.py b/src/Mod/Arch/ArchStairs.py index f9c6f969d0..39ff159b4e 100644 --- a/src/Mod/Arch/ArchStairs.py +++ b/src/Mod/Arch/ArchStairs.py @@ -98,12 +98,16 @@ class _Stairs(ArchComponent.Component): obj.addProperty("App::PropertyEnumeration","Structure","Structure", str(translate("Arch","The type of structure of these stairs"))) obj.addProperty("App::PropertyLength","StructureThickness","Structure", - str(translate("Arch","The thickness of the massive structure or of the stingers"))) + str(translate("Arch","The thickness of the massive structure or of the stringers"))) + obj.addProperty("App::PropertyLength","StringerWidth","Structure", + str(translate("Arch","The width of the stringers"))) + obj.addProperty("App::PropertyLength","StringerOffset","Structure", + str(translate("Arch","The offset between the border of the stairs and the stringers"))) obj.Align = ['Left','Right','Center'] - obj.Landings = ["None","At each corner","On central segment"] + obj.Landings = ["None","At center","At each corner"] obj.Winders = ["None","All","Corners strict","Corners relaxed"] - obj.Structure = ["None","Massive","One stinger","Two stingers"] + obj.Structure = ["None","Massive","One stringer","Two stringers"] obj.setEditorMode("TreadDepth",1) obj.setEditorMode("RiserHeight",1) self.Type = "Stairs" @@ -144,11 +148,13 @@ class _Stairs(ArchComponent.Component): step = step.extrude(Vector(0,0,abs(thickness))) return step - def makeStairsStructure(self,mode,nsteps,basepoint,depthvec,widthvec,heightvec,thickness,sthickness): + def makeStairsStructure(self,mode,nsteps,basepoint,depthvec,widthvec,heightvec,thickness,sthickness,stwidth,stoffset): "returns the shape of the structure of a stair" import Part struct = None + if thickness: + if mode == "Massive": points = [basepoint] @@ -177,6 +183,47 @@ class _Stairs(ArchComponent.Component): #print points struct = Part.Face(pol) struct = struct.extrude(widthvec) + + elif mode != "None": + if stwidth: + # calculating polygon + hyp = math.sqrt(heightvec.Length**2 + depthvec.Length**2) + l1 = Vector(depthvec).multiply(nsteps-1) + h1 = Vector(heightvec).multiply(nsteps-1).add(Vector(0,0,-abs(sthickness))) + p1 = basepoint.add(l1).add(h1) + h2 = (thickness/depthvec.Length)*hyp + p2 = p1.add(Vector(0,0,-abs(h2))) + h3 = p2.z-basepoint.z + l3 = (h3/heightvec.Length)*depthvec.Length + v3 = DraftVecUtils.scaleTo(depthvec,-l3) + p3 = p2.add(Vector(0,0,-abs(h3))).add(v3) + l4 = (thickness/heightvec.Length)*hyp + v4 = DraftVecUtils.scaleTo(depthvec,-l4) + p4 = p3.add(v4) + pol = Part.makePolygon([p1,p2,p3,p4,p1]) + pol = Part.Face(pol) + evec = DraftVecUtils.scaleTo(widthvec,stwidth) + + # placing + if mode == "One stringer": + if stoffset: + mvec = DraftVecUtils.scaleTo(widthvec,stoffset) + else: + mvec = DraftVecUtils.scaleTo(widthvec,(widthvec.Length/2)-stwidth/2) + pol.translate(mvec) + struct = pol.extrude(evec) + elif mode == "Two stringers": + pol2 = pol.copy() + if stoffset: + mvec = DraftVecUtils.scaleTo(widthvec,stoffset) + pol.translate(mvec) + mvec = widthvec.add(mvec.negative()) + pol2.translate(mvec) + else: + pol2.translate(widthvec) + s1 = pol.extrude(evec) + s2 = pol2.extrude(evec.negative()) + struct = Part.makeCompound([s1,s2]) return struct def align(self,basepoint,align,width,widthvec): @@ -208,6 +255,7 @@ class _Stairs(ArchComponent.Component): if obj.Base: import Part,DraftGeomUtils + # we have a baseline, check it is valid if not obj.Base.isDerivedFrom("Part::Feature"): return @@ -227,6 +275,7 @@ class _Stairs(ArchComponent.Component): v = Vector(v.x,v.y,0) else: height = obj.Height + p['type'] = "straight" p['lstep'] = float(v.Length)/(obj.NumberOfSteps-1) p['lheight'] = float(height)/obj.NumberOfSteps p['depthvec'] = DraftVecUtils.scaleTo(v,p['lstep']) @@ -241,38 +290,43 @@ class _Stairs(ArchComponent.Component): else: - # no baseline, we calculate a simple, straight stair + # no baseline, we calculate a simple, straight staircase if not obj.Length: return - - # definitions - p = {} - p['lstep'] = float(obj.Length)/(obj.NumberOfSteps-1) - p['lheight'] = float(obj.Height)/obj.NumberOfSteps - p['depthvec'] = Vector(p['lstep'],0,0) - p['widthvec'] = Vector(0,-obj.Width,0) - p['heightvec'] = Vector(0,0,p['lheight']) - p['basepoint'] = Vector(0,0,0) - pieces.append(p) + + if obj.Landings == "At center": + print "Not implemented yet!" + else: + p = {} + p['type'] = "straight" + p['lstep'] = float(obj.Length)/(obj.NumberOfSteps-1) + p['lheight'] = float(obj.Height)/obj.NumberOfSteps + p['depthvec'] = Vector(p['lstep'],0,0) + p['widthvec'] = Vector(0,-obj.Width,0) + p['heightvec'] = Vector(0,0,p['lheight']) + p['basepoint'] = Vector(0,0,0) + pieces.append(p) # 2. Create stairs components for p in pieces: - # making structure - sbasepoint = self.align(p['basepoint'],obj.Align,obj.Width,p['widthvec']) - s = self.makeStairsStructure(obj.Structure,obj.NumberOfSteps,sbasepoint,p['depthvec'], - p['widthvec'],p['heightvec'],obj.StructureThickness,obj.TreadThickness) - if s: - structure.append(s) - - # making steps - for i in range(obj.NumberOfSteps-1): - tpoint = (Vector(p['depthvec']).multiply(i)).add(Vector(p['heightvec']).multiply(i+1)) - tbasepoint = self.align(p['basepoint'].add(tpoint),obj.Align,obj.Width,p['widthvec']) - s = self.makeStairsTread(tbasepoint,p['depthvec'],p['widthvec'],obj.Nosing,obj.TreadThickness) + if p['type'] == "straight": + # making structure + sbasepoint = self.align(p['basepoint'],obj.Align,obj.Width,p['widthvec']) + s = self.makeStairsStructure(obj.Structure,obj.NumberOfSteps,sbasepoint,p['depthvec'], + p['widthvec'],p['heightvec'],obj.StructureThickness, + obj.TreadThickness,obj.StringerWidth,obj.StringerOffset) if s: - steps.append(s) + structure.append(s) + + # making steps + for i in range(obj.NumberOfSteps-1): + tpoint = (Vector(p['depthvec']).multiply(i)).add(Vector(p['heightvec']).multiply(i+1)) + tbasepoint = self.align(p['basepoint'].add(tpoint),obj.Align,obj.Width,p['widthvec']) + s = self.makeStairsTread(tbasepoint,p['depthvec'],p['widthvec'],obj.Nosing,obj.TreadThickness) + if s: + steps.append(s) # joining everything if structure or steps: