mirror of https://github.com/vitalif/openscad
Clifford Wolf:
Added support for ASCII stl files git-svn-id: http://svn.clifford.at/openscad/trunk@102 b57f626f-c46c-0410-a088-ec61d464b74cstl_dim
parent
114618fc6b
commit
6a12327e2a
|
@ -0,0 +1,139 @@
|
|||
/*
|
||||
* OpenSCAD (www.openscad.at)
|
||||
* Copyright (C) 2009 Clifford Wolf <clifford@clifford.at>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#define INCLUDE_ABSTRACT_NODE_DETAILS
|
||||
|
||||
#include "openscad.h"
|
||||
|
||||
#include <QFile>
|
||||
|
||||
enum import_type_e {
|
||||
TYPE_STL,
|
||||
TYPE_OFF
|
||||
};
|
||||
|
||||
class ImportModule : public AbstractModule
|
||||
{
|
||||
public:
|
||||
import_type_e type;
|
||||
ImportModule(import_type_e type) : type(type) { }
|
||||
virtual AbstractNode *evaluate(const Context *ctx, const ModuleInstanciation *inst) const;
|
||||
};
|
||||
|
||||
class ImportNode : public AbstractPolyNode
|
||||
{
|
||||
public:
|
||||
import_type_e type;
|
||||
QString filename;
|
||||
int convexity;
|
||||
ImportNode(const ModuleInstanciation *mi, import_type_e type) : AbstractPolyNode(mi), type(type) { }
|
||||
virtual PolySet *render_polyset(render_mode_e mode) const;
|
||||
virtual QString dump(QString indent) const;
|
||||
};
|
||||
|
||||
AbstractNode *ImportModule::evaluate(const Context *ctx, const ModuleInstanciation *inst) const
|
||||
{
|
||||
ImportNode *node = new ImportNode(inst, type);
|
||||
|
||||
QVector<QString> argnames = QVector<QString>() << "filename" << "convexity";
|
||||
QVector<Expression*> argexpr;
|
||||
|
||||
Context c(ctx);
|
||||
c.args(argnames, argexpr, inst->argnames, inst->argvalues);
|
||||
|
||||
node->filename = c.lookup_variable("filename").text;
|
||||
node->convexity = c.lookup_variable("convexity").num;
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
void register_builtin_import()
|
||||
{
|
||||
builtin_modules["import_stl"] = new ImportModule(TYPE_STL);
|
||||
builtin_modules["import_off"] = new ImportModule(TYPE_OFF);
|
||||
}
|
||||
|
||||
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())
|
||||
{
|
||||
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]);
|
||||
}
|
||||
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 (type == TYPE_OFF)
|
||||
{
|
||||
PRINTF("WARNING: OFF import is not implemented yet.");
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
QString ImportNode::dump(QString indent) const
|
||||
{
|
||||
if (dump_cache.isEmpty()) {
|
||||
QString text;
|
||||
if (type == TYPE_STL)
|
||||
text.sprintf("import_stl(filename = \"%s\");\n", filename.toAscii().data());
|
||||
if (type == TYPE_OFF)
|
||||
text.sprintf("import_off(filename = \"%s\");\n", filename.toAscii().data());
|
||||
((AbstractNode*)this)->dump_cache = indent + QString("n%1: ").arg(idx) + text;
|
||||
}
|
||||
return dump_cache;
|
||||
}
|
||||
|
|
@ -192,6 +192,7 @@ void initialize_builtin_modules()
|
|||
register_builtin_surface();
|
||||
register_builtin_control();
|
||||
register_builtin_render();
|
||||
register_builtin_import();
|
||||
register_builtin_dxf_linear_extrude();
|
||||
register_builtin_dxf_rotate_extrude();
|
||||
}
|
||||
|
|
|
@ -386,6 +386,7 @@ extern void register_builtin_primitives();
|
|||
extern void register_builtin_surface();
|
||||
extern void register_builtin_control();
|
||||
extern void register_builtin_render();
|
||||
extern void register_builtin_import();
|
||||
extern void register_builtin_dxf_linear_extrude();
|
||||
extern void register_builtin_dxf_rotate_extrude();
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ SOURCES += openscad.cc mainwin.cc glview.cc
|
|||
SOURCES += value.cc expr.cc func.cc module.cc context.cc
|
||||
SOURCES += csgterm.cc polyset.cc csgops.cc transform.cc
|
||||
SOURCES += primitives.cc surface.cc control.cc render.cc
|
||||
SOURCES += dxfdata.cc dxftess.cc dxfdim.cc
|
||||
SOURCES += import.cc dxfdata.cc dxftess.cc dxfdim.cc
|
||||
SOURCES += dxflinextrude.cc dxfrotextrude.cc
|
||||
|
||||
QMAKE_CXXFLAGS += -O0
|
||||
|
|
Loading…
Reference in New Issue