Files @ 21afbd2a2c01
Branch filter:

Location: EI/VirtualLeaf/src/modelcatalogue.cpp

Michael Guravage
Renamed tutorial examples and added makefile, etc.

--
user: Michael Guravage <michael.guravage@cwi.nl>
branch 'default'
added doc/gpl3.txt
added doc/installation.pdf
added doc/installation.rst
added src/TutorialCode/Makefile
added src/TutorialCode/Tutorial0/Makefile
added src/TutorialCode/Tutorial0/tutorial0.cpp
added src/TutorialCode/Tutorial0/tutorial0.h
added src/TutorialCode/Tutorial0/tutorial0.pro
added src/TutorialCode/Tutorial1A/Makefile
added src/TutorialCode/Tutorial1A/tutorial1A.cpp
added src/TutorialCode/Tutorial1A/tutorial1A.h
added src/TutorialCode/Tutorial1A/tutorial1A.pro
added src/TutorialCode/Tutorial1B/Makefile
added src/TutorialCode/Tutorial1B/tutorial1B.cpp
added src/TutorialCode/Tutorial1B/tutorial1B.h
added src/TutorialCode/Tutorial1B/tutorial1B.pro
added src/TutorialCode/Tutorial1C/Makefile
added src/TutorialCode/Tutorial1C/tutorial1C.cpp
added src/TutorialCode/Tutorial1C/tutorial1C.h
added src/TutorialCode/Tutorial1C/tutorial1C.pro
added src/TutorialCode/Tutorial1D/Makefile
added src/TutorialCode/Tutorial1D/tutorial1D.cpp
added src/TutorialCode/Tutorial1D/tutorial1D.h
added src/TutorialCode/Tutorial1D/tutorial1D.pro
added src/TutorialCode/Tutorial2/Makefile
added src/TutorialCode/Tutorial2/tutorial2.cpp
added src/TutorialCode/Tutorial2/tutorial2.h
added src/TutorialCode/Tutorial2/tutorial2.pro
added src/TutorialCode/Tutorial3/Makefile
added src/TutorialCode/Tutorial3/tutorial3.cpp
added src/TutorialCode/Tutorial3/tutorial3.h
added src/TutorialCode/Tutorial3/tutorial3.pro
added src/TutorialCode/Tutorial4/Makefile
added src/TutorialCode/Tutorial4/tutorial4.cpp
added src/TutorialCode/Tutorial4/tutorial4.h
added src/TutorialCode/Tutorial4/tutorial4.pro
added src/TutorialCode/Tutorial5/Makefile
added src/TutorialCode/Tutorial5/tutorial5.cpp
added src/TutorialCode/Tutorial5/tutorial5.h
added src/TutorialCode/Tutorial5/tutorial5.pro
added src/perl/ChangeLog
changed src/ChangeLog
changed src/Makefile
changed src/build_models/ChangeLog
changed src/build_models/Makefile
changed src/canvas.cpp
changed src/parameter.cpp
changed src/parameter.h
changed src/pardialog.cpp
changed src/pardialog.h
changed src/perl/make_parameter_source.pl
changed src/perl/make_pardialog_source.pl
changed src/perl/make_xmlwritecode.pl
changed src/vleafmodel.h
removed doc/GPL
removed src/TutorialCode/Tutorial0/mymodel.cpp
removed src/TutorialCode/Tutorial0/mymodel.h
removed src/TutorialCode/Tutorial0/mymodel.pro
removed src/TutorialCode/Tutorial1/mymodel.cpp
removed src/TutorialCode/Tutorial1/mymodel.h
removed src/TutorialCode/Tutorial1/mymodel.pro
removed src/TutorialCode/Tutorial1A/mymodel.cpp
removed src/TutorialCode/Tutorial1A/mymodel.h
removed src/TutorialCode/Tutorial1A/mymodel.pro
removed src/TutorialCode/Tutorial1B/mymodel.cpp
removed src/TutorialCode/Tutorial1B/mymodel.h
removed src/TutorialCode/Tutorial1B/mymodel.pro
removed src/TutorialCode/Tutorial1C/mymodel.cpp
removed src/TutorialCode/Tutorial1C/mymodel.h
removed src/TutorialCode/Tutorial1C/mymodel.pro
removed src/TutorialCode/Tutorial1D/mymodel.cpp
removed src/TutorialCode/Tutorial1D/mymodel.h
removed src/TutorialCode/Tutorial1D/mymodel.pro
removed src/TutorialCode/Tutorial2/mymodel.cpp
removed src/TutorialCode/Tutorial2/mymodel.h
removed src/TutorialCode/Tutorial2/mymodel.pro
removed src/TutorialCode/Tutorial3/mymodel.cpp
removed src/TutorialCode/Tutorial3/mymodel.h
removed src/TutorialCode/Tutorial3/mymodel.pro
removed src/TutorialCode/Tutorial4/mymodel
removed src/TutorialCode/Tutorial4/mymodel.cpp
removed src/TutorialCode/Tutorial4/mymodel.h
removed src/TutorialCode/Tutorial4/mymodel.pro
removed src/TutorialCode/Tutorial5/mymodel
removed src/TutorialCode/Tutorial5/mymodel.cpp
removed src/TutorialCode/Tutorial5/mymodel.h
removed src/TutorialCode/Tutorial5/mymodel.pro
/*
 *
 *  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 <http://www.gnu.org/licenses/>.
 *
 *  Copyright 2010 Roeland Merks.
 *
 */

#include <string>
#include "modelcatalogue.h"
#include <QVariant>

static const std::string _module_id("$Id$");

ModelCatalogue::ModelCatalogue(Mesh *_mesh, Main *_mainwin, const char *model=0) {
  mesh = _mesh;
  mainwin = _mainwin;
  if (model) {
    cerr << "Loading model: " << model << endl;
    LoadPlugin(model);
  } else {
    cerr << "Loading all models." << endl;
    LoadPlugins();
  }
}

void ModelCatalogue::LoadPlugins() {

  QDir pluginDir(QApplication::applicationDirPath()); 
  QStringList plugin_filters; // filter for plugins, i.e "*.dll", "*.dylib"
#if defined(Q_OS_WIN) 
  if (pluginDir.dirName().toLower() =="debug" 
      ||pluginDir.dirName().toLower() =="release") 
    pluginDir.cdUp(); 
  plugin_filters << "*.dll";
#elif defined(Q_OS_MAC) 
  if (pluginDir.dirName() =="MacOS"){ 
    pluginDir.cdUp(); 
    pluginDir.cdUp(); 
    pluginDir.cdUp(); 
  } 
  plugin_filters << "*.dylib";
#endif 
  pluginDir.setNameFilters(plugin_filters);

  if (!pluginDir.cd("models")) {
    MyWarning::error("Directory 'models' not found!");
  }


  //QVector<SimPluginInterface *> plugins;
  foreach (QString fileName, pluginDir.entryList(QDir::Files)){ 
    QPluginLoader loader(pluginDir.absoluteFilePath(fileName)); 
    if (SimPluginInterface *plugin = 
	qobject_cast<SimPluginInterface *>(loader.instance())) {
      models.append(plugin); 
    } else {
      cerr << loader.errorString().toStdString().c_str() << endl;
      MyWarning::warning("Could not load model %s: %s",fileName.toStdString().c_str(), loader.errorString().toStdString().c_str());
    }
  }
  if (models.size()==0) {
    MyWarning::error("No models could be loaded.");
  }
}

void ModelCatalogue::LoadPlugin(const char *model) {


  QDir pluginDir(QApplication::applicationDirPath()); 
  QStringList plugin_filters; // filter for plugins, i.e "*.dll", "*.dylib"


#if defined(Q_OS_WIN) 
  if (pluginDir.dirName().toLower() =="debug" 
      ||pluginDir.dirName().toLower() =="release") 
    pluginDir.cdUp(); 
  //plugin_filters << "*.dll";
#elif defined(Q_OS_MAC) 
  if (pluginDir.dirName() =="MacOS"){ 
    pluginDir.cdUp(); 
    pluginDir.cdUp(); 
    pluginDir.cdUp(); 
  } 
  //plugin_filters << "*.dylib";
#endif
  plugin_filters << model;
  pluginDir.setNameFilters(plugin_filters);

  if (!pluginDir.cd("models")) {
    MyWarning::error("Directory 'models' not found!");
  }

  QStringList modelnames=pluginDir.entryList(QDir::Files);
  if (modelnames.empty()) {
    MyWarning::error("Model %s not found - hint: do not include path in filename.",model);
  }
  foreach (QString fileName, modelnames){ 
    QPluginLoader loader(pluginDir.absoluteFilePath(fileName)); 

    if (SimPluginInterface *plugin = 
	qobject_cast<SimPluginInterface *>(loader.instance())) {
      models.append(plugin); 
      //MyWarning::warning("Successfully loaded model %s",fileName.toStdString().c_str());
    } else {
      MyWarning::warning("Could not load plugin %s",fileName.toStdString().c_str());
    }
  }
}

void ModelCatalogue::InstallFirstModel() {
  InstallModel(models[0]);
}
void ModelCatalogue::PopulateModelMenu() {
  foreach (SimPluginInterface *model, models) {
    QAction *modelaction = new QAction(model->ModelID(), mainwin); 
    QVariant data;
    data.setValue(model);
    modelaction->setData(data);
    mainwin->modelmenu->addAction(modelaction);

  }
  connect(mainwin->modelmenu, SIGNAL(triggered(QAction *)), this, SLOT(InstallModel(QAction *)) );
}	

void ModelCatalogue::InstallModel(QAction *modelaction) {
  QVariant data = modelaction->data();
  SimPluginInterface *model = data.value<SimPluginInterface *>();
  cerr << "You chose model " << model->ModelID().toStdString() << "!\n";
  mesh->Clean();
  InstallModel(model);
}

void ModelCatalogue::InstallModel(SimPluginInterface *plugin) {

  // make sure both main and plugin use the same static datamembers (ncells, nchems...)
  plugin->SetCellsStaticDatamembers(CellBase::GetStaticDataMemberPointer());

  mesh->SetSimPlugin(plugin);
  Cell::SetNChem(plugin->NChem());
  plugin->SetParameters(&par);

  if (mainwin) {
    mainwin->RefreshInfoBar();
    mainwin->Init(0);
  }
}