Changeset - c2962c0745f8
[Not reviewed]
default
0 19 0
Michael Guravage - 15 years ago 2010-10-14 11:19:03
michael.guravage@cwi.nl
Use iteration number instead of time stamp to tag exported cell data files. Added default LeafML files to tutorials 3-5. See respective ChangeLogs for details.

--
user: Michael Guravage <michael.guravage@cwi.nl>
branch 'default'
changed data/leaves/ChangeLog
changed data/leaves/auxin_growth.xml
changed doc/v1.html
changed doc/v1.pdf
changed doc/v1.rst
changed src/ChangeLog
changed src/TutorialCode/Tutorial3/ChangeLog
changed src/TutorialCode/Tutorial3/tutorial3.h
changed src/TutorialCode/Tutorial4/ChangeLog
changed src/TutorialCode/Tutorial4/tutorial4.h
changed src/TutorialCode/Tutorial5/ChangeLog
changed src/TutorialCode/Tutorial5/tutorial5.h
changed src/VirtualLeafpar.tmpl
changed src/canvas.cpp
changed src/canvas.h
changed src/parameter.cpp
changed src/parameter.h
changed src/pardialog.cpp
changed src/pardialog.h
15 files changed:
0 comments (0 inline, 0 general)
data/leaves/ChangeLog
Show inline comments
 
2010-10-14    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* auxin_growth.xml: Changed export_fn_prefix to 'cell.'
 

	
 
2010-10-08    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* auxin_growth.xml: Added export_interval and export_fn_prefix parameters.
 

	
 

	
 
2010-06-23    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* Added: tutorial3_init.xml
 
	tutorial4_init.xml
 
	tutorial5_init.xml
 

	
 
	* Removed: bend.xml
 
	circ.xml
 
	explant.xml
 
	init.xml
 
	one_acc_point_van3.xml
 
	one_acc_point_van3_growth.xml
 
	one_acc_point_van3_growth2.xml
 
	tissue.xml
data/leaves/auxin_growth.xml
Show inline comments
 
<?xml version="1.0" encoding="UTF-8"?>
 

	
 
<!-- 
 
  $Rev$:  Revision of last commit
 
  $Author$:  Author of last commit
 
  $Source$:  Source file
 
  $Date$:  Date of last commit
 

	
 
  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.
 
-->
 

	
 
<leaf name="/Users/roel/VLeafClean_plugin/Snapshot/VLeafMacOSX/auxin_growth.xml" date="Sat Aug 29 18:28:19 2009" simtime="11660">
 
  <parameter>
 
    <par name="export_interval" val="1000"/>
 
    <par name="export_fn_prefix" val="CELLDATA_"/>
 
    <par name="export_fn_prefix" val="cell."/>
 
    <par name="arrowcolor" val="white"/>
 
    <par name="arrowsize" val="10"/>
 
    <par name="textcolor" val="red"/>
 
    <par name="cellnumsize" val="1"/>
 
    <par name="nodenumsize" val="1"/>
 
    <par name="node_mag" val="1"/>
 
    <par name="outlinewidth" val="1"/>
 
    <par name="cell_outline_color" val="forestgreen"/>
 
    <par name="resize_stride" val="10"/>
 
    <par name="T" val="1"/>
 
    <par name="lambda_length" val="100"/>
 
    <par name="lambda_celllength" val="0"/>
 
    <par name="target_length" val="60"/>
 
    <par name="cell_expansion_rate" val="10"/>
 
    <par name="cell_div_expansion_rate" val="10"/>
 
    <par name="auxin_dependent_growth" val="true"/>
 
    <par name="ode_accuracy" val="0.0001"/>
 
    <par name="mc_stepsize" val="0.4"/>
 
    <par name="mc_cell_stepsize" val="0.2"/>
 
    <par name="energy_threshold" val="1000"/>
 
    <par name="bend_lambda" val="0"/>
 
    <par name="alignment_lambda" val="0"/>
 
    <par name="rel_cell_div_threshold" val="2"/>
 
    <par name="rel_perimeter_stiffness" val="2"/>
 
    <par name="collapse_node_threshold" val="0.05"/>
 
    <par name="morphogen_div_threshold" val="0.2"/>
 
    <par name="morphogen_expansion_threshold" val="0.01"/>
 
    <par name="copy_wall" val="true"/>
 
    <par name="source" val="0"/>
 
    <par name="D">
 
      <valarray>
 
        <val v="1e-06"/>
 
        <val v="0"/>
 
        <val v="0"/>
 
        <val v="0"/>
 
      </valarray>
 
    </par>
 
    <par name="initval">
 
      <valarray>
 
        <val v="0"/>
 
        <val v="1"/>
 
        <val v="0"/>
 
        <val v="0"/>
 
      </valarray>
 
    </par>
 
    <par name="k1" val="1"/>
 
    <par name="k2" val="0.3"/>
 
    <par name="r" val="1"/>
 
    <par name="kr" val="1"/>
 
    <par name="km" val="1"/>
 
    <par name="Pi_tot" val="1"/>
 
    <par name="transport" val="0.36"/>
 
    <par name="ka" val="1"/>
 
    <par name="pin_prod" val="0"/>
 
    <par name="pin_prod_in_epidermis" val="0"/>
 
    <par name="pin_breakdown" val="0"/>
 
    <par name="pin_breakdown_internal" val="0.001"/>
 
    <par name="aux1prod" val="0.001"/>
 
    <par name="aux1prodmeso" val="0"/>
 
    <par name="aux1decay" val="0.001"/>
 
    <par name="aux1decaymeso" val="0.1"/>
 
    <par name="aux1transport" val="0.036"/>
 
    <par name="aux_cons" val="0"/>
 
    <par name="aux_breakdown" val="0.0001"/>
 
    <par name="kaux1" val="1"/>
 
    <par name="kap" val="1"/>
 
    <par name="leaf_tip_source" val="0.0001"/>
 
    <par name="sam_efflux" val="0.0001"/>
 
    <par name="sam_auxin" val="10"/>
 
    <par name="sam_auxin_breakdown" val="0"/>
 
    <par name="dt" val="0.1"/>
 
    <par name="rd_dt" val="10"/>
 
    <par name="datadir" val="auxin_growth"/>
 
    <par name="movie" val="true"/>
 
    <par name="nit" val="100000"/>
 
    <par name="maxt" val="1e+06"/>
 
    <par name="storage_stride" val="10"/>
 
    <par name="xml_storage_stride" val="500"/>
 
    <par name="rseed" val="-1"/>
 
    <par name="constituous_expansion_limit" val="16"/>
 
    <par name="vessel_inh_level" val="1"/>
 
    <par name="vessel_expansion_rate" val="0.25"/>
 
    <par name="d" val="0"/>
 
    <par name="e" val="0"/>
 
    <par name="f" val="0"/>
 
    <par name="c" val="0"/>
 
    <par name="mu" val="0"/>
 
    <par name="nu" val="0"/>
 
    <par name="rho0" val="0"/>
 
    <par name="rho1" val="0"/>
 
    <par name="c0" val="0"/>
 
    <par name="gamma" val="0"/>
 
    <par name="eps" val="0"/>
 
  </parameter>
 
  <code name="VirtualLeaf.cpp">#include &lt;fstream&gt;
 
#include &lt;sstream&gt;
 
#include &lt;cstring&gt;
 
#include &lt;functional&gt; 
 
#include &lt;getopt.h&gt;
 
#include &lt;cerrno&gt;
 
#include "mesh.h"
 
#include "parameter.h"
 
#include "random.h"
 
#include "pi.h"
 
#include "cellitem.h"
 
#include "canvas.h"
 
#include "cell.h"
 
#include "output.h"
 
#include &lt;qwidget.h&gt;
 
#include &lt;q3process.h&gt;
 
#include &lt;qapplication.h&gt;
 
#include &lt;QDesktopWidget&gt;
 
#include &lt;QGraphicsScene&gt;
 
#include &lt;QMessageBox&gt;
 
//Added by qt3to4:
 
#include &lt;QMouseEvent&gt;
 

	
 
#include &lt;unistd.h&gt;
 
#include &lt;q3textstream.h&gt; 
 

	
 

	
 
#ifdef HAVE_QWT
 
#include "data_plot.h"
 
#endif
 
#include &lt;QPalette&gt;
 
#include &lt;QBrush&gt;
 
#include &lt;QToolTip&gt;
 
#include "simplugin.h"
 
#include "testplugin.h"
 

	
 
/* #define _xstr_(s) _str_(s)
 
#define _str_(s) #s
 
#include _xstr_(REACTIONS_HEADER)
 
*/
 
extern Parameter par;
 

	
 
MainBase *main_window = 0;
 
double auxin_account = 0.;
 

	
 

	
 

	
 
TestPlugin *plugin = new TestPlugin();
 

	
 
#ifdef XFIGGRAPHICS
 
#define TIMESTEP double Graphics::TimeStep(void)
 
#endif
 

	
 
class PrintNode {
 
public:
 
  void operator() (const Node &amp;n) const 
 
  {
 
    cerr &lt;&lt; n.Index() &lt;&lt; ": " &lt;&lt; n &lt;&lt;  endl;
 
  }
 
};
 

	
 

	
 
class EdgeSource {
 
	
 
public:
 
  void operator() (Cell &amp;c) {
 
		
 
    if (c.AtBoundaryP()) {
 
      cerr &lt;&lt; "Cell " &lt;&lt; c.Index() &lt;&lt; " is a source cell.\n";
 
      c.SetSource(0,par.source);
 
    } else {
 
      cerr &lt;&lt; "Cell " &lt;&lt; c.Index() &lt;&lt; " is _not_ a source cell.\n";
 
    }
 
  }
 
	
 
};
 

	
 

	
 

	
 
class CellInfo {
 
public:
 
  void operator() (Cell &amp;c,std::ostream &amp;os) const {
 
    os &lt;&lt; "Cell " &lt;&lt; c.index &lt;&lt; " says: " &lt;&lt; endl;
 
    os &lt;&lt; "c.nodes.size() = " &lt;&lt; c.nodes.size() &lt;&lt; endl;
 
    for (list&lt;Node *&gt;::iterator i=c.nodes.begin();
 
	 i!=c.nodes.end();
 
	 i++) {
 
      cerr &lt;&lt; (*i)-&gt;Index() &lt;&lt; " ";
 
    }
 
    cerr &lt;&lt; endl;
 
  }
 
};
 

	
 
double PINSum(Cell &amp;c) {
 
	
 
	return c.Chemical(1) + c.SumTransporters(1);// + c.ReduceCellAndWalls&lt;double&gt;( complex_PijAj );
 
	
 
}
 

	
 

	
 
class DrawCell {
 
public:
 
  void operator() (Cell &amp;c,QGraphicsScene &amp;canvas, MainBase &amp;m) const {
 
    if (m.ShowBorderCellsP() || c.Boundary()==Cell::None) {
 
      if (!m.ShowBoundaryOnlyP() &amp;&amp; !m.HideCellsP()) 
 
	if (m.ShowToolTipsP()) {
 
	  QString info_string=QString("Cell %1, chemicals: ( %2, %3, %4, %5, %6)\n %7 of PIN1 at walls.\n Area is %8\n PIN sum is %9\n Circumference is %10\n Boundary type is %11").arg(c.Index()).arg(c.Chemical(0)).arg(c.Chemical(1)).arg(c.Chemical(2)).arg(c.Chemical(3)).arg(c.Chemical(4)).arg(c.SumTransporters(1)).arg(c.Area()).arg(PINSum(c)).arg(c.Circumference()).arg(c.BoundaryStr());
 
					
 
	  info_string += "\n" + c.printednodelist();
 
					
 
	  c.Draw(&amp;canvas, info_string);
 
	} else {
 
	  c.Draw(&amp;canvas);
 
	}
 
      if (m.ShowCentersP())
 
	c.DrawCenter(&amp;canvas);
 
    if (m.ShowFluxesP())
 
	c.DrawFluxes(&amp;canvas, par.arrowsize);
 
			
 
       }
 
 
 
  }
 
	
 
};
 

	
 
Mesh mesh;
 
bool batch=false;
 

	
 

	
 
void MainBase::Plot(int resize_stride) {
 
	
 
  clear();
 
    
 
	
 
  static int count=0;
 
  if (resize_stride) {
 
    if ( !((++count)%resize_stride) ) {
 
      FitLeafToCanvas();
 
    }
 
  }
 
  mesh.LoopCells(DrawCell(),canvas,*this);
 
	
 
  if (ShowNodeNumbersP()) 
 
    mesh.LoopNodes( bind2nd (mem_fun_ref ( &amp;Node::DrawIndex), &amp;canvas ) ) ;
 
  if (ShowCellNumbersP()) 
 
    mesh.LoopCells( bind2nd (mem_fun_ref ( &amp;Cell::DrawIndex), &amp;canvas ) ) ;
 
	
 
  if (ShowCellAxesP()) 
 
    mesh.LoopCells( bind2nd (mem_fun_ref ( &amp;Cell::DrawAxis), &amp;canvas ) );
 
	
 
  if (ShowCellStrainP()) 
 
    mesh.LoopCells( bind2nd (mem_fun_ref ( &amp;Cell::DrawStrain), &amp;canvas ) );
 
	
 
  if (ShowWallsP())
 
  
 
    mesh.LoopWalls( bind2nd( mem_fun_ref( &amp;Wall::Draw ), &amp;canvas ) );
 
	
 
	if (ShowApoplastsP()) 
 
		mesh.LoopWalls( bind2nd( mem_fun_ref( &amp;Wall::DrawApoplast ), &amp;canvas ) );
 
 
 
	if (ShowMeshP()) 
 
    mesh.DrawNodes(&amp;canvas);
 
	
 
  if (ShowBoundaryOnlyP()) 
 
    mesh.DrawBoundary(&amp;canvas);
 

	
 
  
 
	if ( ( batch || MovieFramesP() )) {
 
		
 
		static int frame = 0;
 
		// frame numbers are sequential for the most frequently written file type.
 
		// for the less frequently written file type they match the other type
 
		if (!(count%par.storage_stride) )  {
 
		
 
			stringstream fname;
 
			fname &lt;&lt; par.datadir &lt;&lt; "/leaf.";
 
			fname.fill('0');
 
			fname.width(6);
 
	
 
			/* 
 
			 fname &lt;&lt; frame &lt;&lt; ".pdf";
 
			if (par.storage_stride &lt;= par.xml_storage_stride) {
 
				frame++;
 
			}
 
			
 
			// Write high-res JPG snapshot every plot step
 
			Save(fname.str().c_str(), "PDF");
 
			*/
 
			
 
			fname &lt;&lt; frame &lt;&lt; ".jpg";
 
			if (par.storage_stride &lt;= par.xml_storage_stride) {
 
				frame++;
 
			}
 
			
 
			// Write high-res JPG snapshot every plot step
 
			Save(fname.str().c_str(), "JPEG",1024,768);
 
			
 
		}
 
	
 
		if (!(count%par.xml_storage_stride)) {
 
			stringstream fname;
 
			fname &lt;&lt; par.datadir &lt;&lt; "/leaf.";
 
			fname.fill('0');
 
			fname.width(6);
 
			fname &lt;&lt; frame &lt;&lt; ".xml";
 
	
 
			if (par.xml_storage_stride &lt; par.storage_stride) {
 
				frame++;
 
			}
 
			// Write XML file every ten plot steps
 
			mesh.XMLSave(fname.str().c_str(), XMLSettingsTree());
 
		}
 
		
 
	}
 
}
 

	
 

	
 
void Cell::Flux(double *flux, double *D)  {
 
	
 

	
 
  // loop over cell edges
 
	
 
  for (int c=0;c&lt;Cell::nchem;c++) flux[c]=0.;
 
	
 
  for (list&lt;Wall *&gt;::iterator i=walls.begin();
 
       i!=walls.end();
 
       i++) {
 
		
 
		
 
    // leaf cannot take up chemicals from environment ("no flux boundary")
 
    if ((*i)-&gt;c2-&gt;BoundaryPolP()) continue;
 
		
 
  	
 
    // flux depends on edge length and concentration difference
 
    for (int c=0;c&lt;Cell::nchem;c++) {
 
      double phi = (*i)-&gt;length * ( D[c] ) * ( (*i)-&gt;c2-&gt;chem[c] - chem[c] );
 
			
 
      if ((*i)-&gt;c1!=this) {
 
	cerr &lt;&lt; "Warning, bad cells boundary: " &lt;&lt; (*i)-&gt;c1-&gt;index &lt;&lt; ", " &lt;&lt; index &lt;&lt; endl;
 
      }
 
			
 
      flux[c] += phi;
 
    }    
 
  }
 
	
 
}
 

	
 
INIT {
 
	
 
	if (leaffile) { 
 
    xmlNode *settings;
 
    mesh.XMLRead(leaffile, &amp;settings);
 
    main_window-&gt;XMLReadSettings(settings);
 
    xmlFree(settings);
 
    main_window-&gt;UserMessage(QString("Ready. Time is %1").arg(mesh.getTimeHours().c_str()));
 
		
 
  } else {
 
		
 
	  Cell &amp;circle=mesh.CircularCell(0,0,10,10);
 
    		
 
    circle.SetTargetArea(circle.CalcArea());
 
	  mesh.SetBaseArea();
 
	// clean up chemicals 
 
	  for (int c=0; c&lt;Cell::NChem(); c++) {
 
		  circle.SetChemical(c, 0.);
 
      }
 
  }
 
}
 

	
 
TIMESTEP {
 
	
 
  static int i=0;
 
  static int t=0;
 
  static int ncells;
 
	
 
  if (!batch) {
 
    UserMessage(QString("Time: %1").arg(mesh.getTimeHours().c_str()),0);
 
  }
 
			 
 
  ncells=mesh.NCells();
 
		
 
				
 
  double dh;
 
  		
 
  if(DynamicCellsP()) {
 
    dh = mesh.DisplaceNodes();
 
			
 
    // Only allow for node insertion, cell division and cell growth
 
    // if the system has equillibrized
 
    // i.e. cell wall tension equillibrization is much faster
 
    // than biological processes, including division, cell wall yielding
 
    // and cell expansion
 
    mesh.InsertNodes(); // (this amounts to cell wall yielding)
 
			
 
    if ( (-dh) &lt; par.energy_threshold) {
 
				
 
      mesh.IncreaseCellCapacityIfNecessary();
 
		mesh.LoopCurrentCells(&amp;TestPlugin::CellHouseKeeping); // this includes cell division
 
				
 
      // Reaction diffusion	
 
		/*CelltoCellTransport *transport_f = &amp;TestPlugin::CelltoCellTransport;
 
      CellReaction *cellreaction_f = new plugin-&gt;CellDynamics();
 
      WallReaction *wall_f = new WallDynamics();*/
 
				
 
      mesh.ReactDiffuse(plugin, par.rd_dt);
 
		
 
				
 
      t++;
 
				
 
      Plot(par.resize_stride);
 
		
 
		/*QVector&lt; QPair&lt;double, int&gt; &gt; angles=mesh.VertexAnglesValues();
 
		QString afname=QString("Angles/anglesvalues%1.dat").arg(t,6,10,QChar('0'));
 
		ofstream af(afname.toStdString().c_str());
 
		*/
 
		
 
		/*for (QVector&lt; QPair&lt;qreal, int&gt; &gt;::const_iterator v=angles.begin();
 
			 v!=angles.end();
 
			 v++) {
 
			af &lt;&lt; v-&gt;first &lt;&lt; " " &lt;&lt; v-&gt;second &lt;&lt; endl;
 
			}
 
			*/
 
			}
 
		
 
			} else {
 
			
 
  /*  TransportFunction *transport_f = new CelltoCellTransport();
 
    CellReaction *cellreaction_f = new CellDynamics();
 
    WallReaction *wall_f = new WallDynamics();
 
			
 
    mesh.ReactDiffuse_New(transport_f, cellreaction_f, wall_f, par.rd_dt);*/
 
				mesh.ReactDiffuse(plugin, par.rd_dt);
 
		
 
    Plot(par.resize_stride);
 
			
 
  }
 
	
 
	
 

	
 
		
 
		
 
  i++;
 
  return mesh.getTime();
 
		
 
}
 
		
 
		
 
				
 
/* Called if a cell is clicked */
 
void Cell::OnClick(QMouseEvent *e) {
 
					
 
}
 
				
 
				
 

	
 
void Wall::OnWallInsert(void) {
 
				  
 

	
 
}
 

	
 
				
 
				
 
				
 
int main(int argc,char **argv) {
 
					
 
  try {
 
						
 

	
 
    int c;
 

	
 
						
 
    char *leaffile=0;
 

	
 
						
 
    while (1) {
 
							
 
      //int this_option_optind = optind ? optind : 1;
 
      int option_index = 0;
 
      static struct option long_options[] = {
 
	{"batch", 0, 0, 0},
 
	{"leaffile", 2, 0, 0}
 
      };
 
		
 
      // short option 'p' creates trouble for non-commandline usage on MacOSX. Option -p changed to -P (capital)
 
      static char *short_options = "bl";
 
      c = getopt_long (argc, argv, "bl:",
 
		       long_options, &amp;option_index);
 
      if (c == -1)
 
	break;
 
		
 
		
 
      if (c==0) {
 
	printf ("option %s", long_options[option_index].name);
 
	if (optarg)
 
	  printf (" with arg %s", optarg);
 
	printf ("\n");
 
			
 
	c = short_options[option_index];
 
      }
 
		
 
      switch (c) {
 
      case 'b':
 
	cerr &lt;&lt; "Running in batch mode\n";
 
	batch=true;
 
	break;
 
				
 
      case 'l':
 
	leaffile=strdup(optarg);
 
	if (!leaffile) {
 
	  throw("Out of memory");
 
	}
 
	printf("Reading leaf state file '%s'\n", leaffile);
 
	break;
 
				
 
      case '?':
 
	break;
 
				
 
      default:
 
	printf ("?? getopt returned character code 0%o ??\n", c);
 
      }
 
    }
 
	  
 
	  
 
    if (optind &lt; argc) {
 
      printf ("non-option ARGV-elements: ");
 
      while (optind &lt; argc)
 
	printf ("%s ", argv[optind++]);
 
      printf ("\n");
 
    }
 
	  
 
	  MakeDir("Angles");
 
    bool useGUI = !batch;
 
    QApplication app(argc,argv,useGUI);
 
						
 

	
 
    
 
    QPalette tooltippalette = QToolTip::palette();
 
    QColor transparentcolor = QColor(tooltippalette.brush(QPalette::Window).color());
 

	
 
    tooltippalette.setBrush (QPalette::Window, QBrush (transparentcolor) );
 
    QToolTip::setPalette( tooltippalette );
 

	
 
    QGraphicsScene canvas(0,0,8000,6000);
 

	
 
    if (useGUI) {
 
         main_window=new Main(canvas, mesh);
 
      if ( QApplication::desktop()-&gt;width() &gt; ((Main *)main_window)-&gt;width() + 10
 
	   &amp;&amp; QApplication::desktop()-&gt;height() &gt; ((Main *)main_window)-&gt;height() +30 ) {
 

	
 
	((Main *)main_window)-&gt;show();
 
	((Main *)main_window)-&gt;resize( ((Main *)main_window)-&gt;sizeHint());
 
    } else {
 
        ((Main *)main_window)-&gt;showMaximized();
 
    }
 
  } else {
 
        main_window=new MainBase(canvas, mesh);
 

	
 
 }
 

	
 
    
 
	  
 
    canvas.setSceneRect(QRectF());
 
    if (!batch) {
 
      QObject::connect( qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(quit()) );
 
    }
 

	
 
						
 
 		
 
    main_window-&gt;Init(leaffile);
 
	  
 
    Cell::SetMagnification(10);
 
    Cell::setOffset(0,0);
 
						
 
    main_window-&gt;FitLeafToCanvas();
 
						
 
				
 
						
 
    main_window-&gt;Plot();
 

	
 
						
 

	
 
    if (batch) {
 
      double t=0.;
 
      do {
 
	t = main_window-&gt;TimeStep();
 
      } while (t &lt; par.maxt);
 
							
 
    } else
 
      return app.exec();
 
	  
 
						
 
  } catch (const char *message) {
 
    if (batch) { 
 
      cerr &lt;&lt; "Exception caught:" &lt;&lt; endl;
 
      cerr &lt;&lt; message &lt;&lt; endl;
 
      abort();
 
    } else {
 
      QString qmess=QString("Exception caught: %1").arg(message);
 
      QMessageBox::critical(0, "Critical Error", qmess);
 
      abort();
 
    }
 
  } catch (ios_base::failure) {
 
    stringstream error_message;
 
    error_message &lt;&lt; "I/O failure: " &lt;&lt; strerror(errno);
 
    if (batch) {
 
      cerr &lt;&lt; error_message.str() &lt;&lt;endl;
 
      abort();
 
    } else {
 
      QString qmess(error_message.str().c_str());
 
      QMessageBox::critical(0, "I/O Error", qmess );
 
      abort();
 
    }
 
  }
 
					
 
}
 
</code>
 
  <code name="reactions_pce_growth.h">
 

	
 
// Executed after the cellular mechanics steps have equillibrized
 
class CellHouseKeeping {
 
public:
 
	void operator() (Cell &amp;c) const {
 
		
 
		c.EnlargeTargetArea(par.cell_expansion_rate);
 
		
 
		if (c.Area() &gt; par.rel_cell_div_threshold * c.BaseArea() ) {
 
			c.Divide();
 
		}
 
	}
 
};
 

	
 
// The number of chemical species in the cels
 
const int Cell::nchem = 0;
 

	
 
// Differential equations describing transport of chemicals from cell to cell
 
class CelltoCellTransport : public TransportFunction {
 

	
 
 public:
 
	virtual void operator()(Wall *w, double *dchem_c1, double *dchem_c2) {}
 
    
 
 };
 

	
 
// Differential equations describing chemical reactions taking place at or near the cell walls
 
// (e.g. PIN accumulation)
 
class WallDynamics : public WallReaction {
 
 public:
 
	virtual void operator()(Wall *w, double *dw1, double *dw2) {}; 
 
	
 
};
 

	
 

	
 
// Differential equations describing chemical reactions inside the cells
 
class CellDynamics : public CellReaction {
 
 public:
 
	virtual void operator()(Cell *c, double *dchem) {
 
	
 
	};
 
	
 
};
 

	
 
// Rules for cell coloring
 
void Cell::SetColor(QColor &amp;color) { }
 

	
 
// To be executed after cell division
 
void Cell::OnDivide(ParentInfo &amp;parent_info, Cell &amp;daughter) {}
 

	
 
</code>
 
  <nodes n="22" target_length="3.09017">
 
    <node x="22.9634" y="-2.37264" fixed="false" boundary="true" sam="false"/>
 
    <node x="14.6882" y="17.9118" fixed="false" boundary="true" sam="false"/>
 
    <node x="1.57936" y="25.1246" fixed="false" boundary="true" sam="false"/>
 
    <node x="-9.0893" y="22.8165" fixed="false" boundary="true" sam="false"/>
 
    <node x="-19.7055" y="16.962" fixed="false" boundary="true" sam="false"/>
 
    <node x="-22.6839" y="5.00143" fixed="false" boundary="true" sam="false"/>
 
    <node x="-14.7271" y="-15.2131" fixed="false" boundary="true" sam="false"/>
 
    <node x="-6.78413" y="-23.4002" fixed="false" boundary="true" sam="false"/>
 
    <node x="3.60766" y="-25.1355" fixed="false" boundary="true" sam="false"/>
 
    <node x="21.3032" y="-13.6899" fixed="false" boundary="true" sam="false"/>
 
    <node x="17.4704" y="7.41573" fixed="false" boundary="true" sam="false"/>
 
    <node x="-17.5799" y="-5.20265" fixed="false" boundary="true" sam="false"/>
 
    <node x="9.86837" y="4.69636" fixed="false" boundary="false" sam="false"/>
 
    <node x="-9.28449" y="-3.92969" fixed="false" boundary="false" sam="false"/>
 
    <node x="12.5597" y="-20.5161" fixed="false" boundary="true" sam="false"/>
 
    <node x="-1.62187" y="-3.10623" fixed="false" boundary="false" sam="false"/>
 
    <node x="7.55765" y="-14.4922" fixed="false" boundary="false" sam="false"/>
 
    <node x="2.97596" y="-8.80653" fixed="false" boundary="false" sam="false"/>
 
    <node x="1.95125" y="3.2756" fixed="false" boundary="false" sam="false"/>
 
    <node x="-6.54614" y="15.4702" fixed="false" boundary="false" sam="false"/>
 
    <node x="-2.72983" y="8.96705" fixed="false" boundary="false" sam="false"/>
 
    <node x="9.33552" y="23.0046" fixed="false" boundary="true" sam="false"/>
 
  </nodes>
 
  <cells n="4" offsetx="0" offsety="0" magnification="10" base_area="293.893" nchem="2">
 
    <cell index="0" area="405.845" target_area="548.609" target_length="60" lambda_celllength="0" stiffness="0" fixed="false" pin_fixed="false" at_boundary="true" dead="false" source="false" boundary="None" div_counter="2" cell_type="0">
 
      <node n="13"/>
 
      <node n="11"/>
 
      <node n="6"/>
 
      <node n="7"/>
 
      <node n="8"/>
 
      <node n="14"/>
 
      <node n="16"/>
 
      <node n="17"/>
 
      <node n="15"/>
 
      <wall w="6"/>
 
      <wall w="0"/>
 
      <wall w="1"/>
 
      <chem n="2">
 
        <val v="0.251808"/>
 
        <val v="0.481961"/>
 
      </chem>
 
    </cell>
 
    <cell index="1" area="385.557" target_area="547.081" target_length="60" lambda_celllength="0" stiffness="0" fixed="false" pin_fixed="false" at_boundary="true" dead="false" source="false" boundary="None" div_counter="2" cell_type="0">
 
      <node n="12"/>
 
      <node n="10"/>
 
      <node n="1"/>
 
      <node n="21"/>
 
      <node n="2"/>
 
      <node n="3"/>
 
      <node n="19"/>
 
      <node n="20"/>
 
      <node n="18"/>
 
      <wall w="3"/>
 
      <wall w="4"/>
 
      <wall w="5"/>
 
      <chem n="2">
 
        <val v="0.250735"/>
 
        <val v="0.481961"/>
 
      </chem>
 
    </cell>
 
    <cell index="2" area="422.94" target_area="565.987" target_length="60" lambda_celllength="0" stiffness="0" fixed="false" pin_fixed="false" at_boundary="true" dead="false" source="false" boundary="None" div_counter="2" cell_type="0">
 
      <node n="9"/>
 
      <node n="0"/>
 
      <node n="10"/>
 
      <node n="12"/>
 
      <node n="18"/>
 
      <node n="15"/>
 
      <node n="17"/>
 
      <node n="16"/>
 
      <node n="14"/>
 
      <wall w="1"/>
 
      <wall w="2"/>
 
      <wall w="8"/>
 
      <wall w="4"/>
 
      <chem n="2">
 
        <val v="0.307348"/>
 
        <val v="0.481245"/>
 
      </chem>
 
    </cell>
 
    <cell index="3" area="432.871" target_area="573.317" target_length="60" lambda_celllength="0" stiffness="0" fixed="false" pin_fixed="false" at_boundary="true" dead="false" source="false" boundary="None" div_counter="2" cell_type="0">
 
      <node n="4"/>
 
      <node n="5"/>
 
      <node n="11"/>
 
      <node n="13"/>
 
      <node n="15"/>
 
      <node n="18"/>
 
      <node n="20"/>
 
      <node n="19"/>
 
      <node n="3"/>
 
      <wall w="5"/>
 
      <wall w="6"/>
 
      <wall w="7"/>
 
      <wall w="8"/>
 
      <chem n="2">
 
        <val v="0.321108"/>
 
        <val v="0.481222"/>
 
      </chem>
 
    </cell>
 
    <boundary_polygon index="-1" area="1647.21" target_area="1" target_length="60" lambda_celllength="0" stiffness="0" fixed="false" pin_fixed="false" at_boundary="false" dead="false" source="false" boundary="None" div_counter="0" cell_type="0">
 
      <node n="0"/>
 
      <node n="10"/>
 
      <node n="1"/>
 
      <node n="21"/>
 
      <node n="2"/>
 
      <node n="3"/>
 
      <node n="4"/>
doc/v1.html
Show inline comments
 
<?xml version="1.0" encoding="utf-8" ?>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 
<head>
 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 
<meta name="generator" content="Docutils 0.6: http://docutils.sourceforge.net/" />
 
<title>The Virtual Leaf</title>
 
<style type="text/css">
 

	
 
/*
 
:Author: David Goodger (goodger@python.org)
 
:Id: $Id: html4css1.css 5951 2009-05-18 18:03:10Z milde $
 
:Copyright: This stylesheet has been placed in the public domain.
 

	
 
Default cascading style sheet for the HTML output of Docutils.
 

	
 
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
 
customize this style sheet.
 
*/
 

	
 
/* used to remove borders from tables and images */
 
.borderless, table.borderless td, table.borderless th {
 
  border: 0 }
 

	
 
table.borderless td, table.borderless th {
 
  /* Override padding for "table.docutils td" with "! important".
 
     The right padding separates the table cells. */
 
  padding: 0 0.5em 0 0 ! important }
 

	
 
.first {
 
  /* Override more specific margin styles with "! important". */
 
  margin-top: 0 ! important }
 

	
 
.last, .with-subtitle {
 
  margin-bottom: 0 ! important }
 

	
 
.hidden {
 
  display: none }
 

	
 
a.toc-backref {
 
  text-decoration: none ;
 
  color: black }
 

	
 
blockquote.epigraph {
 
  margin: 2em 5em ; }
 

	
 
dl.docutils dd {
 
  margin-bottom: 0.5em }
 

	
 
/* Uncomment (and remove this text!) to get bold-faced definition list terms
 
dl.docutils dt {
 
  font-weight: bold }
 
*/
 

	
 
div.abstract {
 
  margin: 2em 5em }
 

	
 
div.abstract p.topic-title {
 
  font-weight: bold ;
 
  text-align: center }
 

	
 
div.admonition, div.attention, div.caution, div.danger, div.error,
 
div.hint, div.important, div.note, div.tip, div.warning {
 
  margin: 2em ;
 
  border: medium outset ;
 
  padding: 1em }
 

	
 
div.admonition p.admonition-title, div.hint p.admonition-title,
 
div.important p.admonition-title, div.note p.admonition-title,
 
div.tip p.admonition-title {
 
  font-weight: bold ;
 
  font-family: sans-serif }
 

	
 
div.attention p.admonition-title, div.caution p.admonition-title,
 
div.danger p.admonition-title, div.error p.admonition-title,
 
div.warning p.admonition-title {
 
  color: red ;
 
  font-weight: bold ;
 
  font-family: sans-serif }
 

	
 
/* Uncomment (and remove this text!) to get reduced vertical space in
 
   compound paragraphs.
 
div.compound .compound-first, div.compound .compound-middle {
 
  margin-bottom: 0.5em }
 

	
 
div.compound .compound-last, div.compound .compound-middle {
 
  margin-top: 0.5em }
 
*/
 

	
 
div.dedication {
 
  margin: 2em 5em ;
 
  text-align: center ;
 
  font-style: italic }
 

	
 
div.dedication p.topic-title {
 
  font-weight: bold ;
 
  font-style: normal }
 

	
 
div.figure {
 
  margin-left: 2em ;
 
  margin-right: 2em }
 

	
 
div.footer, div.header {
 
  clear: both;
 
  font-size: smaller }
 

	
 
div.line-block {
 
  display: block ;
 
  margin-top: 1em ;
 
  margin-bottom: 1em }
 

	
 
div.line-block div.line-block {
 
  margin-top: 0 ;
 
  margin-bottom: 0 ;
 
  margin-left: 1.5em }
 

	
 
div.sidebar {
 
  margin: 0 0 0.5em 1em ;
 
  border: medium outset ;
 
  padding: 1em ;
 
  background-color: #ffffee ;
 
  width: 40% ;
 
  float: right ;
 
  clear: right }
 

	
 
div.sidebar p.rubric {
 
  font-family: sans-serif ;
 
  font-size: medium }
 

	
 
div.system-messages {
 
  margin: 5em }
 

	
 
div.system-messages h1 {
 
  color: red }
 

	
 
div.system-message {
 
  border: medium outset ;
 
  padding: 1em }
 

	
 
div.system-message p.system-message-title {
 
  color: red ;
 
  font-weight: bold }
 

	
 
div.topic {
 
  margin: 2em }
 

	
 
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
 
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
 
  margin-top: 0.4em }
 

	
 
h1.title {
 
  text-align: center }
 

	
 
h2.subtitle {
 
  text-align: center }
 

	
 
hr.docutils {
 
  width: 75% }
 

	
 
img.align-left, .figure.align-left{
 
  clear: left ;
 
  float: left ;
 
  margin-right: 1em }
 

	
 
img.align-right, .figure.align-right {
 
  clear: right ;
 
  float: right ;
 
  margin-left: 1em }
 

	
 
.align-left {
 
  text-align: left }
 

	
 
.align-center {
 
  clear: both ;
 
  text-align: center }
 

	
 
.align-right {
 
  text-align: right }
 

	
 
/* reset inner alignment in figures */
 
div.align-right {
 
  text-align: left }
 

	
 
/* div.align-center * { */
 
/*   text-align: left } */
 

	
 
ol.simple, ul.simple {
 
  margin-bottom: 1em }
 

	
 
ol.arabic {
 
  list-style: decimal }
 

	
 
ol.loweralpha {
 
  list-style: lower-alpha }
 

	
 
ol.upperalpha {
 
  list-style: upper-alpha }
 

	
 
ol.lowerroman {
 
  list-style: lower-roman }
 

	
 
ol.upperroman {
 
  list-style: upper-roman }
 

	
 
p.attribution {
 
  text-align: right ;
 
  margin-left: 50% }
 

	
 
p.caption {
 
  font-style: italic }
 

	
 
p.credits {
 
  font-style: italic ;
 
  font-size: smaller }
 

	
 
p.label {
 
  white-space: nowrap }
 

	
 
p.rubric {
 
  font-weight: bold ;
 
  font-size: larger ;
 
  color: maroon ;
 
  text-align: center }
 

	
 
p.sidebar-title {
 
  font-family: sans-serif ;
 
  font-weight: bold ;
 
  font-size: larger }
 

	
 
p.sidebar-subtitle {
 
  font-family: sans-serif ;
 
  font-weight: bold }
 

	
 
p.topic-title {
 
  font-weight: bold }
 

	
 
pre.address {
 
  margin-bottom: 0 ;
 
  margin-top: 0 ;
 
  font: inherit }
 

	
 
pre.literal-block, pre.doctest-block {
 
  margin-left: 2em ;
 
  margin-right: 2em }
 

	
 
span.classifier {
 
  font-family: sans-serif ;
 
  font-style: oblique }
 

	
 
span.classifier-delimiter {
 
  font-family: sans-serif ;
 
  font-weight: bold }
 

	
 
span.interpreted {
 
  font-family: sans-serif }
 

	
 
span.option {
 
  white-space: nowrap }
 

	
 
span.pre {
 
  white-space: pre }
 

	
 
span.problematic {
 
  color: red }
 

	
 
span.section-subtitle {
 
  /* font-size relative to parent (h1..h6 element) */
 
  font-size: 80% }
 

	
 
table.citation {
 
  border-left: solid 1px gray;
 
  margin-left: 1px }
 

	
 
table.docinfo {
 
  margin: 2em 4em }
 

	
 
table.docutils {
 
  margin-top: 0.5em ;
 
  margin-bottom: 0.5em }
 

	
 
table.footnote {
 
  border-left: solid 1px black;
 
  margin-left: 1px }
 

	
 
table.docutils td, table.docutils th,
 
table.docinfo td, table.docinfo th {
 
  padding-left: 0.5em ;
 
  padding-right: 0.5em ;
 
  vertical-align: top }
 

	
 
table.docutils th.field-name, table.docinfo th.docinfo-name {
 
  font-weight: bold ;
 
  text-align: left ;
 
  white-space: nowrap ;
 
  padding-left: 0 }
 

	
 
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
 
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
 
  font-size: 100% }
 

	
 
ul.auto-toc {
 
  list-style-type: none }
 

	
 
</style>
 
</head>
 
<body>
 
<div class="header">
 
###Title###
 
<hr class="header"/>
 
</div>
 
<div class="document" id="the-virtual-leaf">
 
<h1 class="title">The Virtual Leaf</h1>
 

	
 
<div class="section" id="friday-11-june-2010">
 
<h1>Friday 11 June 2010</h1>
 
<p>Issues:</p>
 
<blockquote>
 
<ol class="arabic">
 
<li><p class="first">Every class that has an association or composition eventually will
 
need its own custom view page template, e.g. sed_view. For the moment
 
I have set the default view for these classes to dev_view ( a copy of
 
base_view ).</p>
 
</li>
 
<li><p class="first">An association in UML is cast as a ReferenceField in the resulting
 
class schema. Open the association and add the widget:label tag to
 
the class that is being associated.</p>
 
</li>
 
<li><p class="first">The default description text for a class should be a informative
 
description of the class, not the instance, derived from the
 
SED-ML manual.</p>
 
</li>
 
<li><p class="first">Apply 'searchable' tags to the appropriate class attributes.</p>
 
</li>
 
<li><p class="first">I choose 'isTidyHtmlWithCleanup' as the MathML validator. Will
 
this work?</p>
 
</li>
 
<li><p class="first">What should be added to our implementation of SED-ML to make it
 
more than merely a mirror image of the SED-ML XML format?</p>
 
<blockquote>
 
<ol class="loweralpha simple">
 
<li>The ability to attach files at various points, e.g. parameter files.</li>
 
<li>Additional output types, e.g. animations.</li>
 
<li>Custom page templates</li>
 
<li>Custom search form</li>
 
<li>Custom catalog indexes</li>
 
<li>Custom portlet(s)</li>
 
<li>Custom viewlet(s)</li>
 
</ol>
 
</blockquote>
 
</li>
 
</ol>
 
</blockquote>
 
</div>
 
<div class="section" id="friday-24-september-2010">
 
<h1>Friday 24 September 2010</h1>
 
<dl class="docutils">
 
<dt>To Do:</dt>
 
<dd><ol class="first last arabic simple">
 
<li>Publish our mercurial repositories (Chris/Martin). This may mesh with deploying Plone.</li>
 
<li>Create a vleaf mailing list (Henk).</li>
 
</ol>
 
</dd>
 
</dl>
 
<p>Found an article on SBRML - a markup language for associating systems
 
biology data with models. At a glance the schema seems bigger than
 
SED-ML's, but SBRML appears to be SBML specific.</p>
 
</div>
 
<div class="section" id="monday-27-september-2010">
 
<h1>Monday 27 September 2010</h1>
 
<p>Spoke with Chris about publishing the Mercurial repositories and
 
deploying Plone. Both can be accomplished in their own project space
 
on a server in the DMZ. Chris said he would supply me with login
 
credentials for both accounts. I will install Plone and Chris (or
 
Maarten) will help me configure Apache/nginx and Varnish. Chris will
 
install the required Mercurial packages; after which I can clone the
 
repositories to their new home.</p>
 
</div>
 
<div class="section" id="tuesday-5-october-20010">
 
<h1>Tuesday 5 October 20010</h1>
 
<div class="section" id="tutorial0-pro">
 
<h2>tutorial0.pro</h2>
 
<p>Added simplugin.h to list of header files. NB: this is the only
 
tutorial in which simplugin.h appears.</p>
 
</div>
 
<div class="section" id="auxingrowthplugin-h">
 
<h2>auxingrowthplugin.h</h2>
 
<p>Declared, and defined, a virtual function named <tt class="docutils literal">DefaultLeafML()</tt>
 
which merely returns a QString naming a LeafML filename sans path.</p>
 
</div>
 
<div class="section" id="virtualleaf-cpp">
 
<h2>VirtualLeaf.cpp</h2>
 
<p>Moved <tt class="docutils literal"><span class="pre">Cell::SetMagnification()</span></tt> and <tt class="docutils literal"><span class="pre">Cell::SetOffset()</span></tt> from
 
<tt class="docutils literal">main()</tt> to <tt class="docutils literal"><span class="pre">MainBase::Init()</span></tt>.</p>
 
</div>
 
<div class="section" id="canvas-h">
 
<h2>canvas.h</h2>
 
<p>Declare <tt class="docutils literal">exportCellData()</tt>.</p>
 
</div>
 
<div class="section" id="canvas-cpp">
 
<h2>canvas.cpp</h2>
 
<p>Add an 'Export cell areas' to the file dropdown menu which invokes - surprise - <tt class="docutils literal"><span class="pre">Main::exportCellData()</span></tt>:</p>
 
<pre class="literal-block">
 
void Main::exportCellData(void) {
 
  QFile file(&quot;areas.csv&quot;);
 
  if ( file.open( IO_WriteOnly ) ) {
 
    QTextStream stream( &amp;file );
 
    mesh.CSVExportCellData(stream);
 
    mesh.CSVExportMeshData(stream);
 
    file.close();
 
  }
 
}
 
</pre>
 
</div>
 
<div class="section" id="mesh-h">
 
<h2>mesh.h</h2>
 
<p>Include <tt class="docutils literal">&lt;QTextStream&gt;</tt></p>
 
<p>Set the boundary_poloygon pointer to zero in the class constructor,
 
and delete it, if it exists, in the class destructor.</p>
 
<p>Declare <tt class="docutils literal">Compactness()</tt>, <tt class="docutils literal">CSVExportCellData()</tt> and <tt class="docutils literal">CSVExportMeshData()</tt>:</p>
 
<pre class="literal-block">
 
double Compactness(double *res_compactness=0, double *res_area=0, double *res_cell_area=0);
 
void CSVExportCellData(QTextStream &amp;csv_stream) const;
 
void CSVExportMeshData(QTextStream &amp;csv_stream);
 
</pre>
 
</div>
 
<div class="section" id="mesh-cpp">
 
<h2>mesh.cpp</h2>
 
<p>In <tt class="docutils literal"><span class="pre">mesh::clear()</span></tt>, delete the boundary_polygon only if the pointer hasn't been assigned:</p>
 
<pre class="literal-block">
 
if (boundary_polygon) {
 
   delete boundary_polygon;
 
   boundary_polygon=0;
 
 }
 
</pre>
 
<p>Ditto for <tt class="docutils literal"><span class="pre">mesh::clean()</span></tt>.</p>
 
<p>Define the code for <tt class="docutils literal">Compactness()</tt>, <tt class="docutils literal">CSVExportCellData()</tt> and <tt class="docutils literal">CSVExportMeshData()</tt>.</p>
 
</div>
 
<div class="section" id="modelcatalogue-cpp">
 
<h2>modelcatalogue.cpp</h2>
 
<p>In <tt class="docutils literal">InstallModel()</tt>, find and load the default LeafML file.</p>
 
</div>
 
<div class="section" id="simplugin-h">
 
<h2>simplugin.h</h2>
 
<p>Declare <tt class="docutils literal">DefaultLeafML()</tt>:</p>
 
<pre class="literal-block">
 
// Default LeafML-file to be read after model startup
 
virtual QString DefaultLeafML(void);
 
</pre>
 
</div>
 
<div class="section" id="simplugin-cpp">
 
<h2>simplugin.cpp</h2>
 
<p>Define <tt class="docutils literal">DefaultLeafML()</tt>. Returns an empty <tt class="docutils literal">QString</tt>:</p>
 
<pre class="literal-block">
 
QString SimPluginInterface::DefaultLeafML(void) { return QString(); }
 
</pre>
 
</div>
 
<div class="section" id="xmlwrite-cpp">
 
<h2>xmlwrite.cpp</h2>
 
<p>In <tt class="docutils literal"><span class="pre">Mesh::XMLReadCells()</span></tt> - Delete the boundary_ploygon only if its
 
pointer has been assigned.</p>
 
</div>
 
</div>
 
<div class="section" id="wednesday-6-october-2010">
 
<h1>Wednesday 6 October 2010</h1>
 
<p>Wrote Simon van Mourik about his missing libiconv-2.dll.</p>
 
</div>
 
<div class="section" id="thursday-7-october-2010">
 
<h1>Thursday 7 October 2010</h1>
 
<p>Added a Q3FileDialog in <tt class="docutils literal"><span class="pre">canvas.cpp:Main::exportCellData(void)</span></tt> to
 
choose where to write the exported cell data.</p>
 
</div>
 
<div class="section" id="friday-8-october-2010">
 
<h1>Friday 8 October 2010</h1>
 
<p>Added new parameters to control perodic cell exprt data.</p>
 
<p>Added code to relize perodic cell export.</p>
 
</div>
 
<div class="section" id="monday-11-october-2010">
 
<h1>Monday 11 October 2010</h1>
 
<div class="section" id="mercurial-hooks">
 
<h2>Mercurial hooks</h2>
 
<p>Tried several alternatives for Mercurial's <tt class="docutils literal">pretxnchangegroup.forbid_2heads</tt> hook.</p>
 
<ol class="arabic simple">
 
<li><a class="reference external" href="http://bitbucket.org/dgc/headcount">http://bitbucket.org/dgc/headcount</a>: <strong>Headcount</strong> <tt class="docutils literal">ui</tt> complains of a missing data member</li>
 
<li><a class="reference external" href="http://stackoverflow.com/questions/1705921/useful-mercurial-hooks">http://stackoverflow.com/questions/1705921/useful-mercurial-hooks</a>: <strong>forbid2_heads.py</strong> doesn't load</li>
 
<li><a class="reference external" href="http://davidherron.com/node/961">http://davidherron.com/node/961</a>: <strong>forbid2_heads.sh</strong> works as advertised</li>
 
</ol>
 
</div>
 
<div class="section" id="mercurial-repositories">
 
<h2>Mercurial Repositories</h2>
 
<p>Tried to install Rhode Code from: <a class="reference external" href="http://packages.python.org/RhodeCode">http://packages.python.org/RhodeCode</a>.</p>
 
<ol class="arabic simple">
 
<li><a class="reference external" href="http://bitbucket.org/marcinkuzminski/rhodecode">http://bitbucket.org/marcinkuzminski/rhodecode</a></li>
 
<li><a class="reference external" href="http://packages.python.org/RhodeCode">http://packages.python.org/RhodeCode</a>, <a class="reference external" href="http://pypi.python.org/pypi/RhodeCode/1.0.0rc3">http://pypi.python.org/pypi/RhodeCode/1.0.0rc3</a></li>
 
<li><a class="reference external" href="http://hg.python-works.com">http://hg.python-works.com</a> (demo,demo)</li>
 
<li><a class="reference external" href="http://bitbucket.org/bfrog/cutehg">http://bitbucket.org/bfrog/cutehg</a></li>
 
<li><a class="reference external" href="http://pypi.python.org/pypi/SIP">http://pypi.python.org/pypi/SIP</a>, <a class="reference external" href="http://www.riverbankcomputing.com/hg/sip">http://www.riverbankcomputing.com/hg/sip</a></li>
 
<li><a class="reference external" href="http://pypi.python.org/pypi/PyQt">http://pypi.python.org/pypi/PyQt</a></li>
 
<li><a class="reference external" href="http://ask.github.com/celery">http://ask.github.com/celery</a></li>
 
</ol>
 
<p>All goes tolerably until you tick in the url; at which point RhodeCode complains that:</p>
 
<pre class="literal-block">
 
Exception happened during processing of request from ('127.0.0.1', 35803)
 
Traceback (most recent call last):
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/httpserver.py&quot;, line 1068, in process_request_in_thread
 
   self.finish_request(request, client_address)
 
 File &quot;/ufs/guravage/opt/Python-2.6.2/lib/python2.6/SocketServer.py&quot;, line 320, in finish_request
 
   self.RequestHandlerClass(request, client_address, self)
 
 File &quot;/ufs/guravage/opt/Python-2.6.2/lib/python2.6/SocketServer.py&quot;, line 615, in __init__
 
   self.handle()
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/httpserver.py&quot;, line 442, in handle
 
   BaseHTTPRequestHandler.handle(self)
 
 File &quot;/ufs/guravage/opt/Python-2.6.2/lib/python2.6/BaseHTTPServer.py&quot;, line 329, in handle
 
   self.handle_one_request()
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/httpserver.py&quot;, line 437, in handle_one_request
 
   self.wsgi_execute()
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/httpserver.py&quot;, line 287, in wsgi_execute
 
   self.wsgi_start_response)
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/cascade.py&quot;, line 130, in __call__
 
   return self.apps[-1](environ, start_response)
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/registry.py&quot;, line 379, in __call__
 
   app_iter = self.application(environ, start_response)
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/RhodeCode-1.0.0rc1-py2.6.egg/rhodecode/lib/middleware/https_fixup.py&quot;, line 33, in __call__
 
   return self.application(environ, start_response)
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/middleware.py&quot;, line 163, in __call__
 
   self.app, new_environ, catch_exc_info=True)
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/util.py&quot;, line 48, in call_wsgi_application
 
   app_iter = application(environ, start_response)
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/WebError-0.10.2-py2.6.egg/weberror/errormiddleware.py&quot;, line 156, in __call__
 
   return self.application(environ, start_response)
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/RhodeCode-1.0.0rc1-py2.6.egg/rhodecode/lib/middleware/simplehg.py&quot;, line 55, in __call__
 
   return self.application(environ, start_response)
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Beaker-1.5.4-py2.6.egg/beaker/middleware.py&quot;, line 152, in __call__
 
   return self.wrap_app(environ, session_start_response)
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Routes-1.12.3-py2.6.egg/routes/middleware.py&quot;, line 131, in __call__
 
   response = self.app(environ, start_response)
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/wsgiapp.py&quot;, line 98, in __call__
 
   self.setup_app_env(environ, start_response)
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/wsgiapp.py&quot;, line 203, in setup_app_env
 
   pylons_obj.translator = _get_translator(lang, pylons_config=self.config)
 
 File &quot;/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/i18n/translation.py&quot;, line 165, in _get_translator
 
   raise LanguageError('IOError: %s' % ioe)
 
LanguageError: IOError: [Errno 2] No translation file found for domain: 'rhodecode'
 
</pre>
 
</div>
 
<div class="section" id="re-install">
 
<h2>RE-INSTALL</h2>
 
<blockquote>
 
<ol class="arabic simple">
 
<li>easy_install mercurial</li>
 
<li>mkdir src</li>
 
<li>cd src</li>
 
<li>hg clone <a class="reference external" href="http://www.riverbankcomputing.com/hg/sip">http://www.riverbankcomputing.com/hg/sip</a></li>
 
<li>cd sip</li>
 
<li>python build.py prepare</li>
 
<li>python configure.py</li>
 
<li>make</li>
 
<li>make install</li>
 
</ol>
 
</blockquote>
 
<div class="system-message">
 
<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">v1.rst</tt>, line 295)</p>
 
Block quote ends without a blank line; unexpected unindent.</div>
 
<ol class="arabic simple" start="10">
 
<li>cd ..</li>
 
<li>curl <a class="reference external" href="http://www.riverbankcomputing.com/static/Downloads/PyQt4/PyQt-x11-gpl-4.7.7.tar.gz">http://www.riverbankcomputing.com/static/Downloads/PyQt4/PyQt-x11-gpl-4.7.7.tar.gz</a></li>
 
<li>wget <a class="reference external" href="http://www.riverbankcomputing.com/static/Downloads/PyQt4/PyQt-x11-gpl-4.7.7.tar.gz">http://www.riverbankcomputing.com/static/Downloads/PyQt4/PyQt-x11-gpl-4.7.7.tar.gz</a></li>
 
<li>tar xzf PyQt-x11-gpl-4.7.7</li>
 
<li>cd PyQt-x11-gpl-4.7.7</li>
 
<li>python configure.py</li>
 
<li>make</li>
 
<li>make install</li>
 
<li>cd ..</li>
 
<li>hg clone <a class="reference external" href="https://litsol&#64;bitbucket.org/bfrog/cutehg">https://litsol&#64;bitbucket.org/bfrog/cutehg</a></li>
 
<li>cd cutehg</li>
 
<li>python setup.py build</li>
 
<li>python setup.py install</li>
 
<li>cd ..</li>
 
<li>easy_install rhodecode, <a class="reference external" href="http://pypi.python.org/pypi/RhodeCode/1.0.0rc2">http://pypi.python.org/pypi/RhodeCode/1.0.0rc2</a></li>
 
</ol>
 
<div class="system-message">
 
<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">v1.rst</tt>, line 307)</p>
 
Enumerated list ends without a blank line; unexpected unindent.</div>
 
<p>22. cd ..
 
21. easy_install rhodecode, <a class="reference external" href="http://pypi.python.org/pypi/RhodeCode/1.0.0rc2">http://pypi.python.org/pypi/RhodeCode/1.0.0rc2</a></p>
 
<p>This procedure fails as before.</p>
 
<p>However, upon inspection I saw that the i18n directory was missing
 
from my build but present in the rhodecode clone from bitbucket. While
 
I think that the <tt class="docutils literal">easy_install rhodecode</tt> invocation is necessary to
 
install the various subsidiary packages, moving the cloned rhodecode
 
into the site-packages directory seems to have made most functionality
 
work. e.g. graphical logs and diff highlighting.</p>
 
</div>
 
</div>
 
<div class="section" id="tuesday-12-october-2010">
 
<h1>Tuesday 12 October 2010</h1>
 
<div class="section" id="rhodecode">
 
<h2>RhodeCode</h2>
 
<p>I think that if Chris can install RhodeCode, I can serve individual
 
instance from my home directory.</p>
 
</div>
 
<div class="section" id="sed-ml-l1v1rc1">
 
<h2>SED-ML L1V1RC1</h2>
 
<p>Walking through the new SED-ML schema I see that they've dropped the
 
generic simulation class and added AddXML and RemoveXML model change
 
classes. Adding several more SED-ML examples for the symposium might
 
still be justified - though they become obsolete the moment I
 
introduce the new schema changes.</p>
 
</div>
 
</div>
 
</div>
 
<div class="footer">
 
<hr class="footer" />
 
###Page###
 
</div>
 
</body>
 
</html>
doc/v1.pdf
Show inline comments
 
%PDF-1.3
 
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
 
% 'BasicFonts': class PDFDictionary 
 
1 0 obj
 
% The standard fonts dictionary
 
<< /F1 2 0 R
 
 /F2 3 0 R
 
 /F3 5 0 R >>
 
endobj
 
% 'F1': class PDFType1Font 
 
2 0 obj
 
% Font Helvetica
 
<< /BaseFont /Helvetica
 
 /Encoding /WinAnsiEncoding
 
 /Name /F1
 
 /Subtype /Type1
 
 /Type /Font >>
 
endobj
 
% 'F2': class PDFType1Font 
 
3 0 obj
 
% Font Helvetica-Bold
 
<< /BaseFont /Helvetica-Bold
 
 /Encoding /WinAnsiEncoding
 
 /Name /F2
 
 /Subtype /Type1
 
 /Type /Font >>
 
endobj
 
% 'Page1': class PDFPage 
 
4 0 obj
 
% Page dictionary
 
<< /Contents 56 0 R
 
 /MediaBox [ 0
 
 0
 
 595.2756
 
 841.8898 ]
 
 /Parent 55 0 R
 
 /Resources << /Font 1 0 R
 
 /ProcSet [ /PDF
 
 /Text
 
 /ImageB
 
 /ImageC
 
 /ImageI ] >>
 
 /Rotate 0
 
 /Trans <<  >>
 
 /Type /Page >>
 
endobj
 
% 'F3': class PDFType1Font 
 
5 0 obj
 
% Font Courier
 
<< /BaseFont /Courier
 
 /Encoding /WinAnsiEncoding
 
 /Name /F3
 
 /Subtype /Type1
 
 /Type /Font >>
 
endobj
 
% 'Page2': class PDFPage 
 
6 0 obj
 
% Page dictionary
 
<< /Contents 57 0 R
 
 /MediaBox [ 0
 
 0
 
 595.2756
 
 841.8898 ]
 
 /Parent 55 0 R
 
 /Resources << /Font 1 0 R
 
 /ProcSet [ /PDF
 
 /Text
 
 /ImageB
 
 /ImageC
 
 /ImageI ] >>
 
 /Rotate 0
 
 /Trans <<  >>
 
 /Type /Page >>
 
endobj
 
% 'Annot.NUMBER1': class PDFDictionary 
 
7 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://bitbucket.org/dgc/headcount) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 85.69291
 
 219.1936
 
 236.3429
 
 231.1936 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Annot.NUMBER2': class PDFDictionary 
 
8 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://stackoverflow.com/questions/1705921/useful-mercurial-hooks) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 85.69291
 
 204.1936
 
 384.1429
 
 216.1936 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Annot.NUMBER3': class PDFDictionary 
 
9 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://davidherron.com/node/961) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 85.69291
 
 189.1936
 
 229.6629
 
 201.1936 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Annot.NUMBER4': class PDFDictionary 
 
10 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://packages.python.org/RhodeCode) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 212.1929
 
 138.1936
 
 386.1829
 
 150.1936 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Annot.NUMBER5': class PDFDictionary 
 
11 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://bitbucket.org/marcinkuzminski/rhodecode) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 85.69291
 
 123.1936
 
 532.5827
 
 135.1936 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Annot.NUMBER6': class PDFDictionary 
 
12 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://packages.python.org/RhodeCode) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 85.69291
 
 108.1936
 
 259.6829
 
 120.1936 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Annot.NUMBER7': class PDFDictionary 
 
13 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://pypi.python.org/pypi/RhodeCode/1.0.0rc3) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 265.2429
 
 108.1936
 
 474.8029
 
 120.1936 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Page3': class PDFPage 
 
14 0 obj
 
% Page dictionary
 
<< /Annots [ 7 0 R
 
 8 0 R
 
 9 0 R
 
 10 0 R
 
 11 0 R
 
 12 0 R
 
 13 0 R ]
 
 /Contents 58 0 R
 
 /MediaBox [ 0
 
 0
 
 595.2756
 
 841.8898 ]
 
 /Parent 55 0 R
 
 /Resources << /Font 1 0 R
 
 /ProcSet [ /PDF
 
 /Text
 
 /ImageB
 
 /ImageC
 
 /ImageI ] >>
 
 /Rotate 0
 
 /Trans <<  >>
 
 /Type /Page >>
 
endobj
 
% 'Annot.NUMBER8': class PDFDictionary 
 
15 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://hg.python-works.com) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 85.69291
 
 741.5936
 
 208.5229
 
 753.5936 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Annot.NUMBER9': class PDFDictionary 
 
16 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://bitbucket.org/bfrog/cutehg) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 85.69291
 
 726.5936
 
 532.5827
 
 738.5936 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Annot.NUMBER10': class PDFDictionary 
 
17 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://pypi.python.org/pypi/SIP) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 85.69291
 
 711.5936
 
 219.1029
 
 723.5936 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Annot.NUMBER11': class PDFDictionary 
 
18 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://www.riverbankcomputing.com/hg/sip) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 224.6629
 
 711.5936
 
 412.5029
 
 723.5936 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Annot.NUMBER12': class PDFDictionary 
 
19 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://pypi.python.org/pypi/PyQt) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 85.69291
 
 696.5936
 
 532.5827
 
 708.5936 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Annot.NUMBER13': class PDFDictionary 
 
20 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://ask.github.com/celery) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 85.69291
 
 681.5936
 
 532.5827
 
 693.5936 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Annot.NUMBER14': class PDFDictionary 
 
21 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://www.riverbankcomputing.com/hg/sip) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 146.2729
 
 315.3694
 
 334.1129
 
 327.3694 ]
 
 /Rect [ 126.2729
 
 321.3694
 
 314.1129
 
 333.3694 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Annot.NUMBER15': class PDFDictionary 
 
22 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://www.riverbankcomputing.com/static/Downloads/PyQt4/PyQt-x11-gpl-4.7.7.tar.gz) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 104.5829
 
 207.3694
 
 486.3829
 
 219.3694 ]
 
 /Rect [ 109.5929
 
 216.3694
 
 491.3929
 
 228.3694 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Annot.NUMBER16': class PDFDictionary 
 
23 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (https://litsol@bitbucket.org/bfrog/cutehg) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 126.2729
 
 102.3694
 
 111.3694
 
 302.0629
 
 114.3694 ]
 
 123.3694 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Page4': class PDFPage 
 
24 0 obj
 
% Page dictionary
 
<< /Annots [ 15 0 R
 
 16 0 R
 
 17 0 R
 
 18 0 R
 
 19 0 R
 
 20 0 R
 
 21 0 R
 
 22 0 R
 
 23 0 R ]
 
 /Contents 59 0 R
 
 /MediaBox [ 0
 
 0
 
 595.2756
 
 841.8898 ]
 
 /Parent 55 0 R
 
 /Resources << /Font 1 0 R
 
 /ProcSet [ /PDF
 
 /Text
 
 /ImageB
 
 /ImageC
 
 /ImageI ] >>
 
 /Rotate 0
 
 /Trans <<  >>
 
 /Type /Page >>
 
endobj
 
% 'Annot.NUMBER17': class PDFDictionary 
 
25 0 obj
 
<< /A << /S /URI
 
 /Type /Action
 
 /URI (http://pypi.python.org/pypi/RhodeCode/1.0.0rc2) >>
 
 /Border [ 0
 
 0
 
 0 ]
 
 /Rect [ 225.5629
 
 690.5936
 
 435.1229
 
 702.5936 ]
 
 /Rect [ 193.5229
 
 696.5936
 
 403.0829
 
 708.5936 ]
 
 /Subtype /Link
 
 /Type /Annot >>
 
endobj
 
% 'Page5': class PDFPage 
 
26 0 obj
 
% Page dictionary
 
<< /Annots [ 25 0 R ]
 
 /Contents 60 0 R
 
 /MediaBox [ 0
 
 0
 
 595.2756
 
 841.8898 ]
 
 /Parent 55 0 R
 
 /Resources << /Font 1 0 R
 
 /ProcSet [ /PDF
 
 /Text
 
 /ImageB
 
 /ImageC
 
 /ImageI ] >>
 
 /Rotate 0
 
 /Trans <<  >>
 
 /Type /Page >>
 
endobj
 
% 'R27': class PDFCatalog 
 
27 0 obj
 
% Document Root
 
<< /Outlines 29 0 R
 
 /PageLabels 61 0 R
 
 /PageMode /UseNone
 
 /Pages 55 0 R
 
 /Type /Catalog >>
 
endobj
 
% 'R28': class PDFInfo 
 
28 0 obj
 
<< /Author ()
 
 /CreationDate (D:20101013105235-01'00')
 
 /CreationDate (D:20101013132920-01'00')
 
 /Keywords ()
 
 /Producer (ReportLab http://www.reportlab.com)
 
 /Subject (\(unspecified\))
 
 /Title (The Virtual Leaf) >>
 
endobj
 
% 'R29': class PDFOutlines 
 
29 0 obj
 
<< /Count 28
 
 /First 30 0 R
 
 /Last 52 0 R
 
 /Type /Outlines >>
 
endobj
 
% 'Outline.0': class OutlineEntryObject 
 
30 0 obj
 
<< /Dest [ 4 0 R
 
 /XYZ
 
 62.69291
 
 717.0236
 
 0 ]
 
 /Next 31 0 R
 
 /Parent 29 0 R
 
 /Title (Friday 11 June 2010) >>
 
endobj
 
% 'Outline.1': class OutlineEntryObject 
 
31 0 obj
 
<< /Dest [ 4 0 R
 
 /XYZ
 
 62.69291
 
 393.0236
 
 0 ]
 
 /Next 32 0 R
 
 /Parent 29 0 R
 
 /Prev 30 0 R
 
 /Title (Friday 24 September 2010) >>
 
endobj
 
% 'Outline.2': class OutlineEntryObject 
 
32 0 obj
 
<< /Dest [ 4 0 R
 
 /XYZ
 
 62.69291
 
 273.0236
 
 0 ]
 
 /Next 33 0 R
 
 /Parent 29 0 R
 
 /Prev 31 0 R
 
 /Title (Monday 27 September 2010) >>
 
endobj
 
% 'Outline.3': class OutlineEntryObject 
 
33 0 obj
 
<< /Count 11
 
 /Dest [ 4 0 R
 
 /XYZ
 
 62.69291
 
 174.0236
 
 0 ]
 
 /First 34 0 R
 
 /Last 44 0 R
 
 /Next 45 0 R
 
 /Parent 29 0 R
 
 /Prev 32 0 R
 
 /Title (Tuesday 5 October 20010) >>
 
endobj
 
% 'Outline.26.0': class OutlineEntryObject 
 
34 0 obj
 
<< /Dest [ 4 0 R
 
 /XYZ
 
 62.69291
 
 141.0236
 
 0 ]
 
 /Next 35 0 R
 
 /Parent 33 0 R
 
 /Title (tutorial0.pro) >>
 
endobj
 
% 'Outline.26.1': class OutlineEntryObject 
 
35 0 obj
 
<< /Dest [ 6 0 R
 
 /XYZ
 
 62.69291
 
 753.0236
 
 0 ]
 
 /Next 36 0 R
 
 /Parent 33 0 R
 
 /Prev 34 0 R
 
 /Title (auxingrowthplugin.h) >>
 
endobj
 
% 'Outline.26.2': class OutlineEntryObject 
 
36 0 obj
 
<< /Dest [ 6 0 R
 
 /XYZ
 
 62.69291
 
 693.0236
 
 0 ]
 
 /Next 37 0 R
 
 /Parent 33 0 R
 
 /Prev 35 0 R
 
 /Title (VirtualLeaf.cpp) >>
 
endobj
 
% 'Outline.26.3': class OutlineEntryObject 
 
37 0 obj
 
<< /Dest [ 6 0 R
 
 /XYZ
 
 62.69291
 
 633.0236
 
 0 ]
 
 /Next 38 0 R
 
 /Parent 33 0 R
 
 /Prev 36 0 R
 
 /Title (canvas.h) >>
 
endobj
 
% 'Outline.26.4': class OutlineEntryObject 
 
38 0 obj
 
<< /Dest [ 6 0 R
 
 /XYZ
 
 62.69291
 
 585.0236
 
 0 ]
 
 /Next 39 0 R
 
 /Parent 33 0 R
 
 /Prev 37 0 R
 
 /Title (canvas.cpp) >>
 
endobj
 
% 'Outline.26.5': class OutlineEntryObject 
 
39 0 obj
 
<< /Dest [ 6 0 R
 
 /XYZ
 
 62.69291
 
 395.8236
 
 0 ]
 
 /Next 40 0 R
 
 /Parent 33 0 R
 
 /Prev 38 0 R
 
 /Title (mesh.h) >>
 
endobj
 
% 'Outline.26.6': class OutlineEntryObject 
 
40 0 obj
 
<< /Dest [ 6 0 R
 
 /XYZ
 
 62.69291
 
 250.4814
 
 0 ]
 
 /Next 41 0 R
 
 /Parent 33 0 R
 
 /Prev 39 0 R
 
 /Title (mesh.cpp) >>
 
endobj
 
% 'Outline.26.7': class OutlineEntryObject 
 
41 0 obj
 
<< /Dest [ 14 0 R
 
 /XYZ
 
 62.69291
 
 753.0236
 
 0 ]
 
 /Next 42 0 R
 
 /Parent 33 0 R
 
 /Prev 40 0 R
 
 /Title (modelcatalogue.cpp) >>
 
endobj
 
% 'Outline.26.8': class OutlineEntryObject 
 
42 0 obj
 
<< /Dest [ 14 0 R
 
 /XYZ
 
 62.69291
 
 705.0236
 
 0 ]
 
 /Next 43 0 R
 
 /Parent 33 0 R
 
 /Prev 41 0 R
 
 /Title (simplugin.h) >>
 
endobj
 
% 'Outline.26.9': class OutlineEntryObject 
 
43 0 obj
 
<< /Dest [ 14 0 R
 
 /XYZ
 
 62.69291
 
 611.8236
 
 0 ]
 
 /Next 44 0 R
 
 /Parent 33 0 R
 
 /Prev 42 0 R
 
 /Title (simplugin.cpp) >>
 
endobj
 
% 'Outline.26.10': class OutlineEntryObject 
 
44 0 obj
 
<< /Dest [ 14 0 R
 
 /XYZ
 
 62.69291
 
 530.6236
 
 0 ]
 
 /Parent 33 0 R
 
 /Prev 43 0 R
 
 /Title (xmlwrite.cpp) >>
 
endobj
 
% 'Outline.4': class OutlineEntryObject 
 
45 0 obj
 
<< /Dest [ 14 0 R
 
 /XYZ
 
 62.69291
 
 482.6236
 
 0 ]
 
 /Next 46 0 R
 
 /Parent 29 0 R
 
 /Prev 33 0 R
 
 /Title (Wednesday 6 October 2010) >>
 
endobj
 
% 'Outline.5': class OutlineEntryObject 
 
46 0 obj
 
<< /Dest [ 14 0 R
 
 /XYZ
 
 62.69291
 
 431.6236
 
 0 ]
 
 /Next 47 0 R
 
 /Parent 29 0 R
 
 /Prev 45 0 R
 
 /Title (Thursday 7 October 2010) >>
 
endobj
 
% 'Outline.6': class OutlineEntryObject 
 
47 0 obj
 
<< /Dest [ 14 0 R
 
 /XYZ
 
 62.69291
 
 368.6236
 
 0 ]
 
 /Next 48 0 R
 
 /Parent 29 0 R
 
 /Prev 46 0 R
 
 /Title (Friday 8 October 2010) >>
 
endobj
 
% 'Outline.7': class OutlineEntryObject 
 
48 0 obj
 
<< /Count 3
 
 /Dest [ 14 0 R
 
 /XYZ
 
 62.69291
 
 299.6236
 
 0 ]
 
 /First 49 0 R
 
 /Last 51 0 R
 
 /Next 52 0 R
 
 /Parent 29 0 R
 
 /Prev 47 0 R
 
 /Title (Monday 11 October 2010) >>
 
endobj
 
% 'Outline.27.0': class OutlineEntryObject 
 
49 0 obj
 
<< /Dest [ 14 0 R
 
 /XYZ
 
 62.69291
 
 266.6236
 
 0 ]
 
 /Next 50 0 R
 
 /Parent 48 0 R
 
 /Title (Mercurial hooks) >>
 
endobj
 
% 'Outline.27.1': class OutlineEntryObject 
 
50 0 obj
 
<< /Dest [ 14 0 R
 
 /XYZ
 
 62.69291
 
 170.6236
 
 0 ]
 
 /Next 51 0 R
 
 /Parent 48 0 R
 
 /Prev 49 0 R
 
 /Title (Mercurial Repositories) >>
 
endobj
 
% 'Outline.27.2': class OutlineEntryObject 
 
51 0 obj
 
<< /Dest [ 24 0 R
 
 /XYZ
 
 62.69291
 
 401.7994
 
 0 ]
 
 /Parent 48 0 R
 
 /Prev 50 0 R
 
 /Title (RE-INSTALL) >>
 
endobj
 
% 'Outline.8': class OutlineEntryObject 
 
52 0 obj
 
<< /Count 2
 
 /Dest [ 26 0 R
 
 /XYZ
 
 62.69291
 
 603.0236
 
 606.0236
 
 0 ]
 
 /First 53 0 R
 
 /Last 54 0 R
 
 /Parent 29 0 R
 
 /Prev 48 0 R
 
 /Title (Tuesday 12 October 2010) >>
 
endobj
 
% 'Outline.28.0': class OutlineEntryObject 
 
53 0 obj
 
<< /Dest [ 26 0 R
 
 /XYZ
 
 62.69291
 
 570.0236
 
 573.0236
 
 0 ]
 
 /Next 54 0 R
 
 /Parent 52 0 R
 
 /Title (RhodeCode) >>
 
endobj
 
% 'Outline.28.1': class OutlineEntryObject 
 
54 0 obj
 
<< /Dest [ 26 0 R
 
 /XYZ
 
 62.69291
 
 522.0236
 
 525.0236
 
 0 ]
 
 /Parent 52 0 R
 
 /Prev 53 0 R
 
 /Title (SED-ML L1V1RC1) >>
 
endobj
 
% 'R55': class PDFPages 
 
55 0 obj
 
% page tree
 
<< /Count 5
 
 /Kids [ 4 0 R
 
 6 0 R
 
 14 0 R
 
 24 0 R
 
 26 0 R ]
 
 /Type /Pages >>
 
endobj
 
% 'R56': class PDFStream 
 
56 0 obj
 
% page stream
 
<< /Length 8892 >>
 
stream
 
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
 
q
 
1 0 0 1 62.69291 729.0236 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 9.64 Tm /F2 20 Tf 24 TL (The Virtual Leaf) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 696.0236 cm
 
q
 
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Friday 11 June 2010) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 678.0236 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Issues:) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 672.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 405.0236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
BT 1 0 0 1 0 2 Tm  T* ET
 
q
 
1 0 0 1 20 267 cm
 
Q
 
q
 
1 0 0 1 20 267 cm
 
Q
 
q
 
1 0 0 1 20 225 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 27 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (1.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 28.82 Tm /F1 10 Tf 12 TL 1.55284 Tw (Every class that has an association or composition eventually will need its own custom view) Tj T* 0 Tw .83436 Tw (page template, e.g. sed_view. For the moment I have set the default view for these classes to) Tj T* 0 Tw (dev_view \( a copy of base_view \).) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 225 cm
 
Q
 
q
 
1 0 0 1 20 228 cm
 
Q
 
q
 
1 0 0 1 20 198 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 15 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (2.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 16.82 Tm /F1 10 Tf 12 TL 1.744651 Tw (An association in UML is cast as a ReferenceField in the resulting class schema. Open the) Tj T* 0 Tw (association and add the widget:label tag to the class that is being associated.) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 198 cm
 
Q
 
q
 
1 0 0 1 20 201 cm
 
Q
 
q
 
1 0 0 1 20 171 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 15 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (3.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 16.82 Tm /F1 10 Tf 12 TL .73061 Tw (The default description text for a class should be a informative description of the class, not the) Tj T* 0 Tw (instance, derived from the SED-ML manual.) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 171 cm
 
Q
 
q
 
1 0 0 1 20 174 cm
 
Q
 
q
 
1 0 0 1 20 156 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (4.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Apply 'searchable' tags to the appropriate class attributes.) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 156 cm
 
Q
 
q
 
1 0 0 1 20 159 cm
 
Q
 
q
 
1 0 0 1 20 141 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (5.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (I choose 'isTidyHtmlWithCleanup' as the MathML validator. Will this work?) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 141 cm
 
Q
 
q
 
1 0 0 1 20 144 cm
 
Q
 
q
 
1 0 0 1 20 0 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 129 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (6.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 117 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 16.82 Tm /F1 10 Tf 12 TL .76811 Tw (What should be added to our implementation of SED-ML to make it more than merely a mirror) Tj T* 0 Tw (image of the SED-ML XML format?) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 23 111 cm
 
Q
 
q
 
1 0 0 1 23 3 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
BT 1 0 0 1 0 2 Tm  T* ET
 
q
 
1 0 0 1 20 108 cm
 
Q
 
q
 
1 0 0 1 20 108 cm
 
Q
 
q
 
1 0 0 1 20 90 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (a.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (The ability to attach files at various points, e.g. parameter files.) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 90 cm
 
Q
 
q
 
1 0 0 1 20 93 cm
 
Q
 
q
 
1 0 0 1 20 75 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (b.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Additional output types, e.g. animations.) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 75 cm
 
Q
 
q
 
1 0 0 1 20 78 cm
 
Q
 
q
 
1 0 0 1 20 60 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 6.22 0 Td (c.) Tj T* -6.22 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Custom page templates) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 60 cm
 
Q
 
q
 
1 0 0 1 20 63 cm
 
Q
 
q
 
1 0 0 1 20 45 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (d.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Custom search form) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 45 cm
 
Q
 
q
 
1 0 0 1 20 48 cm
 
Q
 
q
 
1 0 0 1 20 30 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (e.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Custom catalog indexes) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 30 cm
 
Q
 
q
 
1 0 0 1 20 33 cm
 
Q
 
q
 
1 0 0 1 20 15 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 8.44 0 Td (f.) Tj T* -8.44 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Custom portlet\(s\)) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 15 cm
 
Q
 
q
 
1 0 0 1 20 18 cm
 
Q
 
q
 
1 0 0 1 20 0 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (g.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Custom viewlet\(s\)) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 0 cm
 
Q
 
q
 
1 0 0 1 20 0 cm
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 0 cm
 
Q
 
q
 
1 0 0 1 20 0 cm
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 405.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 372.0236 cm
 
q
 
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Friday 24 September 2010) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 315.0236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 0 36 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F2 10 Tf 12 TL (To Do:) Tj T* ET
 
Q
 
Q
 
BT 1 0 0 1 0 23 Tm  T* ET
 
q
 
1 0 0 1 10 33 cm
 
Q
 
q
 
1 0 0 1 10 33 cm
 
Q
 
q
 
1 0 0 1 10 15 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (1.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Publish our mercurial repositories \(Chris/Martin\). This may mesh with deploying Plone.) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 10 15 cm
 
Q
 
q
 
1 0 0 1 10 18 cm
 
Q
 
q
 
1 0 0 1 10 0 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (2.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Create a vleaf mailing list \(Henk\).) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 10 0 cm
 
Q
 
q
 
1 0 0 1 10 0 cm
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 285.0236 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 16.82 Tm /F1 10 Tf 12 TL .602927 Tw (Found an article on SBRML - a markup language for associating systems biology data with models. At a) Tj T* 0 Tw (glance the schema seems bigger than SED-ML's, but SBRML appears to be SBML specific.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 252.0236 cm
 
q
 
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Monday 27 September 2010) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 186.0236 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 52.82 Tm /F1 10 Tf 12 TL 3.993828 Tw (Spoke with Chris about publishing the Mercurial repositories and deploying Plone. Both can be) Tj T* 0 Tw .131567 Tw (accomplished in their own project space on a server in the DMZ. Chris said he would supply me with login) Tj T* 0 Tw 3.871984 Tw (credentials for both accounts. I will install Plone and Chris \(or Maarten\) will help me configure) Tj T* 0 Tw .795318 Tw (Apache/nginx and Varnish. Chris will install the required Mercurial packages; after which I can clone the) Tj T* 0 Tw (repositories to their new home.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 153.0236 cm
 
q
 
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Tuesday 5 October 20010) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 123.0236 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (tutorial0.pro) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 105.0236 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Added simplugin.h to list of header files. NB: this is the only tutorial in which simplugin.h appears.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 56.69291 773.1969 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 205.6499 0 Td 12 TL /F1 10 Tf 0 0 0 rg (The Virtual Leaf) Tj T* -205.6499 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 56.69291 56.69291 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 238.1649 0 Td (1) Tj T* -238.1649 0 Td ET
 
Q
 
Q
 
 
 
endstream
 
 
endobj
 
% 'R57': class PDFStream 
 
57 0 obj
 
% page stream
 
<< /Length 4804 >>
 
stream
 
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
 
q
 
1 0 0 1 62.69291 735.0236 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (auxingrowthplugin.h) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 705.0236 cm
 
q
 
BT 1 0 0 1 0 16.82 Tm 2.02498 Tw 12 TL /F1 10 Tf 0 0 0 rg (Declared, and defined, a virtual function named ) Tj /F3 10 Tf (DefaultLeafML\(\) ) Tj /F1 10 Tf (which merely returns a QString) Tj T* 0 Tw (naming a LeafML filename sans path.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 675.0236 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (VirtualLeaf.cpp) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 645.0236 cm
 
q
 
BT 1 0 0 1 0 16.82 Tm 14.41996 Tw 12 TL /F1 10 Tf 0 0 0 rg (Moved ) Tj /F3 10 Tf (Cell::SetMagnification\(\) ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (Cell::SetOffset\(\) ) Tj /F1 10 Tf (from ) Tj /F3 10 Tf (main\(\) ) Tj /F1 10 Tf (to) Tj T* 0 Tw /F3 10 Tf (MainBase::Init\(\)) Tj /F1 10 Tf (.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 615.0236 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (canvas.h) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 597.0236 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (Declare ) Tj /F3 10 Tf (exportCellData\(\)) Tj /F1 10 Tf (.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 567.0236 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (canvas.cpp) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 537.0236 cm
 
q
 
BT 1 0 0 1 0 16.82 Tm 8.836412 Tw 12 TL /F1 10 Tf 0 0 0 rg (Add an 'Export cell areas' to the file dropdown menu which invokes - surprise -) Tj T* 0 Tw /F3 10 Tf (Main::exportCellData\(\)) Tj /F1 10 Tf (:) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 407.8236 cm
 
q
 
q
 
1 0 0 1 0 0 cm
 
q
 
1 0 0 1 6.6 6.6 cm
 
q
 
.662745 .662745 .662745 RG
 
.5 w
 
.960784 .960784 .862745 rg
 
n -6 -6 468.6898 120 re B*
 
Q
 
q
 
BT 1 0 0 1 0 101.71 Tm 12 TL /F3 10 Tf 0 0 0 rg (void Main::exportCellData\(void\) {) Tj T* (  QFile file\("areas.csv"\);) Tj T* (  if \( file.open\( IO_WriteOnly \) \) {) Tj T* (    QTextStream stream\( ) Tj (&) Tj (file \);) Tj T* (    mesh.CSVExportCellData\(stream\);) Tj T* (    mesh.CSVExportMeshData\(stream\);) Tj T* (    file.close\(\);) Tj T* (  }) Tj T* (}) Tj T* ET
 
Q
 
Q
 
Q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 377.8236 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (mesh.h) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 359.8236 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (Include ) Tj /F3 10 Tf (<) Tj (QTextStream) Tj (>) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 329.8236 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 16.82 Tm /F1 10 Tf 12 TL .752765 Tw (Set the boundary_poloygon pointer to zero in the class constructor, and delete it, if it exists, in the class) Tj T* 0 Tw (destructor.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 311.8236 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (Declare ) Tj /F3 10 Tf (Compactness\(\)) Tj /F1 10 Tf (, ) Tj /F3 10 Tf (CSVExportCellData\(\) ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (CSVExportMeshData\(\)) Tj /F1 10 Tf (:) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 262.4814 cm
 
q
 
q
 
.840289 0 0 .840289 0 0 cm
 
q
 
1 0 0 1 6.6 7.854438 cm
 
q
 
.662745 .662745 .662745 RG
 
.5 w
 
.960784 .960784 .862745 rg
 
n -6 -6 558 48 re B*
 
Q
 
q
 
BT 1 0 0 1 0 29.71 Tm 12 TL /F3 10 Tf 0 0 0 rg (double Compactness\(double *res_compactness=0, double *res_area=0, double *res_cell_area=0\);) Tj T* (void CSVExportCellData\(QTextStream ) Tj (&) Tj (csv_stream\) const;) Tj T* (void CSVExportMeshData\(QTextStream ) Tj (&) Tj (csv_stream\);) Tj T* ET
 
Q
 
Q
 
Q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 232.4814 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (mesh.cpp) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 214.4814 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (In ) Tj /F3 10 Tf (mesh::clear\(\)) Tj /F1 10 Tf (, delete the boundary_polygon only if the pointer hasn't been assigned:) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 145.2814 cm
 
q
 
q
 
1 0 0 1 0 0 cm
 
q
 
1 0 0 1 6.6 6.6 cm
 
q
 
.662745 .662745 .662745 RG
 
.5 w
 
.960784 .960784 .862745 rg
 
n -6 -6 468.6898 60 re B*
 
Q
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 41.71 Tm /F3 10 Tf 12 TL (if \(boundary_polygon\) {) Tj T* (   delete boundary_polygon;) Tj T* (   boundary_polygon=0;) Tj T* ( }) Tj T* ET
 
Q
 
Q
 
Q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 125.2814 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (Ditto for ) Tj /F3 10 Tf (mesh::clean\(\)) Tj /F1 10 Tf (.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 107.2814 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (Define the code for ) Tj /F3 10 Tf (Compactness\(\)) Tj /F1 10 Tf (, ) Tj /F3 10 Tf (CSVExportCellData\(\) ) Tj /F1 10 Tf (and ) Tj /F3 10 Tf (CSVExportMeshData\(\)) Tj /F1 10 Tf (.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 56.69291 773.1969 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 205.6499 0 Td 12 TL /F1 10 Tf 0 0 0 rg (The Virtual Leaf) Tj T* -205.6499 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 56.69291 56.69291 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 238.1649 0 Td (2) Tj T* -238.1649 0 Td ET
 
Q
 
Q
 
 
 
endstream
 
 
endobj
 
% 'R58': class PDFStream 
 
58 0 obj
 
% page stream
 
<< /Length 6652 >>
 
stream
 
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
 
q
 
1 0 0 1 62.69291 735.0236 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (modelcatalogue.cpp) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 717.0236 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (In ) Tj /F3 10 Tf (InstallModel\(\)) Tj /F1 10 Tf (, find and load the default LeafML file.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 687.0236 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (simplugin.h) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 669.0236 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (Declare ) Tj /F3 10 Tf (DefaultLeafML\(\)) Tj /F1 10 Tf (:) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 623.8236 cm
 
q
 
q
 
1 0 0 1 0 0 cm
 
q
 
1 0 0 1 6.6 6.6 cm
 
q
 
.662745 .662745 .662745 RG
 
.5 w
 
.960784 .960784 .862745 rg
 
n -6 -6 468.6898 36 re B*
 
Q
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 17.71 Tm /F3 10 Tf 12 TL (// Default LeafML-file to be read after model startup) Tj T* (virtual QString DefaultLeafML\(void\);) Tj T* ET
 
Q
 
Q
 
Q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 593.8236 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (simplugin.cpp) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 575.8236 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (Define ) Tj /F3 10 Tf (DefaultLeafML\(\)) Tj /F1 10 Tf (. Returns an empty ) Tj /F3 10 Tf (QString) Tj /F1 10 Tf (:) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 542.6236 cm
 
q
 
q
 
1 0 0 1 0 0 cm
 
q
 
1 0 0 1 6.6 6.6 cm
 
q
 
.662745 .662745 .662745 RG
 
.5 w
 
.960784 .960784 .862745 rg
 
n -6 -6 468.6898 24 re B*
 
Q
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 5.71 Tm /F3 10 Tf 12 TL (QString SimPluginInterface::DefaultLeafML\(void\) { return QString\(\); }) Tj T* ET
 
Q
 
Q
 
Q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 512.6236 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (xmlwrite.cpp) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 494.6236 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (In ) Tj /F3 10 Tf (Mesh::XMLReadCells\(\) ) Tj /F1 10 Tf (- Delete the boundary_ploygon only if its pointer has been assigned.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 461.6236 cm
 
q
 
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Wednesday 6 October 2010) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 443.6236 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Wrote Simon van Mourik about his missing libiconv-2.dll.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 410.6236 cm
 
q
 
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Thursday 7 October 2010) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 380.6236 cm
 
q
 
BT 1 0 0 1 0 16.82 Tm .566976 Tw 12 TL /F1 10 Tf 0 0 0 rg (Added a Q3FileDialog in ) Tj /F3 10 Tf (canvas.cpp:Main::exportCellData\(void\) ) Tj /F1 10 Tf (to choose where to write the) Tj T* 0 Tw (exported cell data.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 347.6236 cm
 
q
 
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Friday 8 October 2010) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 329.6236 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Added new parameters to control perodic cell exprt data.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 311.6236 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Added code to relize perodic cell export.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 278.6236 cm
 
q
 
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Monday 11 October 2010) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 248.6236 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (Mercurial hooks) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 230.6236 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (Tried several alternatives for Mercurial's ) Tj /F3 10 Tf (pretxnchangegroup.forbid_2heads ) Tj /F1 10 Tf (hook.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 230.6236 cm
 
Q
 
q
 
1 0 0 1 62.69291 230.6236 cm
 
Q
 
q
 
1 0 0 1 62.69291 212.6236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (1.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (http://bitbucket.org/dgc/headcount) Tj 0 0 0 rg (: ) Tj /F2 10 Tf (Headcount) Tj /F1 10 Tf ( ) Tj /F3 10 Tf (ui ) Tj /F1 10 Tf (complains of a missing data member) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 212.6236 cm
 
Q
 
q
 
1 0 0 1 62.69291 215.6236 cm
 
Q
 
q
 
1 0 0 1 62.69291 197.6236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (2.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (http://stackoverflow.com/questions/1705921/useful-mercurial-hooks) Tj 0 0 0 rg (: ) Tj /F2 10 Tf (forbid2_heads.py ) Tj /F1 10 Tf (doesn't load) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 197.6236 cm
 
Q
 
q
 
1 0 0 1 62.69291 200.6236 cm
 
Q
 
q
 
1 0 0 1 62.69291 182.6236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (3.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (http://davidherron.com/node/961) Tj 0 0 0 rg (: ) Tj /F2 10 Tf (forbid2_heads.sh ) Tj /F1 10 Tf (works as advertised) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 182.6236 cm
 
Q
 
q
 
1 0 0 1 62.69291 182.6236 cm
 
Q
 
q
 
1 0 0 1 62.69291 152.6236 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (Mercurial Repositories) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 134.6236 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (Tried to install Rhode Code from: ) Tj 0 0 .501961 rg (http://packages.python.org/RhodeCode) Tj 0 0 0 rg (.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 134.6236 cm
 
Q
 
q
 
1 0 0 1 62.69291 134.6236 cm
 
Q
 
q
 
1 0 0 1 62.69291 116.6236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (1.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 .501961 rg
 
0 0 .501961 RG
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (http://bitbucket.org/marcinkuzminski/rhodecode) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 116.6236 cm
 
Q
 
q
 
1 0 0 1 62.69291 119.6236 cm
 
Q
 
q
 
1 0 0 1 62.69291 101.6236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (2.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (http://packages.python.org/RhodeCode) Tj 0 0 0 rg (, ) Tj 0 0 .501961 rg (http://pypi.python.org/pypi/RhodeCode/1.0.0rc3) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 101.6236 cm
 
Q
 
q
 
1 0 0 1 62.69291 104.6236 cm
 
Q
 
q
 
1 0 0 1 56.69291 773.1969 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 205.6499 0 Td 12 TL /F1 10 Tf 0 0 0 rg (The Virtual Leaf) Tj T* -205.6499 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 56.69291 56.69291 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 238.1649 0 Td (3) Tj T* -238.1649 0 Td ET
 
Q
 
Q
 
 
 
endstream
 
 
endobj
 
% 'R59': class PDFStream 
 
59 0 obj
 
% page stream
 
<< /Length 13681 >>
 
<< /Length 14133 >>
 
stream
 
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
 
q
 
1 0 0 1 62.69291 735.0236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (3.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (http://hg.python-works.com ) Tj 0 0 0 rg (\(demo,demo\)) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 735.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 738.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 720.0236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (4.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 .501961 rg
 
0 0 .501961 RG
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (http://bitbucket.org/bfrog/cutehg) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 720.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 723.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 705.0236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (5.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (http://pypi.python.org/pypi/SIP) Tj 0 0 0 rg (, ) Tj 0 0 .501961 rg (http://www.riverbankcomputing.com/hg/sip) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 705.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 708.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 690.0236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (6.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 .501961 rg
 
0 0 .501961 RG
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (http://pypi.python.org/pypi/PyQt) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 690.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 693.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 675.0236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (7.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 .501961 rg
 
0 0 .501961 RG
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (http://ask.github.com/celery) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 675.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 675.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 657.0236 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (All goes tolerably until you tick in the url; at which point RhodeCode complains that:) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 413.7994 cm
 
q
 
q
 
.465606 0 0 .465606 0 0 cm
 
q
 
1 0 0 1 6.6 14.17507 cm
 
q
 
.662745 .662745 .662745 RG
 
.5 w
 
.960784 .960784 .862745 rg
 
n -6 -6 1008 504 re B*
 
Q
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 485.71 Tm /F3 10 Tf 12 TL (Exception happened during processing of request from \('127.0.0.1', 35803\)) Tj T* (Traceback \(most recent call last\):) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/httpserver.py", line 1068, in process_request_in_thread) Tj T* (   self.finish_request\(request, client_address\)) Tj T* ( File "/ufs/guravage/opt/Python-2.6.2/lib/python2.6/SocketServer.py", line 320, in finish_request) Tj T* (   self.RequestHandlerClass\(request, client_address, self\)) Tj T* ( File "/ufs/guravage/opt/Python-2.6.2/lib/python2.6/SocketServer.py", line 615, in __init__) Tj T* (   self.handle\(\)) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/httpserver.py", line 442, in handle) Tj T* (   BaseHTTPRequestHandler.handle\(self\)) Tj T* ( File "/ufs/guravage/opt/Python-2.6.2/lib/python2.6/BaseHTTPServer.py", line 329, in handle) Tj T* (   self.handle_one_request\(\)) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/httpserver.py", line 437, in handle_one_request) Tj T* (   self.wsgi_execute\(\)) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/httpserver.py", line 287, in wsgi_execute) Tj T* (   self.wsgi_start_response\)) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/cascade.py", line 130, in __call__) Tj T* (   return self.apps[-1]\(environ, start_response\)) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/registry.py", line 379, in __call__) Tj T* (   app_iter = self.application\(environ, start_response\)) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/RhodeCode-1.0.0rc1-py2.6.egg/rhodecode/lib/middleware/https_fixup.py", line 33, in __call__) Tj T* (   return self.application\(environ, start_response\)) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/middleware.py", line 163, in __call__) Tj T* (   self.app, new_environ, catch_exc_info=True\)) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/util.py", line 48, in call_wsgi_application) Tj T* (   app_iter = application\(environ, start_response\)) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/WebError-0.10.2-py2.6.egg/weberror/errormiddleware.py", line 156, in __call__) Tj T* (   return self.application\(environ, start_response\)) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/RhodeCode-1.0.0rc1-py2.6.egg/rhodecode/lib/middleware/simplehg.py", line 55, in __call__) Tj T* (   return self.application\(environ, start_response\)) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Beaker-1.5.4-py2.6.egg/beaker/middleware.py", line 152, in __call__) Tj T* (   return self.wrap_app\(environ, session_start_response\)) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Routes-1.12.3-py2.6.egg/routes/middleware.py", line 131, in __call__) Tj T* (   response = self.app\(environ, start_response\)) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/wsgiapp.py", line 98, in __call__) Tj T* (   self.setup_app_env\(environ, start_response\)) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/wsgiapp.py", line 203, in setup_app_env) Tj T* (   pylons_obj.translator = _get_translator\(lang, pylons_config=self.config\)) Tj T* ( File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/i18n/translation.py", line 165, in _get_translator) Tj T* (   raise LanguageError\('IOError: %s' % ioe\)) Tj T* (LanguageError: IOError: [Errno 2] No translation file found for domain: 'rhodecode') Tj T* ET
 
Q
 
Q
 
Q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 383.7994 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (RE-INSTALL) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 371.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 233.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
BT 1 0 0 1 0 2 Tm  T* ET
 
q
 
1 0 0 1 20 138 cm
 
Q
 
q
 
1 0 0 1 20 138 cm
 
Q
 
q
 
1 0 0 1 20 120 cm
 
1 0 0 1 62.69291 377.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 377.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 359.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (1.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (easy_install mercurial) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 120 cm
 
Q
 
q
 
1 0 0 1 20 123 cm
 
Q
 
q
 
1 0 0 1 20 105 cm
 
1 0 0 1 62.69291 359.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 362.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 344.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (2.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (mkdir src) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 105 cm
 
Q
 
q
 
1 0 0 1 20 108 cm
 
Q
 
q
 
1 0 0 1 20 90 cm
 
1 0 0 1 62.69291 344.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 347.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 329.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (3.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (cd src) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 90 cm
 
Q
 
q
 
1 0 0 1 20 93 cm
 
Q
 
q
 
1 0 0 1 20 75 cm
 
1 0 0 1 62.69291 329.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 332.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 314.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (4.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (hg clone ) Tj 0 0 .501961 rg (http://www.riverbankcomputing.com/hg/sip) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 75 cm
 
Q
 
q
 
1 0 0 1 20 78 cm
 
Q
 
q
 
1 0 0 1 20 60 cm
 
1 0 0 1 62.69291 314.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 317.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 299.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (5.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (cd sip) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 60 cm
 
Q
 
q
 
1 0 0 1 20 63 cm
 
Q
 
q
 
1 0 0 1 20 45 cm
 
1 0 0 1 62.69291 299.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 302.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 284.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (6.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (python build.py prepare) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 45 cm
 
Q
 
q
 
1 0 0 1 20 48 cm
 
Q
 
q
 
1 0 0 1 20 30 cm
 
1 0 0 1 62.69291 284.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 287.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 269.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (7.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (python configure.py) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 30 cm
 
Q
 
q
 
1 0 0 1 20 33 cm
 
Q
 
q
 
1 0 0 1 20 15 cm
 
1 0 0 1 62.69291 269.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 272.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 254.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (8.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (make) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 15 cm
 
Q
 
q
 
1 0 0 1 20 18 cm
 
Q
 
q
 
1 0 0 1 20 0 cm
 
1 0 0 1 62.69291 254.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 257.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 239.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 5.66 0 Td (9.) Tj T* -5.66 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (make install) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 20 0 cm
 
Q
 
q
 
1 0 0 1 20 0 cm
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 233.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 233.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 233.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 215.7994 cm
 
1 0 0 1 62.69291 239.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 242.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 224.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (10.) Tj T* -0.1 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (cd ..) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 215.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 218.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 200.7994 cm
 
1 0 0 1 62.69291 224.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 227.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 209.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (11.) Tj T* -0.1 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (curl ) Tj 0 0 .501961 rg (http://www.riverbankcomputing.com/static/Downloads/PyQt4/PyQt-x11-gpl-4.7.7.tar.gz) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 200.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 203.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 185.7994 cm
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (wget ) Tj 0 0 .501961 rg (http://www.riverbankcomputing.com/static/Downloads/PyQt4/PyQt-x11-gpl-4.7.7.tar.gz) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 209.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 212.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 194.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (12.) Tj T* -0.1 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (tar xzf PyQt-x11-gpl-4.7.7) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 185.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 188.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 170.7994 cm
 
1 0 0 1 62.69291 194.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 197.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 179.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (13.) Tj T* -0.1 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (cd PyQt-x11-gpl-4.7.7) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 170.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 173.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 155.7994 cm
 
1 0 0 1 62.69291 179.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 182.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 164.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (14.) Tj T* -0.1 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (python configure.py) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 155.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 158.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 140.7994 cm
 
1 0 0 1 62.69291 164.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 167.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 149.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (15.) Tj T* -0.1 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (make) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 140.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 143.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 125.7994 cm
 
1 0 0 1 62.69291 149.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 152.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 134.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (16.) Tj T* -0.1 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (make install) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 125.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 128.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 110.7994 cm
 
1 0 0 1 62.69291 134.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 137.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 119.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (17.) Tj T* -0.1 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (cd ..) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 110.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 113.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 95.79938 cm
 
1 0 0 1 62.69291 119.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 122.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 104.7994 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (18.) Tj T* -0.1 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (hg clone ) Tj 0 0 .501961 rg (https://litsol@bitbucket.org/bfrog/cutehg) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 95.79938 cm
 
Q
 
q
 
1 0 0 1 62.69291 98.79938 cm
 
1 0 0 1 62.69291 104.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 107.7994 cm
 
Q
 
q
 
1 0 0 1 62.69291 89.79938 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (19.) Tj T* -0.1 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (cd cutehg) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 89.79938 cm
 
Q
 
q
 
1 0 0 1 62.69291 92.79938 cm
 
Q
 
q
 
1 0 0 1 56.69291 773.1969 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 205.6499 0 Td 12 TL /F1 10 Tf 0 0 0 rg (The Virtual Leaf) Tj T* -205.6499 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 56.69291 56.69291 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 238.1649 0 Td (4) Tj T* -238.1649 0 Td ET
 
Q
 
Q
 
 
 
endstream
 
 
endobj
 
% 'R60': class PDFStream 
 
60 0 obj
 
% page stream
 
<< /Length 3379 >>
 
<< /Length 3604 >>
 
stream
 
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
 
q
 
1 0 0 1 62.69291 735.0236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (19.) Tj T* -0.1 0 Td ET
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (20.) Tj T* -0.1 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (cd cutehg) Tj T* ET
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (python setup.py build) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 735.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 738.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 720.0236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (20.) Tj T* -0.1 0 Td ET
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (21.) Tj T* -0.1 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (python setup.py build) Tj T* ET
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (python setup.py install) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 720.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 723.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 705.0236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (21.) Tj T* -0.1 0 Td ET
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (22.) Tj T* -0.1 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (python setup.py install) Tj T* ET
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (cd ..) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 705.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 705.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 687.0236 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (22. cd .. 21. easy_install rhodecode, ) Tj 0 0 .501961 rg (http://pypi.python.org/pypi/RhodeCode/1.0.0rc2) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 669.0236 cm
 
1 0 0 1 62.69291 708.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 690.0236 cm
 
0 0 0 rg
 
BT /F1 10 Tf 12 TL ET
 
q
 
1 0 0 1 6 3 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL .1 0 Td (23.) Tj T* -0.1 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 23 3 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (easy_install rhodecode, ) Tj 0 0 .501961 rg (http://pypi.python.org/pypi/RhodeCode/1.0.0rc2) Tj T* ET
 
Q
 
Q
 
q
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 690.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 690.0236 cm
 
Q
 
q
 
1 0 0 1 62.69291 672.0236 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (This procedure fails as before.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 615.0236 cm
 
1 0 0 1 62.69291 618.0236 cm
 
q
 
BT 1 0 0 1 0 40.82 Tm 1.747633 Tw 12 TL /F1 10 Tf 0 0 0 rg (However, upon inspection I saw that the i18n directory was missing from my build but present in the) Tj T* 0 Tw 3.201647 Tw (rhodecode clone from bitbucket. While I think that the ) Tj /F3 10 Tf (easy_install rhodecode ) Tj /F1 10 Tf (invocation is) Tj T* 0 Tw .23152 Tw (necessary to install the various subsidiary packages, moving the cloned rhodecode into the site-packages) Tj T* 0 Tw (directory seems to have made most functionality work. e.g. graphical logs and diff highlighting.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 582.0236 cm
 
1 0 0 1 62.69291 585.0236 cm
 
q
 
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Tuesday 12 October 2010) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 552.0236 cm
 
1 0 0 1 62.69291 555.0236 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (RhodeCode) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 534.0236 cm
 
1 0 0 1 62.69291 537.0236 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (I think that if Chris can install RhodeCode, I can serve individual instance from my home directory.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 504.0236 cm
 
1 0 0 1 62.69291 507.0236 cm
 
q
 
BT 1 0 0 1 0 7.23 Tm 18 TL /F2 15 Tf 0 0 0 rg (SED-ML L1V1RC1) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 62.69291 450.0236 cm
 
1 0 0 1 62.69291 453.0236 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 40.82 Tm /F1 10 Tf 12 TL 1.259318 Tw (Walking through the new SED-ML schema I see that they've dropped the generic simulation class and) Tj T* 0 Tw .36152 Tw (added AddXML and RemoveXML model change classes. Adding several more SED-ML examples for the) Tj T* 0 Tw .223735 Tw (symposium might still be justified - though they become obsolete the moment I introduce the new schema) Tj T* 0 Tw (changes.) Tj T* ET
 
Q
 
Q
 
q
 
1 0 0 1 56.69291 773.1969 cm
 
q
 
BT 1 0 0 1 0 4.82 Tm 205.6499 0 Td 12 TL /F1 10 Tf 0 0 0 rg (The Virtual Leaf) Tj T* -205.6499 0 Td ET
 
Q
 
Q
 
q
 
1 0 0 1 56.69291 56.69291 cm
 
q
 
0 0 0 rg
 
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 238.1649 0 Td (5) Tj T* -238.1649 0 Td ET
 
Q
 
Q
 
 
 
endstream
 
 
endobj
 
% 'R61': class PDFPageLabels 
 
61 0 obj
 
% Document Root
 
<< /Nums [ 0
 
 62 0 R
 
 1
 
 63 0 R
 
 2
 
 64 0 R
 
 3
 
 65 0 R
 
 4
 
 66 0 R ] >>
 
endobj
 
% 'R62': class PDFPageLabel 
 
62 0 obj
 
% None
 
<< /S /D
 
 /St 1 >>
 
endobj
 
% 'R63': class PDFPageLabel 
 
63 0 obj
 
% None
 
<< /S /D
 
 /St 2 >>
 
endobj
 
% 'R64': class PDFPageLabel 
 
64 0 obj
 
% None
 
<< /S /D
 
 /St 3 >>
 
endobj
 
% 'R65': class PDFPageLabel 
 
65 0 obj
 
% None
 
<< /S /D
 
 /St 4 >>
 
endobj
 
% 'R66': class PDFPageLabel 
 
66 0 obj
 
% None
 
<< /S /D
 
 /St 5 >>
 
endobj
 
xref
 
0 67
 
0000000000 65535 f
 
0000000113 00000 n
 
0000000233 00000 n
 
0000000398 00000 n
 
0000000571 00000 n
 
0000000852 00000 n
 
0000001011 00000 n
 
0000001304 00000 n
 
0000001556 00000 n
 
0000001839 00000 n
 
0000002088 00000 n
 
0000002343 00000 n
 
0000002608 00000 n
 
0000002863 00000 n
 
0000003114 00000 n
 
0000003480 00000 n
 
0000003725 00000 n
 
0000003978 00000 n
 
0000004229 00000 n
 
0000004489 00000 n
 
0000004741 00000 n
 
0000004989 00000 n
 
0000005249 00000 n
 
0000005551 00000 n
 
0000005797 00000 n
 
0000006185 00000 n
 
0000006436 00000 n
 
0000006738 00000 n
 
0000006897 00000 n
 
0000007125 00000 n
 
0000007251 00000 n
 
0000007430 00000 n
 
0000007629 00000 n
 
0000007828 00000 n
 
0000008072 00000 n
 
0000008248 00000 n
 
0000008445 00000 n
 
0000008638 00000 n
 
0000008824 00000 n
 
0000009012 00000 n
 
0000009196 00000 n
 
0000009382 00000 n
 
0000009579 00000 n
 
0000009769 00000 n
 
0000009962 00000 n
 
0000010135 00000 n
 
0000010335 00000 n
 
0000010534 00000 n
 
0000010731 00000 n
 
0000010974 00000 n
 
0000011153 00000 n
 
0000011354 00000 n
 
0000011525 00000 n
 
0000011754 00000 n
 
0000011927 00000 n
 
0000012086 00000 n
 
0000012228 00000 n
 
0000021221 00000 n
 
0000026126 00000 n
 
0000032879 00000 n
 
0000046662 00000 n
 
0000050146 00000 n
 
0000050291 00000 n
 
0000050368 00000 n
 
0000050445 00000 n
 
0000050522 00000 n
 
0000050599 00000 n
 
0000047114 00000 n
 
0000050823 00000 n
 
0000050968 00000 n
 
0000051045 00000 n
 
0000051122 00000 n
 
0000051199 00000 n
 
0000051276 00000 n
 
trailer
 
<< /ID 
 
 % ReportLab generated PDF document -- digest (http://www.reportlab.com) 
 
 [(\330\333`\005z4\302y^2~\371\223\241\231\341) (\330\333`\005z4\302y^2~\371\223\241\231\341)] 
 
 [(\002\015b\216\002\016\216\222,\316k\030\021\317\316@) (\002\015b\216\002\016\216\222,\316k\030\021\317\316@)] 
 
 
 /Info 28 0 R
 
 /Root 27 0 R
 
 /Size 67 >>
 
startxref
 
50646
 
51323
 
%%EOF
doc/v1.rst
Show inline comments
 
.. header:: 
 
   ###Title###
 

	
 
.. footer:: 
 
   ###Page###
 

	
 

	
 
================
 
The Virtual Leaf
 
================
 

	
 

	
 
Friday 11 June 2010
 
-------------------
 

	
 
Issues:
 

	
 
 1. Every class that has an association or composition eventually will
 
    need its own custom view page template, e.g. sed_view. For the moment
 
    I have set the default view for these classes to dev_view ( a copy of
 
    base_view ).
 

	
 
 2. An association in UML is cast as a ReferenceField in the resulting
 
    class schema. Open the association and add the widget:label tag to
 
    the class that is being associated.
 

	
 
 3. The default description text for a class should be a informative
 
    description of the class, not the instance, derived from the
 
    SED-ML manual.
 

	
 
 4. Apply 'searchable' tags to the appropriate class attributes.
 

	
 
 5. I choose 'isTidyHtmlWithCleanup' as the MathML validator. Will
 
    this work?
 

	
 
 6. What should be added to our implementation of SED-ML to make it
 
    more than merely a mirror image of the SED-ML XML format? 
 

	
 
     a. The ability to attach files at various points, e.g. parameter files.
 

	
 
     b. Additional output types, e.g. animations.
 

	
 
     c. Custom page templates
 

	
 
     d. Custom search form
 

	
 
     e. Custom catalog indexes
 

	
 
     f. Custom portlet(s)
 

	
 
     g. Custom viewlet(s)
 

	
 

	
 
Friday 24 September 2010
 
------------------------
 

	
 
To Do:
 
 1. Publish our mercurial repositories (Chris/Martin). This may mesh with deploying Plone.
 

	
 
 2. Create a vleaf mailing list (Henk).
 

	
 
Found an article on SBRML - a markup language for associating systems
 
biology data with models. At a glance the schema seems bigger than
 
SED-ML's, but SBRML appears to be SBML specific.
 

	
 

	
 

	
 
Monday 27 September 2010
 
------------------------
 

	
 
Spoke with Chris about publishing the Mercurial repositories and
 
deploying Plone. Both can be accomplished in their own project space
 
on a server in the DMZ. Chris said he would supply me with login
 
credentials for both accounts. I will install Plone and Chris (or
 
Maarten) will help me configure Apache/nginx and Varnish. Chris will
 
install the required Mercurial packages; after which I can clone the
 
repositories to their new home.
 

	
 

	
 

	
 
Tuesday 5 October 20010
 
-----------------------
 

	
 

	
 
tutorial0.pro
 
+++++++++++++
 

	
 
Added simplugin.h to list of header files. NB: this is the only
 
tutorial in which simplugin.h appears.
 

	
 

	
 
auxingrowthplugin.h
 
+++++++++++++++++++
 

	
 
Declared, and defined, a virtual function named ``DefaultLeafML()``
 
which merely returns a QString naming a LeafML filename sans path.
 

	
 

	
 

	
 
VirtualLeaf.cpp
 
+++++++++++++++
 

	
 
Moved ``Cell::SetMagnification()`` and ``Cell::SetOffset()`` from
 
``main()`` to ``MainBase::Init()``.
 

	
 

	
 
canvas.h
 
++++++++
 

	
 
Declare ``exportCellData()``.
 

	
 

	
 
canvas.cpp
 
++++++++++
 

	
 
Add an 'Export cell areas' to the file dropdown menu which invokes - surprise - ``Main::exportCellData()``::
 

	
 
  void Main::exportCellData(void) {
 
    QFile file("areas.csv");
 
    if ( file.open( IO_WriteOnly ) ) {
 
      QTextStream stream( &file );
 
      mesh.CSVExportCellData(stream);
 
      mesh.CSVExportMeshData(stream);
 
      file.close();
 
    }
 
  }
 

	
 

	
 
mesh.h
 
++++++
 

	
 
Include ``<QTextStream>``
 

	
 
Set the boundary_poloygon pointer to zero in the class constructor,
 
and delete it, if it exists, in the class destructor.
 

	
 
Declare ``Compactness()``, ``CSVExportCellData()`` and ``CSVExportMeshData()``::
 

	
 
  double Compactness(double *res_compactness=0, double *res_area=0, double *res_cell_area=0);
 
  void CSVExportCellData(QTextStream &csv_stream) const;
 
  void CSVExportMeshData(QTextStream &csv_stream);
 

	
 

	
 
mesh.cpp
 
++++++++
 

	
 
In ``mesh::clear()``, delete the boundary_polygon only if the pointer hasn't been assigned::
 

	
 
 if (boundary_polygon) {
 
    delete boundary_polygon;
 
    boundary_polygon=0;
 
  }
 

	
 
Ditto for ``mesh::clean()``.
 

	
 
Define the code for ``Compactness()``, ``CSVExportCellData()`` and ``CSVExportMeshData()``.
 

	
 

	
 

	
 
modelcatalogue.cpp
 
++++++++++++++++++
 

	
 
In ``InstallModel()``, find and load the default LeafML file.
 

	
 
simplugin.h
 
+++++++++++
 

	
 
Declare ``DefaultLeafML()``::
 

	
 
  // Default LeafML-file to be read after model startup
 
  virtual QString DefaultLeafML(void);
 

	
 

	
 
simplugin.cpp
 
+++++++++++++
 

	
 
Define ``DefaultLeafML()``. Returns an empty ``QString``::
 

	
 
 QString SimPluginInterface::DefaultLeafML(void) { return QString(); }
 

	
 

	
 
xmlwrite.cpp
 
++++++++++++
 

	
 
In ``Mesh::XMLReadCells()`` - Delete the boundary_ploygon only if its
 
pointer has been assigned.
 

	
 

	
 

	
 
Wednesday 6 October 2010
 
------------------------
 

	
 
Wrote Simon van Mourik about his missing libiconv-2.dll.
 

	
 

	
 
Thursday 7 October 2010
 
-----------------------
 

	
 
Added a Q3FileDialog in ``canvas.cpp:Main::exportCellData(void)`` to
 
choose where to write the exported cell data.
 

	
 

	
 
Friday 8 October 2010
 
---------------------
 

	
 
Added new parameters to control perodic cell exprt data.
 

	
 
Added code to relize perodic cell export.
 

	
 

	
 

	
 
Monday 11 October 2010
 
----------------------
 

	
 
Mercurial hooks
 
+++++++++++++++
 

	
 
Tried several alternatives for Mercurial's ``pretxnchangegroup.forbid_2heads`` hook. 
 

	
 
1. http://bitbucket.org/dgc/headcount: **Headcount** ``ui`` complains of a missing data member
 
2. http://stackoverflow.com/questions/1705921/useful-mercurial-hooks: **forbid2_heads.py** doesn't load
 
3. http://davidherron.com/node/961: **forbid2_heads.sh** works as advertised
 

	
 

	
 
Mercurial Repositories
 
++++++++++++++++++++++
 

	
 
Tried to install Rhode Code from: http://packages.python.org/RhodeCode. 
 

	
 
1. http://bitbucket.org/marcinkuzminski/rhodecode
 
2. http://packages.python.org/RhodeCode, http://pypi.python.org/pypi/RhodeCode/1.0.0rc3
 
3. http://hg.python-works.com (demo,demo)
 
4. http://bitbucket.org/bfrog/cutehg
 
5. http://pypi.python.org/pypi/SIP, http://www.riverbankcomputing.com/hg/sip
 
6. http://pypi.python.org/pypi/PyQt
 
7. http://ask.github.com/celery
 

	
 
All goes tolerably until you tick in the url; at which point RhodeCode complains that::
 

	
 
 Exception happened during processing of request from ('127.0.0.1', 35803)
 
 Traceback (most recent call last):
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/httpserver.py", line 1068, in process_request_in_thread
 
    self.finish_request(request, client_address)
 
  File "/ufs/guravage/opt/Python-2.6.2/lib/python2.6/SocketServer.py", line 320, in finish_request
 
    self.RequestHandlerClass(request, client_address, self)
 
  File "/ufs/guravage/opt/Python-2.6.2/lib/python2.6/SocketServer.py", line 615, in __init__
 
    self.handle()
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/httpserver.py", line 442, in handle
 
    BaseHTTPRequestHandler.handle(self)
 
  File "/ufs/guravage/opt/Python-2.6.2/lib/python2.6/BaseHTTPServer.py", line 329, in handle
 
    self.handle_one_request()
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/httpserver.py", line 437, in handle_one_request
 
    self.wsgi_execute()
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/httpserver.py", line 287, in wsgi_execute
 
    self.wsgi_start_response)
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/cascade.py", line 130, in __call__
 
    return self.apps[-1](environ, start_response)
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg/paste/registry.py", line 379, in __call__
 
    app_iter = self.application(environ, start_response)
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/RhodeCode-1.0.0rc1-py2.6.egg/rhodecode/lib/middleware/https_fixup.py", line 33, in __call__
 
    return self.application(environ, start_response)
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/middleware.py", line 163, in __call__
 
    self.app, new_environ, catch_exc_info=True)
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/util.py", line 48, in call_wsgi_application
 
    app_iter = application(environ, start_response)
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/WebError-0.10.2-py2.6.egg/weberror/errormiddleware.py", line 156, in __call__
 
    return self.application(environ, start_response)
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/RhodeCode-1.0.0rc1-py2.6.egg/rhodecode/lib/middleware/simplehg.py", line 55, in __call__
 
    return self.application(environ, start_response)
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Beaker-1.5.4-py2.6.egg/beaker/middleware.py", line 152, in __call__
 
    return self.wrap_app(environ, session_start_response)
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Routes-1.12.3-py2.6.egg/routes/middleware.py", line 131, in __call__
 
    response = self.app(environ, start_response)
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/wsgiapp.py", line 98, in __call__
 
    self.setup_app_env(environ, start_response)
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/wsgiapp.py", line 203, in setup_app_env
 
    pylons_obj.translator = _get_translator(lang, pylons_config=self.config)
 
  File "/ufs/guravage/.archive/mas/mr/rhodecode/lib/python2.6/site-packages/Pylons-1.0-py2.6.egg/pylons/i18n/translation.py", line 165, in _get_translator
 
    raise LanguageError('IOError: %s' % ioe)
 
 LanguageError: IOError: [Errno 2] No translation file found for domain: 'rhodecode'
 

	
 

	
 
RE-INSTALL
 
++++++++++
 

	
 
 1. easy_install mercurial
 
 2. mkdir src
 
 3. cd src
 
 4. hg clone http://www.riverbankcomputing.com/hg/sip
 
 5. cd sip
 
 6. python build.py prepare
 
 7. python configure.py
 
 8. make
 
 9. make install
 
10. cd ..
 
11. curl http://www.riverbankcomputing.com/static/Downloads/PyQt4/PyQt-x11-gpl-4.7.7.tar.gz
 
11. wget http://www.riverbankcomputing.com/static/Downloads/PyQt4/PyQt-x11-gpl-4.7.7.tar.gz
 
12. tar xzf PyQt-x11-gpl-4.7.7
 
13. cd PyQt-x11-gpl-4.7.7
 
14. python configure.py
 
15. make
 
16. make install
 
17. cd ..
 
18. hg clone https://litsol@bitbucket.org/bfrog/cutehg
 
19. cd cutehg
 
20. python setup.py build
 
21. python setup.py install
 
22. cd ..
 
21. easy_install rhodecode, http://pypi.python.org/pypi/RhodeCode/1.0.0rc2
 
23. easy_install rhodecode, http://pypi.python.org/pypi/RhodeCode/1.0.0rc2
 

	
 

	
 
This procedure fails as before. 
 

	
 
However, upon inspection I saw that the i18n directory was missing
 
from my build but present in the rhodecode clone from bitbucket. While
 
I think that the ``easy_install rhodecode`` invocation is necessary to
 
install the various subsidiary packages, moving the cloned rhodecode
 
into the site-packages directory seems to have made most functionality
 
work. e.g. graphical logs and diff highlighting.
 

	
 

	
 

	
 
Tuesday 12 October 2010
 
-----------------------
 

	
 
RhodeCode
 
+++++++++
 

	
 
I think that if Chris can install RhodeCode, I can serve individual
 
instance from my home directory.
 

	
 

	
 
SED-ML L1V1RC1
 
++++++++++++++
 

	
 
Walking through the new SED-ML schema I see that they've dropped the
 
generic simulation class and added AddXML and RemoveXML model change
 
classes. Adding several more SED-ML examples for the symposium might
 
still be justified - though they become obsolete the moment I
 
introduce the new schema changes.
 

	
 

	
 
Wednesday 13 October 2010
 
-------------------------
 

	
 

	
 
Tweaked ``.bashrc`` and ``virtualenvwrapper.sh`` to facilitate
 
virtualenv and virtualenvwrapper - many unbound variables!
 

	
 

	
 
Pushed recent changes to repository from where Roeland can retrieve
 
and test them.
 

	
 
OK. RhodeCode RC4 works out of the box, excepting cutehg and PyQt4.
 

	
src/ChangeLog
Show inline comments
 
2010-10-14    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* VirtualLeafpar.tmpl (export_fn_prefix): changed to 'cell.'
 

	
 
	* canvas.cpp (TimeStepWrap): Removed TimeStamp(). Cell data
 
	filename now incorporates iteration number.
 

	
 
	* canvas.h (MainBase): Removed TimeStamp().
 

	
 
2010-10-08    <guravage@caterpie.sen.cwi.nl>
 

	
 

	
 
	* pardialog.h:
 
	* pardialog.cpp:
 
	* parameter.h:
 
	* parameter.cpp: Regenerated to include export_interval and export_fn_prefix.
 

	
 
	* VirtualLeafpar.tmpl: Appended export_interval and export_fn_prefix.
 

	
 
	* canvas.h (MainBase): Declared polymorphic exportCellData() functions.
 

	
 
	* canvas.cpp:
 
	(TimeStamp): New private TimeStamp() function.
 
	(TimeStepWrap): Added invocation of exportCellData().
 
	(exportCellData): Created two polymorphic functions: one with a
 
	single QString argument, the other with no argument. The former is
 
	called from TimeStepWrap() while the latter is called from the
 
	"Export cell areas" item in the file menu.
 

	
 

	
 
2010-10-07    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* canvas.cpp (exportCellData): Added a Q3FileDialog to inquire
 
	where to write the exportCellData.
 

	
 
2010-06-28    <guravage@caterpie.sen.cwi.nl>
 

	
 

	
 
	* VirtualLeaf-install.nsi: Grab gpl3.txt from doc directory.
 

	
 
	* canvas.cpp (gpl): gpl3.txt can be either in an ancestor doc
 
	directory (Linux) or a decedent doc directory (Windows, via the
 
	binary installer).
 

	
 
	* VirtualLeaf-install.nsi: Add VirtualLeaf doc directory.
 

	
 
2010-06-25    <guravage@caterpie.sen.cwi.nl>
 

	
 

	
 
	* gpl3.txt: Moved gpl3.txt from doc to src directory.
 

	
 
	* VirtualLeaf.pro: Added -Wno-write-strings and -Wno-unused-parameter to QMAKE_CXXFLAGS.
 

	
 
	* libplugin.pro: Ditto.
 

	
 
	* parameter.cpp: Result of adding datadir changes to make_parameter_source.pl.
 
	* parameter.h: Ditto.
 

	
 
	* output.h: Declared new function (AppendHomeDirIfPathRelative).
 

	
 
	* output.cpp (AppendHomeDirIfPathRelative): Added new function.
 

	
 
	* canvas.cpp (gpl): Moving gpl3.txt from doc to src obviates the need to docDir.cd("../doc").
 

	
 
	* VirtualLeaf-install.nsi: Grab gpl3.txt from src directory.
 
	Add missing libiconv/bin, libxml2bin and libz/bin directories.
 
	Copy libiconv-2.dll, libxml2.dll and zlib1.dll from relative paths.
 

	
 
	* VirtualLeaf.pro: copy gpl3.txt as part of QMAKE_POST_LINK.
 

	
 
2010-06-24    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* libplugin.pro: Use correct library path.
 
	* VirtualLeaf.pro: Ditto.
 

	
 
	* VirtualLeaf.cpp (DrawCell): Iterate over NChem to construct info_string.
 

	
 
2010-06-23    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* simitembase.cpp: Removed NULL assignments to unused variables.
 
	* VirtualLeaf.cpp: Ditto.
 
	* apoplastitem.cpp: Ditto.
 
	* canvas.cpp: Ditto.
 
	* cell.cpp: Ditto.
 
	* cellbase.h: Ditto.
 
	* forwardeuler.cpp: Ditto.
 
	* mainbase.h: Ditto.
 
	* nodeitem.cpp: Ditto.
 
	* qcanvasarrow.h: Ditto.
 
	* simitembase.cpp: Ditto.
 

	
 

	
 
	* Makefile (clean): Add -f Makefile argument to each make invocation.
 

	
 
	* VirtualLeaf-install.nsi: New gpl license text.
 

	
 
	* VirtualLeaf.pro: Disabled console mode.
 

	
 
	* mesh.cpp (Clear): Added parentheses to qDebug statments.
 
	(TestIllegalWalls): Replaced qDebug().
 

	
 
	* canvas.cpp (mouseReleaseEvent): Replaced qDebug() with cerr since qDebug complains about *node_set.
 

	
 
	* wall.cpp (CorrectWall): Rplaced gDebug() with cerr in transform call and when printing *this.
 

	
 
2010-06-22    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* Makefile (tutorials): Add tutorials target.
 

	
 
2010-06-21    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* parameter.cpp: Added particular reassignment of datadir.
 

	
 
	* canvas.cpp (gpl): Added GPL3 License text. Display detail text only if the source text file exists.
 

	
 
2010-06-18    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* canvas.cpp (gpl): Added gpl slot to display GPL license.
 

	
 
	* VirtualLeaf.pro: Changed default LIBXML2DIR, LIBICONVDIR and LIBZDIR to corresponding distribution lib directories.
 
	* libplugin.pro: Ditto.
 

	
 
	* Makefile (clean): add if stmt not to `touch` on windows.
 

	
 
2010-06-17    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* VirtualLeaf.pro: Removed perl references.
 
	* libplugin.pro: Ditto.
 

	
 
2010-06-15    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* VirtualLeaf.pro: Removed xmlwritecode.cpp from SOURCES list.
 

	
 
	* xmlwrite.cpp (XMLSave): Removed references to XMLWriteLeafSourceCode and XMLWriteReactionsCode.
 
	* xmlwrite.h (XMLIO): Ditto!
 

	
 
	* mesh.cpp (findNextBoundaryNode): Initialize Node *next_boundary_node = NULL;
 

	
 
	* xmlwrite.cpp (XMLReadSimtime): Removed unused variable cur
 
	(XMLReadWalls): viz_flux need not be declared twice; default value of 0.0.
 
	(XMLReadCells): Removed unused count variable.
 
	(XMLReadSimtime): Removed unused cur variable.
 
	(XMLRead): Removed unused v_str variable.
 

	
 
	* simitembase.cpp (userMove): Use assignment merely to obviate compilation warning.
 
	(SimItemBase) Ditto.
 

	
 
	* qcanvasarrow.h (QGraphicsLineItem): Use assignment merely to obviate compilation warning.
 

	
 
	* output.cpp (OpenWriteFile): Removed unused par variable.
 

	
 
	* nodeitem.cpp (paint): Use assignment merely to obviate compilation warning.
 

	
 
	* forwardeuler.cpp (odeint): Use assignment merely to obviate compilation warning.
 

	
 
	* cell.cpp (DivideOverGivenLine): Use assignment merely to obviate compilation warning.
 

	
 
	* canvas.cpp (FigureEditor): Use assignments merely to obviate compilation errors.
 
	(mousePressEvent): Removed unused item variable.
 

	
 
	* apoplastitem.cpp
 
	(ApoplastItem): Removed unused par variable.
 
	(OnClick): Use NULL assignment merely to obviate compilation warning.
 

	
 
	* mainbase.h (MainBase): Use assignment merely to obviate compilation warning.
 

	
 
	* cellbase.h (CellsStaticDatamembers): Use assignment merely to obviate compilation warning.
 

	
 

	
 
	* cell.cpp: Wrapped diagnostic output in QDEBUG blocks.
 
	* VirtualLeaf.cpp ditto.
 
	* canvas.cpp ditto.
 
	* cell.cpp ditto.
 
	* data_plot.cpp ditto.
 
	* forwardeuler.cpp ditto.
 
	* mesh.cpp ditto.
 
	* mesh.h
 
	* random.cpp ditto.
 
	* wall.cpp ditto.
 
	* wallbase.cpp ditto.
 
	* wallitem.cpp ditto.
 

	
 

	
 
2010-06-07    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* VirtualLeaf.pro: Removed explicit perl invocation to regerenerate parameter files.
 
	* libplugin.pro: ditto.
 

	
 
2010-06-03    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* pardialog.h: Added default versions of this automatically generated file.
 
	* pardialog.cpp: ditto.
 
	* parameter.h: ditto.
 
	* parameter.cpp: ditto.
 

	
 
	* VirtualLeaf.pro: delete/generate  parameter.{h,cpp}and pardialog.{h,cpp} only if perl is installed.
 
 	* libplugin.pro: dito.
 

	
 
	* Makefile: Added top-level Makefile
 

	
 
2010-05-10    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* VirtualLeaf.pro: Added -fPIC option to QMAKE_CXXFLAGS.
 

	
src/TutorialCode/Tutorial3/ChangeLog
Show inline comments
 
2010-10-14    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* tutorial3.h (SimPluginInterface): Added default LeafML file.
 

	
 
2010-06-25    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* tutorial3.pro: Added -Wno-write-strings and -Wno-unused-parameter to QMAKE_CXXFLAGS.
 

	
 
2010-06-23    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* tutorial3.pro: Corrected windows library path.
 

	
src/TutorialCode/Tutorial3/tutorial3.h
Show inline comments
 
/*
 
 *  $Id$
 
 *
 
 *  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 <QObject>
 
#include <QtGui>
 
#include <QString>
 
#include "simplugin.h"
 

	
 

	
 
class Tutorial3 : public QObject, SimPluginInterface {
 
	Q_OBJECT
 
	Q_INTERFACES(SimPluginInterface);
 

	
 
public:
 
	virtual QString ModelID(void);
 
	
 
	// Executed after the cellular mechanics steps have equillibrized
 
	virtual void CellHouseKeeping (CellBase *c);
 
	// Differential equations describing transport of chemicals from cell to cell
 
	virtual void CelltoCellTransport(Wall *w, double *dchem_c1, double *dchem_c2);
 
    
 
	// Differential equations describing chemical reactions taking place at or near the cell walls
 
	// (e.g. PIN accumulation)
 
	virtual void WallDynamics(Wall *w, double *dw1, double *dw2);
 
	
 
	// Differential equations describing chemical reactions inside the cells
 
	virtual void CellDynamics(CellBase *c, double *dchem);
 
	
 
	// to be executed after a cell division
 
	virtual void OnDivide(ParentInfo *parent_info, CellBase *daughter1, CellBase *daughter2);
 
	
 
	// to be executed for coloring a cell
 
	virtual void SetCellColor(CellBase *c, QColor *color);	
 
	// return number of chemicals
 
	virtual int NChem(void);
 

	
 
	// default LeafML file
 
	virtual QString DefaultLeafML(void) { return QString("tutorial3_init.xml"); }
 
};
 

	
 

	
 

	
 

	
src/TutorialCode/Tutorial4/ChangeLog
Show inline comments
 
2010-10-14    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* tutorial4.h (SimPluginInterface): Added default LeafML file.
 

	
 
2010-06-25    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* tutorial4.pro: Added -Wno-write-strings and -Wno-unused-parameter to QMAKE_CXXFLAGS.
 

	
 
2010-06-23    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* tutorial4.pro: Corrected windows library path.
 

	
src/TutorialCode/Tutorial4/tutorial4.h
Show inline comments
 
/*
 
 *  $Id$
 
 *
 
 *  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 <QObject>
 
#include <QtGui>
 
#include <QString>
 
#include "simplugin.h"
 

	
 

	
 
class Tutorial4 : public QObject, SimPluginInterface {
 
	Q_OBJECT
 
	Q_INTERFACES(SimPluginInterface);
 

	
 
public:
 
	virtual QString ModelID(void);
 
	
 
	// Executed after the cellular mechanics steps have equillibrized
 
	virtual void CellHouseKeeping (CellBase *c);
 
	// Differential equations describing transport of chemicals from cell to cell
 
	virtual void CelltoCellTransport(Wall *w, double *dchem_c1, double *dchem_c2);
 
    
 
	// Differential equations describing chemical reactions taking place at or near the cell walls
 
	// (e.g. PIN accumulation)
 
	virtual void WallDynamics(Wall *w, double *dw1, double *dw2);
 
	
 
	// Differential equations describing chemical reactions inside the cells
 
	virtual void CellDynamics(CellBase *c, double *dchem);
 
	
 
	// to be executed after a cell division
 
	virtual void OnDivide(ParentInfo *parent_info, CellBase *daughter1, CellBase *daughter2);
 
	
 
	// to be executed for coloring a cell
 
	virtual void SetCellColor(CellBase *c, QColor *color);	
 
	// return number of chemicals
 
	virtual int NChem(void);
 
	
 
	virtual double PINflux(CellBase *this_cell, CellBase *adjacent_cell, Wall *w); 
 

	
 
	// default LeafML file
 
	virtual QString DefaultLeafML(void) { return QString("tutorial4_init.xml"); }
 
};
 

	
 

	
 

	
 

	
src/TutorialCode/Tutorial5/ChangeLog
Show inline comments
 
2010-10-14    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* tutorial5.h (SimPluginInterface): Added default LeafML file.
 

	
 
2010-06-25    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* tutorial5.pro: Added -Wno-write-strings and -Wno-unused-parameter to QMAKE_CXXFLAGS.
 

	
 
2010-06-23    <guravage@caterpie.sen.cwi.nl>
 

	
 
	* tutorial5.pro: Corrected windows library path.
 

	
src/TutorialCode/Tutorial5/tutorial5.h
Show inline comments
 
/*
 
 *  $Id$
 
 *
 
 *  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 <QObject>
 
#include <QtGui>
 
#include <QString>
 
#include "simplugin.h"
 

	
 

	
 
class Tutorial5 : public QObject, SimPluginInterface {
 
	Q_OBJECT
 
	Q_INTERFACES(SimPluginInterface);
 

	
 
public:
 
	virtual QString ModelID(void);
 
	
 
	// Executed after the cellular mechanics steps have equillibrized
 
	virtual void CellHouseKeeping (CellBase *c);
 
	// Differential equations describing transport of chemicals from cell to cell
 
	virtual void CelltoCellTransport(Wall *w, double *dchem_c1, double *dchem_c2);
 
    
 
	// Differential equations describing chemical reactions taking place at or near the cell walls
 
	// (e.g. PIN accumulation)
 
	virtual void WallDynamics(Wall *w, double *dw1, double *dw2);
 
	
 
	// Differential equations describing chemical reactions inside the cells
 
	virtual void CellDynamics(CellBase *c, double *dchem);
 
	
 
	// to be executed after a cell division
 
	virtual void OnDivide(ParentInfo *parent_info, CellBase *daughter1, CellBase *daughter2);
 
	
 
	// to be executed for coloring a cell
 
	virtual void SetCellColor(CellBase *c, QColor *color);	
 
	// return number of chemicals
 
	virtual int NChem(void);
 
	
 
	virtual double PINflux(CellBase *this_cell, CellBase *adjacent_cell, Wall *w); 
 

	
 
	// default LeafML file
 
	virtual QString DefaultLeafML(void) { return QString("tutorial5_init.xml"); }
 
};
 

	
 

	
 

	
 

	
src/VirtualLeafpar.tmpl
Show inline comments
 
title = Parameter values for The Virtual Leaf / title
 
label = <b>Visualization</b> / label
 
arrowcolor = white / string
 
arrowsize = 100 / double
 
textcolor = red / string
 
cellnumsize = 1 / int
 
nodenumsize = 1 / int
 
node_mag = 1.0 / double 
 
outlinewidth = 1.0 / double
 
cell_outline_color = forestgreen / string
 
resize_stride = 0 / int
 
label = / label
 
label = <b>Cell mechanics</b> / label
 
T = 1.0 / double
 
lambda_length = 100. / double
 
lambda_celllength = 0. / double
 
target_length = 60. / double 
 
cell_expansion_rate = 1. / double
 
cell_div_expansion_rate = 0. / double
 
auxin_dependent_growth = true / bool
 
ode_accuracy = 1e-4 / double
 
mc_stepsize = 0.4 / double
 
mc_cell_stepsize = 0.2 / double
 
energy_threshold = 1000. / double
 
bend_lambda = 0. / double
 
alignment_lambda = 0. / double
 
rel_cell_div_threshold = 2. / double
 
rel_perimeter_stiffness = 2 / double
 
collapse_node_threshold = 0.05 / double
 
morphogen_div_threshold = 0.2 / double
 
morphogen_expansion_threshold = 0.01 / double
 
copy_wall = true / bool
 
label = / label
 
label = <b>Auxin transport and PIN1 dynamics</b> / label
 
source = 0. / double
 
D = 0., 0.0, 0.0, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. / doublelist
 
initval = 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. / doublelist
 
k1 = 1. / double
 
k2 = 0.3 / double
 
r = 1. / double
 
kr = 1. / double
 
#k3 = 1 / double
 
#k4 = 0.3 / double
 
km = 1. / double
 
Pi_tot = 1. / double
 
transport = 0.036 / double
 
ka = 1 / double
 
# d = 1e-06 / double
 
# e = 0.01 / double
 
# f = 10 / double
 
pin_prod = 0.001 / double
 
pin_prod_in_epidermis = 0.1 / double
 
pin_breakdown = 0.001 / double
 
pin_breakdown_internal = 0.001 / double
 
aux1prod = 0.001 / double
 
aux1prodmeso = 0. / double
 
aux1decay = 0.001 / double
 
aux1decaymeso = 0.1 / double
 
aux1transport = 0.036 / double
 
aux_cons = 0. / double
 
aux_breakdown = 0. / double
 
kaux1 = 1 / double
 
kap = 1 / double
 
leaf_tip_source = 0.001 / double
 
sam_efflux = 0.0001 / double
 
sam_auxin = 10. / double
 
# gf_prod = 1e-3 / double
 
# gf_decay = 1e-3 / double
 
sam_auxin_breakdown = 0 / double
 
#label = / label
 
#label = <b>miscellaneous</b> / label
 
van3prod = 0.002 / double
 
van3autokat = 0.1 / double
 
van3sat = 10 / double
 
k2van3 = 0.3 / double
 
#glvprod = 0.0 / double
 
#glvbreakdown = 0. / double
 
label = / label
 
label = <b>Integration parameters</b> / label
 
dt = 0.1 / double 
 
rd_dt = 1.0 / double
 
datadir = . / directory 
 
movie = false / bool
 
nit = 100000 / int
 
maxt = 1000. / double
 
storage_stride = 10 / int
 
xml_storage_stride = 500 / int
 
rseed = -1 / int
 
#label = / label
 
#label = <b>Parameters for new chemical</b> / label
 
#glvproduction = 0. / double
 
#glvdecay = 0. / double
 
#glvdiffthreshold = 0. / double
 
label = / label
 
label = <b>Meinhardt leaf venation model</b> / label
 
constituous_expansion_limit = 16 / int
 
vessel_inh_level = 1 / double
 
vessel_expansion_rate = 0.25 / double
 
d = 0. / double
 
e = 0. / double
 
f = 0. / double
 
c = 0. / double
 
mu = 0. / double
 
nu = 0. / double
 
rho0 = 0. / double
 
rho1 = 0. / double
 
c0 = 0. / double
 
gamma = 0. / double
 
eps = 0. / double
 
label = / label
 
label = <b>User-defined parameters</b> / label
 
k = 0., 0.0, 0.0, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. / doublelist
 
i1 = 0 / int
 
i2 = 0 / int
 
i3 = 0 / int
 
i4 = 0 / int
 
i5 = 0 / int
 
s1 =  / string
 
s2 =  / string
 
s3 =  / string
 
b1 = false / bool
 
b2 = false / bool
 
b3 = false / bool
 
b4 = false / bool
 
dir1 = . / directory
 
dir2 = . / directory
 
export_interval = 0 / int
 
export_fn_prefix = CellData_ / string
 
export_fn_prefix = cell. / string
src/canvas.cpp
Show inline comments
 
/*
 
 *
 
 *  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 <http://www.gnu.org/licenses/>.
 
 *
 
 *  Copyright 2010 Roeland Merks.
 
 *
 
 */
 

	
 
#include <time.h>
 
#include <string>
 
#include <fstream>
 
#include <streambuf>
 
#include <QGraphicsScene>
 
#include <QGraphicsView>
 
#include <qdatetime.h>
 
#include <q3mainwindow.h>
 
#include <qstatusbar.h>
 
#include <qmessagebox.h>
 
#include <qmenubar.h>
 
#include <qapplication.h>
 
#include <qpainter.h>
 
#include <qprinter.h>
 
#include <qlabel.h>
 
#include <qimage.h>
 
#include <q3progressdialog.h>
 
#include <qtimer.h>
 
#include <qslider.h>
 
#include <qpixmap.h>
 
#include <qfile.h>
 
#include <qdir.h>
 
#include <q3filedialog.h>
 
#include <QGraphicsItem>
 
#include <QList>
 
#include <QDir>
 

	
 
#include <QDebug>
 

	
 
#include <set>
 

	
 
//Added by qt3to4:
 
#include <Q3ValueList>
 
#include <Q3PopupMenu>
 
#include <QMouseEvent>
 
#include <typeinfo>
 
#include <cstring>
 
#include <q3process.h>
 
#include <qlayout.h>
 
#include <qspinbox.h>
 
#include <fstream>
 
#include <sstream>
 
#include "pardialog.h"
 
#include "parameter.h"
 
#include "canvas.h"
 
#include "node.h"
 
#include "nodeset.h"
 
#include "nodeitem.h"
 
#include "cellitem.h"
 
#include "wallitem.h"
 
#include "mesh.h"
 
#include "xmlwrite.h"
 
#include "miscq.h"
 
#include "OptionFileDialog.h"
 
#include <cstdlib>
 
#include <cstdio>
 
#include "modelcatalogue.h"
 

	
 
#include <algorithm>
 

	
 
// Include VIB and PSB logos
 
#include "psb.xpm"
 
#include "cwi.xpm"
 

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

	
 
using namespace std;
 

	
 
// We use a global variable to save memory - all the brushes and pens in
 
// the mesh are shared.
 

	
 
#define FNAMESIZE 100
 
#define QUOTE_ME(s) QUOTE_ME_2NDLEV(s)
 
#define QUOTE_ME_2NDLEV(s) #s
 

	
 
static QColor dark_red("darkRed");
 

	
 

	
 
static const int imageRTTI = 984376;
 
extern Parameter par;
 
const QString Main::caption("Virtual leaf");
 
const QString Main::caption_with_file("Virtual leaf: %1");
 

	
 
FigureEditor::FigureEditor(
 
			   QGraphicsScene& c, Mesh &m, QWidget* parent,
 
			   const char* name, Qt::WindowFlags f) :
 
  QGraphicsView(&c,parent), mesh(m)
 
{
 
  intersection_line = 0;
 
  //angle_line = 0;
 
  setInteractive(true);
 
  moving = 0;  
 
  rotation_mode = false;
 
}
 

	
 

	
 
void FigureEditor::clear()
 
{
 
  QList<QGraphicsItem *> list = scene()->items();
 
  QList<QGraphicsItem *>::Iterator it = list.begin();
 
  for (; it != list.end(); ++it) {
 
    delete *it;
 
  }
 
}
 

	
 
void FigureEditor::wheelEvent(QWheelEvent *event)
 
{
 
  scaleView(pow((double)2, -event->delta() / 240.0));
 
}
 

	
 

	
 
void FigureEditor::scaleView (qreal scaleFactor)
 
{
 
  qreal factor = matrix().scale(scaleFactor, scaleFactor).mapRect(QRectF(0, 0, 1, 1)). width();
 
  if (factor < 0.07 || factor > 100) return;
 
  scale (scaleFactor, scaleFactor);
 
}
 

	
 
void FigureEditor::Save(const char *fname, const char *format, int sizex, int sizey)
 
{
 

	
 
  QImage *image = new QImage(sizex, sizey, QImage::Format_RGB32);
 
  image->fill(QColor(Qt::white).rgb());
 
  QPainter *painter=new QPainter(image);
 

	
 
  render(painter);
 

	
 
  image->save(QString(fname),format);
 
  delete painter;
 
  delete image;
 
}
 

	
 
void FigureEditor::mousePressEvent(QMouseEvent* e)
 
{
 
  static QList<Node*> selected;
 
  emit MousePressed();
 

	
 
  //QPointF p = matrix().inverted().map(e->pos());
 
  QPointF p = mapToScene(e->pos());
 

	
 
#ifdef QDEBUG  
 
  qDebug() << endl << "MousePressEvent location: (" << p.x() << "," << p.y() << ")." << endl;
 
  qDebug() << "Magnification:  " << Cell::Magnification() << endl;
 
  qDebug() << "Offsets:  " << Cell::Offset() << endl;
 
#endif
 

	
 

	
 
  QList<QGraphicsItem *> l=scene()->items(p);
 

	
 
#ifdef QDEBUG  
 
  qDebug() << "MousePressEvents, items: " << l.size() << endl;
 
  qDebug() << "Mouse button modifier: " << e->modifiers() << endl;
 
#endif
 

	
 
  if (e->button()==Qt::RightButton || l.size()==0) {
 

	
 
    //cerr << "Drawing an intersection line from " << p.x() << ", " << p.y() << endl;
 
    intersection_line = new QGraphicsLineItem( 0, scene() );
 
    intersection_line->setPen( QPen( QColor("red"), 3, Qt::DashLine ) );
 
    intersection_line->setLine( QLineF(p,p) );
 
    intersection_line->setZValue( 100 );
 
    intersection_line->show();
 
  }
 

	
 
  for (QList<QGraphicsItem *>::Iterator it=l.begin(); it!=l.end(); ++it) {
 
#ifdef QDEBUG
 
    qDebug() << typeid(**it).name() << endl;
 
#endif
 

	
 
    if ( !strcmp(typeid(**it).name(),"8NodeItem")) {
 

	
 
      stringstream data_strstream;
 
      data_strstream << (dynamic_cast<NodeItem*>(*it))->getNode();
 
      dynamic_cast<Main *>(parent())->UserMessage(QString(data_strstream.str().c_str()));
 

	
 
      (dynamic_cast<NodeItem*>(*it))->OnClick(e->button());
 
    }
 
    else 
 
      if ( !strcmp(typeid(**it).name(),"8CellItem") ) {
 

	
 
	Cell &c=((dynamic_cast<CellItem *>(*it))->getCell());      
 
	// OnClick to be defined in end-user code
 
	c.OnClick(e);
 
      } else {
 
	if ( !strcmp(typeid(**it).name(),"8WallItem") ) {
 
	  (dynamic_cast<WallItem *>(*it))->OnClick(e);
 
	} 
 
      }
 
  }
 

	
 
  FullRedraw();
 
  moving = 0;
 
}
 

	
 
void FigureEditor::mouseMoveEvent(QMouseEvent* e)
 
{
 

	
 
  // User chooses "rotation mode" and we can rotate the object around its center of mass
 
  if (dynamic_cast<Main *>(parent())->RotationModeP()) {
 

	
 
    QPointF p = mapToScene(e->pos());
 
    p.setX(p.x() / Cell::Magnification());
 
    p.setY(p.y() / Cell::Magnification());
 

	
 

	
 
    // get object's center of mass
 
    QPointF rotation_midpoint = mesh.Centroid()*Cell::Factor() - Cell::Offset();
 

	
 

	
 
    // calculate rotation angle
 
    double dy = (rotation_midpoint.y() - p.y());
 
    double dx = (rotation_midpoint.x() - p.x());
 
    double new_rot_angle = atan2(dx, dy);
 
    double d_alpha = new_rot_angle - rot_angle;
 
    rot_angle = new_rot_angle;
 

	
 
    mesh.Rotate(d_alpha, ( Vector(rotation_midpoint) + Cell::Offset() ) / Cell::Factor() );
 

	
 
    dynamic_cast<Main *>(parent())->Plot(0);
 
    FullRedraw();
 
    return;
 
  }
 
 
 
  
 
  if ( moving ) {
 

	
 
    QPointF p = mapToScene(e->pos());
 
    moving->userMove(p.x() - moving_start.x(),
 
		     p.y() - moving_start.y());
 
    moving_start = p;
 
    scene()->update();
 

	
 
  }
 

	
 
  //cerr << "event";
 

	
 
  // keep track of intersection line to interactively cut a growing leaf
 

	
 
  if ( intersection_line ) {
 

	
 
    QPointF sp = intersection_line -> line().p1(); // startpoint
 
    QPointF ep = mapToScene(e->pos()); // endpoint
 
    intersection_line -> setLine( QLineF(sp, ep) ); 
 
    scene()->update();
 
    // Need this for Mac
 
    FullRedraw();
 
  }
 
}
 

	
 
//void FigureEditor::contentsMouseReleaseEvent(QMouseEvent* e)
 
void FigureEditor::mouseReleaseEvent(QMouseEvent* e)
 
{
 

	
 
  emit MouseReleased();
 
  // intersection line for leaf was finished now.
 

	
 
  if (e->button()==Qt::LeftButton) { 
 
    if (intersection_line ) {
 
#ifdef QDEBUG
 
      qDebug() << "Trying to cut leaf" << endl;
 
#endif
 
      QPointF sp = intersection_line -> line().p1(); // startpoint
 
      QPointF ep = mapToScene(e->pos());
 

	
 
      intersection_line -> setLine( QLineF(sp, ep) ); 
 
      intersection_line -> show();
 

	
 
      vector <CellItem *> intersected_cells = getIntersectedCells();
 

	
 
      // no cells selected, do nothing
 
      if (intersected_cells.size()==0) {
 
#ifdef QDEBUG
 
	qDebug() << "No cells detected :-(" << endl;
 
#endif
 
	return;
 
      }
 

	
 

	
 
      Vector startpoint = Vector(sp.x(), sp.y()) / Cell::Factor() - Cell::Offset();
 
      Vector endpoint = Vector(ep.x(), ep.y()) / Cell::Factor() - Cell::Offset();
 

	
 
      NodeSet *node_set = new NodeSet;
 

	
 
      for (vector<CellItem *>::iterator it = intersected_cells.begin(); it != intersected_cells.end(); it++) {
 
	(*it)->setBrush(QBrush("purple"));
 
	
 
	Cell &c=(*it)->getCell();
 

	
 
	// sometimes the cell hasn't properly divided yet before the
 
	// next division is called?  so check for it?  let's find a way
 
	// to do this later. Note that this functionality currently
 
	// might result in a segmentation fault for users who are
 
	// quickly dragging and releasing division lines...
 
	scene()->update();
 

	
 
#ifdef QDEBUG
 
	qDebug() << "Dividing Cell " << c.Index() << endl;
 
#endif
 

	
 
	c.DivideOverGivenLine( startpoint, endpoint, true, node_set);
 
      }
 

	
 
      node_set->CleanUp();
 
      mesh.AddNodeSet(node_set);
 

	
 
#ifdef QDEBUG
 
      qDebug() << "Done DivideOverGivenLine" << endl;
 
#endif
 

	
 
      mesh.TestIllegalWalls();
 
      // Do the actual cutting and removing
 
      if (intersected_cells.size()) {
 
	mesh.CutAwayBelowLine( startpoint, endpoint ); 
 

	
 
	// Correct flags of nodeset
 
	for (NodeSet::iterator i = node_set->begin(); i != node_set->end(); i++) {
 
	  (*i)->SetSAM();
 
	  (*i)->SetBoundary();
 
	}
 

	
 
	// Make cells attached to nodeset part of the boundary
 
	// This is a temporary solution for the following:
 
	//   If a cell attached to a NodeSet divides (with a division plane intersecting the node set), 
 
	//   we must insert a new node into the node set.
 
	// For now, we add a layer of "virtual cells" inbetween. 
 
	list<Cell *> cells_attached_to_nodeset = node_set->getCells();
 
	for ( list<Cell *>::iterator c = cells_attached_to_nodeset.begin(); c != cells_attached_to_nodeset.end(); c++) {
 
	  (*c)->SetBoundary(Cell::SAM);
 
	}
 

	
 

	
 

	
 
#ifdef QDEBUG
 
	qDebug() << "Done CutAwayBelowLine" << endl;
 
#endif
 
	mesh.TestIllegalWalls();
 
	mesh.RepairBoundaryPolygon();
 
#ifdef QDEBUG
 
	qDebug() << "Done RepairBoundaryPolygon" << endl;
 
#endif
 
	mesh.TestIllegalWalls();
 
	mesh.CleanUpWalls();
 
#ifdef QDEBUG
 
	qDebug() << "Done CleanUpWalls" << endl;
 
#endif
 
	mesh.TestIllegalWalls();
 
      }
 

	
 
      dynamic_cast<Main *>(parent())->Plot();
 

	
 
#ifdef QDEBUG
 
      cerr << "NodeSet of cutting line: " << *node_set << endl;
 
#endif
 
    }
 
  } else 
 
    if (e->button()==Qt::RightButton) {
 

	
 
      if (intersection_line /* && !angle_line*/) {
 

	
 
	QPointF p = mapToScene(e->pos());
 
	QPointF sp = intersection_line->line().p1();
 

	
 
	viewport()->setMouseTracking( TRUE );
 
      } 
 
    }
 
}
 

	
 

	
 
// returns a vector of pointer to cells colliding with intersection line
 
vector <CellItem *> FigureEditor::getIntersectedCells(void)
 
{ 
 
  vector <CellItem *> colliding_cells;
 

	
 
  QList<QGraphicsItem *> l = intersection_line->collidingItems( );
 

	
 
#ifdef QDEBUG
 
  qDebug() <<  "l.size() = " << l.size() << endl;
 
#endif
 

	
 
  for (QList<QGraphicsItem *>::Iterator it=l.begin(); it!=l.end(); ++it) {
 

	
 
#ifdef QDEBUG
 
    qDebug() << typeid(**it).name() << endl;
 
#endif
 

	
 
    if ( !strcmp(typeid(**it).name(),"8CellItem") ) {
 
      colliding_cells.push_back(dynamic_cast<CellItem *>(*it));
 
    }
 
  }
 

	
 
  delete intersection_line;
 
  intersection_line = 0;
 
  return colliding_cells;
 
}
 

	
 
void FigureEditor::FullRedraw(void)
 
{
 
  QList<QRectF> rl;
 
  rl << sceneRect();
 
  updateScene(rl);   
 
}
 

	
 

	
 
NodeItem *FigureEditor::selectedNodeItem(QList<QGraphicsItem *> graphicItems) const
 
{
 
  NodeItem *nodeItem = 0;
 
  // graphicItems is a list of the QgraphicItems under the mouse click event 
 
  QList<QGraphicsItem *>::Iterator it = graphicItems.begin();
 
  for (; it != graphicItems.end(); ++it) {
 
    if ( !strcmp(typeid(**it).name(),"8NodeItem")) {
 
      // the object under the mouse click is a Nodeitem
 
      nodeItem = dynamic_cast<NodeItem *>(*it);
 
      // indicate we've selected it
 
      nodeItem->setBrush(dark_red);
 
      break;
 
    }
 
  }
 
  return nodeItem;
 
}
 

	
 

	
 
void FigureEditor::insertNode(QPointF p)
 
{
 
  Node *node = new Node(p.x(), p.y(), 0);
 
  mesh.AddNode(node);
 
  scene()->clearSelection();
 
  dynamic_cast<Main *>(parent())->Plot();
 
  FullRedraw();
 
#ifdef QDEBUG  
 
  qDebug() << "Node: " << p << endl;
 
#endif
 
}
 

	
 
static uint mainCount = 0;
 

	
 
Main::Main(QGraphicsScene& c, Mesh &m, QWidget* parent, const char* name, Qt::WindowFlags f) :
 
  Q3MainWindow(parent,name,f),
 
  MainBase(c,m),
 
  mesh(m)
 
{
 
  editor = new FigureEditor(canvas,mesh, this);
 

	
 
#ifdef QDEBUG
 
  qDebug() << "Interactive = " << editor->isEnabled();
 
#endif
 

	
 
  working_dir = 0;
 
  QObject::connect( editor, SIGNAL(MousePressed()), this, SLOT(PauseIfRunning()));
 
  QObject::connect( editor, SIGNAL(MouseReleased()), this, SLOT(ContIfRunning()));
 
  QMenuBar* menu = menuBar();
 

	
 
  Q3PopupMenu* file = new Q3PopupMenu( menu );
 

	
 
  file->insertItem("&Read leaf", this, SLOT(readStateXML()));
 
  file->insertItem("&Save leaf", this, SLOT(saveStateXML()));
 
  file->insertItem("Snapshot", this, SLOT(snapshot()), Qt::CTRL+Qt::SHIFT+Qt::Key_S);
 

	
 
  file->insertSeparator();
 
  file->insertItem("Read next leaf", this, SLOT(readNextStateXML()), Qt::Key_PageDown);
 
  file->insertItem("Read previous leaf", this, SLOT(readPrevStateXML()), Qt::Key_PageUp);
 
  file->insertItem("Read last leaf", this, SLOT(readLastStateXML()), Qt::Key_End);
 
  file->insertItem("Read first leaf", this, SLOT(readFirstStateXML()), Qt::Key_Home);
 
  file->insertItem("Export cell areas", this, SLOT(exportCellData()));
 
  file->insertItem("Export cell data", this, SLOT(exportCellData()));
 

	
 
  file->insertSeparator();
 
  file->insertItem("&Print...", this, SLOT(print()), Qt::CTRL+Qt::Key_P);
 
  file->insertSeparator();
 
  file->insertItem("E&xit", qApp, SLOT(quit()), Qt::CTRL+Qt::Key_Q);
 
  menu->insertItem("&File", file);
 

	
 
  Q3PopupMenu* edit = new Q3PopupMenu( menu );
 
  edit->insertItem("Reset Chemicals and Transporters", this, SLOT( CleanMesh()), Qt::CTRL+Qt::Key_R );
 
  edit->insertItem("Reset Chemicals", this, SLOT( CleanMeshChemicals()) );
 
  edit->insertItem("Reset Transporters", this, SLOT( CleanMeshTransporters()) );
 
  edit->insertItem("Randomize PIN1 Transporters", this, SLOT( RandomizeMesh()) );
 
  edit->insertItem("Cut away SAM", this, SLOT( CutSAM() ));
 
  menu->insertItem("&Edit", edit);
 

	
 
  run = new Q3PopupMenu( menu );
 
  running = false;
 
  paused_id = run->insertItem("&Simulation paused", this, SLOT(togglePaused()), Qt::Key_S);
 
  run->setItemChecked(paused_id, FALSE);
 

	
 
  menu->insertItem("&Run", run);
 

	
 
  view = new Q3PopupMenu( menu );
 
  view->insertItem("&Zoom in", this, SLOT(zoomIn()), Qt::CTRL+Qt::Key_Equal);
 
  view->insertItem("Zoom &out", this, SLOT(zoomOut()), Qt::CTRL+Qt::Key_Minus);
 
  view->insertSeparator();
 
  com_id = view->insertItem("Show cell &centers", this, SLOT(toggleShowCellCenters()));
 
  view->setItemChecked(com_id, FALSE);
 

	
 
  mesh_id = view->insertItem("Show &nodes", this, SLOT(toggleShowNodes()), Qt::CTRL+Qt::SHIFT+Qt::Key_N);
 
  view->setItemChecked(mesh_id, TRUE);
 
  node_number_id = view->insertItem("Show node numbers", this, SLOT(toggleNodeNumbers()), Qt::CTRL+Qt::SHIFT+Qt::Key_M);
 
  view->setItemChecked(node_number_id, FALSE);
 
  cell_number_id = view->insertItem("Show cell numbers", this, SLOT(toggleCellNumbers()));
 
  view->setItemChecked(cell_number_id, FALSE);
 
  hide_cells_id = view->insertItem("Hide cells", this, SLOT(toggleHideCells()));
 
  view->setItemChecked(hide_cells_id, FALSE);
 
  border_id = view->insertItem("Show &border cells", this, SLOT(toggleShowBorderCells()));
 
  view->setItemChecked(border_id, FALSE);
 
  cell_axes_id = view->insertItem("Show cell &axes", this, SLOT(toggleCellAxes()));
 
  cell_strain_id = view->insertItem("Show cell &strain", this, SLOT(toggleCellStrain()));
 
  view->setItemChecked(cell_axes_id, FALSE);
 
  fluxes_id = view->insertItem("Show &fluxes", this, SLOT(toggleShowFluxes()));
 
  view->setItemChecked(fluxes_id, FALSE);
 
  cell_walls_id = view->insertItem("Show transporters", this, SLOT(toggleShowWalls()));
 
  view->setItemChecked(cell_walls_id, FALSE);
 
 // apoplasts_id = view->insertItem("Show apoplasts", this, SLOT(toggleShowApoplasts()));
 
 // view->setItemChecked(apoplasts_id, FALSE);
 
  view->insertSeparator();
 
  only_boundary_id = view->insertItem("Show only leaf &boundary", this, SLOT(toggleLeafBoundary()));
 
  view->insertSeparator();
 
  movie_frames_id = view->insertItem("Start saving movie &frames", this, SLOT(toggleMovieFrames()));
 
  view->setItemChecked(movie_frames_id, par.movie);
 

	
 
  view->setItemChecked(only_boundary_id, FALSE);
 
  menu->insertItem("&View", view);
 

	
 

	
 
  options = new Q3PopupMenu( menu );
 
  dyn_cells_id = options->insertItem("Cell growth", this, SLOT(toggleDynCells()));
 
  options->setItemChecked(dyn_cells_id, true);
 

	
 
  options->insertItem("Edit &parameters", this, SLOT(EditParameters()), Qt::CTRL+Qt::Key_E);
 

	
 
  rotation_mode_id = options->insertItem("Rotate leaf", this, SLOT(EnterRotationMode()), Qt::CTRL + Qt::SHIFT + Qt::Key_R);
 
  options->setItemChecked(rotation_mode_id, false);
 

	
 
  menu->insertItem("&Options",options);
 

	
 
  // Menu of models
 
  modelmenu = new QMenu( menu );
 
  menu->insertItem("&Models", modelmenu);
 

	
 

	
 
  menu->insertSeparator();
 

	
 
  helpmenu = new Q3PopupMenu( menu );
 
  tooltips_id = helpmenu->insertItem("Show Cell&Info", this, SLOT(Refresh()));
 
  helpmenu->setItemChecked(tooltips_id, true);
 
  helpmenu->insertSeparator();
 
    //helpmenu->insertSeparator();
 
  helpmenu->insertItem("&LICENSE", this, SLOT(gpl()) );
 
  helpmenu->insertItem("About", this, SLOT(about()) ); //, Key_F1);
 
	
 
	menu->insertItem("&Help",helpmenu);
 
  statusBar();
 
  setCentralWidget(editor);
 
  printer = 0;
 
  init();
 

	
 
  // Start timer which repetitively invokes
 
  // a simulation time step
 
  timer = new QTimer( this );
 
  connect( timer, SIGNAL(timeout()), SLOT(TimeStepWrap()) );
 

	
 
  stopSimulation();
 
  statusBar()->addWidget(new QLabel("Ready."));
 
  setCaption(caption);
 
  gifanim = 0;
 

	
 
  infobar = new InfoBar();
 
  addDockWindow(infobar);
 
}
 

	
 
void Main::RefreshInfoBar(void)
 
{
 
  infobar->SetText(mesh.ModelID());
 
}
 

	
 

	
 
void Main::UserMessage(QString message, int timeout)
 
{
 
  statusBar()->showMessage(message, timeout);
 
}
 

	
 

	
 
void Main::init()
 
{
 
  clear();
 

	
 
  static int r=24;
 
  srand(++r);
 

	
 
  mainCount++;
 
}
 

	
 
Main::~Main()
 
{
 
  delete printer;
 
  if ( !--mainCount ) {
 
  }
 
  //EndGifAnim();
 
}
 

	
 
void Main::newView()
 
{
 
  // Open a new view... have it delete when closed.
 
  Main *m = new Main(canvas, mesh, 0, 0, Qt::WDestructiveClose);
 
  qApp->setMainWidget(m);
 
  m->show();
 
  qApp->setMainWidget(0);
 
}
 

	
 

	
 
void Main::EditParameters()
 
{
 

	
 
  ParameterDialog *pardial = new ParameterDialog(this, "stridediag");
 

	
 
  // Make sure the values in the parameter dialog are updated after a file is read 
 
  // each method changing the parameters (reading XML or PAR files) should
 
  // emit this signal
 
  QObject::connect(   this, SIGNAL( ParsChanged() ), pardial, SLOT( Reset() ) );
 
}
 

	
 
void Main::savePars()
 
{
 

	
 
  stopSimulation();
 

	
 
  Q3FileDialog *fd = new Q3FileDialog( this, "file dialog", TRUE );
 
  fd->setMode( Q3FileDialog::AnyFile );
 
  fd->setFilter( "Parameter files (*.par)");
 

	
 
  QString fileName;
 
  if ( fd->exec() == QDialog::Accepted ) {
 
    fileName = fd->selectedFile();
 
    ofstream parfile((const char *)fileName);
 
    par.Write(parfile);
 
  }
 

	
 
  startSimulation();
 
}
 

	
 
void Main::readPars()
 
{
 

	
 
  stopSimulation();
 

	
 
  Q3FileDialog *fd = new Q3FileDialog( this, "file dialog", TRUE );
 
  fd->setMode( Q3FileDialog::ExistingFile );
 
  fd->setFilter( "Parameter files (*.par)");
 

	
 
  QString fileName;
 
  if ( fd->exec() == QDialog::Accepted ) {
 
    fileName = fd->selectedFile();
 
    par.Read((const char *)fileName);
 
  }
 

	
 
  emit ParsChanged();
 
}
 

	
 

	
 
void Main::saveStateXML()
 
{
 

	
 
  stopSimulation();
 
  Q3FileDialog *fd = new Q3FileDialog( this, "file dialog", TRUE );
 
  fd->setMode( Q3FileDialog::AnyFile );
 
  fd->setFilter( "XML (*.xml)");
 
  QString fileName;
 

	
 
  if ( fd->exec() == QDialog::Accepted ) {
 
    fileName = fd->selectedFile();
 
    if ( QFile::exists( fileName ) &&
 
	 QMessageBox::question(
 
			       this,
 
			       tr("Overwrite File? -- Leaf Growth"),
 
			       tr("A file called %1 already exists."
 
				  "Do you want to overwrite it?")
 
			       .arg( fileName ),
 
			       tr("&Yes"), tr("&No"),
 
			       QString::null, 1, 1 ) ) {
 
      return saveStateXML();
 

	
 
    } else {
 

	
 
      mesh.XMLSave((const char *)fileName, XMLSettingsTree());
 

	
 
    }
 
  }
 
}
 

	
 

	
 

	
 
void Main::snapshot()
 
{
 

	
 

	
 
  stopSimulation();
 
  Q3FileDialog *fd = new Q3FileDialog( this, "Save snapshot", TRUE );
 
  fd->setMode( Q3FileDialog::AnyFile );
 

	
 
  QString fileName;
 

	
 
  if ( fd->exec() == QDialog::Accepted ) {
 
    fileName = fd->selectedFile();
 
    if ( QFile::exists( fileName ) &&
 
	 QMessageBox::question(
 
			       this,
 
			       tr("Overwrite File? -- Leaf Growth"),
 
			       tr("A file called %1 already exists."
 
				  "Do you want to overwrite it?")
 
			       .arg( fileName ),
 
			       tr("&Yes"), tr("&No"),
 
			       QString::null, 1, 1 ) ) {
 
      return snapshot();
 

	
 
    } else {
 

	
 
      // extract extension from filename
 
      QString extension = getExtension(fileName);
 

	
 
      // Save bitmaps at 1024x768
 
      Save((const char *)fileName, extension, 1024, 768);
 
    }
 
  }
 
}
 

	
 

	
 

	
 
void Main::readPrevStateXML()
 
{
 

	
 
  // if we have already read a file, read the next file
 
  if (!currentFile.isEmpty() && working_dir) {
 
    QString next_file;
 

	
 
    QStringList xml_files = working_dir->entryList("*.xml");
 
    QString currentFile_nopath = currentFile.section( '/', -1 );
 
    QString currentFile_path = currentFile.section( '/', 0, -2 );
 

	
 
    QList<QString>::iterator f = xml_files.find( currentFile_nopath );
 

	
 
    if (f == xml_files.end()) {
 
      return;
 
    }
 

	
 
    if (f==xml_files.begin()) {
 
      QMessageBox mb( "Read previous leaf",
 
		      "No more files",
 
		      QMessageBox::Information,
 
		      QMessageBox::Ok | QMessageBox::Default,
 
		      QMessageBox::NoButton,
 
		      QMessageBox::NoButton);
 
      mb.exec();
 
      return;
 
    }
 
    next_file = *(--f);
 
    next_file = currentFile_path+"/"+next_file;
 

	
 
    readStateXML((const char *)next_file);
 

	
 
  }
 
}
 

	
 
int Main::readStateXML(const char *filename, bool geometry, bool pars, bool simtime)
 
{
 

	
 
  try {
 
    xmlNode *settings;
 
    mesh.XMLRead((const char *)filename, &settings, geometry, pars, simtime);
 
#ifdef QDEBUG
 
    qDebug() << "Reading done."<< endl;
 
#endif
 
    XMLReadSettings(settings);
 
    xmlFree(settings);
 
    Cell::SetMagnification(1);
 
    Cell::setOffset(0,0);
 

	
 
    FitLeafToCanvas();
 
    
 
    currentFile =  QString(filename);
 

	
 
    Plot();
 
    QString status_message = QString("Successfully read leaf from file %1. Time is %2 h.").arg(currentFile).arg(mesh.getTimeHours().c_str());
 
    cerr << status_message.toStdString() << endl;
 
    setCaption(caption_with_file.arg(filename));
 
    statusBar()->message(status_message);
 
    emit ParsChanged();
 
#ifdef QDEBUG
 
    qDebug() << "Done. Returning 0." << endl;
 
#endif
 
    return 0;
 
  } catch (const char *error_message) {
 
    QMessageBox mb( "Read leaf from XML file",
 
		    QString(error_message),
 
		    QMessageBox::Critical,
 
		    QMessageBox::Ok | QMessageBox::Default,
 
		    Qt::NoButton,
 
		    Qt::NoButton);
 
    mb.exec();
 
    return 1;
 
  }
 
}
 

	
 

	
 
void Main::readNextStateXML()
 
{
 

	
 
  // if we have already read a file, read the next file
 
  if (!currentFile.isEmpty() && working_dir) {
 
    QString next_file;
 

	
 
    QStringList xml_files = working_dir->entryList("*.xml");
 
    QString currentFile_nopath = currentFile.section( '/', -1 );
 
    QString currentFile_path = currentFile.section( '/', 0, -2 );
 

	
 

	
 
    QList<QString>::iterator f = xml_files.find( currentFile_nopath );
 

	
 
    if (f == xml_files.end()) {
 
      return;
 
    }
 

	
 
    ++f;
 
    if (f==xml_files.end()) {
 
      QMessageBox mb( "Read next leaf",
 
		      "No more files",
 
		      QMessageBox::Information,
 
		      QMessageBox::Ok | QMessageBox::Default,
 
		      QMessageBox::NoButton,
 
		      QMessageBox::NoButton);
 
      mb.exec();
 
      return;
 
    }
 
    next_file = *f;
 
    next_file = currentFile_path+"/"+next_file;
 

	
 
    readStateXML((const char*)next_file);
 
  }
 
}
 

	
 
void Main::readLastStateXML()
 
{
 

	
 
  // if we have already read a file, read the next file
 
  if (!currentFile.isEmpty() && working_dir) {
 
    QString next_file;
 

	
 
    QStringList xml_files = working_dir->entryList("*.xml");
 
    QString currentFile_nopath = currentFile.section( '/', -1 );
 
    QString currentFile_path = currentFile.section( '/', 0, -2 );
 

	
 

	
 
    next_file = xml_files.back();
 

	
 
    next_file = currentFile_path+"/"+next_file;
 

	
 
    readStateXML((const char*)next_file);
 
  }
 
}
 

	
 

	
 
void Main::readFirstStateXML()
 
{
 

	
 
  // if we have already read a file, read the next file
 
  if (!currentFile.isEmpty() && working_dir) {
 
    QString next_file;
 

	
 
    QStringList xml_files = working_dir->entryList("*.xml");
 
    QString currentFile_nopath = currentFile.section( '/', -1 );
 
    QString currentFile_path = currentFile.section( '/', 0, -2 );
 

	
 

	
 
    next_file = xml_files.front();
 

	
 
    next_file = currentFile_path+"/"+next_file;
 

	
 
    readStateXML((const char*)next_file);
 
  }
 
}
 

	
 
void Main::readStateXML()
 
{
 

	
 
  //  extern Mesh mesh;
 

	
 
  stopSimulation();
 
#ifdef QDEBUG
 
  qDebug() << "Trying to open an OptionFileDialog" << endl;
 
#endif
 
  OptionFileDialog *fd = new OptionFileDialog( this, "read dialog", TRUE );
 
  fd->setMode( OptionFileDialog::ExistingFile );
 
  fd->setFilter( "XML files (*.xml)");
 
  if (working_dir) {
 
    fd->setDir(*working_dir);
 
  }
 
  QString fileName;
 
  if ( fd->exec() == QDialog::Accepted ) {
 

	
 
    fileName = fd->selectedFile();
 
    if (working_dir) {
 
      delete working_dir;
 
    }
 
    working_dir = fd->dir();
 

	
 
    if (readStateXML((const char *)fileName,fd->readGeometryP(), fd->readParametersP()) )
 
      return readStateXML(); // user can try again
 
  }
 
}
 

	
 

	
 
void Main::clear()
 
{
 
  editor->clear();
 
}
 

	
 
void Main::about()
 
{
 
  static QMessageBox* about = new QMessageBox
 
    ( "VirtualLeaf V1.0",
 
      "<h3>VirtualLeaf V1.0</h3>"
 
      "<p>"
 
      "An Open Source framework for cell-based modeling of plant tissue growth and development <br>"
 
      "(c) 2005-2008, Roeland Merks <i>et al.</i><br>"
 
      "    <a href=\"http://www.psb.vib-ugent.be\">VIB Department Plant Systems Biology</a>, "
 
      "Ghent, Belgium <br>"
 
      "(c) 2008-2010, <a href=\"http://www.cwi.nl/~merks\">Roeland Merks <i>et al.</i></a> <br>"
 
      "    <a href=\"http://www.cwi.nl\">Centrum Wiskunde & Informatica</a> and <a href=\"http://www.ncsb.nl\">Netherlands Consortium for Systems Biology</a>, Amsterdam, Netherlands <br>"
 
"<br>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.<br>"
 
      "<br>If you use this code for your projects, please cite our paper:"
 
"<br>Merks, Guravage, Inze, and Beemster. An Open Source framework for cell-based modeling of plant tissue growth and development. <i>Plant Physiology,</i> submitted.<br> . <br>"
 
      "<br>Please share your model plugins and extensions at <a href=\"http://virtualleaf.googlecode.com\">http://virtualleaf.googlecode.com</a>.", 
 
      QMessageBox::Information, 1, 0, 0, this, 0, FALSE );
 
  about->setButtonText( 1, "Dismiss" );
 
  about->show();
 
}
 

	
 

	
 
void Main::gpl()
 
{
 
  static QMessageBox* gpl = new QMessageBox ( "GPL License", "", 
 
      QMessageBox::Information, 1, 0, 0, this, 0, FALSE );
 

	
 
  QDir docDir(QApplication::applicationDirPath());
 
  docDir.cd("../doc"); // Where Linux expects gpl3.txt
 
  QString path = docDir.filePath("gpl3.txt");
 
  if (!docDir.exists("gpl3.txt")){
 
    docDir = QApplication::applicationDirPath();
 
    docDir.cd("doc"); // Where Windows expects gpl3.txt
 
    path = docDir.filePath("gpl3.txt");
 
  }
 

	
 
  // At this point path points either to the linux variant, which
 
  // exists, or the windows variant, which may exist. Testing the
 
  // ifstream object will determine whether we've found gpl3.txt.
 

	
 
  std::ifstream file(path.toStdString().c_str());
 
  std::string str;
 

	
 
  if (file) {
 
    file.seekg(0, std::ios::end);   
 
    str.reserve(file.tellg());
 
    file.seekg(0, std::ios::beg);
 

	
 
    str.assign((std::istreambuf_iterator<char>(file)),
 
	       std::istreambuf_iterator<char>());
 

	
 
    gpl->setDetailedText(QString(str.c_str()));
 
  }
 

	
 
  gpl->setText(QString( "<h3>GNU GENERAL PUBLIC LICENSE</h3>"
 
			"<p>Version 3, 29 June 2007</p>"
 
			"<p>Copyright &copy; 2007 Free Software Foundation, Inc. "
 
			"&lt;<a href=\"http://fsf.org/\">http://fsf.org/</a>&gt;</p><p>"
 
			"Everyone is permitted to copy and distribute verbatim copies "
 
			"of this license document, but changing it is not allowed.</p>"
 
			"<h2>GNU GENERAL PUBLIC LICENSE</h2>"));
 

	
 
  gpl->setButtonText( 1, "Dismiss" );
 
  gpl->show();
 
}
 

	
 
void Main::aboutQt(){
 
  QMessageBox::aboutQt( this, "Virtual Leaf" );
 
}
 

	
 
void Main::toggleShowCellCenters()
 
{
 
  Plot();
 
}
 

	
 
void Main::toggleShowWalls()
 
{
 
  Plot();
 
}
 

	
 
void Main::toggleShowApoplasts()
 
{
 
  Plot();
 
}
 

	
 
void Main::toggleShowNodes()
 
{
 
  Plot();
 
}
 

	
 
void Main::toggleNodeNumbers(void)
 
{
 
  Plot();
 
}
 

	
 
void Main::toggleCellNumbers(void)
 
{
 
  Plot();
 
}
 

	
 
void Main::toggleCellAxes(void)
 
{
 
  Plot();
 
}
 

	
 
void Main::toggleCellStrain(void)
 
{
 
  Plot();
 
}
 

	
 
void Main::toggleShowFluxes(void)
 
{
 
  Plot();
 
}
 

	
 
void Main::toggleShowBorderCells()
 
{
 
  Plot();
 
}
 

	
 
void Main::toggleHideCells(void)
 
{
 
  Plot();
 
  editor->FullRedraw();
 
}
 

	
 
void Main::toggleMovieFrames(){}
 

	
 
void Main::toggleLeafBoundary(){}
 

	
 
void Main::toggleDynCells() {}
 

	
 
void Main::startSimulation(void)
 
{
 
  timer->start( 0 );
 
  statusBar()->message("Simulation started");
 
  running = true;
 
}
 

	
 
void Main::stopSimulation(void)
 
{
 
  timer->stop();
 
  cerr << "Stopping simulation" << endl;
 
  statusBar()->message("Simulation paused");
 
  running = false;
 
}
 

	
 
void Main::togglePaused()
 
{
 
  bool s = run->isItemChecked(paused_id);
 
  if (s) {
 
    cerr << "Calling start simulation" << endl;
 
    startSimulation();
 
  } else {
 
    cerr << "Calling stop simulation" << endl;
 
    stopSimulation();
 
  }
 
}
 

	
 
void Main::setFluxArrowSize(int size)
 
{
 
  flux_arrow_size = size/100.;
 
}
 

	
 

	
 
void Main::enlarge()
 
{
 
  canvas.setSceneRect( QRectF( 0,0, canvas.width()*4./3., canvas.height()*4./3.) );
 
}
 

	
 
void Main::shrink()
 
{
 
  canvas.setSceneRect( QRectF( 0,0, canvas.width()*3/4, canvas.height()*3/4) );
 
}
 

	
 

	
 
void Main::scale(double factor)
 
{
 
  QMatrix m = editor->matrix();
 
  m.scale(factor, factor);
 
  editor->setMatrix( m );
 
}
 

	
 
void Main::zoomIn()
 
{
 
  QMatrix m = editor->matrix();
 
  m.scale( 1.1, 1.1 );
 
  editor->setMatrix( m );
 
}
 

	
 
void Main::zoomOut()
 
{
 
  QMatrix m = editor->matrix();
 
  m.scale( 0.9, 0.9 );
 
  editor->setMatrix( m );
 
}
 

	
 

	
 
void Main::print()
 
{
 
  if ( !printer ) printer = new QPrinter;
 

	
 
  if ( printer->setup(this) ) {
 

	
 
    //    extern Mesh mesh;
 
    Vector bbll,bbur;
 
    mesh.BoundingBox(bbll,bbur);
 

	
 
#ifdef QDEBUG
 
    qDebug() << "bbll = " << bbll << endl;
 
    qDebug() << "bbur = " << bbur << endl;
 
#endif
 
    double cw = (bbur.x - bbll.x);
 
    double ch = (bbur.y - bbll.y);
 
    QPainter pp(printer);
 
    QRect vp=pp.viewport();
 
#ifdef QDEBUG
 
    qDebug() << "Paper width = " << vp.width() << " x " << vp.height() << endl;
 
#endif
 

	
 
    // Note that Cell is also translated...
 
    pp.translate(-bbur.x,-bbur.y);
 
    if (cw>ch) {
 
      pp.scale(vp.width()/(2*cw*Cell::Magnification()), vp.width()/(2*cw*Cell::Magnification()));
 
    } else {
 
      pp.scale(vp.height()/(2*ch*Cell::Magnification()), vp.height()/(2*ch*Cell::Magnification()));
 
    }
 
    canvas.render(&pp, QRectF(), QRectF(0.,0.,canvas.width(),canvas.height()));
 
  }
 
}
 

	
 

	
 
void Main::TimeStepWrap(void)
 
{
 
  static int t=0;
 
  stringstream fname;
 

	
 
  TimeStep();
 
  t++;
 

	
 
  if ((par.export_interval > 0) && ((t % par.export_interval) == 0)){
 
    this->exportCellData(QString(par.datadir) + QString('/') + QString(par.export_fn_prefix) + this->TimeStamp());
 
    fname << par.datadir << "/" << par.export_fn_prefix;
 
    fname.fill('0');
 
    fname.width(6);
 
    fname << t << ".csv";
 
    this->exportCellData(QString(fname.str().c_str()));
 
  }
 

	
 
  // check number of timesteps
 
  if (t==par.nit) {
 
    emit SimulationDone();
 
  }
 
}
 

	
 

	
 
QString Main::TimeStamp(){
 
  time_t rawtime;
 
  struct tm * timeinfo;
 
  char buffer [15];
 

	
 
  time ( &rawtime );
 
  timeinfo = localtime ( &rawtime );
 
  strftime (buffer,15,"%Y%m%d%H%M%S",timeinfo);
 
  return QString(buffer);
 
}
 

	
 

	
 
void Main::RestartSim(void)
 
{
 

	
 
  stopSimulation();
 
  if ( QMessageBox::question(
 
			     this,
 
			     tr("Restart simulation?"),
 
			     tr("Restart simulation.\n"
 
				"Are you sure?"),
 
			     QMessageBox::Yes | QMessageBox::No, QMessageBox::NoButton ) == QMessageBox::Yes ) {
 

	
 
    cerr << "Restarting simulation" << endl;
 
    //    extern Mesh mesh;
 
    mesh.Clear();
 
    Init();
 
    Plot();
 
    editor->FullRedraw();
 
  } 
 
  //startSimulation();
 
}
 

	
 

	
 
void Main::FitCanvasToWindow(void)
 
{
 

	
 
  double scale_factor_x = (double)editor->width()/(double)canvas.width();
 
  double scale_factor_y = (double)editor->height()/(double)canvas.height();
 
  double scale_factor = scale_factor_x > scale_factor_y ? scale_factor_x : scale_factor_y;
 
  QMatrix m = editor->matrix();
 

	
 
#ifdef QDEBUG  
 
  qDebug() << "editor->width() = " << editor->width() << endl;
 
  qDebug() << "editor->height() = " << editor->height() << endl;
 

	
 
  qDebug() << "scale_factor = " << scale_factor << endl;
 
  qDebug() << "scale_factor_x = " << scale_factor_x << endl;
 
  qDebug() << "scale_factor_y = " << scale_factor_y << endl;
 
#endif
 
  m.scale( scale_factor, scale_factor );
 
  editor->setMatrix( m );
 
  editor->show();
 
}
 

	
 
void Main::PauseIfRunning(void)
 
{
 
  if (running) {
 
    timer->stop();
 
  }
 
}
 

	
 
void Main::ContIfRunning(void)
 
{
 
  if (running) {
 
    timer->start( 0 );
 
  }
 
}
 

	
 
void Main::FitLeafToCanvas(void) 
 
{
 

	
 
  Vector ll,ur;
 
  mesh.BoundingBox(ll, ur);
 

	
 
  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 );
 

	
 

	
 
  // cerr << ur << ", " << ll << endl;
 
  // editor->fitInView(bb, Qt::KeepAspectRatio);
 
  editor->ensureVisible(bb);
 
  //editor->setTransform(viewport);
 
}
 

	
 
void Main::CleanMesh(void) 
 
{
 
  vector<double> clean_chem(Cell::NChem());
 
  vector<double> clean_transporters(Cell::NChem());
 

	
 
  for (int i=0;i<Cell::NChem();i++) {
 
    clean_chem[i]=par.initval[i];
 
    clean_transporters[i]=0.;		
 
  }
 

	
 
  mesh.CleanChemicals(clean_chem);
 
  mesh.CleanTransporters(clean_transporters);
 

	
 
  mesh.setTime(0);
 
  Plot();
 

	
 
  editor->FullRedraw();
 
}
 

	
 
void Main::CleanMeshChemicals(void) 
 
{
 

	
 
  vector<double> clean_chem(Cell::NChem());
 

	
 
  for (int i=0;i<Cell::NChem();i++) {
 
    clean_chem[i]=par.initval[i];
 
  }
 

	
 
  mesh.CleanChemicals(clean_chem);
 
  mesh.setTime(0);
 
  Plot();
 

	
 
  editor->FullRedraw();
 
}
 

	
 
void Main::CleanMeshTransporters(void) 
 
{
 
  vector<double> clean_transporters(Cell::NChem());
 
  for (int i=0;i<Cell::NChem();i++) {
 
    clean_transporters[i]=0.;
 
  }
 

	
 
  mesh.CleanTransporters(clean_transporters);
 

	
 
  mesh.setTime(0);
 
  Plot();
 

	
 
  editor->FullRedraw();
 
}
 

	
 
void Main::RandomizeMesh(void) 
 
{
 

	
 
  vector<double> max_chem(Cell::NChem());
 
  vector<double> max_transporters(Cell::NChem());
 

	
 
  for (int i=0;i<Cell::NChem();i++) {
 
    max_transporters[i]=0.;
 
    max_chem[i]=par.initval[i];
 
  }
 

	
 
  // Amount of PIN1 at walls
 
  max_transporters[1] = 0.01;
 

	
 
  mesh.RandomizeChemicals(max_chem, max_transporters);
 

	
 
  Plot();
 
}
 

	
 
void Main::XMLReadSettings(xmlNode *settings) 
 
{
 

	
 
  MainBase::XMLReadSettings(settings);
 
  
 
  view->setItemChecked(com_id, showcentersp);
 
  view->setItemChecked(mesh_id, showmeshp);
 
  view->setItemChecked(border_id, showbordercellp);
 
  view->setItemChecked(node_number_id, shownodenumbersp);
 
  view->setItemChecked(cell_number_id, showcellnumbersp);
 
  view->setItemChecked(cell_axes_id, showcellsaxesp);
 
  view->setItemChecked(cell_strain_id, showcellstrainp);
 
  view->setItemChecked(movie_frames_id, movieframesp);
 
  view->setItemChecked(only_boundary_id, showboundaryonlyp);
 
  view->setItemChecked(fluxes_id, showfluxesp);
 
  view->setItemChecked(hide_cells_id, hidecellsp);
 
  options->setItemChecked(dyn_cells_id, dynamicscellsp);
 
  view->setItemChecked( cell_walls_id, showwallsp);
 
 // view->setItemChecked( apoplasts_id, showapoplastsp);
 
  
 
  editor->setTransform(viewport);
 
}
 

	
 
xmlNode *Main::XMLSettingsTree(void) 
 
{
 

	
 
  showcentersp = view->isItemChecked(com_id);
 
  showmeshp = view->isItemChecked(mesh_id);
 
  showbordercellp =  view->isItemChecked(border_id);
 
  shownodenumbersp =  view->isItemChecked(node_number_id);
 
  showcellnumbersp =  view->isItemChecked(cell_number_id);
 
  showcellsaxesp = view->isItemChecked( cell_axes_id );
 
  showcellstrainp = view->isItemChecked( cell_strain_id );
 
  movieframesp = view->isItemChecked(movie_frames_id);;
 
  showboundaryonlyp =  view->isItemChecked(only_boundary_id);
 
  showfluxesp = view->isItemChecked(fluxes_id);
 
  dynamicscellsp = options->isItemChecked(dyn_cells_id);
 
  showwallsp = view->isItemChecked( cell_walls_id);
 
  //showapoplastsp = view->isItemChecked( apoplasts_id);
 
  hidecellsp = view->isItemChecked( hide_cells_id);
 

	
 
  xmlNode *settings = MainBase::XMLSettingsTree();
 
  QTransform viewport(editor->transform());
 
  xmlAddChild(settings, XMLViewportTree(viewport));
 
  return settings;
 
}
 

	
 
void Main::exportCellData(QString fileName) {
 
  
 
#ifdef QDEBUG  
 
  qDebug() << "exportCellData fileName: " << fileName << endl;
 
#endif
 

	
 
  QFile file(fileName);
 
  if ( file.open( IO_WriteOnly ) ) {
 
    QTextStream stream( &file );
 
    mesh.CSVExportCellData(stream);
 
    mesh.CSVExportMeshData(stream);
 
    file.close();
 
  }
 
}
 

	
 

	
 
void Main::exportCellData() {
 
  QString fileName;
 
  Q3FileDialog *fd = new Q3FileDialog( this, "file dialog", TRUE );
 

	
 
  stopSimulation();
 
  fd->setMode( Q3FileDialog::AnyFile );
 
  if ( fd->exec() == QDialog::Accepted ) {
 
    fileName = fd->selectedFile();
 
  }
 
  this->exportCellData(fileName);
 
}
 

	
 

	
 
/* finis */
src/canvas.h
Show inline comments
 
/*
 
 *
 
 *  $Id$
 
 *
 
 *  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 <http://www.gnu.org/licenses/>.
 
 *
 
 *  Copyright 2010 Roeland Merks.
 
 *
 
 */
 

	
 
#ifndef _CANVAS_H_
 
#define _CANVAS_H_
 

	
 
#include <q3popupmenu.h>
 
#include <q3mainwindow.h>
 
#include <q3intdict.h>
 
#include <QGraphicsScene>
 
#include <QGraphicsView>
 
#include <QList>
 

	
 
#include <string>
 
#include <sstream>
 

	
 
//Added by qt3to4:
 
#include <QMouseEvent>
 
#include <vector>
 
#include "simitembase.h"
 
#include "mainbase.h"
 
#include "cellitem.h"
 
#include "infobar.h"
 

	
 
#include "nodeitem.h"
 
#include "cell.h"
 

	
 
#ifdef HAVE_QWT
 
#include "data_plot.h"
 
#endif
 

	
 
#include <libxml/xpath.h>
 
#include <libxml/xmlreader.h>
 

	
 
#if defined(Q_OS_MAC)
 
#define PREFIX "cmd"
 
#else
 
#define PREFIX "crtl"
 
#endif
 

	
 

	
 
class QFile;
 
class QDir;
 
class ModelCatalogue;
 
class InfoBar;
 

	
 
class FigureEditor : public QGraphicsView {
 
  Q_OBJECT
 

	
 
    friend class Main;
 
 public:
 
  FigureEditor(QGraphicsScene&, Mesh&, QWidget* parent=0, const char* name=0, Qt::WFlags f=0);
 
  void clear();
 
  void Save(const char *fname, const char *format, int sizex=640, int sizey=480);
 
  void FullRedraw(void);
 

	
 
 protected:
 
  void mousePressEvent(QMouseEvent*);
 
  void mouseMoveEvent(QMouseEvent*);
 
  void mouseReleaseEvent(QMouseEvent*);
 
  void wheelEvent(QWheelEvent *event);
 
  void scaleView(qreal scaleFactor);
 

	
 
  vector <CellItem *> getIntersectedCells(void);
 
  void insertNode(QPointF p);
 
  NodeItem *selectedNodeItem(QList<QGraphicsItem *> l) const;  
 

	
 
 signals:
 
  void status(const QString&);
 
  void MousePressed(void);
 
  void MouseReleased(void);
 
 protected:
 
  Mesh &mesh;
 

	
 
 private:
 
  //NodeItem* moving;
 
  SimItemBase *moving;
 
  QPointF moving_start;
 

	
 
  QGraphicsLineItem *intersection_line;
 
  bool rotation_mode;
 
  bool insert_mode;
 
  double rot_angle;
 
};
 

	
 
class Main : public Q3MainWindow, public MainBase {
 
  Q_OBJECT
 
    friend class ModelCatalogue; // needs to populate menu item models
 
 public:
 
  Main(QGraphicsScene&, Mesh&, QWidget* parent=0, const char* name=0, Qt::WFlags f=0);
 
  ~Main();
 
  virtual bool ShowCentersP(void) {return view->isItemChecked(com_id);}
 
  virtual bool ShowMeshP(void) {return view->isItemChecked(mesh_id);}
 
  virtual bool ShowBorderCellsP(void) {return view->isItemChecked(border_id);}
 
  virtual bool PausedP(void) {return run->isItemChecked(paused_id);}
 
  virtual bool ShowNodeNumbersP(void) {return view->isItemChecked(node_number_id);}
 
  virtual bool ShowCellNumbersP(void) {return view->isItemChecked(cell_number_id);}
 
  virtual bool ShowCellAxesP(void) {return view->isItemChecked(cell_axes_id);}
 
  virtual bool ShowCellStrainP(void) {return view->isItemChecked(cell_strain_id);}
 
  virtual bool MovieFramesP(void) {return view->isItemChecked(movie_frames_id);}
 
  virtual bool ShowBoundaryOnlyP(void) {return view->isItemChecked(only_boundary_id);}
 
  virtual bool ShowWallsP(void) {return view->isItemChecked(cell_walls_id);}
 
 // virtual bool ShowApoplastsP(void) { return view->isItemChecked(apoplasts_id);}
 
  virtual bool ShowFluxesP(void) { return view->isItemChecked(fluxes_id); }
 
  virtual bool DynamicCellsP(void) { return options->isItemChecked(dyn_cells_id); }
 
  virtual bool RotationModeP(void) { return options->isItemChecked(rotation_mode_id); }
 
  virtual bool InsertModeP(void) { return options->isItemChecked(insert_mode_id); }
 
  virtual bool ShowToolTipsP(void) { return helpmenu->isItemChecked(tooltips_id); }
 
  virtual bool HideCellsP(void) { return view->isItemChecked(hide_cells_id); }
 
  void scale(double factor); 
 
  virtual double getFluxArrowsize(void)
 
  {
 
    return flux_arrow_size;
 
  }
 

	
 
  void FitCanvasToWindow();
 
  void FitLeafToCanvas(void);
 

	
 

	
 
  public slots:
 

	
 
  void about();
 
  void gpl();
 
  void TimeStepWrap();
 
  void togglePaused();
 
  void setFluxArrowSize(int size);
 
  void RestartSim(void);
 
  void toggleShowCellCenters(void);
 
  void toggleShowNodes(void);
 
  void toggleShowBorderCells(void);
 
  void toggleShowFluxes(void);
 
  void toggleNodeNumbers(void);
 
  void toggleCellNumbers(void);
 
  void toggleCellAxes(void);
 
  void toggleCellStrain(void);
 
  void toggleShowWalls(void);
 
  void toggleShowApoplasts(void);
 
  void toggleDynCells(void);
 
  void toggleMovieFrames(void);
 
  void toggleLeafBoundary(void);
 
  void toggleHideCells(void);
 
  void print();
 
  void startSimulation(void);
 
  void stopSimulation(void);
 
  void RefreshInfoBar(void);
 

	
 
  void EnterRotationMode(void)
 
  {
 

	
 
    UserMessage("Rotation mode. Click mouse to exit.");
 
    if (editor) {
 
      editor->rot_angle = 0. ; 
 

	
 
      // Exit rotation mode if mouse is clicked
 
      connect(editor, SIGNAL(MousePressed()), this, SLOT(ExitRotationMode()));
 
      
 
      editor->setMouseTracking(true);
 

	
 
    }
 

	
 
  }
 
  void ExitRotationMode(void)
 
  { 
 
    UserMessage("Exited rotation mode.",2000);
 

	
 
    options->setItemChecked(rotation_mode_id, false); 
 
    if (editor)
 
      disconnect(editor, SIGNAL(MousePressed()), this, SLOT(ExitRotationMode()));
 
    editor->setMouseTracking(false);
 
 
 
  }
 

	
 
  virtual void UserMessage(QString message, int timeout=0);
 
  void Refresh(void) { Plot(); }
 
  void PauseIfRunning(void);
 
  void ContIfRunning(void);
 
  virtual void XMLReadSettings(xmlNode *settings);
 

	
 
  private slots:
 
  void aboutQt();
 
  void newView();
 
  void EditParameters();
 
  void readStateXML();
 
  int readStateXML(const char *filename, bool geometry = true, bool pars=true, bool simtime = true);
 
  void readNextStateXML();
 
  void readPrevStateXML();
 
  void readFirstStateXML();
 
  void readLastStateXML();
 
  void exportCellData();
 
  void exportCellData(QString);
 
  void saveStateXML();
 
  void snapshot();
 
  void savePars();
 
  void readPars();
 
  void clear();
 
  void init();
 
  virtual void CutSAM() { MainBase::CutSAM(); Refresh();}
 

	
 
  void enlarge();
 
  void shrink();
 
  void zoomIn();
 
  void zoomOut();
 

	
 
  void CleanMesh();
 
  void CleanMeshChemicals(void);
 
  void CleanMeshTransporters(void);
 

	
 
  void RandomizeMesh();
 

	
 
  QString TimeStamp();
 

	
 
 signals:
 
  void SimulationDone(void);
 
  void ParsChanged(void);
 

	
 
 protected:
 
  Mesh &mesh;
 

	
 
 private:
 
  NodeSet *node_set;
 
  FigureEditor *editor;
 
  Q3PopupMenu* options;
 
  Q3PopupMenu *view;
 
  Q3PopupMenu *run;
 
  QMenu *modelmenu;
 
  Q3PopupMenu *helpmenu;
 

	
 
  QPrinter* printer;
 
  const QDir *working_dir;
 
  QString currentFile;
 
  //  toggle item states 
 
  int dbf_id; // options->Double Buffer
 
  int com_id; // view->Show centers
 
  int mesh_id; // view->Show mesh
 
  int node_number_id; // view->Show Node numbers
 
  int cell_number_id; // view->Show Cell numbers
 
  int border_id; // view->Show border cells
 
  int paused_id; // run->Simulation paused
 
  int cell_axes_id; // view->Show cell axes
 
  int cell_strain_id; // view->Show cell strain
 
  int only_boundary_id; // view ->Show only leaf boundary
 
  int cell_walls_id; // view -> Show transporters
 
  //int apoplasts_id; // view -> Show apoplasts
 
  int tooltips_id; // help -> Show Cell Info
 
  int hide_cells_id; // view->Hide Cells
 
  double flux_arrow_size;
 
  int movie_frames_id;
 
  int fluxes_id;
 
  int dyn_cells_id;
 
  int rotation_mode_id;
 
  int insert_mode_id;
 
  QTimer *timer;
 
  QFile *gifanim;
 
  bool running;
 
  virtual xmlNode *XMLSettingsTree(void);
 
  static const QString caption;
 
  static const QString caption_with_file;
 
  InfoBar *infobar;
 
};
 

	
 
#endif
 

	
 
/* finis*/

Changeset was too big and was cut off... Show full diff anyway

0 comments (0 inline, 0 general)