summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/MainWindow.h3
-rw-r--r--src/mainwin.cc58
-rw-r--r--src/nodecache.h2
-rw-r--r--src/openscad.cc12
4 files changed, 41 insertions, 34 deletions
diff --git a/src/MainWindow.h b/src/MainWindow.h
index 3141386..132035a 100644
--- a/src/MainWindow.h
+++ b/src/MainWindow.h
@@ -7,6 +7,7 @@
#include "context.h"
#include "module.h"
#include "polyset.h"
+#include "Tree.h"
#include <QPointer>
class MainWindow : public QMainWindow, public Ui::MainWindow
@@ -32,7 +33,7 @@ public:
ModuleInstantiation root_inst; // Top level instance
AbstractNode *absolute_root_node; // Result of tree evaluation
AbstractNode *root_node; // Root if the root modifier (!) is used
- class NodeDumper *dumper;
+ Tree tree;
class CSGTerm *root_raw_term; // Result of CSG term rendering
CSGTerm *root_norm_term; // Normalized CSG products
diff --git a/src/mainwin.cc b/src/mainwin.cc
index af220a3..d225db3 100644
--- a/src/mainwin.cc
+++ b/src/mainwin.cc
@@ -46,7 +46,6 @@
#endif
#include "CGALRenderer.h"
#include "PolySetCGALRenderer.h"
-#include "nodedumper.h"
#include <QMenu>
#include <QTime>
@@ -151,7 +150,6 @@ MainWindow::MainWindow(const QString &filename)
root_raw_term = NULL;
root_norm_term = NULL;
root_chain = NULL;
- this->dumper = new NodeDumper;
#ifdef ENABLE_CGAL
this->root_N = NULL;
this->recreate_cgal_ogl_p = false;
@@ -539,13 +537,6 @@ AbstractNode *MainWindow::find_root_tag(AbstractNode *n)
return NULL;
}
-QString MainWindow::dumpCSGTree(AbstractNode *root)
-{
- Traverser trav(*this->dumper, *root, Traverser::PRE_AND_POSTFIX);
- trav.execute();
- return QString::fromStdString(this->dumper->getDump() + "\n");
-}
-
/*!
Parse and evaluate the design -> this->root_node
*/
@@ -662,8 +653,8 @@ void MainWindow::compile(bool procevents)
this->root_node = absolute_root_node;
}
// Dump the tree (to initialize caches).
- // FIXME: We shouldn't really need to do this explicitly..
- dumpCSGTree(this->root_node);
+ // FIXME: We shouldn't really need to do this explicitly.. this->tree.setRoot(root);
+ this->tree.getString(*this->root_node);
if (1) {
PRINT("Compilation finished.");
@@ -1106,8 +1097,9 @@ void MainWindow::actionRenderCGAL()
compile(true);
- if (!root_module || !root_node)
+ if (!this->root_module || !this->root_node) {
return;
+ }
if (this->root_N) {
delete this->root_N;
@@ -1137,13 +1129,12 @@ void MainWindow::actionRenderCGAL()
QApplication::processEvents();
- progress_report_prep(root_node, report_func, pd);
+ progress_report_prep(this->root_node, report_func, pd);
try {
-// this->root_N = new CGAL_Nef_polyhedron(CGALRenderer::renderer()->renderCGALMesh(*root_node));
-
- Tree *tree = this->tree;
- CGALRenderDriver renderer(tree);
- this->root_N = new CGAL_Nef_polyhedron(renderer->renderCGALMesh());
+ // FIXME: put cache somewhere else
+ QHash<std::string, CGAL_Nef_polyhedron> cache;
+ CGALRenderer renderer(cache, this->tree);
+ this->root_N = new CGAL_Nef_polyhedron(renderer.renderCGALMesh(*this->root_node));
}
catch (ProgressCancelException e) {
PRINT("Rendering cancelled.");
@@ -1245,8 +1236,8 @@ void MainWindow::actionDisplayCSGTree()
e->setTabStopWidth(30);
e->setWindowTitle("CSG Tree Dump");
e->setReadOnly(true);
- if (root_node) {
- e->setPlainText(QString::fromStdString(this->dumper->getDump()));
+ if (this->root_node) {
+ e->setPlainText(QString::fromStdString(this->tree.getString(*this->root_node)));
} else {
e->setPlainText("No CSG to dump. Please try compiling first...");
}
@@ -1313,15 +1304,15 @@ void MainWindow::actionExportSTLorOFF(bool)
pd->show();
QApplication::processEvents();
- QFile file(filename);
+ QFile file(stl_filename);
if (!file.open(QIODevice::ReadWrite)) {
- PRINTA("Can't open file \"%1\" for export", filename);
+ PRINTA("Can't open file \"%1\" for export", stl_filename);
}
else {
QTextStream fstream(&file);
if (stl_mode) export_stl(this->root_N, fstream, pd);
else export_off(this->root_N, fstream, pd);
- file.close()
+ file.close();
PRINTF("%s export finished.", stl_mode ? "STL" : "OFF");
}
@@ -1358,16 +1349,24 @@ void MainWindow::actionExportDXF()
return;
}
- QString stl_filename = QFileDialog::getSaveFileName(this,
+ QString dxf_filename = QFileDialog::getSaveFileName(this,
"Export DXF File", "", "DXF Files (*.dxf)");
- if (stl_filename.isEmpty()) {
+ if (dxf_filename.isEmpty()) {
PRINTF("No filename specified. DXF export aborted.");
clearCurrentOutput();
return;
}
- export_dxf(this->root_N, stl_filename, NULL);
- PRINTF("DXF export finished.");
+ QFile file(dxf_filename);
+ if (!file.open(QIODevice::ReadWrite)) {
+ PRINTA("Can't open file \"%1\" for export", dxf_filename);
+ }
+ else {
+ QTextStream fstream(&file);
+ export_dxf(this->root_N, fstream, NULL);
+ file.close();
+ PRINTF("DXF export finished.");
+ }
clearCurrentOutput();
#endif /* ENABLE_CGAL */
@@ -1378,8 +1377,9 @@ void MainWindow::actionFlushCaches()
// FIXME: Polycache -> PolySetRenderer
PolySetRenderer::renderer()->clearCache();
#ifdef ENABLE_CGAL
- CGALRenderer::renderer()->getCache().clear();
- this->dumper->clearCache();
+// FIXME: Flush caches through whatever channels we have
+ // CGALRenderer::renderer()->getCache().clear();
+ // this->dumper->clearCache();
#endif
dxf_dim_cache.clear();
dxf_cross_cache.clear();
diff --git a/src/nodecache.h b/src/nodecache.h
index ca0bd6c..cc3355e 100644
--- a/src/nodecache.h
+++ b/src/nodecache.h
@@ -6,7 +6,7 @@
#include "node.h"
/*!
- Caches values per node based on the node.index().
+ Caches string values per node based on the node.index().
The node index guaranteed to be unique per node tree since the index is reset
every time a new tree is generated.
*/
diff --git a/src/openscad.cc b/src/openscad.cc
index 494d41b..a53d1de 100644
--- a/src/openscad.cc
+++ b/src/openscad.cc
@@ -34,6 +34,7 @@
#include "nodedumper.h"
#include "CGALRenderer.h"
#include "PolySetCGALRenderer.h"
+#include "printutils.h"
#ifdef ENABLE_CGAL
#include "cgal.h"
@@ -45,6 +46,8 @@
#include <QDir>
#include <QSet>
#include <QSettings>
+#include <QTextStream>
+
#include <getopt.h>
#ifdef Q_WS_MAC
#include "EventFilter.h"
@@ -238,10 +241,13 @@ int main(int argc, char **argv)
}
// Initialize global visitors
- NodeDumper dumper;
- CGALRenderer cgalrenderer(dumper.getCache());
+ NodeCache nodecache;
+ NodeDumper dumper(nodecache);
+ Tree tree;
+ // FIXME: enforce some maximum cache size (old version had 100K vertices as limit)
+ QHash<std::string, CGAL_Nef_polyhedron> cache;
+ CGALRenderer cgalrenderer(cache, tree);
PolySetCGALRenderer psrenderer(cgalrenderer);
- CGALRenderer::setRenderer(&cgalrenderer);
PolySetRenderer::setRenderer(&psrenderer);
if (stl_output_file || off_output_file || dxf_output_file)
contact: Jan Huwald // Impressum