Sélectionnez tous les objets avec une quantité «x» de sommets

Oct 05 2020

Donc je n'ai aucune idée de ce que je fais lol J'ai expérimenté un peu de code pour essayer de sélectionner tous les objets de la scène s'ils ont un nombre "x" de sommets. J'ai une scène avec 158 objets dedans. Environ 70 de ces objets ont 4 sommets ou moins, mais ils sont tous écrasés avec les autres objets. Autre que de sélectionner chaque objet individuel un par un, j'espérais pouvoir sélectionner tous les objets qui en ont 4 ou moins en cliquant simplement sur "Exécuter le script" Ce code est-il même à distance? lol

import bpy
import bmesh

vertCount = 4

if True:
    
    meshes = set(o.data for i in context.selected_objects
        if o.type == 'MESH')

bm = bmesh.new()

for m in meshes:
        bpy.ops.object.mode_set( mode = 'EDIT' )
        bm = bmesh.from_edit_mesh( bpy.context.object.data )
        if len(m.vertices) == vertCount
            m.select = True
        bpy.ops.object.mode_set( mode = 'OBJECT' )
        bm.clear()
    
    bm.free()    
    bm.Select_Flush(True)

Réponses

5 batFINGER Oct 05 2020 at 18:49

Sélectionnez les objets de la scène

L'itération sur les objets de la scène gardera le résultat de la sélection est limité aux seuls objets de type maillage dans la scène.

Un objet peut être actif mais pas sélectionné.

Avant blender 2.8

import bpy

context = bpy.context

for o in context.scene.objects:
    o.select = (o.type == 'MESH' and len(o.data.vertices) <= 4)

dans> 2,8

o.select_set(o.type == 'MESH' and len(o.data.vertices) <= 4) 
2 HikariTW Oct 05 2020 at 18:03

Vous pouvez vérifier la longueur des sommets des données de l'objet:

len(obj.data.vertices) == count

Une ligne dans la console interactive

Si vous êtes familier avec python et n'avez pas besoin de manipulation supplémentaire pour votre objet, utilisez cet extrait de code dans votre console.

tuple(map(lambda obj: obj.select_set(obj.type == 'MESH' and len(obj.data.vertices) <= 8), D.objects))
tuple(  # needed for map object to apply function
    map(  # apply the select based on vertices count
        lambda obj: obj.select_set(obj.type == 'MESH' and len(obj.data.vertices) <= 8),
        D.objects
    )
)

Code

import bpy

vertCount = 4
context = bpy.context

for obj in context.selected_objects:
    if obj.type != 'MESH':
        obj.select_set(False)  # deselect not mesh type
        continue
    assert obj.type == 'MESH'
    if obj.data and obj.data.vertices and len(obj.data.vertices) <= vertCount:
        pass
    else:
        obj.select_set(False)  # deselect obj