I also slightly modified the step tread of the landing by adding new construction points (p5, p6) which vary according to the landing's "HalfTurn" settings.
Regarding the "modular approach", I tried to subtract the previous flight (Stairs001) from the geometry of the next landing (Stairs002), in this case, however, I used the "Subtractions" properties, it seems to work but with some limitations(e.g. the landing geometry could failed if tread thickness + landing thickness > up slab thickness )
so I am not very sure about this solution
Code: Select all
+ added line
- removed line
* changed line
.....
def makeStairs(baseobj=None,length=None,width=None,height=None,steps=None,name="Stairs"):
.....
for baseobjI in baseobj:
.....
if i > 1:
additions.append(stairs[i])
stairs[i].LastSegment = stairs[i-1]
+ stairs[i].Subtractions = stairs[i-1]
else:
if len(stairs) > 1: # i.e. length >1, have a 'master' staircase created
stairs[0].Base = stairs[1]
i += 1
.....
class _Stairs(ArchComponent.Component):
.....
def execute(self,obj):
"constructs the shape of the stairs"
self.steps = []
self.risers = []
self.pseudosteps = []
self.structures = []
+ self.landings = []
pl = obj.Placement
landings = 0
base = None
.....
+ if obj.Landings == "At center":
+ if len(self.landings) > 0 and obj.RiserThickness.Value:
+ self.landings[0] = self.landings[0].cut(self.risers[-1])
* if self.structures or self.steps or self.risers or self.landings:
* base = Part.makeCompound(self.structures + self.steps + self.risers + self.landings)
.....
def makeMultiEdgesLanding(self,obj,edges):
.....
if obj.StructureThickness.Value:
landingFace = stepFace
struct = landingFace.extrude(Vector(0,0,-abs(obj.StructureThickness.Value)))
+ self.landings.append(struct)
- if struct:
- self.structures.append(struct)
def makeStraightLanding(self,obj,edge,...):
.....
# step
p1 = self.align(vBase,obj.Align,vWidth)
- p1o = p1.add(Vector(0,0,-abs(obj.TreadThickness.Value)))
+ if (obj.Flight == "HalfTurnLeft"):
+ p1 = p1.add(Vector(0,0,-abs(obj.TreadThickness.Value)))
+ p2 = p1.add(vLength)
+ elif (obj.Flight == "HalfTurnRight"):
+ p1 = p1.add(vNose).add(Vector(0,0,-abs(obj.TreadThickness.Value)))
+ p2 = p1.add(DraftVecUtils.neg(vNose)).add(vLength)
+ else: #'Straight'
+ p1 = p1.add(vNose).add(Vector(0,0,-abs(obj.TreadThickness.Value)))
+ p2 = p1.add(DraftVecUtils.neg(vNose)).add(vLength)
+ p3 = p2.add(vWidth)
+ if (obj.Flight == "HalfTurnRight"):
+ p4 = p3.add(DraftVecUtils.neg(vLength))
+ p5 = p4.add(DraftVecUtils.scaleTo(vWidth,len))
+ else: #'HalfTurnLeft'
+ p4 = p3.add(DraftVecUtils.neg(vLength)).add(vNose)
+ p5 = p4.sub(DraftVecUtils.scaleTo(vWidth,len)).add(DraftVecUtils.neg(vNose))
+ p6 = p5.add(vNose)
.....
if callByMakeStraightStairsWithLanding:
if obj.Flight == "HalfTurnLeft":
p1 = p1.add(-vWidth)
p2 = p2.add(-vWidth)
elif obj.Flight == "HalfTurnRight":
p3 = p3.add(vWidth)
p4 = p4.add(vWidth)
+ p5 = p4.add(-vWidth)
+ p6 = p5.add(vNose)
+ if (obj.Flight == "HalfTurnRight"):
+ step = Part.Face(Part.makePolygon([p1,p2,p3,p4,p5,p6,p1]))
+ elif (obj.Flight == "HalfTurnLeft"):
+ step = Part.Face(Part.makePolygon([p1,p2,p3,p4,p6,p5,p1]))
+ else: #"Straight"
step = Part.Face(Part.makePolygon([p1,p2,p3,p4,p1]))
.....
# structure
lProfile = []
struct = None
+ if obj.Flight in ["Straight","HalfTurnRight"]:
p1 = p1.add(DraftVecUtils.neg(vNose))
p2 = p1.add(Vector(0,0,-(abs(fHeight) - obj.TreadThickness.Value)))
p3 = p1.add(vLength)
p4 = p3.add(Vector(0,0,-(abs(fHeight) - obj.TreadThickness.Value)))
if obj.Structure == "Massive":
if obj.StructureThickness.Value:
.....
+ self.landings.append(struct)
.....
- if struct:
- self.structures.append(struct)
def makeStraightStairs(self,obj,edge,s1,s2,numberofsteps.....):
.....
# steps and risers
* for i in range(numberofsteps):
p1 = vBasedAligned.add((Vector(vLength).multiply(i)).add(Vector(vHeight).multiply(i+1)))
p1 = p1.add(Vector(0,0,-abs(obj.TreadThickness.Value)))
r1 = p1
p1 = p1.add(vNose)
p2 = p1.add(DraftVecUtils.neg(vNose)).add(vLength)
p3 = p2.add(vWidth)
p4 = p3.add(DraftVecUtils.neg(vLength)).add(vNose)
step = Part.Face(Part.makePolygon([p1,p2,p3,p4,p1]))
* if i < (numberofsteps-1) and obj.TreadThickness.Value:
step = step.extrude(Vector(0,0,abs(obj.TreadThickness.Value)))
self.steps.append(step)
else:
self.pseudosteps.append(step)
r2 = r1.add(DraftVecUtils.neg(vHeight))
* if i == 0 and downstartstairs == "HorizontalCut":
r2 = r2.add(Vector(0,0,abs(obj.TreadThickness.Value)))
r3 = r2.add(vWidth)
r4 = r3.add(vHeight)
* if i == 0 and downstartstairs == "HorizontalCut":
r4 = r4.add(Vector(0,0,-abs(obj.TreadThickness.Value)))
riser = Part.Face(Part.makePolygon([r1,r2,r3,r4,r1]))
if obj.RiserThickness.Value:
riser = riser.extrude(vRiserThickness) #Vector(0,100,0))
* self.risers.append(riser)
else:
self.pseudosteps.append(riser)
.....