1

我得到了以下 .stl 文件,我想解析并提取坐标:

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

facetendfacet标签可以根据需要重复。

这是我尝试过的:

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

face_scanner.next()不会导致我想要得到以下结果:

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...

编辑:我现在尝试了以下内容:

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();
    }
}

对于我的包含 22402 行的示例文件,这需要 2 分钟以上。是否有可能在几秒钟甚至更短的时间内完成?2分钟对我来说太多了。

4

1 回答 1

0

Antlr 将是一个不错的选择;它具有良好的性能/内存特性,所有低级标记化都由您处理。

这里有一个 STL ASCII 格式的语法(免责声明:我是作者)。

它是一个具有 Java STL 模型的大型项目的一部分,请参见此处(免责声明:我也是该模型的作者)。快速测试显示约 19MB STL 文件的解析时间为 5.5 秒。

于 2017-09-19T23:11:07.040 回答