Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbubnikv <bubnikv@gmail.com>2019-09-05 15:29:34 +0300
committerbubnikv <bubnikv@gmail.com>2019-09-05 15:29:34 +0300
commit07798510fc8ea2150a80ccd00efd7b63d151314d (patch)
tree71cacb74740e26146f1bbcc1c8afdb08adaddd67 /src/admesh
parent326eb5e3438d91f81dc03546679519c5b91b7bc5 (diff)
Fighting the ASCII STL import.
Fix of 2.1.0-rc: Loading MMU STL's results in object placement off the plater (#2868) It has been broken with 9abef2241d188d0cc0892bc3070d7360749c2702 when trying to fix "Error on importing stl" #2813
Diffstat (limited to 'src/admesh')
-rw-r--r--src/admesh/stlinit.cpp29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/admesh/stlinit.cpp b/src/admesh/stlinit.cpp
index f37c4af07..bbf6d3dd5 100644
--- a/src/admesh/stlinit.cpp
+++ b/src/admesh/stlinit.cpp
@@ -162,24 +162,31 @@ static bool stl_read(stl_file *stl, FILE *fp, int first_facet, bool first)
// Read a single facet from an ASCII .STL file
// skip solid/endsolid
// (in this order, otherwise it won't work when they are paired in the middle of a file)
- fscanf(fp, "endsolid %*[^\n]\n");
- fscanf(fp, "solid %*[^\n]\n"); // name might contain spaces so %*s doesn't work and it also can be empty (just "solid")
+ fscanf(fp, " endsolid%*[^\n]\n");
+ fscanf(fp, " solid%*[^\n]\n"); // name might contain spaces so %*s doesn't work and it also can be empty (just "solid")
// Leading space in the fscanf format skips all leading white spaces including numerous new lines and tabs.
- int res_normal = fscanf(fp, " facet normal %31s %31s %31s ", normal_buf[0], normal_buf[1], normal_buf[2]);
+ int res_normal = fscanf(fp, " facet normal %31s %31s %31s", normal_buf[0], normal_buf[1], normal_buf[2]);
assert(res_normal == 3);
- int res_outer_loop = fscanf(fp, " outer loop ");
+ int res_outer_loop = fscanf(fp, " outer loop");
assert(res_outer_loop == 0);
- int res_vertex1 = fscanf(fp, " vertex %f %f %f ", &facet.vertex[0](0), &facet.vertex[0](1), &facet.vertex[0](2));
+ int res_vertex1 = fscanf(fp, " vertex %f %f %f", &facet.vertex[0](0), &facet.vertex[0](1), &facet.vertex[0](2));
assert(res_vertex1 == 3);
- int res_vertex2 = fscanf(fp, " vertex %f %f %f ", &facet.vertex[1](0), &facet.vertex[1](1), &facet.vertex[1](2));
+ int res_vertex2 = fscanf(fp, " vertex %f %f %f", &facet.vertex[1](0), &facet.vertex[1](1), &facet.vertex[1](2));
assert(res_vertex2 == 3);
+ // Trailing whitespace is there to eat all whitespaces and empty lines up to the next non-whitespace.
int res_vertex3 = fscanf(fp, " vertex %f %f %f ", &facet.vertex[2](0), &facet.vertex[2](1), &facet.vertex[2](2));
assert(res_vertex3 == 3);
- int res_endloop = fscanf(fp, " endloop %*[^\n]\n");
- assert(res_endloop == 0);
- // There is a leading and trailing white space around endfacet to eat up all leading and trailing white spaces including numerous tabs and new lines.
- int res_endfacet = fscanf(fp, " endfacet %*[^\n]\n");
- if (res_normal != 3 || res_outer_loop != 0 || res_vertex1 != 3 || res_vertex2 != 3 || res_vertex3 != 3 || res_endloop != 0 || res_endfacet != 0) {
+ // Some G-code generators tend to produce text after "endloop" and "endfacet". Just ignore it.
+ char buf[2048];
+ fgets(buf, 2047, fp);
+ bool endloop_ok = strncmp(buf, "endloop", 7) == 0 && (buf[7] == '\n' || buf[7] == ' ' || buf[7] == '\t');
+ assert(endloop_ok);
+ // Skip the trailing whitespaces and empty lines.
+ fscanf(fp, " ");
+ fgets(buf, 2047, fp);
+ bool endfacet_ok = strncmp(buf, "endfacet", 8) == 0 && (buf[8] == '\n' || buf[8] == ' ' || buf[8] == '\t');
+ assert(endfacet_ok);
+ if (res_normal != 3 || res_outer_loop != 0 || res_vertex1 != 3 || res_vertex2 != 3 || res_vertex3 != 3 || ! endloop_ok || ! endfacet_ok) {
BOOST_LOG_TRIVIAL(error) << "Something is syntactically very wrong with this ASCII STL! ";
return false;
}