Skip to content
Snippets Groups Projects
Commit a3b01b05 authored by Oscurart Eugenio Pignataro's avatar Oscurart Eugenio Pignataro
Browse files

Add Chain and Rope Maker.

parent a90ceb86
No related branches found
No related tags found
No related merge requests found
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()
# ##### 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
# ##### 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment