C# for Rhino

Interessante ! Grazie per l’info. :slight_smile:

1 Mi Piace

ovviamente non posso contribuire personalmente alla spiegazioni su questi argomenti
però essendo che quello che mi piace di questo tutorial che sto seguendo
è proprio il fatto che vengono aperte parentesi con questi argomenti:

primi 4 minuti

dal secondo minuto in poi

ps in quest’ultimo video vengono trattati Value/Reference di cui accennaste tempo fa. . .
e al min 9.00 una piccola introduzione anche al Garbage :+1:

1 Mi Piace

Quindi?

Giusto.
Secondo me e’ importante sapere queste cose.
Ti consente di comprendere meglio cosa stai scrivendo. :slight_smile:

1 Mi Piace

esatto proprio quello che volevo sottintendere :+1:

:exploding_head: :exploding_head: :exploding_head:

intervallo tra i min 6 e 8 mi hanno fatto ricordare questa discussione:

Si’, e’ una questione che puo’ confondere.
In Python e’ lo stesso, solo che mancano le struct.

Comunque per le geometrie di Rhino non bisogna preoccuparsi.
Ogni volta che inserisci una geometria del database di Rhino e ogni volta che ne estrai una, RhinoCommon fa una copia di sua iniziativa, quindi uno script non puo’ avere accesso diretto alle geometrie degli oggetti che vedi sullo schermo. :grinning:

1 Mi Piace

Ciao Emilio!

Concedere ad uno script o ad un plugin di sguazzare all’interno del database di rhino sarebbe
un suicidio. Sia per gli script quanto per i plugin, gli elementi geometrici vengono esposti in sola
lettura. Per modificare un oggetto esistente si esegue una copia e al termine si “registra” nel
database di rhino il nuovo/i oggetto/i oppure l’oggetto modificato. Questo meccanismo non viene
percepito nello script in quanto gestito dai metodi esposti.
Questo metodo apparentemente contorto è alla base di ogni software che gestisce istruzioni
Undo / Redo, le relazioni tra oggetti (Storia) o la programmazione degli eventi.

https://developer.rhino3d.com/api/RhinoCommon/html/Events_T_Rhino_RhinoDoc.htm

Di seguito il link ad un esempio in github che dimostra come interagire con rhino in runtime
ovvero durante il normale utilizzo di rhino monitorando la quasi totalità delle azioni.

Questo consente ad una applicazione (non più script!) di monitorare in trasparenza le operazioni
eseguite dall’utente eseguendo le opportune azioni (anche annullandole!).

2 Mi Piace

Ciao Sergio !

Molto interessante, grazie per il link. :slight_smile:

infatti avevo ripescato il video in questione proprio perché mi serviva approfondire l’argomento

a = [1,2,3]
b = a[:]
b[1] = 10
print a
[1, 2, 3]
print b
[1, 10, 3]

in Py invece per copiare i valori bisogna usare la sintassi b=a[:] essendo che con b=a copia il riferimento

    class Program
    {
        static void Main(string[] args)
        {
            Persona persona1 = new Persona();
            persona1.cognome = "Rossi";
            persona1.nome = "Marco";
            persona1.eta = 25;
        }
    }

    class Persona
    {
        public string cognome;
        public string nome;
        public int eta;
    }

una delle mie domande “strane”:
ma le 3 righe nella classe Persona, sono obbligato ad inserirle per forza in quella “classe”?
non c’é modo di inserirle nella classe Program oppure direttamente nel void?

… Per le liste.
Per altri tipi di oggetti ci sono altri modi.

Quelli sono i dati personali di ogni oggetto di quella classe, diversi per ogni oggetto.
Si scrivono dentro la classe proprio per indicare che gli oggetti di quella classe avranno ognuno un valore cognome, un valore nome e un valore eta.

Se li scrivi fuori dalla classe, come facciamo a capire che appartengono a quella classe ?

C’e’ un motivo per cui vorresti scriverli altrove ?

2 Mi Piace

e che in uno dei videi visti, (se non ricordare male) alcune cose del codice venivano scritte nelle classi esterne, altre invece anche all’interno della classe del void main, quindi avevo provato ma con errore.

forse si trattava di qualcos’altro, magari qualche settaggio. (era per capire quanti modi ci fossero per ciò)

Non mi ricordavo … ho guardato la documentazione.
Quei 3 valori sono chiamati campi o fields in inglese.
E come abbiamo detto sono come delle variabili private di ogni oggetto di quella classe.

Suppongo che il corso che segui ne parli, e suppongo che li chiami campi:confused: :wink:

EDIT:

Altra cosa:

E’ meglio dire “nel Main”
void indica solo che quel metodo non restituisce nessun valore.

1 Mi Piace

infatti la seconda volta sono stato più preciso:

:wink:

si avevo seguito anche quella parte dove parla dei fields (campi)
ma come mai le chiami variabili private. . . mettendo public possono essere richiamate da tutte le classi?

Volevo dire che sono valori che appartengono a quell’oggetto.
Sono relativi all’oggetto, non sono variabili ‘normali’ come quelle che ad esempio dichiari in un metodo.

Per quanto riguarda public hai ragione, significa che sono utilizzabili direttamente anche da metodi di altre classi.

A proposito di campi private, public ecc. … Se ci fai caso, nella documentazione di RhinoCommon, nelle classi non compare nessun campo.
Suppongo significhi che quei campi non sono public .
In ogni caso ai fini pratici non lo sono. :slight_smile:

che sono personali (interni) ok

:thinking: :thinking:

In ogni caso ai fini pratici non lo sono. però intendi che sembrano esserlo?

Non so se i campi nelle classi di RhinoCommon sono public o meno, e in fondo non mi interessa nemmeno. :slight_smile:

Per quanto ne so, RhinoCommon si basa sulle librerie C++ di McNeel, come OpneNurbs, quindi certe classi C# potrebbero anche richiamare direttamente metodi e proprieta’ delle librerie C++, senza avere campi proprii … non ho proprio idea, sono solo ipotesi da ignorante in materia. :confused:

La documentazione di RhinoCommon che utilizziamo e’ generata automaticamente dal codice C#, quindi se non ci mostra nessun campo, forse e’ perche’ i campi non sono public, o forse perche’ e’ stata settata per non mostrare i campi … di nuovo non ne ho la minima idea. :confused:

In ogni caso quello che interessa a noi che utilizziamo RhinoCommon e’ che non abbiamo dei campi a disposizione. Dobbiamo usare metodi e proprieta’ … bene, una cosa in meno da verificare …
:grinning: :wink: :smile:

1 Mi Piace

public class TimePeriod
{
private double _seconds;

public double Hours
{
    get { return _seconds / 3600; }
    set
    {
        if (value < 0 || value > 24)
            throw new ArgumentOutOfRangeException(nameof(value),
                  "The valid range is between 0 and 24.");

        _seconds = value * 3600;
    }
}

}

Ti porto un esempio per capire il perché i campi è bene che restino privati:

In questo modo si evita di scoprire un nervo.
Lasciando privato il campo ti puoi permettere di prendere un dato sporco che arriva dall esterno ed effettuare una serie di operazioni per ripulirlo, controllarlo, modificarlo e poi salvarlo nel campo sicuro che contenga il dato corretto e voluto. Nel caso sopra, dall’esterno mi si passa un tempo in ore tramite una proprietà, ma a me serve in secondi e in quel modo non mi serve a nulla. Allora prima di salvarlo lo converto assicurandomi che il valore sia entro il range 0-24.

1 Mi Piace