diff options
author | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2009-10-14 13:22:59 (GMT) |
---|---|---|
committer | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2009-10-14 13:22:59 (GMT) |
commit | beaf3351eee8bc27cca814d106f4f20334a5b85d (patch) | |
tree | 17b19c30fc8db6823afb8af1eade35a876066b82 /import.cc | |
parent | 6a12327e2a07440dc9f2204a37abdbc10d8a5236 (diff) |
Clifford Wolf:
Added support for importing binary STL files
git-svn-id: http://svn.clifford.at/openscad/trunk@103 b57f626f-c46c-0410-a088-ec61d464b74c
Diffstat (limited to 'import.cc')
-rw-r--r-- | import.cc | 88 |
1 files changed, 56 insertions, 32 deletions
@@ -75,45 +75,69 @@ PolySet *ImportNode::render_polyset(render_mode_e) const PolySet *p = new PolySet(); p->convexity = convexity; - QFile f(filename); - if (!f.open(QIODevice::ReadOnly | QIODevice::Text)) { - PRINTF("WARNING: Can't open import file `%s'.", filename.toAscii().data()); - return p; - } - if (type == TYPE_STL) { - int i = 0; - double vdata[3][3]; - QRegExp splitre = QRegExp("\\s*(vertex)?\\s+"); - while (!f.atEnd()) + QFile f(filename); + if (!f.open(QIODevice::ReadOnly)) { + PRINTF("WARNING: Can't open import file `%s'.", filename.toAscii().data()); + return p; + } + + QByteArray data = f.read(5); + if (data.size() == 5 && QString(data) == QString("solid")) { - QString line = QString(f.readLine()).remove("\n"); - if (line.contains("solid") || line.contains("facet") || line.contains("endloop")) - continue; - if (line.contains("outer loop")) { - i = 0; - continue; - } - if (line.contains("vertex")) { - QStringList tokens = line.split(splitre); - bool ok[3] = { false, false, false }; - if (tokens.size() == 4) { - vdata[i][0] = tokens[1].toDouble(&ok[0]); - vdata[i][1] = tokens[2].toDouble(&ok[1]); - vdata[i][2] = tokens[3].toDouble(&ok[2]); + int i = 0; + double vdata[3][3]; + QRegExp splitre = QRegExp("\\s*(vertex)?\\s+"); + f.readLine(); + while (!f.atEnd()) + { + QString line = QString(f.readLine()).remove("\n").remove("\r"); + if (line.contains("solid") || line.contains("facet") || line.contains("endloop")) + continue; + if (line.contains("outer loop")) { + i = 0; + continue; } - if (!ok[0] || !ok[1] || !ok[2]) { - PRINTF("WARNING: Can't parse vertex line `%s'.", line.toAscii().data()); - i = 10; - } else if (++i == 3) { - p->append_poly(); - p->append_vertex(vdata[0][0], vdata[0][1], vdata[0][2]); - p->append_vertex(vdata[1][0], vdata[1][1], vdata[1][2]); - p->append_vertex(vdata[2][0], vdata[2][1], vdata[2][2]); + if (line.contains("vertex")) { + QStringList tokens = line.split(splitre); + bool ok[3] = { false, false, false }; + if (tokens.size() == 4) { + vdata[i][0] = tokens[1].toDouble(&ok[0]); + vdata[i][1] = tokens[2].toDouble(&ok[1]); + vdata[i][2] = tokens[3].toDouble(&ok[2]); + } + if (!ok[0] || !ok[1] || !ok[2]) { + PRINTF("WARNING: Can't parse vertex line `%s'.", line.toAscii().data()); + i = 10; + } else if (++i == 3) { + p->append_poly(); + p->append_vertex(vdata[0][0], vdata[0][1], vdata[0][2]); + p->append_vertex(vdata[1][0], vdata[1][1], vdata[1][2]); + p->append_vertex(vdata[2][0], vdata[2][1], vdata[2][2]); + } } } } + else + { + f.read(80-4+4); + while (1) { + struct { + float i, j, k; + float x1, y1, z1; + float x2, y2, z2; + float x3, y3, z3; + unsigned short acount; + } __attribute__ ((packed)) data; + if (f.read((char*)&data, sizeof(data)) != sizeof(data)) + break; + p->append_poly(); + p->append_vertex(data.x1, data.y1, data.z1); + p->append_vertex(data.x2, data.y2, data.z2); + p->append_vertex(data.x3, data.y3, data.z3); + } + } } if (type == TYPE_OFF) |