Seleziona Gruppo

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.

come si potrebbe modificare?

Senza avere messaggi di errore, faccio una supposizione.

Credo sia questo metodo
ObjectAttributes.GetGroupList Method (rhino3d.com)
che restituisce None se non ci sono gruppi.

Bisogna verificare il risultato ottenuto, e se e’ None sostituirlo con la lista vuota, oppure saltare quell’iterazione del ciclo.

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. . .

Ripeto:

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
:crossed_fingers:

1 Mi Piace

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. . .

Perche’ ?
E’ una soluzione come un’altra.
Non ci vedo niente di strano.

No, pensavo a qualcosa di simile a quello che hai fatto tu.
Ma fai bene a sperimentare, a provare a modificare lo script secondo la tua idea.

:+1:

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.

:thinking: :thinking:

per quanto mi riguarda il codice che intendevo era questo:

import Rhino
import scriptcontext

def RunCommand():
    rs, obj_ref = Rhino.Input.RhinoGet.GetOneObject("Select object", False, Rhino.DocObjects.ObjectType.AnyObject)
    if rs != Rhino.Commands.Result.Success:
        return rs
    rhino_object = obj_ref.Object()
    if rhino_object == None:
        return Result.Failure
    for obj in scriptcontext.doc.Objects.GetObjectList(Rhino.DocObjects.ObjectType.AnyObject):
        if (obj.Attributes.GetGroupList() == rhino_object.Attributes.GetGroupList()): obj.Select(True)
    scriptcontext.doc.Views.Redraw()
    return Rhino.Commands.Result.Success

RunCommand()

comunque adesso ho entrambe le scelte

1 Mi Piace