From a3b01b05ea54ead007ab8ba092a1c730cd627dcb Mon Sep 17 00:00:00 2001 From: Oscurart Eugenio Pignataro <info@oscurart.com.ar> Date: Sat, 24 Mar 2012 14:17:46 +0000 Subject: [PATCH] Add Chain and Rope Maker. --- add_mesh_chain_rope/__init__.py | 37 ++++ add_mesh_chain_rope/oscurart_chain_maker.py | 221 ++++++++++++++++++++ add_mesh_chain_rope/oscurart_rope_maker.py | 198 ++++++++++++++++++ 3 files changed, 456 insertions(+) create mode 100644 add_mesh_chain_rope/__init__.py create mode 100644 add_mesh_chain_rope/oscurart_chain_maker.py create mode 100644 add_mesh_chain_rope/oscurart_rope_maker.py diff --git a/add_mesh_chain_rope/__init__.py b/add_mesh_chain_rope/__init__.py new file mode 100644 index 00000000..c4b5a297 --- /dev/null +++ b/add_mesh_chain_rope/__init__.py @@ -0,0 +1,37 @@ +bl_info = { + "name": "Oscurart Chain and Rope Maker", + "author": "Oscurart", + "version": (1,1), + "blender": (2, 6, 2), + "api": 3800, + "location": "Add > Mesh", + "description": "Create chains and ropes", + "warning": "", + "wiki_url": "oscurart.blogspot.com", + "tracker_url": "", + "category": "Object"} + + +import bpy +from .oscurart_rope_maker import * +from .oscurart_chain_maker import * + +def register(): + bpy.utils.register_class(OBJECT_OT_add_object) + bpy.types.INFO_MT_curve_add.append(oscRopeButton) + bpy.utils.register_module(__name__) + bpy.types.INFO_MT_mesh_add.append(menu_oscChain) + +def unregister(): + bpy.utils.unregister_class(OBJECT_OT_add_object) + bpy.types.INFO_MT_curve_add.remove(oscRopeButton) + bpy.utils.unregister_module(__name__) + bpy.types.INFO_MT_mesh_add.remove(menu_oscChain) + +if __name__ == "__main__": + register() + + + + + diff --git a/add_mesh_chain_rope/oscurart_chain_maker.py b/add_mesh_chain_rope/oscurart_chain_maker.py new file mode 100644 index 00000000..52db7e67 --- /dev/null +++ b/add_mesh_chain_rope/oscurart_chain_maker.py @@ -0,0 +1,221 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +bl_info = { + "name": "Oscurart Chain Maker", + "author": "Oscurart", + "version": (1,1), + "blender": (2, 5, 6), + "api": 3800, + "location": "Add > Mesh > Oscurart Chain", + "description": "Create chain links from armatures.", + "warning": "", + "wiki_url": "oscurart.blogspot.com", + "tracker_url": "", + "category": "Object"} + + + + + +import bpy + + +def makeChain (context, mult, curverig): + + # SI EL CONTEXTO ES OBJECT CORRE LA FUNCION + if bpy.context.mode == 'OBJECT': + VAR_SWITCH=abs(1) + ARMATURE=bpy.context.active_object + + def creahuesocero(hueso): + ## CREO DATA PARA ESLABON + mesh=bpy.data.meshes.new("objectData"+str(hueso.name)) + object=bpy.data.objects.new("EslabonCero"+str(hueso.name),mesh) + mesh.from_pydata( + [(-0.04986128956079483,-0.6918092370033264,-0.17846597731113434),(-0.04986128956079483,-0.6918091773986816,0.17846640944480896),(-0.049861326813697815,-0.154555082321167,0.17846627533435822),(-0.049861326813697815,-0.15455523133277893,-0.17846614122390747),(-0.04986133798956871,-0.03475356101989746,0.25805795192718506),(-0.04986133798956871,-0.03475397825241089,-0.25805795192718506),(-0.049861278384923935,-0.8116106986999512,-0.2580576539039612),(-0.049861278384923935,-0.8116104602813721,0.25805822014808655),(-0.04986128211021423,-0.7692053318023682,2.6668965347198537e-07),(-0.04986127093434334,-0.923523485660553,2.7834033744511544e-07),(-0.04986133426427841,-0.0771591067314148,3.5627678585115063e-08),(-0.04986134544014931,0.0771591067314148,-3.5627678585115063e-08),(0.04986133798956871,-0.03475397825241089,-0.25805795192718506),(0.04986133053898811,0.0771591067314148,-3.5627678585115063e-08),(0.04986133798956871,-0.03475356101989746,0.25805795192718506),(0.04986134544014931,-0.15455523133277893,-0.17846614122390747),(0.04986134544014931,-0.0771591067314148,3.5627678585115063e-08),(0.04986134544014931,-0.154555082321167,0.17846627533435822),(0.049861397594213486,-0.8116106986999512,-0.2580576539039612),(0.04986140504479408,-0.923523485660553,2.7834033744511544e-07),(0.049861397594213486,-0.8116104602813721,0.25805822014808655),(0.04986139014363289,-0.6918091773986816,0.17846640944480896),(0.04986139014363289,-0.7692053318023682,2.6668965347198537e-07),(0.04986139014363289,-0.6918092370033264,-0.17846597731113434)], + [(1,2),(0,3),(3,5),(2,4),(0,6),(5,6),(1,7),(4,7),(0,8),(1,8),(7,9),(6,9),(8,9),(2,10),(3,10),(4,11),(5,11),(10,11),(5,12),(12,13),(11,13),(13,14),(4,14),(10,16),(15,16),(3,15),(2,17),(16,17),(9,19),(18,19),(6,18),(7,20),(19,20),(8,22),(21,22),(1,21),(0,23),(22,23),(14,20),(12,18),(15,23),(17,21),(12,15),(13,16),(14,17),(20,21),(19,22),(18,23)], + [(6,0,3,5),(1,7,4,2),(0,6,9,8),(8,9,7,1),(2,4,11,10),(10,11,5,3),(11,13,12,5),(4,14,13,11),(3,15,16,10),(10,16,17,2),(6,18,19,9),(9,19,20,7),(1,21,22,8),(23,0,8,22),(7,20,14,4),(5,12,18,6),(0,23,15,3),(2,17,21,1),(16,15,12,13),(17,16,13,14),(22,21,20,19),(23,22,19,18),(21,17,14,20),(15,23,18,12)] + ) + bpy.context.scene.objects.link(object) + ## ESCALO EL HUESO + bpy.data.objects['EslabonCero'+str(hueso.name)].scale= (hueso.length*mult,hueso.length*mult,hueso.length*mult) + + ## EMPARENTO + bpy.data.objects['EslabonCero'+str(hueso.name)].parent=ARMATURE + bpy.data.objects['EslabonCero'+str(hueso.name)].parent_type = 'BONE' + bpy.data.objects['EslabonCero'+str(hueso.name)].parent_bone=hueso.name + + + def creahuesonoventa(hueso): + ## CREO DATA PARA ESLABON + mesh=bpy.data.meshes.new("objectData"+str(hueso.name)) + object=bpy.data.objects.new("EslabonNov"+str(hueso.name),mesh) + mesh.from_pydata( + [(0.1784660965204239,-0.6918091773986816,-0.049861203879117966),(-0.1784662902355194,-0.6918091773986816,-0.04986126348376274),(-0.17846627533435822,-0.1545550525188446,-0.04986134544014931),(0.17846617102622986,-0.15455520153045654,-0.04986128583550453),(-0.25805795192718506,-0.03475359082221985,-0.049861375242471695),(0.25805795192718506,-0.034753888845443726,-0.04986129328608513),(0.2580578327178955,-0.8116105794906616,-0.04986117407679558),(-0.2580580413341522,-0.8116105198860168,-0.049861256033182144),(-9.672299938756623e-08,-0.7692052721977234,-0.04986122250556946),(-8.99775329799013e-08,-0.923523485660553,-0.04986120015382767),(-7.764004550381287e-09,-0.07715904712677002,-0.049861326813697815),(4.509517737005808e-08,0.0771591067314148,-0.049861349165439606),(0.25805795192718506,-0.034753888845443726,0.049861375242471695),(-2.2038317837314025e-08,0.0771591067314148,0.049861326813697815),(-0.25805795192718506,-0.03475359082221985,0.04986129328608513),(0.17846617102622986,-0.15455520153045654,0.04986138269305229),(-1.529285498236277e-08,-0.07715907692909241,0.049861352890729904),(-0.17846627533435822,-0.1545550525188446,0.049861323088407516),(0.2580578029155731,-0.8116105794906616,0.049861494451761246),(-1.5711103173998708e-07,-0.923523485660553,0.04986147582530975),(-0.2580580711364746,-0.8116105198860168,0.04986141249537468),(-0.1784663051366806,-0.6918091773986816,0.049861419945955276),(-1.340541757599567e-07,-0.7692052721977234,0.049861449748277664),(0.1784660816192627,-0.6918091773986816,0.04986146464943886)], + [(1,2),(0,3),(3,5),(2,4),(0,6),(5,6),(1,7),(4,7),(0,8),(1,8),(7,9),(6,9),(8,9),(2,10),(3,10),(4,11),(5,11),(10,11),(5,12),(12,13),(11,13),(13,14),(4,14),(10,16),(15,16),(3,15),(2,17),(16,17),(9,19),(18,19),(6,18),(7,20),(19,20),(8,22),(21,22),(1,21),(0,23),(22,23),(14,20),(12,18),(15,23),(17,21),(12,15),(13,16),(14,17),(20,21),(19,22),(18,23)], + [(6,0,3,5),(1,7,4,2),(0,6,9,8),(8,9,7,1),(2,4,11,10),(10,11,5,3),(11,13,12,5),(4,14,13,11),(3,15,16,10),(10,16,17,2),(6,18,19,9),(9,19,20,7),(1,21,22,8),(23,0,8,22),(7,20,14,4),(5,12,18,6),(0,23,15,3),(2,17,21,1),(16,15,12,13),(17,16,13,14),(22,21,20,19),(23,22,19,18),(21,17,14,20),(15,23,18,12)] + ) + bpy.context.scene.objects.link(object) + + ## ESCALO EL HUESO + bpy.data.objects['EslabonNov'+str(hueso.name)].scale= (hueso.length*mult,hueso.length*mult,hueso.length*mult) + + ## EMPARENTO + bpy.data.objects['EslabonNov'+str(hueso.name)].parent=ARMATURE + bpy.data.objects['EslabonNov'+str(hueso.name)].parent_type = 'BONE' + bpy.data.objects['EslabonNov'+str(hueso.name)].parent_bone=hueso.name + + + + for hueso in bpy.context.active_object.pose.bones: + if VAR_SWITCH == 1: + creahuesocero(hueso) + else: + creahuesonoventa(hueso) + if VAR_SWITCH == 1: + VAR_SWITCH = 0 + print(VAR_SWITCH) + else : + VAR_SWITCH = 1 + print(VAR_SWITCH) + + + # SI NO TILDAMOS CURVERIG + if curverig == True: + + + # VARIABLES + LISTA_POINTC=[] + ACTARM=bpy.context.active_object + + # CREO DATA , OBJETO Y LO CONECTO A LA ESCENA + crv= bpy.data.curves.new("CurvaCable", "CURVE") + obCable=bpy.data.objects.new("Cable",crv) + bpy.context.scene.objects.link(obCable) + + # SETEO ATRIBUTOS + crv.dimensions = "3D" + crv.resolution_u = 10 + crv.resolution_v = 10 + crv.twist_mode = "MINIMUM" + + + # CREO LISTA DE COORDENADAS DE TAIL Y HEAD + + LISTA_POINTC.append(( + ACTARM.data.bones[0].head_local[0], + ACTARM.data.bones[0].head_local[1], + ACTARM.data.bones[0].head_local[2], + 1 + )) + + print("huesos: "+ str(len(ACTARM.data.bones))) + for hueso in ACTARM.data.bones: + LISTA_POINTC.append((hueso.tail_local[0],hueso.tail_local[1],hueso.tail_local[2],1)) + + print(LISTA_POINTC) + + + # CREO EL SPLINE + spline=crv.splines.new("NURBS") + lencoord= len(LISTA_POINTC) + print("lencoord--> :"+str(lencoord)) + rango=range(lencoord) + spline.points.add(lencoord-1) + for punto in rango: + spline.points[punto].co = LISTA_POINTC[punto] + print(LISTA_POINTC[punto]) + + # SETEO ENDPOINT + bpy.data.objects['Cable'].data.splines[0].use_endpoint_u= True + + # SELECCIONO LA CURVA + bpy.ops.object.select_all(action='DESELECT') + bpy.data.objects['Cable'].select=1 + bpy.context.scene.objects.active=bpy.data.objects['Cable'] + + # PASO A EDIT + bpy.ops.object.mode_set(mode='EDIT') + + + # CREO HOOKS + POINTSTEP=0 + for POINT in bpy.data.objects['Cable'].data.splines[0].points: + bpy.ops.curve.select_all(action="DESELECT") + bpy.data.objects['Cable'].data.splines[0].points[POINTSTEP].select=1 + bpy.ops.object.hook_add_newob() + POINTSTEP+=1 + + + print(POINT) + + # PASO A SELECCIONAR LOS OBJETOS + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.select_all(action='DESELECT') + ACTARM.select=1 + bpy.context.scene.objects.active=bpy.data.objects['Armature'] + bpy.ops.object.mode_set(mode='POSE') + bpy.ops.pose.select_all(action='DESELECT') + ACTARM.data.bones[-1].select=1 + ACTARM.data.bones.active=ACTARM.data.bones[-1] + # SETEO IK SPLINE + bpy.ops.pose.constraint_add_with_targets(type='SPLINE_IK') + ACTARM.pose.bones[-1].constraints['Spline IK'].target = bpy.data.objects['Cable'] + ACTARM.pose.bones[-1].constraints['Spline IK'].chain_count=100 + bpy.context.active_object.pose.bones[-1].constraints['Spline IK'].use_y_stretch= False + # VUELVO A OBJECT MODE + bpy.ops.object.mode_set(mode='OBJECT') + + +#--------------- +from bpy.props import * + +class MESH_OT_chain_maker(bpy.types.Operator): + bl_idname="mesh.primitive_oscurart_chain_add" + bl_label="Oscurart Chain" + bl_options={'REGISTER','UNDO'} + + curverig= BoolProperty(name="Curve Rig", default=False) + multiplier= FloatProperty (name="Scale", default=1 , min=0.01, max=100.0) + + @classmethod + def poll(cls, context): + return(bpy.context.active_object.type == "ARMATURE" and bpy.context.active_object.mode == "OBJECT") + + def execute(self, context): + makeChain(context, + self.multiplier,self.curverig) + return {'FINISHED'} + +def menu_oscChain(self, context): + self.layout.operator("mesh.primitive_oscurart_chain_add", + text="Oscurart Chain", + icon='LINKED') + +def register(): + bpy.utils.register_module(__name__) + bpy.types.INFO_MT_mesh_add.append(menu_oscChain) + +def unregister(): + bpy.utils.unregister_module(__name__) + bpy.types.INFO_MT_mesh_add.remove(menu_oscChain) + + +if __name__ == "__main__": + register() \ No newline at end of file diff --git a/add_mesh_chain_rope/oscurart_rope_maker.py b/add_mesh_chain_rope/oscurart_rope_maker.py new file mode 100644 index 00000000..6f001cb6 --- /dev/null +++ b/add_mesh_chain_rope/oscurart_rope_maker.py @@ -0,0 +1,198 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +bl_info = { + "name": "Oscurart Rope Maker", + "author": "Oscurart", + "version": (1,1), + "blender": (2, 5, 6), + "api": 3800, + "location": "Add > Curve > Oscurart Rope", + "description": "Create ropes", + "warning": "", + "wiki_url": "oscurart.blogspot.com", + "tracker_url": "", + "category": "Object"} + + + +import bpy, math + + + + + +def makeRope (context, DISTPOS, curvaResU, radius, FE, CUERDAS, stResU,DIAMETRO): + + # CREO DATA , OBJETO Y LO CONECTO A LA ESCENA + crv= bpy.data.curves.new("CurvaCable", "CURVE") + obCable=bpy.data.objects.new("Cable",crv) + bpy.context.scene.objects.link(obCable) + + # SETEO ATRIBUTOS + crv.dimensions = "3D" + crv.resolution_u = 10 + crv.resolution_v = 10 + crv.twist_mode = "MINIMUM" + + # LISTA DE COMPONENTES + coordenadas= [ + (0,radius,0,radius), + (radius,0,0,radius), + (0,-radius,0,radius), + (-radius,0,0,radius) + ] + + + + # CREO EL SPLINE + spline=crv.splines.new("NURBS") + lencoord= len(coordenadas) + print("lencoord--> :"+str(lencoord)) + rango=range(lencoord) + spline.points.add(lencoord-1) + for punto in rango: + spline.points[punto].co = coordenadas[punto] + print(punto) + + + # MODIFICACIONES DE DATA + spline.use_cyclic_u = True + spline.resolution_u = curvaResU + spline.order_u = 3 + spline.use_endpoint_u = True + + + ## ==CREO CADENAS== + + ## DIVIDO EL RADIO POR LA CANTIDAD DE LINEAS Y SETEO UNA LISTA + + GRADOS=[] + VALORPORPARTE=[] + DIVISION=360/CUERDAS + TAJADA=0 + + for parte in range(0,CUERDAS): + GRADOS.append(TAJADA) + TAJADA+=DIVISION + + + + for GRAD in GRADOS: + + + # VARIABLES + FC=0 + VARLISTVER=[] + + VARANGLEY=0 + VARANGLEZ=90 + VARPOSX=0 + EDGEINDEX=0 + # DEFINO EL PESO PARA LAS COORDENADAS + WEIGHT = 1 + + while FC < FE: + ## CREA 3 CADENAS EN 0 90 Y 180 GRADOS + VARLISTVER.append((VARPOSX, math.sin(math.radians(GRAD))/(1/DIAMETRO) , math.sin(math.radians(GRAD+90))/(1/DIAMETRO),WEIGHT)) + + GRAD += 30 + FC += 1 + VARPOSX += DISTPOS + + + + # CREO DATA , OBJETO Y LO CONECTO A LA ESCENA + crv= bpy.data.curves.new("curvaData", "CURVE") + ob=bpy.data.objects.new("Curva",crv) + bpy.context.scene.objects.link(ob) + + # SETEO ATRIBUTOS + crv.dimensions = "3D" + crv.resolution_u = 10 + crv.resolution_v = 10 + crv.twist_mode = "MINIMUM" + + # LISTA DE COMPONENTES + coordenadas= VARLISTVER + + + + # CREO EL SPLINE + spline=crv.splines.new("NURBS") + lencoord= len(coordenadas) + print("lencoord--> :"+str(lencoord)) + rango=range(lencoord) + spline.points.add(lencoord-1) + for punto in rango: + spline.points[punto].co = coordenadas[punto] + print(punto) + + + # MODIFICACIONES DE DATA + spline.use_cyclic_u = False + spline.resolution_u = stResU + spline.order_u = 3 + spline.use_endpoint_u = True + + ob.data.bevel_object= bpy.data.objects["Cable"] + + print(VARLISTVER) + +#--------------- +from bpy.props import * + +class OBJECT_OT_add_object(bpy.types.Operator): + bl_idname="curve.primitive_osc_rope_add" + bl_label="Oscurart Rope" + bl_options={'REGISTER','UNDO'} + + strands = IntProperty (name="Strands", default=5 , min=1, max=1000, step=1) + diameter = FloatProperty (name="Diameter", default=1 , min=0, max=1000) + distPos= FloatProperty (name="Stretch", default=1 , min=0.01, max=100.0) + vertices= IntProperty (name="Lenght", default=10 , min=0, max=1000, step=1) + distResU= IntProperty (name="Resolution V", default=5 , min=1, max=1000, step=1) + stResU= IntProperty (name="Resolution U", default=5 , min=1, max=1000, step=1) + radio= FloatProperty (name="Radius", default=1 , min=0, max=1000) + + def execute(self, context): + makeRope(context, + self.distPos,self.distResU,self.radio,self.vertices,self.strands, self.stResU,self.diameter) + return {'FINISHED'} + +# Registration + +def oscRopeButton(self, context): + self.layout.operator( + OBJECT_OT_add_object.bl_idname, + text="Oscurart Rope", + icon="PLUGIN") + + +def register(): + bpy.utils.register_class(OBJECT_OT_add_object) + bpy.types.INFO_MT_curve_add.append(oscRopeButton) + + +def unregister(): + bpy.utils.unregister_class(OBJECT_OT_add_object) + bpy.types.INFO_MT_curve_add.remove(oscRopeButton) + + +if __name__ == '__main__': + register() \ No newline at end of file -- GitLab