Doppio Controllo RCommon

import Rhino
import scriptcontext
 
def CircleCenter():
    go = Rhino.Input.Custom.GetObject()
    go.SetCommandPrompt("Select objects")
    go.GeometryFilter = Rhino.DocObjects.ObjectType.Curve
    go.GeometryAttributeFilter = Rhino.Input.Custom.GeometryAttributeFilter.ClosedCurve
    go.GetMultiple(1, 0)
    if go.CommandResult()!=Rhino.Commands.Result.Success:
        return go.CommandResult()
 
    objrefs = go.Objects()
    if not objrefs: return Rhino.Commands.Result.Nothing

c’é qualche motivo particolare, che nei vari esempi, per lavorare con RCommon
viene fatto un primo controllo con Commands.Result e poi un secondo con if not objrefs:
ma se col primo if il risultato è Success conseguenzialmente objrefs deve essere per forza True
(considerando anche, che prima del Get in genere vengono impostati sia tipo di oggetto che gli attributi)

questo è un’altro esempio:

import Rhino
import scriptcontext
 
def IntersectLines():
    go = Rhino.Input.Custom.GetObject()
    go.SetCommandPrompt( "Select lines" )
    go.GeometryFilter = Rhino.DocObjects.ObjectType.Curve
    go.GetMultiple( 2, 2)
    if go.CommandResult()!=Rhino.Commands.Result.Success:
        return go.CommandResult()
    if go.ObjectCount!=2: return Rhino.Commands.Result.Failure
 
    crv0 = go.Object(0).Geometry()
    crv1 = go.Object(1).Geometry()
    if not crv0 or not crv1: return Rhino.Commands.Result.Failure

Questo non lo so.
Si potrebbe chiedere a chi ha scritto quelle istruzioni. :slight_smile:

Ma, almeno secondo la mia modesta esperienza, si puo’ fare anche in altri modi.
Ad esempio:

  # [ ... ]
  gob = Rhino.Input.Custom.GetObject()
  gob.AcceptNothing( True )
  gob.AcceptString( True )
  gob.SetCommandPrompt( 'Objects to move ?' )
  gob.GetMultiple( 0, 0 )
  res = gob.Result()
  if res == Rhino.Input.GetResult.Object:
    obrefs = gob.Objects()
    gids = [ obref.Object().Id for obref in obrefs ]
  else:
    return
  # [ ... ]
1 Mi Piace

eeee magari ci provo. . .

Emilio ho notato che ci hai preso gusto con le liste comprehension :wink:

Si’, nei casi semplici lo trovo piu’ comprensibile,
la funzione risulta piu’ corta/compatta.
Aiuta ad avere sott’occhio un maggior numero di istruzioni.

Domanda già trattata. I metodi get possono accettare un input vuoto per vari motivi.

ciao Sergio,
come già accennato, se il risultato è “Success” dovrebbe significare che input è senz’altro “True”?

potresti indicare un caso da replicare, in cui il risultato è “Success” ma input invece è “False”?

Tra parentesi, objrefs non e’ un booleano, e’ una array di ObjRef, quindi il controllo dovrebbe essere sul fatto che contenga degli elementi o meno.
( O che eventualmente non sia None … Su queste cose la documentazione di RhinoCommon non sempre e’ completa )

Ma a parte questo …
Volevo fare una considerazione in generale, non specifica per questo caso. :slight_smile:

Nessuno ci vieta di aggiungere un controllo in piu’.
( Meglio uno in piu’ che uno in meno :wink: )
Un controllo puo’ anche essere inserito solo per precauzione.
Un po’ di ridondanza di solito non guasta.
Inoltre alcune istruzioni, eventualmente comprendenti un controllo, possono essere state copiate da un altro programma.

Riguardo a questi esempi comunque puo’ benissimo esserci un motivo per inserire controlli ulteriori … come gia’ detto, non ho idea … :blush:

eeee potrebbe essere un motivo, in effetti io ho sempre il brutto vizio di pensare la programmazione, che serve ad una singola persona sul suo pc in locale, mentre sopratutto oggi è vero l’incontrario;
programmi che si condividono, file in remoto, dati presi chissà dove o da altri programmi,
ovviamente possono essere tanti motivi validi. a maggior ragione dopo questo ragionamento,
sarebbe utile conoscerlo, metterlo così a caso senza cognizione di causa non ha senso. . .

ps comunque pensandoci, e vero che in questo caso ho visto sempre (quasi) questo doppio controllo,
ma alcune volte già mi è capitato di vedere, parti di codici che non centrano proprio nulla in quel contesto.

edit:

chissà forse per chi vuole approfondire il discorso organizzeranno dei corsi specifici. . .

E’ una battuta ? :smile:

non proprio. . . essendo che come si è detto essere una guida carente
tranne alcune cose che si possono capire/imparare come autodidatti
avendo ovviamente già esperienze di altri linguaggi, non sono proprio
convinto che da soli si possa fare cose complesse (magari mi sbaglio)

mi sa un pò di quelle cose che solo poche persone hanno modo di poter accedere
quindi avevo immaginato una cosa come, corsi che fanno per diventare formatori ART
tipo un corso per developers C# per chi intendesse anche voler fare plug-in da rivendere

quello sopra era il mio pensiero, poi nel caso ho detto una corbelleria, allora si: era una battuta :smile: :smile:

1 Mi Piace

Ah, OK. Parlavi delle informazioni su RhinoCommon in generale. Giusto.
Io mi concentravo solo sul valore restituito, in questo caso dal metodo Objects(), quando non viene selezionato nessun oggetto.
:smile:
Si’, certo. Un tutorial sull’utilizzo di RhinoCommon sarebbe utile. :slight_smile:
Soprattutto perche’ la libreria puo’ essere utilizzata anche per gli script, quindi in genere non da professionisti.

Ma al giorno d’oggi queste cose sono sempre meno comuni.
Ormai viviamo nell’era dell’approssimazione.
Non solo per scelta secondo me. Credo c’entri anche il gran numero di strumenti disponibili e la loro sempre maggiore complicazione. ( Nonche’ i prezzi ridotti rispetto al passato )
Sarebbe impossibile (almeno per quasi tutti) imparare bene come funziona lo strumento che devi usare.
Allo stesso modo sarebbe un lavoraccio star dietro con la documentazione a tutte le novita’.
Almeno al nostro livello …

Result non è un boolean.
All’oggetto Get setta acceptnothing true e prova.
E comunque una riga di codice non ti cambia la
vita.

eeee una bella differenza:
se acceptnothing=false e non seleziono nulla il result ritorna cancel
se acceptnothing=true e non seleziono nulla il result ritorna success
e quindi in questo caso il secondo controllo non’é necessario ma obbligatorio

Sergio non voglio fare il libro del perché, ma a questo punto la domanda si trasforma in:
a che scopo avere acceptnothing=true/false che ritorna come risultato success/cancel?

ps una riga di codice in più non cambia la vita, ma credo siano cose comunque importante da conoscere.

edit:
magari mi sbaglio, ma potrebbe essere acceptnothing=true/false collegato alla preselezione degli oggetti?

acceptnothing serve per confermare valori predefiniti e probabilmente anche gli elementi
preselezionati. Con questa opzione penso che result non restituisce success o cancel ma
success, nothing o cancel.
Se per ipotesi hai opzione acceptstring attiva ma il risultato che vuoi è la selezione di oggetti,
se immetti un testo il comando restituisce success ma il buffer della selezione è vuoto.
La possibilità di personalizzare l’input offerta da rhino consente di creare comandi iterativi
molto accattivanti ma richiede un controllo efficiente di result.

ottima oddervazione, quindi come quando si va a selezionare un oggetto punto,
e contemporaneamente nel caso, puoi anche digitare le sue coordinate,
il comando va a buon fine ma non è stato preso nussun oggetto.

edit:

stavo provando come far ritornare in result nothing
ho visto degli esempi che lavoravano con scritte/testi

e guardando la guida sembra che ci siano anche altri risultati:

domandare è lecito, rispondere è cortesia.

grazie Dale.

1 Mi Piace