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.
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 …
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’ …
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.
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
spero che era uno script che già avevi in parte fatto, perchè se l’ho hai scritto da zero mi avvilisco
Naaaaa … Perche’ ?
Certo che legge e scrive i file … anche se adesso non ricordo la sintassi …
… Forse c’era un FileSystemObject … o una cosa del genere …
Molti lo usano per scrivere file per macchine a controllo numerico, anche Lucio credo
( Io lo facevo una dozzina di anni or sono … )
Spiacente, non era mia intenzione avvilire nessuno …
… 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 … 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
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 …
Molto piu’ semplice (per me) fare tutto ‘a manina’ …
Anche se ovviamente cosi’ lo script diventa molto specifico e per niente flessibile … e’ la differenza tra professionisti e dilettanti … (vecchietti) …
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’ …
Eeh … ti risparmio l’elenco dei miei punti deboli …
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 … ), in quattro e quattr’otto (… componenti) costruiresti la tua bella definizione per disegnare le polilinee.
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.