Conferma Metodo Rcommon

eeee per questo all’epoca me ne scappai a gambe levate e mi dissi meglio VBS o Py
però poi alla fine se si vuole proseguire anche per fare piccole cose un po bisogna masticarne
in Py anche per usare ETO bisogna usare Rcommon quindi volente o nolente deve entrare nella testuggine

hai ragione, ho sbagliato a fare quell’esempio, ovviamente chiamare oggetto è diverso da chiamare la classe

ok su questo è assodato

qui ho bisogno qualche precisazioni; spiego riallacciandomi al fatto che adesso avevo bisogno di fare pratica, essendo che quando apprendo nozioni accumulo tutto in un calderone poi dopo quando inizio
ad impastare qualcosa man mano debbo cercare di sistemare tutti i vari pezzi al proprio giusto posto

Immagine 2022-12-29 002929

ho mischiato le due cose var gd = new GetNumber(); con public double X{get} o public Coords(double x);

quindi posso impostare double sia una variabile che un parametro di un costruttore ma no un oggetto

edit:
pensandoci bene, in Py ho sempre usato solo rs.getreal oppure rs.getint non esiste rs.getdouble

1 Mi Piace

Non e’ questione di dove usare double, ma di usare il tipo di dati giusto.
Se hai una istruzione che somma due numeri, non puoi assegnarla a una stringa.
Non puoi scrivere

string risultato = 5 + 8;

Come non puoi scrivere

double testo = "Hello Rhino !";

Se da una certa operazione ottieni un numero, la variabile che usi deve avere un tipo numerico.
Se ottieni un testo, deve essere una stringa.
Se richiami un costruttore della classe GetNumber, il valore che ottieni e’ del tipo GetNumber,
come fa ad essere di un altro tipo ? :slight_smile:
Quando assegni il valore di una espressione ad una variabile, il tipo della variabile deve essere quello del valore che ottieni come risultato da quella espressione.

Qui c’e’ una grande differenza da VBScript o da Python, dove tu non ti preoccupi del tipo di dati, pensa a tutto l’interprete. Questi sono linguaggi non ‘tipizzati’.

C# invece e’ un linguaggio ‘tipizzato’, tu devi dichiarare li tipo di dati di ogni variabile, di ogni parametro di funzione e di ogni valore restituito da una funzione.
( var e’ un aiuto per velocizzare la scrittura in certe situazioni, ma tu devi comunque sapere esattamente che tipo di dati stai utilizzando, se no non vai lontano col tuo script )
E devi dichiarare il tipo che corrisponde al valore che metti nella variabile, non puoi dichiararne uno a piacere.

Qui non c’entra la programmazione ad oggetti, questo e’ un concetto valido per ogni linguaggio ‘tipizzato’.
Devi utilizzare e quindi dichiarare per le variabili il giusto tipo di dati.
Non importa se il tipo di dati in questione e’ un ‘vecchio’ int o double o string oppure una classe di RhinoCommon o scritta da te ecc.
Se una variabile deve contenere un valore/oggetto di un certo tipo, devi dichiararla con quel tipo.

E’ per questo che il C#, come altri linguaggi simili, e’ piu’ veloce di Python.
Quando esegui uno script in Python, l’interprete non sa in anticipo che tipo di dati e’ salvato in una certa variabile, quindi deve verificare in fase di esecuzione e comportarsi di conseguenza, perdendo un mucchio di tempo.

Il compilatore di un linguaggio tipizzato sa da subito che tipi di dati sta utilizzando e quindi puo’ scrivere nel file exe o quello che e’ le giuste istruzioni per elaborare quei dati, senza inserire nessun controllo, e la cosa e’ decisamente piu’ veloce.
Ma per fare questo e’ necessario che tu dichiari le variabili con il giusto tipo/classe quando scrivi lo script.

E’ chiaro adesso che GetNumber e’ solo un tipo di dati, come int o string ? :slight_smile:

2 Mi Piace

su questo punto si è chiaro, la confusione come hai detto è nata dal fatto che fin’ora non ho mai dovuto preoccuparmi di dichiarare il tipo di dati quindi questo è un argomento del tutto nuovo e che quindi dovrò capire il ragionamento che c’é dietro e metabolizzarlo. di sicuro divieto di applicare double al GetNumber :blush:

battute a parte, in Py non avevo mai fatto caso che per inizializzare una variabile ci sono vari tipi tra cui
double, mentre come input di valori / tipi di dati digitabili da tastiera siano solo stringa, integer e real. . .

quindi var in var gd = new GetNumber(); come tipo di dato è corretto definirlo generico?

Rhino.Input.Custom.GetNumber getter = new Rhino.Input.Custom.GetNumber();
getter.SetCommandPrompt("Inserisci un numero");
getter.Get();
double a = getter.Number();

Per farne una metafora:
1

Rhino.Input.Custom.GetNumber getter = new Rhino.Input.Custom.GetNumber();

Questa riga crea un nuovo oggetto, chiamiamolo “postino”, “corriere” o “messaggero”.
È un corriere nuovo, non specializzato, senza istruzioni specifiche.
Conosce solo la sua destinazione: la barra di comando, l’utente.

2

getter.SetCommandPrompt("Inserisci un numero");

Qui diciamo al corriere cosa dire quando arriverà a destinazione.

3

getter.Get();

Ora diciamo al corriere “vai, parti” e lui parte a fare il suo lavoro (altrimenti stava li tranquillo a oziare).
In questo caso il corriere è andato a raccogliere una pizza (un numero double), e poi torna.
(Potremmo dire al corriere nuovamente “vai!” e lui partirebbe, buttando la vecchia pizza!)

4

double a = getter.Number();

Chiediamo al corriere di darci la pizza che ha ritirato.

Nota che “getter”, il nostro corriere, non è una pizza!
Potremmo avere molti altri tipi di “getter”: postini, messaggeri, sicari, ecc ecc …e dargli istruzioni diverse… o istruire in modo diverso il nostro corriere così che impari a ritirare panini (int).




Una cosa completamente diversa è questa, invece:

double x = 0;
Rhino.Commands.Result risultato = Rhino.Input.RhinoGet.GetNumber("Inserisci un numero", true, ref x);

In questo caso abbiamo un oggetto che viene “consumato” al volo, nell’istante in cui lo crei ha già compiuto il suo lavoro, ovvero impostare il numero ottenuto dentro la variabile “x”.
Molto più sbrigativo e senza fronzoli.
L’oggetto risultato non ha alcuna utilità, se non dirti se il comando è andato a buon fine (success/failure).
Si può omettere, così:

double x = 0;
Rhino.Input.RhinoGet.GetNumber("Inserisci un numero", true, ref x);



Si, decisamente.
I primi, i metodi di Rhinocommon come Input.Custom… o Input.RhinoGet sono metodi creati da McNeel per far interagire l’utente durante l’esecuzione di un codice.
I secondi, sono metodi “accessors” che permettono di gestire l’accessibilità di una proprietà di un oggetto.
Ad esempio, se io ho una classe così:

class Persona{
   public string Nome;
   public string Età;
}

Il nome ed età della persona sono pubblici, qualsiasi metodo esterno può modificarli senza che nient’altro accada.
Invece, se fai così:

class Persona{
   private string Nome;
   private int Età;
   public string nome{
      get{
      return this.Nome;
      }
      set{
      this.Nome = value;
      }
   }
   public int eta{
      get{
      return this.Età;
      }
      set{
      this.Età= value;
      }
   }
}

vedi che non si accede più direttamente alle proprietà dell’oggetto, ma attraverso un metodo, che ci permette dei get/set in base a come abbiamo deciso che sia permessa la lettura/scrittura di tale proprietà.
Nota che, essendo metodi potrebbero fare dell’altro, come:

class Persona{
   private string Nome;
   private int Età;
   public string nome{
      get{
      return this.Nome;
      }
      set{
      bool x = ChiedoAllAnagrafeSePossoCambiareNome();
      if(x){this.Nome = value;}
      }
   }
   public int eta{
      get{
      RispostaEmotivaInBaseAlContesto();
      return this.Età;
      }
   }
}

Nel tuo esercizio sembra che vogliano dare un permesso solo di lettura a due variabili pubbliche, ma non ho mai usato struct quindi non so…

3 Mi Piace

Credo che in C# il tipo generico sia object.
Qui in gd carichi un oggetto di tipo GetNumber, dato che stai richiamando un costruttore della classe GetNumber.

Forse c’e’ ancora qualcosa che non ti convince nel tipo/classe GetNumber ? :slight_smile:

Se ti riferisci al var, non significa che sia generico o sconosciuto.
Vuol solo dire che il compilatore ricava il tipo di dati dal valore che carichi nella variabile.
Sono problemi del compilatore, comunque se ti confonde puoi benissimo scrivere:

GetNumber gd = new GetNumber();

Anzi, secondo me e’ meglio se per ora usi questa sintassi, cosi’ il tipo di dati risulta chiaro e non ci sono posssibilita’ di confondersi.

In Python il double si chiama float.
Mentre rhinoscriptsyntax a volte lo chiama real.
Ma sono sempre la stessa cosa, non preoccuparti. :wink:

2 Mi Piace

Tutti i metodi di input (così come i metodi getX) di rhino sono dei Command che restituiscono
un tipo Return che indica lo stato in cui è terminato il comando: Success, Cancel ecc…
Riccardo ha spiegato come “contenere” il codice:

Se l’utente annulla il comando, come si intercetta l’eccezione a livello di codice?

double x = 0;
Rhino.Command.Result rc  = Rhino.Input.RhinoGet.GetNumber("Inserisci un numero", true, ref x);
if (rc != Rhino.Commands.Result.Success)
  return rc;

@emilio , il tuo è veramente un codice compatto! :grinning:

3 Mi Piace

ragazzi grazie a tutti per gli esempi e spiegazioni postate vedrò di asimilare il più possibile :+1:

diciamo che adesso sto cercando di capire quale sia il modo corretto di assemblare tutti i pezzi acquisiti

chiarito che var non vuole dire variabile generica ma che è il compilatore che va a cercarsi il tipo di dato caricato nella variabile (quindi va a fare quello che fa di consueto un linguaggio non tipizzato)

infatti negli esempi visti veniva usato proprio questa sintassi, quindi quel var ha finito di confondermi

a ecco dove mi perdevo, giustamente GetNumber è un metodo/classe
se debbo settarlo come double lo debbo fare col suo valore double a = getter.Number(); giusto :+1:

Riccardo una domanda: ma quel getter è in grassetto perché è una parola chiave oppure è come gd?

poi faccio giusto una mia riflessione anche se può sembrare un ragionamento limitato:
gd o getter come citato da Riccardo è un facchino che sa solo dove andare
(quello che non comprendo del perché viene fatto in questo modo anche se ne prendo atto)

Rhino.Input.Custom.GetNumber getter = new Rhino.Input.Custom.GetNumber();

getter è il facchino, “new Rhino.Input.Custom.GetNumber()” è nuovo ordine che gli verrà dato
però prima debbo impostare/scegliere il facchino giusto con “Rhino.Input.Custom.GetNumber”

in pratica il facchino che deve andare a prendere la pizza per poi consegnarla
deve avere impostato che ciò che dovrà prendere è una pizza, perché si dovrà portare con se il cartone della pizza per metterla dentro e consegnarla, se invece gli davo un panino, dovevo settarlo in modo che sapesse che quello che gli davo fosse un panino, in modo che si doveva portate il cartone del panino.
altrimenti il facchino si dovrebbe portare tutti i tipi di cartone per poi scegliere quello giusto. . .

spero sia +/- corretto come riassunto? (anche se nella vita reale il cartone lo da il pizzaiolo ahahahah)

edit: vedo di fare un’altro esempio diciamo che se chiamo una ditta di traslochi, vuole sapere inizialmente il tipo di lavoro per organizzarsi se deve trasportare oggetti fragili deve portare il pluriball, mentre se sono solo abiti va bene metterli semplicemente in un cartone da imballaggio per poi trasprtarli.

è una formattazzione che fa il forum discourse , non l’ho voluto io.
Anzi, “getter” è quasi fuorviante, potrebbe alludere ad altro… sarebbe stato meglio lo chiamavo “corriere” o “postino” … è un nome come un’altro.

…no, “new Rhino.Input.Custom.GetNumber()” non è un nuovo ordine ma un nuovo facchino, la creazione di un nuovo facchino… che in quel caso lo chiamiamo “getter”.


Guarda qua:
2022-12-29 12_40_35-Script Editor
Rhino.Input.Custom contiene già molti tipi diversi di “facchini” ognuno già specializzato a prendere qualcosa in spacifico, l’ideale è prendere subito quello più vicino alle necessità.
Come già detto, io consiglierei di usare Rhino.Input.RhinoGet , sono più semplici…


Edit:
ad ogni modo, come al solito, consiglierei di andare sul pratico, piuttosto di stare sul teorico/astratto.
Poniti un obbiettivo semplice, un esercizio, una piccola macro funzionale, e poi cerca di crearla fino in fondo.
Tutte le cose che so di programmazione le ho imparate solo ed esclusivamente andando a tentativi per ottenere script che mi servivano, mai studiato teoria.
Non dico che sia il percorso migliore, ma neanche l’estremo opposto aiuta.
Metti in pratica in parallelo alla teoria.

PS, se lavori con c#, non usare “var”. È controproducente, soprattutto se vuoi imparare.

2 Mi Piace

Ciao Sergio.

Eh, ho provato a rispondere a Salvio che voleva mettere insieme 4 istruzioni … :neutral_face:

Non so perche’ lo voglia fare, ma certo io non glielo chiedo :wink:
Siamo gia’ abbastanza incasinati cosi’ … :grinning_face_with_smiling_eyes:

Con alcune differenze.

Con Python, ad esempio, puoi fare quello che vuoi con la variabile, metterci un numero, poi metterci una stringa, poi un booleano ecc.
Sono tutte cose che succedono in fase di esecuzione, e che possono variare per esempio in conseguenza di un input dell’utilizzatore.
Python, man mano che esegue il codice, verifica che dati ha e si comporta di conseguenza.

C# deve sapere da subito, cioe’ quando compili lo script, qual’e’ il tipo di dati, e questo tipo non cambiera’ piu’ durante l’esecuzione.

Prima o poi sarebbe bene evitare confusioni tra metodi e classi. :slight_smile:
GetNumber e’ una classe:

GetNumber Class (rhino3d.com)

Un metodo e’ una funzione che ‘riguarda’ quella classe. Una di quelle che richiami col punto.
Ad esempio

double a = getter.Number();

qui Number e’ un metodo della classe GetNumber,
infatti per richiamarlo scrivi prima una variabile che contiene un oggetto GetNumber, cioe’ getter, poi scrivi il punto e ci attacchi nome del metodo e parentesi con eventuali parametri, come per ogni chiamata di funzione.
E’ la tipica sintassi OOP ,che ovvimente puo’ avere pregi e difetti, ma quella e’.

Guarda la documentazione RhinoCommon di GetNumber linkata sopra.
Vedi quanti metodi ci sono ?
Quante cose puoi fare ?
E’ fatta cosi’ per essere flessibile, per poter configurare la tua azione di input come ti serve, caso per caso.
Se o quando vuoi usare una cosa piu’ semplice, usa invece la classe che ti ha mostrato Riccardo sopra:

RhinoGet Class (rhino3d.com)

2 Mi Piace

avevo notato che non passi per Custom, ci sono differenze sostanziali?

chissà per la serie: Immagine ahahahah

comunque come hai detto anche tu è una passione in primis, poi voglio cercare di capirne anche un po.

esatto è proprio quello che intendo e sto cercando di fare, però (c’é un grande però)
e come quando vidi i tutorial su Py 2.7, mi scaricai editor ripetevo ciò che vedevo e facevo pratica.
adesso (però come anche passando da Py a IPy in Rhino) è differente non posso usare Console Write oppure Read per dialogare con gli I/O quindi debbo vedere i tutorial per vedere la sintassi di C# poi
debbo ricercarmi qualche script in C# con metodi che facciano per vedere cosa fa o no a caso mio
ed infine debbo abbinarle insieme con altre aggiunte personali che faccia funzionare il tutto. non’é facile.

comunque non mollo :muscle:

ps mi raccomando non mi abbadonate che ho altre punti da chiarire :wink:

Hai ragione.
Ma se vuoi, invece di cercare esempi in giro, puoi anche scegliere qualche semplice operazione e poi chiedere qui, vedrai che un esempio da cui partire riusciamo a metterlo insieme.
Inoltre, si potrebbe anche provare a portare in C# esempi presi da rhinoscriptsyntax.
Se ti serve una mano a ‘tradurre’, stesso discorso, ci proviamo insieme.

rhinoscriptsyntax/Scripts/rhinoscript at rhino-6.x · mcneel/rhinoscriptsyntax · GitHub

grazie Emilio per la disponibilità :+1:

ovviamente come già sto facendo, nel caso di aiuto posto il problema :ok_hand:

eeee mi sa che quei codici sono troppo complessi da quelli che faccio io in Py
finisce che dovrei imparare anche le tecniche avanzate di Py ahahahah
ma ci vuole il codice intero per realizzare una linea con line.py?

però oltre alle domande che faccio sul forum, vi condivido anche il fatto
che ieri prima di fare la domanda postata, avevo anche concluso
la mio primo plug-in (assemblato) in Rh per realizzare un offset

quindi comunque l’impegno messo a qualcosina è servito :wink:

1 Mi Piace

E’ per quello che dobbiamo provare in pratica …
Per capire cosa serve, cosa non serve e cosa serve a fare cosa …
:thinking: :wink: :grinning_face_with_smiling_eyes:

prof io ho iniziato con un 3d apposito, ora tocca a Lei indirizzare la rotta o meglio,
raddrizzare prima la barca, che già c’é un iceberg, se no facciamo la fine del Titanic :wink:

Riccardo da quanto tempo scrivi in C# e quanto ci hai messo per essere pratico in questo linguaggio?

Dal 2018 circa. Ma solo ed esclusivamente dentro gli script c# di grasshopper. Non ho mai usato c# al di fuori di questo.
Usare c# dentro grasshopper l’ho trovato perfetto, per imparare c# ed esplorare le librerie di rhino.
L’ho sempre usato per cose che mi servivano a livello pratico, per lavoro o per altro. Zero teoria.

quindi quando dissi di iniziare con C# in Gh l’idea non era proprio cattiva :thinking:

vedo se riesco, dopo aver convertito gli script Py in Common per poi passarli in Gh con C#

spero che in qualche mese riesco ad ottenere dei risultati per lo meno sufficienti per il mio standard :+1:

:crazy_face:

1 Mi Piace

Riccardo in Gh una sola riga, si saltano tutti i riferimenti agli oggetti all’interno della programmazione

1 Mi Piace