Showing posts with label blender 2.56 script python selezionare istanze oggetto operatore. Show all posts
Showing posts with label blender 2.56 script python selezionare istanze oggetto operatore. Show all posts

Sunday, February 27, 2011

Blender: il selettore di istanze cresce...

Continua il lavoro sullo script... per quello che serve a me in realtà è già finito.
Ora viene definito un operatore che è possibile utilizzare come shortcut (screen.select_instances()) e che io ho assegnato a "SHIFT+I"
C'è un controllo sulla selezione attiva e un report in console e sulla finestra principale di blender.

Cose da fare: selezionare in base al nome. Non voglio in ogni caso farlo diventare un tool pesante con finestre ed altro: è una piccola utility per uso interno i cui pregi devono essere rapidità e leggerezza.
Chiedo scusa per la scrittura un po' raffazzonata ma ho studiato python giovedì scorso e le API di blender venerdì, tra l'altro le API sono soggette a continui cambiamenti e tanti esempi sul sito non funzionano sempre.

Ecco qui il codice ampliato:


#!BPY
"""
Name: 'Select object instances'
Blender: 256
Group: 'Object'
Tooltip: 'Select object instances'
"""
#author: Pietro Grandi (pietro909.blogspot.com)
#
#Release 0.4
# - now the script is an operator that can be added as a shortcut
# under Preferences->Input->Screen
# - the script performs a control in order to check if there is something active
# - messages are printed in console (verbose output) and as report on the top
#
# TODO: select by name, i'd like to have a popup to choose the selection type.
#


import bpy
class SelectInstances(bpy.types.Operator):
bl_idname = "screen.select_instances"
bl_label = "Select Instances"
def execute(self, context):
top = '[si-0.4]' #intestazione per i messaggi in console
scena = bpy.context.scene #punta alla scena attiva

i = 0 #contatore ciclo for
k = 0 #contatore di oggetti selezionati

sel_obj = bpy.context.active_object #oggetto attivo
if sel_obj == None: #se non ci sono oggetti attivi
print(top+'Error: no object selected') #segnala errore in console
self.report({'ERROR'}, 'no object selected') #segnala nel report
return{'CANCELLED'} #ed esci

#se invece la selezione e' valida continua#
sel_obj_type = sel_obj.data.name #tipo di oggetto selezionato
sel_obj_name = sel_obj.name #nome dell'oggetto selezionato


print(top+'Active object: '+sel_obj_name+' -> '+sel_obj_type)
print('Instances:')

for object in scena.objects: #per ogni oggetto in scena
current_obj = scena.objects[i] #prendi il nome dell'oggetto
if current_obj.data.name == sel_obj_type: #controlla se è del tipo selezionato
print('Selected '+current_obj.name) #stampalo
current_obj.select = True #selezionalo
k+=1
i+=1 #avanza il contatore
print('Total objects found and selected: '+str(k)) #stampa il risultato in console
report_string=str(k)+' instances of '+sel_obj_type+' found'
self.report({'INFO'}, report_string) #e nel report
return {'FINISHED'} #fine

if __name__ == "__main__":
bpy.ops.screen.select_instances()

EDIT: lo script è stato testato con una scena di oltre 2700000 poligoni e circa 8000 istanze per oggetto (cubi, coni, sfere, parallelepipedi)