Gli Script

@Claudio3 il ragazzo (Emilio) è modesto :wink:

1 Mi Piace

Ho trovato questo sulle liste, che a me sembra abbastanza comprensibile …
poi … vedi tu. :wink:

1 Mi Piace

Concordo pienamente Salvio !

Dico che nelle risposte qui non scrivo certo un capitolo intero di un tutorial.
Quindi se si tratta di inquadrare un argomento piuttosto ampio e’ meglio cercare prima tutorial o documentazione, esempi compresi.

Quando poi si tratta di dubbi su aspeti particolari, allora il forum va benissimo.

2 Mi Piace

Ciao , arrivati a questo cosa dovremmo fare , presumo iniziare a eseguire e assegnare i primi valori di disegno del tronco di cono , o altro ?

Ciao grazie

Ciao

Si’ e no … :wink: :smile:

Io prima ho calcolato i valori necessari per disegnare i cerchi,
e sono passato al disegno vero e proprio in un secondo tempo.
Diciamo che ho separato i cicli che calcolano quanto serve dai cicli che disegnano.

Ovviamente si puo’ fare in un ciclo unico, ma ho preferito fare cosi’ perche’ mi crea meno confusione … :blush:

Preferisci che posto l’intero script, o vado avanti poco per volta, come fatto prima ?
Per me e’ lo stesso … :slight_smile:

Questa sera posto lo script con qualche spiegazione, come al solito.

Ciao

1 Mi Piace

La mia opinione che posso darti e’ : , direi che opti per la scelta che ritieni piu oppurtuna per mè va sempre bene in ogni caso ,sia in un colpo solo che a frammenti …

Grazie mille :star_struck:

Buon pomeriggio a tutti

Ciao

Vediamo qualche operazione in piu’ per lo script:

import rhinoscriptsyntax as rs

def main():
    name = rs.OpenFileName( 'File da leggere ?' )
    if not name:
        return
    file = open( name, 'r' )
    text = file.read()
    text = text.strip()
    lines = text.split( '\n' )
################
    rad = []
    lng = []
    deg = []
    for line in lines:
        wrd = line.strip().split( ',' )
        num = [ float( wr ) for wr in wrd ]
        rad.append( num[ 0 ] / 2 )
        lng.append( num[ 2 ] )
        deg.append( num[ 3 ] )
    rad.append( num[ 1 ] / 2 )
################
    sucnt = len( lng )
    arot = [ deg[ 0 ] ]
    for ix in range( 1, sucnt ):
        arot.append( arot[ -1 ] + deg[ ix ] )
    crot = [ arot[ 0 ] ]
    for ix in range( sucnt - 1 ):
        crot.append( ( arot[ ix ] + arot[ ix + 1 ] ) / 2 )
    crot.append( arot[ -1 ] )

# controllo

    print( 'arot: ' + str( arot ) )
    print( 'crot: ' + str( crot ) )

main()

Eravamo rimasti con le variabili rad , lng e deg conteneti i valori per:

raggio della circonferenza
lunghezza del tratto
angolo rispetto al tratto precedente

Per disegnare il condotto ci servono le circonferenze.
Che potremo disegnare tramite rhinoscriptsyntax con:

RhinoScriptSyntax

Sorry, we were unable to generate a preview for this web page, because the following oEmbed / OpenGraph tags could not be found: description, image

I cerchi possiamo disegnarli gia’ nella giusta posizione oppure disegnarli tutti, ad esempio, sull’origine e poi spostarli e ruotarli.
Lo script sceglie questa seconda via, quindi ci servireranno altre due funzioni rhinoscriptsyntax:

RhinoScriptSyntax

Sorry, we were unable to generate a preview for this web page, because the following oEmbed / OpenGraph tags could not be found: description, image

e

RhinoScriptSyntax

Sorry, we were unable to generate a preview for this web page, because the following oEmbed / OpenGraph tags could not be found: description, image

In ogni caso, ci serviranno orientamento e posizione dei vari cerchi.
Per salvare questi valori useremo altre due variabili:
arot che rappresenta l’angolo di cui va ruotato l’asse del nostro tratto di condotto,
crot che rappresenta l’angolo di cui va ruotato il cerchio.
Ovviamente ci sara’ un cerchio in piu’ rispetto ai tratti di condotto.

E dato che la tabella che hai postato fornisce un solo angolo, supponiamo che l’asse del condotto appartenga ad un piano.
Qui usiamo il piano XY e gli angolo li misuriamo antiorari visti da Z+ ruotando attorno all’asse Z rispetto all’asse delle X. Cioe’ questo angolo per l’asse delle X vale zero gradi.

Settiamo anche una variabile sucnt che contiene il numero delle superfici da disegnare, quindi dei tratti di condotto. Solo per comodita’. :slight_smile:

Come primo valore della lista arot prendiamo l’inclinazione del primo tratto come da tabella:

    crot = [ arot[ 0 ] ]

Qui inizializziamo la lista arot come una lista che contiene un solo valore: il primo valore di arot

Ora con un ciclo for calcoliamo i vari valori per l’angolo del tratto di condotto come l’angolo del tratto precedente piu’ il delta angolo fornito da deg

L’espressione:

arot[ -1 ]

rappresente l’ultimo valore della lista.
In Python se l’indice che usi e’ negativo, si calcola dalla fine della lista, con -1 che indica l’ultimo elemento, -2 il penultimo e cosi’ via.

L’espressione:

 range( 1, sucnt )

rappresenta una lista di interi che inizia col valore 1 e termina con sucnt - 1
( con incremento uguale a 1 )

Popodiche’ passiamo a crot
Come primo valore prendiamo l’angolo dell’asse del primo tratto di condotto.
In modo che il cerchio sia normale all’asse del condotto.

Gli altri valori, tramite il solito ciclo for, li calcoliamo come la media tra l’angolo dell’asse del tratto precedente il cerchio e quello dell’asse del tratto successivo.

Dopo il ciclo aggiungiamo ancora l’angolo per il cerchio finale: uguale all’angolo dell’asse dell’ultimo tratto.

L’espressione:

range( sucnt - 1 )

rappresenta la lista di interi che inizia con zero e termina con sucnt - 2.
Sempre con incremento 1.

Per ora finiamo qui …
E facciamo il solito controllo stampando le due liste appena ricavate.

Ciao

2 Mi Piace

CIao vediamo se ho capito qualcosa :cold_sweat:

Si possiamo definire un angolo di partenza volendo sarerebbe anche carino .

Ho fornito un solo angolo per semplicità , in verita i dati li ho singolarmente disposti cosi : 0,35,5,38,40 , ossia : angolo per diametro 1 , quota diametro 1 angolo diametro 2 , diametro 2 , lunghezza .
Se ti sono piu comodi cosi meglio ,ma come sei più comodo tanto devo esportali in txt e li converto in posizione che servono . ( in questo caso va sommato ovviamente la quota angolo precedente ) perchè con la linea asse centrale devi disegnare l inclinazione totale presumo .

Questo sarebbe utile anche per il primo non avendo l inclinazione in partenza per cui rimane 0 .

Nel caso i valori dati fossero maggiori come o di tronchi non sempre uguali viene eseguito ? :cold_face:

Ciao e grazie e complimenti ne sai di cose .

Se sei d’accordo, io finirei prima lo script partendo dai dati che abbiamo gia’.
E’ comunque un esercizio, e se poi serve cambiare qualcosa lo facciamo.
La cosa non da’ problemi, anzi, direi che scrivendo script, adattarli e modificarli nel tempo e’ la norma. :slight_smile:

Si’, se capisco bene a cosa ti riferisci credo siano i valori in arot.

Come accennavo sopra parlando dell’inclinazione dei cerchi:

Ma anche questo si puo’ poi cambiare volendo. :slight_smile:

Temo di non capire bene cosa intendi, ma se parli di condotti composti da un diverso numero di tratti, non cambia niente.
Come vedi la variabile sucnt

sucnt = len( lng )

… e’ ricavata dalla lunghezza della lista lng, per cui varia col variare della suddetta lunghezza.

Se ti riferisci a Python … per potermi fare gli script che mi servivano qualcosa ho dovuto imparare, negli anni.
E a mio modesto avviso Python non e’ quel linguaggio semplice semplice che a volte si racconta …
Probabilmente lo e’ per programmatori professionisti.
Per noi caddisti credo che in genere spesso sia diverso.

Ciao

1 Mi Piace

Si certamente va bene.

Procedi quando vuoi e come preferisci , io nel frattempo tappezzo il codice di scritte verdi per apprendere almeno le basi che torna tutto utile.

Intendevo se abbiamo un file con 10 righe di valori o 15 …

Si a Python , non è semplice il codice …

Che tipo di progetti disegni facevi ?

Gia disegnare comunque non è semplice , programmare sicuramente è complicato.

Ciao Grazie

Ho lavorato come modellatore meccanico:
CAD/CAM per particolari in resina (RIM), pezzi per carrozzieri, calibri ecc.
In un secondo tempo ho disegnato stampi per termoformatura e anche un po’ di fonderia (ma non ci ho capito niente :blush:).
Negli ultimi anni ho fatto il disegnatore, principalmente per termoformatura, per la logistica.

Ho usato Cimatron negli anni '90 e poi Rhino fino alla pensione.
Il CAM ( anni '90 e '00 ) era Camelot.

OK, questa sera vedo di postare lo script completo.
Penso che provandolo in pratica si riesce a capire meglio come funziona. :slight_smile:

Si’, per farlo seriamente ci vuole la testa adatta.
Io mi accontento degli script per il CAD. :grinning:

Ciao

1 Mi Piace

Molto interessante , lavori creativi , che Cam usavi per i 3D con Rhino ?

Ma va non ci credo proprio …

Va bene ottimo.

Non mi sembra ti manchi sinceramente la testa .
Penso molto dipenda dove uno voglia o necessiti quanto approfondire poi indubbiamente ci sono predisposizioni mentali matematiche piu o meno portate ma se non ti applichi , dove vorresti arrivare non ci si arriva di sicuro…

Io sono all inizio invece del mondo di RHino :upside_down_face:.

Ciao grazie a piu tardi

Be’, come modellatore secondo me il lavoro e’ creativo nel senso che devi trovare un modo il piu’ possibile comodo, veloce e preciso per farlo.
Credo che questo valga piu’ o meno per ogni tipo di lavoro.

Di creativo nel senso che intendono gli artisti non c’era niente.
E a me va bene cosi’, non sono un artista.
Ricevevi i disegni, e poi negli utlimi anni preferibilmente le matematiche (i files IGES, STEP … )
e poi ci lavoravi col CAD. E eventualmente col CAM.

Personalmente forse preferivo quando non c’era il CAD.
Dal disegno dovevi costriure il pezzo, usando macchine e attrezzi.
Certo era impegnativo, ma c’era anche del lavoro manule.
Che col CAD purtroppo manca …
E mi piaceva anche leggere il disegno.

Passando al periodo CAD/CAM, lavorare con i percorsi utensili mi piaceva.
Era la parte piu’ divertente del CAD/CAM.
Il CAM era Camelot, come ho detto sopra.

La parte divertente di usare il CAD invece per me e’ scrivere e utilizzare gli script.
Anche trovare il modo per verficare/misurare/controllare le superfici mi piaceva.

Quanto al lavoro da disegnatore, si’, un po’ di creativita’ ci vuole … e credo che quella per me fosse la parte piu’ difficile. Ho poca inventiva. Molto poca … :smile:
Fatico a immaginare le forme prima di disegnarle.

Altra cosa che trovo molto impegnativa, a volte anche troppo :wink: , col CAD e’ capire la forma che stai guardando.
Lo schermo 2D, con scala indefinita, a volte e’ terribile. :unamused: :smile:

E’ il momento in cui rimpiangi un bel modello in legno o in resina, che puoi prendere in mano e guardare come vuoi … realmente in 3D. :smile:

Certo il rovescio della medaglia sono le misure, che col CAD, soprattutto se ti organizzi, riesci a prendere quasi al volo.
Mentre con modello fisico, soprattutto senza macchine di misura … non e’ semplicissimo. :grinning:

A dopo.

1 Mi Piace

Come ho sempre fatto io per i motori , ma piu lavoro che guadagno :joy:, infatti non campo di questo … .

Be questo è imparagonabile , concordo pienamente.

CIao a Dopo .

1 Mi Piace

ieri al reality Affari di Famiglia una persona ha portato due quadri del pittore:

Le sue opere sono per questo molto amate dagli scienziati, logici, matematici e fisici, che apprezzano il suo uso razionale di poliedri e distorsioni geometriche e le interpretazioni originali di concetti appartenenti alla scienza per ottenere effetti paradossali.

questo era uno dei quadri discussi nella puntata, ho trovato il video di come sarebbe in 3D

una volta vidi un’intervista, dove veniva spiegato come mai alcuni artisti dipingessero quadri con forme cosi particolarmente “strane”, una possibile conclusione fu che probalbilmente ci fosse qualche problema di comunicazione tra quello che vedevano gli occhi e quello che veniva percepita dalla mente. in pratica gli occhi vedevano bene, ma la mente distorceva il tutto.

1 Mi Piace

Ecco lo script completo:

import rhinoscriptsyntax as rs

def main():
    name = rs.OpenFileName( 'File da leggere ?' )
    if not name:
        return
    file = open( name, 'r' )
    text = file.read()
    text = text.strip()
    lines = text.split( '\n' )
    rad = []
    lng = []
    deg = []
    for line in lines:
        wrd = line.strip().split( ',' )
        num = [ float( wr ) for wr in wrd ]
        rad.append( num[ 0 ] / 2 )
        lng.append( num[ 2 ] )
        deg.append( num[ 3 ] )
    rad.append( num[ 1 ] / 2 )
    sucnt = len( lng )
    arot = [ deg[ 0 ] ]
    for ix in range( 1, sucnt ):
        arot.append( arot[ -1 ] + deg[ ix ] )
    crot = [ arot[ 0 ] ]
    for ix in range( sucnt - 1 ):
        crot.append( ( arot[ ix ] + arot[ ix + 1 ] ) / 2 )
    crot.append( arot[ -1 ] )

    xax = [ 1, 0, 0 ]
    zax = [ 0, 0, 1 ]
    ccen = [ [ 0, 0, 0 ] ]
    for ix in range( sucnt ):
        vec = rs.VectorRotate( xax, arot[ ix ], zax )
        vec = rs.VectorScale( vec, lng[ ix ] )
        pnt = rs.VectorAdd( ccen[ -1 ], vec )
        ccen.append( pnt )
    cen = [ 0, 0, 0 ]
    pla = rs.WorldYZPlane()
    circ = []
    for ix in range( sucnt + 1 ):
        cir = rs.AddCircle( pla, rad[ ix ] )
        cir = rs.RotateObject( cir, cen, crot[ ix ], zax )
        cir = rs.MoveObject( cir, ccen[ ix ] )
        circ.append( cir )
    sur = []
    for ix in range( sucnt ):
        sur.append( rs.AddLoftSrf( [ circ[ ix ], circ[ ix + 1 ] ] )[ 0 ] )
    rs.DeleteObjects( circ )
      
main()

Qualche breve cenno sulle linee aggiunte dall’ultima volta (sperando di non fare errori) :

Con xax e zax definiamo due vettori che rappresentano l’asse X e l’asse Z
In rhinoscriptsyntax i vettori 3D sono rappresentati da liste con 3 componenti:
le componenti X, Y e Z del vettore.

Utilizziamo la lista ccen per salvare i centri dei cerchi, il primo valore e’ 0,0,0

In un ciclo calcoliamo il vettore spostamento tra un cerchio e il successivo.
In pratica corrisponde l’asse del nostro tratto di condotto.
Usiamo questo vettore per ottenere il centro del cerchio.

Ora definiamo il punto 0,0,0 come variabile cen, ci servira’ poi.
Ricaviamo anche il piano YZ tramite rhinoscriptsyntax e lo salviamo in pla, serivra’ anche lui.
Inizializziamo una lista circ per salvare i Guid dei cerchi.
rhinoscriptsyntax usa i Guid per identificare gli oggetti nel documento Rhino

Ora col penultimo ciclo disegniamo i cerchi:
Usiamo le tre funzioni rhinoscriptsyntax viste l’altra volta.

Per fare cio’ ruotiamo l’asse X dell’angolo opportuno e lo scaliamo secondo la lunghezza del nostro tratto di condotto.
Usiamo il vettore ottenuto per spostare il punto 0,0,0 e ottenere il centro del cerchio.

  1. Disegniamo un cerchio nel piano YZ, centrato sull’origine, dandogli il giusto raggio.
  2. Lo ruotiamo attorno all’asse Z
  3. Lo spostiamo nella giusta posizione
    E salviamo il suo Guid nella lista circ

Usiamo la lista sur per salvare le superfici che disegneremo, nel caso serva poi avere questi dati.

Con l’ultimo ciclo, tramite la funzione
https://developer.rhino3d.com/api/RhinoScriptSyntax/#surface-AddLoftSrf
disegniamo i vari Loft tra le coppie di cerchi consecutivi.

Infne cancelliamo i cerchi usati per la costruzione con
https://developer.rhino3d.com/api/RhinoScriptSyntax/#object-DeleteObjects

Volendo potremmo poi unire le superfici in una unica polisuperficie, sfruttando i dati salvati in sur.

Se vuoi, vedi se lo script funziona e poi vai con le domande … :wink:

A me come primo script sembra MOLTO tosto … :confused: :thinking: :wink:

Ciao

1 Mi Piace

Non mancheranno sicuramente , anche perchè per capire bene il funzionamento mi ci vorra un attimo (anzi un bel attimo :cold_face: :cold_sweat: :grimacing:). me tocca studiare a sto giro :roll_eyes: :grimacing: :partying_face:

Sicuramente si non è per tutti , certo visto cosi e leggerlo trovandolo fatto spesso non si capisce il lavoro che cè dietro ,se lo sai fare puo essere anche veloce () poi non so quanto ci hai messo come impegno e tempo , ma di semplice non cè nulla e tutto richiede tempo conoscenza .

Per mè va bene , ora devo rileggermi tutto bene e archiviare i preziosi passaggi e ovviamente provare il codice.

Ciao grazie

Chi ha un po’ di esperienza di script e di Rhino non ha probemi.
Lo ha mostrato anche Leopoldo sopra.

Solo non e’ la mia idea di primo script … :smile:
Ma ovviamente deve andar bene per te, non per me … :smile:

Confesso che ero partito spedito, per farlo in pochi minuti … ma poi mi sono un po’ piantato.
Non capivo bene se convenisse fare un ciclo unico (piu’ o meno) con tutti i vari passaggi, oppure scomporre il tutto in cicli semplici, salvando i dati in variabili.
Dopo un paio di tentennamenti ho deciso per la seconda ipotesi.
E ci ho messo un certo tempo.

Ormai sono fuori allenamento … :smile:

1 Mi Piace

Leopoldo intendi il lavoro Segmenti fatto in GH ?

Direi un capolavoro ha fatto veramente un lavoro notevole e potente , un grande ho visto con GH è molto esperto
Visualizzi il progetto molto rapidamente con i valori.
Al momento mi è famigliare piu Python che GH …

Come abbiamo detto è un esercizio , per cui va bene anche troppo direi .

NOn è per nulla facile se non lo usi spesso.

Ciao a domani

1 Mi Piace