Sélectionnez tous les objets avec une quantité «x» de sommets
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
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)
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