diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/CGALEvaluator.cc | 35 | ||||
-rw-r--r-- | src/CGAL_Nef_polyhedron.cc | 13 | ||||
-rw-r--r-- | src/CGAL_Nef_polyhedron.h | 4 | ||||
-rw-r--r-- | src/PolySetCGALEvaluator.cc | 2 | ||||
-rw-r--r-- | src/builtin.cc | 86 | ||||
-rw-r--r-- | src/builtin.h | 47 | ||||
-rw-r--r-- | src/cgaladv.cc | 16 | ||||
-rw-r--r-- | src/color.cc | 2 | ||||
-rw-r--r-- | src/context.cc | 37 | ||||
-rw-r--r-- | src/control.cc | 13 | ||||
-rw-r--r-- | src/csgops.cc | 6 | ||||
-rw-r--r-- | src/dxfdim.cc | 5 | ||||
-rw-r--r-- | src/func.cc | 64 | ||||
-rw-r--r-- | src/import.cc | 11 | ||||
-rw-r--r-- | src/lexer.l | 9 | ||||
-rw-r--r-- | src/linearextrude.cc | 14 | ||||
-rw-r--r-- | src/mainwin.cc | 17 | ||||
-rw-r--r-- | src/module.cc | 29 | ||||
-rw-r--r-- | src/node.cc | 4 | ||||
-rw-r--r-- | src/node.h | 1 | ||||
-rw-r--r-- | src/openscad.cc | 37 | ||||
-rw-r--r-- | src/polyset.cc | 4 | ||||
-rw-r--r-- | src/primitives.cc | 22 | ||||
-rw-r--r-- | src/projection.cc | 2 | ||||
-rw-r--r-- | src/render.cc | 10 | ||||
-rw-r--r-- | src/rotateextrude.cc | 14 | ||||
-rw-r--r-- | src/surface.cc | 10 | ||||
-rw-r--r-- | src/transform.cc | 10 |
28 files changed, 279 insertions, 245 deletions
diff --git a/src/CGALEvaluator.cc b/src/CGALEvaluator.cc index 550f300..797434f 100644 --- a/src/CGALEvaluator.cc +++ b/src/CGALEvaluator.cc @@ -56,20 +56,29 @@ void CGALEvaluator::process(CGAL_Nef_polyhedron &target, const CGAL_Nef_polyhedr if (src.empty()) return; // Empty polyhedron. This can happen for e.g. square([0,0]) if (target.dim != src.dim) return; // If someone tries to e.g. union 2d and 3d objects - switch (op) { - case CGE_UNION: - target += src; - break; - case CGE_INTERSECTION: - target *= src; - break; - case CGE_DIFFERENCE: - target -= src; - break; - case CGE_MINKOWSKI: - target.minkowski(src); - break; + CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); + try { + switch (op) { + case CGE_UNION: + target += src; + break; + case CGE_INTERSECTION: + target *= src; + break; + case CGE_DIFFERENCE: + target -= src; + break; + case CGE_MINKOWSKI: + target.minkowski(src); + break; + } + } + catch (CGAL::Assertion_exception e) { + // union && difference assert triggered by testdata/scad/bugs/rotate-diff-nonmanifold-crash.scad + std::string opstr = op == CGE_UNION ? "union" : op == CGE_INTERSECTION ? "intersection" : op == CGE_DIFFERENCE ? "difference" : op == CGE_MINKOWSKI ? "minkowski" : "UNKNOWN"; + PRINTF("CGAL error in CGAL_Nef_polyhedron's %s operator: %s", opstr.c_str(), e.what()); } + CGAL::set_error_behaviour(old_behaviour); } /*! diff --git a/src/CGAL_Nef_polyhedron.cc b/src/CGAL_Nef_polyhedron.cc index 975c9a4..2538b64 100644 --- a/src/CGAL_Nef_polyhedron.cc +++ b/src/CGAL_Nef_polyhedron.cc @@ -6,8 +6,6 @@ #include "dxfdata.h" #include "dxftess.h" #include <CGAL/minkowski_sum_3.h> -#include <CGAL/assertions_behaviour.h> -#include <CGAL/exceptions.h> CGAL_Nef_polyhedron& CGAL_Nef_polyhedron::operator+=(const CGAL_Nef_polyhedron &other) { @@ -34,15 +32,8 @@ extern CGAL_Nef_polyhedron2 minkowski2(const CGAL_Nef_polyhedron2 &a, const CGAL CGAL_Nef_polyhedron &CGAL_Nef_polyhedron::minkowski(const CGAL_Nef_polyhedron &other) { - CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); - try { - if (this->dim == 2) (*this->p2) = minkowski2(*this->p2, *other.p2); - else if (this->dim == 3) (*this->p3) = CGAL::minkowski_sum_3(*this->p3, *other.p3); - } - catch (CGAL::Assertion_exception e) { - PRINTF("CGAL error in minkowski %s", e.what()); - CGAL::set_error_behaviour(old_behaviour); - } + if (this->dim == 2) (*this->p2) = minkowski2(*this->p2, *other.p2); + else if (this->dim == 3) (*this->p3) = CGAL::minkowski_sum_3(*this->p3, *other.p3); return *this; } diff --git a/src/CGAL_Nef_polyhedron.h b/src/CGAL_Nef_polyhedron.h index 79d36b7..fda4bc5 100644 --- a/src/CGAL_Nef_polyhedron.h +++ b/src/CGAL_Nef_polyhedron.h @@ -1,8 +1,6 @@ #ifndef CGAL_NEF_POLYHEDRON_H_ #define CGAL_NEF_POLYHEDRON_H_ -#ifdef ENABLE_CGAL - #include "cgalfwd.h" #include "memory.h" @@ -29,6 +27,4 @@ public: shared_ptr<CGAL_Nef_polyhedron3> p3; }; -#endif /* ENABLE_CGAL */ - #endif diff --git a/src/PolySetCGALEvaluator.cc b/src/PolySetCGALEvaluator.cc index 190d75a..ddb9771 100644 --- a/src/PolySetCGALEvaluator.cc +++ b/src/PolySetCGALEvaluator.cc @@ -262,7 +262,7 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const LinearExtrudeNode &node) if (v->modinst->tag_background) continue; CGAL_Nef_polyhedron N = this->cgalevaluator.evaluateCGALMesh(*v); if (N.dim != 2) { - PRINT("ERROR: rotate_extrude() is not defined for 3D child objects!"); + PRINT("ERROR: linear_extrude() is not defined for 3D child objects!"); } else { if (sum.empty()) sum = N.copy(); 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 ae526f2..bc096e5 100644 --- a/src/builtin.h +++ b/src/builtin.h @@ -4,26 +4,31 @@ #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); #endif 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 b4983f6..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); } @@ -193,3 +182,23 @@ std::string Context::getAbsolutePath(const std::string &filename) const return filename; } } + +void register_builtin(Context &ctx) +{ + 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)); + ctx.set_variable("$t", Value(0.0)); + + Value zero3; + zero3.type = Value::VECTOR; + zero3.append(new Value(0.0)); + zero3.append(new Value(0.0)); + zero3.append(new Value(0.0)); + ctx.set_variable("$vpt", zero3); + ctx.set_variable("$vpr", zero3); + + ctx.set_constant("PI",Value(M_PI)); +} 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 d86a60d..880823d 100644 --- a/src/import.cc +++ b/src/import.cc @@ -236,7 +236,7 @@ std::string ImportNode::toString() const stream << "(file = \"" << this->filename << "\", " "cache = \"" << std::hex << (int)st.st_mtime << "." << (int)st.st_size << "\", " "layer = \"" << this->layername << "\", " - "origin = [ " << std::dec << this->origin_x << " " << this->origin_y << " ], " + "origin = [" << std::dec << this->origin_x << ", " << this->origin_y << "], " "scale = " << this->scale << ", " "convexity = " << this->convexity << ", " "$fn = " << this->fn << ", $fa = " << this->fa << ", $fs = " << this->fs << ")"; @@ -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/lexer.l b/src/lexer.l index d9ccd76..2760b07 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -88,7 +88,8 @@ QString filepath; %x comment string %x include -DIGIT [0-9] +D [0-9] +E [Ee][+-]?{D}+ %% @@ -155,8 +156,10 @@ use[ \t\r\n>]*"<"[^\t\r\n>]+">" { "false" return TOK_FALSE; "undef" return TOK_UNDEF; -{DIGIT}+|{DIGIT}*\.{DIGIT}+|{DIGIT}+\.{DIGIT}* { parserlval.number = QString(yytext).toDouble(); return TOK_NUMBER; } -"$"?[a-zA-Z0-9_]+ { parserlval.text = strdup(yytext); return TOK_ID; } +{D}+{E}? | +{D}*\.{D}+{E}? | +{D}+\.{D}*{E}? { parserlval.number = QString(yytext).toDouble(); return TOK_NUMBER; } +"$"?[a-zA-Z0-9_]+ { parserlval.text = strdup(yytext); return TOK_ID; } \" { BEGIN(string); stringcontents = new QString(); } <string>{ diff --git a/src/linearextrude.cc b/src/linearextrude.cc index 9c3557b..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) { @@ -146,7 +140,7 @@ std::string LinearExtrudeNode::toString() const "file = \"" << this->filename << "\", " "cache = \"" << QFileInfo(QString::fromStdString(this->filename)) << "\", " "layer = \"" << this->layername << "\", " - "origin = [ " << this->origin_x << " " << this->origin_y << " ], " + "origin = [" << this->origin_x << ", " << this->origin_y << "], " "scale = " << this->scale << ", "; } stream << @@ -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/mainwin.cc b/src/mainwin.cc index 9944f67..a6f5be6 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -143,22 +143,7 @@ MainWindow::MainWindow(const QString &filename) { setupUi(this); - root_ctx.functions_p = &builtin_functions; - root_ctx.modules_p = &builtin_modules; - root_ctx.set_variable("$fn", Value(0.0)); - root_ctx.set_variable("$fs", Value(1.0)); - root_ctx.set_variable("$fa", Value(12.0)); - root_ctx.set_variable("$t", Value(0.0)); - - root_ctx.set_constant("PI",Value(M_PI)); - - Value zero3; - zero3.type = Value::VECTOR; - zero3.append(new Value(0.0)); - zero3.append(new Value(0.0)); - zero3.append(new Value(0.0)); - root_ctx.set_variable("$vpt", zero3); - root_ctx.set_variable("$vpr", zero3); + register_builtin(root_ctx); root_module = NULL; absolute_root_node = NULL; 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/node.cc b/src/node.cc index 12a7ca4..a4d70be 100644 --- a/src/node.cc +++ b/src/node.cc @@ -78,7 +78,9 @@ std::string AbstractIntersectionNode::toString() const std::string AbstractIntersectionNode::name() const { - return "intersection_for"; + // We write intersection here since the module will have to be evaluated + // before we get here and it will not longer retain the intersection_for parameters + return "intersection"; } void AbstractNode::progress_prepare() @@ -38,7 +38,6 @@ public: /*! Should return a PolySet of the given geometry. Returns NULL if smth. goes wrong */ virtual class PolySet *evaluate_polyset(class PolySetEvaluator *) const { return NULL; } - // FIXME: Make return value a reference const std::vector<AbstractNode*> &getChildren() const { return this->children; } diff --git a/src/openscad.cc b/src/openscad.cc index 4ff250d..d708a8e 100644 --- a/src/openscad.cc +++ b/src/openscad.cc @@ -70,7 +70,7 @@ namespace po = boost::program_options; static void help(const char *progname) { - fprintf(stderr, "Usage: %s [ { -o output_file } [ -d deps_file ] ]\\\n" + fprintf(stderr, "Usage: %s [ -o output_file [ -d deps_file ] ]\\\n" "%*s[ -m make_command ] [ -D var=val [..] ] filename\n", progname, int(strlen(progname))+8, ""); exit(1); @@ -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; @@ -134,6 +134,8 @@ int main(int argc, char **argv) ("help,h", "help message") ("version,v", "print the version") ("o,o", po::value<string>(), "out-file") + ("s,s", po::value<string>(), "stl-file") + ("x,x", po::value<string>(), "dxf-file") ("d,d", po::value<string>(), "deps-file") ("m,m", po::value<string>(), "makefile") ("D,D", po::value<vector<string> >(), "var=val"); @@ -160,6 +162,16 @@ int main(int argc, char **argv) if (output_file) help(argv[0]); output_file = vm["o"].as<string>().c_str(); } + if (vm.count("s")) { + fprintf(stderr, "DEPRECATED: The -s option is deprecated. Use -o instead.\n"); + if (output_file) help(argv[0]); + output_file = vm["s"].as<string>().c_str(); + } + if (vm.count("x")) { + fprintf(stderr, "DEPRECATED: The -x option is deprecated. Use -o instead.\n"); + if (output_file) help(argv[0]); + output_file = vm["x"].as<string>().c_str(); + } if (vm.count("d")) { if (deps_output_file) help(argv[0]); @@ -260,21 +272,7 @@ int main(int argc, char **argv) #ifdef ENABLE_CGAL Context root_ctx; - root_ctx.functions_p = &builtin_functions; - root_ctx.modules_p = &builtin_modules; - root_ctx.set_variable("$fn", Value(0.0)); - root_ctx.set_variable("$fs", Value(1.0)); - root_ctx.set_variable("$fa", Value(12.0)); - root_ctx.set_variable("$t", Value(0.0)); - - Value zero3; - zero3.type = Value::VECTOR; - zero3.append(new Value(0.0)); - zero3.append(new Value(0.0)); - zero3.append(new Value(0.0)); - root_ctx.set_variable("$vpt", zero3); - root_ctx.set_variable("$vpr", zero3); - + register_builtin(root_ctx); AbstractModule *root_module; ModuleInstantiation root_inst; @@ -422,8 +420,7 @@ int main(int argc, char **argv) exit(1); } - destroy_builtin_functions(); - destroy_builtin_modules(); + Builtins::instance(true); return rc; } diff --git a/src/polyset.cc b/src/polyset.cc index 1d31005..742e425 100644 --- a/src/polyset.cc +++ b/src/polyset.cc @@ -27,10 +27,6 @@ #include "polyset.h" // FIXME: Reenable/rewrite - don't be dependant on GUI // #include "Preferences.h" -#ifdef ENABLE_CGAL -#include <CGAL/assertions_behaviour.h> -#include <CGAL/exceptions.h> -#endif #include "linalg.h" #include <Eigen/LU> #include <QColor> 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 4d6de73..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) { @@ -124,7 +118,7 @@ std::string RotateExtrudeNode::toString() const "file = \"" << this->filename << "\", " "cache = \"" << QFileInfo(QString::fromStdString(this->filename)) << "\", " "layer = \"" << this->layername << "\", " - "origin = [ " << std::dec << this->origin_x << " " << this->origin_y << " ], " + "origin = [" << std::dec << this->origin_x << ", " << this->origin_y << "], " "scale = " << this->scale << ", "; } stream << @@ -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)); } |