Clifford Wolf:

Added support for importing binary STL files



git-svn-id: http://svn.clifford.at/openscad/trunk@103 b57f626f-c46c-0410-a088-ec61d464b74c
stl_dim
clifford 2009-10-14 13:22:59 +00:00
parent 6a12327e2a
commit beaf3351ee
3 changed files with 519 additions and 33 deletions

12
examples/example012.scad Normal file
View File

@ -0,0 +1,12 @@
// example012.stl is Mblock.stl, (c) 2009 Will Langford
// licensed under the Creative Commons - GNU GPL license.
// http://www.thingiverse.com/thing:753
difference()
{
sphere(20);
translate([ -2.92 0.5 +20 ]) rotate([180 0 180])
import_stl("example012.stl", convexity = 5);
}

450
examples/example012.stl Normal file
View File

@ -0,0 +1,450 @@
solid ascii
facet normal 0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex 3.422440e+000 -1.067730e+001 5.000000e+000
vertex 6.347434e+000 -1.067730e+001 5.000000e+000
vertex 3.422440e+000 8.281660e+000 5.000000e+000
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex 3.422440e+000 8.281660e+000 5.000000e+000
vertex 6.347434e+000 -1.067730e+001 5.000000e+000
vertex 6.347434e+000 1.133150e+001 5.000000e+000
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex 2.280978e+000 1.133150e+001 5.000000e+000
vertex 3.422440e+000 8.281660e+000 5.000000e+000
vertex 6.347434e+000 1.133150e+001 5.000000e+000
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex 2.280978e+000 1.133150e+001 5.000000e+000
vertex -3.033951e+000 -9.213713e-001 5.000000e+000
vertex 3.422440e+000 8.281660e+000 5.000000e+000
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex 3.422440e+000 8.281660e+000 5.000000e+000
vertex -3.033951e+000 -9.213713e-001 5.000000e+000
vertex -2.320538e+000 -4.613285e+000 5.000000e+000
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -2.320538e+000 -4.613285e+000 5.000000e+000
vertex -3.033951e+000 -9.213713e-001 5.000000e+000
vertex -4.104071e+000 -4.613285e+000 5.000000e+000
endloop
endfacet
facet normal 0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex -4.104071e+000 -4.613285e+000 5.000000e+000
vertex -3.033951e+000 -9.213713e-001 5.000000e+000
vertex -9.793542e+000 8.281660e+000 5.000000e+000
endloop
endfacet
facet normal -0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex -9.793542e+000 8.281660e+000 5.000000e+000
vertex -3.033951e+000 -9.213713e-001 5.000000e+000
vertex -8.527233e+000 1.133150e+001 5.000000e+000
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -1.252235e+001 1.133150e+001 5.000000e+000
vertex -9.793542e+000 8.281660e+000 5.000000e+000
vertex -8.527233e+000 1.133150e+001 5.000000e+000
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -1.252235e+001 1.133150e+001 5.000000e+000
vertex -1.252235e+001 -1.067730e+001 5.000000e+000
vertex -9.793542e+000 8.281660e+000 5.000000e+000
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -9.793542e+000 8.281660e+000 5.000000e+000
vertex -1.252235e+001 -1.067730e+001 5.000000e+000
vertex -9.793542e+000 -1.067730e+001 5.000000e+000
endloop
endfacet
facet normal 0.000000e+000 -1.000000e+000 0.000000e+000
outer loop
vertex -1.252235e+001 1.133150e+001 1.500000e+001
vertex -1.252235e+001 1.133150e+001 5.000000e+000
vertex -8.527233e+000 1.133150e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 -1.000000e+000 -0.000000e+000
outer loop
vertex -8.527233e+000 1.133150e+001 1.500000e+001
vertex -1.252235e+001 1.133150e+001 5.000000e+000
vertex -8.527233e+000 1.133150e+001 5.000000e+000
endloop
endfacet
facet normal -9.124922e-001 -4.090940e-001 -0.000000e+000
outer loop
vertex -8.527233e+000 1.133150e+001 1.500000e+001
vertex -8.527233e+000 1.133150e+001 5.000000e+000
vertex -3.033951e+000 -9.213713e-001 1.500000e+001
endloop
endfacet
facet normal -9.124922e-001 -4.090940e-001 0.000000e+000
outer loop
vertex -3.033951e+000 -9.213713e-001 1.500000e+001
vertex -8.527233e+000 1.133150e+001 5.000000e+000
vertex -3.033951e+000 -9.213713e-001 5.000000e+000
endloop
endfacet
facet normal 9.174094e-001 -3.979447e-001 0.000000e+000
outer loop
vertex -3.033951e+000 -9.213713e-001 1.500000e+001
vertex -3.033951e+000 -9.213713e-001 5.000000e+000
vertex 2.280978e+000 1.133150e+001 1.500000e+001
endloop
endfacet
facet normal 9.174094e-001 -3.979447e-001 0.000000e+000
outer loop
vertex 2.280978e+000 1.133150e+001 1.500000e+001
vertex -3.033951e+000 -9.213713e-001 5.000000e+000
vertex 2.280978e+000 1.133150e+001 5.000000e+000
endloop
endfacet
facet normal 0.000000e+000 -1.000000e+000 0.000000e+000
outer loop
vertex 2.280978e+000 1.133150e+001 1.500000e+001
vertex 2.280978e+000 1.133150e+001 5.000000e+000
vertex 6.347434e+000 1.133150e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 -1.000000e+000 -0.000000e+000
outer loop
vertex 6.347434e+000 1.133150e+001 1.500000e+001
vertex 2.280978e+000 1.133150e+001 5.000000e+000
vertex 6.347434e+000 1.133150e+001 5.000000e+000
endloop
endfacet
facet normal -1.000000e+000 -0.000000e+000 -0.000000e+000
outer loop
vertex 6.347434e+000 1.133150e+001 1.500000e+001
vertex 6.347434e+000 1.133150e+001 5.000000e+000
vertex 6.347434e+000 -1.067730e+001 1.500000e+001
endloop
endfacet
facet normal -1.000000e+000 -0.000000e+000 -0.000000e+000
outer loop
vertex 6.347434e+000 -1.067730e+001 1.500000e+001
vertex 6.347434e+000 1.133150e+001 5.000000e+000
vertex 6.347434e+000 -1.067730e+001 5.000000e+000
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 0.000000e+000
outer loop
vertex 6.347434e+000 -1.067730e+001 1.500000e+001
vertex 6.347434e+000 -1.067730e+001 5.000000e+000
vertex 3.422440e+000 -1.067730e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 0.000000e+000
outer loop
vertex 3.422440e+000 -1.067730e+001 1.500000e+001
vertex 6.347434e+000 -1.067730e+001 5.000000e+000
vertex 3.422440e+000 -1.067730e+001 5.000000e+000
endloop
endfacet
facet normal 1.000000e+000 -0.000000e+000 0.000000e+000
outer loop
vertex 3.422440e+000 -1.067730e+001 1.500000e+001
vertex 3.422440e+000 -1.067730e+001 5.000000e+000
vertex 3.422440e+000 8.281660e+000 1.500000e+001
endloop
endfacet
facet normal 1.000000e+000 -0.000000e+000 0.000000e+000
outer loop
vertex 3.422440e+000 8.281660e+000 1.500000e+001
vertex 3.422440e+000 -1.067730e+001 5.000000e+000
vertex 3.422440e+000 8.281660e+000 5.000000e+000
endloop
endfacet
facet normal -9.134987e-001 4.068417e-001 0.000000e+000
outer loop
vertex 3.422440e+000 8.281660e+000 1.500000e+001
vertex 3.422440e+000 8.281660e+000 5.000000e+000
vertex -2.320538e+000 -4.613285e+000 1.500000e+001
endloop
endfacet
facet normal -9.134987e-001 4.068417e-001 0.000000e+000
outer loop
vertex -2.320538e+000 -4.613285e+000 1.500000e+001
vertex 3.422440e+000 8.281660e+000 5.000000e+000
vertex -2.320538e+000 -4.613285e+000 5.000000e+000
endloop
endfacet
facet normal -4.979881e-016 1.000000e+000 0.000000e+000
outer loop
vertex -2.320538e+000 -4.613285e+000 1.500000e+001
vertex -2.320538e+000 -4.613285e+000 5.000000e+000
vertex -4.104071e+000 -4.613285e+000 1.500000e+001
endloop
endfacet
facet normal -4.979881e-016 1.000000e+000 0.000000e+000
outer loop
vertex -4.104071e+000 -4.613285e+000 1.500000e+001
vertex -2.320538e+000 -4.613285e+000 5.000000e+000
vertex -4.104071e+000 -4.613285e+000 5.000000e+000
endloop
endfacet
facet normal 9.149041e-001 4.036714e-001 0.000000e+000
outer loop
vertex -4.104071e+000 -4.613285e+000 1.500000e+001
vertex -4.104071e+000 -4.613285e+000 5.000000e+000
vertex -9.793542e+000 8.281660e+000 1.500000e+001
endloop
endfacet
facet normal 9.149041e-001 4.036714e-001 0.000000e+000
outer loop
vertex -9.793542e+000 8.281660e+000 1.500000e+001
vertex -4.104071e+000 -4.613285e+000 5.000000e+000
vertex -9.793542e+000 8.281660e+000 5.000000e+000
endloop
endfacet
facet normal -1.000000e+000 -0.000000e+000 -0.000000e+000
outer loop
vertex -9.793542e+000 8.281660e+000 1.500000e+001
vertex -9.793542e+000 8.281660e+000 5.000000e+000
vertex -9.793542e+000 -1.067730e+001 1.500000e+001
endloop
endfacet
facet normal -1.000000e+000 -0.000000e+000 -0.000000e+000
outer loop
vertex -9.793542e+000 -1.067730e+001 1.500000e+001
vertex -9.793542e+000 8.281660e+000 5.000000e+000
vertex -9.793542e+000 -1.067730e+001 5.000000e+000
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 0.000000e+000
outer loop
vertex -9.793542e+000 -1.067730e+001 1.500000e+001
vertex -9.793542e+000 -1.067730e+001 5.000000e+000
vertex -1.252235e+001 -1.067730e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 0.000000e+000
outer loop
vertex -1.252235e+001 -1.067730e+001 1.500000e+001
vertex -9.793542e+000 -1.067730e+001 5.000000e+000
vertex -1.252235e+001 -1.067730e+001 5.000000e+000
endloop
endfacet
facet normal 1.000000e+000 -0.000000e+000 0.000000e+000
outer loop
vertex -1.252235e+001 -1.067730e+001 1.500000e+001
vertex -1.252235e+001 -1.067730e+001 5.000000e+000
vertex -1.252235e+001 1.133150e+001 1.500000e+001
endloop
endfacet
facet normal 1.000000e+000 -0.000000e+000 0.000000e+000
outer loop
vertex -1.252235e+001 1.133150e+001 1.500000e+001
vertex -1.252235e+001 -1.067730e+001 5.000000e+000
vertex -1.252235e+001 1.133150e+001 5.000000e+000
endloop
endfacet
facet normal 1.000000e+000 -0.000000e+000 0.000000e+000
outer loop
vertex 1.156780e+001 -1.469280e+001 1.500000e+001
vertex 1.156780e+001 -1.469280e+001 0.000000e+000
vertex 1.156780e+001 1.530720e+001 1.500000e+001
endloop
endfacet
facet normal 1.000000e+000 -0.000000e+000 0.000000e+000
outer loop
vertex 1.156780e+001 1.530720e+001 1.500000e+001
vertex 1.156780e+001 -1.469280e+001 0.000000e+000
vertex 1.156780e+001 1.530720e+001 0.000000e+000
endloop
endfacet
facet normal 1.184238e-016 -1.000000e+000 0.000000e+000
outer loop
vertex -1.843220e+001 -1.469280e+001 1.500000e+001
vertex -1.843220e+001 -1.469280e+001 0.000000e+000
vertex 1.156780e+001 -1.469280e+001 1.500000e+001
endloop
endfacet
facet normal 1.184238e-016 -1.000000e+000 0.000000e+000
outer loop
vertex 1.156780e+001 -1.469280e+001 1.500000e+001
vertex -1.843220e+001 -1.469280e+001 0.000000e+000
vertex 1.156780e+001 -1.469280e+001 0.000000e+000
endloop
endfacet
facet normal -1.000000e+000 -1.184238e-016 -0.000000e+000
outer loop
vertex -1.843220e+001 1.530720e+001 1.500000e+001
vertex -1.843220e+001 1.530720e+001 0.000000e+000
vertex -1.843220e+001 -1.469280e+001 1.500000e+001
endloop
endfacet
facet normal -1.000000e+000 -1.184238e-016 0.000000e+000
outer loop
vertex -1.843220e+001 -1.469280e+001 1.500000e+001
vertex -1.843220e+001 1.530720e+001 0.000000e+000
vertex -1.843220e+001 -1.469280e+001 0.000000e+000
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 0.000000e+000
outer loop
vertex 1.156780e+001 1.530720e+001 1.500000e+001
vertex 1.156780e+001 1.530720e+001 0.000000e+000
vertex -1.843220e+001 1.530720e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 0.000000e+000
outer loop
vertex -1.843220e+001 1.530720e+001 1.500000e+001
vertex 1.156780e+001 1.530720e+001 0.000000e+000
vertex -1.843220e+001 1.530720e+001 0.000000e+000
endloop
endfacet
facet normal 0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex -1.252235e+001 -1.067730e+001 1.500000e+001
vertex -1.252235e+001 1.133150e+001 1.500000e+001
vertex -1.843220e+001 1.530720e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex -1.843220e+001 -1.469280e+001 1.500000e+001
vertex -1.252235e+001 -1.067730e+001 1.500000e+001
vertex -1.843220e+001 1.530720e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex -1.843220e+001 -1.469280e+001 1.500000e+001
vertex -9.793542e+000 -1.067730e+001 1.500000e+001
vertex -1.252235e+001 -1.067730e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex -1.843220e+001 -1.469280e+001 1.500000e+001
vertex 1.156780e+001 -1.469280e+001 1.500000e+001
vertex -9.793542e+000 -1.067730e+001 1.500000e+001
endloop
endfacet
facet normal -0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex -9.793542e+000 -1.067730e+001 1.500000e+001
vertex 1.156780e+001 -1.469280e+001 1.500000e+001
vertex 3.422440e+000 -1.067730e+001 1.500000e+001
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -2.320538e+000 -4.613285e+000 1.500000e+001
vertex 3.422440e+000 -1.067730e+001 1.500000e+001
vertex 3.422440e+000 8.281660e+000 1.500000e+001
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -2.320538e+000 -4.613285e+000 1.500000e+001
vertex -9.793542e+000 -1.067730e+001 1.500000e+001
vertex 3.422440e+000 -1.067730e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -2.320538e+000 -4.613285e+000 1.500000e+001
vertex -4.104071e+000 -4.613285e+000 1.500000e+001
vertex -9.793542e+000 -1.067730e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex -9.793542e+000 -1.067730e+001 1.500000e+001
vertex -4.104071e+000 -4.613285e+000 1.500000e+001
vertex -9.793542e+000 8.281660e+000 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex -3.033951e+000 -9.213713e-001 1.500000e+001
vertex 2.280978e+000 1.133150e+001 1.500000e+001
vertex -8.527233e+000 1.133150e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -8.527233e+000 1.133150e+001 1.500000e+001
vertex 2.280978e+000 1.133150e+001 1.500000e+001
vertex 1.156780e+001 1.530720e+001 1.500000e+001
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -1.843220e+001 1.530720e+001 1.500000e+001
vertex -8.527233e+000 1.133150e+001 1.500000e+001
vertex 1.156780e+001 1.530720e+001 1.500000e+001
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -1.843220e+001 1.530720e+001 1.500000e+001
vertex -1.252235e+001 1.133150e+001 1.500000e+001
vertex -8.527233e+000 1.133150e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex 2.280978e+000 1.133150e+001 1.500000e+001
vertex 6.347434e+000 1.133150e+001 1.500000e+001
vertex 1.156780e+001 1.530720e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex 1.156780e+001 1.530720e+001 1.500000e+001
vertex 6.347434e+000 1.133150e+001 1.500000e+001
vertex 6.347434e+000 -1.067730e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex 1.156780e+001 -1.469280e+001 1.500000e+001
vertex 6.347434e+000 -1.067730e+001 1.500000e+001
vertex 3.422440e+000 -1.067730e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex 1.156780e+001 -1.469280e+001 1.500000e+001
vertex 1.156780e+001 1.530720e+001 1.500000e+001
vertex 6.347434e+000 -1.067730e+001 1.500000e+001
endloop
endfacet
facet normal 0.000000e+000 -0.000000e+000 -1.000000e+000
outer loop
vertex -1.843220e+001 1.530720e+001 0.000000e+000
vertex 1.156780e+001 1.530720e+001 0.000000e+000
vertex -1.843220e+001 -1.469280e+001 0.000000e+000
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
outer loop
vertex -1.843220e+001 -1.469280e+001 0.000000e+000
vertex 1.156780e+001 1.530720e+001 0.000000e+000
vertex 1.156780e+001 -1.469280e+001 0.000000e+000
endloop
endfacet
endsolid

View File

@ -75,43 +75,67 @@ 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;
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 (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]);
}
}
}
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);
}
}
}