Duplicare un oggetto su una superficie

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 :smiley: ) chiedere lumi.
Grazie ancora ed a presto.
Stefano

Strano! :joy::joy:

Ciao Emy.

1 Mi Piace

Ciao Stefano

Ho imbastito uno script, tanto per provare …

… E devo dire faticando un po’ perche’ con i blocchi non sono allenato … :smile:

Vuoi che posto 'sta roba o preferisci scriverlo tu lo script e impratichirti di questa arte esoterica (con il nostro aiuto, ovviamente) ? :slight_smile:

… Chissa’ se anche Lucio ha trovato il tempo di buttar giu’ qualcosa … :slight_smile:

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… :slight_smile:

1 Mi Piace

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. :grin:
Grazie in anticipo
Stefano

Bene :slight_smile:
Qui c’e’ la mia ricetta della pozione … :wink:

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 :smile: )
A questo punto, quando ti chiede se va bene, gli dai Enter e lui termina.

Fammi sapere se ci sono problemi … :slight_smile:

Ciao !

P.S.

Per Lucio e adepti vari … :wink:
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 … :smile: … 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 … :wink:

A dopo :slight_smile:

:confused::confused::confused:uhm… uhm… :roll_eyes::roll_eyes::roll_eyes:… uhmmmm:confused::confused::disappointed_relieved::disappointed_relieved:… occhei…:sob::sob:

Casomai servisse …
Ho trovato il tentativo di spiegazione che avevo postato tempo fa … :slight_smile:

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 :wink:
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’ … :smile:
( E lo faccio solo quando il problema mi interessa e lo script potrebbe anche essermi utile :wink: )

Caro stalker, lo script in questione e’ in Python.
Credevo che un aspirante scriptomame come te lo vedesse subito … :smile::smile::smile:
Scherzo, of course. :wink:

Comunque per gli script in Python capiti a fagiolo, vedi quando detto appena sopra al nostro amico OP. :slight_smile:

P.S.

Soluzione alternativa: per uno script in VBScript, rivolgersi al Maestro Lucio Zadra. :slight_smile:

Ciao !

1 Mi Piace

Soluzione alternativa? E perchè mai? Io non sono razzista: le lingue straniere sono tutte straniere uguali! :smile:
Sicchè, Siore e Siori, ecco a voi la magia di Emilio Morello:
Blocco base:
UnBlocco
Sostituzione casuale del blocco base con altri tre blocchi:
QuattroBlocchi
QuattroBlocchiPrsp
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

1 Mi Piace

:+1: :smile:

Bel lavoro ragazzi. :clap:

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 … :smile: )

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 !

3 Mi Piace

Invece avresti dovuto osare, per tua soddisfazione! :smile:
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. :grin:
Grazie ancora ed a più tardi.
Stefano

Ciao Stefano

Bene, grazie.
Qui, provando su … una ventina di ‘scatole’ ( comando Box ! :sunglasses: ) , lo script nuovo sembra piu’ veloce,
ma … non si sa mai cosa succede usando gli script sui file reali … :wink:

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 :persevere:
Almeno in questo caso leggi la matrice e gliela passi senza dover farci calcoli… :slight_smile:

Bravo Emilio!