Adicionando um gancho a um caminho Nurbs com Python

Sep 13 2020

Script Python

Eu gostaria de adicionar um gancho para um caminho Nurbs durante o script

No Layout:

delete 'Cubo' Adicionar Curva -> Mudança de Caminho para Modo de Edição selecione um Vertex ctrl + h

tudo pronto e feito

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)

Configurando bpy.data.objects ['_ Path']. Modifers [".... ID ...."]. Vertex_indices [0] é somente leitura.

Tentar adicionar vertex_groups ao Path retorna apenas um 'Tipo Nenhum'

alguma ideia ?

THX Martin

Respostas

2 batFINGER Oct 15 2020 at 12:04

Evite o modo de edição, se puder.

Sugira que isso pode ser feito por meio de chamadas de API sem operadores. Preguiçosamente adicionou os vazios com o op, adicione-os como você tem outros objetos, se desejar.

O script de teste adiciona um gancho vazio a cada extremidade do polígono. Observe que usei NURBS conforme o título da pergunta. Para que os pontos finais definam as propriedades use_endpoints_ue vda 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

Depois que Lemon me levou a responder:

A maneira hackeada I é baseada no uso de python para criar uma curva e anexar seus pontos finais com ganchos a duas esferas onde o Bob Mutante está repostandohttp://web.purplefrog.com/~thoth/blender/python-cookbook/hook-modifier-curve.html A ideia por trás deste hack parece estar mudando para o modo de edição

defina P0.select = True e use
bpy.ops.object.hook_assign (modificador = ...) para definir vertex_indices

Isso foi em 2014 no Blender 2.83

o primeiro operador hook_assign de alguma forma (não me pergunte - é uma observação) bloqueia P0.select = False

Então:

depois de mudar para o modo de objeto -> selecionar algo lá -> selecionar o caminho mais uma vez -> mudar para o modo de edição novamente -> definir P0.select = False -> definir P1.select = True -> chamar o operador para atribuir o gancho - > mude de volta para o modo de objeto

Que desgraça gastou algumas horas para chegar a isso.