Punti da un file csv

Sembra banale ma almeno per me non lo è…
Mi ritrovo un file tipo quello allegato in txtQUANT34simple…txt (1,2 KB) scusate la formattazione…
Il modo in cui andrebbe letto è il seguente:

  • ci sono righe (la prima per esempio) che hanno 5 dati

  • il primo dato (3) rappresenta la X

  • il valore secondo valore (5) la lunghezza della lista che segue

  • l’ultimo numero (1) è l’indicativo della lista

  • in ragione del primo punto spiegato le 5 righe a seguire sono organizzate in modo che per ognuna di esse il primo valore è Z e il secondo Y

  • …che “perno” ci stia a fare il terzo dato (0) lo ignoro…ma me lo tengo…

  • finita questa lista di dati che serviranno per generare una polilinea si passa alla successiva riga da 5 dati… e si ripete il principio espresso sopra.

In pratica devo ottenere tante liste di punti.

Non ho idea di come fare a taroccare il tutto in modo da leggere come si conviene X,Y,Z
excel? Python? Mons. Milingo?..

Beh, non mi sembra complicato… se si segue la regola del secondo dato che ti dà la lunghezza della lista, basta fare un ciclo for con un contatore che va da 1 a L-lista.
Vuoi mantenere le liste di punti divise in gruppi o ti basta metterli tutti in riga uno dietro all’altro?
Io utilizzo file di testo esterni come elenco di parametri taglio organizzati per tipo di materiale: prendo la riga, cerco il carattere speciale di divisione, salvo il dato in un array e poi richiamo l’array come elenco di opzioni.
Qua si fa circa la stessa cosa:

  • Leggo la riga
  • Cerco la prima virgola per identificare la X (e salvo il valore sulla variabile X)
  • Cerco la seconda virgola e utilizzo il valore per impostare il numero di chiamate del ciclo For
  • Leggo le N righe successive cercando come sopra le virgole e salvando i dati in Z e Y
  • Ad ogni ricorsione salvo il punto X,Y,Z all’interno dell’array di raggruppamento.
    E il gioco è fatto.
    Se Emilio non mi straccia sul tempo dopo vado a prendere dei pezzi di codice dei miei script e ti imbastisco su qualcosa.

beato te. Io pensavo di risolvere in excel ma non lo conosco abbastanza e mi impicco.
le liste dovrebbero essere separate… idealmente.

Va beh … per ‘sta volta saro’ magnanimo … taccio.
:rofl:

Vai liscio Lucio, per me e’ tardi, vado a nanna.
Al massimo, se va bene ma non so, domani mattina ci butto un occhio …

Comunque non ho capito (ma guarda!) se scrivere un altro file (come ?) o disegnare direttamente le polilinee (meglio) …

Ciao ragazzi

posto la mia … paitonata :slight_smile:

import rhinoscriptsyntax as rs

def nextlinetokens( ff ):
  while True:
    line = ff.readline()
    if not line:
      return []
    line = line.strip().replace( ' ', '' )
    if line:
      break
  toks = line.split( ',' )
  toks = [ tok for tok in toks if tok ]
  return toks

def main():
  path = rs.OpenFileName( 'File da leggere ?' )
  if not path:
    return
  ff = open( path, 'r' )
  linecnt = 0
  plicnt = 0
  while True:
    tok = nextlinetokens( ff )
    linecnt += 1
    if not tok:
      ff.close()
      break
    if len( tok ) != 5:
      rs.MessageBox( 
        'Problema alla linea %d: non trovo 5 campi' % linecnt )
      return
    try:
      xx = float( tok[ 0 ] )
      pcnt = int( tok[ 1 ] )
      idnum = int( tok[ 4 ] )
    except ValueError:
      rs.MessageBox( 
        'Problema alla linea %d: non riesco a leggere un numero' % linecnt )
      return
    pnt = []
    for px in range( pcnt ):
      tok = nextlinetokens( ff )
      linecnt += 1
      if not tok:
        rs.MessageBox( 
          'Problema alla linea %d: non trovo la linea' % linecnt )
        return
      if len( tok ) != 3:
        rs.MessageBox( 
          'Problema alla linea %d: non trovo 3 campi' % linecnt )
        return
      try:
        zz = float( tok[ 0 ] )
        yy = float( tok[ 1 ] )
      except ValueError:
        rs.MessageBox( 
          'Problema alla linea %d: non riesco a leggere un numero' % linecnt )
        return
      pnt.append( [ xx, yy, zz ] )
    gid = rs.AddPolyline( pnt )
    rs.ObjectName( gid, str( idnum ) )
    plicnt += 1
  print( 'Lette %d polilinee' % plicnt )

main()

Giuspa, questo disegna le polilinee (e gli da’ come nome l’indicativo)
Se invece ti serve un file, dimmi cosa ci devo scrivere.

HTH … Ciao !

P.S.

Se devi leggere dei file con molte polilinee, possiamo inserire un EnableRedraw per velocizzare …
ma credo che per questo ti aggiusti da solo … :slight_smile:

EDIT

… pero’ c’e’ qualcosa d strano … spesso parte al rallentatore … e non scrive il messaggio finale …
Dev’esserci qualche cavolata da qualche parte nello script … che purtroppo non vedo …

EDIT - 2

OK, risolto il messaggio finale, c’era un return invece di un break … ma e’ ancora molto lento …

EDIT - 3

Sembra che si addormenti in rs.OpenFileName() … ma non capisco perche’ …

Emi grazie! E’ perfetto ed è anche veloce. non trovo alcun rallentamento.

Allora e’ un problema locale … Bene ! :slight_smile:

Beh…bene mica tanto…:grin:

Hehe …

Non e’ che si fermi proprio qui, diciamo che sonnecchia qualche secondo e poi parte …
Ma e’ la prima volta che noto una cosa del genere … di solito non uso rs.OpenFileName()

Ma da come sono messo qui per il CAD, e’ ancora il problema minore. :wink:

Complimenti Emilio :slight_smile:

Grazie, come ha detto Lucio, non e’ niente di complicato … scommetto che tu lo avresti fatto in VBS. :slight_smile:

… E scommetto che in VBS viene fuori uno script piu’ lungo e incasinato … hehehe. :smiling_imp:

:wink:

A A A mi sa che questa è una domanda a trabochetto, da quel che ne so VBS non può R/W file esterni o mi sbaglio???

beh in verità con VB6 sono riuscito a leggere e a scrive file esterni ma sto parlando di un bel pò di tempo fa
quindi usando lo stesso procedimento con l’ausilio dello split come hai fatto (io ultimamente l’ho utilizzato per ricavare i nomi dei sottolivelli in Rhino che vengono separati da “::” dal livello genitore) ma questa credo che sia la cosa meno complicata, perchè poi li bisognava valutare molti altri parametri di cui non ho esperienza quindi ti assicuro che per quanto mi riguarda la lunghezza dello script sarebbe stato il mio ultimo pensiero :slight_smile:

spero che era uno script che già avevi in parte fatto, perchè se l’ho hai scritto da zero mi avvilisco :slight_smile:

Naaaaa … Perche’ ?
Certo che legge e scrive i file … anche se adesso non ricordo la sintassi … :smile:
… Forse c’era un FileSystemObject … o una cosa del genere …
Molti lo usano per scrivere file per macchine a controllo numerico, anche Lucio credo :slight_smile:
( Io lo facevo una dozzina di anni or sono … )

Spiacente, non era mia intenzione avvilire nessuno … :laughing:

… Veramente mi sono avvilito io perche’ credevo di buttarlo giu’ molto piu’ in fretta, invece ci ho messo un po’ troppo … eh, fatico a ricordare quello che fa Python … perdo la memoria … anche a ragionare ormai sono leeeeeento … :older_adult: Va beh.

Giuseppe ha spiegato molto chiaramente formato e significato dei dati, per cui non c’era niente di concettualmente complicato.

Certo, se sono cose che uno non ha mai fatto … ci vuole il suo tempo … prove ed esperimenti … per venirne a capo.
A me il parsing mi ‘acchiappa’ ;). Sono cose che ho gia’ fatto chissa’ quante volte, in Python, VBS, ecc. … sono allenato :wink:

Piuttosto un professionista avrebbe usato la libreria per i file csv (c’e’ per Python), ma io ci avrei messo una settimana solo per cominciare a capire come usare la libreria … :laughing:
Molto piu’ semplice (per me) fare tutto ‘a manina’ … :slight_smile:
Anche se ovviamente cosi’ lo script diventa molto specifico e per niente flessibile … e’ la differenza tra professionisti e dilettanti … (vecchietti) …:smile:

che dire ti faccio solo tanti complimenti

infatti l’ho trovato sono contento di questa. ma forse ho confuso con un’altro argomento del forum di cui si parlava tempo fa, nel caso mi puoi confermare anche questa cosa: con rhino è possibile recuperare la lista di tutti i file di una determinata cartella?

Qui ‘con rhino’ io intendo ‘con gli script in Rhino’, per cui VBS & Python.
( Di solito queste cose le fa in un modo o nell’altro qualsiasi linguaggio )

Con Python si usa il modulo ‘os’, per cui:

import os

ecc. ecc.

Per VBS, a quanto ricordo, si’.
Prova a cercare nel file script56.chm
io per il VBS cercavo sempre li’ …

ecco… io con il parsing invece sono una pippa.
:rofl:

Eeh … ti risparmio l’elenco dei miei punti deboli … :frowning_face:

Per me e’ solo una questione di strumenti.

Se ci fosse un add-on per trattamento testi in GH, in modo da importare il testo e costruire un bell’albero ( … quelle cose terrificanti al cui confronto la teoria delle stringhe a 11 dimensioni sembra materia da prima elementare … :wink: ), in quattro e quattr’otto (… componenti) costruiresti la tua bella definizione per disegnare le polilinee. :smiley:

si sarebbe una cosa superlativa. Ora il meglio che puoi fare è importare da excel…

si infatti ho usato PY con questa stringa “dirs = os.listdir( path )” per fare quello che ti dicevo

ok adesso si. io invece scindo le due cose VBS o PY

cmq adesso dò un occhiata alla guida che hai citato vedo se ci trovo qualcosa. ma mi sa che era questa quello che non poteva fare VBS se non erro lo scrisse lucio in un thread qualche tempo fa.

Uomo di poca fede !
:wink:

convigs.rvb (1,5 KB)