Ajout d'un hook à un chemin Nurbs avec Python

Sep 13 2020

Script Python

Je voudrais ajouter un hook à un chemin Nurbs pendant le script

Dans la mise en page:

supprimer 'Cube' Ajouter une courbe -> Changement de chemin en mode d'édition sélectionnez un sommet ctrl + h

tout est prêt et fait

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 définition de bpy.data.objects ['_ Path']. Modifers [".... ID ...."]. Vertex_indices [0] est en lecture seule.

Essayer d'ajouter vertex_groups au chemin renvoie simplement un 'Aucun type'

des idées ?

THX Martin

Réponses

2 batFINGER Oct 15 2020 at 12:04

Évitez le mode d'édition si vous le pouvez.

Suggérer que cela peut être fait via des appels API sans opérateur. Avoir paresseusement ajouté les vides avec l'op, ajoutez-les comme vous avez d'autres objets si vous le souhaitez.

Le script de test ajoute un crochet vide à chaque extrémité de votre poly. Remarque a utilisé NURBS selon le titre de la question. Pour que les points d'extrémité définissent les propriétés use_endpoints_uet 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

Après le citron m'a incité à me répondre:

La manière hackish I est basée sur Utiliser python pour créer une courbe et attacher ses extrémités avec des crochets à deux sphères où Mutant Bob republiehttp://web.purplefrog.com/~thoth/blender/python-cookbook/hook-modifier-curve.html L'idée derrière ce hack semble changer en mode d'édition

set P0.select = True et utiliser
bpy.ops.object.hook_assign (modifier = ...) pour définir les vertex_indices

C'était en 2014 dans Blender 2.83

le premier opérateur hook_assign en quelque sorte (ne me demandez pas - c'est une observation) bloque P0.select = False

Alors:

après être passé en mode objet -> sélectionner quelque chose là-bas -> sélectionner à nouveau le chemin -> passer à nouveau en mode édition -> définir P0.select = False -> définir P1.select = True -> appeler l'opérateur pour attribuer le crochet - > revenir en mode objet

Quelle honte a passé quelques heures à trouver ça.