From Py To Common

usiamo per adesso quello semplificato come ha consigliato Riccardo

(quando puoi se mi spieghi la differenza così almeno so in quale caso conviene usare l’una o l’altra)

io ho iniziato a scrivere questo:

import Rhino as rh

rh.Geometry.Point3d()
rh.Input.RhinoGet.GetPoint

ho preso i due strumenti che credo servano, era giusto per dare il mio contributo :wink:

Quello semplificato e’ simile a rs.GetPoint(), e’ un singolo metodo:

RhinoGet.GetPoint Method (rhino3d.com)

Puoi usare i parametri del metodo, ma finisce li’.

Quella flessibile e’ una intera classe che permette di fare molte piu’ cose.

GetPoint Class (rhino3d.com)

E funziona come la classe GetNumber che hai gia’ visto.

Se ti basta quello che fa la versione semplice, usa quello.
Se invece hai bisogno di fare cose che la versione semplice non consente, usa quella flessibile.

prof qualche indicazione per iniziare?

io avevo pensato a delle def collegate come aveva fatto Sergio prima
una che indichi il punto fisso, una che richiama il punto da inserire
ed infine l’ultima che gestisce le prime due e che dia il risultato finale

Niente in contrario. :slight_smile:

Gli strumenti vanno bene, ma bisogna usarli.
Per definire il punto usa un costruttore.
Il metodo GetPoint va semplicemente richiamato, con i relativi parametri

Come la vedo io … noi diamo un contributo, tu scrivi lo script …
:smile:

… Io continuo domani … :sleeping:

ovvio, ma è il maestro che dirige l’orchestra ahahahah

comunque ho fatto un mezzo script ma prendendo degli esempi in rete, già mi ero dimenticato tutto :smiling_face:

L’unico che dirige qui e’ Giuseppe.
Noi … facciamo casino :grinning:

Quando avrai anche l’altro mezzo script, postalo. :slight_smile:

se ci riesco :wink:

Haha …

Se ti serve una dritta, fatti vivo !

lo ri-vedo adesso per dargli un’occhiata e ci riprovo,
che ieri poi dopo un po ho chiuso anch’io era tardi :+1:

e così è stato:

import Rhino as rh
import System.Guid as gu
import scriptcontext as sc


def startPt():
    gp = rh.Geometry.Point3d(0, 0, 0)
    #return sc.doc.Objects.AddPoint(gp)
    return gp

#startPt()

def endPt():
    gp = rh.Input.Custom.GetPoint()
    gp.SetCommandPrompt("End Point")
    gp.Get()
    return gp.Point()

#endPt()

def Main():
    return sc.doc.Objects.AddLine(startPt(), endPt())

Main()

#sc.doc.Views.Redraw()

il codice funziona, il primo punto è fisso, mentre il secondo gli viene dato input per creare una linea

domande: ma c’é una guida che spieghi le librerie che funzione hanno e cosa sia possibile fare con esse?

come detto con questo codice mi crea una linea, e viene anche visualizzata,
come mai se avvio soltanto la def startPt() disabilito return gp e abilito la riga sopra di essa
però poi sono costretto ad abilitare anche l’ultima riga del codice cioè sc.doc.Views.Redraw()
che se ho compreso bene serve a “disegnare” gli oggetti?

il codice importa il Guid nel mio caso l’ho eliminato questa parte:

    id = scriptcontext.doc.Objects.AddLine(pt_start, pt_end)
    if id!=System.Guid.Empty:
        scriptcontext.doc.Views.Redraw()
        return Rhino.Commands.Result.Success
    return Rhino.Commands.Result.Failure

quindi tale libreria servirebbe per indicare gli oggetti?

Se vuoi, prova a cercare su RhinoDeveloper

Ma, se ti riferisci a RhinoCommon, non credo ci sia una guida.
C’e’ il forum … :wink:
E poi ci sono gli esempi, oltre alla documentazione della API.

Vuoi dire se esegui startPt modificata invece di Main ?

Dovrebbe disegnare un punto invece della linea.

E il Redraw finale dovrebbe servire comunque, anche per la linea.
Anche se di solito basta ruotare un po’ la vista e Rhino ridisegna autonomamente.

Redraw esegue un semplice ridisegno delle viste, cosi’ tu vedi eventuali nuovi oggetti, o altri cambiamenti.

Vero, quell’import al tuo script non serve.

Voui dire la Struct Guid ? Direi di si’.
E’ quello che usi in rhinoscriptsyntax per individuare gli oggetti, chiamato anche objectID o simili …

E’ anche quello che restituisce il tuo Main, anche se poi non viene utilizzato.

Vedo che alla fine hai usato Rhino.Input.Custom. :slight_smile:

Bene ! Il primo script e’ fatto. Bravo Salvio !

… Adesso pensa a qualcos’altro :grinning:

non del tutto

ma in questa riga il codice era riportato usando Custom è funziona
mentre se come consigliato uso RhinoGet.GetPoint() mi chiede:

Message: GetPoint() takes at least 2 arguments (0 given)

adesso ricordo, proprio per questo ieri sera non mi funzionava lo script. . .

quindi oltre alle differenze citate, ci sono anche differenze nell’uso pratico tra Custom e RhinoGet
quando si programma in questo modo, sembra una famiglia piena di figli
una mandria di oggetti che ti chiedono sempre qualcosa ahahahah

ps poi vedendo bene il codice, in questo modo lo script mi pare che non funzioni per il C#
essendo che Py usa librerie che C# non usa oltre a quella in comune di Rhino. . .

(quindi ho fatto funzionare il codice usando Common in Py “adesso” bisogna convertirlo in C#)

Il messaggio dice che quel metodo ha bisogno di almeno due parametri … e tu non ne hai scritto nemmeno uno. :wink: :smile:

Guarda qui:
RhinoGet.GetPoint Method (rhino3d.com)

In particolare:

public static Result GetPoint(
	string prompt,
	bool acceptNothing,
	out Point3d point
)

Vedi che quel metodo richiede 3 parametri (3 in C#, 2 in Python, vedi sotto) ?
Se non li scrivi come fa a funzionare ? :wink:

Tra l’altro l’ultimo e’ un parametro out, per cui con Python va aggiunto ai valori restituiti, per cui in Python questo metodo richiede due parametri e restituisce una tuple con due valori.
( Vedi che usare RhinoCommon con Python ha qualche piccolo inghippo ? :wink: :smile: )

Salvio, sono due cose diverse, ci avevamo accennato.

Rhino.Input.Custom.GetPoint e’ una intera classe, che utilizziamo prima generando un oggetto con un costruttore e poi utilizzando diversi metodi per settare prompt e altre cose.
E ancora altri metodi per eseguire l’input e per ottenere il punto.

Rhino.Input.RhinoGet.GetPoint e’ semplicemente un metodo della classe RhinoGet.
Tu chiami quel metodo, dandogli i parametri che servono, e ottieni subito il tuo punto (nel parametro out).

Vedi che sono due cose completamente diverse.
Non possono funzionare nello stesso modo.

Ti riferisci a scriptcontext ?
Qui lo usi per accedere all’oggetto RhinoDoc con scriptcontext.doc

Non ho esperienza di sviluppo di plug-in, ma da quanto vedo negli esempi, per i plug-in in C# per questo si usa la variable doc, che suppongo sia pre-definita in quell’ambito.

Ma possiamo chiedere a Sergio o ad altri esperti di plug-in per maggiori informazioni.

Io non vedo altre librerie non disponibili in C#. :slight_smile:

ok Redraw quindi è sempre necessario,
si vede che con la realizzazione della linea succede qualche aggiornamento che col punto non avviene.

edit: come logico, andando a dover indicare il punto finale della linea, muovendo il mouse si aggiorna

def endPt1():
    gp = rh.Input.Custom.GetPoint()
    gp.SetCommandPrompt("End Point")
    gp.Get()
    return gp.Point()

#endPt1()

def endPt2():
    gp = rh.Input.RhinoGet.GetPoint("End Point", False)[1]
    return gp

#endPt2()

prompt
Type: System.String
Prompt to display in command line during the operation.
acceptNothing
Type: System.Boolean
if true, the user can press enter.
point
Type: Rhino.Geometry.Point3d
point value returned here.

cosa si intende col se vero, l’utente può premere Invio.

ci vuole una persona solo per spiegare la spiegazione della guida ahahahah

Hahaha …

Si riferisce al parametro (booleano) acceptNothing
E in un certo senso il nome da’ un’indicazione: “accetta niente”, cioe’ accetta che l’utilizzatore non clicchi nessun punto (ma dia Enter invece).

Vuol dire:
Se acceptNothing e’ True, allora il metodo GetPoint accetta come risposta anche un semplice Enter, cioe’ nessun punto.
Per sapere se effettivamente e’ stato cliccato un punto o no bisogna esaminare il primo risultato di tipo Result, che e’ una enumerazione:

Result Enumeration (rhino3d.com)

Quindi se tu permetti all’utilizzatore di dare semplicemente Enter , come parametro scrivi True, se no scrivi False.

( Poi se lo script lo uso io e non mi permetti di rispondere con Enter, ti mando a quel paese … ma e’ un’altra storia. :smile: )

EDIT:

Non credo basti muovere il mouse, devi modificare la vista, ruotarla o zoomare ecc.
Comunque il movimento prima di cliccare il punto non conta, la linea non esiste ancora.
Di solito e’ meglio un Redraw in piu’ che uno in meno … eviti di confonderti, lo dico per esperienza. :wink:

ma infatti è un po strana questa storia, nella guida vedevo spesso che veniva richiesto valori bool
ripeto ogni volta che in un metodo veniva chiesto qualcosa di simile mi dicevo vabbè non puà essere un valore bool True/False significherà tutt’altro, appunto perché tanti metodi riportano questa sintassi
(che senso ha un valore di parametro bool se io debbo inserire un punto)
poi adesso con la tua spiegazione forse forse è proprio così, non ha senso ahahahah

Be’, il senso e’ quello detto prima.
Se obbligare a cliccare un punto o consentire di premere Enter.

Se la cosa sia comoda o meno per chi utilizza lo script e’ un altro discorso, che qui non c’entra.
Qui parliamo di come funziona quel metodo, e quel parametro bisogna scriverlo.

Il punto lo deve cliccare chi usa lo script.
Il parametro lo deve scrivere chi scrive lo script.
La differenza dovrebbe essere chiara.

Un parametro bool puo’ essere usato per una infinita’ di cose.
Non c’entra niente lo scopo finale del metodo in questione.

daccordo con quanto dici,

ma se chi scrive il codice richiama il metodo per cliccare un punto
ed io che uso il codice arrivo a quel punto del codice, dove
mi viene richiesto di cliccare un punto
perché poi dovrei premere ENTER. . .

appena provato, mi sono ricordato che questa cosa la fa anche Rhino
creando una linea, dopo il primo punto premo invio e si annulla il comando
mmmm diciamo che in questo caso anch’io lo uso spesso anche il tasto Dx del mouse per annullare