summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordon bright <hugh.m.bright@gmail.com>2011-11-06 18:19:09 (GMT)
committerdon bright <hugh.m.bright@gmail.com>2011-11-06 18:19:09 (GMT)
commit8baead275affe384e2344bbbff78b046c08c8812 (patch)
tree63d741c40631a6c6f1b42a598a672a19844f9f72
parent31a97f34e1122690cbad2c9bf01f3ede6d3da135 (diff)
parent6bb261bcd5922c69770c27d25f43c7c315c101a4 (diff)
Merge remote-tracking branch 'upstream/master'
-rw-r--r--.gitignore12
-rw-r--r--doc/TODO.txt2
-rw-r--r--openscad.pro1
-rw-r--r--src/builtin.cc86
-rw-r--r--src/builtin.h45
-rw-r--r--src/cgaladv.cc16
-rw-r--r--src/color.cc2
-rw-r--r--src/context.cc21
-rw-r--r--src/control.cc13
-rw-r--r--src/csgops.cc6
-rw-r--r--src/dxfdim.cc5
-rw-r--r--src/func.cc64
-rw-r--r--src/import.cc9
-rw-r--r--src/linearextrude.cc12
-rw-r--r--src/module.cc29
-rw-r--r--src/openscad.cc7
-rw-r--r--src/primitives.cc22
-rw-r--r--src/projection.cc2
-rw-r--r--src/render.cc10
-rw-r--r--src/rotateextrude.cc12
-rw-r--r--src/surface.cc10
-rw-r--r--src/transform.cc10
-rw-r--r--src/value.cc1
-rw-r--r--tests/.gitignore17
-rw-r--r--tests/CMakeLists.txt1
-rw-r--r--tests/cgalpngtest.cc6
-rw-r--r--tests/cgaltest.cc7
-rw-r--r--tests/csgtermtest.cc6
-rw-r--r--tests/csgtestcore.cc6
-rw-r--r--tests/csgtexttest.cc6
-rw-r--r--tests/dumptest.cc11
-rw-r--r--tests/echotest.cc7
32 files changed, 259 insertions, 205 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3d0c520
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,12 @@
+*.scad
+*.dmg
+*.tar*
+Makefile
+objects
+*.stl
+*.dxf
+lexer_lex.cpp
+parser_yacc.cpp
+parser_yacc.h
+tmp
+OpenSCAD.app \ No newline at end of file
diff --git a/doc/TODO.txt b/doc/TODO.txt
index c869681..7df6a4d 100644
--- a/doc/TODO.txt
+++ b/doc/TODO.txt
@@ -52,6 +52,7 @@ o Preferences
- OpenGL params
- Default language feature settings
- Make the library search path configurable?
+ - Turn on/off caching (advanced)
o MDI
- Think about how to do MDI the right way
- Ctrl-W should close the current dialog, not the current main window
@@ -117,6 +118,7 @@ o Misc
- If trying to export STL/DXF but source is newer than the CGAL rendering, ask
for confirmation.
- Go through keyboard shortcuts and make them more conformant to platform standards
+ - Show design info/stats (sizes, caches etc.)
o Cmd-line
- Add verbose option (PRINT command from mainwin.cc and progress output)
diff --git a/openscad.pro b/openscad.pro
index 89df95d..ebe5d46 100644
--- a/openscad.pro
+++ b/openscad.pro
@@ -223,6 +223,7 @@ SOURCES += src/openscad.cc \
src/func.cc \
src/module.cc \
src/node.cc \
+ src/builtin.cc \
src/context.cc \
src/csgterm.cc \
src/polyset.cc \
diff --git a/src/builtin.cc b/src/builtin.cc
new file mode 100644
index 0000000..6eb32b6
--- /dev/null
+++ b/src/builtin.cc
@@ -0,0 +1,86 @@
+#include "builtin.h"
+#include "function.h"
+#include "module.h"
+#include <boost/foreach.hpp>
+
+Builtins *Builtins::instance(bool erase)
+{
+ static Builtins *s_builtins = new Builtins;
+ if (erase) {
+ delete s_builtins;
+ s_builtins = NULL;
+ }
+ return s_builtins;
+}
+
+void Builtins::init(const char *name, class AbstractModule *module)
+{
+ Builtins::instance()->builtinmodules[name] = module;
+}
+
+void Builtins::init(const char *name, class AbstractFunction *function)
+{
+ Builtins::instance()->builtinfunctions[name] = function;
+}
+
+extern void register_builtin_functions();
+extern void register_builtin_csgops();
+extern void register_builtin_transform();
+extern void register_builtin_color();
+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_projection();
+extern void register_builtin_cgaladv();
+extern void register_builtin_dxf_linear_extrude();
+extern void register_builtin_dxf_rotate_extrude();
+extern void initialize_builtin_dxf_dim();
+
+/*!
+ Registers all builtin functions.
+ Call once for the whole app.
+*/
+void Builtins::initialize()
+{
+ register_builtin_functions();
+ initialize_builtin_dxf_dim();
+
+ init("group", new AbstractModule());
+
+ register_builtin_csgops();
+ register_builtin_transform();
+ register_builtin_color();
+ register_builtin_primitives();
+ register_builtin_surface();
+ register_builtin_control();
+ register_builtin_render();
+ register_builtin_import();
+ register_builtin_projection();
+ register_builtin_cgaladv();
+ register_builtin_dxf_linear_extrude();
+ register_builtin_dxf_rotate_extrude();
+
+ this->deprecations["dxf_linear_extrude"] = "linear_extrude";
+ this->deprecations["dxf_rotate_extrude"] = "rotate_extrude";
+ this->deprecations["import_stl"] = "import";
+ this->deprecations["import_dxf"] = "import";
+ this->deprecations["import_off"] = "import";
+}
+
+std::string Builtins::isDeprecated(const std::string &name)
+{
+ if (this->deprecations.find(name) != this->deprecations.end()) {
+ return this->deprecations[name];
+ }
+ return std::string();
+}
+
+Builtins::~Builtins()
+{
+ BOOST_FOREACH(FunctionContainer::value_type &f, this->builtinfunctions) delete f.second;
+ this->builtinfunctions.clear();
+ BOOST_FOREACH(ModuleContainer::value_type &m, this->builtinmodules) delete m.second;
+ this->builtinmodules.clear();
+}
diff --git a/src/builtin.h b/src/builtin.h
index 643966b..bc096e5 100644
--- a/src/builtin.h
+++ b/src/builtin.h
@@ -4,27 +4,30 @@
#include <string>
#include <boost/unordered_map.hpp>
-extern boost::unordered_map<std::string, class AbstractFunction*> builtin_functions;
-extern void initialize_builtin_functions();
-extern void destroy_builtin_functions();
-
-extern boost::unordered_map<std::string, class AbstractModule*> builtin_modules;
-extern void initialize_builtin_modules();
-extern void destroy_builtin_modules();
-
-extern void register_builtin_csgops();
-extern void register_builtin_transform();
-extern void register_builtin_color();
-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_projection();
-extern void register_builtin_cgaladv();
-extern void register_builtin_dxf_linear_extrude();
-extern void register_builtin_dxf_rotate_extrude();
-extern void initialize_builtin_dxf_dim();
+class Builtins
+{
+public:
+ typedef boost::unordered_map<std::string, class AbstractFunction*> FunctionContainer;
+ typedef boost::unordered_map<std::string, class AbstractModule*> ModuleContainer;
+
+ static Builtins *instance(bool erase = false);
+ static void init(const char *name, class AbstractModule *module);
+ static void init(const char *name, class AbstractFunction *function);
+ void initialize();
+ std::string isDeprecated(const std::string &name);
+
+ const FunctionContainer &functions() { return this->builtinfunctions; }
+ const ModuleContainer &modules() { return this->builtinmodules; }
+
+private:
+ Builtins() { }
+ ~Builtins();
+
+ FunctionContainer builtinfunctions;
+ ModuleContainer builtinmodules;
+
+ boost::unordered_map<std::string, std::string> deprecations;
+};
extern void register_builtin(class Context &ctx);
diff --git a/src/cgaladv.cc b/src/cgaladv.cc
index c83e18b..9abf87c 100644
--- a/src/cgaladv.cc
+++ b/src/cgaladv.cc
@@ -97,14 +97,6 @@ PolySet *CgaladvNode::evaluate_polyset(PolySetEvaluator *ps) const
return ps->evaluatePolySet(*this);
}
-void register_builtin_cgaladv()
-{
- builtin_modules["minkowski"] = new CgaladvModule(MINKOWSKI);
- builtin_modules["glide"] = new CgaladvModule(GLIDE);
- builtin_modules["subdiv"] = new CgaladvModule(SUBDIV);
- builtin_modules["hull"] = new CgaladvModule(HULL);
-}
-
std::string CgaladvNode::name() const
{
switch (this->type) {
@@ -149,3 +141,11 @@ std::string CgaladvNode::toString() const
return stream.str();
}
+
+void register_builtin_cgaladv()
+{
+ Builtins::init("minkowski", new CgaladvModule(MINKOWSKI));
+ Builtins::init("glide", new CgaladvModule(GLIDE));
+ Builtins::init("subdiv", new CgaladvModule(SUBDIV));
+ Builtins::init("hull", new CgaladvModule(HULL));
+}
diff --git a/src/color.cc b/src/color.cc
index 3c6942c..304ccc1 100644
--- a/src/color.cc
+++ b/src/color.cc
@@ -101,5 +101,5 @@ std::string ColorNode::name() const
void register_builtin_color()
{
- builtin_modules["color"] = new ColorModule();
+ Builtins::init("color", new ColorModule());
}
diff --git a/src/context.cc b/src/context.cc
index 47b8a78..bd97f8f 100644
--- a/src/context.cc
+++ b/src/context.cc
@@ -150,20 +150,9 @@ AbstractNode *Context::evaluate_module(const ModuleInstantiation &inst) const
{
if (this->modules_p && this->modules_p->find(inst.modname) != this->modules_p->end()) {
AbstractModule *m = this->modules_p->find(inst.modname)->second;
- if (m == builtin_modules["dxf_linear_extrude"]) {
- PRINTF("DEPRECATED: The dxf_linear_extrude() module will be removed in future releases. Use a linear_extrude() instead.");
- }
- else if (m == builtin_modules["dxf_rotate_extrude"]) {
- PRINTF("DEPRECATED: The dxf_rotate_extrude() module will be removed in future releases. Use a rotate_extrude() instead.");
- }
- else if (m == builtin_modules["import_stl"]) {
- PRINTF("DEPRECATED: The import_stl() module will be removed in future releases. Use import() instead.");
- }
- else if (m == builtin_modules["import_dxf"]) {
- PRINTF("DEPRECATED: The import_dxf() module will be removed in future releases. Use import() instead.");
- }
- else if (m == builtin_modules["import_off"]) {
- PRINTF("DEPRECATED: The import_off() module will be removed in future releases. Use import() instead.");
+ std::string replacement = Builtins::instance()->isDeprecated(inst.modname);
+ if (!replacement.empty()) {
+ PRINTF("DEPRECATED: The %s() module will be removed in future releases. Use %s() instead.", inst.modname.c_str(), replacement.c_str());
}
return m->evaluate(this, &inst);
}
@@ -196,8 +185,8 @@ std::string Context::getAbsolutePath(const std::string &filename) const
void register_builtin(Context &ctx)
{
- ctx.functions_p = &builtin_functions;
- ctx.modules_p = &builtin_modules;
+ ctx.functions_p = &Builtins::instance()->functions();
+ ctx.modules_p = &Builtins::instance()->modules();
ctx.set_variable("$fn", Value(0.0));
ctx.set_variable("$fs", Value(1.0));
ctx.set_variable("$fa", Value(12.0));
diff --git a/src/control.cc b/src/control.cc
index 1f79254..2275c79 100644
--- a/src/control.cc
+++ b/src/control.cc
@@ -169,11 +169,10 @@ AbstractNode *ControlModule::evaluate(const Context*, const ModuleInstantiation
void register_builtin_control()
{
- builtin_modules["child"] = new ControlModule(CHILD);
- builtin_modules["echo"] = new ControlModule(ECHO);
- builtin_modules["assign"] = new ControlModule(ASSIGN);
- builtin_modules["for"] = new ControlModule(FOR);
- builtin_modules["intersection_for"] = new ControlModule(INT_FOR);
- builtin_modules["if"] = new ControlModule(IF);
+ Builtins::init("child", new ControlModule(CHILD));
+ Builtins::init("echo", new ControlModule(ECHO));
+ Builtins::init("assign", new ControlModule(ASSIGN));
+ Builtins::init("for", new ControlModule(FOR));
+ Builtins::init("intersection_for", new ControlModule(INT_FOR));
+ Builtins::init("if", new ControlModule(IF));
}
-
diff --git a/src/csgops.cc b/src/csgops.cc
index 7b363f0..7524559 100644
--- a/src/csgops.cc
+++ b/src/csgops.cc
@@ -72,8 +72,8 @@ std::string CsgNode::name() const
void register_builtin_csgops()
{
- builtin_modules["union"] = new CsgModule(CSG_TYPE_UNION);
- builtin_modules["difference"] = new CsgModule(CSG_TYPE_DIFFERENCE);
- builtin_modules["intersection"] = new CsgModule(CSG_TYPE_INTERSECTION);
+ Builtins::init("union", new CsgModule(CSG_TYPE_UNION));
+ Builtins::init("difference", new CsgModule(CSG_TYPE_DIFFERENCE));
+ Builtins::init("intersection", new CsgModule(CSG_TYPE_INTERSECTION));
}
diff --git a/src/dxfdim.cc b/src/dxfdim.cc
index 7b016f1..c696226 100644
--- a/src/dxfdim.cc
+++ b/src/dxfdim.cc
@@ -194,7 +194,6 @@ Value builtin_dxf_cross(const Context *ctx, const std::vector<std::string> &argn
void initialize_builtin_dxf_dim()
{
- builtin_functions["dxf_dim"] = new BuiltinFunction(&builtin_dxf_dim);
- builtin_functions["dxf_cross"] = new BuiltinFunction(&builtin_dxf_cross);
+ Builtins::init("dxf_dim", new BuiltinFunction(&builtin_dxf_dim));
+ Builtins::init("dxf_cross", new BuiltinFunction(&builtin_dxf_cross));
}
-
diff --git a/src/func.cc b/src/func.cc
index b011a27..a9d5948 100644
--- a/src/func.cc
+++ b/src/func.cc
@@ -33,7 +33,6 @@
#include "mathc99.h"
#include <algorithm>
#include "stl-utils.h"
-#include <boost/foreach.hpp>
AbstractFunction::~AbstractFunction()
{
@@ -81,9 +80,6 @@ std::string Function::dump(const std::string &indent, const std::string &name) c
return dump.str();
}
-typedef boost::unordered_map<std::string, AbstractFunction*> BuiltinContainer;
-BuiltinContainer builtin_functions;
-
BuiltinFunction::~BuiltinFunction()
{
}
@@ -375,38 +371,30 @@ Value builtin_version_num(const Context *ctx, const std::vector<std::string>& ca
return Value(y * 10000 + m * 100 + d);
}
-void initialize_builtin_functions()
-{
- builtin_functions["abs"] = new BuiltinFunction(&builtin_abs);
- builtin_functions["sign"] = new BuiltinFunction(&builtin_sign);
- builtin_functions["rands"] = new BuiltinFunction(&builtin_rands);
- builtin_functions["min"] = new BuiltinFunction(&builtin_min);
- builtin_functions["max"] = new BuiltinFunction(&builtin_max);
- builtin_functions["sin"] = new BuiltinFunction(&builtin_sin);
- builtin_functions["cos"] = new BuiltinFunction(&builtin_cos);
- builtin_functions["asin"] = new BuiltinFunction(&builtin_asin);
- builtin_functions["acos"] = new BuiltinFunction(&builtin_acos);
- builtin_functions["tan"] = new BuiltinFunction(&builtin_tan);
- builtin_functions["atan"] = new BuiltinFunction(&builtin_atan);
- builtin_functions["atan2"] = new BuiltinFunction(&builtin_atan2);
- builtin_functions["round"] = new BuiltinFunction(&builtin_round);
- builtin_functions["ceil"] = new BuiltinFunction(&builtin_ceil);
- builtin_functions["floor"] = new BuiltinFunction(&builtin_floor);
- builtin_functions["pow"] = new BuiltinFunction(&builtin_pow);
- builtin_functions["sqrt"] = new BuiltinFunction(&builtin_sqrt);
- builtin_functions["exp"] = new BuiltinFunction(&builtin_exp);
- builtin_functions["log"] = new BuiltinFunction(&builtin_log);
- builtin_functions["ln"] = new BuiltinFunction(&builtin_ln);
- builtin_functions["str"] = new BuiltinFunction(&builtin_str);
- builtin_functions["lookup"] = new BuiltinFunction(&builtin_lookup);
- builtin_functions["version"] = new BuiltinFunction(&builtin_version);
- builtin_functions["version_num"] = new BuiltinFunction(&builtin_version_num);
- initialize_builtin_dxf_dim();
-}
-
-void destroy_builtin_functions()
-{
- BOOST_FOREACH(BuiltinContainer::value_type &f, builtin_functions) delete f.second;
-//std::for_each(builtin_functions.begin(), builtin_functions.end(), del_fun<AbstractFunction>());
- builtin_functions.clear();
+void register_builtin_functions()
+{
+ Builtins::init("abs", new BuiltinFunction(&builtin_abs));
+ Builtins::init("sign", new BuiltinFunction(&builtin_sign));
+ Builtins::init("rands", new BuiltinFunction(&builtin_rands));
+ Builtins::init("min", new BuiltinFunction(&builtin_min));
+ Builtins::init("max", new BuiltinFunction(&builtin_max));
+ Builtins::init("sin", new BuiltinFunction(&builtin_sin));
+ Builtins::init("cos", new BuiltinFunction(&builtin_cos));
+ Builtins::init("asin", new BuiltinFunction(&builtin_asin));
+ Builtins::init("acos", new BuiltinFunction(&builtin_acos));
+ Builtins::init("tan", new BuiltinFunction(&builtin_tan));
+ Builtins::init("atan", new BuiltinFunction(&builtin_atan));
+ Builtins::init("atan2", new BuiltinFunction(&builtin_atan2));
+ Builtins::init("round", new BuiltinFunction(&builtin_round));
+ Builtins::init("ceil", new BuiltinFunction(&builtin_ceil));
+ Builtins::init("floor", new BuiltinFunction(&builtin_floor));
+ Builtins::init("pow", new BuiltinFunction(&builtin_pow));
+ Builtins::init("sqrt", new BuiltinFunction(&builtin_sqrt));
+ Builtins::init("exp", new BuiltinFunction(&builtin_exp));
+ Builtins::init("log", new BuiltinFunction(&builtin_log));
+ Builtins::init("ln", new BuiltinFunction(&builtin_ln));
+ Builtins::init("str", new BuiltinFunction(&builtin_str));
+ Builtins::init("lookup", new BuiltinFunction(&builtin_lookup));
+ Builtins::init("version", new BuiltinFunction(&builtin_version));
+ Builtins::init("version_num", new BuiltinFunction(&builtin_version_num));
}
diff --git a/src/import.cc b/src/import.cc
index 8a3b0a4..880823d 100644
--- a/src/import.cc
+++ b/src/import.cc
@@ -251,9 +251,8 @@ std::string ImportNode::name() const
void register_builtin_import()
{
- builtin_modules["import_stl"] = new ImportModule(TYPE_STL);
- builtin_modules["import_off"] = new ImportModule(TYPE_OFF);
- builtin_modules["import_dxf"] = new ImportModule(TYPE_DXF);
- builtin_modules["import"] = new ImportModule();
+ Builtins::init("import_stl", new ImportModule(TYPE_STL));
+ Builtins::init("import_off", new ImportModule(TYPE_OFF));
+ Builtins::init("import_dxf", new ImportModule(TYPE_DXF));
+ Builtins::init("import", new ImportModule());
}
-
diff --git a/src/linearextrude.cc b/src/linearextrude.cc
index 019f606..d1d2841 100644
--- a/src/linearextrude.cc
+++ b/src/linearextrude.cc
@@ -114,12 +114,6 @@ AbstractNode *LinearExtrudeModule::evaluate(const Context *ctx, const ModuleInst
return node;
}
-void register_builtin_dxf_linear_extrude()
-{
- builtin_modules["dxf_linear_extrude"] = new LinearExtrudeModule();
- builtin_modules["linear_extrude"] = new LinearExtrudeModule();
-}
-
class PolySet *LinearExtrudeNode::evaluate_polyset(PolySetEvaluator *evaluator) const
{
if (!evaluator) {
@@ -161,3 +155,9 @@ std::string LinearExtrudeNode::toString() const
return stream.str();
}
+
+void register_builtin_dxf_linear_extrude()
+{
+ Builtins::init("dxf_linear_extrude", new LinearExtrudeModule());
+ Builtins::init("linear_extrude", new LinearExtrudeModule());
+}
diff --git a/src/module.cc b/src/module.cc
index 0b17ff7..269e128 100644
--- a/src/module.cc
+++ b/src/module.cc
@@ -29,7 +29,6 @@
#include "context.h"
#include "expression.h"
#include "function.h"
-#include "builtin.h"
#include "printutils.h"
#include <boost/foreach.hpp>
#include <sstream>
@@ -201,31 +200,3 @@ std::string Module::dump(const std::string &indent, const std::string &name) con
}
return dump.str();
}
-
-Module::AbstractModuleContainer builtin_modules;
-
-void initialize_builtin_modules()
-{
- builtin_modules["group"] = new AbstractModule();
-
- register_builtin_csgops();
- register_builtin_transform();
- register_builtin_color();
- register_builtin_primitives();
- register_builtin_surface();
- register_builtin_control();
- register_builtin_render();
- register_builtin_import();
- register_builtin_projection();
- register_builtin_cgaladv();
- register_builtin_dxf_linear_extrude();
- register_builtin_dxf_rotate_extrude();
-}
-
-void destroy_builtin_modules()
-{
- BOOST_FOREACH(Module::AbstractModuleContainer::value_type &m, builtin_modules) {
- delete m.second;
- }
- builtin_modules.clear();
-}
diff --git a/src/openscad.cc b/src/openscad.cc
index 84d6263..678d87a 100644
--- a/src/openscad.cc
+++ b/src/openscad.cc
@@ -101,8 +101,7 @@ int main(int argc, char **argv)
// (which we don't catch). This gives us stack traces without rerunning in gdb.
CGAL::set_error_behaviour(CGAL::ABORT);
#endif
- initialize_builtin_functions();
- initialize_builtin_modules();
+ Builtins::instance()->initialize();
#ifdef Q_WS_X11
// see <http://qt.nokia.com/doc/4.5/qapplication.html#QApplication-2>:
@@ -124,6 +123,7 @@ int main(int argc, char **argv)
QCoreApplication::setOrganizationName("OpenSCAD");
QCoreApplication::setOrganizationDomain("openscad.org");
QCoreApplication::setApplicationName("OpenSCAD");
+ QCoreApplication::setApplicationVersion(TOSTRING(OPENSCAD_VERSION));
const char *filename = NULL;
const char *output_file = NULL;
@@ -408,8 +408,7 @@ int main(int argc, char **argv)
exit(1);
}
- destroy_builtin_functions();
- destroy_builtin_modules();
+ Builtins::instance(true);
return rc;
}
diff --git a/src/primitives.cc b/src/primitives.cc
index a651ff8..b18a816 100644
--- a/src/primitives.cc
+++ b/src/primitives.cc
@@ -236,17 +236,6 @@ AbstractNode *PrimitiveModule::evaluate(const Context *ctx, const ModuleInstanti
return node;
}
-void register_builtin_primitives()
-{
- builtin_modules["cube"] = new PrimitiveModule(CUBE);
- builtin_modules["sphere"] = new PrimitiveModule(SPHERE);
- builtin_modules["cylinder"] = new PrimitiveModule(CYLINDER);
- builtin_modules["polyhedron"] = new PrimitiveModule(POLYHEDRON);
- builtin_modules["square"] = new PrimitiveModule(SQUARE);
- builtin_modules["circle"] = new PrimitiveModule(CIRCLE);
- builtin_modules["polygon"] = new PrimitiveModule(POLYGON);
-}
-
/*!
Returns the number of subdivision of a whole circle, given radius and
the three special variables $fn, $fs and $fa
@@ -606,3 +595,14 @@ std::string PrimitiveNode::toString() const
return stream.str();
}
+
+void register_builtin_primitives()
+{
+ Builtins::init("cube", new PrimitiveModule(CUBE));
+ Builtins::init("sphere", new PrimitiveModule(SPHERE));
+ Builtins::init("cylinder", new PrimitiveModule(CYLINDER));
+ Builtins::init("polyhedron", new PrimitiveModule(POLYHEDRON));
+ Builtins::init("square", new PrimitiveModule(SQUARE));
+ Builtins::init("circle", new PrimitiveModule(CIRCLE));
+ Builtins::init("polygon", new PrimitiveModule(POLYGON));
+}
diff --git a/src/projection.cc b/src/projection.cc
index 1333d19..a712800 100644
--- a/src/projection.cc
+++ b/src/projection.cc
@@ -97,5 +97,5 @@ std::string ProjectionNode::toString() const
void register_builtin_projection()
{
- builtin_modules["projection"] = new ProjectionModule();
+ Builtins::init("projection", new ProjectionModule());
}
diff --git a/src/render.cc b/src/render.cc
index b79fa56..7b0ced5 100644
--- a/src/render.cc
+++ b/src/render.cc
@@ -67,11 +67,6 @@ class PolySet *RenderNode::evaluate_polyset(PolySetEvaluator *ps) const
return ps->evaluatePolySet(*this);
}
-void register_builtin_render()
-{
- builtin_modules["render"] = new RenderModule();
-}
-
std::string RenderNode::toString() const
{
std::stringstream stream;
@@ -80,3 +75,8 @@ std::string RenderNode::toString() const
return stream.str();
}
+
+void register_builtin_render()
+{
+ Builtins::init("render", new RenderModule());
+}
diff --git a/src/rotateextrude.cc b/src/rotateextrude.cc
index 13e5db0..ae8793d 100644
--- a/src/rotateextrude.cc
+++ b/src/rotateextrude.cc
@@ -92,12 +92,6 @@ AbstractNode *RotateExtrudeModule::evaluate(const Context *ctx, const ModuleInst
return node;
}
-void register_builtin_dxf_rotate_extrude()
-{
- builtin_modules["dxf_rotate_extrude"] = new RotateExtrudeModule();
- builtin_modules["rotate_extrude"] = new RotateExtrudeModule();
-}
-
PolySet *RotateExtrudeNode::evaluate_polyset(PolySetEvaluator *evaluator) const
{
if (!evaluator) {
@@ -133,3 +127,9 @@ std::string RotateExtrudeNode::toString() const
return stream.str();
}
+
+void register_builtin_dxf_rotate_extrude()
+{
+ Builtins::init("dxf_rotate_extrude", new RotateExtrudeModule());
+ Builtins::init("rotate_extrude", new RotateExtrudeModule());
+}
diff --git a/src/surface.cc b/src/surface.cc
index 8349afd..cdac4ec 100644
--- a/src/surface.cc
+++ b/src/surface.cc
@@ -92,11 +92,6 @@ AbstractNode *SurfaceModule::evaluate(const Context *ctx, const ModuleInstantiat
return node;
}
-void register_builtin_surface()
-{
- builtin_modules["surface"] = new SurfaceModule();
-}
-
PolySet *SurfaceNode::evaluate_polyset(class PolySetEvaluator *) const
{
handle_dep(filename);
@@ -219,3 +214,8 @@ std::string SurfaceNode::toString() const
return stream.str();
}
+
+void register_builtin_surface()
+{
+ Builtins::init("surface", new SurfaceModule());
+}
diff --git a/src/transform.cc b/src/transform.cc
index eda69c2..f5038b1 100644
--- a/src/transform.cc
+++ b/src/transform.cc
@@ -206,9 +206,9 @@ std::string TransformNode::name() const
void register_builtin_transform()
{
- builtin_modules["scale"] = new TransformModule(SCALE);
- builtin_modules["rotate"] = new TransformModule(ROTATE);
- builtin_modules["mirror"] = new TransformModule(MIRROR);
- builtin_modules["translate"] = new TransformModule(TRANSLATE);
- builtin_modules["multmatrix"] = new TransformModule(MULTMATRIX);
+ Builtins::init("scale", new TransformModule(SCALE));
+ Builtins::init("rotate", new TransformModule(ROTATE));
+ Builtins::init("mirror", new TransformModule(MIRROR));
+ Builtins::init("translate", new TransformModule(TRANSLATE));
+ Builtins::init("multmatrix", new TransformModule(MULTMATRIX));
}
diff --git a/src/value.cc b/src/value.cc
index 44a4b88..6685594 100644
--- a/src/value.cc
+++ b/src/value.cc
@@ -341,7 +341,6 @@ std::string Value::toString() const
switch (this->type) {
case STRING:
- // FIXME: Escape special characters when outputting
stream << '"' << this->text << '"';
break;
case VECTOR:
diff --git a/tests/.gitignore b/tests/.gitignore
new file mode 100644
index 0000000..6b839c5
--- /dev/null
+++ b/tests/.gitignore
@@ -0,0 +1,17 @@
+*-output
+CMakeFiles
+CMakeCache.txt
+CTestTestfile.cmake
+Testing
+cmake_install.cmake
+lexer.cpp
+parser_yacc.c
+cgalpngtest
+cgaltest
+csgtermtest
+csgtexttest
+dumptest
+echotest
+opencsgtest
+throwntogethertest
+yee_compare
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 88b828e..dda4aea 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -192,6 +192,7 @@ set(CORE_SOURCES
../src/func.cc
../src/module.cc
../src/node.cc
+ ../src/builtin.cc
../src/context.cc
../src/csgterm.cc
../src/polyset.cc
diff --git a/tests/cgalpngtest.cc b/tests/cgalpngtest.cc
index 02ee35e..e9e1f7b 100644
--- a/tests/cgalpngtest.cc
+++ b/tests/cgalpngtest.cc
@@ -100,8 +100,7 @@ int main(int argc, char **argv)
const char *filename = argv[1];
const char *outfile = argv[2];
- initialize_builtin_functions();
- initialize_builtin_modules();
+ Builtins::instance()->initialize();
QApplication app(argc, argv, false);
QDir original_path = QDir::current();
@@ -212,8 +211,7 @@ int main(int argc, char **argv)
csgInfo.glview->paintGL();
csgInfo.glview->save(outfile);
- destroy_builtin_functions();
- destroy_builtin_modules();
+ Builtins::instance(true);
return 0;
}
diff --git a/tests/cgaltest.cc b/tests/cgaltest.cc
index 0cbd89a..0b433bf 100644
--- a/tests/cgaltest.cc
+++ b/tests/cgaltest.cc
@@ -84,8 +84,7 @@ int main(int argc, char **argv)
const char *filename = argv[1];
- initialize_builtin_functions();
- initialize_builtin_modules();
+ Builtins::instance()->initialize();
QApplication app(argc, argv, false);
QDir original_path = QDir::current();
@@ -142,8 +141,8 @@ int main(int argc, char **argv)
if (!N.empty()) {
export_stl(&N, std::cout, NULL);
}
- destroy_builtin_functions();
- destroy_builtin_modules();
+
+ Builtins::instance(true);
return 0;
}
diff --git a/tests/csgtermtest.cc b/tests/csgtermtest.cc
index 5268b28..c8fcc6b 100644
--- a/tests/csgtermtest.cc
+++ b/tests/csgtermtest.cc
@@ -69,8 +69,7 @@ int main(int argc, char **argv)
int rc = 0;
- initialize_builtin_functions();
- initialize_builtin_modules();
+ Builtins::instance()->initialize();
QApplication app(argc, argv, false);
QDir original_path = QDir::current();
@@ -145,8 +144,7 @@ int main(int argc, char **argv)
}
outfile.close();
- destroy_builtin_functions();
- destroy_builtin_modules();
+ Builtins::instance(true);
return rc;
}
diff --git a/tests/csgtestcore.cc b/tests/csgtestcore.cc
index 57e397e..034084c 100644
--- a/tests/csgtestcore.cc
+++ b/tests/csgtestcore.cc
@@ -77,8 +77,7 @@ int csgtestcore(int argc, char *argv[], test_type_e test_type)
const char *filename = argv[1];
const char *outfilename = argv[2];
- initialize_builtin_functions();
- initialize_builtin_modules();
+ Builtins::instance()->initialize();
QApplication app(argc, argv, false);
@@ -217,8 +216,7 @@ int csgtestcore(int argc, char *argv[], test_type_e test_type)
csgInfo.glview->save(outfilename);
- destroy_builtin_functions();
- destroy_builtin_modules();
+ Builtins::instance(true);
return 0;
}
diff --git a/tests/csgtexttest.cc b/tests/csgtexttest.cc
index ca28e37..76f6eb1 100644
--- a/tests/csgtexttest.cc
+++ b/tests/csgtexttest.cc
@@ -72,8 +72,7 @@ int main(int argc, char **argv)
int rc = 0;
- initialize_builtin_functions();
- initialize_builtin_modules();
+ Builtins::instance()->initialize();
QApplication app(argc, argv, false);
QDir original_path = QDir::current();
@@ -130,8 +129,7 @@ int main(int argc, char **argv)
outfile << csgcache[*root_node] << "\n";
outfile.close();
- destroy_builtin_functions();
- destroy_builtin_modules();
+ Builtins::instance(true);
return rc;
}
diff --git a/tests/dumptest.cc b/tests/dumptest.cc
index d2fd9b1..5f2f22f 100644
--- a/tests/dumptest.cc
+++ b/tests/dumptest.cc
@@ -65,6 +65,10 @@ string dumptree(const Tree &tree, const AbstractNode &node)
int main(int argc, char **argv)
{
+#ifdef WIN32
+ _set_output_format(_TWO_DIGIT_EXPONENT);
+#endif
+
if (argc != 3) {
fprintf(stderr, "Usage: %s <file.scad> <output.txt>\n", argv[0]);
exit(1);
@@ -75,8 +79,7 @@ int main(int argc, char **argv)
int rc = 0;
- initialize_builtin_functions();
- initialize_builtin_modules();
+ Builtins::instance()->initialize();
QApplication app(argc, argv, false);
QDir original_path = QDir::current();
@@ -159,9 +162,7 @@ int main(int argc, char **argv)
exit(1);
}
-
- destroy_builtin_functions();
- destroy_builtin_modules();
+ Builtins::instance(true);
return rc;
}
diff --git a/tests/echotest.cc b/tests/echotest.cc
index d1d1f9b..5ab9efa 100644
--- a/tests/echotest.cc
+++ b/tests/echotest.cc
@@ -76,8 +76,7 @@ int main(int argc, char **argv)
}
set_output_handler(&outfile_handler, &ofile);
- initialize_builtin_functions();
- initialize_builtin_modules();
+ Builtins::instance()->initialize();
QApplication app(argc, argv, false);
QDir original_path = QDir::current();
@@ -121,9 +120,7 @@ int main(int argc, char **argv)
AbstractNode::resetIndexCounter();
root_node = root_module->evaluate(&root_ctx, &root_inst);
- destroy_builtin_functions();
- destroy_builtin_modules();
-
+ Builtins::instance(true);
ofile.close();
return rc;
}
contact: Jan Huwald // Impressum