summaryrefslogtreecommitdiff
path: root/module.cc
diff options
context:
space:
mode:
Diffstat (limited to 'module.cc')
-rw-r--r--module.cc86
1 files changed, 69 insertions, 17 deletions
diff --git a/module.cc b/module.cc
index d8c5f31..ede55d1 100644
--- a/module.cc
+++ b/module.cc
@@ -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";
+}
+
contact: Jan Huwald // Impressum