diff --git a/src/mainbase.cpp b/src/mainbase.cpp
new file mode 100644
--- /dev/null
+++ b/src/mainbase.cpp
@@ -0,0 +1,260 @@
+/*
+ *
+ * This file is part of the Virtual Leaf.
+ *
+ * The Virtual Leaf is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * The Virtual Leaf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the Virtual Leaf. If not, see .
+ *
+ * Copyright 2010 Roeland Merks.
+ *
+ */
+
+#include
+#include
+
+#include "mainbase.h"
+#include "xmlwrite.h"
+
+#include
+#include
+
+static const std::string _module_id("$Id$");
+
+xmlNode *MainBase::XMLSettingsTree(void) const {
+
+ xmlNode *xmlsettings = xmlNewNode(NULL, BAD_CAST "settings");
+ {
+ xmlNode *xmloption = xmlNewChild(xmlsettings, NULL, BAD_CAST "setting", NULL);
+ xmlNewProp(xmloption, BAD_CAST "name", BAD_CAST "show_cell_centers");
+ ostringstream text;
+ text << bool_name(showcentersp);
+ xmlNewProp(xmloption, BAD_CAST "val", BAD_CAST text.str().c_str());
+ }
+ {
+ xmlNode *xmloption = xmlNewChild(xmlsettings, NULL, BAD_CAST "setting", NULL);
+ xmlNewProp(xmloption, BAD_CAST "name", BAD_CAST "show_nodes");
+ ostringstream text;
+ text << bool_name(showmeshp);
+ xmlNewProp(xmloption, BAD_CAST "val", BAD_CAST text.str().c_str());
+ }
+ {
+ xmlNode *xmloption = xmlNewChild(xmlsettings, NULL, BAD_CAST "setting", NULL);
+ xmlNewProp(xmloption, BAD_CAST "name", BAD_CAST "show_node_numbers");
+ ostringstream text;
+ text << bool_name(shownodenumbersp);
+ xmlNewProp(xmloption, BAD_CAST "val", BAD_CAST text.str().c_str());
+ }
+ {
+ xmlNode *xmloption = xmlNewChild(xmlsettings, NULL, BAD_CAST "setting", NULL);
+ xmlNewProp(xmloption, BAD_CAST "name", BAD_CAST "show_cell_numbers");
+ ostringstream text;
+ text << bool_name(showcellnumbersp);
+ xmlNewProp(xmloption, BAD_CAST "val", BAD_CAST text.str().c_str());
+ }
+ {
+ xmlNode *xmloption = xmlNewChild(xmlsettings, NULL, BAD_CAST "setting", NULL);
+ xmlNewProp(xmloption, BAD_CAST "name", BAD_CAST "show_border_cells");
+ ostringstream text;
+ text << bool_name(showbordercellp);
+ xmlNewProp(xmloption, BAD_CAST "val", BAD_CAST text.str().c_str());
+ }
+ {
+ xmlNode *xmloption = xmlNewChild(xmlsettings, NULL, BAD_CAST "setting", NULL);
+ xmlNewProp(xmloption, BAD_CAST "name", BAD_CAST "show_cell_axes");
+ ostringstream text;
+ text << bool_name(showcellsaxesp);
+ xmlNewProp(xmloption, BAD_CAST "val", BAD_CAST text.str().c_str());
+ }
+ {
+ xmlNode *xmloption = xmlNewChild(xmlsettings, NULL, BAD_CAST "setting", NULL);
+ xmlNewProp(xmloption, BAD_CAST "name", BAD_CAST "show_cell_strain");
+ ostringstream text;
+ text << bool_name(showcellstrainp);
+ xmlNewProp(xmloption, BAD_CAST "val", BAD_CAST text.str().c_str());
+ }
+ {
+ xmlNode *xmloption = xmlNewChild(xmlsettings, NULL, BAD_CAST "setting", NULL);
+ xmlNewProp(xmloption, BAD_CAST "name", BAD_CAST "show_fluxes");
+ ostringstream text;
+ text << bool_name(showfluxesp);
+ xmlNewProp(xmloption, BAD_CAST "val", BAD_CAST text.str().c_str());
+ }
+ {
+ xmlNode *xmloption = xmlNewChild(xmlsettings, NULL, BAD_CAST "setting", NULL);
+ xmlNewProp(xmloption, BAD_CAST "name", BAD_CAST "show_walls");
+ ostringstream text;
+ text << bool_name(showwallsp);
+ xmlNewProp(xmloption, BAD_CAST "val", BAD_CAST text.str().c_str());
+ }
+ {
+ xmlNode *xmloption = xmlNewChild(xmlsettings, NULL, BAD_CAST "setting", NULL);
+ xmlNewProp(xmloption, BAD_CAST "name", BAD_CAST "show_apoplasts");
+ ostringstream text;
+ text << bool_name(showapoplastsp);
+ xmlNewProp(xmloption, BAD_CAST "val", BAD_CAST text.str().c_str());
+ }
+ {
+ xmlNode *xmloption = xmlNewChild(xmlsettings, NULL, BAD_CAST "setting", NULL);
+ xmlNewProp(xmloption, BAD_CAST "name", BAD_CAST "save_movie_frames");
+ ostringstream text;
+ text << bool_name(movieframesp);
+ xmlNewProp(xmloption, BAD_CAST "val", BAD_CAST text.str().c_str());
+ }
+ {
+ xmlNode *xmloption = xmlNewChild(xmlsettings, NULL, BAD_CAST "setting", NULL);
+ xmlNewProp(xmloption, BAD_CAST "name", BAD_CAST "show_only_leaf_boundary");
+ ostringstream text;
+ text << bool_name(showboundaryonlyp);
+ xmlNewProp(xmloption, BAD_CAST "val", BAD_CAST text.str().c_str());
+ }
+ {
+ xmlNode *xmloption = xmlNewChild(xmlsettings, NULL, BAD_CAST "setting", NULL);
+ xmlNewProp(xmloption, BAD_CAST "name", BAD_CAST "cell_growth");
+ ostringstream text;
+ text << bool_name(dynamicscellsp);
+ xmlNewProp(xmloption, BAD_CAST "val", BAD_CAST text.str().c_str());
+ }
+ {
+ xmlNode *xmloption = xmlNewChild(xmlsettings, NULL, BAD_CAST "setting", NULL);
+ xmlNewProp(xmloption, BAD_CAST "name", BAD_CAST "hide_cells");
+ ostringstream text;
+ text << bool_name(hidecellsp);
+ xmlNewProp(xmloption, BAD_CAST "val", BAD_CAST text.str().c_str());
+ }
+
+ return xmlsettings;
+}
+
+void MainBase::XMLReadSettings(xmlNode *settings) {
+
+ // Many files have no settings section, so don't complain about it.
+ // Defaults will be used instead.
+ if (settings == 0) {
+ return;
+ }
+
+ xmlNode *cur = settings->xmlChildrenNode;
+
+ while (cur!=NULL) {
+
+ if ((!xmlStrcmp(cur->name, (const xmlChar *)"setting"))){
+
+ xmlChar *name = xmlGetProp(cur, BAD_CAST "name");
+ xmlChar *val = xmlGetProp(cur, BAD_CAST "val");
+ if (!xmlStrcmp(name, (const xmlChar *)"show_cell_centers")) {
+ showcentersp = strtobool( (const char *)val );
+ }
+ if (!xmlStrcmp(name, (const xmlChar *)"show_nodes")) {
+ showmeshp = strtobool( (const char *)val );
+ }
+ if (!xmlStrcmp(name, (const xmlChar *)"show_node_numbers")) {
+ shownodenumbersp = strtobool( (const char *)val );
+ }
+ if (!xmlStrcmp(name, (const xmlChar *)"show_cell_numbers")) {
+ showcellnumbersp = strtobool( (const char *)val );
+ }
+ if (!xmlStrcmp(name, (const xmlChar *)"show_border_cells")) {
+ showbordercellp = strtobool( (const char *)val );
+ }
+ if (!xmlStrcmp(name, (const xmlChar *)"show_cell_axes")) {
+ showcellsaxesp = strtobool( (const char *)val );
+ }
+ if (!xmlStrcmp(name, (const xmlChar *)"show_cell_strain")) {
+ showcellstrainp = strtobool( (const char *)val );
+ }
+ if (!xmlStrcmp(name, (const xmlChar *)"show_fluxes")) {
+ showfluxesp = strtobool( (const char *)val );
+ }
+ if (!xmlStrcmp(name, (const xmlChar *)"show_walls")) {
+ showwallsp = strtobool( (const char *)val );
+ }
+ if (!xmlStrcmp(name, (const xmlChar *)"show_apoplasts")) {
+ showapoplastsp = strtobool( (const char *)val );
+ }
+ if (!xmlStrcmp(name, (const xmlChar *)"save_movie_frames")) {
+ movieframesp = strtobool( (const char *)val );
+ }
+ if (!xmlStrcmp(name, (const xmlChar *)"show_only_leaf_boundary")) {
+ showboundaryonlyp = strtobool( (const char *)val );
+ }
+ if (!xmlStrcmp(name, (const xmlChar *)"cell_growth")) {
+ dynamicscellsp = strtobool( (const char *)val );
+ }
+ if (!xmlStrcmp(name,(const xmlChar *)"hide_cells")) {
+ hidecellsp = strtobool( (const char *)val );
+ }
+
+ xmlFree(name);
+ xmlFree(val);
+
+
+ }
+ cur=cur->next;
+ }
+
+}
+
+void MainBase::Save(const char *fname, const char *format, int sizex, int sizey) {
+
+ Vector ll,ur;
+ mesh.BoundingBox(ll, ur);
+
+ if (QString(fname).isEmpty()) {
+ MyWarning::warning("No output filename given. Saving nothing.\n");
+ return;
+ }
+
+
+ ll*=Cell::Magnification(); ur*=Cell::Magnification();
+
+ // give the leaf some space
+ Vector border = ((ur-ll)/5.);
+
+ //QRectF bb( ll.x - border.x, ll.y - border.y, ur.x-ll.x + 2*border.x, ur.y-ll.y + 2*border.y );
+
+ if (!QString(format).contains("pdf", Qt::CaseInsensitive)) {
+
+ QImage *image = new QImage(QSize(sizex, sizey), QImage::Format_RGB32);
+ image->fill(QColor(Qt::white).rgb());
+ QPainter *painter=new QPainter(image);
+ //canvas.render(painter,QRectF(),QRectF(-5000,-5000, 10000, 10000));
+ canvas.render(painter);
+ if (!image->save(QString(fname))) {
+ MyWarning::warning("Image not saved successfully. Is the disk full or the extension not recognized?");
+ };
+ delete painter;
+ delete image;
+ } else {
+ QPrinter pdf(QPrinter::HighResolution);
+ pdf.setOutputFileName(fname);
+ pdf.setOutputFormat(QPrinter::PdfFormat);
+ //pdf.setPageSize(QPrinter::Custom);
+ QPainter painter(&pdf);
+ // cerr << "Cell::Magnification() = " << Cell::Magnification() << endl;
+ //if (sizex==0 || sizey==0) {
+ // always fit to page
+ // canvas.render(&painter);
+ //} else {
+ // canvas.render(&painter,QRectF(),QRectF(-5000,-5000, 10000, 10000));
+ //}
+ canvas.render(&painter, QRectF(), QRectF(-5000,-5000, 10000, 10000));
+
+ cerr << "Rendering to printer\n";
+ }
+}
+
+void MainBase::CutSAM() {
+
+ mesh.CutAwaySAM();
+
+}