(no commit message)
[blender-addons-contrib.git] / add_mesh_chain_rope / oscurart_rope_maker.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 bl_info = {
20     "name": "Oscurart Rope Maker",
21     "author": "Oscurart",
22     "version": (1,1),
23     "blender": (2, 5, 6),
24     "api": 3800,
25     "location": "Add > Curve > Oscurart Rope",
26     "description": "Create ropes",
27     "warning": "",
28     "wiki_url": "oscurart.blogspot.com",
29     "tracker_url": "",
30     "category": "Object"}
31
32
33
34 import bpy, math
35
36
37
38
39
40 def makeRope (context, DISTPOS, curvaResU, radius, FE, CUERDAS, stResU,DIAMETRO):    
41     
42     # CREO DATA , OBJETO Y LO CONECTO A LA ESCENA
43     crv= bpy.data.curves.new("CurvaCable", "CURVE")
44     obCable=bpy.data.objects.new("Cable",crv)
45     bpy.context.scene.objects.link(obCable)
46     
47     # SETEO ATRIBUTOS
48     crv.dimensions = "3D"
49     crv.resolution_u = 10
50     crv.resolution_v = 10
51     crv.twist_mode = "MINIMUM"
52     
53     # LISTA DE COMPONENTES
54     coordenadas= [
55         (0,radius,0,radius),
56         (radius,0,0,radius),
57         (0,-radius,0,radius),
58         (-radius,0,0,radius)
59     ]
60     
61     
62     
63     # CREO EL SPLINE
64     spline=crv.splines.new("NURBS")
65     lencoord= len(coordenadas)
66     #print("lencoord--> :"+str(lencoord))
67     rango=range(lencoord)
68     spline.points.add(lencoord-1)
69     for punto in rango:
70         spline.points[punto].co = coordenadas[punto]
71         #print(punto)
72         
73         
74     # MODIFICACIONES DE DATA
75     spline.use_cyclic_u = True
76     spline.resolution_u = curvaResU
77     spline.order_u = 3    
78     spline.use_endpoint_u = True
79     
80     
81     ## ==CREO CADENAS==
82     
83     ## DIVIDO EL RADIO POR LA CANTIDAD DE LINEAS Y SETEO UNA LISTA
84     
85     GRADOS=[]
86     VALORPORPARTE=[]
87     DIVISION=360/CUERDAS
88     TAJADA=0
89     
90     for parte in range(0,CUERDAS):
91         GRADOS.append(TAJADA)
92         TAJADA+=DIVISION
93         
94
95     
96     for GRAD in GRADOS:
97
98
99         # VARIABLES
100         FC=0
101         VARLISTVER=[]
102        
103         VARANGLEY=0
104         VARANGLEZ=90
105         VARPOSX=0
106         EDGEINDEX=0
107         # DEFINO EL PESO PARA LAS COORDENADAS
108         WEIGHT = 1
109         
110         while FC < FE:           
111             ## CREA 3 CADENAS EN 0 90 Y 180 GRADOS 
112             VARLISTVER.append((VARPOSX, math.sin(math.radians(GRAD))/(1/DIAMETRO) , math.sin(math.radians(GRAD+90))/(1/DIAMETRO),WEIGHT))
113     
114             GRAD += 30
115             FC += 1
116             VARPOSX += DISTPOS
117      
118         
119         
120         # CREO DATA , OBJETO Y LO CONECTO A LA ESCENA
121         crv= bpy.data.curves.new("curvaData", "CURVE")
122         ob=bpy.data.objects.new("Curva",crv)
123         bpy.context.scene.objects.link(ob)
124         
125         # SETEO ATRIBUTOS
126         crv.dimensions = "3D"
127         crv.resolution_u = 10
128         crv.resolution_v = 10
129         crv.twist_mode = "MINIMUM"
130         
131         # LISTA DE COMPONENTES
132         coordenadas= VARLISTVER
133         
134         
135         
136         # CREO EL SPLINE
137         spline=crv.splines.new("NURBS")
138         lencoord= len(coordenadas)
139         #print("lencoord--> :"+str(lencoord))
140         rango=range(lencoord)
141         spline.points.add(lencoord-1)
142         for punto in rango:
143             spline.points[punto].co = coordenadas[punto]
144             #print(punto)
145             
146             
147         # MODIFICACIONES DE DATA
148         spline.use_cyclic_u = False
149         spline.resolution_u = stResU
150         spline.order_u = 3    
151         spline.use_endpoint_u = True
152         
153         ob.data.bevel_object= bpy.data.objects["Cable"]
154         
155         #print(VARLISTVER)
156         
157 #---------------        
158 from bpy.props import *
159
160 class OBJECT_OT_add_object(bpy.types.Operator):
161     bl_idname="curve.primitive_osc_rope_add"
162     bl_label="Oscurart Rope"
163     bl_options={'REGISTER','UNDO'}
164     
165     strands = IntProperty (name="Strands", default=5 , min=1, max=1000, step=1)
166     diameter = FloatProperty (name="Diameter", default=1 , min=0, max=1000)
167     distPos= FloatProperty (name="Stretch", default=1 , min=0.01, max=100.0)
168     vertices= IntProperty (name="Length", default=10 , min=0, max=1000, step=1)
169     distResU= IntProperty (name="Resolution V", default=5 , min=1, max=1000, step=1)
170     stResU= IntProperty (name="Resolution U", default=5 , min=1, max=1000, step=1)
171     radio= FloatProperty (name="Radius", default=1 , min=0, max=1000)
172
173     def execute(self, context):
174         makeRope(context, 
175             self.distPos,self.distResU,self.radio,self.vertices,self.strands, self.stResU,self.diameter)
176         return {'FINISHED'}
177     
178 # Registration
179
180 def oscRopeButton(self, context):
181     self.layout.operator(
182         OBJECT_OT_add_object.bl_idname,
183         text="Oscurart Rope",
184         icon="PLUGIN")
185
186
187 def register():
188     bpy.utils.register_class(OBJECT_OT_add_object)
189     bpy.types.INFO_MT_curve_add.append(oscRopeButton)
190
191
192 def unregister():
193     bpy.utils.unregister_class(OBJECT_OT_add_object)
194     bpy.types.INFO_MT_curve_add.remove(oscRopeButton)
195
196
197 if __name__ == '__main__':
198     register()