Arch: Add property to stairs object for making ladder style stairs

The StringerOverlap property allows to raise the stringers realtive to
the treads, so that they are actually beside them.

This type is often used for building wooden stairs.
This commit is contained in:
Harald Geyer
2017-03-23 20:56:18 +01:00
committed by Yorik van Havre
parent 2365dd6f8b
commit 3074c2e756

View File

@@ -128,6 +128,7 @@ class _Stairs(ArchComponent.Component):
obj.addProperty("App::PropertyLength","StructureThickness","Structure",QT_TRANSLATE_NOOP("App::Property","The thickness of the massive structure or of the stringers"))
obj.addProperty("App::PropertyLength","StringerWidth","Structure",QT_TRANSLATE_NOOP("App::Property","The width of the stringers"))
obj.addProperty("App::PropertyLength","StructureOffset","Structure",QT_TRANSLATE_NOOP("App::Property","The offset between the border of the stairs and the structure"))
obj.addProperty("App::PropertyLength","StringerOverlap","Structure",QT_TRANSLATE_NOOP("App::Property","The overlap of the stringers above the bottom of the treads"))
obj.Align = ['Left','Right','Center']
obj.Landings = ["None","At center","At each corner"]
@@ -351,6 +352,10 @@ class _Stairs(ArchComponent.Component):
"builds a simple, straight staircase from a straight edge"
# Upgrade obj if it is from an older version of FreeCAD
if not(hasattr(obj, "StringerOverlap")):
obj.addProperty("App::PropertyLength","StringerOverlap","Structure",QT_TRANSLATE_NOOP("App::Property","The overlap of the stringers above the bottom of the treads"))
# general data
import Part,DraftGeomUtils
if not numberofsteps:
@@ -417,12 +422,18 @@ class _Stairs(ArchComponent.Component):
if obj.StringerWidth.Value and obj.StructureThickness.Value:
hyp = math.sqrt(vHeight.Length**2 + vLength.Length**2)
l1 = Vector(vLength).multiply(numberofsteps-1)
h1 = Vector(vHeight).multiply(numberofsteps-1).add(Vector(0,0,-abs(obj.TreadThickness.Value)))
h1 = Vector(vHeight).multiply(numberofsteps-1).add(Vector(0,0,-abs(obj.TreadThickness.Value)+obj.StringerOverlap.Value))
p1 = vBase.add(l1).add(h1)
p1 = self.align(p1,obj.Align,vWidth)
lProfile.append(p1)
if obj.StringerOverlap.Value <= float(h)/numberofsteps:
lProfile.append(p1)
else:
p1b = vBase.add(l1).add(Vector(0,0,float(h)))
p1a = p1b.add(Vector(vLength).multiply((p1b.z-p1.z)/vHeight.Length))
lProfile.append(p1a)
lProfile.append(p1b)
h2 = (obj.StructureThickness.Value/vLength.Length)*hyp
lProfile.append(lProfile[-1].add(Vector(0,0,-abs(h2))))
lProfile.append(p1.add(Vector(0,0,-abs(h2))))
h3 = lProfile[-1].z-vBase.z
l3 = (h3/vHeight.Length)*vLength.Length
v3 = DraftVecUtils.scaleTo(vLength,-l3)