immagino bene che abbiate da fare ed è per questo che ho chiesto solo come impostare il ragionamento.
Posso sicuramente provare ad impostare il codice e poi eventualmente (sicuramente ) chiedere lumi.
Grazie ancora ed a presto.
Stefano
Strano!
Ciao Emy.
Ciao Stefano
Ho imbastito uno script, tanto per provare …
… E devo dire faticando un po’ perche’ con i blocchi non sono allenato …
Vuoi che posto 'sta roba o preferisci scriverlo tu lo script e impratichirti di questa arte esoterica (con il nostro aiuto, ovviamente) ?
… Chissa’ se anche Lucio ha trovato il tempo di buttar giu’ qualcosa …
Per il momento sono ancora preso con programmi cam e altro… ho solo il tempo di dare un occhio veloce a discourse (magari buttare due insulti a quell’inbriagon del Molinaroli) e poi ritorno subito al lavoro…
Ciao Emilio.
Ieri pomeriggio ho fatto un minimo di esplorazione sull’argomento: come dicevo sarebbe la mia prima esperienza in merito (in passato ho utilizzato sequenze di comandi contenuti in un file .txt, che non è proprio la stessa cosa). Dato che alla fine ciò che conta è il risultato, ho desistito, considerando che (come dicevo) la postproduzione è ancora la strada più breve. E se hai faticato tu, figurati quando giungevo a un risultato io.
Sicchè sarei molto lieto di poter utilizzare il tuo script: dubito di poter diventare un adepto della vostra setta, ma quantomeno leggere le formule magiche ha sempre un enorme fascino.
Grazie in anticipo
Stefano
Bene
Qui c’e’ la mia ricetta della pozione …
import rhinoscriptsyntax as rs
import scriptcontext
import random
def main():
blocks = rs.GetObjects( 'Blocks to replace ?', preselect = True )
if not blocks:
return
rs.UnselectAllObjects()
cblocs = rs.GetObjects( 'Coloured blocks ?' )
if not cblocs:
return
random.seed()
cnt = len( cblocs )
master = rs.CopyObject( blocks[ 0 ] )
while True:
scriptcontext.escape_test()
rs.EnableRedraw( False )
for block in blocks:
rs.UnselectAllObjects()
rs.SelectObject( block )
cmd = '_ReplaceBlock _Enter _Selid %s' % master
rs.Command( cmd, False )
for block in blocks:
ix = random.randrange( cnt + 1 )
if ix < cnt:
rs.UnselectAllObjects()
rs.SelectObject( block )
cmd = '-_ReplaceBlock _Enter _Selid %s' % str( cblocs[ ix ] )
rs.Command( cmd, False )
rs.UnselectAllObjects()
rs.EnableRedraw( True )
ok = rs.GetString( 'OK ?', 'Yes', [ 'No' ] )
if ok == 'Yes':
break
rs.DeleteObject( master )
main()
All’inizio selezioni i blocchi da modificare,
poi i blocchi con colori diversi da inserire.
Lo script ravana un po’ e ti mostra il risultato.
Se vuoi clicchi ‘No’ e lui genere un risultato diverso
( come ha detto Lucio, ci basiamo su inserimenti casuali dei blocchi, quindi ogni volta
il risultato cambia )
Puoi continuare finche’ vedi un risultato che ti va bene ( o finche’ ti stufi e mandi a quel paese lo script … fa lo stesso )
A questo punto, quando ti chiede se va bene, gli dai Enter e lui termina.
Fammi sapere se ci sono problemi …
Ciao !
P.S.
Per Lucio e adepti vari …
Certo se ci fosse ReplaceBlock in rhinoscriptsintax la cosa sarebbe piu’ semplice (e veloce).
Scriptare il comando e’ il solito casino e poi Rhino si ostina a blaterare nella command area rallentando le operazioni.
Come dicevo a Stefano, ho poca esperienza con i blocchi, quindi per ora ho usato rs.Command()
Magari provo poi con piu’ calma a usare RhinoCommon … vedremo …
Ciao
… praticmente mi avete buttato fuori dalla “mia” discussione ahahahahahah /-) allora ragazzi prima cosa:
che cos’è uno script? hihihihihihihih
Hehe … per fortuna la prendi con allegria … … Ottimo.
Per quanto ne so io, questa e’ la documentazione ufficiale di RMA su come usare gli script …
Se ne hai voglia, comincia a vedere questo, a meno che qualcuno abbia voglia e tempo per uno spiegone …
A dopo
uhm… uhm…
… uhmmmm:confused:
… occhei…
Casomai servisse …
Ho trovato il tentativo di spiegazione che avevo postato tempo fa …
volevo scrivere “Guarda che sono riuscito a fare per merito tuo!” e invece mando questo messaggio di errore
Giuseppe ha da un pò di tempo trovato il suo stalker
Ti rendi conto che tu hai appena trovato il tuo?
Ovviamente scherzo! Pensa alla tua produzione invece che alla mie divagazioni!
Grazie ancora
Stefano
Hahahahaha … guarda che non e’ il primo script che provo a scrivere ‘su ordinazione’ …
( E lo faccio solo quando il problema mi interessa e lo script potrebbe anche essermi utile )
Caro stalker, lo script in questione e’ in Python.
Credevo che un aspirante scriptomame come te lo vedesse subito …
Scherzo, of course.
Comunque per gli script in Python capiti a fagiolo, vedi quando detto appena sopra al nostro amico OP.
P.S.
Soluzione alternativa: per uno script in VBScript, rivolgersi al Maestro Lucio Zadra.
Ciao !
Soluzione alternativa? E perchè mai? Io non sono razzista: le lingue straniere sono tutte straniere uguali!
Sicchè, Siore e Siori, ecco a voi la magia di Emilio Morello:
Blocco base:
Sostituzione casuale del blocco base con altri tre blocchi:
Credo che ci sia da limare ancora sui materiali, ma per quanto mi riguarda commenterei così:
Grazie infinite, Emilio.
Anzi no, non ti ringrazio: una volta un saggio operaio mi ha detto: “Chi ringrazia esce fuori obbligo!”, sicchè aspetto l’occasione per ricambiare.
Stefano
Bel lavoro ragazzi.
Ciao a tutti.
… Dicevo:
… Dopo aver rotto le scatole sul forum ad alcuni esperti (che hanno dimostrato una grande pazienza … ),
col loro aiuto ho messo insieme questa versione dello script, che evita l’output di testo nella command area per ogni rimpiazzo di blocco, come accade nello script originale.
Suppongo che cosi’ lo script sia piu’ veloce, soprattutto se usato su molti blocchi.
( Non osavo chiedere a Stefano quanto ci avesse impiegato lo script sul suo file … )
import rhinoscriptsyntax as rs
import scriptcontext
import Rhino
import System
import random
def error( msg ):
rs.MessageBox( msg )
raise Exception()
def getdefindexatt( gid ):
rob = Rhino.DocObjects.ObjRef( gid ).Object()
if isinstance( rob, Rhino.DocObjects.InstanceObject ):
idef = rob.InstanceDefinition
idex = idef.Index
att = rob.Attributes
return ( idex, att )
else:
error( 'getdefindexatt: bad instance' )
def replaceblocx( insid, refdex, att ):
obref = Rhino.DocObjects.ObjRef( insid )
rob = obref.Object()
if isinstance( rob, Rhino.DocObjects.InstanceObject ):
xfo = rob.InstanceXform
else:
error( 'replaceblocx: bad instance' )
gid = scriptcontext.doc.Objects.AddInstanceObject( refdex, xfo, att )
if ( not gid ) or not gid.CompareTo( System.Guid.Empty ):
error( 'replaceblocx: unable to add' )
ok = scriptcontext.doc.Objects.Delete( insid, True )
if not ok:
error( 'replaceblocx: unable to delete' )
return gid
def replaceblock( insid, refid ):
idex, att = getdefindexatt( refid )
return replaceblocx( insid, idex, att )
def main():
blocks = rs.GetObjects( 'Blocks to replace ?', preselect = True )
if not blocks:
return
rs.UnselectAllObjects()
cblocs = rs.GetObjects( 'Coloured blocks ?' )
if not cblocs:
return
random.seed()
cnt = len( cblocs )
masterx, mastera = getdefindexatt( blocks[ 0 ] )
while True:
scriptcontext.escape_test()
for ix in range( len( blocks ) ):
blocks[ ix ] = replaceblocx( blocks[ ix ], masterx, mastera )
for ix in range( len( blocks ) ):
nx = random.randrange( cnt + 1 )
if nx < cnt:
blocks[ ix ] = replaceblock( blocks[ ix ], cblocs[ nx ] )
scriptcontext.doc.Views.Redraw()
ok = rs.GetString( 'OK ?', 'Yes', [ 'No' ] )
if ok == 'Yes':
break
main()
Ciao !
Invece avresti dovuto osare, per tua soddisfazione!
Ad ogni modo il tuo replace ha messo solo qualche secondo (aggiungendo tre blocchi a quello originale qualche secondo in più). Oggi pomeriggio posso darti qualche dato più corretto sia con la vecchia che con la nuova versione.
Stavo inoltre pensando che sempre questo script mi tornerà utile quando dovrò disegnare filari di alberi che, si sa, sono simili ma non uguali: sicchè potrò inserire un simbolo qualsiasi e sostiturlo solo all’ultimo momento con un effetto molto più migliorissimo assai.
Grazie ancora ed a più tardi.
Stefano
Ciao Stefano
Bene, grazie.
Qui, provando su … una ventina di ‘scatole’ ( comando Box ! ) , lo script nuovo sembra piu’ veloce,
ma … non si sa mai cosa succede usando gli script sui file reali …
Vedo che ti sei dovuto fare una funzione che legge l’Xform della definizione da sostituire e lo utilizza per piazzare quella nuova… il fatto che manchi una funzione nativa nel linguaggio di programmazione di Rhino mi fa girare le scatolette… possibile che si debba infognarsi con l’Xform per fare una cosa che i comandi di Rhino eseguono senza alcun problema?
Ogni volta che devo mettere mano ad una matrice di trasformazione mi viene il mal di pancia perchè c’è sempre qualche valore che mi va da un’altra parte o che mi incasina qualcosa
Almeno in questo caso leggi la matrice e gliela passi senza dover farci calcoli…
Bravo Emilio!