85c31dd25d2e8eacf6c4f86a4e836a42c7c2405b
[blender-addons-contrib.git] / add_mesh_stairs / rail.py
1 # Stairbuilder - Retainer generation
2 #
3 # Generates retainers for stair generation.
4 #   Stair Type (typ):
5 #       - id1 = Freestanding staircase
6 #       - id2 = Housed-open staircase
7 #       - id3 = Box staircase
8 #       - id4 = Circular staircase
9
10 # Paul "BrikBot" Marshall
11 # Created: September 19, 2011
12 # Last Modified: January 29, 2011
13 # Homepage (blog): http://post.darkarsenic.com/
14 #                       //blog.darkarsenic.com/
15 #
16 # Coded in IDLE, tested in Blender 2.61.
17 # Search for "@todo" to quickly find sections that need work.
18 #
19 # ##### BEGIN GPL LICENSE BLOCK #####
20 #
21 #  Stairbuilder is for quick stair generation.
22 #  Copyright (C) 2011  Paul Marshall
23 #
24 #  This program is free software: you can redistribute it and/or modify
25 #  it under the terms of the GNU General Public License as published by
26 #  the Free Software Foundation, either version 3 of the License, or
27 #  (at your option) any later version.
28 #
29 #  This program is distributed in the hope that it will be useful,
30 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
31 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
32 #  GNU General Public License for more details.
33 #
34 #  You should have received a copy of the GNU General Public License
35 #  along with this program.  If not, see <http://www.gnu.org/licenses/>.
36 #
37 # ##### END GPL LICENSE BLOCK #####
38
39 from math import tan
40 from mathutils import Vector
41
42 class Rails:
43     def __init__(self,G,w,t,h,tT,wP,dP,wT, rEnable, lEnable):
44         self.G = G #General
45         self.w=w #rail width
46         self.t=t #rail thickness
47         self.h=h #rail height
48         self.start=Vector([0,0,self.h-self.t]) #rail start
49         self.stop=G.stop+Vector([0,0,self.h-self.t]) #rail stop
50         self.tT=tT #tread toe
51         self.wP=wP #post width
52         self.dP=dP #post depth
53         self.wT=wT #tread width
54         self.rEnable = rEnable
55         self.lEnable = lEnable
56         self.Create()
57
58     def Create(self):
59         #determine offset to include railing toe
60         offset=Vector([self.tT,0,self.tT*tan(self.G.angle)])
61         coords = []
62         coords.append(self.start-offset)
63         coords.append(self.stop+offset+Vector([self.dP,0,
64                                                self.dP*tan(self.G.angle)]))
65         coords.append(self.start-offset+Vector([0,self.w,0]))
66         coords.append(self.stop+offset+Vector([self.dP,self.w,
67                                                self.dP*tan(self.G.angle)]))
68         for j in range(4):
69             coords.append(coords[j]+Vector([0,0,self.t]))
70         #centre over posts
71         for j in coords:
72             j += Vector([0,0.5*(-self.w+self.wP),0])
73         if self.rEnable:
74             self.G.Make_mesh(coords, self.G.faces, 'rails')
75         if self.lEnable:
76             #make rail on other side
77             for j in coords:
78                 j += Vector([0,self.wT-self.wP,0])
79             self.G.Make_mesh(coords, self.G.faces, 'rails')