Sticky in C#

è possibile usare lo sticky in C#
essendo che in Py lo richiamo
tramite la libreria scriptcontext

Direi di no, sticky riguarda Python.

Bisogna usare altro, vedo che rhinoscriptsyntax/userdata usa questo:

1 Mi Piace

ciao Emilio, argomento bello tosto :muscle:

da quel che ricordo, una situazione simile mi era capitata mesi fa,
adesso credo di aver intuito la strada, ma non trovo la quadra. . .

public sealed class StringTable
{
    public string SetString(string key = "a", string value = "b")
    {
        //string[] sticky = string[key, value];
        string sticky = sy.String.Format("{0} {1}", key, value);
        return sticky;
    }
}

scrivendo questa riga:

StringTable.SetString("aa", "bb");

mi viene evidenziato String dandomi questo errore:

An object reference is required for the non-static field, method, or property 'StringTable.SetString(string, string)'

non capisco cosa vuole… “un riferimento per campo” di cosa si tratta?

Hehe … mi sembra la base della OOP … :wink:

“Per un campo non statico, oppure un metodo non statico, oppure una proprieta’ non statica, serve un riferimento a un oggetto.”

Il altre parole, se vuoi richiamare un metodo (o altre cose) relative a un oggetto (e non a una classe), serve un oggetto.

Un normale metodo in una classe si intende riferito a un oggetto, potremmo dirlo un instance method.
E quindi lo puoi richiamare solo se prima scrivi (il riferimento a) un oggetto, poi il punto e poi il nome del metodo.

Se tu prima del punto scrivi il nome della classe, cioe’ StringTable, dopo il punto puoi solo scrivere ‘cose’ statiche. Per esempio un metodo statico ( static method ).

Se tu non dichiari il metodo static quando lo scrivi, non puoi richiamarlo collegato al nome della classe, serve un oggetto.

Ripeto: e’ la base della OOP:
La differenza tra classe ed oggetto.
E quindi la differenza tra i relativi metodi (o proprieta’ o campi).

Se vuoi usare una libreria OOP come RhinoCommon, sono cose che val la pena fermarsi un momento e capirle bene.

eeee ci sto provando :blush:

alla fine per il tempo che riesco a dedicare e per quel poco di RCommon fatto in Py,
adesso che sto cercando di passare anche a C# diventa tutto molto più complicato.
(diciamo anche che questi argomenti sono complicati pure per chi conosce gli OOP)

aggiungendo lo static mi sembra che funzioni,
dico mi sembra essendo che sto provando GetValue
ma tra le tante prove ho notato una cosa “credo” strana:

    public static string GetValue( int key )
    {
        return key;
    }

ma un parametro int può ritornare string?
sto anche sercando di convertirlo ma. . .

In realta’ e’ la stessa cosa, almeno finche’ ci limitiamo a richiamare metodi ecc. messi a disposizione da RhinoCommon. :slight_smile:
Parametri da passare e risultati ottenuti sono uguali sia usando Python che C#.

Certo nello script ci sono delle differenze nella sintassi quando definisci una funzione, una variabile o un oggetto.
Ma visto che l’ambiente degli script C# in Rhino 8 non richiede di definire nuove classi,
se iniziamo con script semplici ci si puo’ concentrare sulle differenze tra alcuni tipi di dati, come array invece di liste e sulle diverse funzioni per il trattamento delle stringhe, ad esempio

L’esempio che avevi postato in un’altra discussione …

… mi sembra un ottimo punto di partenza.

Diciamo che hai detto una cavolata (IMHO) … :wink: :smile:.
Comunque, come dicevo sopra, all’inizio non c’e’ nessun bisogno di andarsi a cercare complicazioni non necessarie come scrivere nuove classi.

Meglio concentrarsi su quello che serve adesso … come utilizzare le StringTable, appunto :grinning:

Questo e’ un metodo di StringTable che, dato un indice (lo chiamerei cosi’ anche se la documentazione non si vede), restituisce il relativo testo salvato in quella tabella.

I parametri non resituiscono niente.
Sono i metodi che resituiscono i valori.
E non c’e’ nessun vincolo (per fortuna) tra il tipo restituito da un metodo e i tipi dei suoi parametri.
Esattamente come in Python.

Scusa, non capisco, questo cosa rappresenta ? :slight_smile:

ma non lo detto io :slight_smile: in un tutorial sul C# lo speaker aveva commentato che il suo prof quando spiegava
gli argomenti sugli OOP lui non ci capiva nulla, anzi erano tutti concetti astratti per lui quasi oscuri.

da qui viene la mia domanda: ma un parametro* int può ritornare string?
*intendevo un metodo avendo un parametro int può restituire un valore string?

non so se la sintassi è giusta stavo facendo delle prove sul GetValue
ma come dicevo, in questo caso il return mi da errore di conversione tra int e string

Puo’ essere che il prof non spiegasse bene. :slight_smile:

Se vuoi dire che la OOP ti sembra una complicazione inutile … siamo in due. :smile:
Ma fior di studiosi e di programmatori la pensano diversamente, per cui … ce la teniamo.
:grinning:

Voglio dire, per ora e’ una tecnologia molto popolare, poi tra 50 anni chissa’ …
Ma non sono problemi miei. :grinning:

E comunque per Rhino dobbiamo usare RhinoCommon.
RhinoCommon e’ scritta in C#.
C# e’ un linguaggio convintamente (se c’e’ questa parola) OOP.
Ergo, se vogliamo scrivere gli script per Rhino bisogna sapere utilizzare librerie OOP.

Come ho detto sopra:

Trovi qualcosa di strano in un metodo con un parametro int che restituisce una stringa ? :slight_smile:
Vedi qualche motivo per cui il tipo restituito dovrebbe essere collegato al tipo dei parametri ? :thinking:

Ma vuoi provare a usare GetValue della classe StringTable di RhinoCommon ?
O vuoi provare a scrivere tu un metodo GetValue (di qualche classe, suppongo) per qualche motivo ?

Certo, se dichiari di restituire string e poi restituisci int … c’e’ un errore.

anche può darsi, comunque tra i linguaggi sequenziali e gli OOP c’è un abisso in complessità.

e sì, credevo che fosse chiaro :laughing: (per lo meno intento ahahahah)

aaaa forse ho capito, debbo mettere nel return da restituire il valore impostato con StringTable giusto?

comunque se sono vicino al traguardo non dirmi la soluzione :yum:
a limite qualche indicazione, essendo che mi sfugge come richiamare i valori messi in sticky
(credo che con lo static vengano impostati sia la Key che Value essendo che si esegue senza errori)

Mica tanto … :smile:

Tu li’ scrivi un metodo GetValue, ma non richiami il metodo GetValue di StringTable.

Di solito se uno vuol provare a usare un metodo di una libreria lo richiama,
ma non scrive un metodo con lo stesso nome … :smile:

Di quale sticky parli ?
sticky riguarda Python.
In RhinoCommon non c’e’ nessun sticky.

… Sono sempre piu’ confuso … non capisco cosa cerchi di fare …
:smile:

avevo chiamato sticky la variabile messa nel Metodo dove impostavo il StringTable.SetString
:laughing:

appena eseguito il codice dopo ultima modifica, si è chiuso Rhino ahahahah

ha detto non voglio eseguire più i tuoi codici :rofl: :rofl:


edit: mi sa che ho di nuovo scritto un codice ricorsivo :persevere:

Haha … OK, questo:

Ma siamo da capo …
Qui scrivi una nuova classe chiamata StringTable, non provi a usare quella di RhinoCommon …

Come dicevo sopra, non capisco perche’ invece di richiamare i metodi della classe StringTable di RhinoCommon, tu stai scrivendo una nuova classe con lo stesso nome, con relativi metodi …

Sembra un modo per replicare la classe StringTable di RhinoCommon per qualche motivo, ma invece tu dici che vuoi provare a utilizzare quella di RhinoCommon …

Mi spiace ma sono ancora confuso …
:thinking:

eeee allora mi arrendo ahahahah
credevo di aver preso la direzione giusta, ma invece ho fatto un buco nell’acqua

io ho provato e riprovato ad usare StringTable di RhioCommon ma non ne ha voluto sapere,

e pure altri metodi li sto utilizzando non capisco come mai in questo caso mi tornano problemi.

dove sbaglio?

Se vuoi provare a usare quei metodi, perche’ scrivi una nuova classe chiamata StringTable ?

Se vuoi provare a usare quei metodi, per prima cosa recuperi un oggetto StringTable.
Visto che parliamo di sticky, quindi siamo a livello di documento, io userei questo:

Poi per fare un test, provo ad esempio a salvare un testo tramite un nome.
Per esempio il nome puo’ essere ‘versione’ e il testo puo’ essere ‘Rhino 8’.
Allora, sull’oggetto StringTable che hai appena ricavato, chiami il metodo

con key = ‘versione’ e value = ‘Rhino 8’.

Se vuoi, salvi il file e chiudi Rhino, poi lo riapri e ricarichi il file

Adesso, dopo aver di nuovo recuperato il nostro oggetto StringTable, provi a leggere quanto avevi scritto usando il metodo

usando come key ‘versione’.
Provi a stampare il risultato del metodo.

… E vediamo se funziona …
:crossed_fingers:

… Eppure sono parecchi anni che usi le librerie, con diversi linguaggi.
All’improvviso sembra che tu non le abbia mai utilizzate … :confused:

Forse ti confonde il fatto degli oggetti. :slight_smile:
Vedrai che con un minimo di pratica ti rendi conto anche tu che gli oggetti sono come qualunque altro valore che usi in programmazione.
Scrivere qualcosa piu’ un punto prima del nome della funzione e’ esattamente la stessa cosa che scrivere un parametro in piu’ o scrivere un nome di funzione diverso.
Quello che fai per usare una libreria e’ sempre la stessa cosa.
Adatti un pochino la sintassi.
Ma il significato resta identico: tu passi dei valori alla libreria e lei ti restituisce il risultato.

E comunque con Python avevi gia’ provato a usare RhinoCommon.
Non cambia niente, continui a usarla nello stesso modo anche con C#.

scusami Emilio lo so che tardi e che mi risponderai domani,

ma mica intendi una riga come questa in un Metodo:

RhinoDoc.Strings sticky = new RhinoDoc.Strings.StringTable.SetString("a", "b");

?

Domani vediamo con calma. :slightly_smiling_face:
Intanto ti dico che non serve costruire oggetti (nessun new), devi solo usare l’oggetto RhinoDoc.Strings per richiamare i metodi che ti servono.
Quell’oggetto e’ gia’ pronto.
Basta usarlo.

1 Mi Piace

eeee immaginavo. . . non voglio essere pessimista ma credo che sarà la stessa cosa :scream: :scream:

ok grazie :wink: a domani :+1:

nel frattempo :birthday:

1 Mi Piace

Hehe … :wink:

Cosa c’e’ di spaventoso a scrivere

doc.Strings.SetString( … ); ?

:grinning:

Tantissimi Auguri.

Grazie , Leopoldo !