Génération de dessin à partir des données du logiciel « Santé » de l’iPhone;
Le fichier healthXml.xml est généré par analyse et nettoyage du fichier exporter.xml du logiciel « Santé » grâce à un javascript (dossier: parsingXmlData) ;Le tronc de l’arbre est généré en fonction de l’heure de la marche; La taille des branches correspond à la distance parcourue, le nombre de sections des branches, aux pas et l’inclinaison, à la durée de la marche.
Sources: drawWithHealthData.pde / Processing 3.0.1
XML xml;
XML[] recordXml;
XML[] newDateRecordsXml;
int numRecords;
int recordId = 90; //choix de l'id de l'enregistrement
void setup() {
size(1280, 960);
background(255, 255, 255);
smooth();
//Chargement et stockage des données XML
xml = loadXML("healthXml.xml");
recordXml = xml.getChildren("record");
numRecords = recordXml.length;
println("Enregistrements: " + numRecords);
readXML();
}
void draw() {
}
//Fonction de dessin de l'arbre
void drawTree(){
newDateRecordsXml = recordXml[recordId].getChildren("records");
String recordDate = recordXml[recordId].getString("date");
int treePartSize = height/14;
stroke(51, 153, 255);
fill(0);
strokeWeight(1);
textSize(20);
text(recordDate, width/2, height-20);
//Dessin du tronc
for(int i=0; i<12; i++){
strokeWeight(i*0.3+1);
line(width/2, i*treePartSize + treePartSize, width/2, (i+1)*treePartSize + treePartSize);
}
//Dessin des branches
for(int i=0; i<newDateRecordsXml.length; i++){
//Definition des vecteurs pour l'orientation des branches
PVector vSelected, v12, v24;
vSelected = new PVector();
v12 = new PVector(-1, -0.5);
v24 = new PVector(1, -0.5);
//Récuperation des données des enregistrements
int[] recordTime = int(split(newDateRecordsXml[i].getChildren("time")[0].getContent(), ':'));
int recordHours = recordTime[0];
int recordMinutes = int(recordTime[1]*10/60);
int recordSteps = int(newDateRecordsXml[i].getChildren("steps")[0].getContent());
String timeVector = str(recordHours) + '.' + str(recordMinutes);
float timeFactor = float(timeVector);
float recordDistance = float(newDateRecordsXml[i].getChildren("distance")[0].getContent())*200;
float recordDuration = float(newDateRecordsXml[i].getChildren("duration")[0].getContent());
//calcul de la position de naissance des branches
int branchX = width/2;
float branchY = (abs(12-timeFactor))*treePartSize + treePartSize;
//Choix de l'orientation des branches en fonction de l'heure ( <=12:gauche, >12: droite)
if(recordHours <= 12){
vSelected = v12;
}else{
vSelected = v24;
}
// Calcul du nombre et de la taille des sections des branches en fonction du nombre de pas
float branchPart = (recordDistance*2) / recordSteps;
float branchWeight = recordDuration/1000;
//Génération du dessin des branches
for(int j=1; j<recordSteps+1; j++)
{
strokeWeight((recordSteps-j)*0.003);
line(vSelected.x*(branchPart*(j-1)) + branchX, (vSelected.y + branchWeight)*(branchPart*(j-1)) + branchY , vSelected.x*(branchPart*j) + branchX, (vSelected.y + branchWeight)*(branchPart*j) + branchY);
}
}
}
void readXML() {
// Boucle de traitement des données XML
for (int i = 0; i < 1; i++) {
// Selection des données du tableau XML pour chaque entrée
newDateRecordsXml = recordXml[recordId].getChildren("records");
String recordDate = recordXml[recordId].getString("date");
println("Record date: " + recordDate);
for(int j=0; j<newDateRecordsXml.length; j++){
String recordsId = newDateRecordsXml[j].getChildren("recordId")[0].getContent();
String recordsTime = newDateRecordsXml[j].getChildren("time")[0].getContent();
float recordsDuration = float(newDateRecordsXml[j].getChildren("duration")[0].getContent());
float recordsDistance = float(newDateRecordsXml[j].getChildren("distance")[0].getContent());
int recordsSteps = int(newDateRecordsXml[j].getChildren("steps")[0].getContent());
println(" - " + recordsId + " / Début: " + recordsTime + " / Durée: " + recordsDuration + " / Distance: " + recordsDistance + " / Pas: " + recordsSteps + ".");
}
}
drawTree();
}
Comments are closed.