2.5: Top Menu
[blender.git] / release / scripts / add_mesh_torus.py
1 #!BPY
2 """
3 Name: 'Torus'
4 Blender: 243
5 Group: 'AddMesh'
6 """
7 import BPyAddMesh
8 import Blender
9 try: from math import cos, sin, pi
10 except: math = None
11
12 def add_torus(PREF_MAJOR_RAD, PREF_MINOR_RAD, PREF_MAJOR_SEG, PREF_MINOR_SEG):
13         Vector = Blender.Mathutils.Vector
14         RotationMatrix = Blender.Mathutils.RotationMatrix
15         verts = []
16         faces = []
17         i1 = 0
18         tot_verts = PREF_MAJOR_SEG * PREF_MINOR_SEG
19         for major_index in xrange(PREF_MAJOR_SEG):
20                 verts_tmp = []
21                 mtx = RotationMatrix( 360 * float(major_index)/PREF_MAJOR_SEG, 3, 'z' )
22                 
23                 for minor_index in xrange(PREF_MINOR_SEG):
24                         angle = 2*pi*minor_index/PREF_MINOR_SEG
25                         
26                         verts.append( Vector(PREF_MAJOR_RAD+(cos(angle)*PREF_MINOR_RAD), 0, (sin(angle)*PREF_MINOR_RAD)) * mtx )
27                         if minor_index+1==PREF_MINOR_SEG:
28                                 i2 = (major_index)*PREF_MINOR_SEG
29                                 i3 = i1 + PREF_MINOR_SEG
30                                 i4 = i2 + PREF_MINOR_SEG
31                                 
32                         else:
33                                 i2 = i1 + 1
34                                 i3 = i1 + PREF_MINOR_SEG
35                                 i4 = i3 + 1
36                         
37                         if i2>=tot_verts:       i2 = i2-tot_verts
38                         if i3>=tot_verts:       i3 = i3-tot_verts
39                         if i4>=tot_verts:       i4 = i4-tot_verts
40                         
41                         faces.append( (i3,i4,i2,i1) )
42                         i1+=1
43         
44         return verts, faces
45
46 def main():
47         Draw = Blender.Draw
48         PREF_MAJOR_RAD = Draw.Create(1.0)
49         PREF_MINOR_RAD = Draw.Create(0.25)
50         PREF_MAJOR_SEG = Draw.Create(48)
51         PREF_MINOR_SEG = Draw.Create(16)
52
53         if not Draw.PupBlock('Add Torus', [\
54         ('Major Radius:', PREF_MAJOR_RAD,  0.01, 100, 'Radius for the main ring of the torus'),\
55         ('Minor Radius:', PREF_MINOR_RAD,  0.01, 100, 'Radius for the minor ring of the torus setting the thickness of the ring'),\
56         ('Major Segments:', PREF_MAJOR_SEG,  3, 256, 'Number of segments for the main ring of the torus'),\
57         ('Minor Segments:', PREF_MINOR_SEG,  3, 256, 'Number of segments for the minor ring of the torus'),\
58         ]):
59                 return
60         
61         verts, faces = add_torus(PREF_MAJOR_RAD.val, PREF_MINOR_RAD.val, PREF_MAJOR_SEG.val, PREF_MINOR_SEG.val)
62         
63         BPyAddMesh.add_mesh_simple('Torus', verts, [], faces)
64
65 if cos and sin and pi:
66     main()
67 else:
68     Blender.Draw.PupMenu("Error%t|This script requires a full python installation")
69