Modifica Codice Py

import Rhino
import System.Drawing
import scriptcontext as sc

class GetLines(Rhino.Input.Custom.GetPoint):
    def OnDynamicDraw(self, args):
        args.Display.DrawLine(Rhino.Geometry.Point3d(10,0,0), args.CurrentPoint, System.Drawing.Color.Green, 2)

gp = GetLines()
gp.Get()

dovrebbe essere possibile (ma non so come) far funzionare il codice senza la classe usando solo la def?

Premesso che non sono certo un esperto di OOP ā€¦
ā€¦ In questo caso non credo sia possibile.
Derivare una nuova classe da GetPoint e ridefinire il metodo OnDynamicDraw eā€™ proprio
lā€™operazione prevista da RhinoCommon per personalizzare il display quando si seleziona il punto.

Emilio ma nemmeno con un altro metodo?

chiedo anche per altre funzioni usando sempre display si ĆØ obbligati a passare per le classi?

Mi eā€™ capitato di usare i DisplayConduit
DisplayConduit Class (rhino3d.com)
Ma funziona allo stesso modo: derivi una classe e ridefinisci dei metodi.

Il poco che so io finisce qui.

Serve qualcuno piuā€™ esperto.

mi fido della tua analisi, credo che al 99,99% ĆØ come dici tu :+1:

avevo voglia a fare prove, a cambiare qualcosa o a fare ricerche
(facevo la fine del criceto in un labirinto senza uscita ahahahah)

la questione ĆØ che in questo caso ci capisco ancora meno degli altri codici in RCommon
ricordo una piccola infarinatura ma nulla piĆ¹, quegli args adesso mi sfuggono i rifrimenti,
presumo (forse) che indicano il parametro allā€™interno nelle parentesi della classe ma non sono sicuro

come anche args.Display.DrawLine nella guida ho trovato: DisplayPipeline.DrawLine Method
come mai nel codice tra Display e DrawLine manca Pipeline?
la stessa cosa anche con args.CurrentPoint ho trovato GetPointDrawEventArgs.CurrentPoint

(non comprendo come potrei scrivere un codice senza dover cercare la soluzione negli esempi in rete)

I riferimenti li cerchi nella documentazione, come fanno tutti.
Vai alla classe GetPoint e cerchi il metodo OnDynamicDraw
GetPoint.OnDynamicDraw Method (rhino3d.com)
Leggi cosa dice riguardo al parametro:

Parameters

e
Type: Rhino.Input.Custom.GetPointDrawEventArgs
Current argument for the event.

Clicchi sul link e vai a vedere cosā€™eā€™ quel GetPointDrawEventArgs

Trovi questo:
GetPointDrawEventArgs Class (rhino3d.com)
dove ovviamente ci sono gli elenchi con proprietaā€™ e metodi per gli oggetti di quella classe.
Ad esempio ci trovi la proprietaā€™ CurrentPoint che eā€™ utilizzata nellā€™esempio che hai postato.
Se ti interessa quella proprietaā€™, ci clicchi sopra ā€¦ e cosiā€™ via.

Per ora mi limito alla prima domanda, per non fare confusione ā€¦ :slight_smile:

1 Mi Piace

Non cā€™ĆØ molto da dire emilio. ƈ un sistema che consente di aggiungere ad un evento lā€™esecuzione di un codice personalizzato garantendo che il tutto venga eseguito in modo sincrono e sicuro.

1 Mi Piace

@emilio lo so che tempo fa me lo spiegasti giĆ :
la parola chiave self dovrebbe riferirsi alla def,
mentre la parola chiave args a cosa ĆØ riferita?

Ciao Salvio.

Eeeeh ā€¦ non so come rispondere ā€¦

A prima vista sembrerebbe la domanda di qualcuno con le idee parecchio confuse ā€¦ ma ā€¦
ā€¦ Eā€™ difficile capire cosa sai giaā€™ e cosa non sai, per il solito motivo.
Chiami le cose con nomi diversi da quelli che si usano di solito, e che ci permettono di capirci tra di noi quando parliamo di queste cose.
Per cui non so se tu alcune cose le conosci, ma le chiami con nomi diversi, oppure non le conosci ancora.
In ogni caso per cercare di rispondere alla tua domanda dovroā€™ a mia volta usare altri termini, per i quali vale lo stesso discorso ā€¦
Sai a cosa mi riferisco, oppure per un certo termine eā€™ necessaria una spiegazione ? :confused:

Comunque, provo a rispondere, per quello che so certo, e anche a verificare se i termini che uso ti sono chiari o meno.
( Ovviamente uso i termini che conosco io, e che credo di aver imparato da libri, riviste e poi Web, newsgroup ecc. ā€¦ Qualcosa a scuola ā€¦ Non ne conosco altri ā€¦ :blush:)

Prima cosa: self e args non sono parole chiave.
( Vedi che giaā€™ dallā€™inizio fatichiamo a capirci ā€¦ :smile:)
Sono i nomi dei due parametri del metodo OnDynamicDraw, che suppongo appartenga alla classe GetPoint.
GetPoint.OnDynamicDraw Method (rhino3d.com)

Come vedi nelle documentazione linkata qui sopra, viene mostrato un solo parametro, che viene chiamato e

GetPointDrawEventArgs e

Questo dipende dal fatto che, dato che parliamo di un metodo, nel C# il primo parametro eā€™ implicito, cioeā€™ non si scrive quando definisci il metodo, e corrisponde a this, che in C# eā€™ una parola chiave, e si riferisce allā€™oggetto della classe GetPoint che associamo al metodo quando richiamiamo il metodo stesso, in pratica il valore che scrivi prima del nome del metodo, seguito dal punto, quando chiami il metodo.

In Python, diversamente da C#, questo parametro eā€™ esplicito, cioeā€™ viene effettivamente scritto insieme agli altri parametri quando definiamo il metodo, e convenzionalmente viene chiamato self.

Ricapitolando, nella definizione del metodo (OnDynamicDraw), quando vediamo scritto self, eā€™ un parametro che rappresenta lā€™oggetto collegato a quella chiamata di metodo.
Anche se nel metodo che tu riporti, il parametro self non eā€™ utilizzato.

Per args, per fortuna, la cosa eā€™ molto piuā€™ semplice.
Eā€™ un semplicissimo parametro di una funzione/metodo.
E dalla documentazione vediamo che ha tipo GetPointDrawEventArgs

Cliccando sul nome del tipo, possiamo saltare alla sua documentazione:
GetPointDrawEventArgs Class (rhino3d.com)
Dove, tra le altre cose, possiamo trovare la proprietaā€™ Display, che vediamo usata nel metodo che hai riportato.
DrawEventArgs.Display Property (rhino3d.com)

Come anticipato, per cercare di rispondere alla domanda ho utilizzato diversi termini ā€˜tecniciā€™, diciamo cosiā€™ :wink: , che non so se siano chiari o meno, per cui provo a elencarli, senza nessun ordine particolare.
Alcuni sono specifici della OOP, altri no.
Nel caso ci sia qualcosa su cui hai dei dubbi, se vuoi, dillo e vediamo di fare un ripasso ā€¦ :wink:

tipo di dati
classe
funzione / routine
oggetto
metodo
ā€¦ e se vogliamo esagerare ā€¦
metodo di istanza e metodo di classe, detto anche metodo statico ā€¦ :smile:
parametro di funzione
proprietaā€™
parola chiave

Se cā€™eā€™ qualcosā€™altro di poco chiaro, dillo. :slight_smile:

si, mi manca solo il resto di tutta la spiegazione di RCommon :sweat_smile: :sweat_smile:

eeee hai ragione, in VisualStudio con il C# alcune cose le ho capite piĆ¹ facilmente essendo che editor evidenzia meglio tutte le parole chiavi ecc poi sottolinea gli errori dandoti anche la soluzione, quindi paradossalmente mi sto trovando piĆ¹ agevolato a scrivre C# con VS che con lā€™editor di Python.
(vabbĆØ comunque nonā€™Ć© una giustificazione anche perchĆ© senza VS nemmeno quel poco di C# potrei fare)

Bene !
Entro questā€™anno probabilmente usciraā€™ Rhino 8, con i suoi script in C#.
ā€¦ Ma non ho idea se e quanto saraā€™ semplice usare VS per scriverli, neā€™ ovviamente se avrai occasione di aggiornare Rhino ā€¦
Comunque eā€™ sempre una possibilitaā€™ in piuā€™. :slight_smile:

eeee magari sarebbe una bella notizia, da quello che avevo letto ormai sembra quasi una chimera. . .

comunque per il fatto di trovarmi meglio col C# (usando VS) era per dire che ho problemi col RCommon

appunto, in pratica RCommon che ĆØ scritto in C# lo si puĆ² importare in Python ma con le regole di C#
vedi sono tutte queste cose che messe insieme rendono contorto tutto (ovviamente cosƬ ĆØ, ce lo teniamo)

infatti credevo che self e args fossero parole come this invece sono semplici parametri
(che perĆ² mi sfugge come utilizzarli) in C# this viene preceduto per indicare una variabile
della classe, seguendo un paio di tutorial, questo concetto mi ĆØ ben chiaro nella mente.
mentre per self e args anche vedendo dei tutorial su Py non riesco ad associarli al loro scopo
(la cosa bella e che lo stesso youtuber spiega C# e Py, per C# lā€™ho compreso, in Py sono piĆ¹ sconfuso)

mmmm e allora sono veramente molto confuso, essendo che da quello che ricordavo dal libro su Py consigliatomi, mi sembrava che self venisse usato nelle def senza dover usare le classi
(debbo trovare qualche esempio al riguardo che vada bene per me)

questo ĆØ proprio una cosa che mi sfugge:

args dovrebbe riferirsi a Rhino.Input.Custom.GetPoint?
ma cercando Display.DrawLine non lo trovo ma se filtro la guida trovo: DisplayPipeline.DrawLine

Percheā€™ ?
McNeel rilascia una nuova release ogni tre anni circaā€¦
Rhino 7 eā€™ uscito a novembre 2020.
E sul forum USA hanno previsto lā€™uscita di Rhino 8 intorno allā€™autunno di questā€™anno.
Dove vedi chimere ?

Cosa intendi ?
Di quali regole parli ?
Python non puoā€™ usare la sintassi di C#, deve per forza usare la sua.
A cosa ti riferisci esattamente ?

Come credevo di aver spiegato qui:

this in C# corrisponde a self in Python.
( E comunque sono entrambi dei parametri )
Eā€™ semplicemente lā€™oggetto usato per richiamare quel metodo.

E cosa dovrebbe indicare self, se non lo usi per un metodo ?
Poi, scusa, lā€™esempio lo hai postato tu:

Dichiari una classe e dentro la classe definisci un metodo,
che come primo parametro ha self

Anche questo credevo di averlo detto:

Cosa intendi con ā€œriferirsi a Rhino.Input.Custom.GetPointā€ ?
Riferirsi in che senso ?

self, come abbiamo detto (N volte) eā€™ lā€™oggetto della classe GetLines che usi per richiamare il metodo.
( E, per le regole OOP, non possiamo farne a meno )
Lo scopo di args eā€™ mostarto sempre nellā€™esempio che riporti:

In questo caso lo usi per richiamare DrawLine

In generale, hai capito cosa fa lā€™esempio che hai postato ?
ā€¦ A cosa serve OnDynamicDraw() ?
Hai provato lo script per vedere in pratica cosa succede ?

Inoltre, se non sbaglio non hai problemi a utilizzare le funzioni di rhinoscriptsyntax.
Cosa cambia con RhinoCommon ?
Cosā€™eā€™ che ti confonde ?
Per entrambi i casi si tratta di richiamare delle funzioni, passandogli i parametri richiesti.
Eā€™ la stessa cosa.

Se ben ricordo, avevamo fatto anche dei semplici esercizi con RhinoCommon, forse con punti e linee.
E con quello non avevi nessun tipo di problema, andavi spedito.
Percheā€™ i metodi di Rhino.Geometry.Point3d li capisci al volo, mentre con quelli di Rhino.Input.Custom.GetPoint ti blocchi ?
Che differenza ci vedi ?
Sono semplicemente due classi di RhinoCommon, cosa cambia ?

ā€¦ Comunque ormai sono convinto di non essere in grado di spiegarti queste cose.
Secondo me ci vorrebbe qualcuno che veda, e spieghi, le cose in maniera diversa.
Mi sa che io e te non riusciamo a capirci su RhinoCommon ā€¦
:grinning:

mi spiace, ho fatto perdere la pazienza anche a te. . . :pray:

cerco io di spiegarmi in altro modo, forse agevolo la cosa. ad es:
mi sono fatto un piccola panoramica di alcune spiegazioni che mi avete dato in passato su tale argomento

class Classe1:
    def metodo1(self):
        return 2*2
    
    def metodo2(self):
        return 3*3

print Classe1().metodo1()
print Classe1().metodo2()

class Classe2:
    a = "Stampa Classe2"

print Classe2().a

questi semplici esempi li ho scritti adesso, cosi come mi sono venuti in mente senza cercare nulla
quindi si puĆ² dire che il mio livello in Py per gli OOP ĆØ questo che si vede dal codice postato sopra.

ora tanto per far comprendere quale sia il problema con RCommon e che il codice postato ad inizio
3d non sarei riuscito a scriverlo nel modo corretto quindi significa che mi mancano dei riferimenti

uno dei problemi che riscontro sta nel fatto che mi manca il riferimento della sintassi
quando scrivo in rhinoscriptsyntax associandolo ad un as come di consueto rs
andando a scrivere rs. dopo il punto mi compare il menĆ¹ a tendina di quello che posso fare

mentre in questo caso con gli OOP questo non accade quindi non ho il riscontro per cui riesco a trovare il riferimento di cosa fa cosa, a cosa serve e come lo fa. ricordando delle volte che mi ĆØ stato detto che non scrivo nel modo consueto la sintassi dei codici, essendo che vado a disassemblare il codice di un esempio riducendolo al minimo, togliendo tutte le verifiche, controlli ecc so che nonā€™Ć© il modo corretto ma questo mi serviva proprio a questo per capire ogni pezzo del codice che scopo avesse, il suo utilizzo e come disporlo nella sintassi, se poteva andare da solo oppure doveva essere abbinato ad altro codice, quindi facevo 1000 prove per prendermi i riferimenti dopo aver visto il suo funzionamento nella pratica.

tipo; nel codice appena postato sopra, se scrivo: print Classe1(). dopo il punto non mi compare nulla
in questo caso esempio da me postato ĆØ semplicissimo e quindi so a priori come deve essere scritto e fin qui non ci sono problemi, ma nel caso di un codice in rete per RCommon (dove giĆ  ĆØ contorto di per se) oltre al fatto di essere abbastanza complessi, in questo caso mi perdo non avendo nessun riferimento con cui posso trarre conclusioni. ad es; se scrivo: args.Display.DrawLine dopo args. non mi compare nessun menĆ¹, quindi non ho nessun riscontro dove verificare se ciĆ² che scrivo sia nel modo corretto, come altra cosa che proprio non capisco Display.DrawLine dove lo trovo nella guida? ho cercato piĆ¹ volte, ma come giĆ  detto trovo solo DisplayPipeline.DrawLine
(come faccio a sapere cosa posso fare con Display.DrawLine se non trovo quali metodi/proprietĆ  ha?)

No, no, non cā€™entra la pazienza.
Eā€™ la difficoltaā€™ a capirsi, e non cā€™eā€™ niente di strano.
Non sono neā€™ un programmatore neā€™ un docente.
Sono uno tra tanti che si diverte con gli script ā€¦eā€™ logico che non sia in grado di spiegare le cose come farebbe un professionista.
Giaā€™ ho il mio bel da fare a cercare di capirci qualcosa io ā€¦ :blush: :smile:

Giusto

ā€¦ Sbagliato. :wink: :smile:

immagine

Scrivendo rs scrivi il nome del modulo/namespace e quindi lā€™editor sa a cosa ti riferisci e ti mostra lā€™elenco delle funzioni.

Stessa cosa se scrivi Rhino.Geometry.Point3d.
Eā€™ il nome della classe quindi lā€™editor ti mostra i vari metodi ecc.

Stessa cosa ancora se inizi a scrivere un costruttore:

immagine

Lā€™editor ti mostra i parametri richiesti.

Ma se invece del nome di un modulo o di una classe, tu scrivi il nome di una variabile,
Non succede niente.

immagine

Lā€™editor non eā€™ cosiā€™ intelligente da sapere il tipo del valore salvato nella variabile ā€¦
Non pretendiamo troppo ! :wink: :smile:

Ma tu lo sai cosa cā€™eā€™ nella variabile, e allora, se vuoi vedere lā€™elenco di metodi e soci,
ti sposti un una nuova linea e scrivi (temporaneamente) il nome della classe, cosiā€™ vedi il tuo bellā€™elenco.
Dopo ovviamente cancelli quel nome, che non cā€™entra niente col tuo script, e vai avanti.

immagine

Eā€™ una cosa che mi eā€™ capitato di fare diverse volte ā€¦

Certo, lā€™editor non ha in memoria lā€™elenco dei metodi di Classe1, non fa parte delle librerie standard di Rhino.
Di nuovo, non eā€™ in grado di fare quello che chiedi.
Quando scrivi una classe, sei tu che devi sapere come utilizzarla.

Come ho detto prima, basta che tu scriva (temporaneamente) il nome della classe e vedrai che lā€™editor ti mostra lā€™elenco che cerchi. :slight_smile:

Scusa, avevo scritto:

Cosa cā€™eā€™ di poco (o niente :smile:) chiaro in quanto avevo scritto ?

Avevo inserito il link diretto, nessun bisogno di cercare e trovare niente ā€¦
Comincio a pensare che parliamo lingue diverse ā€¦ appunto ā€¦ :smile:
:wink: :smile:

E comunque come regola generale, ripeto ā€¦
Tu hai una variabile per cui cerchi metodi e proprietaā€™
OK, questa variabile avraā€™ un tipo/classe.
( Nel caso sopra la classe eā€™ Rhino.Input.Custom.GetPointDrawEventArgs )
Vai nella documentazione e vai a vedere quella classe e ci trovi gli elenchi che cerchi.
Anche qui, cosa cā€™eā€™ che non va bene in questa procedura ? :slight_smile:

analizziamo una cosa per volta:

immagine immagine

come precisato precedentemente, ho riscontrato una maggiore facilitƠ usando VS proprio perchƩ anche nel codice semplice che ho postato, scrivendo la Classe mi ritorna i metodi oppure le proprietƠ da me scritte.

mentre usando il codice ad inizio 3d usando Python in Rhino questo non accade:

immagine

quindi in pratica a questo punto non posso aver nessun riscontro usando editor Py in Rh come facevo con rhinoscriptsyntax mentre scrivevo il codice. a questo punto dovrei sapere giĆ  tutta la sintassi e quali metodi e come usarli per poter scrivere un codice.
(oppure come fanno in tanti, copiarli da qualche parte in rete, senza sapere nulla a riguardo)

Emilio se posso chiederti (se hai voglia) di commentare lā€™analisi della sintassi dello script a inizio 3d?
ti dico la mia interpretazione, poi nel caso mi correggi sui punti sui quali ho i dubbi:

class GetLines(Rhino.Input.Custom.GetPoint):

GetLines ĆØ il nome della classe mentre Rhino.Input.Custom.GetPoint ĆØ un suo parametro giusto?

def OnDynamicDraw(self, args):

mentre qui abbiamo OnDynamicDraw come nome della def
il parametro self che corrisponde alla classe stessa quindi a GetLines
mentre args corrisponde al parametro della classe quindi (Rhino.Input.Custom.GetPoint)

ora non so se quanto detto sopra sia corretto, essendo che quando vedo scritto:

args.Display.DrawLine
args.CurrentPoint

per me ĆØ come se vedessi scritto questo:

Rhino.Input.Custom.GetPoint.Display.DrawLine
Rhino.Input.Custom.GetPoint.CurrentPoint

dimmi pure. . .

Ho spiegato nel messaggio precedente come fare, con tanto di immagini.

Certo, se confronti lā€™editor di RunPythonScript con VS, Rhino usciraā€™ sempre battuto.
Uno fa parte di un singolo comando tra i tanti di Rhino (software sviluppato da McNeel con qualche decina di programmatori. )
Lā€™altro eā€™ un prodotto, indipendente, di Microsoft ā€¦ non so se mi spiego.
:wink:

Contento te ā€¦
:wink: :smile:

No, almeno di solito non si usano queste parole ā€¦
GetLines eā€™ una nuova classe, derivata dalla classe GetPoint.
Qui GetPoint eā€™ la cosiddetta classe base.
Sempre questione di OOP, la famosa ereditarietaā€™ per cui una classe derivata eredita dalla classe base tutti i suoi metodi, proprietaā€™ ecc.

Detta anche metodoā€¦ OK, nota che qui stai ridefinendo il metodo OnDynamicDraw ereditato dalla classe madre GetPoint,
quindi, dopo questa definizione, la classe GetLines avraā€™ un metodo OnDynamicDraw diverso da quello di GetPoint.
Questo eā€™ il meccanismo che ti permette di personalizzare la grafica durante lā€™input del punto.
Quando il tuo script esegue lā€™input usando un oggetto della classe GetLines, Rhino a un certo punto richiama il metodo OnDynamicDraw e quindi tu vedrai a schermo cioā€™ che hai programmato in quel metodo.
( Meccanismo di solito chiamato ā€˜callbackā€™ )

Per la precisione, corrisponde a un oggetto appartenente alla classe GetLines.
Quello che tu ottieni scrivendo ad esempio

gp = new Rhino.Input.Custom.GetLines();

Quello che qui eā€™ salvato nella variabile gp.
Ma dato che questo metodo non lo richiami tu, ma lo richiama Rhino, non preoccuparti troppo di quellā€™oggetto.

No, non so dove tu abbia preso questa idea, ma non corrisponde a come funziona C#.

Come ho giaā€™ detto tre volte, da qui ā€¦
GetPoint.OnDynamicDraw Method (rhino3d.com)
ā€¦ vediamo che il parametro args, che qui eā€™ chiamato e, appartiene alla classe
Rhino.Input.Custom.GetPointDrawEventArgs
Eā€™ scritto chiaro nella documentazione, non cā€™eā€™ bisogno di inventarsi cose diverse ā€¦ :wink:

Tra lā€™altro, le classi non hanno parametri.
I metodi hanno dei parametri. e i tipi di dati generici hanno dei parametri, ma eā€™ un altro discorso.
Le classi non hanno nessun parametro.

No, quelle proprietaā€™ appartengono alla classe Rhino.Input.Custom.GetPointDrawEventArgs
GetPointDrawEventArgs Class (rhino3d.com)

OK Emilio credo che qualcosina sul funzionamento adesso (forse) lā€™ho capita :pray:

:+1:

ps per quel poco che sono riuscito a cogliere, posso dire che ĆØ ancora piĆ¹ contorta di quanto pensassi. . .

pps cerco di organizzare meglio le idee cosi espono le nuone congetture, sperando in qualche miglioria. . .

1 Mi Piace

Eh ā€¦ se parli di classi derivate e metodi ridefiniti ā€¦ non posso darti torto.
Sono le complicazioni della OOP, che purtroppo eā€™ stata adottata su larga scala dalla maggior parte dei linguaggi, ormai da lungo tempo.
Comunque sono cose che non capita spesso di dover fare con RhinoCommon.
Diciamo che hai preso in esame un esempio tra i piuā€™ tosti ā€¦ :wink:
Anzi direi che sono cose che spesso non si affrontano subito quando inizi ad usare RhinoCommon,
prima si fa esperienza con cose piuā€™ semplici.
In generale di solito basta utilizzare direttamente i vari metodi ecc. delle classi, cosiā€™ come utilizzi le funzioni di rhinoscriptsyntax. :slight_smile: