summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Kintel <marius@kintel.net>2013-04-18 22:34:14 (GMT)
committerMarius Kintel <marius@kintel.net>2013-04-18 22:34:14 (GMT)
commit58bd9c9e3f4454d055bf51d63463a9965a9dcbd7 (patch)
tree732cd423858685365a4115d44a52f85ae90866a1
parent73c2a45af6afca253159d2cf9c1ecf5747f0217e (diff)
Cleaned up argument list handling, related to #116
-rw-r--r--openscad.pro3
-rw-r--r--src/cgaladv.cc13
-rw-r--r--src/color.cc7
-rw-r--r--src/context.cc14
-rw-r--r--src/context.h4
-rw-r--r--src/control.cc2
-rw-r--r--src/evalcontext.cc4
-rw-r--r--src/expr.cc13
-rw-r--r--src/expression.h3
-rw-r--r--src/func.cc12
-rw-r--r--src/function.h4
-rw-r--r--src/import.cc10
-rw-r--r--src/lexer.l1
-rw-r--r--src/linearextrude.cc7
-rw-r--r--src/modcontext.cc6
-rw-r--r--src/module.cc28
-rw-r--r--src/module.h11
-rw-r--r--src/parser.y66
-rw-r--r--src/primitives.cc19
-rw-r--r--src/projection.cc7
-rw-r--r--src/render.cc7
-rw-r--r--src/rotateextrude.cc7
-rw-r--r--src/surface.cc7
-rw-r--r--src/transform.cc15
-rw-r--r--src/typedefs.h10
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
contact: Jan Huwald // Impressum