questo codice seleziona gli oggetti di “un” gruppo evitando altri oggetti di altri gruppi:
from Rhino import *
from Rhino.Commands import *
from Rhino.DocObjects import *
from Rhino.Input import *
from scriptcontext import doc
def RunCommand():
rs, obj_ref = RhinoGet.GetOneObject("Select object", False, ObjectType.AnyObject)
if rs != Result.Success:
return rs
rhino_object = obj_ref.Object()
if rhino_object == None:
return Result.Failure
rhino_object_groups = [group for group in rhino_object.Attributes.GetGroupList()]
selectable_objects= [
obj for obj in doc.Objects.GetObjectList(ObjectType.AnyObject)
if obj.IsSelectable(True, False, False, False)]
for selectable_object in selectable_objects:
for group in selectable_object.Attributes.GetGroupList():
if rhino_object_groups.Contains(group):
selectable_object.Select(True)
continue
doc.Views.Redraw()
return Result.Success
if __name__ == "__main__":
RunCommand()
ma se ho un gruppo di oggetti e contemporaneamente un oggetto senza nessun gruppo il codice crasha.
Message: iteration over non-sequence of type NoneType
riporta questo messaggio alla riga del for indentato nell’ultimo ciclo
for group in selectable_object.Attributes.GetGroupList():
avevo già provato ad escludere questa riga ma poi mi seleziona tutti gli oggetti
presenti, anche quelli che non fanno parte del gruppo che intendo selezionare
ripeto se in Rhino ci sono solo oggetti ragguppati in vari gruppi, il codice funziona, ma se inseme
ai vari gruppi ci sono anche oggetti in nessun gruppo il codice riporta il messaggio di errore sopra
ps se ho capito bene il codice, va a fare una ricerca degli oggetti presenti in Rhino,
filtrando gli oggetti selezionabili tra i gruppi presenti, ma senza considerare gli oggetti singoli. . .
def RunCommand():
## seleziona un oggetto
rs, obj_ref = RhinoGet.GetOneObject("Select object", False, ObjectType.AnyObject)
if rs != Result.Success:
return rs
rhino_object = obj_ref.Object()
if rhino_object == None:
return Result.Failure
## estrae i gruppi a cui appartiene l'oggetto e ricava la lista dei gruppi
rhino_object_groups = [group for group in rhino_object.Attributes.GetGroupList()]
## ricava l'elenco degli oggetti selezionabili
selectable_objects= [
obj for obj in doc.Objects.GetObjectList(ObjectType.AnyObject)
if obj.IsSelectable(True, False, False, False)]
## per ogni oggetto selezionabile:
## se l'oggetto appartiene a uno dei gruppi elencati nella lista dei gruppi (ricavata sopra):
## lo seleziona
for selectable_object in selectable_objects:
for group in selectable_object.Attributes.GetGroupList():
if rhino_object_groups.Contains(group):
selectable_object.Select(True)
continue
doc.Views.Redraw()
return Result.Success
scusa se rispondo solo adesso
si grosso modo avevo compreso il funzionamento del codice
un pensierino anche avevo fatto su dove si doveva lavorare
mi mancava/manca ancora come modificare il codice
i tuoi suggerimenti sembrano confermare il mio pensiero
adesso provo ad attuare le modifiche necessarie
si però per carità porto a casa il risultato ma sto proprio
(non voglio dire imbrogliare)
ma di sicuro lo considero un raggirare del problema
for selectable_object in selectable_objects:
try:
for group in selectable_object.Attributes.GetGroupList():
print group
if rhino_object_groups.Contains(group):
selectable_object.Select(True)
continue
except:
continue
scriptcontext.doc.Views.Redraw()
avevo capito sin dall’inizio che veniva preso il risultato dell’attributo gruppo
ed infatti questo accade nel primo ciclo con rhino_object_groups
poi non ho capito il perché, si va a creare una lista di tutti gli oggetti in Rhino
ma scegliendo tra le 4 opzioni True/False
e poi alla fine usa un doppio ciclo iterato, il primo si va a spulciare la lista degli oggetti scelti nella lista
il secondo ciclo quello iterato si va a prendere quelli che hanno un attributo gruppo
per poi dire de l’attributo gruppo ha il valore estrapolato inizialmente lo seleziona
ovviamente se un oggetto scelto per la selezione non ha un attributo gruppo va il crash
ora la mia intenzione iniziale era da subito quella di fare un ciclo con tutti gli oggetti in Rhino
e inserirli direttamente nella lista coloro che hanno l’attributo gruppo selezionato inizialmente
scrivendo questo messaggio mi è venuto in mente di eliminare proprio l’ultima parte
ed modificare il ciclo coi True/False e inserire li direttamente il criterio di scelta
non sono sicuro se era questa anche la tua idea, comunque adesso provo anche in questo modo. . .
diciamo che sono un po combattuto:
se modifico il codice a mio piacimento, poi continuo come ho sempre fatto nel scrivermi il codice da solo,
mentre se lascio il try, rispetterei il ragionamento fatto inizialmente, quello che è inutile re-inventare la ruota.