Agregar un gancho a una ruta de Nurbs con Python

Sep 13 2020

Secuencias de comandos de Python

Me gustaría agregar un gancho a un Nurbs Path mientras escribo

En diseño:

eliminar 'Cubo' Agregar curva -> Ruta cambiar al modo de edición seleccionar un vértice ctrl + h

todo listo y listo

Scripting:

# Add Path
coords_list = ([[0,0,0], [1,0,0]])
path = bpy.data.curves.new('_path', 'CURVE')
path.dimensions = "3D"
spline = path.splines.new(type='POLY')
spline.points.add(len(coords_list)-1)
for p, new_co in zip(spline.points, coords_list):
    p.co = (new_co + [1.0]) # (add nurbs weight)
Path = bpy.data.objects.new('_Path', path)
bpy.context.scene.collection.objects.link(Path)

La configuración de bpy.data.objects ['_ Path']. Modifers [".... ID ...."]. Vertex_indices [0] es de solo lectura.

Intentar agregar vertex_groups a la ruta solo devuelve un 'Tipo Ninguno'

algunas ideas ?

THX Martín

Respuestas

2 batFINGER Oct 15 2020 at 12:04

Evite el modo de edición si puede.

Sugiera que esto se puede hacer a través de llamadas a la API sin operadores. Haga que lazilly agregue los vacíos con la operación, agréguelos como tiene otros objetos si así lo desea.

El script de prueba agrega un gancho vacío a cada extremo de su polietileno. Tenga en cuenta que se han utilizado NURBS según el título de la pregunta. Para que los puntos finales establezcan las propiedades use_endpoints_uy vde la spline.

import bpy
from bpy import context


# Add Path
coords_list = ([[0,0,0], [1,0,0]])
path = bpy.data.curves.new('_path', 'CURVE')
path.dimensions = "3D"
spline = path.splines.new(type='NURBS')
spline.points.add(len(coords_list)-1)
spline.use_endpoint_u = True
spline.use_endpoint_v = True
path_ob = bpy.data.objects.new('_Path', path)
for i, (p, new_co) in enumerate(
        zip(spline.points, coords_list)
        ):
    p.co = (new_co + [1.0]) # (add nurbs weight)
    bpy.ops.object.empty_add(
        location=new_co,
        )
    hm = path_ob.modifiers.new(
        name=f"Hook{i}",
        type='HOOK',
        )
    hm.object = context.object
    hm.vertex_indices_set([i]) 


context.collection.objects.link(path_ob)
1 martburg Sep 13 2020 at 19:08

Después de que limón me incitó a responderme a mí mismo:

La forma hackish I se basa en el uso de Python para crear una curva y adjuntar sus extremos con ganchos a dos esferas donde Mutant Bob está volviendo a publicarhttp://web.purplefrog.com/~thoth/blender/python-cookbook/hook-modifier-curve.html La idea detrás de este truco parece estar cambiando al modo de edición

configure P0.select = True y use
bpy.ops.object.hook_assign (modifier = ...) para configurar vertex_indices

Esto fue en 2014 en Blender 2.83

el primer operador hook_assign de alguna manera (no me pregunte, es una observación) bloquea P0.select = False

Entonces:

después de cambiar al modo de objeto -> seleccionar algo allí -> seleccionar la ruta una vez más -> cambiar al modo de edición nuevamente -> establecer P0.select = False -> establecer P1.select = True -> llamar al operador para asignar el gancho - > volver al modo Objeto

Qué vergüenza pasaron algunas horas para pensar en esto.