2015-03-12 1 views
1

J'obtenu le fichier .stl suivant, que je voudrais analyser et extraire les coordonnées:Comment analyser le fichier .stl en Java avec les meilleures performances?

solid WEMtoSTL_0 
facet normal 0.999309 0.0262812 0.0262796 
outer loop 
vertex -49.9111 85.733 -1357.76 
vertex -49.9346 86.6265 -1357.76 
vertex -49.9346 85.733 -1356.86 
endloop 
endfacet 
facet normal 0.999158 0.0290085 0.0290067 
outer loop 
vertex -49.9346 85.733 -1356.86 
vertex -49.9346 86.6265 -1357.76 
vertex -49.9633 86.6745 -1356.82 
endloop 
endfacet 
facet normal 0.996327 0.0262471 0.0815064 
outer loop 
vertex -49.9346 85.733 -1356.86 
vertex -49.9633 86.6745 -1356.82 
vertex -50.0151 85.733 -1355.88 
endloop 
endfacet 
endsolid WEMtoSTL_0 

Les facet et endfacet balises peuvent être répétées autant que nécessaire.

C'est ce que j'ai essayé:

Scanner face_scanner = new Scanner(file); 
face_scanner.useDelimiter("solid | facet normal | outer loop | vertex | endloop | endfacet"); 

Mais face_scanner.next() ne se traduit pas par la suite que je veux:

0.999309 0.0262812 0.0262796 
-49.9111 85.733 -1357.76 
-49.9346 86.6265 -1357.76 
-49.9346 85.733 -1356.86 
and so on... 

Edit: Je essayé maintenant ce qui suit:

Scanner face_scanner = new Scanner(file); 
face_scanner.useLocale(Locale.US); 
face_scanner.useDelimiter("\\s|\n"); 

while (face_scanner.hasNext()) { 
    if (face_scanner.hasNextFloat()) { 
     float curr = face_scanner.nextFloat(); 
    } else { 
     String s = face_scanner.next(); 
    } 
} 

Pour mon exemple de fichier avec 22402 lignes, cela prend plus de 2 m inutes. Est-il possible de le faire en quelques secondes ou même moins? 2 minutes c'est beaucoup trop pour moi.

+0

Indice: vous pouvez utiliser la fonction 'split' de la classe String à la place. – CKing

+0

Les performances de' split' sont-elles meilleures que celles de 'Scanner'? Parce que j'ai besoin de bonnes performances grâce aux gros fichiers jusqu'à 15Mo. – Flupp

+0

À l'heure actuelle, vous utilisez un scanner pour analyser le fichier comme si vous ne savez pas à quoi il ressemble. "Est-ce un flotteur? Puis lisez un flotteur". Mais vous avez un format de données très spécifique. Par exemple, si une ligne commence par 'vertex', alors vous savez qu'elle sera suivie de trois nombres à virgule flottante. Utilisez cette connaissance pour créer un analyseur beaucoup plus déterministe; J'utiliserais simplement BufferedReader pour parcourir le fichier ligne par ligne moi-même et cela a toujours bien fonctionné pour moi, y compris l'analyse des fichiers dans les gigaoctets. – Gimby

Répondre

0

Antlr serait une bonne alternative; Il a de bonnes caractéristiques de performance/mémoire, et toute la tokenisation de bas niveau est gérée par vous.

Il y a une grammaire here (Disclaimer: Je suis l'auteur) pour le format STL ASCII.

Cela fait partie d'un plus grand projet qui a un modèle Java STL, voir here (Disclaimer: Je suis l'auteur de cela aussi). Un test rapide montre un temps d'analyse de 5,5 secondes pour un fichier STL d'environ 19 Mo.