C# Scripting in Gh

Vorrei solo specificare una cosa che forse, con tutti i discorsi che abbiamo fatto, non risulta chiara.
Per sperimentare col componente C# di GH, Mono non ti serve.

E’ una cosa che uso io per motivi miei, ma non c’e’ nessun bisogno di preoccuparsi di Mono per usare GH.

Poi ovviamente se ti interessa io ti spiego tutto quello che vuoi su come io uso o non uso Mono, nel caso.
Ma, volendo evitare di complicare ancor piu’ il tuo studio, secondo me se per te va bene per ora Mono te lo puoi dimenticare senza problemi.
Possiamo concentrarci tranquillamente sulle istruzioni del metodo RunScript() ed eventualmente sull’additional code, nel caso serva. :slight_smile:

e avevi pensato no bene ma benissimo :smile:
dai abbiate pietà di me ahahahah che in due settimane qui tra VStudio C# Gh e Mono ormai sono andato
la questione è semplice, il fatto è che ho problemi ad eseguire gli esempi dei tutorial in C# di Gh
(anche se sarei molto contento se ci riuscissi solo che non so nemmeno se sia possibile. . .)
quindi avevo optato per Mono essendo che per la lentezza del mio pc VStudio non gira bene
per questo stavo cercando un ide editor per C# che suggerisce le parole chiavi come fa VStudio
ora non so come si comporta Mono, se lo usi solo per creare exe e lo editi con altri programmi
(per questo ti chiedevo come funzionasse, mi sembra di ricordare anche con Python lo usi da terminale)

io in Gh Console.WriteLine non mi funziona, fammi capire stai dicendo che con RunScript() risolvo?

la classe cla si questa mi funziona la seconda “test” invece no

Mostraci i problemi e vediamo se tra tutti quanti ne veniamo a capo.
Se il tutorial non e’ fatto per GH potrebbe volerci qualche piccola modifica.
Se posti l’esempio vediamo subito.

Poi, scusa, che differenza c’e’ tra usare una IDE con Mono e usare direttamente VStudio ?
Se preferisci usare una IDE, non puoi usare VStudio, visto che ce l’hai gia’ ? :slight_smile:

Ripeto: la classe test NON e’ da copiare in GH.
In GH devi copiare SOLO le istruzioni di RunScript() e la classe cla.

Il codice che ho postato e’ quello che uso io con Mono, NON e’ fatto per essere copiato tutto in GH.
Per mostrarti come uso Mono, casualmente ho scelto quel file.

Se vuoi provare quella cosa in GH, ricopia le istruzioni da scrivere dentro RunScript() da qui:


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

e copia la classe cla nell’additional code, cioe’ copia questo:

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

Poi collega un Panel all’uscita “A” e dovresti vedere il testo di output:

“Disegna da classe cla”

Se non funziona, fai un fischio … :wink:

  1. ok quindi se dici di togliere la classe test, allora già l’avevo fatta funzionare. come non detto :+1:

  2. come già detto sopra non gira bene VStudio col mio pc troppo vecchio e lento (impossibile)

  3. C# in Gh finora tutti i Console.WriteLine li ho passati nel panel tramite il Print
    fino a quando si tratta di scrivere qualcosa invece dell’uotput nella conscole la mando nel panel
    per altre cose però mi si complica un pochino ovviamente seguire il tutorial e adattarlo per Gh
    vabbè ho voluto la bici e adesso pedalo, provo alcune modifiche nel caso posto il problema :+1:

ps se nel caso puoi spiegarmi meglio come usi Mono perché io ancora non l’ho capito
mi compare un terminale poi se provo ad aprire un file *.cs mi compare
la finestra che mi chiede con quale programma voglio aprire il file. . .

Bene.

Certo ci sono delle differenze.
Non puoi usare l’input da tastiera.
E non va bene per programmi interattivi.
Forse ci sono anche altri problemi … non saprei …
Bisognerebbe vedere.

Certo.

Il file *.cs lo scrivo con un text editor, Mono per questo non c’entra.
Il terminale di Mono lo uso solo per compilare il file (comando csc)
e, volendo, per eseguire il file *.exe, scrivendo il relativo nome.

Se guardi le schermate che avevo postato prima, queste cose ci sono.

1 Mi Piace

e si purtroppo non posso utilizzare C# interattivamente in Gh
come anche questa istruzione int.TryParse sembra non venga riconosciuta

wauuu già il percorso era un bel po in salita adesso sia diventato anche un bel po tortuoso
(anzi mi sembra uno di quei giochi giapponesi dove nel percorso aumentano sempre le difficoltà)

in pratica debbo scrivere un codice nel “notepad” senza formattazione e senza suggerimenti
poi se il codice è per Rh lo debbo copiare in VStudio aprendolo col plug-in per RhinoCommon
avvio il compilatore e mi crea il file RHP quindi prendo quest’ultimo file lo importo in Rh e lo provo

mentre se debbo replicare un codice del tutorial che sto seguendo, lo scrivo sempre nel “notepad”
lo salvo *.cs quindi avvio Mono lo vado a localizzare ed invio il comando csc *.cs ritrovandomi *.exe
avvio l’eseguibile e controllo che il codice scritto funzioni correttamente come dovrebbe essere. . .

col VStudio non posso scrivere il codice troppo pesante il programma, Gh non’é compatibile 100%
per carità ormai ho iniziato e una volta che inizio in genere difficilmente mi fermo
però ragazzi non credo di arrivare a fine anno ahahahah
:exploding_head: :exploding_head: :exploding_head:

Emilio grazie sempre per il supporto e la sopportazione :wink:

ps dimenticavo:

:birthday:

1 Mi Piace

Be’ si’, devi adattare input e output, ma andra’ bene anche per RhinoCommon.
Se ti serve aiuto per adattare qualche esempio per GH, posta pure qui che … lo sistemiamo subito !
:wink: :slight_smile:

Qui su Rhino 6 funziona. :slight_smile:

Grazie !

Emilio il genio della lampada :wink:
si vede che sbagliavo la sintassi. . .

nel frattempo ho spulciato nei vari editor per adesso notepad++ è sempre molto duttile
a quanto pare riesce anche a convertire lo script in eseguibile, si deve instalare un plug-in

non ho capito se può eseguire il codice senza la conversione in exe proverò a cercare

sembra che questo link indichi la strada giusta:

ps sembra che però usi la versione del compilatore C# 5.0
mentre quella dei tutorial è la 8.0 :face_with_symbols_over_mouth: :face_with_symbols_over_mouth:

mi sa che il sistema più semplice sia il tuo usando Mono. . .

Veramente non so quale versione del linguaggio usi Rhino … :thinking:

Ma in fondo non e’ un gran problema.
Le nuove versioni sono compatibili con quelle piu’ vecchie, almeno credo.
Mi sembrerebbe strano il contrario, per un linguaggio come C#.
In caso di problemi basta non usare feature troppo recenti e tutto funziona.
… Cosi’ c’e’ anche meno da imparare …
:wink: :grinning_face_with_smiling_eyes:

image

4 Mi Piace

Si’, va be’ … ma un po’ di contegno. :wink:

Grazie Fabio !

3 Mi Piace

per caso mi sapreste dire se con le librerie/API di C# in Rh sia possibile eseguire queste azioni:

_Dir
_BringForward
_SelID
_CloseViewport
_Save
_Reparameterize
ecc ecc

in pratica tutti quei comandi che in VBS e Py si è obbligati ad usare il metodo Command?

Se stavi provando quanto postato da Luca, credo sia uno dei casi di cui si parlava prima: il C# di Rhino non e’ abbastanza recente per quella sintassi, almeno suppongo.
Infatti cosi’ non funziona su GH

  private void RunScript(object x, object y, ref object A)
  {
    var ok = int.TryParse("456", out int nu );
    A = nu;
  }

Devi dichiarare una variabile per il parametro out prima di chiamare la funzione.

Se vai a vedere la funzione Command di rhinoscriptsyntax, qui:
rhinoscriptsyntax/application.py at rhino-6.x · mcneel/rhinoscriptsyntax · GitHub
Puoi verificare che usa questo metodo:

RhinoApp.RunScript Method (String, Boolean) (rhino3d.com)

Quindi e’ quello che devi usare in RhinoCommon.

( rhinoscriptsyntax usa RhinoCommon, quindi TUTTO quello che fai con rhinoscriptsyntax lo puoi fare con RhinoCommon :slight_smile: )

ma anche tutto quello che si fa con RhinoCommon lo si può fare con rhinoscriptsyntax?

public static bool RunScript(
	string script,
	bool echo
)

alla fine è proprio questo tipo di guida/help che proprio non comprendo
essendo che non hanno esempi pratici di sintassi come gli esempi seguenti:

partial class Examples
{
  public static Rhino.Commands.Result AddCircle(Rhino.RhinoDoc doc)
  {
    Rhino.Geometry.Point3d center = new Rhino.Geometry.Point3d(0, 0, 0);
    const double radius = 10.0;
    Rhino.Geometry.Circle c = new Rhino.Geometry.Circle(center, radius);
    if (doc.Objects.AddCircle(c) != Guid.Empty)
    {
      doc.Views.Redraw();
      return Rhino.Commands.Result.Success;
    }
    return Rhino.Commands.Result.Failure;
  }
}

negli esempi viene visualizzato come scrivere e impostare i vari metodi a differenza di quello precedente

Direi di no.
rhinoscriptsyntax cerca di replicare i metodi RhinoScript disponibili per il VBS.
Si ferma li’.
Non vuole essere un doppione di RhinoCommon, credo che non avrebbe nemmeno senso.

Be’, anche questo e’ importante, direi fondamentale.
Mostra chiaramente come richiamare il metodo: dice quali sono i vari parametri e che tipo di dati hanno.
Se leggi sotto a quanto hai riportato, vedi che parla dei due parametri e anche del valore restituito.

Poi, e’ vero, nella documentazione RhinoCommon per alcuni elementi ci sono degli esempi mentre per altri no.
Credo che, data la vastita’ di RhinoCommon, sarebbe un gran lavoro scrivere e testare degli esempi per ogni singolo metodo, proprieta’, ecc.
Temo che McNeel non sia in grado.

Nel caso particolare:

public static bool RunScript(
	string script,
	bool echo
)

Parameters

script
Type: System.String
[in] script to run.

echo
Type: System.Boolean
Controls how the script is echoed in the command output window. false = silent - nothing is echoed. true = verbatim - the script is echoed literally.

Return Value
Type: Boolean
[Missing <returns> documentation for "M:Rhino.RhinoApp.RunScript(System.String,System.Boolean)"]

Exceptions
Exception	Condition
ApplicationException	If RunScript is being called while inside an event watcher.

Remarks
Rhino acts as if each character in the script string had been typed in the command prompt. When RunScript is called from a "script runner" command, it completely runs the script before returning. When RunScript is called outside of a command, it returns and the script is run. This way menus and buttons can use RunScript to execute complicated functions.

vediamo che il metodo RunScript vuole 2 parametri

il primo e’ il comando da eseguire

il secondo decide se il comando viene copiato nella command area di Rhino o meno

Il valore restituito … be’, dice che e’ un booleano e poi … c’e’ un problema nella generazione della documentazione per cui non ci sono altre spiegazioni.
Anche se in questo caso e’ ragionevole supporre che indichi se il comando e’ stato eseguito con successo o no.

E c’e’ ancora qualche altra informazione aggiuntiva sotto.

Poi a volte qualcosa non si capisce proprio (parlo per me ovviamente) e quindi non resta altro che fare qualche prova … :grinning_face_with_smiling_eyes:

In ogni caso, se qualcosa non e’ chiaro, chiedi qui e ci ragioniamo insieme.

Tornando a quanto dicevi sopra, credo di aver capito male.
Forse tu intendevi senza usare il comando Rhino.

Personalmente non mi ricordo bene i vari comandi, ma a occhio direi che sia SelID che Save si possono eseguire anche da rhinoscriptsyntax.
Certo da RhinoCommon si puo’ riparametrizzare.
Non sono sicuro per CloseViewport … che non credo di aver mai usato tra l’altro … :confused: :grinning_face_with_smiling_eyes:
Dir e BringForward forse no, ma, come dicevo, non mi ricordo granche’ di queste cose.

Su questo spero che ci aiuti qualcuno piu’ ‘fresco’ sui comandi Rhino.:slight_smile:

Comunque, se chiedi riguardo a un comando per volta, proviamo e capirci qualcosa … senza impegno, sorry … :blush:

grazie :+1:

ps dovrei sapere prima di preciso quel metodo cosa fa, e senza esempi credo che mi sia un po difficile.
magari forse la strada e cercare prima in rete qualche esempio in Robert McNeel & Associates · GitHub
chissa essendo che scrivono codici tanti utenti magari leggendo la descrizione di capisce cosa utilizzare.

Parlavo dei comandi Rhino su cui avevi chiesto informazioni.
E credo che il sistema possa funzionare bene per tutti i comandi, o le varie operazioni che facciamo in Rhino.
Se parti dai comandi Rhino, poi te lo diciamo noi quali classi e metodi servono … o almeno ci proviamo. :wink:

1 Mi Piace

Dir invece direi di si’, con un DisplayConduit
BringForward non lo so … :blush:

1 Mi Piace