ciao a tutti,
se posso chiederei agli esperti (Emilio e company) se sia possibile un piccolo script per automatizzare una sequenza di comandi e non doverli ripetere uno alla volta, spiego la situazione:
ho una polisuperfice e su questa ho identificato una serie di punti (svariate decine…) che giaciono sulle sue superfici; quello che vorrei poter fare è inserire in ciascun punto una linea normale alla superficie che esca da entrambi i lati per una data lunghezza senza dover ripetere i singoli comandi uno alla volta…
grazie a chi avesse voglia di provarci
Ciao Marco
Se vuoi provare questo …
import rhinoscriptsyntax as rs
def main():
rep = rs.GetObject( 'Polisuperficie ?', 16, preselect = True )
if not rep:
return
rs.UnselectAllObjects()
poss = rs.GetObjects( 'Punti ?', 1 )
if not poss:
return
lng = rs.GetReal( 'Lunghezza delle linee ?' )
if lng <= 0.0:
return
cnt = 0
for pos in poss:
pnt = rs.PointCoordinates( pos )
tup = rs.BrepClosestPoint( rep, pnt )
if tup:
sup = tup[ 0 ]
vec = tup[ 3 ]
vec.Unitize()
p1 = sup + vec * lng * 0.5
p2 = sup - vec * lng * 0.5
rs.AddLine( p1, p2 )
cnt += 1
print( 'Disegnate %d linee' % cnt )
main()
grande EMILIO!
lo proverò lunedì mattina perchè adesso ho quasi la nausea di stare ancora davanti al pc…
intanto grazie ancora per la disponibilità!
Marco, non so se puoi utilizzare la WIP, comunque per fare una prova ho usato Grasshopper sulla WIP, con i nuovi componenti per utilizzare le definizioni come script.
illo-1.gh (7,3 KB)
GRANDE EMILIO!! ho provato lo script e mi aiuta un botto a risparmiare il tempo: DRAGO!
domanda: per ottenere la griglia di punti che giace sulla polisuperfice (mettiamo che la regola sia una griglia con pnti distanti uno dall’altro una misura data esempio 35mm) sarebbe possibile integrarla all’inizio dello script secondo te?
Prima bisogna sapere come e’ definita la griglia.
Sono punti su un piano proiettati sulla superficie ? Su quale Piano ?
Sono punti su una griglia definita da isocurve della superficie ? In quale punto della superficie calcoli la distanza tra i punti ?
Altro ?
La griglia di punti giace sulla polisuperfice ed è tale da avere i punti distanti teoricamente una misura fissa tra di loro (la misura fissa si riferisce a quella lineare di sviluppo sulla superfice stessa)
Lo so, è un casino
No … pensavo a una superficie singola, in quel caso potevo tentare qualcosa.
Ma una polisuperficie no. Non saprei proprio da dove partire.
Per me si’.
Mi ritiro.
Forse qualche esperto di GH e di mesh saprebbe come costruire una triangolazione in qualche modo regolare.
Vediamo se qualcuno si fa vivo …
Tranquillo, lo script per automatizzare le linee normali è giá tanta roba per me… per la griglia di punti mi arrangio con un’approssimazione di serie di piani offsettati e ortogonali tra loro (due gruppi) che oriento secondo l’angolo migliore rispetto alla polisuperfice per individuare la migliore griglia possibile.
scusa Emilio, ma possibile che o script funzioni senza problemi su un pc e lo stesso script su un altro pc mi dia un errore in partenza?
l’errore è
Python Script ( ResetEngine ): spike.py
Ciao Marco.
Sembra che stia eseguendo il file spike.py
Per caso lo script ha quel nome sul tuo PC ?
ciao, certo che si
l’ho trascritto in un file .py con quel nome
ma mentre su un pc funziona tutto su un’altro si blocca subito e mi esce quel messaggio…
Se questo compare nella command area, non credo sia un errore.
E’ solo il comando Rhino riportato nella comman history.
Se lo script non funziona, ci sara’ qualche problema che pero’ non genera nessun output.
Se vuoi provare con questo, ho provato ad aggiungere dei messaggi di errore.
import rhinoscriptsyntax as rs
def main():
rep = rs.GetObject( 'Polisuperficie ?', 16, preselect = True )
if not rep:
print( 'Nessuna polisuperficie selezionata' )
return
rs.UnselectAllObjects()
poss = rs.GetObjects( 'Punti ?', 1 )
if not poss:
print( 'Nessuna punto selezionato' )
return
lng = rs.GetReal( 'Lunghezza delle linee ?' )
if lng <= 0.0:
print( 'Lunghezza minore di zero' )
return
cnt = 0
for pos in poss:
pnt = rs.PointCoordinates( pos )
tup = rs.BrepClosestPoint( rep, pnt )
if tup:
sup = tup[ 0 ]
vec = tup[ 3 ]
vec.Unitize()
p1 = sup + vec * lng * 0.5
p2 = sup - vec * lng * 0.5
gid = rs.AddLine( p1, p2 )
if gid:
cnt += 1
else:
print( 'Disegno di una linea fallito' )
print( 'Disegnate %d linee' % cnt )
main()
niente, purtroppo non cambia nulla…
ma cosa mi sta ad indicare il prompt
Python Script ( ResetEngine ): spike.py
ResetEngine?
ResetEngine e’ solo una opzione (l’unica opzione, in effetti) del comando -RunPythonScript.
Se provi a scrivere -RunPythonScript, vedi che compare l’opzione.
Serve, credo, quando hai uno script che ne richiama un altro, e tu editi l’altro.
Per poter ‘vedere’ le modifiche puoi resettare Python.
Forse serve anche ad altro , non saprei.
Per lo script che non funziona, pero’, visto che non ti da’ nessun output, mi viene il dubbio che Rhino non lo veda.
Sei sicuro che sia salvato in una cartella tra quelle che ‘scansiona’ Python ?
si, è nella stessa cartella dove metto altri script richiamati da altri comandi
di sicuro mi perdo in una cavolata…
Altro tentativo …
Hai copiato il file direttamente o hai fatto un file nuovo e ci hai copiato il testo ?
Perche’ puo’ bastare un carattere in piu’ o in meno perche’ lo script vada a pallino …
La sintassi degli script, Python soprattutto, e’ molto ‘delicata’ …
Idem per il comando scritto nel pulsante …
FINALMENTE FUNZIA!!
però resta un mistero,
ho inserito l’intero percorso allo script tra virgolette e ora parte ed esegue lo script
la cosa strana è che altri comandi con richiamo di script sempre in pyton partono e vengono richiamati senza aver trascritto l’intero path e tutti gli script li metto nella stessa cartella che in impostazioni ho dato come percorso di riferimento…
grazie ancora per l’aiuto!
Si’, le virgolette dovrebbero servire solo se ci sono spazi nel percorso del file …
Mah.
… A volte capita.