moved add_column to branches/broken_stuff/add_mesh_column.py it is broken for months...
[blender-addons-contrib.git] / add_mesh_cad_objects / post.py
1 # Stairbuilder - Post generation
2 #
3 # Generates posts 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 mathutils import Vector
40
41 class Posts:
42     def __init__(self,G,rise,run,d,w,wT,nP,hR,tR, rEnable, lEnable):
43         self.G = G #General
44         self.rise = rise #Stair rise
45         self.run = run #Stair run
46         self.x1=Vector([0,0,hR-tR]) #rail start
47         self.x2=G.stop+Vector([0,0,hR-tR]) #rail stop
48         self.d=d #post depth
49         self.w=w #post width
50         self.wT=wT #tread width
51         self.nP=nP #number of posts 
52         self.sp=Vector([(self.x2[0]-self.x1[0])/float(nP+1),0,0]) #spacing between posts
53         self.rEnable = rEnable
54         self.lEnable = lEnable
55         self.Create()
56
57     def Intersect(self,i,d):
58         """find intersection point, x, for rail and post"""
59         x3=self.x1+i*self.sp+Vector([d,d,d])
60         x4=x3+Vector([0,0,self.x2[-1]])
61         a=self.x2-self.x1
62         b=x4-x3
63         c=x3-self.x1
64         cr_ab=a.cross(b)
65         mag_cr_ab=(cr_ab * cr_ab)
66         return self.x1+a*((c.cross(b).dot(cr_ab))/mag_cr_ab)
67
68     def Create(self):
69         for i in range(0,self.nP+2,1):
70             coords = []
71             #intersections with rail
72             coords.append(self.Intersect(i,0.0))
73             coords.append(self.Intersect(i,self.d))
74             #intersections with tread
75             coords.append(Vector([self.x1[0]+i*self.sp[0],0,
76                                   int(coords[0][0]/self.run)*self.rise]))
77             coords.append(coords[2]+Vector([self.d,0,0]))
78             #inner face
79             for j in range(4):
80                 coords.append(coords[j]+Vector([0,self.w,0]))
81             if self.rEnable:
82                 self.G.Make_mesh(coords, self.G.faces, 'posts')
83             if self.lEnable:
84                 #make post on other side of steps as well
85                 for j in coords:
86                     j += Vector([0,self.wT-self.w,0])
87                 self.G.Make_mesh(coords, self.G.faces, 'posts')