summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Kintel <marius@kintel.net>2013-01-28 22:58:36 (GMT)
committerMarius Kintel <marius@kintel.net>2013-01-28 22:58:36 (GMT)
commitc08760519354f9a65a8950d0f482d34180e8b376 (patch)
tree30136683b315941af0333e99b57e20681121fd8e
parente565414de17fcbb895ada1d0e760d4b4526d013a (diff)
Support reading binary STLs which happen to start with the string 'solid'. Fixes #258
-rw-r--r--src/import.cc17
-rw-r--r--testdata/scad/features/import_bin_solid.stlbin0 -> 2384 bytes
-rw-r--r--testdata/scad/templates/import_stl-tests-template.scad2
-rw-r--r--tests/regression/cgalpngtest/import_stl-tests-expected.pngbin5758 -> 10193 bytes
-rw-r--r--tests/regression/dumptest/import_stl-tests-expected.txt3
-rw-r--r--tests/regression/opencsgtest/import_stl-tests-expected.pngbin6207 -> 10720 bytes
-rw-r--r--tests/regression/throwntogethertest/import_stl-tests-expected.pngbin6207 -> 10720 bytes
7 files changed, 20 insertions, 2 deletions
diff --git a/src/import.cc b/src/import.cc
index 40d34fa..6a6d925 100644
--- a/src/import.cc
+++ b/src/import.cc
@@ -119,7 +119,8 @@ PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const
if (this->type == TYPE_STL)
{
handle_dep((std::string)this->filename);
- std::ifstream f(this->filename.c_str(), std::ios::in | std::ios::binary);
+ // Open file and position at the end
+ std::ifstream f(this->filename.c_str(), std::ios::in | std::ios::binary | std::ios::ate);
if (!f.good()) {
PRINTB("WARNING: Can't open import file '%s'.", this->filename);
return p;
@@ -132,9 +133,20 @@ PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const
boost::regex ex_vertex("vertex");
boost::regex ex_vertices("\\s*vertex\\s+([^\\s]+)\\s+([^\\s]+)\\s+([^\\s]+)");
+ bool binary = false;
+ int file_size = f.tellg();
+ f.seekg(80);
+ if (!f.eof()) {
+ int facenum = 0;
+ // FIXME: Assumes little endian
+ f.read((char *)&facenum, sizeof(int));
+ if (file_size == 80 + 4 + 50*facenum) binary = true;
+ }
+ f.seekg(0);
+
char data[5];
f.read(data, 5);
- if (!f.eof() && !memcmp(data, "solid", 5)) {
+ if (!binary && !f.eof() && !memcmp(data, "solid", 5)) {
int i = 0;
double vdata[3][3];
std::string line;
@@ -174,6 +186,7 @@ PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const
else
{
f.ignore(80-5+4);
+ // FIXME: Assumes little endian
while (1) {
#ifdef _MSC_VER
#pragma pack(push,1)
diff --git a/testdata/scad/features/import_bin_solid.stl b/testdata/scad/features/import_bin_solid.stl
new file mode 100644
index 0000000..c1886db
--- /dev/null
+++ b/testdata/scad/features/import_bin_solid.stl
Binary files differ
diff --git a/testdata/scad/templates/import_stl-tests-template.scad b/testdata/scad/templates/import_stl-tests-template.scad
index 685b868..2cc886d 100644
--- a/testdata/scad/templates/import_stl-tests-template.scad
+++ b/testdata/scad/templates/import_stl-tests-template.scad
@@ -1,4 +1,6 @@
import_stl("import.stl");
translate([2,0,0]) import("import.stl");
translate([4,0,0]) import("import_bin.stl");
+// Test binary STLs which happen to start with the string "solid"
+translate([0,4,0]) import("import_bin_solid.stl");
translate([0,2,0]) import("@CMAKE_SOURCE_DIR@/../testdata/scad/features/import.stl");
diff --git a/tests/regression/cgalpngtest/import_stl-tests-expected.png b/tests/regression/cgalpngtest/import_stl-tests-expected.png
index de7638a..c6a4b2d 100644
--- a/tests/regression/cgalpngtest/import_stl-tests-expected.png
+++ b/tests/regression/cgalpngtest/import_stl-tests-expected.png
Binary files differ
diff --git a/tests/regression/dumptest/import_stl-tests-expected.txt b/tests/regression/dumptest/import_stl-tests-expected.txt
index 947f137..0d46a6f 100644
--- a/tests/regression/dumptest/import_stl-tests-expected.txt
+++ b/tests/regression/dumptest/import_stl-tests-expected.txt
@@ -5,6 +5,9 @@
multmatrix([[1, 0, 0, 4], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
import(file = "import_bin.stl", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2);
}
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 4], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ import(file = "import_bin_solid.stl", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2);
+ }
multmatrix([[1, 0, 0, 0], [0, 1, 0, 2], [0, 0, 1, 0], [0, 0, 0, 1]]) {
import(file = "import.stl", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2);
}
diff --git a/tests/regression/opencsgtest/import_stl-tests-expected.png b/tests/regression/opencsgtest/import_stl-tests-expected.png
index 0bd9ab6..583f3f6 100644
--- a/tests/regression/opencsgtest/import_stl-tests-expected.png
+++ b/tests/regression/opencsgtest/import_stl-tests-expected.png
Binary files differ
diff --git a/tests/regression/throwntogethertest/import_stl-tests-expected.png b/tests/regression/throwntogethertest/import_stl-tests-expected.png
index 0bd9ab6..583f3f6 100644
--- a/tests/regression/throwntogethertest/import_stl-tests-expected.png
+++ b/tests/regression/throwntogethertest/import_stl-tests-expected.png
Binary files differ
contact: Jan Huwald // Impressum