martedì, gennaio 28, 2014

Dynamo - ParseString



Ho notato che la funzione presente nel core di Dynamo che consente di effettuare il parsing di una stringa di testo (convertire la "natura" della variabile da testo a numero) non funziona correttamente per i testi che hanno per separatore decimale il punto al posto della virgola.
Per questo motivo ho deciso di scrivere un nodo in grado di effettuare il parsing per "stringhe numeriche" in modo più flessibile.
Questa volta ho cercato un approccio "purista" al problema, senza ricorrere agli script dei linguaggi di programmazione, ma soltanto ricorrendo ai nodi presenti nelle daily build di Dynamo anche se è più laborioso, sicuramente mi ha fatto scoprire alcune strutture che possono tornare utili in altre circostanze.
Questa la definizione del nodo che va copiata qui:

C:\Autodesk\Dynamo\Core\definitions

Quando si inserisce una stringa che rappresenta un numero possiamo avere o un numero intero o dei decimali; per i decimali il separatore che siamo abituati ad utilizzare può essere o il punto "." oppure la virgola "," (Revit internamente usa la virgola e questo è proprio il motivo per cui il nodo String to Number presente di default produce un errore nel caso del punto come separatore decimale).

Se pensiamo però agli output più tradizionali come ad esempio un CSV, il delimitatore dei valori è una virgola e per non generare confusione si utilizza il punto per i decimali. Diventa quindi importante poter gestire correttamente qualsiasi tipo di stringa numerica.

La struttura quindi della stringa sarà:

Parte intera  - Separatore decimale - Parte decimale          

Il nodo Split String permette di creare delle liste a partire da una stringa dividendo la stessa quando incontra un delimitatore. Se inseriamo quindi una stringa numerica e una stringa contenente il separatore decimale otteniamo come risultato una lista di due elementi, rispettivamente all'indice [0] ciò che sta prima del delimitatore partendo da sinistra (la parte intera) e all'indice [1] ciò che rimane (la parte decimale), proprio perché il delimitatore può comparire una sola volta all'interno della stringa numerica.
Utilizzando Get from List è possibile estrarre la stringa corrispondente alla parte intera e quella decimale, per i quali utilizzando Stirng to Number si ottengono due numeri interi. Per ottenere il valore corretto della parte decimale basterà dividerlo per una potenza di 10, con esponente pari alla lunghezza della stringa della parte decimale. Sommando poi i valori della parte intera e di quella decimale, si ottiene il valore corretto.
Ecco un esempio, le stringhe sono comprese tra "" :

stringa numerica = "12.3456"
stringa parte intera= "12"
stringa parte decimale= "3456"
lunghezza stringa parte decimale= 4
valore parte intera = 12
valore parte decimale= 3456/10^4=0.3456
valore finale = 12+0.3456=12.3456

Per semplicità ho creato due copie della stessa procedura (anche se ammetto non sia la soluzione più elegante) una valida quando il separatore è il punto, e l'altra valida per la virgola. Per fare questo ci sono più nodi If che permettono di eseguire una serie di istruzioni piuttosto che un'altra a seconda dell'esito di un test.
In particolare se il separatore decimale esiste per la stringa numerica, la lista risultante da Split String avrà un numero di elementi maggiore di uno, in caso contrario la stringa numerica rappresenta un valore intero.
If you are happy with my code you can show me some gratitude paying what you want on PayPal:

puntorevit@gmail.com

Nessun commento:

Posta un commento