Py: script per minimo curva

In Gh faccio una roba sporca… tipo: posto il dominio 0<dominio<1 faccio una serie con 100 valori compresi fra 0 e 1, e un “curvature” per ognuno di questi 100 parametri.
Ho una lista con 100 circonferenze, faccio un sorting e estraggo item [0] e da questa ricavo il centro.

Avete qualcosa di meglio e già fatto in Py?

Ciao Giuspa !

… Scusa, non capisco una mazza. :confused:
Minimo di che ? :slight_smile:

( Come sai non frequento GH … :blush: )
Parli di curvature e circonferenze. Sono quelle che mi pare chiamino circonferenze osculatrici ?
Il sorting delle circonferenze su cosa … ‘sorta’ ? :wink:
Cerchi il raggio minimo o una posizione ?
E il centro a cosa serve ?

… Forse fai prima ad affinare la definizion che a spiegare il problema a uno scriptomane zuccone … :wink:

EDIT:
Dimenticavo …
Curva 2D o 3D ?

Ah bon, pensavo di non aver capito solo io… :rofl:

1 Mi Piace

scusate mi sono espresso male… raggio minimo… sottintendevo che “curvature” si occupasse di raggi.

Quindi, se ho capito bene, devi trovare il centro del raggio minimo di una curva estraendo un tot di punti su cui fai la verifica della curvatura?
Ma non stai prima a convertire la curva in archi (seguendo una tolleranza) e trovare l’arco con raggio minimo da cui estrarre il centro?

Si.
OK anche convertire in archi.
Ero curioso perchè in Py Il metodo CurveCurvature restutuisce (se analizzi molti punti) una serie di Tuple con dentro diversi dati. Vorrei trovare un metodo per fare:

  1. accorpare tutte le tuple in un unica.
  2. fare un sorting con chiave raggio (Data[3]) di quello che restutuisce CurveCurvature
  1. Puoi usare una lista:
    O parti dalla lista vuota e poi aggiungi un elemento per volta con append()
    Oppure usi una list comprehension e fai tutto con un’unica istruzione.
    Ma la sostanza non cambia.

… Vado a orecchio … magari scrivo cavolate …

tuple = []
for u in listau:
  tuple.append( rs.CurveCurvature( curva, u ) )

# oppure

tulpe = [ rs.CurveCurvature( curva, u ) for u in listau ]
  1. C’e’ il metodo sort() per le liste, a cui puoi passare la funzione di sorting con il parametro key
tuple.sort( key = lambda x : x[ 3 ] )

lambda definisce al volo una funzione che restituisce il quarto elemento della tupla.
Oppure puoi definire una funzione ‘normale’ e poi usare quella


def sortkey( tupla ):
  return tupla[ 3 ]

tuple.sort( key = sortkey )

… se qualcosa non funge, ho scritto caxxate … dimmelo. :slight_smile:

Ciao !

Sono andato a guardarmi la funzione lambda in internet… cacchio, anche la definizione al volo di funzioni usa e getta… ma quante ne sanno i pythonisti! :wink: Speriamo che siano almeno funzioni riciclabili… altrimenti sai inquinamento che fate?

Hehe … Python non e’ un linguaggio ‘funzionale’ (come il Lisp ad esempio), ma gli utilizzatori hanno convinto Van Rossum ad aggiungere alcune cose, come lambda , anche se pare che il buon Guido non sia poi cosi’ convinto della cosa …:smile:

… ‘Spetta che magari prima o poi RMA mette anche F# per gli script, e quello si’ che e’ funzionale di brutto ! :smile:

niente…
ripete 5 volte (print finale) lo stesso valore
e quindi non passo alla fase di sorting.
min.py (537 Byte)

Qui la parentesi quadra chiusa va messa alla fine.

for val in rs.frange(min, max, step):
    tpl.append(rs.CurveCurvature(crv, val))
    print tpl

Qui stampi 5 volte l’intera lista.
Se noti, ad ogni stampata l’ouput e’ piu’ lungo.

for val in rs.frange(min, max, step):
     dati = rs.CurveCurvature(crv, val)
     punti=rs.AddPoint(dati[0])
     centri=rs.AddPoint(dati[2])

Anche questo sembra che funzioni: disegna i punti su Rhino
Pero’ riscrivi 5 volte le variabili dati, punti e centri,
per cui alla fine conservi solo l’ultimo valore, non so se e’ quello che vuoi.

EDIT:

No scusa, l’ho presa per una list conprehension …
( Sono abituato ad andare a capo e qui mi sono confuso … )
sembra solo scritto su una linea sola, quindi direi che manca un ‘:’

I valori dentro listau sono OK ?

Guarda Emi, così funziona!
min001.py (650 Byte)
min.3dm (46,4 KB)

… e ho anche ridotto a due decimali la misura dei raggi di curvatura (data[3])
Ora il problema è il seguente:
vorrei, oltre che i raggi avere anche i punti sulla curva relativi a quei raggi (data[0]) di CurveCurvature
In pratica una lista in cui ci siano solo ordinatamente raggi e punti.
Di questa lista fare il sort con chiave raggio e prendere il primo: ovvero il più piccolo.

Quindi gli elementi [ 3 ] e [ 0 ] della tupla ricavata da rs.CurveCurvature()
Puoi costruire una nuova tupla usando due elmenti della vecchia.

Invece di questo

for val in rs.frange(min, max, step):
    tpl.append((rs.CurveCurvature(crv, val))[3])

prova a scrivere

for val in rs.frange(min, max, step):
    cc = rs.CurveCurvature(crv, val)
    tpl.append( ( cc[ 3 ], cc[ 0 ] ) )

Ogni elemento di tpl sara’ una tupla con raggio e punto

Per il sort, credo che usi il primo elemento di default, quindi
prova a dirgli solo

tpl.sort()

Per questo puoi usare round()
E se ti serve solo il testo, ci sono diversi modi di formattare,
io uso questo … sono abitato cosi’

'%.2f' % elem

Ma il modo standard dovrebbe essere con format() … che non mi ricordo come si usa …:blush:

2 Mi Piace

Emi sono orgoglione… :joy::joy::joy::joy::joy::joy:

fatto. Funziona.: min002.py (755 Byte)

Me la so cantata e sonata…

Grande Giuspa !

… Poi gli script li puoi usare anche dentro GH … :slight_smile:

Sei il NOSTRO Orgoglione! Poco Orgo e molto… :joy::joy::joy::joy:

Come diceva il Prof di chinmica dopo l’estate:
Co gli ioni ci siamo lasciati e co gli ioni ci ritroviamo…

3 Mi Piace