Rhino8 adattare codice C#

ciao ragazzi,
in Rhino8 sto cercando di far eseguire codici creati per il C#

ho dovuto aggiungere 4 using per dei riferimenti che non trovava corrispondenza
ma in fine alla riga 12 mi sottolinea comunque un errore che riporto di seguito:

There is no argument given that corresponds to the required formal parameter ‘doc’ of ‘Class.DivideCurveBySegments(RhinoDoc)’

traducendolo sembra che vuole un argomento che corrisponda al parametro, come posso risolvere?

Ciao Salvio

Premesso che non uso piu’ Rhino e non conosco Rhino 8 …
Ti chiederei:

  1. Da dove proviene lo script ?
  2. Come lo esegui su Rhino 8 ?

… Tanto per provare a inquadrare la situazione … :slight_smile:

ciao Emilio

il codice è uno degli esempi della McNeel nella sezione curve:

in Rhino8 non sono ancora riuscito,
cercavo appunto come farlo eseguire

ma in Rhino7 se ricordo (bene spero) di aver fatto
eseguire uno di quei codici di esempi utilizzando
Visual Studio creandone e dinstallando un plug-in

ps adesso invece con Rhino8 gli script si eseguono in maniera diversa da Visual Studio come anche Gh.

Credo che sia un esempio generico (oppure specifico per i plug-in), che non specifica come ottenere l’oggetto RhinoDoc.

Nei vecchi script in IronPython, come sai, si usava scriptcontext.doc, ma quelli erano basati sul comando RunPythonScript.

Qui, a quanto ne so, il comando e’ diverso.
Credo sia ScriptEditor, ma purtroppo non riesco a trovare informazioni sufficienti a riguardo.

Hai provato a lanciare ScriptEditor e a vedere cosa succede ?
O a cercare lo help per quel comando su Rhino 8 ?

dopo verifico, ma ricordo che per Py, RunPythonScript era il comando da inserire nel pulsante
per avviare il file .py appunto ma editor non dava nessun errore.

si ScriptEditor apre porprio il nuovo editor dove è possibbile scegliere quale linguaggio eseguire C#-Py2/3
ed infine gli esempi sono questi:

https://developer.rhino3d.com/api/RhinoScriptSyntax/

Quello e’ rhinoscriptsyntax per Python.
Li’ non c’e’ niente per C#. :confused:

si gli esempi che vanno bene per Py eseguendoli con il comando citato: RunPythonScript
mentre a come sembra per i codici di C# in Rhino8 non viene proposto nulla
a differenza del C# per VS che nell’altro link invece ci sono vari esempi

nel forum int avevo chiesto se ci fossero argomenti a tale riguardo ma nessuna risposta
speravo in qualche spiegazione su come adattare i codici o per lo meno su come farli eseguire
(non saprei, ma credo che a questo punto dovrebbero fare una sezione a parte come discussione)

Sto provando a cercare … ma finora niente, anche perche’ litigo un po’ con la ricerca su Discourse … :smile:

Per curiosita’, se selezioni C#, ti manda su una pagina vuota o c’e’ gia’ scritto qualcosa ?
Perche’ da qualche parte si deve prendere 'sto documento Rhino.

A meno di usare il vecchio RhinoDoc.ActiveDoc

… Pero’, a quanto ne so, McNeel sconsiglia di utilizzare questa proprieta’ … :confused:

Ma volendo si puo’ fare un tentativo, poi se in seguito si trovano maggiori informazioni si puo’ sempre editare lo script … :wink:

eeee bella notizia. . .

immagine immagine

immagine

i primi 3 sono gli esempi che mette a disposizione, ultimo sarebbe un file vuoto e riporta quel testo in verde.

Bene !

Se nell’esempio usa RhinoDoc.ActiveDoc, vuol dire che va bene quello.
:grinning:

quindi debbo cambiare:

public static Result DivideCurveBySegments(RhinoDoc doc)
con
public static Result DivideCurveBySegments(RhinoDoc.ActiveDoc doc)

?


appena provato, sembra proprio di no.

Che stai facendo, Salvio ? :wink:

Usa quel valore quando richiami la funzione.

Non andare a cambiare il tipo del parametro nella definizione del metodo.
Che poi RhinoDoc.ActiveDoc non e’ un tipo, e’ un valore.
Non ha senso scriverlo li’.

un esempio, tipo?

Scusa, ma io preferisco fare tutto il ragionamento piuttosto che dirti subito cosa fare, con il sospetto che poi non capisci cosa stiamo facendo …
Dopo vediamo anche un esempio diverso.

Partiamo dal messaggio di errore (come si fa di solito :wink: )

Dice che hai richiamato il metodo DivideCurveBySegments senza passargli il parametro doc.
E in effetti e’ quello che si vede nello script.

Tu scrivi:

main.DivideCurveBySegments();

Cioe’ richiami il metodo

public static Result DivideCurveBySegments(RhinoDoc doc)

… Che, come vedi, richiede un parametro (che chiama doc), di tipo RhinoDoc.
Quindi, se tu richiami il metodo senza passargli il parametro, viene fuori un errore, e’ inevitabile.

Per cui, per richiamare quel metodo, dovrai utilizzare anche un valore di tipo RhinoDoc,
che in questo caso abbiamo visto che possiamo ricavare dalla proprieta’ RhinoDoc.ActiveDoc.

Per cui … quando richiami il metodo DivideCurveBySegments, scrivi tra le parentesi il parametro di tipo RhinoDoc, cioe’ RhinoDoc.ActiveDoc.

Oppure ovviamente salvi il valore di tipo RhinoDoc in una variabile e scrivi quella richiamando il metodo.

Esempio con una funzione forse piu’ semplice (sperando di non sbagliare la sintassi :blush:)

Se abbiamo una funzione

class Potenze
{
  public static double Quadrato( double num )
  {
    return num * num;
  }
}

Per richiamarla potremmo scrivere ad esempio

var test = new Potenze();
var risultato = test.Quadrato( 2.5 );

Cioe’ scrivi tra le parentesi un vaore di tipo double, come richiesto dal metodo.

( E non vai a modificare il metodo scrivendo ad esempio

  public static Quadrato( 2.5 num )

Perche’ non ha senso sostituite il tipo di dati del parametro con un valore. )

Ho l’impressione che tu non sia ancora abituato al fatto che in C#, contrariamente a Python, i tipi di dati vanno scritti, e rispettati quando richiami ad esempio il metodo.
E non vanno assolutamente confusi con i dati, o valori che dir si voglia.

Se definendo un metodo, dichiari un parametro

double num

double e’ il tipo di dato e num e’ il nome del parametro.
E quando richiami quel metodo, al posto di

double num

scriverai semplicemente un valore di tipo double, come 2.5 o 123.456 o anche una variabile o una espressione, che pero’ sia del giusto tipo.

Quindi quando in uno script vedi un metodo con un parametro di tipo RhinoDoc, richiamando il metodo dovrai passare al metodo un valore di tipo RhinoDoc.
Stesso discorso ovviamente per ogni altro tipo di dati, con possibili ‘complicazioni’ in caso di classi derivate …

1 Mi Piace

… Ma credo che sia sbagliata, in effetti.
Vedo che anche lo script che riporti fa la stessa cosa, ma non mi sembra che sia la cosa migliore usare un oggetto per richiamare un metodo static

Credo che si dovrebbe scrivere

Program.Class.DivideCurveBySegments( RhinoDoc.Active.Doc );

senza creare un oggetto …

(cosa che ho fatto anch’io nel mio semplice esempio)

Va beh, se funziona, fa lo stesso … non mi ricordo le regole del C# a proposito … :blush: :smile:

condivido :+1:

in effetti, ricapitolando tutto quello che hai spiegato, non fa una piega.
(sto riprendendo adesso dopo un lungo periodo di fermo, e prima diciamo che avevo appena iniziato)

provato quanto consigliato, adesso errore passa alla variabile “main”:

immagine

Member ‘Class.DivideCurveBySegments(RhinoDoc)’ cannot be accessed with an instance reference; qualify it with a type name instead

ho provato anche in questo modo:

Program.Class.DivideCurveBySegments( RhinoDoc.Active.Doc );

mi sottolinea come errore il metodo “DivideCurveBySegments” risultato:

The type name ‘DivideCurveBySegments’ does not exist in the type ‘Class’

oppure anche con Class():

Program.Class().DivideCurveBySegments( RhinoDoc.Active.Doc );

mi sottolinea come errore la parola “new” e ritorna il messaggio precedente

Member ‘Class.DivideCurveBySegments(RhinoDoc)’ cannot be accessed with an instance reference; qualify it with a type name instead

Si’, e’ quello che dicevo appena sopra.
Non va bene richiamare un metodo statico con un oggetto.

Pero’

Rhinodoc.Active.Doc

con il punto tra Active e Doc e’ un mio errore, non ci va nessun punto, bisogna scrivere

Program.Class.DivideCurveBySegments( RhinoDoc.ActiveDoc );

:+1:

se questi codici del link esempi, sono prettamente per C# in Visual Studio
credo che ci vorrebbe un link di codici per il C# in Rhino8
come il link postato con i codici Python

(in pratica per ogni editor di Rhino, funziona in un modo differente, sia dall’originale che tra loro)

Emilio grazie come sempre per l’interesse e le correzioni :+1:

1 Mi Piace

Comunque ne siamo venuti a capo.
:grinning: :+1:

non va bene static con oggetti, in VS viene usato override

se parli nello scovare il problema ok
per come risolverlo sono contento per te,
ma io invece, non ne ho proprio idea ahahahah

ho provato a cambiare static con override ma poi mi torna questo errore:

Class.DivideCurveBySegments(RhinoDoc, RunMode)': no suitable method found to override

ma credo che VS usa questa metodologia di intreccio essendo un codice più contorto e complesso.