diff options
author | Marius Kintel <marius@kintel.net> | 2013-04-18 22:34:14 (GMT) |
---|---|---|
committer | Marius Kintel <marius@kintel.net> | 2013-04-18 22:34:14 (GMT) |
commit | 58bd9c9e3f4454d055bf51d63463a9965a9dcbd7 (patch) | |
tree | 732cd423858685365a4115d44a52f85ae90866a1 | |
parent | 73c2a45af6afca253159d2cf9c1ecf5747f0217e (diff) |
Cleaned up argument list handling, related to #116
-rw-r--r-- | openscad.pro | 3 | ||||
-rw-r--r-- | src/cgaladv.cc | 13 | ||||
-rw-r--r-- | src/color.cc | 7 | ||||
-rw-r--r-- | src/context.cc | 14 | ||||
-rw-r--r-- | src/context.h | 4 | ||||
-rw-r--r-- | src/control.cc | 2 | ||||
-rw-r--r-- | src/evalcontext.cc | 4 | ||||
-rw-r--r-- | src/expr.cc | 13 | ||||
-rw-r--r-- | src/expression.h | 3 | ||||
-rw-r--r-- | src/func.cc | 12 | ||||
-rw-r--r-- | src/function.h | 4 | ||||
-rw-r--r-- | src/import.cc | 10 | ||||
-rw-r--r-- | src/lexer.l | 1 | ||||
-rw-r--r-- | src/linearextrude.cc | 7 | ||||
-rw-r--r-- | src/modcontext.cc | 6 | ||||
-rw-r--r-- | src/module.cc | 28 | ||||
-rw-r--r-- | src/module.h | 11 | ||||
-rw-r--r-- | src/parser.y | 66 | ||||
-rw-r--r-- | src/primitives.cc | 19 | ||||
-rw-r--r-- | src/projection.cc | 7 | ||||
-rw-r--r-- | src/render.cc | 7 | ||||
-rw-r--r-- | src/rotateextrude.cc | 7 | ||||
-rw-r--r-- | src/surface.cc | 7 | ||||
-rw-r--r-- | src/transform.cc | 15 | ||||
-rw-r--r-- | src/typedefs.h | 10 |
25 files changed, 131 insertions, 149 deletions
diff --git a/openscad.pro b/openscad.pro index 00df471..0f3394e 100644 --- a/openscad.pro +++ b/openscad.pro @@ -187,7 +187,8 @@ FORMS += src/MainWindow.ui \ src/AboutDialog.ui \ src/ProgressWidget.ui -HEADERS += src/version_check.h \ +HEADERS += src/typedefs.h \ + src/version_check.h \ src/ProgressWidget.h \ src/parsersettings.h \ src/renderer.h \ diff --git a/src/cgaladv.cc b/src/cgaladv.cc index 8c98ae6..aad3a95 100644 --- a/src/cgaladv.cc +++ b/src/cgaladv.cc @@ -46,23 +46,22 @@ AbstractNode *CgaladvModule::evaluate(const Context *ctx, const ModuleInstantiat { CgaladvNode *node = new CgaladvNode(inst, type); - std::vector<std::string> argnames; - std::vector<Expression*> argexpr; + AssignmentList args; if (type == MINKOWSKI) - argnames += "convexity"; + args += Assignment("convexity", NULL); if (type == GLIDE) - argnames += "path", "convexity"; + args += Assignment("path", NULL), Assignment("convexity", NULL); if (type == SUBDIV) - argnames += "type", "level", "convexity"; + args += Assignment("type", NULL), Assignment("level", NULL), Assignment("convexity", NULL); if (type == RESIZE) - argnames += "newsize", "auto"; + args += Assignment("newsize", NULL), Assignment("auto", NULL); Context c(ctx); - c.setVariables(argnames, argexpr, evalctx); + c.setVariables(args, evalctx); Value convexity, path, subdiv_type, level; diff --git a/src/color.cc b/src/color.cc index 4e9c55d..6c3aaef 100644 --- a/src/color.cc +++ b/src/color.cc @@ -54,13 +54,12 @@ AbstractNode *ColorModule::evaluate(const Context *ctx, const ModuleInstantiatio node->color[0] = node->color[1] = node->color[2] = -1.0; node->color[3] = 1.0; - std::vector<std::string> argnames; - std::vector<Expression*> argexpr; + AssignmentList args; - argnames += "c", "alpha"; + args += Assignment("c", NULL), Assignment("alpha", NULL); Context c(ctx); - c.setVariables(argnames, argexpr, evalctx); + c.setVariables(args, evalctx); Value v = c.lookup_variable("c"); if (v.type() == Value::VECTOR) { diff --git a/src/context.cc b/src/context.cc index 6189205..706407c 100644 --- a/src/context.cc +++ b/src/context.cc @@ -57,13 +57,11 @@ Context::~Context() Initialize context from a module argument list and a evaluation context which may pass variables which will be preferred over default values. */ -void Context::setVariables(const std::vector<std::string> &argnames, - const std::vector<Expression*> &argexpr, +void Context::setVariables(const AssignmentList &args, const EvalContext *evalctx) { - for (size_t i=0; i<argnames.size(); i++) { - set_variable(argnames[i], i < argexpr.size() && argexpr[i] ? - argexpr[i]->evaluate(this->parent) : Value()); + BOOST_FOREACH(const Assignment &arg, args) { + set_variable(arg.first, arg.second ? arg.second->evaluate(this->parent) : Value()); } if (evalctx) { @@ -72,7 +70,7 @@ void Context::setVariables(const std::vector<std::string> &argnames, const std::string &name = evalctx->eval_arguments[i].first; const Value &val = evalctx->eval_arguments[i].second; if (name.empty()) { - if (posarg < argnames.size()) this->set_variable(argnames[posarg++], val); + if (posarg < args.size()) this->set_variable(args[posarg++].first, val); } else { this->set_variable(name, val); } @@ -158,8 +156,8 @@ void Context::dump(const AbstractModule *mod, const ModuleInstantiation *inst) const Module *m = dynamic_cast<const Module*>(mod); if (m) { PRINT(" module args:"); - BOOST_FOREACH(const std::string &arg, m->argnames) { - PRINTB(" %s = %s", arg % variables[arg]); + BOOST_FOREACH(const Assignment &arg, m->definition_arguments) { + PRINTB(" %s = %s", arg.first % variables[arg.first]); } } } diff --git a/src/context.h b/src/context.h index 282a940..51fc45c 100644 --- a/src/context.h +++ b/src/context.h @@ -5,6 +5,7 @@ #include <vector> #include <boost/unordered_map.hpp> #include "value.h" +#include "typedefs.h" class Context { @@ -15,8 +16,7 @@ public: virtual Value evaluate_function(const std::string &name, const class EvalContext *evalctx) const; virtual class AbstractNode *evaluate_module(const class ModuleInstantiation &inst, const EvalContext *evalctx) const; - void setVariables(const std::vector<std::string> &argnames, - const std::vector<class Expression*> &argexpr, + void setVariables(const AssignmentList &args, const class EvalContext *evalctx = NULL); void set_variable(const std::string &name, const Value &value); diff --git a/src/control.cc b/src/control.cc index 446e47e..d47eec0 100644 --- a/src/control.cc +++ b/src/control.cc @@ -140,7 +140,7 @@ AbstractNode *ControlModule::evaluate(const Context *ctx, const ModuleInstantiat { std::stringstream msg; msg << "ECHO: "; - for (size_t i = 0; i < inst->argnames.size(); i++) { + for (size_t i = 0; i < inst->arguments.size(); i++) { if (i > 0) msg << ", "; if (!evalctx->eval_arguments[i].first.empty()) msg << evalctx->eval_arguments[i].first << " = "; msg << evalctx->eval_arguments[i].second; diff --git a/src/evalcontext.cc b/src/evalcontext.cc index 39e5aae..b7566e3 100644 --- a/src/evalcontext.cc +++ b/src/evalcontext.cc @@ -31,8 +31,8 @@ void EvalContext::dump(const AbstractModule *mod, const ModuleInstantiation *ins const Module *m = dynamic_cast<const Module*>(mod); if (m) { PRINT(" module args:"); - BOOST_FOREACH(const std::string &arg, m->argnames) { - PRINTB(" %s = %s", arg % variables[arg]); + BOOST_FOREACH(const Assignment &arg, m->definition_arguments) { + PRINTB(" %s = %s", arg.first % variables[arg.first]); } } } diff --git a/src/expr.cc b/src/expr.cc index 1d7b440..7a8180f 100644 --- a/src/expr.cc +++ b/src/expr.cc @@ -128,9 +128,9 @@ Value Expression::evaluate(const Context *context) const } if (this->type == "F") { EvalContext c(context); - for (size_t i=0; i < this->children.size(); i++) { - c.eval_arguments.push_back(std::make_pair(this->call_argnames[i], - this->children[i]->evaluate(context))); + for (size_t i=0; i < this->call_arguments.size(); i++) { + c.eval_arguments.push_back(std::make_pair(this->call_arguments[i].first, + this->call_arguments[i].second->evaluate(context))); } // Value::VectorType argvalues; // std::transform(this->children.begin(), this->children.end(), @@ -183,10 +183,11 @@ std::string Expression::toString() const } else if (this->type == "F") { stream << this->call_funcname << "("; - for (size_t i=0; i < this->children.size(); i++) { + for (size_t i=0; i < this->call_arguments.size(); i++) { + const Assignment &arg = this->call_arguments[i]; if (i > 0) stream << ", "; - if (!this->call_argnames[i].empty()) stream << this->call_argnames[i] << " = "; - stream << *this->children[i]; + if (!arg.first.empty()) stream << arg.first << " = "; + stream << *arg.second; } stream << ")"; } diff --git a/src/expression.h b/src/expression.h index 2919b78..06becc0 100644 --- a/src/expression.h +++ b/src/expression.h @@ -4,6 +4,7 @@ #include <string> #include <vector> #include "value.h" +#include "typedefs.h" class Expression { @@ -14,7 +15,7 @@ public: std::string var_name; std::string call_funcname; - std::vector<std::string> call_argnames; + AssignmentList call_arguments; // Boolean: ! && || // Operators: * / % + - diff --git a/src/func.cc b/src/func.cc index ecd1f87..f2c9835 100644 --- a/src/func.cc +++ b/src/func.cc @@ -34,6 +34,7 @@ #include <algorithm> #include "stl-utils.h" #include "printutils.h" +#include <boost/foreach.hpp> /* Random numbers @@ -75,14 +76,14 @@ std::string AbstractFunction::dump(const std::string &indent, const std::string Function::~Function() { - std::for_each(this->argexpr.begin(), this->argexpr.end(), del_fun<Expression>()); + BOOST_FOREACH(const Assignment &arg, this->definition_arguments) delete arg.second; delete expr; } Value Function::evaluate(const Context *ctx, const EvalContext *evalctx) const { Context c(ctx); - c.setVariables(argnames, argexpr, evalctx); + c.setVariables(definition_arguments, evalctx); return expr ? expr->evaluate(&c) : Value(); } @@ -90,10 +91,11 @@ std::string Function::dump(const std::string &indent, const std::string &name) c { std::stringstream dump; dump << indent << "function " << name << "("; - for (size_t i=0; i < argnames.size(); i++) { + for (size_t i=0; i < definition_arguments.size(); i++) { + const Assignment &arg = definition_arguments[i]; if (i > 0) dump << ", "; - dump << argnames[i]; - if (argexpr[i]) dump << " = " << *argexpr[i]; + dump << arg.first; + if (arg.second) dump << " = " << *arg.second; } dump << ") = " << *expr << ";\n"; return dump.str(); diff --git a/src/function.h b/src/function.h index bd7c329..a1fde3c 100644 --- a/src/function.h +++ b/src/function.h @@ -2,6 +2,7 @@ #define FUNCTION_H_ #include "value.h" +#include "typedefs.h" #include <string> #include <vector> @@ -29,8 +30,7 @@ public: class Function : public AbstractFunction { public: - std::vector<std::string> argnames; - std::vector<class Expression*> argexpr; + AssignmentList definition_arguments; Expression *expr; diff --git a/src/import.cc b/src/import.cc index 283bbe6..ba42b0a 100644 --- a/src/import.cc +++ b/src/import.cc @@ -65,20 +65,22 @@ public: AbstractNode *ImportModule::evaluate(const Context *ctx, const ModuleInstantiation *inst, const EvalContext *evalctx) const { - std::vector<std::string> argnames; - argnames += "file", "layer", "convexity", "origin", "scale"; - std::vector<Expression*> argexpr; + AssignmentList args; + args += Assignment("file", NULL), Assignment("layer", NULL), Assignment("convexity", NULL), Assignment("origin", NULL), Assignment("scale", NULL); + // FIXME: This is broken. Tag as deprecated and fix // Map old argnames to new argnames for compatibility +#if 0 std::vector<std::string> inst_argnames = inst->argnames; for (size_t i=0; i<inst_argnames.size(); i++) { if (inst_argnames[i] == "filename") inst_argnames[i] = "file"; if (inst_argnames[i] == "layername") inst_argnames[i] = "layer"; } +#endif Context c(ctx); c.setDocumentPath(evalctx->documentPath()); - c.setVariables(argnames, argexpr, evalctx); + c.setVariables(args, evalctx); #if 0 && DEBUG c.dump(this, inst); #endif diff --git a/src/lexer.l b/src/lexer.l index 4dff654..6766abc 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -26,6 +26,7 @@ %{ +#include "typedefs.h" #include "handle_dep.h" #include "printutils.h" #include "parsersettings.h" diff --git a/src/linearextrude.cc b/src/linearextrude.cc index de728f7..f4c1112 100644 --- a/src/linearextrude.cc +++ b/src/linearextrude.cc @@ -52,12 +52,11 @@ AbstractNode *LinearExtrudeModule::evaluate(const Context *ctx, const ModuleInst { LinearExtrudeNode *node = new LinearExtrudeNode(inst); - std::vector<std::string> argnames; - argnames += "file", "layer", "height", "origin", "scale", "center", "twist", "slices"; - std::vector<Expression*> argexpr; + AssignmentList args; + args += Assignment("file", NULL), Assignment("layer", NULL), Assignment("height", NULL), Assignment("origin", NULL), Assignment("scale", NULL), Assignment("center", NULL), Assignment("twist", NULL), Assignment("slices", NULL); Context c(ctx); - c.setVariables(argnames, argexpr, evalctx); + c.setVariables(args, evalctx); node->fn = c.lookup_variable("$fn").toDouble(); node->fs = c.lookup_variable("$fs").toDouble(); diff --git a/src/modcontext.cc b/src/modcontext.cc index 3280108..7d123b8 100644 --- a/src/modcontext.cc +++ b/src/modcontext.cc @@ -26,7 +26,7 @@ ModuleContext::~ModuleContext() void ModuleContext::setModule(const Module &module, const EvalContext *evalctx) { - this->setVariables(module.argnames, module.argexpr, evalctx); + this->setVariables(module.definition_arguments, evalctx); this->evalctx = evalctx; // FIXME: Don't access module members directly @@ -131,8 +131,8 @@ void ModuleContext::dump(const AbstractModule *mod, const ModuleInstantiation *i const Module *m = dynamic_cast<const Module*>(mod); if (m) { PRINT(" module args:"); - BOOST_FOREACH(const std::string &arg, m->argnames) { - PRINTB(" %s = %s", arg % variables[arg]); + BOOST_FOREACH(const Assignment &arg, m->definition_arguments) { + PRINTB(" %s = %s", arg.first % variables[arg.first]); } } } diff --git a/src/module.cc b/src/module.cc index d1e574d..7d83975 100644 --- a/src/module.cc +++ b/src/module.cc @@ -62,8 +62,8 @@ std::string AbstractModule::dump(const std::string &indent, const std::string &n ModuleInstantiation::~ModuleInstantiation() { - BOOST_FOREACH (Expression *v, argexpr) delete v; - BOOST_FOREACH (ModuleInstantiation *v, children) delete v; + BOOST_FOREACH(const Assignment &arg, this->arguments) delete arg.second; + BOOST_FOREACH(ModuleInstantiation *v, children) delete v; } IfElseModuleInstantiation::~IfElseModuleInstantiation() @@ -89,10 +89,11 @@ std::string ModuleInstantiation::dump(const std::string &indent) const std::stringstream dump; dump << indent; dump << modname + "("; - for (size_t i=0; i < argnames.size(); i++) { + for (size_t i=0; i < this->arguments.size(); i++) { + const Assignment &arg = this->arguments[i]; if (i > 0) dump << ", "; - if (!argnames[i].empty()) dump << argnames[i] << " = "; - dump << *argexpr[i]; + if (!arg.first.empty()) dump << arg.first << " = "; + dump << *arg.second; } if (children.size() == 0) { dump << ");\n"; @@ -112,10 +113,10 @@ std::string ModuleInstantiation::dump(const std::string &indent) const AbstractNode *ModuleInstantiation::evaluate_instance(const Context *ctx) const { EvalContext c(ctx); - for (size_t i=0; i<argnames.size(); i++) { - c.eval_arguments.push_back(std::make_pair(argnames[i], - i < argexpr.size() && argexpr[i] ? - argexpr[i]->evaluate(ctx) : + BOOST_FOREACH(const Assignment &arg, this->arguments) { + c.eval_arguments.push_back(std::make_pair(arg.first, + arg.second ? + arg.second->evaluate(ctx) : Value())); } c.children = this->children; @@ -150,7 +151,7 @@ std::vector<AbstractNode*> IfElseModuleInstantiation::evaluateElseChildren(const Module::~Module() { - BOOST_FOREACH (const AssignmentContainer::value_type &v, assignments) delete v.second; + BOOST_FOREACH (const Assignment &v, assignments) delete v.second; BOOST_FOREACH (FunctionContainer::value_type &f, functions) delete f.second; BOOST_FOREACH (AbstractModuleContainer::value_type &m, modules) delete m.second; BOOST_FOREACH (ModuleInstantiation *v, children) delete v; @@ -181,10 +182,11 @@ std::string Module::dump(const std::string &indent, const std::string &name) con std::string tab; if (!name.empty()) { dump << indent << "module " << name << "("; - for (size_t i=0; i < argnames.size(); i++) { + for (size_t i=0; i < this->definition_arguments.size(); i++) { + const Assignment &arg = this->definition_arguments[i]; if (i > 0) dump << ", "; - dump << argnames[i]; - if (argexpr[i]) dump << " = " << *argexpr[i]; + dump << arg.first; + if (arg.second) dump << " = " << *arg.second; } dump << ") {\n"; tab = "\t"; diff --git a/src/module.h b/src/module.h index 17f0c59..ace3c1b 100644 --- a/src/module.h +++ b/src/module.h @@ -6,6 +6,7 @@ #include <list> #include <boost/unordered_map.hpp> #include "value.h" +#include "typedefs.h" class ModuleInstantiation { @@ -27,8 +28,7 @@ public: bool isHighlight() const { return this->tag_highlight; } bool isRoot() const { return this->tag_root; } - std::vector<std::string> argnames; - std::vector<class Expression*> argexpr; + AssignmentList arguments; std::vector<ModuleInstantiation*> children; bool tag_root; @@ -81,8 +81,8 @@ public: bool handleDependencies(); std::list<std::string> assignments_var; - typedef boost::unordered_map<std::string, Expression*> AssignmentContainer; - AssignmentContainer assignments; + typedef boost::unordered_map<std::string, Expression*> AssignmentMap; + AssignmentMap assignments; typedef boost::unordered_map<std::string, class AbstractFunction*> FunctionContainer; FunctionContainer functions; @@ -91,8 +91,7 @@ public: std::vector<ModuleInstantiation*> children; - std::vector<std::string> argnames; - std::vector<Expression*> argexpr; + std::vector<Assignment> definition_arguments; protected: diff --git a/src/parser.y b/src/parser.y index 26bdba6..9b4f888 100644 --- a/src/parser.y +++ b/src/parser.y @@ -34,6 +34,7 @@ #include <unistd.h> #endif +#include "typedefs.h" #include "module.h" #include "expression.h" #include "value.h" @@ -64,17 +65,6 @@ extern const char *parser_input_buffer; const char *parser_input_buffer; std::string parser_source_path; -class ArgContainer { -public: - std::string argname; - Expression *argexpr; -}; -class ArgsContainer { -public: - std::vector<std::string> argnames; - std::vector<Expression*> argexpr; -}; - %} %union { @@ -85,8 +75,8 @@ public: class ModuleInstantiation *inst; std::vector<ModuleInstantiation*> *instvec; class IfElseModuleInstantiation *ifelse; - class ArgContainer *arg; - class ArgsContainer *args; + Assignment *arg; + AssignmentList *args; } %token TOK_MODULE @@ -168,8 +158,7 @@ statement: module_stack.push_back(currmodule); currmodule = new Module(); p->modules[$2] = currmodule; - currmodule->argnames = $4->argnames; - currmodule->argexpr = $4->argexpr; + currmodule->definition_arguments = *$4; free($2); delete $4; } statement { @@ -178,8 +167,7 @@ statement: } | TOK_FUNCTION TOK_ID '(' arguments_decl optional_commas ')' '=' expr { Function *func = new Function(); - func->argnames = $4->argnames; - func->argexpr = $4->argexpr; + func->definition_arguments = *$4; func->expr = $8; currmodule->functions[$2] = func; free($2); @@ -201,8 +189,7 @@ children_instantiation: if_statement: TOK_IF '(' expr ')' children_instantiation { $$ = new IfElseModuleInstantiation(); - $$->argnames.push_back(""); - $$->argexpr.push_back($3); + $$->arguments.push_back(Assignment("", $3)); $$->setPath(parser_source_path); if ($$) { @@ -279,8 +266,7 @@ module_instantiation_list: single_module_instantiation: TOK_ID '(' arguments_call ')' { $$ = new ModuleInstantiation($1); - $$->argnames = $3->argnames; - $$->argexpr = $3->argexpr; + $$->arguments = *$3; $$->setPath(parser_source_path); free($1); delete $3; @@ -448,8 +434,7 @@ expr: $$ = new Expression(); $$->type = "F"; $$->call_funcname = $1; - $$->call_argnames = $3->argnames; - $$->children = $3->argexpr; + $$->call_arguments = *$3; free($1); delete $3; } ; @@ -470,61 +455,50 @@ vector_expr: arguments_decl: /* empty */ { - $$ = new ArgsContainer(); + $$ = new AssignmentList(); } | argument_decl { - $$ = new ArgsContainer(); - $$->argnames.push_back($1->argname); - $$->argexpr.push_back($1->argexpr); + $$ = new AssignmentList(); + $$->push_back(*$1); delete $1; } | arguments_decl ',' optional_commas argument_decl { $$ = $1; - $$->argnames.push_back($4->argname); - $$->argexpr.push_back($4->argexpr); + $$->push_back(*$4); delete $4; } ; argument_decl: TOK_ID { - $$ = new ArgContainer(); - $$->argname = $1; - $$->argexpr = NULL; + $$ = new Assignment($1, NULL); free($1); } | TOK_ID '=' expr { - $$ = new ArgContainer(); - $$->argname = $1; - $$->argexpr = $3; + $$ = new Assignment($1, $3); free($1); } ; arguments_call: /* empty */ { - $$ = new ArgsContainer(); + $$ = new AssignmentList(); } | argument_call { - $$ = new ArgsContainer(); - $$->argnames.push_back($1->argname); - $$->argexpr.push_back($1->argexpr); + $$ = new AssignmentList(); + $$->push_back(*$1); delete $1; } | arguments_call ',' optional_commas argument_call { $$ = $1; - $$->argnames.push_back($4->argname); - $$->argexpr.push_back($4->argexpr); + $$->push_back(*$4); delete $4; } ; argument_call: expr { - $$ = new ArgContainer(); - $$->argexpr = $1; + $$ = new Assignment("", $1); } | TOK_ID '=' expr { - $$ = new ArgContainer(); - $$->argname = $1; - $$->argexpr = $3; + $$ = new Assignment($1, $3); free($1); } ; diff --git a/src/primitives.cc b/src/primitives.cc index 40e7e0b..184b40c 100644 --- a/src/primitives.cc +++ b/src/primitives.cc @@ -112,37 +112,36 @@ AbstractNode *PrimitiveModule::evaluate(const Context *ctx, const ModuleInstanti node->center = false; node->x = node->y = node->z = node->h = node->r1 = node->r2 = 1; - std::vector<std::string> argnames; - std::vector<Expression*> argexpr; + AssignmentList args; switch (this->type) { case CUBE: - argnames += "size", "center"; + args += Assignment("size", NULL), Assignment("center", NULL); break; case SPHERE: - argnames += "r"; + args += Assignment("r", NULL); break; case CYLINDER: - argnames += "h", "r1", "r2", "center"; + args += Assignment("h", NULL), Assignment("r1", NULL), Assignment("r2", NULL), Assignment("center", NULL); break; case POLYHEDRON: - argnames += "points", "triangles", "convexity"; + args += Assignment("points", NULL), Assignment("triangles", NULL), Assignment("convexity", NULL); break; case SQUARE: - argnames += "size", "center"; + args += Assignment("size", NULL), Assignment("center", NULL); break; case CIRCLE: - argnames += "r"; + args += Assignment("r", NULL); break; case POLYGON: - argnames += "points", "paths", "convexity"; + args += Assignment("points", NULL), Assignment("paths", NULL), Assignment("convexity", NULL); break; default: assert(false && "PrimitiveModule::evaluate(): Unknown node type"); } Context c(ctx); - c.setVariables(argnames, argexpr, evalctx); + c.setVariables(args, evalctx); node->fn = c.lookup_variable("$fn").toDouble(); node->fs = c.lookup_variable("$fs").toDouble(); diff --git a/src/projection.cc b/src/projection.cc index 46add48..eeed411 100644 --- a/src/projection.cc +++ b/src/projection.cc @@ -48,12 +48,11 @@ AbstractNode *ProjectionModule::evaluate(const Context *ctx, const ModuleInstant { ProjectionNode *node = new ProjectionNode(inst); - std::vector<std::string> argnames; - argnames += "cut"; - std::vector<Expression*> argexpr; + AssignmentList args; + args += Assignment("cut", NULL); Context c(ctx); - c.setVariables(argnames, argexpr, evalctx); + c.setVariables(args, evalctx); Value convexity = c.lookup_variable("convexity", true); Value cut = c.lookup_variable("cut", true); diff --git a/src/render.cc b/src/render.cc index 855e5e3..bb08c0c 100644 --- a/src/render.cc +++ b/src/render.cc @@ -45,12 +45,11 @@ AbstractNode *RenderModule::evaluate(const Context *ctx, const ModuleInstantiati { RenderNode *node = new RenderNode(inst); - std::vector<std::string> argnames; - argnames += "convexity"; - std::vector<Expression*> argexpr; + AssignmentList args; + args += Assignment("convexity", NULL); Context c(ctx); - c.setVariables(argnames, argexpr, evalctx); + c.setVariables(args, evalctx); Value v = c.lookup_variable("convexity"); if (v.type() == Value::NUMBER) diff --git a/src/rotateextrude.cc b/src/rotateextrude.cc index 29a873f..b6edb8b 100644 --- a/src/rotateextrude.cc +++ b/src/rotateextrude.cc @@ -52,12 +52,11 @@ AbstractNode *RotateExtrudeModule::evaluate(const Context *ctx, const ModuleInst { RotateExtrudeNode *node = new RotateExtrudeNode(inst); - std::vector<std::string> argnames; - argnames += "file", "layer", "origin", "scale"; - std::vector<Expression*> argexpr; + AssignmentList args; + args += Assignment("file", NULL), Assignment("layer", NULL), Assignment("origin", NULL), Assignment("scale", NULL); Context c(ctx); - c.setVariables(argnames, argexpr, evalctx); + c.setVariables(args, evalctx); node->fn = c.lookup_variable("$fn").toDouble(); node->fs = c.lookup_variable("$fs").toDouble(); diff --git a/src/surface.cc b/src/surface.cc index 22da93d..d8fa422 100644 --- a/src/surface.cc +++ b/src/surface.cc @@ -75,12 +75,11 @@ AbstractNode *SurfaceModule::evaluate(const Context *ctx, const ModuleInstantiat node->center = false; node->convexity = 1; - std::vector<std::string> argnames; - argnames += "file", "center", "convexity"; - std::vector<Expression*> argexpr; + AssignmentList args; + args += Assignment("file", NULL), Assignment("center", NULL), Assignment("convexity", NULL); Context c(ctx); - c.setVariables(argnames, argexpr, evalctx); + c.setVariables(args, evalctx); Value fileval = c.lookup_variable("file"); node->filename = inst->getAbsolutePath(fileval.isUndefined() ? "" : fileval.toString()); diff --git a/src/transform.cc b/src/transform.cc index 6246a59..cc026fb 100644 --- a/src/transform.cc +++ b/src/transform.cc @@ -59,31 +59,30 @@ AbstractNode *TransformModule::evaluate(const Context *ctx, const ModuleInstanti node->matrix = Transform3d::Identity(); - std::vector<std::string> argnames; - std::vector<Expression*> argexpr; + AssignmentList args; switch (this->type) { case SCALE: - argnames += "v"; + args += Assignment("v", NULL); break; case ROTATE: - argnames += "a", "v"; + args += Assignment("a", NULL), Assignment("v", NULL); break; case MIRROR: - argnames += "v"; + args += Assignment("v", NULL); break; case TRANSLATE: - argnames += "v"; + args += Assignment("v", NULL); break; case MULTMATRIX: - argnames += "m"; + args += Assignment("m", NULL); break; default: assert(false); } Context c(ctx); - c.setVariables(argnames, argexpr, evalctx); + c.setVariables(args, evalctx); if (this->type == SCALE) { diff --git a/src/typedefs.h b/src/typedefs.h new file mode 100644 index 0000000..a6e9077 --- /dev/null +++ b/src/typedefs.h @@ -0,0 +1,10 @@ +#ifndef TYPEDEFS_H_ +#define TYPEDEFS_H_ + +#include <string> +#include <vector> + +typedef std::pair<std::string, class Expression*> Assignment; +typedef std::vector<Assignment> AssignmentList; + +#endif |