diff options
Diffstat (limited to 'module.cc')
-rw-r--r-- | module.cc | 86 |
1 files changed, 69 insertions, 17 deletions
@@ -18,15 +18,20 @@ * */ +#define INCLUDE_ABSTRACT_NODE_DETAILS + #include "openscad.h" AbstractModule::~AbstractModule() { } -AbstractNode *AbstractModule::evaluate(const Context*, const QVector<QString>&, const QVector<Value>&) const +AbstractNode *AbstractModule::evaluate(const Context*, const QVector<QString>&, const QVector<Value>&, const QVector<AbstractNode*> child_nodes) const { - return NULL; + AbstractNode *node = new AbstractNode(); + foreach (AbstractNode *v, child_nodes) + node->children.append(v); + return node; } QString AbstractModule::dump(QString indent, QString name) const @@ -70,15 +75,22 @@ QString ModuleInstanciation::dump(QString indent) const return text; } -AbstractNode *ModuleInstanciation::evaluate(const Context*) const +AbstractNode *ModuleInstanciation::evaluate(const Context *ctx) const { - /* FIXME */ - return NULL; + QVector<Value> argvalues; + foreach (Expression *v, argexpr) { + argvalues.append(v->evaluate(ctx)); + } + QVector<AbstractNode*> child_nodes; + foreach (ModuleInstanciation *v, children) { + child_nodes.append(v->evaluate(ctx)); + } + return ctx->evaluate_module(modname, argnames, argvalues, child_nodes); } Module::~Module() { - foreach (Expression *v, assignments) + foreach (Expression *v, assignments_expr) delete v; foreach (AbstractFunction *v, functions) delete v; @@ -88,13 +100,27 @@ Module::~Module() delete v; } -AbstractNode *Module::evaluate(const Context *ctx, const QVector<QString> &call_argnames, const QVector<Value> &call_argvalues) const +AbstractNode *Module::evaluate(const Context *ctx, const QVector<QString> &call_argnames, const QVector<Value> &call_argvalues, const QVector<AbstractNode*> child_nodes) const { Context c(ctx); c.args(argnames, argexpr, call_argnames, call_argvalues); - /* FIXME */ - return NULL; + c.functions_p = &functions; + c.modules_p = &modules; + + for (int i = 0; i < assignments_var.size(); i++) { + c.variables[assignments_var[i]] = assignments_expr[i]->evaluate(&c); + } + + AbstractNode *node = new AbstractNode(); + for (int i = 0; i < children.size(); i++) { + node->children.append(children[i]->evaluate(&c)); + } + + foreach (AbstractNode *v, child_nodes) + node->children.append(v); + + return node; } QString Module::dump(QString indent, QString name) const @@ -109,13 +135,6 @@ QString Module::dump(QString indent, QString name) const } text += QString(") {\n"); { - QHashIterator<QString, Expression*> i(assignments); - while (i.hasNext()) { - i.next(); - text += QString("%1\t%2 = %3;\n").arg(indent, i.key(), i.value()->dump()); - } - } - { QHashIterator<QString, AbstractFunction*> i(functions); while (i.hasNext()) { i.next(); @@ -129,6 +148,9 @@ QString Module::dump(QString indent, QString name) const text += i.value()->dump(indent + QString("\t"), i.key()); } } + for (int i = 0; i < assignments_var.size(); i++) { + text += QString("%1\t%2 = %3;\n").arg(indent, assignments_var[i], assignments_expr[i]->dump()); + } for (int i = 0; i < children.size(); i++) { text += children[i]->dump(indent + QString("\t")); } @@ -140,7 +162,15 @@ QHash<QString, AbstractModule*> builtin_modules; void initialize_builtin_modules() { - /* FIXME */ + builtin_modules["group"] = new AbstractModule(); + + register_builtin_union(); + register_builtin_difference(); + register_builtin_intersect(); + + register_builtin_trans(); + + register_builtin_cube(); } void destroy_builtin_modules() @@ -150,3 +180,25 @@ void destroy_builtin_modules() builtin_modules.clear(); } +AbstractNode::~AbstractNode() +{ + foreach (AbstractNode *v, children) + delete v; +} + +CGAL_Nef_polyhedron AbstractNode::render_cgal_nef_polyhedron() const +{ + CGAL_Nef_polyhedron N; + foreach (AbstractNode *v, children) + N += v->render_cgal_nef_polyhedron(); + return N; +} + +QString AbstractNode::dump(QString indent) const +{ + QString text = indent + "group() {\n"; + foreach (AbstractNode *v, children) + text += v->dump(indent + QString("\t")); + return text + indent + "}\n"; +} + |