/*
*
* This file is part of the Virtual Leaf.
*
* VirtualLeaf 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.
*
* VirtualLeaf 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
#include
#include
#include
static const std::string _module_id("$Id$");
xmlNode *MainBase::XMLViewportTree(QTransform &transform) const {
QLocale standardlocale(QLocale::C);
xmlNode *xmlviewport = xmlNewNode(NULL, BAD_CAST "viewport");
{
xmlNewProp(xmlviewport, BAD_CAST "m11", BAD_CAST standardlocale.toString(transform.m11()).toStdString().c_str() );
xmlNewProp(xmlviewport, BAD_CAST "m12", BAD_CAST standardlocale.toString(transform.m12()).toStdString().c_str() );
xmlNewProp(xmlviewport, BAD_CAST "m21", BAD_CAST standardlocale.toString(transform.m21()).toStdString().c_str() );
xmlNewProp(xmlviewport, BAD_CAST "m22", BAD_CAST standardlocale.toString(transform.m22()).toStdString().c_str() );
xmlNewProp(xmlviewport, BAD_CAST "dx", BAD_CAST standardlocale.toString(transform.dx()).toStdString().c_str() );
xmlNewProp(xmlviewport, BAD_CAST "dy", BAD_CAST standardlocale.toString(transform.dy()).toStdString().c_str() );
}
return xmlviewport;
}
xmlNode *MainBase::XMLSettingsTree(void) {
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::XMLReadViewport(xmlNode *settings) {
if (settings == 0) {
return;
}
qreal m11=25,m12=0,m21=0,m22=25,dx=0,dy=0;
QLocale standardlocale(QLocale::C);
xmlNode *cur = settings->xmlChildrenNode;
while (cur!=NULL) {
if (!xmlStrcmp(cur->name,(const xmlChar *)"viewport")) {
bool ok;
{
xmlChar *v_str = xmlGetProp(cur, BAD_CAST "m11");
if (v_str==0) {
MyWarning::unique_warning("Error reading viewport in mainbase.cpp");
}
if (v_str != NULL) {
m11=standardlocale.toDouble((char *)v_str, &ok);
if (!ok) MyWarning::error("Could Not Convert \"%S\" To Double In XMLRead.",(char *)v_str);
xmlFree(v_str);
}
}
{
xmlChar *v_str = xmlGetProp(cur, BAD_CAST "m12");
if (v_str==0) {
MyWarning::unique_warning("Error reading viewport in mainbase.cpp");
}
if (v_str != NULL) {
m12=standardlocale.toDouble((char *)v_str, &ok);
if (!ok) MyWarning::error("Could Not Convert \"%S\" To Double In XMLRead.",(char *)v_str);
xmlFree(v_str);
}
}
{
xmlChar *v_str = xmlGetProp(cur, BAD_CAST "m21");
if (v_str==0) {
MyWarning::unique_warning("Error reading viewport in mainbase.cpp");
}
if (v_str != NULL) {
m21=standardlocale.toDouble((char *)v_str, &ok);
if (!ok) MyWarning::error("Could Not Convert \"%S\" To Double In XMLRead.",(char *)v_str);
xmlFree(v_str);
}
}
{
xmlChar *v_str = xmlGetProp(cur, BAD_CAST "m22");
if (v_str==0) {
MyWarning::unique_warning("Error reading viewport in mainbase.cpp");
}
if (v_str != NULL) {
m22=standardlocale.toDouble((char *)v_str, &ok);
if (!ok) MyWarning::error("Could Not Convert \"%S\" To Double In XMLRead.",(char *)v_str);
xmlFree(v_str);
}
}
{
xmlChar *v_str = xmlGetProp(cur, BAD_CAST "dx");
if (v_str==0) {
MyWarning::unique_warning("Error reading viewport in mainbase.cpp");
}
if (v_str != NULL) {
dx=standardlocale.toDouble((char *)v_str, &ok);
if (!ok) MyWarning::error("Could Not Convert \"%S\" To Double In XMLRead.",(char *)v_str);
xmlFree(v_str);
}
}
{
xmlChar *v_str = xmlGetProp(cur, BAD_CAST "dy");
if (v_str==0) {
MyWarning::unique_warning("Error reading viewport in mainbase.cpp");
}
if (v_str != NULL) {
dy=standardlocale.toDouble((char *)v_str, &ok);
if (!ok) MyWarning::error("Could Not Convert \"%S\" To Double In XMLRead.",(char *)v_str);
xmlFree(v_str);
}
}
}
cur=cur->next;
}
viewport = QTransform(m11,m12,m21,m22,dx,dy);
}
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;
}
XMLReadViewport(settings);
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;
}
}
int 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 1;
}
ll*=Cell::Magnification(); ur*=Cell::Magnification();
// give the leaf some space
Vector border = ((ur-ll)/5.);
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);
#ifdef QDEBUG
qDebug() << "Native Image Filename: " << QDir::toNativeSeparators(QString(fname)) << endl;
#endif
if (!image->save(QDir::toNativeSeparators(QString(fname)))) { // please do not add "format" here! It is much better to have the system guess the file format from the extension. That prevents loads of cross-platform problems.
MyWarning::warning("Image '%s' not saved successfully. Is the disk full or the extension not recognized?",fname);
delete painter;
delete image;
return 1;
}
delete painter;
delete image;
} else {
QPrinter pdf(QPrinter::HighResolution);
pdf.setOutputFileName(fname);
pdf.setOutputFormat(QPrinter::PdfFormat);
QPainter painter(&pdf);
canvas.render(&painter, QRectF(), QRectF(-5000,-5000, 10000, 10000));
cerr << "Rendering to printer\n";
}
return 0;
}
void MainBase::CutSAM()
{
mesh.CutAwaySAM();
}
/* finis */