C# Scripting in Gh

@0904 In un programma c# è necessario indicare almeno un punto di ingresso tramite il metodo Main() che Sergio ha correttamente inserito.

Personalmente penso ad una classe come ad un blocco GH non ancora instanziato (trascinato nel canvass).
Può avere ingressi ed uscite e può inglobare altre classi al suo interno (incapsulamento che può avvenire anche tramite interfacce ad esempio) per farne di più cicciotte.
Quando costruisci/istanzi un oggetto con new ad esempio, le assicuri uno spazio nella memoria.

1 Mi Piace

Mi sembra sensato. Grazie

1 Mi Piace

Parlavo di quanto hai postato tu, dove c’e’ una funzione Main().
Quelle istruzioni le metterei in RunScript() adattando Disegna() in modo che restituisca il testo anziche’ stamparlo.

Adesso scrivo dal telefono, faro’ poi un esempio …

1 Mi Piace

il concetto c’é l’ho anche in Python ci sono le classi
può sembrare una schiocchezza ma passare da
una programmazione classica a Gh non’é facile

Provo.

L’idea e’ di scrivere eventuali definizioni di classi nell’additional code, ad esempio


class cla
{
  public string Disegna()
  {
    return "Disegna da classe cla";
  }
}

e poi utilizzare la classe dentro RunScript().
Esempio

  public void RunScript( ref object A )
  {
    var oba = new cla();
    var tex = oba.Disegna();
    A = tex;
  }

La differenza e’ che invece di scrivere il metodo Main(), metti le tue istruzioni dentro RunScript(), tenendo conto dei parametri in input e in output del componente, che comunque GH inserisce automaticamente come parametri del metodo RunScript().
Questo funziona esattamente come per il componente Python.

Se ci sono altre classi, le scrivi nell’additional code.

3 Mi Piace

Esatto Emilio
è un riferimento ad un oggetto con limitazioni.
Ciao!

1 Mi Piace

ok grazie provo a capirci qualcosa :wink:

ps la verità e che anche in Py le classi le ho sempre percepite ostili, sarà l’ora di capirle meglio. . .

1 Mi Piace

Le classi in fondo sono solo un modo per organizzare i programmi, e l’idea di base e’ quella di definire dei tipi di dati composti personalizzati.
Tipico esempio un punto che conterra’ 3 numeri per i valori di X, Y e Z.
Una volta definita la classe “Punto”, nel linguaggio ci sara’ un modo per costruire questi punti, chiamati “Oggetti”, e ognuno di loro conterra’ automaticamente i suoi bei valori di X, Y e Z.
Questo e’ solo il concetto di partenza, poi i vari linguaggi aggiungono un sacco di altre feature con i loro nomi e le loro sintassi, ma, dopo aver capito l’idea di base, non e’ necessario imparare tutto subito.
Basta imparare, o semplicemente ricercare ad esempio sul Web, volta per volta quello che ti serve.

Suppongo che tu abbia testi o video da studiare.
In ogni caso per dubbi vari prova a chiedere qui.

1 Mi Piace

sto sfogliando un pò questo manuale pdf

Se ti serve, provo poi a postare un semplice esempio di classe.

magari. . . anche perchè personalmente cozzo sempre con gli esempi da manuali :blush:

1 Mi Piace

Inizierei a guardare i campi di una classe.
Chiamiamo campi i valori, in pratica le variabili, scritte all’interno della classe.
Ogni oggetto di quella classe conterra’ delle variabili dello stesso tipo e con lo stesso nome.
Per accedere a queste variabili/campi usiamo il punto, cioe’ scriviamo prima la variabile che contiene l’oggetto, poi il punto e dopo il nome del campo.
Ad esempio il campo “pes” dell’oggetti “ga1” lo identifichiamo con “ga1.pes” … vedi sotto.

In questo esempio definiamo una classe “col” che rappresenta un colore e una classe “gat” che rappresenta un gatto.
I campi dei colori sono i 3 valori R,G,B e in nome
I campi del gatto sono nome, peso e colori, per i colori usiamo una Array di oggetti “col”.

Per fare un esempio, definiamo due oggetti “gat”, settiamo i relativi campi e per ognuno costruiamo un testo informativo da mandare in output.


  public void RunScript( ref object A )
  {
    // definizione colore
    var col1 = new col();
    col1.r = 255;
    col1.g = 255;
    col1.b = 255;
    col1.n = "bianco";
    // definizione gatto
    var ga1 = new gat();
    ga1.nom = "pippo";
    ga1.pes = 5.0;
    ga1.coli = new col[ 1 ];
    ga1.coli[ 0 ] = col1;
    // definizione colore
    var col2 = new col();
    col2.r = 0;
    col2.g = 0;
    col2.b = 0;
    col2.n = "nero";
    // definizione gatto
    var ga2 = new gat();
    ga2.nom = "peppo";
    ga2.pes = 4.5;
    ga2.coli = new col[ 2 ];
    ga2.coli[ 0 ] = col1;
    ga2.coli[ 1 ] = col2;
    // costruzione testo di output
    var texs = new List<string>();
    addinfo( ga1, texs );
    addinfo( ga2, texs );
    A = texs;
  }

// ADDITIONAL CODE:

  // Colore
  class col
  {
    public int r;
    public int g;
    public int b;
    public string n;
  }

  // Gatto
  class gat
  {
    public string nom;
    public double pes;
    public col[] coli;
  }

  // funzione ausiliaria per il testo informativo
  void addinfo( gat g, List<string> texs )
  {
    var tex = $"Gatto {g.nom} - Peso {g.pes} Kg - Colori";
    foreach( var c in g.coli )
    {
      tex += $" {c.n}";
    }
    texs.Add( tex );
  }

Spero sia chiaro che i campi degli oggetti col1 e col2 contengono valori diversi,
cosi’ come quelli di ga1 ga2.
Cioe’ ogni oggetto ha i suoi campi, uguali come nome e tipo per ogni oggetto della stessa classe,
ma contenenti valori indipendenti.

EDIT

Dimenticavo un’altra cosa.
Per costruire un oggetto in C# si usa l’operatore “new”,
quindi “new col()” serve a costruire un oggetto della classe “col”.

1 Mi Piace

grazie Emilio :+1:

con calma me la studio :wink:

1 Mi Piace

eccomi :smiley:

seguendo i tutorial su yt ed essendo che gli esempi sono generici come calcoli e scritte
stavo pensando di provare i codici di C# in Gh come avevo detto inizialmente
anche perché nella pratica usare C# in Gh bisogna fare delle modifiche

Bene.
Prova e facci sapere se ci sono problemi … :slight_smile:

:smiley: di la verità già lo sapevi ahahahah

non riesco nemmeno a scrivere qualcosa nel panel :man_facepalming: :man_facepalming:

ok ci voleva il Print con la P maiuscola :+1:

1 Mi Piace

ma Mono che usi è tutti da terminale?
nel senso se inizio qualche parola chiave anticipa coi suggerimenti per completare la scrittura?

edit:
oppure funziona in combinazione con VStudio?

Mono parte in un modo … per me un po’ particolare:
Ma per fortuna, come lo uso io, non c’entra niente con VStudio.
Poi se ti trovi bene a usarlo con VStudio, forse si puo’ fare, non saprei … sorry. :blush:

Qui ti mostro solo come faccio io.

Parto dal menu’ Start di Windows.
Tra le varie voci c’e’ anche Mono.
Ci clicco sopra e compare questo:

La documentazione dice che e’ un terminale ‘customizzato’ che sa gia’ dove andare a prendere gli strumenti … suppongo il compilatore e forse altro, non so …
( A me sembra tanto la tipica complicazione-Microsoft, ma almeno funziona )

Qui ad esempio, mi sposto nella cartella dove tengo i vari (micro)programmi C# e (ri)compilo il file
sal1.cs … che e’ una cosa che avevo messo insieme tempo fa per, diciamo cosi’, simulare alla buona il funzionamento del componente C# di GH, in modo da poter testare con Mono, ad esempio, uno script che tu puoi eseguire su GH.

Come vedi dalla data del file sal1.exe, la compilazione e’ andata a buon fine.

Se provo a eseguire il file, compare un breve testo, come previsto.

Riporto qui il file sal1.cs.
Se ricordi, e’ un piccolo esempio con una classe che avevo postato tempo fa.
Non preoccuparti del resto. Quello che ti interessa, usando C# in GH, sono il metodo RunScript() e la classe cla.

using System;
// using System.Collections.Generic;

class gh
{

  public void RunScript( ref object A )
  {
    var oba = new cla();
    var tex = oba.Disegna();
    A = tex;
  }

}

class cla
{
  public string Disegna()
  {
    return "Disegna da classe cla";
  }
}

class test
{
  static void Main()
  {
    var GH = new gh();
    string A = "";
    object B = (object)A;
    GH.RunScript( ref B );
    Console.WriteLine( (string)B );
  }
}

Non so se per Mono ci siano delle IDE (oltre eventualmente a VStudio), non le ho cercate.
Io mi trovo meglio cosi: text editor e terminale.

ma questo codice lo hai realizzato con C# in Gh?
perché ma me questa stringa Console.WriteLine( (string)B ); in Gh non mi funziona

Scusa Salvio, sopra ho appena scritto:

… E tu subito vai a provare WriteLline() con GH …
:roll_eyes: :wink: :grinning_face_with_smiling_eyes:

Come avevo scritto in passato, per provare questo semplice test con la classe in GH, basta copiare le istruzioni di RunScript() e aggiungere la classe cla nel Custom additional code.
L’output lo prendi dal parametro A in uscita.

No … Come supponevo di aver detto chiaramente sopra:
questo e’ un semplice test che eseguo con Mono.
E’ il mio modo per replicare uno script in GH (senza RhinoCommon, ovviamente) con Mono.
Cosi’ posso provare queste cose e discuterne con te senza dover usare Rhino e GH.

:grinning_face_with_smiling_eyes: :grinning_face_with_smiling_eyes: :grinning_face_with_smiling_eyes:

1 Mi Piace