From e36e038446fa25a197b223d5751805bf84234f07 Mon Sep 17 00:00:00 2001 From: Rojas Date: Tue, 13 May 2025 14:41:36 +0200 Subject: [PATCH 1/8] syncho commentaires local --- src/GUI/mesh.cpp | 258 +++- src/Library/cellbase.h | 3 + src/Models/Cambium/Makefile | 2656 +++++++++++++++++----------------- src/Models/Cambium/cambium.h | 2 +- 4 files changed, 1540 insertions(+), 1379 deletions(-) diff --git a/src/GUI/mesh.cpp b/src/GUI/mesh.cpp index feb81a16..6c1d7d25 100755 --- a/src/GUI/mesh.cpp +++ b/src/GUI/mesh.cpp @@ -53,81 +53,96 @@ static const std::string _module_id("$Id$"); extern Parameter par; +/*Inserts a node into a cell at a specific position and updates ownership relationships. +c - Pointer to the cell where the node will be inserted +n - Pointer to the node to insert +nb1 - Pointer to the first neighbor node +nb2 - Pointer to the second neighbor node +ins_pos - Iterator indicating the insertion position in the cell's node list +This method provides precise control over the node's position in the cell's topology.*/ void Mesh::AddNodeToCellAtIndex(Cell *c, Node *n, Node *nb1, Node *nb2, list::iterator ins_pos) { - c->nodes.insert(ins_pos, n); + c->nodes.insert(ins_pos, n); n->owners.push_back( Neighbor(c, nb1, nb2 ) ); } - +/* Same but insert the node at the end*/ void Mesh::AddNodeToCell(Cell *c, Node *n, Node *nb1, Node *nb2) { - c->nodes.push_back( n ); n->owners.push_back( Neighbor(c, nb1, nb2 ) ); } +/*Adds random perturbation to the specified chemical concentration in all cells. +chemnum - Index of the chemical to perturb +range - Magnitude of the perturbation +This method iterates through all cells in the mesh and adds a random value +to the concentration of the specified chemical. The random value is centered +around zero (by using RANDOM()-0.5) and scaled by the range parameter. +If the resulting concentration would be negative, it is set to zero instead.*/ void Mesh::PerturbChem(int chemnum, double range) { - for (vector::iterator i=cells.begin(); i!=cells.end(); i++) { (*i)->chem[chemnum] += range*(RANDOM()-0.5); if ((*i)->chem[chemnum]<0.) (*i)->chem[chemnum]=0.; } } -void Mesh::CellFiles(const Vector ll, const Vector ur) { - Cell *cell = RectangularCell(ll,ur,0.001); + /* Creates a structured grid of cells by dividing a rectangular cell multiple times. + ll - Vector representing the lower left corner of the initial rectangle + ur - Vector representing the upper right corner of the initial rectangle + This method creates an initial rectangular cell and initializes its chemical concentrations + based on parameters. It then repeatedly divides all cells in a structured manner by + alternating between horizontal and vertical division axes. The method performs 7 rounds + of division in total - 6 rounds with axis rotation followed by a final round. + After cell division, it calculates the average side length of the cells and sets the + target length for nodes to a fraction of this average (creating tension in the structure). + Finally, it establishes the base area for the mesh using the current cell configuration.*/ +void Mesh::CellFiles(const Vector ll, const Vector ur) { + Cell *cell = RectangularCell(ll,ur,0.001); for (int c=0;cSetChemical(c,par.initval[c]); } cell->SetTargetArea(cell->CalcArea()); - Vector axis(1,0,0); // divide rectangle a number of times for (int i=0;i<6;i++) { IncreaseCellCapacityIfNecessary(); - vector current_cells = cells; for (vector::iterator j=current_cells.begin(); j!=current_cells.end();j++) { (*j)->DivideOverAxis(axis); } axis=axis.Perp2D(); - } IncreaseCellCapacityIfNecessary(); - axis=axis.Perp2D(); - vector current_cells = cells; for (vector::iterator j=current_cells.begin(); j!=current_cells.end();j++) { (*j)->DivideOverAxis(axis); } - double sum_l=0; int n_l=0; for (list::const_iterator i=cell->nodes.begin(); i!=cell->nodes.end(); i++) { - list::const_iterator nb=i; nb++; - if (nb==cell->nodes.end()) + list::const_iterator nb=i; nb++; + if (nb==cell->nodes.end()) nb=cell->nodes.begin(); double l = (**nb-**i).Norm(); - sum_l += l; n_l++; } - Node::target_length = sum_l/(double)n_l; // a bit more tension Node::target_length/=4.; - SetBaseArea(); } + + Cell *Mesh::RectangularCell(const Vector ll, const Vector ur, double rotation) { Cell *cell=AddCell(new Cell()); @@ -148,33 +163,33 @@ Cell *Mesh::RectangularCell(const Vector ll, const Vector ur, double rotation) { //n1.fixed=n2.fixed=n3.fixed=n4.fixed=true; - AddNodeToCell(cell, n4, + AddNodeToCell(cell, n4, n1, n3); - AddNodeToCell(cell, n3, + AddNodeToCell(cell, n3, n4, n2); - AddNodeToCell(cell, n2, + AddNodeToCell(cell, n2, n3, n1); - AddNodeToCell(cell, n1, + AddNodeToCell(cell, n1, n2, n4); - AddNodeToCell(boundary_polygon, n4, + AddNodeToCell(boundary_polygon, n4, n1, n3); - AddNodeToCell(boundary_polygon, n3, + AddNodeToCell(boundary_polygon, n3, n4, n2); - AddNodeToCell(boundary_polygon, n2, + AddNodeToCell(boundary_polygon, n2, n3, n1); - AddNodeToCell(boundary_polygon, n1, + AddNodeToCell(boundary_polygon, n1, n2, n4); @@ -190,7 +205,7 @@ Cell *Mesh::RectangularCell(const Vector ll, const Vector ur, double rotation) { // a bit more tension Node::target_length/=2; - cell->SetIntegrals(); + cell->SetIntegrals(); cell->ConstructNeighborList(); return cell; @@ -216,7 +231,7 @@ Cell &Mesh::EllipticCell(double xc, double yc, double ra, double rb, int nnodes Node *n=AddNode(new Node(x,y,0)); n->boundary = true; - } + } for (int i=0;iSetIntegrals(); + c->SetIntegrals(); c->at_boundary=true; return *c; @@ -287,7 +302,7 @@ Cell &Mesh::LeafPrimordium(int nnodes, double pet_length) { // a bit more tension Node::target_length/=2; - circle->SetIntegrals(); + circle->SetIntegrals(); //return c; @@ -297,7 +312,7 @@ Cell &Mesh::LeafPrimordium(int nnodes, double pet_length) { // get position of the (n/4)'th and (3*(n/4))'th node. list::reverse_iterator it_n1=circle->nodes.rbegin(); - for (int i=0; iboundary=true; n4->boundary=true; - AddNodeToCell(petiole, *it_n1, + AddNodeToCell(petiole, *it_n1, n4, - nodes[(*it_n2)->Index() + nodes[(*it_n2)->Index() + (( (*it_n1)->Index() - (*it_n2)->Index() )-1+nnodes)%nnodes]); @@ -336,7 +351,7 @@ Cell &Mesh::LeafPrimordium(int nnodes, double pet_length) { AddNodeToCell(petiole, n4, n3, n1); -#ifdef QDEBUG +#ifdef QDEBUG qDebug() << circle << endl; qDebug() << petiole << endl; #endif @@ -368,7 +383,7 @@ Cell &Mesh::LeafPrimordium(int nnodes, double pet_length) { petiole->Fix(); petiole->area=petiole->CalcArea(); - petiole->target_area=petiole->area; + petiole->target_area=petiole->area; petiole->ConstructNeighborList(); circle->ConstructNeighborList(); boundary_polygon->ConstructConnections(); @@ -395,9 +410,9 @@ void Mesh::BoundingBox(Vector &LowerLeft, Vector &UpperRight) { LowerLeft.y = (*c)->y; if ((*c)->z < LowerLeft.z) LowerLeft.z = (*c)->z; - if ((*c)->x > UpperRight.x) + if ((*c)->x > UpperRight.x) UpperRight.x = (*c)->x; - if ((*c)->y > UpperRight.y) + if ((*c)->y > UpperRight.y) UpperRight.y = (*c)->y; if ((*c)->z > UpperRight.z) UpperRight.z = (*c)->z; @@ -417,7 +432,7 @@ double Mesh::Area(void) { void Mesh::SetBaseArea(void) { - // Set base area to mean area. + // Set base area to mean area. // This method is typically called during initiation, after // defining the first cell Cell::BaseArea() = Area()/cells.size(); @@ -441,8 +456,9 @@ class DeltaIntgrl { } }; -void Mesh::Clear(void) { + +void Mesh::Clear(void) { // clear nodes for (vector::iterator i=nodes.begin(); i!=nodes.end(); i++) { delete *i; @@ -450,8 +466,8 @@ void Mesh::Clear(void) { nodes.clear(); Node::nnodes=0; - node_insertion_queue.clear(); + // Clear NodeSets for (vector::iterator i=node_sets.begin(); i!=node_sets.end(); i++) { delete *i; @@ -461,7 +477,6 @@ void Mesh::Clear(void) { time = 0; // clear cells - for (vector::iterator i=cells.begin(); i!=cells.end(); i++) { delete *i; } @@ -485,7 +500,7 @@ void Mesh::Clear(void) { shuffled_cells.clear(); shuffled_nodes.clear(); - + #ifdef QDEBUG qDebug() << "cells.size() = " << cells.size() << endl; qDebug() << "walls.size() = " << walls.size() << endl; @@ -493,6 +508,23 @@ void Mesh::Clear(void) { #endif } + + +/* Calculates cell-specific wall stiffness for one side of a node connection. +Parameters: +nb - Pointer to a neighbor node +nodeown - Set of indices of cells that own the current node + +This function determines the stiffness contribution from cells that are common +to both the current node and its neighbor. It first creates a set of cell indices +that own the neighbor node, then finds the intersection between this set and the +nodeown set. For each cell in the intersection, it adds its wall stiffness value +to the total (either from the cell's specific stiffness value or from the global +parameter if the cell index is invalid). +The function breaks early if an invalid (NaN) stiffness value is encountered. + +Returns: +The calculated total stiffness value for the shared cells.*/ double Mesh::CellSpecificStiffnessOneSide(Node *nb,set &nodeown) { // determines the list of cells belonging to the node and its neighbors set nb1own; @@ -514,6 +546,9 @@ double Mesh::CellSpecificStiffnessOneSide(Node *nb,set &nodeown) { } return cell_w; } + + + void Mesh::updateAreasOfCells(list * delta_intgrl_list,Node * node) { // update areas of cells @@ -533,6 +568,20 @@ void Mesh::updateAreasOfCells(list * delta_intgrl_list,Node * node) } } +/* Finds a cell that is common to the specified nodes, different from the given cell. + +Parameters: +c - Pointer to a cell to exclude from the search +node1 - Pointer to the first node +node2 - Pointer to the second node + +This function iterates through the owners of both nodes to find a cell +that is connected to both node1 and node2, but is not the cell c. +It first iterates through node1's owners, then for each owner that is +not c, it checks if it's also an owner of node2. + +Returns: +A pointer to the common cell found, or NULL if no common cell is found. */ CellBase * Mesh::getOtherCell(CellBase* c,Node* node1,Node * node2) { for (list::iterator nb1=node1->owners.begin(); nb1!=node1->owners.end(); nb1++) { if (nb1->getCell() != c) { @@ -559,9 +608,9 @@ double b_cocient(const Vector& AC, const Vector& AB,const Vector& ACperp, const return b; } -//http://dx.doi.org/10.1016/j.cis.2014.01.018 -// radius of circle with center on line B-C and connecting at norm of the lines (A-B ode A-C) -// and sharing one point with the other line. This we define the kissing circle +/*http://dx.doi.org/10.1016/j.cis.2014.01.018 +radius of circle with center on line B-C and connecting at norm of the lines (A-B ode A-C) +and sharing one point with the other line. This we define the kissing circle*/ double osculating_circle_radius(const Vector& B, const Vector& A, const Vector& C) { Vector AC = (C-A).Normalised(); Vector AB = (B-A).Normalised(); @@ -583,6 +632,27 @@ double osculating_circle_radius(const Vector& B, const Vector& A, const Vector& } + +/* Searches for a sequence of four consecutive nodes in a cell where two specific nodes +are in the middle positions. + +Parameters: +c - Pointer to the cell to search in +z1, z2 - Pointers to the two specific nodes to find in middle positions +w0, w1, w2, w3 - Pointers to node pointers that will be updated with the found sequence + +This function looks for a sequence of four consecutive nodes in the cell's node list +where w1 and w2 are equal to z1 and z2 (in any order). It uses a sliding window approach, +first checking the regular sequence of nodes, then checking wrap-around cases by considering +nodes from the beginning of the list. This accounts for the circular nature of cell boundaries. + +If a matching sequence is found, the function updates w0, w1, w2, and w3 to point to the +four consecutive nodes and returns true. If no match is found, it sets all pointers to NULL +and returns false. + +Returns: +true if a sequence containing z1 and z2 in middle positions was found +false otherwise */ bool Mesh::findOtherSide(CellBase * c,Node * z1,Node * z2,Node ** w0,Node ** w1,Node ** w2,Node ** w3) { list ::iterator i=c->nodes.begin(); * w0=*i; @@ -625,8 +695,25 @@ bool Mesh::findOtherSide(CellBase * c,Node * z1,Node * z2,Node ** w0,Node ** w1, *w3=NULL; return false; } -double lambda_for_shift=0.1; + +double lambda_for_shift=0.1; // Définie en global mais n'est utilisée nulle part, Rouges 2025 + +/* Retrieves the base length of a wall element between two nodes in a cell. + +Parameters: +c - Pointer to the cell containing the wall element +n1 - Pointer to the first node +n2 - Pointer to the second node +elastic_limit - Factor used to calculate a default length when needed + +This function first tries to get the wall element associated with node n1 in cell c. +If no wall element exists or if its base length is invalid (NaN), it calculates +a default length by dividing the distance between the two nodes by the elastic_limit. +Otherwise, it returns the actual base length stored in the wall element. + +Returns: +The base length of the wall element, or a calculated default value if unavailable */ double getBaseLength(CellBase* c,NodeBase* n1, NodeBase * n2,double elastic_limit) { WallElement* wallElement = n1->getWallElement(c); if (wallElement == NULL) { @@ -640,6 +727,20 @@ double getBaseLength(CellBase* c,NodeBase* n1, NodeBase * n2,double elastic_limi } } + +/* Retrieves the stiffness of a wall element associated with a node in a cell. + +Parameters: +c - Pointer to the cell containing the wall element +n1 - Pointer to the node whose wall element stiffness is needed + +This function first tries to get the wall element associated with node n1 in cell c. +If no wall element exists or if its stiffness value is invalid (NaN), it returns +the default wall stiffness from the cell. Otherwise, it returns the actual stiffness +value stored in the wall element. + +Returns: +The stiffness of the wall element, or the cell's default wall stiffness if unavailable */ double getStiffness(CellBase* c,NodeBase* n1) { WallElement* wallElement = n1->getWallElement(c); if (wallElement == NULL) { @@ -653,12 +754,41 @@ double getStiffness(CellBase* c,NodeBase* n1) { } } + +/* RemodelWallElement - Evaluates and potentially executes wall remodeling between connected cells + +Parameters: +- curves: Vector of CellWallCurve objects to store modified wall information +- c: Pointer to the current cell being processed +- w0, w1, w2, w3, w4: Five consecutive nodes in the current cell + +This function evaluates whether inserting a new connection between nodes w1 and w3 +(replacing the w1-w2 connection) would be energetically favorable. The process: + +1. First identifies the neighboring cell (c2) that shares nodes w1 and w2 +2. If a valid neighbor cell is found, locates the corresponding sequence of nodes + in that cell using findOtherSide (nodes o0-o1-o2-o3) +3. Calculates the energy of the current configuration using osculating circle radius +4. Calculates the predicted energy if the remodeling were performed +5. If the new configuration has lower energy, performs the remodeling by: + - Updating node connections in both cells + - Updating the geometric properties of affected walls + - Recalculating cell areas and neighbor relationships + +The function implements a key biological process where cell walls dynamically +reorganize to minimize mechanical stress and optimize tissue geometry. + +Returns: void (modifies the mesh structure directly) + +Implemented by Großeholz and al. +*/ void Mesh::RemodelWallElement(vector & curves,CellBase* c,Node* w0,Node* w1,Node* w2,Node* w3,Node* w4) { Node * o0; Node * o1; Node * o2; Node * o3; + double angle = (*w1-*w2).SignedAngle((*w3-*w2)); if ((angle>0&&c->BoundaryPolP())||(angle<0&&!c->BoundaryPolP())) { //we would bend inward and intersect cells @@ -666,15 +796,14 @@ void Mesh::RemodelWallElement(vector & curves,CellBase* c,Node* w } CellBase* c2 = getOtherCell(c,w1,w2); - if (c2 != NULL && !(c2->GetCellVeto()) && findOtherSide(c2,w2,w1,&o0,&o1,&o2,&o3)){ - + if (c2 != NULL && !(c2->GetCellVeto()) && findOtherSide(c2,w2,w1,&o0,&o1,&o2,&o3)){ // //now check how profitable the move of wall element w1-w2 to w1-w3 //this changes also cell c2 where wall element o1->o2 will be replaced //by wall elements o1->w3 and w3->o2 all other surrounding cells will remain //unchanged. double bending_dh = 0.; - if (abs(par.bend_lambda) > 0.01) { + if (abs(par.bend_lambda) > 0.01) { // c'est quoi le critère qui définit la valeur de bend_lambda? , Rouges 2025 // angles that are before w0-w1-w2/w1-w2-w3/w2-w3-w4 and o0-o1-o2/o1-o2-o3 // angles after move w0-w1-w3/w1-w3-w4 and o0-o1-w3/o1-w3-o2/w3-o2-o3 double r1 = osculating_circle_radius(*w0,*w1,*w2); @@ -682,24 +811,29 @@ void Mesh::RemodelWallElement(vector & curves,CellBase* c,Node* w double r3 = osculating_circle_radius(*w2,*w3,*w4); double r4 = osculating_circle_radius(*w0,*w1,*w3); double r5 = osculating_circle_radius(*w1,*w3,*w4); + double energy_before = 1./(r1)+ 1./(r2)+ 1./(r3)+ 1./((osculating_circle_radius(*o0,*o1,*o2)))+ 1./((osculating_circle_radius(*o1,*o2,*o3))); + double energy_after = 1./(r4)+ 1./((osculating_circle_radius(*o1,*w3,*o2)))+ 1./(r5)+ 1./((osculating_circle_radius(*o0,*o1,*w3)))+ 1./((osculating_circle_radius(*w3,*o2,*o3))); - bending_dh = par.bend_lambda*(energy_after-energy_before*1.5+12.); + + bending_dh = par.bend_lambda*(energy_after-energy_before*1.5+12.); // comment sont définis ces coefficients (*1.5 et +12)?, Rouges 2025 } + // the length contraint just needs to be calculated for the wall elements that change length double wl1=((*w1)-(*w2)).Norm(); double wl2=((*w3)-(*w2)).Norm(); double wl3=((*w1)-(*w3)).Norm(); + double s_bef = wl1; double s_aft = wl3+wl2; @@ -708,7 +842,7 @@ void Mesh::RemodelWallElement(vector & curves,CellBase* c,Node* w double length_before = wl1+wl2+wl1; - double stiffness = ( + double stiffness = ( // Pourquoi j'ai pas getStiffness(c2,01)*wl2 ?, Rouges 2025 getStiffness(c, w1)*wl1+ getStiffness(c, w2)*wl2+ getStiffness(c2, o2)*wl1 @@ -750,6 +884,21 @@ void Mesh::RemodelWallElement(vector & curves,CellBase* c,Node* w } } + +/* Extracts base length and stiffness data from a wall element and adds them to provided variables. +Parameters: +we: Pointer to the wall element from which to extract data +base_length: Reference to variable where the base length will be accumulated +stiffness: Reference to variable where the stiffness will be accumulated +If the wall element is valid (not NULL): +Accumulates its base length to the base_length parameter +For stiffness, checks if the wall element has a valid stiffness value: +If valid: adds the actual stiffness value +If invalid (NaN): adds the default stiffness from the wall element's cell +If the wall element is NULL: +Sets both base_length and stiffness to NaN to indicate invalid data +This function is typically used in calculations involving wall properties where +data needs to be aggregated across multiple wall elements while handling edge cases. */ void extractData(WallElement *we,double & base_length,double &stiffness) { if (we != NULL) { base_length += we->getBaseLength(); @@ -764,6 +913,8 @@ void extractData(WallElement *we,double & base_length,double &stiffness) { } } + + void Mesh::RemodelCellWallElements(vector & curves,CellBase *c) { //The algorithm needs at least 5 nodes along the wall if (c->nodes.size()<5) { @@ -809,6 +960,11 @@ void Mesh::RemodelCellWallElements(vector & curves,CellBase *c) { RemodelWallElement(curves,c,w0,w1,w2,w3,w4) ; } + +/*This function iterates over all cells in the mesh and resets their wall curves. +For each cell that is not vetoed (i.e., not excluded from processing), it calls RemodelCellWallElements to attempt remodeling of its wall elements. +After processing all regular cells, it also applies the remodeling to the boundary polygon to ensure the mesh boundary is updated. +The function always returns 0.0, indicating its main purpose is to perform side effects on the mesh structure.*/ double Mesh::RemodelWallElements(vector & curves) { for (vector::iterator ii=cells.begin(); ii!=cells.end(); ii++) { Cell *c = *ii; @@ -821,6 +977,8 @@ double Mesh::RemodelWallElements(vector & curves) { return 0.0; } + + double Mesh::DisplaceNodes(void) { MyUrand r(shuffled_nodes.size()); diff --git a/src/Library/cellbase.h b/src/Library/cellbase.h index e3d954bd..9256a6b7 100755 --- a/src/Library/cellbase.h +++ b/src/Library/cellbase.h @@ -383,6 +383,9 @@ class CellBase : public QObject, public Vector } return n; } + + + const list& getNodes() const { return nodes; } // Ajout Rouges 2025 // RamiNote: To access neighbor indices, add this method to cellbase.h in the public section: std::vector GetNeighborIndices() const { std::vector indices; diff --git a/src/Models/Cambium/Makefile b/src/Models/Cambium/Makefile index b7a3fbd6..b1d82a03 100644 --- a/src/Models/Cambium/Makefile +++ b/src/Models/Cambium/Makefile @@ -3,7 +3,7 @@ # Generated by qmake (3.1) (Qt 5.15.2) # Project: cambium.pro # Template: lib -# Command: /home/ardati/anaconda3/bin/qmake -o Makefile cambium.pro +# Command: /home/rojas/miniconda3/envs/VirtualLeaf-env/bin/qmake -o Makefile cambium.pro ############################################################################# MAKEFILE = Makefile @@ -17,8 +17,8 @@ CXX = g++ DEFINES = -DQTGRAPHICS -DQT_PLUGIN -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_XML_LIB -DQT_CORE_LIB CFLAGS = -pipe -g -Wall -Wextra -D_REENTRANT -fPIC $(DEFINES) CXXFLAGS = -pipe -Wno-write-strings -Wno-unused-parameter -fPIC -I/usr/include/libxml2 -g -g3 -DQDEBUG -Wall -Wextra -D_REENTRANT -fPIC $(DEFINES) -INCPATH = -I. -I../../Library -I../../GUI -I../../../include -I/home/ardati/anaconda3/include/qt -I/home/ardati/anaconda3/include/qt/QtWidgets -I/home/ardati/anaconda3/include/qt/QtGui -I/home/ardati/anaconda3/include/qt/QtXml -I/home/ardati/anaconda3/include/qt/QtCore -I. -I/home/ardati/anaconda3/include -I/croot/qt-main_1738942799946/_build_env/bin/../x86_64-conda-linux-gnu/sysroot/usr/include -I/croot/qt-main_1738942799946/_build_env/bin/../x86_64-conda-linux-gnu/sysroot/usr/include/libdrm -I/croot/qt-main_1738942799946/_build_env/bin/../x86_64-conda-linux-gnu/sysroot/usr/include -I/home/ardati/anaconda3/mkspecs/linux-g++ -QMAKE = /home/ardati/anaconda3/bin/qmake +INCPATH = -I. -I../../Library -I../../GUI -I../../../include -I/home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt -I/home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtWidgets -I/home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui -I/home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml -I/home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore -I. -I/home/rojas/miniconda3/envs/VirtualLeaf-env/include -I/usr/include/libdrm -I/home/conda/feedstock_root/build_artifacts/qt-main_1644345367599/_build_env/bin/../x86_64-conda-linux-gnu/sysroot/usr/include -I/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/linux-g++ +QMAKE = /home/rojas/miniconda3/envs/VirtualLeaf-env/bin/qmake DEL_FILE = rm -f CHK_DIR_EXISTS= test -d MKDIR = mkdir -p @@ -28,8 +28,8 @@ COPY_DIR = cp -f -R INSTALL_FILE = install -m 644 -p INSTALL_PROGRAM = install -m 755 -p INSTALL_DIR = cp -f -R -QINSTALL = /home/ardati/anaconda3/bin/qmake -install qinstall -QINSTALL_PROGRAM = /home/ardati/anaconda3/bin/qmake -install qinstall -exe +QINSTALL = /home/rojas/miniconda3/envs/VirtualLeaf-env/bin/qmake -install qinstall +QINSTALL_PROGRAM = /home/rojas/miniconda3/envs/VirtualLeaf-env/bin/qmake -install qinstall -exe DEL_FILE = rm -f SYMLINK = ln -f -s DEL_DIR = rmdir @@ -37,10 +37,10 @@ MOVE = mv -f TAR = tar -cf COMPRESS = gzip -9f DISTNAME = cambium1.0.0 -DISTDIR = /home/ardati/PycharmProjects/VirtualLeaf2021/src/Models/Cambium/.tmp/cambium1.0.0 +DISTDIR = /mnt/c/Users/Rojas/PycharmProjects/VirtualLeaf2021/src/models/cambium/.tmp/cambium1.0.0 LINK = g++ -LFLAGS = -fPIC -Wl,-rpath,/home/ardati/anaconda3/lib -shared -LIBS = $(SUBLIBS) -L../../../lib -lvleaf /home/ardati/anaconda3/lib/libQt5Widgets.so /home/ardati/anaconda3/lib/libQt5Gui.so /home/ardati/anaconda3/lib/libQt5Xml.so /home/ardati/anaconda3/lib/libQt5Core.so -L/croot/qt-main_1738942799946/_build_env/bin/../x86_64-conda-linux-gnu/sysroot/usr/lib64 -lGL -lpthread +LFLAGS = -fPIC -Wl,-rpath,/home/rojas/miniconda3/envs/VirtualLeaf-env/lib -shared +LIBS = $(SUBLIBS) -L../../../lib -lvleaf /home/rojas/miniconda3/envs/VirtualLeaf-env/lib/libQt5Widgets.so /home/rojas/miniconda3/envs/VirtualLeaf-env/lib/libQt5Gui.so /home/rojas/miniconda3/envs/VirtualLeaf-env/lib/libQt5Xml.so /home/rojas/miniconda3/envs/VirtualLeaf-env/lib/libQt5Core.so -L/usr/lib64 -lGL -lpthread AR = ar cqs RANLIB = SED = sed @@ -55,214 +55,214 @@ OBJECTS_DIR = ./ SOURCES = cambium.cpp moc_cambium.cpp OBJECTS = cambium.o \ moc_cambium.o -DIST = /home/ardati/anaconda3/mkspecs/features/spec_pre.prf \ - /home/ardati/anaconda3/mkspecs/common/unix.conf \ - /home/ardati/anaconda3/mkspecs/common/linux.conf \ - /home/ardati/anaconda3/mkspecs/common/sanitize.conf \ - /home/ardati/anaconda3/mkspecs/common/gcc-base.conf \ - /home/ardati/anaconda3/mkspecs/common/gcc-base-unix.conf \ - /home/ardati/anaconda3/mkspecs/common/g++-base.conf \ - /home/ardati/anaconda3/mkspecs/common/g++-unix.conf \ - /home/ardati/anaconda3/mkspecs/qconfig.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3danimation.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3danimation_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dcore.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dcore_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dextras.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dextras_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dinput.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dinput_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dlogic.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dlogic_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquick.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquick_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickanimation.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickanimation_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickextras.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickextras_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickinput.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickinput_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickrender.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickrender_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickscene2d.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickscene2d_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3drender.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3drender_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_accessibility_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_bluetooth.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_bluetooth_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_bodymovin_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_bootstrap_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_charts.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_charts_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_concurrent.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_concurrent_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_core.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_core_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_datavisualization.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_datavisualization_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_dbus.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_dbus_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_designer.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_designer_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_designercomponents_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_edid_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_egl_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_fb_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_gamepad.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_gamepad_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_glx_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_gui.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_gui_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_help.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_help_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_input_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_kms_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_location.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_location_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_multimedia.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_multimedia_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_multimediagsttools_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_multimediawidgets.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_network.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_network_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_networkauth.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_networkauth_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_nfc.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_nfc_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_opengl.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_opengl_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_openglextensions.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_openglextensions_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_packetprotocol_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_pdf.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_pdf_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_pdfwidgets.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_pdfwidgets_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_positioning.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_positioning_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_positioningquick.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_positioningquick_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_printsupport.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_printsupport_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_purchasing.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_purchasing_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qml.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qml_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmldebug_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmldevtools_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmlmodels.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmlmodels_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmltest.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmltest_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmlworkerscript.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmlworkerscript_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3d.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3d_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3dassetimport.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3dassetimport_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3drender.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3drender_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3druntimerender.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3druntimerender_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3dutils.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3dutils_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quickcontrols2.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quickparticles_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quickshapes_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quicktemplates2.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quickwidgets.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quickwidgets_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_remoteobjects.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_remoteobjects_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_repparser.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_repparser_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_script.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_script_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_scripttools.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_scripttools_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_scxml.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_scxml_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_sensors.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_sensors_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_serialbus.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_serialbus_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_serialport.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_serialport_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_service_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_sql.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_sql_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_svg.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_svg_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_testlib.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_testlib_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_texttospeech.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_texttospeech_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_theme_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_uiplugin.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_uitools.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_uitools_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_virtualkeyboard.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_virtualkeyboard_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webchannel.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webchannel_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webengine.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webengine_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webenginecore.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webenginecore_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webenginewidgets.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webenginewidgets_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_websockets.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_websockets_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webview.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webview_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_widgets.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_widgets_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_x11extras.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_x11extras_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_xkbcommon_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_xml.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_xml_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_xmlpatterns.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_xmlpatterns_private.pri \ - /home/ardati/anaconda3/mkspecs/features/qt_functions.prf \ - /home/ardati/anaconda3/mkspecs/features/qt_config.prf \ - /home/ardati/anaconda3/mkspecs/linux-g++/qmake.conf \ - /home/ardati/anaconda3/mkspecs/features/spec_post.prf \ +DIST = /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/spec_pre.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/unix.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/linux.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/sanitize.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/gcc-base.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/gcc-base-unix.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/g++-base.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/g++-unix.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/qconfig.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3danimation.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3danimation_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dcore.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dcore_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dextras.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dextras_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dinput.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dinput_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dlogic.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dlogic_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquick.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquick_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickanimation.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickanimation_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickextras.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickextras_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickinput.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickinput_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickrender.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickrender_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickscene2d.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickscene2d_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3drender.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3drender_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_accessibility_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_bluetooth.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_bluetooth_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_bodymovin_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_bootstrap_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_charts.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_charts_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_concurrent.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_concurrent_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_core.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_core_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_datavisualization.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_datavisualization_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_dbus.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_dbus_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_designer.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_designer_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_designercomponents_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_edid_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_egl_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_fb_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_gamepad.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_gamepad_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_glx_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_gui.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_gui_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_help.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_help_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_input_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_kms_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_location.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_location_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_multimedia.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_multimedia_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_multimediagsttools_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_multimediawidgets.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_network.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_network_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_networkauth.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_networkauth_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_nfc.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_nfc_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_opengl.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_opengl_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_openglextensions.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_openglextensions_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_pdf.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_pdf_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_pdfwidgets.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_pdfwidgets_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_positioning.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_positioning_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_positioningquick.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_positioningquick_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_printsupport.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_printsupport_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_purchasing.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_purchasing_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qml.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qml_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmldebug_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmlmodels.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmlmodels_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmltest.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmltest_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmlworkerscript.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmlworkerscript_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3d.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3d_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3dassetimport.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3dassetimport_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3drender.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3drender_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3druntimerender.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3druntimerender_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3dutils.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3dutils_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickcontrols2.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickparticles_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickshapes_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quicktemplates2.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickwidgets.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_remoteobjects.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_remoteobjects_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_repparser.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_repparser_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_script.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_script_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_scripttools.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_scripttools_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_scxml.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_scxml_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_sensors.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_sensors_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_serialbus.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_serialbus_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_serialport.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_serialport_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_service_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_sql.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_sql_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_svg.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_svg_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_testlib.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_testlib_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_texttospeech.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_texttospeech_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_theme_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_uiplugin.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_uitools.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_uitools_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_virtualkeyboard.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_virtualkeyboard_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webchannel.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webchannel_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webengine.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webengine_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webenginecore.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webenginecore_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webenginewidgets.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webenginewidgets_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_websockets.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_websockets_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webview.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webview_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_widgets.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_widgets_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_x11extras.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_x11extras_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xkbcommon_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xml.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xml_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xmlpatterns.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xmlpatterns_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/qt_functions.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/qt_config.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/linux-g++/qmake.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/spec_post.prf \ ../../.qmake.stash \ - /home/ardati/anaconda3/mkspecs/features/exclusive_builds.prf \ - /home/ardati/anaconda3/mkspecs/features/toolchain.prf \ - /home/ardati/anaconda3/mkspecs/features/default_pre.prf \ - /home/ardati/anaconda3/mkspecs/features/resolve_config.prf \ - /home/ardati/anaconda3/mkspecs/features/default_post.prf \ - /home/ardati/anaconda3/mkspecs/features/warn_on.prf \ - /home/ardati/anaconda3/mkspecs/features/qt.prf \ - /home/ardati/anaconda3/mkspecs/features/resources_functions.prf \ - /home/ardati/anaconda3/mkspecs/features/resources.prf \ - /home/ardati/anaconda3/mkspecs/features/moc.prf \ - /home/ardati/anaconda3/mkspecs/features/unix/opengl.prf \ - /home/ardati/anaconda3/mkspecs/features/uic.prf \ - /home/ardati/anaconda3/mkspecs/features/unix/thread.prf \ - /home/ardati/anaconda3/mkspecs/features/qmake_use.prf \ - /home/ardati/anaconda3/mkspecs/features/file_copies.prf \ - /home/ardati/anaconda3/mkspecs/features/testcase_targets.prf \ - /home/ardati/anaconda3/mkspecs/features/exceptions.prf \ - /home/ardati/anaconda3/mkspecs/features/yacc.prf \ - /home/ardati/anaconda3/mkspecs/features/lex.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/exclusive_builds.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/toolchain.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/default_pre.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/resolve_config.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/default_post.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/warn_on.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/qt.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/resources_functions.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/resources.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/moc.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/unix/opengl.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/uic.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/unix/thread.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/qmake_use.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/file_copies.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/testcase_targets.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/exceptions.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/yacc.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/lex.prf \ cambium.pro cambium.h cambium.cpp QMAKE_TARGET = cambium DESTDIR = ../../../bin/models/ @@ -281,424 +281,424 @@ first: all -Makefile: cambium.pro /home/ardati/anaconda3/mkspecs/linux-g++/qmake.conf /home/ardati/anaconda3/mkspecs/features/spec_pre.prf \ - /home/ardati/anaconda3/mkspecs/common/unix.conf \ - /home/ardati/anaconda3/mkspecs/common/linux.conf \ - /home/ardati/anaconda3/mkspecs/common/sanitize.conf \ - /home/ardati/anaconda3/mkspecs/common/gcc-base.conf \ - /home/ardati/anaconda3/mkspecs/common/gcc-base-unix.conf \ - /home/ardati/anaconda3/mkspecs/common/g++-base.conf \ - /home/ardati/anaconda3/mkspecs/common/g++-unix.conf \ - /home/ardati/anaconda3/mkspecs/qconfig.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3danimation.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3danimation_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dcore.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dcore_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dextras.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dextras_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dinput.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dinput_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dlogic.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dlogic_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquick.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquick_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickanimation.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickanimation_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickextras.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickextras_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickinput.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickinput_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickrender.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickrender_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickscene2d.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickscene2d_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3drender.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_3drender_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_accessibility_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_bluetooth.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_bluetooth_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_bodymovin_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_bootstrap_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_charts.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_charts_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_concurrent.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_concurrent_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_core.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_core_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_datavisualization.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_datavisualization_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_dbus.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_dbus_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_designer.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_designer_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_designercomponents_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_edid_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_egl_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_fb_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_gamepad.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_gamepad_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_glx_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_gui.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_gui_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_help.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_help_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_input_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_kms_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_location.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_location_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_multimedia.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_multimedia_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_multimediagsttools_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_multimediawidgets.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_network.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_network_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_networkauth.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_networkauth_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_nfc.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_nfc_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_opengl.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_opengl_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_openglextensions.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_openglextensions_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_packetprotocol_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_pdf.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_pdf_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_pdfwidgets.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_pdfwidgets_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_positioning.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_positioning_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_positioningquick.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_positioningquick_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_printsupport.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_printsupport_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_purchasing.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_purchasing_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qml.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qml_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmldebug_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmldevtools_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmlmodels.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmlmodels_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmltest.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmltest_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmlworkerscript.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qmlworkerscript_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3d.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3d_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3dassetimport.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3dassetimport_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3drender.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3drender_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3druntimerender.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3druntimerender_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3dutils.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3dutils_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quick_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quickcontrols2.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quickparticles_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quickshapes_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quicktemplates2.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quickwidgets.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_quickwidgets_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_remoteobjects.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_remoteobjects_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_repparser.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_repparser_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_script.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_script_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_scripttools.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_scripttools_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_scxml.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_scxml_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_sensors.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_sensors_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_serialbus.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_serialbus_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_serialport.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_serialport_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_service_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_sql.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_sql_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_svg.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_svg_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_testlib.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_testlib_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_texttospeech.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_texttospeech_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_theme_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_uiplugin.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_uitools.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_uitools_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_virtualkeyboard.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_virtualkeyboard_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webchannel.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webchannel_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webengine.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webengine_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webenginecore.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webenginecore_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webenginewidgets.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webenginewidgets_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_websockets.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_websockets_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webview.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_webview_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_widgets.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_widgets_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_x11extras.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_x11extras_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_xkbcommon_support_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_xml.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_xml_private.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_xmlpatterns.pri \ - /home/ardati/anaconda3/mkspecs/modules/qt_lib_xmlpatterns_private.pri \ - /home/ardati/anaconda3/mkspecs/features/qt_functions.prf \ - /home/ardati/anaconda3/mkspecs/features/qt_config.prf \ - /home/ardati/anaconda3/mkspecs/linux-g++/qmake.conf \ - /home/ardati/anaconda3/mkspecs/features/spec_post.prf \ +Makefile: cambium.pro /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/linux-g++/qmake.conf /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/spec_pre.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/unix.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/linux.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/sanitize.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/gcc-base.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/gcc-base-unix.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/g++-base.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/g++-unix.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/qconfig.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3danimation.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3danimation_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dcore.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dcore_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dextras.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dextras_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dinput.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dinput_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dlogic.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dlogic_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquick.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquick_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickanimation.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickanimation_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickextras.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickextras_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickinput.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickinput_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickrender.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickrender_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickscene2d.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickscene2d_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3drender.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3drender_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_accessibility_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_bluetooth.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_bluetooth_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_bodymovin_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_bootstrap_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_charts.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_charts_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_concurrent.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_concurrent_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_core.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_core_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_datavisualization.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_datavisualization_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_dbus.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_dbus_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_designer.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_designer_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_designercomponents_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_edid_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_egl_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_fb_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_gamepad.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_gamepad_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_glx_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_gui.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_gui_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_help.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_help_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_input_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_kms_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_location.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_location_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_multimedia.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_multimedia_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_multimediagsttools_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_multimediawidgets.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_network.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_network_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_networkauth.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_networkauth_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_nfc.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_nfc_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_opengl.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_opengl_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_openglextensions.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_openglextensions_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_pdf.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_pdf_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_pdfwidgets.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_pdfwidgets_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_positioning.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_positioning_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_positioningquick.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_positioningquick_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_printsupport.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_printsupport_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_purchasing.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_purchasing_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qml.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qml_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmldebug_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmlmodels.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmlmodels_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmltest.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmltest_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmlworkerscript.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmlworkerscript_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3d.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3d_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3dassetimport.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3dassetimport_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3drender.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3drender_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3druntimerender.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3druntimerender_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3dutils.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3dutils_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickcontrols2.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickparticles_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickshapes_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quicktemplates2.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickwidgets.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_remoteobjects.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_remoteobjects_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_repparser.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_repparser_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_script.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_script_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_scripttools.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_scripttools_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_scxml.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_scxml_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_sensors.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_sensors_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_serialbus.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_serialbus_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_serialport.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_serialport_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_service_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_sql.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_sql_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_svg.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_svg_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_testlib.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_testlib_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_texttospeech.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_texttospeech_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_theme_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_uiplugin.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_uitools.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_uitools_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_virtualkeyboard.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_virtualkeyboard_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webchannel.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webchannel_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webengine.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webengine_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webenginecore.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webenginecore_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webenginewidgets.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webenginewidgets_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_websockets.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_websockets_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webview.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webview_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_widgets.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_widgets_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_x11extras.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_x11extras_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xkbcommon_support_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xml.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xml_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xmlpatterns.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xmlpatterns_private.pri \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/qt_functions.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/qt_config.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/linux-g++/qmake.conf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/spec_post.prf \ ../../.qmake.stash \ - /home/ardati/anaconda3/mkspecs/features/exclusive_builds.prf \ - /home/ardati/anaconda3/mkspecs/features/toolchain.prf \ - /home/ardati/anaconda3/mkspecs/features/default_pre.prf \ - /home/ardati/anaconda3/mkspecs/features/resolve_config.prf \ - /home/ardati/anaconda3/mkspecs/features/default_post.prf \ - /home/ardati/anaconda3/mkspecs/features/warn_on.prf \ - /home/ardati/anaconda3/mkspecs/features/qt.prf \ - /home/ardati/anaconda3/mkspecs/features/resources_functions.prf \ - /home/ardati/anaconda3/mkspecs/features/resources.prf \ - /home/ardati/anaconda3/mkspecs/features/moc.prf \ - /home/ardati/anaconda3/mkspecs/features/unix/opengl.prf \ - /home/ardati/anaconda3/mkspecs/features/uic.prf \ - /home/ardati/anaconda3/mkspecs/features/unix/thread.prf \ - /home/ardati/anaconda3/mkspecs/features/qmake_use.prf \ - /home/ardati/anaconda3/mkspecs/features/file_copies.prf \ - /home/ardati/anaconda3/mkspecs/features/testcase_targets.prf \ - /home/ardati/anaconda3/mkspecs/features/exceptions.prf \ - /home/ardati/anaconda3/mkspecs/features/yacc.prf \ - /home/ardati/anaconda3/mkspecs/features/lex.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/exclusive_builds.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/toolchain.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/default_pre.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/resolve_config.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/default_post.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/warn_on.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/qt.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/resources_functions.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/resources.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/moc.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/unix/opengl.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/uic.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/unix/thread.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/qmake_use.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/file_copies.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/testcase_targets.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/exceptions.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/yacc.prf \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/lex.prf \ cambium.pro $(QMAKE) -o Makefile cambium.pro -/home/ardati/anaconda3/mkspecs/features/spec_pre.prf: -/home/ardati/anaconda3/mkspecs/common/unix.conf: -/home/ardati/anaconda3/mkspecs/common/linux.conf: -/home/ardati/anaconda3/mkspecs/common/sanitize.conf: -/home/ardati/anaconda3/mkspecs/common/gcc-base.conf: -/home/ardati/anaconda3/mkspecs/common/gcc-base-unix.conf: -/home/ardati/anaconda3/mkspecs/common/g++-base.conf: -/home/ardati/anaconda3/mkspecs/common/g++-unix.conf: -/home/ardati/anaconda3/mkspecs/qconfig.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3danimation.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3danimation_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dcore.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dcore_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dextras.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dextras_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dinput.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dinput_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dlogic.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dlogic_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquick.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquick_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickanimation.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickanimation_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickextras.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickextras_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickinput.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickinput_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickrender.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickrender_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickscene2d.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3dquickscene2d_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3drender.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_3drender_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_accessibility_support_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_bluetooth.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_bluetooth_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_bodymovin_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_bootstrap_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_charts.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_charts_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_concurrent.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_concurrent_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_core.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_core_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_datavisualization.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_datavisualization_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_dbus.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_dbus_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_designer.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_designer_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_designercomponents_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_devicediscovery_support_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_edid_support_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_egl_support_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_fb_support_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_fontdatabase_support_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_gamepad.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_gamepad_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_glx_support_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_gui.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_gui_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_help.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_help_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_input_support_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_kms_support_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_location.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_location_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_multimedia.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_multimedia_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_multimediagsttools_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_multimediawidgets.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_multimediawidgets_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_network.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_network_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_networkauth.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_networkauth_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_nfc.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_nfc_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_opengl.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_opengl_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_openglextensions.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_openglextensions_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_packetprotocol_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_pdf.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_pdf_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_pdfwidgets.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_pdfwidgets_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_platformcompositor_support_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_positioning.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_positioning_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_positioningquick.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_positioningquick_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_printsupport.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_printsupport_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_purchasing.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_purchasing_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_qml.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_qml_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_qmldebug_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_qmldevtools_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_qmlmodels.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_qmlmodels_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_qmltest.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_qmltest_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_qmlworkerscript.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_qmlworkerscript_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quick.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3d.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3d_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3dassetimport.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3dassetimport_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3drender.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3drender_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3druntimerender.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3druntimerender_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3dutils.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quick3dutils_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quick_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quickcontrols2.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quickcontrols2_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quickparticles_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quickshapes_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quicktemplates2.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quicktemplates2_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quickwidgets.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_quickwidgets_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_remoteobjects.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_remoteobjects_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_repparser.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_repparser_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_script.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_script_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_scripttools.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_scripttools_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_scxml.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_scxml_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_sensors.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_sensors_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_serialbus.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_serialbus_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_serialport.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_serialport_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_service_support_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_sql.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_sql_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_svg.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_svg_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_testlib.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_testlib_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_texttospeech.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_texttospeech_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_theme_support_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_uiplugin.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_uitools.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_uitools_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_virtualkeyboard.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_virtualkeyboard_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_webchannel.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_webchannel_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_webengine.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_webengine_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_webenginecore.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_webenginecore_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_webenginewidgets.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_webenginewidgets_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_websockets.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_websockets_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_webview.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_webview_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_widgets.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_widgets_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_x11extras.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_x11extras_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_xkbcommon_support_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_xml.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_xml_private.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_xmlpatterns.pri: -/home/ardati/anaconda3/mkspecs/modules/qt_lib_xmlpatterns_private.pri: -/home/ardati/anaconda3/mkspecs/features/qt_functions.prf: -/home/ardati/anaconda3/mkspecs/features/qt_config.prf: -/home/ardati/anaconda3/mkspecs/linux-g++/qmake.conf: -/home/ardati/anaconda3/mkspecs/features/spec_post.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/spec_pre.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/unix.conf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/linux.conf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/sanitize.conf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/gcc-base.conf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/gcc-base-unix.conf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/g++-base.conf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/common/g++-unix.conf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/qconfig.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3danimation.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3danimation_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dcore.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dcore_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dextras.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dextras_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dinput.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dinput_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dlogic.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dlogic_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquick.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquick_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickanimation.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickanimation_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickextras.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickextras_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickinput.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickinput_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickrender.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickrender_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickscene2d.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3dquickscene2d_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3drender.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_3drender_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_accessibility_support_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_bluetooth.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_bluetooth_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_bodymovin_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_bootstrap_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_charts.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_charts_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_concurrent.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_concurrent_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_core.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_core_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_datavisualization.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_datavisualization_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_dbus.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_dbus_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_designer.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_designer_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_designercomponents_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_devicediscovery_support_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_edid_support_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_egl_support_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_fb_support_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_fontdatabase_support_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_gamepad.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_gamepad_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_glx_support_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_gui.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_gui_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_help.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_help_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_input_support_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_kms_support_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_location.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_location_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_multimedia.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_multimedia_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_multimediagsttools_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_multimediawidgets.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_multimediawidgets_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_network.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_network_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_networkauth.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_networkauth_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_nfc.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_nfc_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_opengl.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_opengl_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_openglextensions.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_openglextensions_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_packetprotocol_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_pdf.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_pdf_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_pdfwidgets.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_pdfwidgets_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_platformcompositor_support_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_positioning.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_positioning_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_positioningquick.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_positioningquick_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_printsupport.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_printsupport_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_purchasing.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_purchasing_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qml.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qml_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmldebug_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmldevtools_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmlmodels.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmlmodels_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmltest.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmltest_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmlworkerscript.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qmlworkerscript_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3d.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3d_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3dassetimport.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3dassetimport_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3drender.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3drender_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3druntimerender.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3druntimerender_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3dutils.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick3dutils_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quick_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickcontrols2.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickcontrols2_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickparticles_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickshapes_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quicktemplates2.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quicktemplates2_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickwidgets.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_quickwidgets_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_remoteobjects.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_remoteobjects_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_repparser.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_repparser_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_script.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_script_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_scripttools.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_scripttools_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_scxml.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_scxml_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_sensors.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_sensors_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_serialbus.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_serialbus_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_serialport.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_serialport_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_service_support_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_sql.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_sql_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_svg.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_svg_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_testlib.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_testlib_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_texttospeech.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_texttospeech_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_theme_support_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_uiplugin.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_uitools.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_uitools_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_virtualkeyboard.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_virtualkeyboard_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webchannel.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webchannel_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webengine.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webengine_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webenginecore.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webenginecore_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webenginewidgets.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webenginewidgets_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_websockets.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_websockets_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webview.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_webview_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_widgets.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_widgets_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_x11extras.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_x11extras_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xkbcommon_support_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xml.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xml_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xmlpatterns.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/modules/qt_lib_xmlpatterns_private.pri: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/qt_functions.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/qt_config.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/linux-g++/qmake.conf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/spec_post.prf: ../../.qmake.stash: -/home/ardati/anaconda3/mkspecs/features/exclusive_builds.prf: -/home/ardati/anaconda3/mkspecs/features/toolchain.prf: -/home/ardati/anaconda3/mkspecs/features/default_pre.prf: -/home/ardati/anaconda3/mkspecs/features/resolve_config.prf: -/home/ardati/anaconda3/mkspecs/features/default_post.prf: -/home/ardati/anaconda3/mkspecs/features/warn_on.prf: -/home/ardati/anaconda3/mkspecs/features/qt.prf: -/home/ardati/anaconda3/mkspecs/features/resources_functions.prf: -/home/ardati/anaconda3/mkspecs/features/resources.prf: -/home/ardati/anaconda3/mkspecs/features/moc.prf: -/home/ardati/anaconda3/mkspecs/features/unix/opengl.prf: -/home/ardati/anaconda3/mkspecs/features/uic.prf: -/home/ardati/anaconda3/mkspecs/features/unix/thread.prf: -/home/ardati/anaconda3/mkspecs/features/qmake_use.prf: -/home/ardati/anaconda3/mkspecs/features/file_copies.prf: -/home/ardati/anaconda3/mkspecs/features/testcase_targets.prf: -/home/ardati/anaconda3/mkspecs/features/exceptions.prf: -/home/ardati/anaconda3/mkspecs/features/yacc.prf: -/home/ardati/anaconda3/mkspecs/features/lex.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/exclusive_builds.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/toolchain.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/default_pre.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/resolve_config.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/default_post.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/warn_on.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/qt.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/resources_functions.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/resources.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/moc.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/unix/opengl.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/uic.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/unix/thread.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/qmake_use.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/file_copies.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/testcase_targets.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/exceptions.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/yacc.prf: +/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/lex.prf: cambium.pro: qmake: FORCE @$(QMAKE) -o Makefile cambium.pro @@ -714,7 +714,7 @@ dist: distdir FORCE distdir: FORCE @test -d $(DISTDIR) || mkdir -p $(DISTDIR) $(COPY_FILE) --parents $(DIST) $(DISTDIR)/ - $(COPY_FILE) --parents /home/ardati/anaconda3/mkspecs/features/data/dummy.cpp $(DISTDIR)/ + $(COPY_FILE) --parents /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/data/dummy.cpp $(DISTDIR)/ $(COPY_FILE) --parents cambium.h $(DISTDIR)/ $(COPY_FILE) --parents cambium.cpp $(DISTDIR)/ @@ -744,374 +744,374 @@ compiler_rcc_clean: compiler_moc_predefs_make_all: moc_predefs.h compiler_moc_predefs_clean: -$(DEL_FILE) moc_predefs.h -moc_predefs.h: /home/ardati/anaconda3/mkspecs/features/data/dummy.cpp - g++ -pipe -Wno-write-strings -Wno-unused-parameter -fPIC -I/usr/include/libxml2 -g -g3 -DQDEBUG -Wall -Wextra -dM -E -o moc_predefs.h /home/ardati/anaconda3/mkspecs/features/data/dummy.cpp +moc_predefs.h: /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/data/dummy.cpp + g++ -pipe -Wno-write-strings -Wno-unused-parameter -fPIC -I/usr/include/libxml2 -g -g3 -DQDEBUG -Wall -Wextra -dM -E -o moc_predefs.h /home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/features/data/dummy.cpp compiler_moc_header_make_all: moc_cambium.cpp compiler_moc_header_clean: -$(DEL_FILE) moc_cambium.cpp moc_cambium.cpp: cambium.h \ - /home/ardati/anaconda3/include/qt/QtCore/QObject \ - /home/ardati/anaconda3/include/qt/QtCore/qobject.h \ - /home/ardati/anaconda3/include/qt/QtCore/qobjectdefs.h \ - /home/ardati/anaconda3/include/qt/QtCore/qnamespace.h \ - /home/ardati/anaconda3/include/qt/QtCore/qglobal.h \ - /home/ardati/anaconda3/include/qt/QtCore/qconfig-bootstrapped.h \ - /home/ardati/anaconda3/include/qt/QtCore/qconfig.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtcore-config.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsystemdetection.h \ - /home/ardati/anaconda3/include/qt/QtCore/qprocessordetection.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcompilerdetection.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtypeinfo.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsysinfo.h \ - /home/ardati/anaconda3/include/qt/QtCore/qlogging.h \ - /home/ardati/anaconda3/include/qt/QtCore/qflags.h \ - /home/ardati/anaconda3/include/qt/QtCore/qatomic.h \ - /home/ardati/anaconda3/include/qt/QtCore/qbasicatomic.h \ - /home/ardati/anaconda3/include/qt/QtCore/qatomic_bootstrap.h \ - /home/ardati/anaconda3/include/qt/QtCore/qgenericatomic.h \ - /home/ardati/anaconda3/include/qt/QtCore/qatomic_cxx11.h \ - /home/ardati/anaconda3/include/qt/QtCore/qatomic_msvc.h \ - /home/ardati/anaconda3/include/qt/QtCore/qglobalstatic.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmutex.h \ - /home/ardati/anaconda3/include/qt/QtCore/qnumeric.h \ - /home/ardati/anaconda3/include/qt/QtCore/qversiontagging.h \ - /home/ardati/anaconda3/include/qt/QtCore/qobjectdefs_impl.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstring.h \ - /home/ardati/anaconda3/include/qt/QtCore/qchar.h \ - /home/ardati/anaconda3/include/qt/QtCore/qbytearray.h \ - /home/ardati/anaconda3/include/qt/QtCore/qrefcount.h \ - /home/ardati/anaconda3/include/qt/QtCore/qarraydata.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstringliteral.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstringalgorithms.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstringview.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstringbuilder.h \ - /home/ardati/anaconda3/include/qt/QtCore/qlist.h \ - /home/ardati/anaconda3/include/qt/QtCore/qalgorithms.h \ - /home/ardati/anaconda3/include/qt/QtCore/qiterator.h \ - /home/ardati/anaconda3/include/qt/QtCore/qhashfunctions.h \ - /home/ardati/anaconda3/include/qt/QtCore/qpair.h \ - /home/ardati/anaconda3/include/qt/QtCore/qvector.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcontainertools_impl.h \ - /home/ardati/anaconda3/include/qt/QtCore/qpoint.h \ - /home/ardati/anaconda3/include/qt/QtCore/qbytearraylist.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstringlist.h \ - /home/ardati/anaconda3/include/qt/QtCore/qregexp.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstringmatcher.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcoreevent.h \ - /home/ardati/anaconda3/include/qt/QtCore/qscopedpointer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmetatype.h \ - /home/ardati/anaconda3/include/qt/QtCore/qvarlengtharray.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcontainerfwd.h \ - /home/ardati/anaconda3/include/qt/QtCore/qobject_impl.h \ - /home/ardati/anaconda3/include/qt/QtGui/QtGui \ - /home/ardati/anaconda3/include/qt/QtGui/QtGuiDepends \ - /home/ardati/anaconda3/include/qt/QtCore/QtCore \ - /home/ardati/anaconda3/include/qt/QtCore/QtCoreDepends \ - /home/ardati/anaconda3/include/qt/QtCore/qabstractanimation.h \ - /home/ardati/anaconda3/include/qt/QtCore/qabstracteventdispatcher.h \ - /home/ardati/anaconda3/include/qt/QtCore/qeventloop.h \ - /home/ardati/anaconda3/include/qt/QtCore/qabstractitemmodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qvariant.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmap.h \ - /home/ardati/anaconda3/include/qt/QtCore/qdebug.h \ - /home/ardati/anaconda3/include/qt/QtCore/qhash.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtextstream.h \ - /home/ardati/anaconda3/include/qt/QtCore/qiodevice.h \ - /home/ardati/anaconda3/include/qt/QtCore/qlocale.h \ - /home/ardati/anaconda3/include/qt/QtCore/qshareddata.h \ - /home/ardati/anaconda3/include/qt/QtCore/qset.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcontiguouscache.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsharedpointer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsharedpointer_impl.h \ - /home/ardati/anaconda3/include/qt/QtCore/qabstractnativeeventfilter.h \ - /home/ardati/anaconda3/include/qt/QtCore/qabstractproxymodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qabstractstate.h \ - /home/ardati/anaconda3/include/qt/QtCore/qabstracttransition.h \ - /home/ardati/anaconda3/include/qt/QtCore/qanimationgroup.h \ - /home/ardati/anaconda3/include/qt/QtCore/qarraydataops.h \ - /home/ardati/anaconda3/include/qt/QtCore/qarraydatapointer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qbasictimer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qbitarray.h \ - /home/ardati/anaconda3/include/qt/QtCore/qbuffer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qbytearraymatcher.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcache.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcalendar.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcborarray.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcborvalue.h \ - /home/ardati/anaconda3/include/qt/QtCore/qdatetime.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcborcommon.h \ - /home/ardati/anaconda3/include/qt/QtCore/qregularexpression.h \ - /home/ardati/anaconda3/include/qt/QtCore/qurl.h \ - /home/ardati/anaconda3/include/qt/QtCore/qurlquery.h \ - /home/ardati/anaconda3/include/qt/QtCore/quuid.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcbormap.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcborstream.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcborstreamreader.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfloat16.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcborstreamwriter.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcollator.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcommandlineoption.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcommandlineparser.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcoreapplication.h \ - /home/ardati/anaconda3/include/qt/QtCore/qconcatenatetablesproxymodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcryptographichash.h \ - /home/ardati/anaconda3/include/qt/QtCore/qdatastream.h \ - /home/ardati/anaconda3/include/qt/QtCore/qdeadlinetimer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qelapsedtimer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qdir.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfileinfo.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfile.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfiledevice.h \ - /home/ardati/anaconda3/include/qt/QtCore/qdiriterator.h \ - /home/ardati/anaconda3/include/qt/QtCore/qeasingcurve.h \ - /home/ardati/anaconda3/include/qt/QtCore/qendian.h \ - /home/ardati/anaconda3/include/qt/QtCore/qeventtransition.h \ - /home/ardati/anaconda3/include/qt/QtCore/qexception.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfactoryinterface.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfileselector.h \ - /home/ardati/anaconda3/include/qt/QtCore/QStringList \ - /home/ardati/anaconda3/include/qt/QtCore/qfilesystemwatcher.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfinalstate.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfuture.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfutureinterface.h \ - /home/ardati/anaconda3/include/qt/QtCore/qrunnable.h \ - /home/ardati/anaconda3/include/qt/QtCore/qresultstore.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfuturesynchronizer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfuturewatcher.h \ - /home/ardati/anaconda3/include/qt/QtCore/qhistorystate.h \ - /home/ardati/anaconda3/include/qt/QtCore/qidentityproxymodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qisenum.h \ - /home/ardati/anaconda3/include/qt/QtCore/qitemselectionmodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qjsonarray.h \ - /home/ardati/anaconda3/include/qt/QtCore/qjsonvalue.h \ - /home/ardati/anaconda3/include/qt/QtCore/qjsondocument.h \ - /home/ardati/anaconda3/include/qt/QtCore/qjsonobject.h \ - /home/ardati/anaconda3/include/qt/QtCore/qlibrary.h \ - /home/ardati/anaconda3/include/qt/QtCore/qlibraryinfo.h \ - /home/ardati/anaconda3/include/qt/QtCore/qversionnumber.h \ - /home/ardati/anaconda3/include/qt/QtCore/qline.h \ - /home/ardati/anaconda3/include/qt/QtCore/qlinkedlist.h \ - /home/ardati/anaconda3/include/qt/QtCore/qlockfile.h \ - /home/ardati/anaconda3/include/qt/QtCore/qloggingcategory.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmargins.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmath.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmessageauthenticationcode.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmetaobject.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmimedata.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmimedatabase.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmimetype.h \ - /home/ardati/anaconda3/include/qt/QtCore/qobjectcleanuphandler.h \ - /home/ardati/anaconda3/include/qt/QtCore/qoperatingsystemversion.h \ - /home/ardati/anaconda3/include/qt/QtCore/qparallelanimationgroup.h \ - /home/ardati/anaconda3/include/qt/QtCore/qpauseanimation.h \ - /home/ardati/anaconda3/include/qt/QtCore/qplugin.h \ - /home/ardati/anaconda3/include/qt/QtCore/qpointer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qpluginloader.h \ - /home/ardati/anaconda3/include/qt/QtCore/qprocess.h \ - /home/ardati/anaconda3/include/qt/QtCore/qpropertyanimation.h \ - /home/ardati/anaconda3/include/qt/QtCore/qvariantanimation.h \ - /home/ardati/anaconda3/include/qt/QtCore/qqueue.h \ - /home/ardati/anaconda3/include/qt/QtCore/qrandom.h \ - /home/ardati/anaconda3/include/qt/QtCore/qreadwritelock.h \ - /home/ardati/anaconda3/include/qt/QtCore/qrect.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsize.h \ - /home/ardati/anaconda3/include/qt/QtCore/qresource.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsavefile.h \ - /home/ardati/anaconda3/include/qt/QtCore/qscopedvaluerollback.h \ - /home/ardati/anaconda3/include/qt/QtCore/qscopeguard.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsemaphore.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsequentialanimationgroup.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsettings.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsharedmemory.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsignalmapper.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsignaltransition.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsocketnotifier.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsortfilterproxymodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstack.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstandardpaths.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstate.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstatemachine.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstorageinfo.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstringlistmodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsystemsemaphore.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtemporarydir.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtemporaryfile.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtextboundaryfinder.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtextcodec.h \ - /home/ardati/anaconda3/include/qt/QtCore/qthread.h \ - /home/ardati/anaconda3/include/qt/QtCore/qthreadpool.h \ - /home/ardati/anaconda3/include/qt/QtCore/qthreadstorage.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtimeline.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtimer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtimezone.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtranslator.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtransposeproxymodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtypetraits.h \ - /home/ardati/anaconda3/include/qt/QtCore/qwaitcondition.h \ - /home/ardati/anaconda3/include/qt/QtCore/QDeadlineTimer \ - /home/ardati/anaconda3/include/qt/QtCore/qwineventnotifier.h \ - /home/ardati/anaconda3/include/qt/QtCore/qxmlstream.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtcoreversion.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtguiglobal.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtgui-config.h \ - /home/ardati/anaconda3/include/qt/QtGui/qabstracttextdocumentlayout.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextlayout.h \ - /home/ardati/anaconda3/include/qt/QtGui/qcolor.h \ - /home/ardati/anaconda3/include/qt/QtGui/qrgb.h \ - /home/ardati/anaconda3/include/qt/QtGui/qrgba64.h \ - /home/ardati/anaconda3/include/qt/QtGui/qevent.h \ - /home/ardati/anaconda3/include/qt/QtGui/qwindowdefs.h \ - /home/ardati/anaconda3/include/qt/QtGui/qwindowdefs_win.h \ - /home/ardati/anaconda3/include/qt/QtGui/qregion.h \ - /home/ardati/anaconda3/include/qt/QtGui/qkeysequence.h \ - /home/ardati/anaconda3/include/qt/QtGui/qvector2d.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtouchdevice.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextformat.h \ - /home/ardati/anaconda3/include/qt/QtGui/qfont.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpen.h \ - /home/ardati/anaconda3/include/qt/QtGui/qbrush.h \ - /home/ardati/anaconda3/include/qt/QtGui/qmatrix.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpolygon.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtransform.h \ - /home/ardati/anaconda3/include/qt/QtGui/qimage.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpaintdevice.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpixelformat.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpixmap.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextoption.h \ - /home/ardati/anaconda3/include/qt/QtGui/qglyphrun.h \ - /home/ardati/anaconda3/include/qt/QtGui/qrawfont.h \ - /home/ardati/anaconda3/include/qt/QtGui/qfontdatabase.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextcursor.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextdocument.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpalette.h \ - /home/ardati/anaconda3/include/qt/QtGui/qaccessible.h \ - /home/ardati/anaconda3/include/qt/QtGui/qaccessiblebridge.h \ - /home/ardati/anaconda3/include/qt/QtGui/qaccessibleobject.h \ - /home/ardati/anaconda3/include/qt/QtGui/qaccessibleplugin.h \ - /home/ardati/anaconda3/include/qt/QtGui/qbackingstore.h \ - /home/ardati/anaconda3/include/qt/QtGui/qwindow.h \ - /home/ardati/anaconda3/include/qt/QtCore/QEvent \ - /home/ardati/anaconda3/include/qt/QtCore/QMargins \ - /home/ardati/anaconda3/include/qt/QtCore/QRect \ - /home/ardati/anaconda3/include/qt/QtGui/qsurface.h \ - /home/ardati/anaconda3/include/qt/QtGui/qsurfaceformat.h \ - /home/ardati/anaconda3/include/qt/QtGui/qicon.h \ - /home/ardati/anaconda3/include/qt/QtGui/qcursor.h \ - /home/ardati/anaconda3/include/qt/QtGui/qbitmap.h \ - /home/ardati/anaconda3/include/qt/QtGui/qclipboard.h \ - /home/ardati/anaconda3/include/qt/QtGui/qcolorspace.h \ - /home/ardati/anaconda3/include/qt/QtGui/qcolortransform.h \ - /home/ardati/anaconda3/include/qt/QtGui/qdesktopservices.h \ - /home/ardati/anaconda3/include/qt/QtGui/qdrag.h \ - /home/ardati/anaconda3/include/qt/QtGui/qfontinfo.h \ - /home/ardati/anaconda3/include/qt/QtGui/qfontmetrics.h \ - /home/ardati/anaconda3/include/qt/QtGui/qgenericmatrix.h \ - /home/ardati/anaconda3/include/qt/QtGui/qgenericplugin.h \ - /home/ardati/anaconda3/include/qt/QtGui/qgenericpluginfactory.h \ - /home/ardati/anaconda3/include/qt/QtGui/qguiapplication.h \ - /home/ardati/anaconda3/include/qt/QtGui/qinputmethod.h \ - /home/ardati/anaconda3/include/qt/QtGui/qiconengine.h \ - /home/ardati/anaconda3/include/qt/QtGui/qiconengineplugin.h \ - /home/ardati/anaconda3/include/qt/QtGui/qimageiohandler.h \ - /home/ardati/anaconda3/include/qt/QtGui/qimagereader.h \ - /home/ardati/anaconda3/include/qt/QtGui/qimagewriter.h \ - /home/ardati/anaconda3/include/qt/QtGui/qmatrix4x4.h \ - /home/ardati/anaconda3/include/qt/QtGui/qvector3d.h \ - /home/ardati/anaconda3/include/qt/QtGui/qvector4d.h \ - /home/ardati/anaconda3/include/qt/QtGui/qquaternion.h \ - /home/ardati/anaconda3/include/qt/QtGui/qmovie.h \ - /home/ardati/anaconda3/include/qt/QtGui/qoffscreensurface.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopengl.h \ - /home/ardati/anaconda3/include/qt/QtCore/qt_windows.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopengles2ext.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglext.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglbuffer.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglcontext.h \ - /home/ardati/anaconda3/include/qt/QtCore/QScopedPointer \ - /home/ardati/anaconda3/include/qt/QtGui/QSurfaceFormat \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglversionfunctions.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopengldebug.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglextrafunctions.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglfunctions.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglframebufferobject.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglpaintdevice.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglpixeltransferoptions.h \ - /home/ardati/anaconda3/include/qt/QtCore/QSharedDataPointer \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglshaderprogram.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopengltexture.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopengltextureblitter.h \ - /home/ardati/anaconda3/include/qt/QtGui/QMatrix3x3 \ - /home/ardati/anaconda3/include/qt/QtGui/QMatrix4x4 \ - /home/ardati/anaconda3/include/qt/QtGui/qopengltimerquery.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglvertexarrayobject.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglwindow.h \ - /home/ardati/anaconda3/include/qt/QtGui/QPaintDeviceWindow \ - /home/ardati/anaconda3/include/qt/QtGui/qpaintdevicewindow.h \ - /home/ardati/anaconda3/include/qt/QtGui/QWindow \ - /home/ardati/anaconda3/include/qt/QtGui/QPaintDevice \ - /home/ardati/anaconda3/include/qt/QtGui/QOpenGLContext \ - /home/ardati/anaconda3/include/qt/QtGui/QImage \ - /home/ardati/anaconda3/include/qt/QtGui/qpagedpaintdevice.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpagelayout.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpagesize.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpaintengine.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpainter.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpainterpath.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpdfwriter.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpicture.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpictureformatplugin.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpixmapcache.h \ - /home/ardati/anaconda3/include/qt/QtGui/qrasterwindow.h \ - /home/ardati/anaconda3/include/qt/QtGui/qscreen.h \ - /home/ardati/anaconda3/include/qt/QtCore/QList \ - /home/ardati/anaconda3/include/qt/QtCore/QSize \ - /home/ardati/anaconda3/include/qt/QtCore/QSizeF \ - /home/ardati/anaconda3/include/qt/QtGui/QTransform \ - /home/ardati/anaconda3/include/qt/QtGui/qsessionmanager.h \ - /home/ardati/anaconda3/include/qt/QtGui/qstandarditemmodel.h \ - /home/ardati/anaconda3/include/qt/QtGui/qstatictext.h \ - /home/ardati/anaconda3/include/qt/QtGui/qstylehints.h \ - /home/ardati/anaconda3/include/qt/QtGui/qsyntaxhighlighter.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextobject.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextdocumentfragment.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextdocumentwriter.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextlist.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtexttable.h \ - /home/ardati/anaconda3/include/qt/QtGui/qvalidator.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtguiversion.h \ - /home/ardati/anaconda3/include/qt/QtCore/QString \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QObject \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qobject.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qobjectdefs.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qnamespace.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qglobal.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qconfig-bootstrapped.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qconfig.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtcore-config.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsystemdetection.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qprocessordetection.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcompilerdetection.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtypeinfo.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsysinfo.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qlogging.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qflags.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qatomic.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qbasicatomic.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qatomic_bootstrap.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qgenericatomic.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qatomic_cxx11.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qatomic_msvc.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qglobalstatic.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmutex.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qnumeric.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qversiontagging.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qobjectdefs_impl.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstring.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qchar.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qbytearray.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qrefcount.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qarraydata.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstringliteral.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstringalgorithms.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstringview.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstringbuilder.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qlist.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qalgorithms.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qiterator.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qhashfunctions.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qpair.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qvector.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcontainertools_impl.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qpoint.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qbytearraylist.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstringlist.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qregexp.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstringmatcher.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcoreevent.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qscopedpointer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmetatype.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qvarlengtharray.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcontainerfwd.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qobject_impl.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QtGui \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QtGuiDepends \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QtCore \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QtCoreDepends \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qabstractanimation.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qabstracteventdispatcher.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qeventloop.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qabstractitemmodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qvariant.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmap.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qdebug.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qhash.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtextstream.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qiodevice.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qlocale.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qshareddata.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qset.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcontiguouscache.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsharedpointer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsharedpointer_impl.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qabstractnativeeventfilter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qabstractproxymodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qabstractstate.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qabstracttransition.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qanimationgroup.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qarraydataops.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qarraydatapointer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qbasictimer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qbitarray.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qbuffer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qbytearraymatcher.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcache.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcalendar.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcborarray.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcborvalue.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qdatetime.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcborcommon.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qregularexpression.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qurl.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qurlquery.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/quuid.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcbormap.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcborstream.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcborstreamreader.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfloat16.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcborstreamwriter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcollator.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcommandlineoption.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcommandlineparser.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcoreapplication.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qconcatenatetablesproxymodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcryptographichash.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qdatastream.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qdeadlinetimer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qelapsedtimer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qdir.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfileinfo.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfile.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfiledevice.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qdiriterator.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qeasingcurve.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qendian.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qeventtransition.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qexception.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfactoryinterface.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfileselector.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QStringList \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfilesystemwatcher.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfinalstate.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfuture.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfutureinterface.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qrunnable.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qresultstore.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfuturesynchronizer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfuturewatcher.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qhistorystate.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qidentityproxymodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qisenum.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qitemselectionmodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qjsonarray.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qjsonvalue.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qjsondocument.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qjsonobject.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qlibrary.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qlibraryinfo.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qversionnumber.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qline.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qlinkedlist.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qlockfile.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qloggingcategory.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmargins.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmath.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmessageauthenticationcode.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmetaobject.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmimedata.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmimedatabase.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmimetype.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qobjectcleanuphandler.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qoperatingsystemversion.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qparallelanimationgroup.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qpauseanimation.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qplugin.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qpointer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qpluginloader.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qprocess.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qpropertyanimation.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qvariantanimation.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qqueue.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qrandom.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qreadwritelock.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qrect.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsize.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qresource.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsavefile.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qscopedvaluerollback.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qscopeguard.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsemaphore.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsequentialanimationgroup.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsettings.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsharedmemory.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsignalmapper.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsignaltransition.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsocketnotifier.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsortfilterproxymodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstack.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstandardpaths.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstate.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstatemachine.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstorageinfo.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstringlistmodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsystemsemaphore.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtemporarydir.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtemporaryfile.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtextboundaryfinder.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtextcodec.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qthread.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qthreadpool.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qthreadstorage.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtimeline.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtimer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtimezone.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtranslator.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtransposeproxymodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtypetraits.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qwaitcondition.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QDeadlineTimer \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qwineventnotifier.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qxmlstream.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtcoreversion.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtguiglobal.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtgui-config.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qabstracttextdocumentlayout.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextlayout.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qcolor.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qrgb.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qrgba64.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qevent.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qwindowdefs.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qwindowdefs_win.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qregion.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qkeysequence.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qvector2d.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtouchdevice.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextformat.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qfont.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpen.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qbrush.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qmatrix.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpolygon.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtransform.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qimage.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpaintdevice.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpixelformat.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpixmap.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextoption.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qglyphrun.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qrawfont.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qfontdatabase.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextcursor.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextdocument.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpalette.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qaccessible.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qaccessiblebridge.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qaccessibleobject.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qaccessibleplugin.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qbackingstore.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qwindow.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QEvent \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QMargins \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QRect \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qsurface.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qsurfaceformat.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qicon.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qcursor.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qbitmap.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qclipboard.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qcolorspace.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qcolortransform.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qdesktopservices.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qdrag.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qfontinfo.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qfontmetrics.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qgenericmatrix.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qgenericplugin.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qgenericpluginfactory.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qguiapplication.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qinputmethod.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qiconengine.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qiconengineplugin.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qimageiohandler.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qimagereader.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qimagewriter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qmatrix4x4.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qvector3d.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qvector4d.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qquaternion.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qmovie.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qoffscreensurface.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopengl.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qt_windows.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopengles2ext.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglext.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglbuffer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglcontext.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QScopedPointer \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QSurfaceFormat \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglversionfunctions.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopengldebug.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglextrafunctions.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglfunctions.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglframebufferobject.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglpaintdevice.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglpixeltransferoptions.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QSharedDataPointer \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglshaderprogram.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopengltexture.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopengltextureblitter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QMatrix3x3 \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QMatrix4x4 \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopengltimerquery.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglvertexarrayobject.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglwindow.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QPaintDeviceWindow \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpaintdevicewindow.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QWindow \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QPaintDevice \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QOpenGLContext \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QImage \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpagedpaintdevice.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpagelayout.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpagesize.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpaintengine.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpainter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpainterpath.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpdfwriter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpicture.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpictureformatplugin.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpixmapcache.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qrasterwindow.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qscreen.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QList \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QSize \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QSizeF \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QTransform \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qsessionmanager.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qstandarditemmodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qstatictext.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qstylehints.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qsyntaxhighlighter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextobject.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextdocumentfragment.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextdocumentwriter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextlist.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtexttable.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qvalidator.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtguiversion.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QString \ ../../Library/simplugin.h \ - /home/ardati/anaconda3/include/qt/QtCore/QtPlugin \ - /home/ardati/anaconda3/include/qt/QtCore/QMetaType \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QtPlugin \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QMetaType \ ../../Library/cellbase.h \ - /home/ardati/anaconda3/include/qt/QtCore/QDebug \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QDebug \ ../../Library/vector.h \ ../../GUI/sqr.h \ - /home/ardati/anaconda3/include/qt/QtCore/QPointF \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QPointF \ ../../Library/parameter.h \ - /home/ardati/anaconda3/include/qt/QtXml/QtXml \ - /home/ardati/anaconda3/include/qt/QtXml/QtXmlDepends \ - /home/ardati/anaconda3/include/qt/QtXml/qtxmlglobal.h \ - /home/ardati/anaconda3/include/qt/QtXml/qtxml-config.h \ - /home/ardati/anaconda3/include/qt/QtXml/qdom.h \ - /home/ardati/anaconda3/include/qt/QtXml/qxml.h \ - /home/ardati/anaconda3/include/qt/QtXml/qtxmlversion.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml/QtXml \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml/QtXmlDepends \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml/qtxmlglobal.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml/qtxml-config.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml/qdom.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml/qxml.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml/qtxmlversion.h \ ../../Library/cellwallcurve.h \ ../../Library/nodebase.h \ ../../Library/wallelement.h \ ../../Library/wallbase.h \ ../../Library/warning.h \ ../../GUI/wall.h \ - /home/ardati/anaconda3/include/qt/QtWidgets/QGraphicsScene \ - /home/ardati/anaconda3/include/qt/QtWidgets/qgraphicsscene.h \ - /home/ardati/anaconda3/include/qt/QtWidgets/qtwidgetsglobal.h \ - /home/ardati/anaconda3/include/qt/QtWidgets/qtwidgets-config.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtWidgets/QGraphicsScene \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtWidgets/qgraphicsscene.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtWidgets/qtwidgetsglobal.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtWidgets/qtwidgets-config.h \ ../../Library/wallelementinfo.h \ - /home/ardati/anaconda3/include/qt/QtGui/QColor \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QColor \ moc_predefs.h \ - /home/ardati/anaconda3/bin/moc - /home/ardati/anaconda3/bin/moc $(DEFINES) --include /home/ardati/PycharmProjects/VirtualLeaf2021/src/Models/Cambium/moc_predefs.h -I/home/ardati/anaconda3/mkspecs/linux-g++ -I/home/ardati/PycharmProjects/VirtualLeaf2021/src/Models/Cambium -I/home/ardati/PycharmProjects/VirtualLeaf2021/src/Library -I/home/ardati/PycharmProjects/VirtualLeaf2021/src/GUI -I/home/ardati/PycharmProjects/VirtualLeaf2021/include -I/home/ardati/anaconda3/include/qt -I/home/ardati/anaconda3/include/qt/QtWidgets -I/home/ardati/anaconda3/include/qt/QtGui -I/home/ardati/anaconda3/include/qt/QtXml -I/home/ardati/anaconda3/include/qt/QtCore -I/usr/include/c++/11 -I/usr/include/x86_64-linux-gnu/c++/11 -I/usr/include/c++/11/backward -I/usr/lib/gcc/x86_64-linux-gnu/11/include -I/usr/local/include -I/usr/include/x86_64-linux-gnu -I/usr/include cambium.h -o moc_cambium.cpp + /home/rojas/miniconda3/envs/VirtualLeaf-env/bin/moc + /home/rojas/miniconda3/envs/VirtualLeaf-env/bin/moc $(DEFINES) --include /mnt/c/Users/Rojas/PycharmProjects/VirtualLeaf2021/src/models/cambium/moc_predefs.h -I/home/rojas/miniconda3/envs/VirtualLeaf-env/mkspecs/linux-g++ -I/mnt/c/Users/Rojas/PycharmProjects/VirtualLeaf2021/src/models/cambium -I/mnt/c/Users/Rojas/PycharmProjects/VirtualLeaf2021/src/Library -I/mnt/c/Users/Rojas/PycharmProjects/VirtualLeaf2021/src/GUI -I/mnt/c/Users/Rojas/PycharmProjects/VirtualLeaf2021/include -I/home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt -I/home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtWidgets -I/home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui -I/home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml -I/home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore -I/usr/include/c++/13 -I/usr/include/x86_64-linux-gnu/c++/13 -I/usr/include/c++/13/backward -I/usr/lib/gcc/x86_64-linux-gnu/13/include -I/usr/local/include -I/usr/include/x86_64-linux-gnu -I/usr/include cambium.h -o moc_cambium.cpp compiler_moc_objc_header_make_all: compiler_moc_objc_header_clean: @@ -1129,372 +1129,372 @@ compiler_clean: compiler_moc_predefs_clean compiler_moc_header_clean ####### Compile -cambium.o: cambium.cpp /home/ardati/anaconda3/include/qt/QtCore/QObject \ - /home/ardati/anaconda3/include/qt/QtCore/qobject.h \ - /home/ardati/anaconda3/include/qt/QtCore/qobjectdefs.h \ - /home/ardati/anaconda3/include/qt/QtCore/qnamespace.h \ - /home/ardati/anaconda3/include/qt/QtCore/qglobal.h \ - /home/ardati/anaconda3/include/qt/QtCore/qconfig-bootstrapped.h \ - /home/ardati/anaconda3/include/qt/QtCore/qconfig.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtcore-config.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsystemdetection.h \ - /home/ardati/anaconda3/include/qt/QtCore/qprocessordetection.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcompilerdetection.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtypeinfo.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsysinfo.h \ - /home/ardati/anaconda3/include/qt/QtCore/qlogging.h \ - /home/ardati/anaconda3/include/qt/QtCore/qflags.h \ - /home/ardati/anaconda3/include/qt/QtCore/qatomic.h \ - /home/ardati/anaconda3/include/qt/QtCore/qbasicatomic.h \ - /home/ardati/anaconda3/include/qt/QtCore/qatomic_bootstrap.h \ - /home/ardati/anaconda3/include/qt/QtCore/qgenericatomic.h \ - /home/ardati/anaconda3/include/qt/QtCore/qatomic_cxx11.h \ - /home/ardati/anaconda3/include/qt/QtCore/qatomic_msvc.h \ - /home/ardati/anaconda3/include/qt/QtCore/qglobalstatic.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmutex.h \ - /home/ardati/anaconda3/include/qt/QtCore/qnumeric.h \ - /home/ardati/anaconda3/include/qt/QtCore/qversiontagging.h \ - /home/ardati/anaconda3/include/qt/QtCore/qobjectdefs_impl.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstring.h \ - /home/ardati/anaconda3/include/qt/QtCore/qchar.h \ - /home/ardati/anaconda3/include/qt/QtCore/qbytearray.h \ - /home/ardati/anaconda3/include/qt/QtCore/qrefcount.h \ - /home/ardati/anaconda3/include/qt/QtCore/qarraydata.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstringliteral.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstringalgorithms.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstringview.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstringbuilder.h \ - /home/ardati/anaconda3/include/qt/QtCore/qlist.h \ - /home/ardati/anaconda3/include/qt/QtCore/qalgorithms.h \ - /home/ardati/anaconda3/include/qt/QtCore/qiterator.h \ - /home/ardati/anaconda3/include/qt/QtCore/qhashfunctions.h \ - /home/ardati/anaconda3/include/qt/QtCore/qpair.h \ - /home/ardati/anaconda3/include/qt/QtCore/qvector.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcontainertools_impl.h \ - /home/ardati/anaconda3/include/qt/QtCore/qpoint.h \ - /home/ardati/anaconda3/include/qt/QtCore/qbytearraylist.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstringlist.h \ - /home/ardati/anaconda3/include/qt/QtCore/qregexp.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstringmatcher.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcoreevent.h \ - /home/ardati/anaconda3/include/qt/QtCore/qscopedpointer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmetatype.h \ - /home/ardati/anaconda3/include/qt/QtCore/qvarlengtharray.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcontainerfwd.h \ - /home/ardati/anaconda3/include/qt/QtCore/qobject_impl.h \ - /home/ardati/anaconda3/include/qt/QtGui/QtGui \ - /home/ardati/anaconda3/include/qt/QtGui/QtGuiDepends \ - /home/ardati/anaconda3/include/qt/QtCore/QtCore \ - /home/ardati/anaconda3/include/qt/QtCore/QtCoreDepends \ - /home/ardati/anaconda3/include/qt/QtCore/qabstractanimation.h \ - /home/ardati/anaconda3/include/qt/QtCore/qabstracteventdispatcher.h \ - /home/ardati/anaconda3/include/qt/QtCore/qeventloop.h \ - /home/ardati/anaconda3/include/qt/QtCore/qabstractitemmodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qvariant.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmap.h \ - /home/ardati/anaconda3/include/qt/QtCore/qdebug.h \ - /home/ardati/anaconda3/include/qt/QtCore/qhash.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtextstream.h \ - /home/ardati/anaconda3/include/qt/QtCore/qiodevice.h \ - /home/ardati/anaconda3/include/qt/QtCore/qlocale.h \ - /home/ardati/anaconda3/include/qt/QtCore/qshareddata.h \ - /home/ardati/anaconda3/include/qt/QtCore/qset.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcontiguouscache.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsharedpointer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsharedpointer_impl.h \ - /home/ardati/anaconda3/include/qt/QtCore/qabstractnativeeventfilter.h \ - /home/ardati/anaconda3/include/qt/QtCore/qabstractproxymodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qabstractstate.h \ - /home/ardati/anaconda3/include/qt/QtCore/qabstracttransition.h \ - /home/ardati/anaconda3/include/qt/QtCore/qanimationgroup.h \ - /home/ardati/anaconda3/include/qt/QtCore/qarraydataops.h \ - /home/ardati/anaconda3/include/qt/QtCore/qarraydatapointer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qbasictimer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qbitarray.h \ - /home/ardati/anaconda3/include/qt/QtCore/qbuffer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qbytearraymatcher.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcache.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcalendar.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcborarray.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcborvalue.h \ - /home/ardati/anaconda3/include/qt/QtCore/qdatetime.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcborcommon.h \ - /home/ardati/anaconda3/include/qt/QtCore/qregularexpression.h \ - /home/ardati/anaconda3/include/qt/QtCore/qurl.h \ - /home/ardati/anaconda3/include/qt/QtCore/qurlquery.h \ - /home/ardati/anaconda3/include/qt/QtCore/quuid.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcbormap.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcborstream.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcborstreamreader.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfloat16.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcborstreamwriter.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcollator.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcommandlineoption.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcommandlineparser.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcoreapplication.h \ - /home/ardati/anaconda3/include/qt/QtCore/qconcatenatetablesproxymodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qcryptographichash.h \ - /home/ardati/anaconda3/include/qt/QtCore/qdatastream.h \ - /home/ardati/anaconda3/include/qt/QtCore/qdeadlinetimer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qelapsedtimer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qdir.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfileinfo.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfile.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfiledevice.h \ - /home/ardati/anaconda3/include/qt/QtCore/qdiriterator.h \ - /home/ardati/anaconda3/include/qt/QtCore/qeasingcurve.h \ - /home/ardati/anaconda3/include/qt/QtCore/qendian.h \ - /home/ardati/anaconda3/include/qt/QtCore/qeventtransition.h \ - /home/ardati/anaconda3/include/qt/QtCore/qexception.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfactoryinterface.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfileselector.h \ - /home/ardati/anaconda3/include/qt/QtCore/QStringList \ - /home/ardati/anaconda3/include/qt/QtCore/qfilesystemwatcher.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfinalstate.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfuture.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfutureinterface.h \ - /home/ardati/anaconda3/include/qt/QtCore/qrunnable.h \ - /home/ardati/anaconda3/include/qt/QtCore/qresultstore.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfuturesynchronizer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qfuturewatcher.h \ - /home/ardati/anaconda3/include/qt/QtCore/qhistorystate.h \ - /home/ardati/anaconda3/include/qt/QtCore/qidentityproxymodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qisenum.h \ - /home/ardati/anaconda3/include/qt/QtCore/qitemselectionmodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qjsonarray.h \ - /home/ardati/anaconda3/include/qt/QtCore/qjsonvalue.h \ - /home/ardati/anaconda3/include/qt/QtCore/qjsondocument.h \ - /home/ardati/anaconda3/include/qt/QtCore/qjsonobject.h \ - /home/ardati/anaconda3/include/qt/QtCore/qlibrary.h \ - /home/ardati/anaconda3/include/qt/QtCore/qlibraryinfo.h \ - /home/ardati/anaconda3/include/qt/QtCore/qversionnumber.h \ - /home/ardati/anaconda3/include/qt/QtCore/qline.h \ - /home/ardati/anaconda3/include/qt/QtCore/qlinkedlist.h \ - /home/ardati/anaconda3/include/qt/QtCore/qlockfile.h \ - /home/ardati/anaconda3/include/qt/QtCore/qloggingcategory.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmargins.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmath.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmessageauthenticationcode.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmetaobject.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmimedata.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmimedatabase.h \ - /home/ardati/anaconda3/include/qt/QtCore/qmimetype.h \ - /home/ardati/anaconda3/include/qt/QtCore/qobjectcleanuphandler.h \ - /home/ardati/anaconda3/include/qt/QtCore/qoperatingsystemversion.h \ - /home/ardati/anaconda3/include/qt/QtCore/qparallelanimationgroup.h \ - /home/ardati/anaconda3/include/qt/QtCore/qpauseanimation.h \ - /home/ardati/anaconda3/include/qt/QtCore/qplugin.h \ - /home/ardati/anaconda3/include/qt/QtCore/qpointer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qpluginloader.h \ - /home/ardati/anaconda3/include/qt/QtCore/qprocess.h \ - /home/ardati/anaconda3/include/qt/QtCore/qpropertyanimation.h \ - /home/ardati/anaconda3/include/qt/QtCore/qvariantanimation.h \ - /home/ardati/anaconda3/include/qt/QtCore/qqueue.h \ - /home/ardati/anaconda3/include/qt/QtCore/qrandom.h \ - /home/ardati/anaconda3/include/qt/QtCore/qreadwritelock.h \ - /home/ardati/anaconda3/include/qt/QtCore/qrect.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsize.h \ - /home/ardati/anaconda3/include/qt/QtCore/qresource.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsavefile.h \ - /home/ardati/anaconda3/include/qt/QtCore/qscopedvaluerollback.h \ - /home/ardati/anaconda3/include/qt/QtCore/qscopeguard.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsemaphore.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsequentialanimationgroup.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsettings.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsharedmemory.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsignalmapper.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsignaltransition.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsocketnotifier.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsortfilterproxymodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstack.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstandardpaths.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstate.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstatemachine.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstorageinfo.h \ - /home/ardati/anaconda3/include/qt/QtCore/qstringlistmodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qsystemsemaphore.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtemporarydir.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtemporaryfile.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtextboundaryfinder.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtextcodec.h \ - /home/ardati/anaconda3/include/qt/QtCore/qthread.h \ - /home/ardati/anaconda3/include/qt/QtCore/qthreadpool.h \ - /home/ardati/anaconda3/include/qt/QtCore/qthreadstorage.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtimeline.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtimer.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtimezone.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtranslator.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtransposeproxymodel.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtypetraits.h \ - /home/ardati/anaconda3/include/qt/QtCore/qwaitcondition.h \ - /home/ardati/anaconda3/include/qt/QtCore/QDeadlineTimer \ - /home/ardati/anaconda3/include/qt/QtCore/qwineventnotifier.h \ - /home/ardati/anaconda3/include/qt/QtCore/qxmlstream.h \ - /home/ardati/anaconda3/include/qt/QtCore/qtcoreversion.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtguiglobal.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtgui-config.h \ - /home/ardati/anaconda3/include/qt/QtGui/qabstracttextdocumentlayout.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextlayout.h \ - /home/ardati/anaconda3/include/qt/QtGui/qcolor.h \ - /home/ardati/anaconda3/include/qt/QtGui/qrgb.h \ - /home/ardati/anaconda3/include/qt/QtGui/qrgba64.h \ - /home/ardati/anaconda3/include/qt/QtGui/qevent.h \ - /home/ardati/anaconda3/include/qt/QtGui/qwindowdefs.h \ - /home/ardati/anaconda3/include/qt/QtGui/qwindowdefs_win.h \ - /home/ardati/anaconda3/include/qt/QtGui/qregion.h \ - /home/ardati/anaconda3/include/qt/QtGui/qkeysequence.h \ - /home/ardati/anaconda3/include/qt/QtGui/qvector2d.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtouchdevice.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextformat.h \ - /home/ardati/anaconda3/include/qt/QtGui/qfont.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpen.h \ - /home/ardati/anaconda3/include/qt/QtGui/qbrush.h \ - /home/ardati/anaconda3/include/qt/QtGui/qmatrix.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpolygon.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtransform.h \ - /home/ardati/anaconda3/include/qt/QtGui/qimage.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpaintdevice.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpixelformat.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpixmap.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextoption.h \ - /home/ardati/anaconda3/include/qt/QtGui/qglyphrun.h \ - /home/ardati/anaconda3/include/qt/QtGui/qrawfont.h \ - /home/ardati/anaconda3/include/qt/QtGui/qfontdatabase.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextcursor.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextdocument.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpalette.h \ - /home/ardati/anaconda3/include/qt/QtGui/qaccessible.h \ - /home/ardati/anaconda3/include/qt/QtGui/qaccessiblebridge.h \ - /home/ardati/anaconda3/include/qt/QtGui/qaccessibleobject.h \ - /home/ardati/anaconda3/include/qt/QtGui/qaccessibleplugin.h \ - /home/ardati/anaconda3/include/qt/QtGui/qbackingstore.h \ - /home/ardati/anaconda3/include/qt/QtGui/qwindow.h \ - /home/ardati/anaconda3/include/qt/QtCore/QEvent \ - /home/ardati/anaconda3/include/qt/QtCore/QMargins \ - /home/ardati/anaconda3/include/qt/QtCore/QRect \ - /home/ardati/anaconda3/include/qt/QtGui/qsurface.h \ - /home/ardati/anaconda3/include/qt/QtGui/qsurfaceformat.h \ - /home/ardati/anaconda3/include/qt/QtGui/qicon.h \ - /home/ardati/anaconda3/include/qt/QtGui/qcursor.h \ - /home/ardati/anaconda3/include/qt/QtGui/qbitmap.h \ - /home/ardati/anaconda3/include/qt/QtGui/qclipboard.h \ - /home/ardati/anaconda3/include/qt/QtGui/qcolorspace.h \ - /home/ardati/anaconda3/include/qt/QtGui/qcolortransform.h \ - /home/ardati/anaconda3/include/qt/QtGui/qdesktopservices.h \ - /home/ardati/anaconda3/include/qt/QtGui/qdrag.h \ - /home/ardati/anaconda3/include/qt/QtGui/qfontinfo.h \ - /home/ardati/anaconda3/include/qt/QtGui/qfontmetrics.h \ - /home/ardati/anaconda3/include/qt/QtGui/qgenericmatrix.h \ - /home/ardati/anaconda3/include/qt/QtGui/qgenericplugin.h \ - /home/ardati/anaconda3/include/qt/QtGui/qgenericpluginfactory.h \ - /home/ardati/anaconda3/include/qt/QtGui/qguiapplication.h \ - /home/ardati/anaconda3/include/qt/QtGui/qinputmethod.h \ - /home/ardati/anaconda3/include/qt/QtGui/qiconengine.h \ - /home/ardati/anaconda3/include/qt/QtGui/qiconengineplugin.h \ - /home/ardati/anaconda3/include/qt/QtGui/qimageiohandler.h \ - /home/ardati/anaconda3/include/qt/QtGui/qimagereader.h \ - /home/ardati/anaconda3/include/qt/QtGui/qimagewriter.h \ - /home/ardati/anaconda3/include/qt/QtGui/qmatrix4x4.h \ - /home/ardati/anaconda3/include/qt/QtGui/qvector3d.h \ - /home/ardati/anaconda3/include/qt/QtGui/qvector4d.h \ - /home/ardati/anaconda3/include/qt/QtGui/qquaternion.h \ - /home/ardati/anaconda3/include/qt/QtGui/qmovie.h \ - /home/ardati/anaconda3/include/qt/QtGui/qoffscreensurface.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopengl.h \ - /home/ardati/anaconda3/include/qt/QtCore/qt_windows.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopengles2ext.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglext.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglbuffer.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglcontext.h \ - /home/ardati/anaconda3/include/qt/QtCore/QScopedPointer \ - /home/ardati/anaconda3/include/qt/QtGui/QSurfaceFormat \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglversionfunctions.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopengldebug.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglextrafunctions.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglfunctions.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglframebufferobject.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglpaintdevice.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglpixeltransferoptions.h \ - /home/ardati/anaconda3/include/qt/QtCore/QSharedDataPointer \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglshaderprogram.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopengltexture.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopengltextureblitter.h \ - /home/ardati/anaconda3/include/qt/QtGui/QMatrix3x3 \ - /home/ardati/anaconda3/include/qt/QtGui/QMatrix4x4 \ - /home/ardati/anaconda3/include/qt/QtGui/qopengltimerquery.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglvertexarrayobject.h \ - /home/ardati/anaconda3/include/qt/QtGui/qopenglwindow.h \ - /home/ardati/anaconda3/include/qt/QtGui/QPaintDeviceWindow \ - /home/ardati/anaconda3/include/qt/QtGui/qpaintdevicewindow.h \ - /home/ardati/anaconda3/include/qt/QtGui/QWindow \ - /home/ardati/anaconda3/include/qt/QtGui/QPaintDevice \ - /home/ardati/anaconda3/include/qt/QtGui/QOpenGLContext \ - /home/ardati/anaconda3/include/qt/QtGui/QImage \ - /home/ardati/anaconda3/include/qt/QtGui/qpagedpaintdevice.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpagelayout.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpagesize.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpaintengine.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpainter.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpainterpath.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpdfwriter.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpicture.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpictureformatplugin.h \ - /home/ardati/anaconda3/include/qt/QtGui/qpixmapcache.h \ - /home/ardati/anaconda3/include/qt/QtGui/qrasterwindow.h \ - /home/ardati/anaconda3/include/qt/QtGui/qscreen.h \ - /home/ardati/anaconda3/include/qt/QtCore/QList \ - /home/ardati/anaconda3/include/qt/QtCore/QSize \ - /home/ardati/anaconda3/include/qt/QtCore/QSizeF \ - /home/ardati/anaconda3/include/qt/QtGui/QTransform \ - /home/ardati/anaconda3/include/qt/QtGui/qsessionmanager.h \ - /home/ardati/anaconda3/include/qt/QtGui/qstandarditemmodel.h \ - /home/ardati/anaconda3/include/qt/QtGui/qstatictext.h \ - /home/ardati/anaconda3/include/qt/QtGui/qstylehints.h \ - /home/ardati/anaconda3/include/qt/QtGui/qsyntaxhighlighter.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextobject.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextdocumentfragment.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextdocumentwriter.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtextlist.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtexttable.h \ - /home/ardati/anaconda3/include/qt/QtGui/qvalidator.h \ - /home/ardati/anaconda3/include/qt/QtGui/qtguiversion.h \ +cambium.o: cambium.cpp /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QObject \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qobject.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qobjectdefs.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qnamespace.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qglobal.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qconfig-bootstrapped.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qconfig.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtcore-config.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsystemdetection.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qprocessordetection.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcompilerdetection.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtypeinfo.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsysinfo.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qlogging.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qflags.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qatomic.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qbasicatomic.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qatomic_bootstrap.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qgenericatomic.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qatomic_cxx11.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qatomic_msvc.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qglobalstatic.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmutex.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qnumeric.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qversiontagging.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qobjectdefs_impl.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstring.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qchar.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qbytearray.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qrefcount.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qarraydata.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstringliteral.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstringalgorithms.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstringview.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstringbuilder.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qlist.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qalgorithms.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qiterator.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qhashfunctions.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qpair.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qvector.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcontainertools_impl.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qpoint.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qbytearraylist.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstringlist.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qregexp.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstringmatcher.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcoreevent.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qscopedpointer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmetatype.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qvarlengtharray.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcontainerfwd.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qobject_impl.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QtGui \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QtGuiDepends \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QtCore \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QtCoreDepends \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qabstractanimation.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qabstracteventdispatcher.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qeventloop.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qabstractitemmodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qvariant.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmap.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qdebug.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qhash.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtextstream.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qiodevice.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qlocale.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qshareddata.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qset.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcontiguouscache.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsharedpointer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsharedpointer_impl.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qabstractnativeeventfilter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qabstractproxymodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qabstractstate.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qabstracttransition.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qanimationgroup.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qarraydataops.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qarraydatapointer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qbasictimer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qbitarray.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qbuffer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qbytearraymatcher.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcache.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcalendar.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcborarray.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcborvalue.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qdatetime.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcborcommon.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qregularexpression.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qurl.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qurlquery.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/quuid.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcbormap.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcborstream.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcborstreamreader.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfloat16.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcborstreamwriter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcollator.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcommandlineoption.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcommandlineparser.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcoreapplication.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qconcatenatetablesproxymodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qcryptographichash.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qdatastream.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qdeadlinetimer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qelapsedtimer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qdir.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfileinfo.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfile.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfiledevice.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qdiriterator.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qeasingcurve.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qendian.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qeventtransition.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qexception.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfactoryinterface.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfileselector.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QStringList \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfilesystemwatcher.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfinalstate.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfuture.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfutureinterface.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qrunnable.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qresultstore.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfuturesynchronizer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qfuturewatcher.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qhistorystate.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qidentityproxymodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qisenum.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qitemselectionmodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qjsonarray.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qjsonvalue.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qjsondocument.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qjsonobject.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qlibrary.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qlibraryinfo.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qversionnumber.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qline.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qlinkedlist.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qlockfile.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qloggingcategory.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmargins.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmath.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmessageauthenticationcode.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmetaobject.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmimedata.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmimedatabase.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qmimetype.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qobjectcleanuphandler.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qoperatingsystemversion.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qparallelanimationgroup.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qpauseanimation.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qplugin.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qpointer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qpluginloader.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qprocess.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qpropertyanimation.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qvariantanimation.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qqueue.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qrandom.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qreadwritelock.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qrect.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsize.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qresource.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsavefile.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qscopedvaluerollback.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qscopeguard.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsemaphore.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsequentialanimationgroup.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsettings.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsharedmemory.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsignalmapper.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsignaltransition.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsocketnotifier.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsortfilterproxymodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstack.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstandardpaths.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstate.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstatemachine.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstorageinfo.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qstringlistmodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qsystemsemaphore.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtemporarydir.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtemporaryfile.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtextboundaryfinder.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtextcodec.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qthread.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qthreadpool.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qthreadstorage.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtimeline.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtimer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtimezone.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtranslator.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtransposeproxymodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtypetraits.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qwaitcondition.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QDeadlineTimer \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qwineventnotifier.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qxmlstream.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qtcoreversion.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtguiglobal.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtgui-config.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qabstracttextdocumentlayout.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextlayout.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qcolor.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qrgb.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qrgba64.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qevent.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qwindowdefs.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qwindowdefs_win.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qregion.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qkeysequence.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qvector2d.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtouchdevice.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextformat.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qfont.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpen.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qbrush.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qmatrix.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpolygon.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtransform.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qimage.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpaintdevice.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpixelformat.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpixmap.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextoption.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qglyphrun.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qrawfont.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qfontdatabase.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextcursor.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextdocument.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpalette.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qaccessible.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qaccessiblebridge.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qaccessibleobject.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qaccessibleplugin.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qbackingstore.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qwindow.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QEvent \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QMargins \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QRect \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qsurface.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qsurfaceformat.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qicon.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qcursor.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qbitmap.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qclipboard.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qcolorspace.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qcolortransform.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qdesktopservices.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qdrag.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qfontinfo.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qfontmetrics.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qgenericmatrix.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qgenericplugin.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qgenericpluginfactory.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qguiapplication.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qinputmethod.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qiconengine.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qiconengineplugin.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qimageiohandler.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qimagereader.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qimagewriter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qmatrix4x4.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qvector3d.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qvector4d.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qquaternion.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qmovie.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qoffscreensurface.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopengl.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/qt_windows.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopengles2ext.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglext.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglbuffer.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglcontext.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QScopedPointer \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QSurfaceFormat \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglversionfunctions.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopengldebug.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglextrafunctions.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglfunctions.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglframebufferobject.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglpaintdevice.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglpixeltransferoptions.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QSharedDataPointer \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglshaderprogram.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopengltexture.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopengltextureblitter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QMatrix3x3 \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QMatrix4x4 \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopengltimerquery.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglvertexarrayobject.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qopenglwindow.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QPaintDeviceWindow \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpaintdevicewindow.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QWindow \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QPaintDevice \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QOpenGLContext \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QImage \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpagedpaintdevice.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpagelayout.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpagesize.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpaintengine.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpainter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpainterpath.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpdfwriter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpicture.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpictureformatplugin.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qpixmapcache.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qrasterwindow.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qscreen.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QList \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QSize \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QSizeF \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QTransform \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qsessionmanager.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qstandarditemmodel.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qstatictext.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qstylehints.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qsyntaxhighlighter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextobject.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextdocumentfragment.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextdocumentwriter.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtextlist.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtexttable.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qvalidator.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/qtguiversion.h \ ../../Library/parameter.h \ ../../Library/vector.h \ ../../GUI/sqr.h \ - /home/ardati/anaconda3/include/qt/QtCore/QPointF \ - /home/ardati/anaconda3/include/qt/QtXml/QtXml \ - /home/ardati/anaconda3/include/qt/QtXml/QtXmlDepends \ - /home/ardati/anaconda3/include/qt/QtXml/qtxmlglobal.h \ - /home/ardati/anaconda3/include/qt/QtXml/qtxml-config.h \ - /home/ardati/anaconda3/include/qt/QtXml/qdom.h \ - /home/ardati/anaconda3/include/qt/QtXml/qxml.h \ - /home/ardati/anaconda3/include/qt/QtXml/qtxmlversion.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QPointF \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml/QtXml \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml/QtXmlDepends \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml/qtxmlglobal.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml/qtxml-config.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml/qdom.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml/qxml.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtXml/qtxmlversion.h \ ../../Library/wallbase.h \ ../../Library/cellbase.h \ - /home/ardati/anaconda3/include/qt/QtCore/QString \ - /home/ardati/anaconda3/include/qt/QtCore/QDebug \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QString \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QDebug \ ../../Library/cellwallcurve.h \ ../../Library/nodebase.h \ ../../Library/wallelement.h \ ../../Library/warning.h \ ../../GUI/wall.h \ - /home/ardati/anaconda3/include/qt/QtWidgets/QGraphicsScene \ - /home/ardati/anaconda3/include/qt/QtWidgets/qgraphicsscene.h \ - /home/ardati/anaconda3/include/qt/QtWidgets/qtwidgetsglobal.h \ - /home/ardati/anaconda3/include/qt/QtWidgets/qtwidgets-config.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtWidgets/QGraphicsScene \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtWidgets/qgraphicsscene.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtWidgets/qtwidgetsglobal.h \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtWidgets/qtwidgets-config.h \ ../../Library/wallelementinfo.h \ cambium.h \ ../../Library/simplugin.h \ - /home/ardati/anaconda3/include/qt/QtCore/QtPlugin \ - /home/ardati/anaconda3/include/qt/QtCore/QMetaType \ - /home/ardati/anaconda3/include/qt/QtGui/QColor \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QtPlugin \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QMetaType \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QColor \ ../../GUI/node.h \ ../../Library/random.h \ ../../GUI/cell.h \ ../../GUI/Neighbor.h \ - /home/ardati/anaconda3/include/qt/QtGui/QMouseEvent \ + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtGui/QMouseEvent \ ../../GUI/modelelement.h \ - /home/ardati/anaconda3/include/qt/QtCore/QVector + /home/rojas/miniconda3/envs/VirtualLeaf-env/include/qt/QtCore/QVector $(CXX) -c $(CXXFLAGS) $(INCPATH) -o cambium.o cambium.cpp moc_cambium.o: moc_cambium.cpp diff --git a/src/Models/Cambium/cambium.h b/src/Models/Cambium/cambium.h index e512d3d5..dbfc7e2a 100755 --- a/src/Models/Cambium/cambium.h +++ b/src/Models/Cambium/cambium.h @@ -62,7 +62,7 @@ class cambium : public QObject, SimPluginInterface { virtual void SetCellColor(CellBase *c, QColor *color); // return number of chemicals virtual int NChem(void); - virtual QString DefaultLeafML(void) { return QString("cambium.xml"); } + virtual QString DefaultLeafML(void) { return QString("cambium.XML"); } virtual void SetCellTypeProperties(CellBase *c); From 3ef74536fbb6e3a1c1fdea4cf7756a2272aeb5e9 Mon Sep 17 00:00:00 2001 From: Rojas Date: Fri, 16 May 2025 19:08:22 +0200 Subject: [PATCH 2/8] creation XMLi --- .idea/VirtualLeaf2021.iml | 7 + .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 7 + .../shelved.patch | 15135 ++++++++++++++++ ...e_Update_at_13_05_2025_13_42__Changes_.xml | 4 + .idea/vcs.xml | 6 + .idea/workspace.xml | 336 + Change_XML.py | 2 +- Creating Cambium XML.py | 566 + Ncouches cambium.py | 409 + data/leaves/cambium.xml | 2 +- data/leaves/cambium_new.xml | 1906 ++ empty_XML_VirtualLeaf.py | 183 + src/GUI/cell.h | 2 +- src/Models/Cambium/cambium.cpp | 6 +- structure_n_cercles.xml | 807 + structure_trois_cercles.xml | 1007 + structure_vierge.xml | 197 + virtualleaf_xml_model.py | 17 +- 19 files changed, 20596 insertions(+), 9 deletions(-) create mode 100644 .idea/VirtualLeaf2021.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/shelf/Uncommitted_changes_before_Update_at_13_05_2025_13_42_[Changes]/shelved.patch create mode 100644 .idea/shelf/Uncommitted_changes_before_Update_at_13_05_2025_13_42__Changes_.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 Creating Cambium XML.py create mode 100644 Ncouches cambium.py create mode 100644 data/leaves/cambium_new.xml create mode 100644 empty_XML_VirtualLeaf.py create mode 100644 structure_n_cercles.xml create mode 100644 structure_trois_cercles.xml create mode 100644 structure_vierge.xml diff --git a/.idea/VirtualLeaf2021.iml b/.idea/VirtualLeaf2021.iml new file mode 100644 index 00000000..0365a06b --- /dev/null +++ b/.idea/VirtualLeaf2021.iml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..105ce2da --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..f90ed85b --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/shelf/Uncommitted_changes_before_Update_at_13_05_2025_13_42_[Changes]/shelved.patch b/.idea/shelf/Uncommitted_changes_before_Update_at_13_05_2025_13_42_[Changes]/shelved.patch new file mode 100644 index 00000000..ea8226e7 --- /dev/null +++ b/.idea/shelf/Uncommitted_changes_before_Update_at_13_05_2025_13_42_[Changes]/shelved.patch @@ -0,0 +1,15135 @@ +Index: src/GUI/mesh.cpp +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP +<+>/*\n *\n * This file is part of the Virtual Leaf.\n *\n * VirtualLeaf is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * VirtualLeaf is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with the Virtual Leaf. If not, see .\n *\n * Copyright 2010 Roeland Merks.\n *\n */\n\n#include \n#include \n#include \n#include \n#include \n//#include \n#include \n#include \n#include \n#include \n#include \n#include \"mesh.h\"\n#include \"tiny.h\"\n#include \"parameter.h\"\n#include \"random.h\"\n#include \"pi.h\"\n#include \"parse.h\"\n#include \"matrix.h\"\n#include \"sqr.h\"\n#include \"nodeset.h\"\n#include \"nodeitem.h\"\n#include \"simplugin.h\"\n#include \"forwardeuler.h\"\n\n#include \n#include \n#include \n#include \n#include \n\nstatic const std::string _module_id(\"$Id$\");\n\nextern Parameter par;\n\nvoid Mesh::AddNodeToCellAtIndex(Cell *c, Node *n, Node *nb1, Node *nb2, list::iterator ins_pos) {\n c->nodes.insert(ins_pos, n); \n n->owners.push_back( Neighbor(c, nb1, nb2 ) );\n}\n\n\nvoid Mesh::AddNodeToCell(Cell *c, Node *n, Node *nb1, Node *nb2) {\n\n c->nodes.push_back( n );\n n->owners.push_back( Neighbor(c, nb1, nb2 ) );\n}\n\nvoid Mesh::PerturbChem(int chemnum, double range) {\n\n for (vector::iterator i=cells.begin(); i!=cells.end(); i++) {\n (*i)->chem[chemnum] += range*(RANDOM()-0.5);\n if ((*i)->chem[chemnum]<0.) (*i)->chem[chemnum]=0.;\n }\n}\n\nvoid Mesh::CellFiles(const Vector ll, const Vector ur) {\n\n Cell *cell = RectangularCell(ll,ur,0.001); \n\n for (int c=0;cSetChemical(c,par.initval[c]);\n }\n\n cell->SetTargetArea(cell->CalcArea());\n\n Vector axis(1,0,0);\n\n // divide rectangle a number of times\n for (int i=0;i<6;i++) {\n IncreaseCellCapacityIfNecessary();\n\n vector current_cells = cells;\n for (vector::iterator j=current_cells.begin(); j!=current_cells.end();j++) {\n (*j)->DivideOverAxis(axis);\n }\n axis=axis.Perp2D();\n\n }\n\n IncreaseCellCapacityIfNecessary();\n\n axis=axis.Perp2D();\n\n vector current_cells = cells;\n for (vector::iterator j=current_cells.begin(); j!=current_cells.end();j++) {\n (*j)->DivideOverAxis(axis);\n }\n\n\n double sum_l=0; int n_l=0;\n for (list::const_iterator i=cell->nodes.begin(); i!=cell->nodes.end(); i++) {\n list::const_iterator nb=i; nb++; \n if (nb==cell->nodes.end()) \n nb=cell->nodes.begin();\n\n double l = (**nb-**i).Norm();\n\n sum_l += l;\n n_l++;\n\n }\n\n\n Node::target_length = sum_l/(double)n_l;\n // a bit more tension\n Node::target_length/=4.;\n\n SetBaseArea();\n}\n\nCell *Mesh::RectangularCell(const Vector ll, const Vector ur, double rotation) {\n\n Cell *cell=AddCell(new Cell());\n cell->m=this;\n\n Matrix rotmat;\n rotmat.Rot2D(rotation); // rotation over 0,0\n\n Node *n1=AddNode(new Node(rotmat * ll));\n Node *n2=AddNode(new Node(rotmat * Vector(ll.x, ur.y,0)));\n Node *n3=AddNode(new Node(rotmat * ur));\n Node *n4=AddNode(new Node(rotmat * Vector(ur.x, ll.y,0)));\n\n n1->boundary=true;\n n2->boundary=true;\n n3->boundary=true;\n n4->boundary=true;\n\n //n1.fixed=n2.fixed=n3.fixed=n4.fixed=true;\n\n AddNodeToCell(cell, n4, \n\t\tn1,\n\t\tn3);\n\n AddNodeToCell(cell, n3, \n\t\tn4,\n\t\tn2);\n\n AddNodeToCell(cell, n2, \n\t\tn3,\n\t\tn1);\n\n AddNodeToCell(cell, n1, \n\t\tn2,\n\t\tn4);\n\n\n AddNodeToCell(boundary_polygon, n4, \n\t\tn1,\n\t\tn3);\n AddNodeToCell(boundary_polygon, n3, \n\t\tn4,\n\t\tn2);\n AddNodeToCell(boundary_polygon, n2, \n\t\tn3,\n\t\tn1);\n AddNodeToCell(boundary_polygon, n1, \n\t\tn2,\n\t\tn4);\n\n cell->setCellVec(Vector(0,1,0));\n\n boundary_polygon->m = this;\n boundary_polygon->area = 0;\n\n cell->area = cell->CalcArea();\n // target length is the length of the elements\n\n Node::target_length = ur.y-ll.y;\n // a bit more tension\n Node::target_length/=2;\n\n cell->SetIntegrals(); \n cell->ConstructNeighborList();\n\n return cell;\n}\n\nCell &Mesh::EllipticCell(double xc, double yc, double ra, double rb, int nnodes, double rotation) {\n\n int first_node=Node::nnodes;\n // nodes.reserve(nodes.size()+nnodes);\n\n\n //cells.push_back(Cell(xc,yc));\n Cell *c=AddCell(new Cell(xc,yc));\n c->m=this;\n\n for (int i=0;iboundary = true;\n\n } \n\n for (int i=0;im = this;\n boundary_polygon->area = 0;\n\n c->area = c->CalcArea();\n // target length is the length of the elements\n\n Node::target_length = (2 * ((ra +rb)/2.) * sin (Pi/nnodes));\n // a bit more tension\n Node::target_length/=2;\n\n c->SetIntegrals(); \n c->at_boundary=true;\n\n return *c;\n}\n\nCell &Mesh::LeafPrimordium(int nnodes, double pet_length) {\n\n // first leaf cell\n\n int first_node=Node::nnodes;\n\n Cell *circle=AddCell(new Cell(0,0));\n circle->m=this;\n const double ra=10, rb=10;\n const double xc=0,yc=0;\n const double rotation=0;\n for (int i=0;i 1.25*Pi && angle < 1.75*Pi ) {\n n.sam = true;\n }*/\n\n AddNodeToCell(circle,\n\t\t n,\n\t\t nodes[first_node+ (nnodes+i-1)%nnodes],\n\t\t nodes[first_node+ (i + 1)%nnodes]);\n\n }\n\n boundary_polygon->m = this;\n boundary_polygon->area = 0;\n\n circle->area = circle->CalcArea();\n // target length is the length of the elements\n\n Node::target_length = (2 * ((ra +rb)/2.) * sin (Pi/nnodes));\n // a bit more tension\n Node::target_length/=2;\n\n circle->SetIntegrals(); \n\n //return c;\n\n circle->SetTargetArea(2*circle->Area());\n\n // Petiole: starts at both sides of the circular cell\n // get position of the (n/4)'th and (3*(n/4))'th node.\n\n list::reverse_iterator it_n1=circle->nodes.rbegin();\n for (int i=0; i::reverse_iterator it_n2=--circle->nodes.rend();\n\n Cell *petiole=AddCell(new Cell());\n\n Node *n1 = *it_n1;\n Node *n2 = *it_n2;\n\n Node *n3=AddNode( new Node ( *n2 + Vector( 0, pet_length, 0) ) );\n Node *n4=AddNode( new Node ( *n1 + Vector( 0, pet_length, 0) ) );\n\n n3->boundary=true;\n n4->boundary=true;\n\n AddNodeToCell(petiole, *it_n1, \n\t\tn4,\n\t\tnodes[(*it_n2)->Index() \n\t\t + (( (*it_n1)->Index() - (*it_n2)->Index() )-1+nnodes)%nnodes]);\n\n\n\n list::reverse_iterator i=it_n1; i++;\n for (; i!=it_n2; ++i) {\n AddNodeToCell(petiole, *i,\n\t\t nodes[(*it_n2)->Index() + (((*i)->Index()-(*it_n2)->Index()) + 1)%nnodes],\n\t\t nodes[(*it_n2)->Index() + (((*i)->Index()-(*it_n2)->Index())-1+nnodes)%nnodes]);\n }\n\n AddNodeToCell(petiole, *it_n2, *it_n2 + 1, n3);\n\n (*it_n2)->boundary=true;\n\n AddNodeToCell(petiole, n3, n2, n4);\n AddNodeToCell(petiole, n4, n3, n1);\n\n\n#ifdef QDEBUG \n qDebug() << circle << endl;\n qDebug() << petiole << endl;\n#endif\n\n AddNodeToCell(boundary_polygon, *it_n1, n4, *it_n2 + ((*it_n1-*it_n2)+1)%nnodes); // is this gonna work?\n\n (*it_n1)->boundary=true;\n\n for (int i=0;iowners.size()==1) {\n AddNodeToCell(boundary_polygon,\n\t\t nodes[first_node +i],\n\t\t nodes[first_node+ (nnodes+i-1)%nnodes],\n\t\t nodes[first_node+ (i + 1)%nnodes]);\n\n nodes[first_node+i]->boundary=true;\n }\n }\n\n AddNodeToCell(boundary_polygon, *it_n2, nodes[(nnodes+(*it_n2)->Index() - 1)%nnodes], n3);\n AddNodeToCell(boundary_polygon, n3, n2, n4);\n AddNodeToCell(boundary_polygon, n4, n3, n1);\n\n // make petiole solid\n for (list::iterator i=petiole->nodes.begin(); i!=petiole->nodes.end(); i++) {\n (*i)->Fix();\n }\n petiole->Fix();\n\n petiole->area=petiole->CalcArea();\n petiole->target_area=petiole->area; \n petiole->ConstructNeighborList();\n circle->ConstructNeighborList();\n boundary_polygon->ConstructConnections();\n boundary_polygon->ConstructNeighborList();\n\n circle->setCellVec(Vector(0,1,0));\n\n return *circle;\n}\n\n/*Cell &Mesh::Box() {\n }*/\n\n\n// return bounding box of mesh\nvoid Mesh::BoundingBox(Vector &LowerLeft, Vector &UpperRight) {\n\n LowerLeft = **nodes.begin();\n UpperRight = **nodes.begin();\n for (vector::iterator c=nodes.begin(); c!=nodes.end(); c++) {\n if ((*c)->x < LowerLeft.x)\n LowerLeft.x = (*c)->x;\n if ((*c)->y < LowerLeft.y)\n LowerLeft.y = (*c)->y;\n if ((*c)->z < LowerLeft.z)\n LowerLeft.z = (*c)->z;\n if ((*c)->x > UpperRight.x) \n UpperRight.x = (*c)->x;\n if ((*c)->y > UpperRight.y) \n UpperRight.y = (*c)->y;\n if ((*c)->z > UpperRight.z)\n UpperRight.z = (*c)->z;\n }\n}\n\n\ndouble Mesh::Area(void) {\n\n double area=0;\n vector::iterator i=cells.begin();\n while (i != cells.end()) {\n area += (*(i++))->Area();\n }\n return area;\n}\n\nvoid Mesh::SetBaseArea(void) {\n\n // Set base area to mean area. \n // This method is typically called during initiation, after\n // defining the first cell\n Cell::BaseArea() = Area()/cells.size();\n}\n\n// for optimization, we moved Displace to Mesh\n\nclass DeltaIntgrl {\n\npublic:\n double area;\n double ix, iy;\n double ixx,ixy,iyy;\n DeltaIntgrl(double sarea,double six,double siy,double sixx,double sixy,double siyy) {\n area=sarea;\n ix=six;\n iy=siy;\n ixx=sixx;\n ixy=sixy;\n iyy=siyy;\n }\n};\n\nvoid Mesh::Clear(void) {\n\n // clear nodes\n for (vector::iterator i=nodes.begin(); i!=nodes.end(); i++) {\n delete *i;\n }\n\n nodes.clear();\n Node::nnodes=0;\n\n node_insertion_queue.clear();\n // Clear NodeSets\n for (vector::iterator i=node_sets.begin(); i!=node_sets.end(); i++) {\n delete *i;\n }\n\n node_sets.clear();\n time = 0;\n\n // clear cells\n\n for (vector::iterator i=cells.begin(); i!=cells.end(); i++) {\n delete *i;\n }\n\n cells.clear();\n Cell::NCells() = 0;\n\n if (boundary_polygon) {\n delete boundary_polygon;\n boundary_polygon=0;\n }\n\n // Clear walls\n for (list::iterator i=walls.begin(); i!=walls.end(); i++) {\n delete *i;\n }\n\n walls.clear();\n WallBase::nwalls = 0;\n //tmp_walls->clear();\n\n shuffled_cells.clear();\n shuffled_nodes.clear();\n \n#ifdef QDEBUG\n qDebug() << \"cells.size() = \" << cells.size() << endl;\n qDebug() << \"walls.size() = \" << walls.size() << endl;\n qDebug() << \"nodes.size() = \" << nodes.size() << endl;\n#endif\n}\n\ndouble Mesh::CellSpecificStiffnessOneSide(Node *nb,set &nodeown) {\n // determines the list of cells belonging to the node and its neighbors\n set nb1own;\n vector intersection_no_nb1;\n for (list::iterator c=nb->owners.begin(); c!=nb->owners.end(); c++) {\n nb1own.insert(c->cell->Index());\n }\n set_intersection(nodeown.begin(), nodeown.end(), nb1own.begin(), nb1own.end(), back_inserter(intersection_no_nb1));\n\n\tdouble cell_w=0.;\n // uses the cell specific stiffness values to calculate length_dh as introduced in Lebovka et al\n for (list::iterator c=nb->owners.begin(); c!=nb->owners.end(); c++) {\n if (std::find(intersection_no_nb1.begin(), intersection_no_nb1.end(), c->cell->Index()) != intersection_no_nb1.end()) {\n \t cell_w += (c->cell->Index() !=-1?c->cell->GetWallStiffness():par.rel_perimeter_stiffness);\n }\n if (std::isnan(cell_w)) {\n \t break;\n }\n }\n return cell_w;\n}\nvoid Mesh::updateAreasOfCells(list * delta_intgrl_list,Node * node) {\n\n\t// update areas of cells\n\tlist::const_iterator di_it = delta_intgrl_list->begin();\n\tfor (list::iterator cit=node->owners.begin(); cit!=node->owners.end(); ( cit++) ) {\n\t if (!cit->cell->BoundaryPolP()) {\n\t cit->cell->area -= di_it->area;\n\t if (par.lambda_celllength) {\n\t\tcit->cell->intgrl_x -= di_it->ix;\n\t\tcit->cell->intgrl_y -= di_it->iy;\n\t\tcit->cell->intgrl_xx -= di_it->ixx;\n\t\tcit->cell->intgrl_xy -= di_it->ixy;\n\t\tcit->cell->intgrl_yy -= di_it->iyy;\n\t }\n\t di_it++;\n\t }\n\t}\n}\n\nCellBase * Mesh::getOtherCell(CellBase* c,Node* node1,Node * node2) {\n for (list::iterator nb1=node1->owners.begin(); nb1!=node1->owners.end(); nb1++) {\n \tif (nb1->getCell() != c) {\n \t\tfor (list::iterator nb2=node2->owners.begin(); nb2!=node2->owners.end(); nb2++) {\n \t\tif (nb1->getCell() == nb2->getCell()){\n \t\t\treturn nb1->getCell();\n \t\t}\n \t}\n \t}\n }\n return NULL;\n}\n\nint debugNode = -1;\n\ndouble cross(const Vector & v1, const Vector & v2)\n{\n return (v1.x*v2.y) - (v1.y*v2.x);\n}\n\n\ndouble b_cocient(const Vector& AC, const Vector& AB,const Vector& ACperp, const Vector& ABperp) {\n\tdouble b=((AC.x-AB.x)/ABperp.x + ((AB.y-AC.y)/ACperp.y)*(ACperp.x/ABperp.x))*((ACperp.y*ABperp.x)/(ACperp.y*ABperp.x-ABperp.y*ACperp.x));\n\treturn b;\n}\n\n//http://dx.doi.org/10.1016/j.cis.2014.01.018\n// radius of circle with center on line B-C and connecting at norm of the lines (A-B ode A-C)\n// and sharing one point with the other line. This we define the kissing circle\ndouble osculating_circle_radius(const Vector& B, const Vector& A, const Vector& C) {\n\tVector AC = (C-A).Normalised();\n\tVector AB = (B-A).Normalised();\n\n\tVector ACpoint = A+AC;\n\tVector ABpoint = A+AB;\n\tVector ACperp = AC.Perp2D();\n\tVector ABperp = AB.Perp2D();\n//\tdouble b_new = b_cocient(ACpoint,ABpoint,ACperp,ABperp);\n\tdouble a_new = b_cocient(ABpoint,ACpoint,ABperp,ACperp);\n\n\tVector AM1=ACpoint+ACperp*a_new;\n//\tVector AM2=ABpoint+ABperp*b_new;\n\n\tdouble r1 = (ACpoint-AM1).Norm();\n//\tdouble r2 = (ABpoint-AM1).Norm();\n// commented lines as check if r1==r2\n\treturn r1;\n\n}\n\nbool Mesh::findOtherSide(CellBase * c,Node * z1,Node * z2,Node ** w0,Node ** w1,Node ** w2,Node ** w3) {\n\tlist ::iterator i=c->nodes.begin();\n\t* w0=*i;\n\t* w1=*(++i);\n\t* w2=*(++i);\n\t* w3=*(++i);\n\tNode * o0=*w0;\n\tNode * o1=*w1;\n\tNode * o2=*w2;\n\twhile (i!=c->nodes.end()) {\n\t\tif ((*w1==z1 && *w2==z2)||(*w2==z1 && *w1==z2)) {\n\t\t\treturn true;\n\t\t}\n\t *w0=*w1;\n\t *w1=*w2;\n\t *w2=*w3;\n\t *w3=*(++i);\n\t}\n\t*w3=o0;\n\tif((*w1==z1 && *w2==z2)||(*w2==z1 && *w1==z2)) {\n\t\treturn true;\n\t}\n\t*w0=*w1;\n\t*w1=*w2;\n\t*w2=*w3;\n\t*w3=o1;\n\tif((*w1==z1 && *w2==z2)||(*w2==z1 && *w1==z2)) {\n\t\treturn true;\n\t}\n\t*w0=*w1;\n\t*w1=*w2;\n\t*w2=*w3;\n\t*w3=o2;\n\tif((*w1==z1 && *w2==z2)||(*w2==z1 && *w1==z2)) {\n\t\treturn true;\n\t}\n\t*w0=NULL;\n\t*w1=NULL;\n\t*w2=NULL;\n\t*w3=NULL;\n\treturn false;\n}\ndouble lambda_for_shift=0.1;\n\ndouble getBaseLength(CellBase* c,NodeBase* n1, NodeBase * n2,double elastic_limit) {\n\tWallElement* wallElement = n1->getWallElement(c);\n\tif (wallElement == NULL) {\n\t\treturn ((*n1)-(*n2)).Norm()/elastic_limit;\n\t}else {\n\t\tdouble base_length = wallElement->getBaseLength();\n\t\tif (std::isnan(base_length)) {\n\t\t\treturn ((*n1)-(*n2)).Norm()/elastic_limit;\n\t\t}\n\t\treturn base_length;\n\t}\n}\n\ndouble getStiffness(CellBase* c,NodeBase* n1) {\n\tWallElement* wallElement = n1->getWallElement(c);\n\tif (wallElement == NULL) {\n\t\treturn c->GetWallStiffness();\n\t}else {\n\t\tdouble stiffness = wallElement->getStiffness();\n\t\tif (std::isnan(stiffness)) {\n\t\t\treturn c->GetWallStiffness();\n\t\t}\n\t\treturn stiffness;\n\t}\n}\n\nvoid Mesh::RemodelWallElement(vector & curves,CellBase* c,Node* w0,Node* w1,Node* w2,Node* w3,Node* w4) {\n\n\tNode * o0;\n\tNode * o1;\n\tNode * o2;\n\tNode * o3;\n\tdouble angle = (*w1-*w2).SignedAngle((*w3-*w2));\n\tif ((angle>0&&c->BoundaryPolP())||(angle<0&&!c->BoundaryPolP())) {\n\t\t//we would bend inward and intersect cells\n\t\treturn;\n\t}\n\n\tCellBase* c2 = getOtherCell(c,w1,w2);\n if (c2 != NULL && !(c2->GetCellVeto()) && findOtherSide(c2,w2,w1,&o0,&o1,&o2,&o3)){\n\n\n//now check how profitable the move of wall element w1-w2 to w1-w3\n//this changes also cell c2 where wall element o1->o2 will be replaced\n//by wall elements o1->w3 and w3->o2 all other surrounding cells will remain\n//unchanged.\n\t\tdouble bending_dh = 0.;\n\t\tif (abs(par.bend_lambda) > 0.01)\t {\n\t// angles that are before w0-w1-w2/w1-w2-w3/w2-w3-w4 and o0-o1-o2/o1-o2-o3\n\t// angles after move w0-w1-w3/w1-w3-w4 and o0-o1-w3/o1-w3-o2/w3-o2-o3\n\t\t\tdouble r1 = osculating_circle_radius(*w0,*w1,*w2);\n\t\t\tdouble r2 = osculating_circle_radius(*w1,*w2,*w3);\n\t\t\tdouble r3 = osculating_circle_radius(*w2,*w3,*w4);\n\t\t\tdouble r4 = osculating_circle_radius(*w0,*w1,*w3);\n\t\t\tdouble r5 = osculating_circle_radius(*w1,*w3,*w4);\n\t\t\tdouble energy_before =\n\t\t\t\t\t1./(r1)+\n\t\t\t\t\t1./(r2)+\n\t\t\t\t\t1./(r3)+\n\t\t\t\t\t1./((osculating_circle_radius(*o0,*o1,*o2)))+\n\t\t\t\t\t1./((osculating_circle_radius(*o1,*o2,*o3)));\n\t\t\tdouble energy_after =\n\t\t\t\t\t1./(r4)+\n\t\t\t\t\t1./((osculating_circle_radius(*o1,*w3,*o2)))+\n\t\t\t\t\t1./(r5)+\n\t\t\t\t\t1./((osculating_circle_radius(*o0,*o1,*w3)))+\n\t\t\t\t\t1./((osculating_circle_radius(*w3,*o2,*o3)));\n\t\t\tbending_dh = par.bend_lambda*(energy_after-energy_before*1.5+12.);\n\t\t}\n\t\t// the length contraint just needs to be calculated for the wall elements that change length\n\t\tdouble wl1=((*w1)-(*w2)).Norm();\n\t\tdouble wl2=((*w3)-(*w2)).Norm();\n\t\tdouble wl3=((*w1)-(*w3)).Norm();\n\t\tdouble s_bef = wl1;\n\t\tdouble s_aft = wl3+wl2;\n\n\t\tdouble r_bef = wl1+wl2;\n\t\tdouble r_aft = wl3;\n\n\t\tdouble length_before = wl1+wl2+wl1;\n\n\t\tdouble stiffness = (\n\t\t\t\tgetStiffness(c, w1)*wl1+\n\t\t\t\tgetStiffness(c, w2)*wl2+\n\t\t\t\tgetStiffness(c2, o2)*wl1\n\t\t\t\t) / length_before;\n\n\t\tdouble s_base = getBaseLength(c2, w1, w2,this->elastic_limit);\n\t\tdouble r_base = getBaseLength(c, w1, w2,this->elastic_limit) + getBaseLength(c2, w2, w3,this->elastic_limit);\n\n\t\tdouble length_dh = (\n \t\telastic_modulus * stiffness * c->GetWallStiffness() *\n\t\t\t(\n\t\t\t(s_base) *(\n\t\t\t\t\t DSQR(s_aft/s_base - 1)\n\t\t\t\t\t-DSQR(s_bef/s_base - 1)\n\t\t\t) -\n\t\t\t(r_base)*(\n\t\t\t\t\t DSQR(r_aft/r_base - 1)\n\t\t\t\t\t-DSQR(r_bef/r_base - 1)\n )));\n\n double dh = length_dh + bending_dh;\n double threshold;\n if (dh < 0 || RANDOM() < (threshold=exp((-dh)/par.T)))\t\t{\n\n\t\t\tCellWallCurve curve;\n\t\t\tcurve.setCell(c);\n\t\t\tcurve.setOtherCell(c2);\n\t\t\tcurve.shift(w1);\n\t\t\tcurve.shift(w2);\n\t\t\tcurve.shift(w3);\n\t\t\tcurve.involved_nodes(w0,w4,o0,o1,o2,o3);\n curve.setThreshold(threshold);\n\n\t\t\tcurves.push_back(curve);\n\t\t}\n\t\tif (debugNode>-1){\n\t\t\tcout << \"move \" << w1->Index()<<\"-\"<Index()<<\" to \"<Index()<<\"-\"<Index()<<\" en:\"<< length_dh <<\"\\n\";\n\t\t}\n\t}\n}\n\nvoid extractData(WallElement *we,double & base_length,double &stiffness) {\n\tif (we != NULL) {\n\t\tbase_length += we->getBaseLength();\n\t\tif (std::isnan(we->getStiffness()) ) {\n\t\t\tstiffness+=we->getCell()->GetWallStiffness();\n\t\t} else {\n\t\t\tstiffness+=we->getStiffness();\n\t\t}\n\t}else {\n\t\tbase_length=std::nan(\"1\");\n\t\tstiffness=std::nan(\"1\");\n\t}\n}\n\nvoid Mesh::RemodelCellWallElements(vector & curves,CellBase *c) {\n\t//The algorithm needs at least 5 nodes along the wall\n\tif (c->nodes.size()<5) {\n\t\treturn;\n\t}\n\tlist ::iterator i = c->nodes.begin();\n\tNode * w0=*i;\n\tNode * w1=*(++i);\n\tNode * w2=*(++i);\n\tNode * w3=*(++i);\n\tNode * w4=*(++i);\n\tNode * o0=w0;\n\tNode * o1=w1;\n\tNode * o2=w2;\n\tNode * o3=w3;\n\twhile (i!=c->nodes.end()) {\n\t\tRemodelWallElement(curves,c,w0,w1,w2,w3,w4) ;\n\t\tw0=w1;\n\t\tw1=w2;\n\t\tw2=w3;\n\t\tw3=w4;\n\t\tw4=*(++i);\n\t}\n\tw4=o0;\n\tRemodelWallElement(curves,c,w0,w1,w2,w3,w4) ;\n\tw0=w1;\n\tw1=w2;\n\tw2=w3;\n\tw3=w4;\n\tw4=o1;\n\tRemodelWallElement(curves,c,w0,w1,w2,w3,w4) ;\n\tw0=w1;\n\tw1=w2;\n\tw2=w3;\n\tw3=w4;\n\tw4=o2;\n\tRemodelWallElement(curves,c,w0,w1,w2,w3,w4) ;\n\tw0=w1;\n\tw1=w2;\n\tw2=w3;\n\tw3=w4;\n\tw4=o3;\n\tRemodelWallElement(curves,c,w0,w1,w2,w3,w4) ;\n}\n\ndouble Mesh::RemodelWallElements(vector & curves) {\n\tfor (vector::iterator ii=cells.begin(); ii!=cells.end(); ii++) {\n\t\tCell *c = *ii;\n\t\tc->resetCellWallCurve();\n\t\tif (!(c->GetCellVeto())) {\n\t\t\tRemodelCellWallElements(curves,c);\n\t\t}\n\t}\n\tRemodelCellWallElements(curves,boundary_polygon);\n\treturn 0.0;\n}\n\ndouble Mesh::DisplaceNodes(void) {\n\n MyUrand r(shuffled_nodes.size());\n vl_shuffle(shuffled_nodes.begin(),shuffled_nodes.end(),r);\n\n double sum_dh=0;\n\n list delta_intgrl_list;\n\n for_each( node_sets.begin(), node_sets.end(), mem_fn( &NodeSet::ResetDone ) );\n\n for (vector::const_iterator i=shuffled_nodes.begin(); i!=shuffled_nodes.end(); i++) {\n\n //int n=shuffled_nodes[*i];\n Node &node(**i);\n\n // Do not allow displacement if fixed\n if (node.fixed) continue;\n\n if (node.DeadP()) continue;\n\n // Attempt to move this cell in a random direction\n double rx=par.mc_stepsize*(RANDOM()-0.5); // was 100.\n double ry=par.mc_stepsize*(RANDOM()-0.5);\n\n // Uniform with a circle of radius par.mc_stepsize\n /* double r = RANDOM() * par.mc_stepsize;\n double th = RANDOM()*2*Pi;\n\n double rx = r * cos(th);\n double ry = r * sin(th);\n */\n Vector new_p(node.x+rx,node.y+ry,0);\n Vector old_p(node.x,node.y,0);\n\n /* if (node.boundary && boundary_polygon->MoveSelfIntersectsP(n, new_p )) {\n // reject if move of boundary results in self intersection\n continue;\n }*/\n\n\n if (node.node_set) {\n // move each node set only once\n if (!node.node_set->DoneP()) \n\tnode.node_set->AttemptMove(rx,ry);\n\n } else {\n\n // for all cells to which this node belongs:\n // calculate energy difference\n\n double area_dh=0.;\n double bending_dh=0.;\n double length_dh=0.;\n double cell_length_dh=0.;\n double alignment_dh=0.;\n\n double old_l1=0.,old_l2=0.,new_l1=0.,new_l2=0.;\n\n double dh=0.;\n\n for (list::const_iterator cit=node.owners.begin(); cit!=node.owners.end(); cit++) {\n\n\t\n\tCell &c=*((Cell *)(cit->cell));\n\n\tif (c.MoveSelfIntersectsP(&node, new_p )) {\n\t\t\n\t // reject if move results in self intersection\n\t //\n\t // I know: using goto's is bad practice... except when jumping out\n\t // of deeply nested loops :-)\n\t //cerr << \"Rejecting due to self-intersection\\n\";\n\t goto next_node;\n\t}\n\n\t// area - (area after displacement): see notes for derivation\n\t\n\tVector i_min_1 = *(cit->nb1);\n\t//Vector i_plus_1 = m->getNode(cit->nb2);\n Vector i_plus_1 = *(cit->nb2);\n\n\t//if (cit->cell>=0) {\n\tif (!cit->cell->BoundaryPolP()) {\n\t double delta_A = 0.5 * ( ( new_p.x - old_p.x ) * (i_min_1.y - i_plus_1.y) +\n\t\t\t\t ( new_p.y - old_p.y ) * ( i_plus_1.x - i_min_1.x ) );\n\n\t area_dh += delta_A * (2 * c.target_area - 2 * c.area + delta_A);\n\n\n\t // cell length constraint\n\t // expensive and not always needed\n\t // so we check the value of lambda_celllength\n\n\t if (/* par.lambda_celllength */ cit->cell->lambda_celllength) {\n\n\t double delta_ix = \n\t (i_min_1.x + new_p.x)\n\t * (new_p.x * i_min_1.y- i_min_1.x * new_p.y) +\n\t (new_p.x + i_plus_1.x)\n\t * (i_plus_1.x * new_p.y- new_p.x * i_plus_1.y) -\n\n\t (i_min_1.x + old_p.x)\n\t * (old_p.x * i_min_1.y- i_min_1.x * old_p.y) -\n\t (old_p.x + i_plus_1.x)\n\t * (i_plus_1.x * old_p.y - old_p.x * i_plus_1.y);\n\n\n\t double delta_iy =\n\t (i_min_1.y + new_p.y)\n\t * (new_p.x * i_min_1.y- i_min_1.x * new_p.y) +\n\t (new_p.y + i_plus_1.y)\n\t * (i_plus_1.x * new_p.y- new_p.x * i_plus_1.y) -\n\n\t (i_min_1.y + old_p.y)\n\t * (old_p.x * i_min_1.y- i_min_1.x * old_p.y) -\n\t (old_p.y + i_plus_1.y)\n\t * (i_plus_1.x * old_p.y - old_p.x * i_plus_1.y);\n\n\n\t double delta_ixx = \n\t (new_p.x*new_p.x+\n\t i_min_1.x*new_p.x+\n\t i_min_1.x*i_min_1.x ) *\n\t (new_p.x*i_min_1.y - i_min_1.x*new_p.y) +\n\n\t (i_plus_1.x*i_plus_1.x+\n\t new_p.x*i_plus_1.x+\n\t new_p.x*new_p.x ) *\n\t (i_plus_1.x*new_p.y - new_p.x*i_plus_1.y) -\n\n\t (old_p.x*old_p.x+\n\t i_min_1.x*old_p.x+\n\t i_min_1.x*i_min_1.x ) *\n\t (old_p.x*i_min_1.y - i_min_1.x*old_p.y) -\n\n\t (i_plus_1.x*i_plus_1.x+\n\t old_p.x*i_plus_1.x+\n\t old_p.x*old_p.x ) *\n\t (i_plus_1.x*old_p.y - old_p.x*i_plus_1.y);\n\n\n\t double delta_ixy =\n\t (i_min_1.x*new_p.y-\n\t new_p.x*i_min_1.y)*\n\t (new_p.x*(2*new_p.y+i_min_1.y)+\n\t i_min_1.x*(new_p.y+2*i_min_1.y)) +\n\n\t (new_p.x*i_plus_1.y-\n\t i_plus_1.x*new_p.y)*\n\t (i_plus_1.x*(2*i_plus_1.y+new_p.y)+\n\t new_p.x*(i_plus_1.y+2*new_p.y)) -\n\n\t (i_min_1.x*old_p.y-\n\t old_p.x*i_min_1.y)*\n\t (old_p.x*(2*old_p.y+i_min_1.y)+\n\t i_min_1.x*(old_p.y+2*i_min_1.y)) -\n\n\t (old_p.x*i_plus_1.y-\n\t i_plus_1.x*old_p.y)*\n\t (i_plus_1.x*(2*i_plus_1.y+old_p.y)+\n\t old_p.x*(i_plus_1.y+2*old_p.y));\n\n\n\t double delta_iyy = \n\t (new_p.x*i_min_1.y-\n\t i_min_1.x*new_p.y)*\n\t (new_p.y*new_p.y+\n\t i_min_1.y*new_p.y+\n\t i_min_1.y*i_min_1.y ) + \n\n\t (i_plus_1.x*new_p.y-\n\t new_p.x*i_plus_1.y)*\n\t (i_plus_1.y*i_plus_1.y+\n\t new_p.y*i_plus_1.y+\n\t new_p.y*new_p.y ) -\n\n\t (old_p.x*i_min_1.y-\n\t i_min_1.x*old_p.y)*\n\t (old_p.y*old_p.y+\n\t i_min_1.y*old_p.y+\n\t i_min_1.y*i_min_1.y ) -\n\n\t (i_plus_1.x*old_p.y-\n\t old_p.x*i_plus_1.y)*\n\t (i_plus_1.y*i_plus_1.y+\n\t old_p.y*i_plus_1.y+\n\t old_p.y*old_p.y );\n\n\t delta_intgrl_list.push_back(DeltaIntgrl(delta_A,delta_ix,delta_iy,delta_ixx,delta_ixy,delta_iyy));\n\n\t Vector old_axis;\n\t double old_celllength = c.Length(&old_axis);\n\t old_axis=old_axis.Normalised().Perp2D();\n\n\t // calculate length after proposed update\n\t double intrx=(c.intgrl_x-delta_ix)/6.;\n\t double intry=(c.intgrl_y-delta_iy)/6.;\n\t double ixx=((c.intgrl_xx-delta_ixx)/12.)-(intrx*intrx)/(c.area-delta_A);\n\t double ixy=((c.intgrl_xy-delta_ixy)/24.)+(intrx*intry)/(c.area-delta_A);\n\t double iyy=((c.intgrl_yy-delta_iyy)/12.)-(intry*intry)/(c.area-delta_A);\n\n\t double rhs1=(ixx+iyy)/2., rhs2=sqrt( (ixx-iyy)*(ixx-iyy)+4*ixy*ixy )/2.;\n\n\t double lambda_b=rhs1+rhs2;\n\n\n\t double new_celllength=4*sqrt(lambda_b/(c.area-delta_A));\n\t //cerr << \"new_celllength = \" << new_celllength << endl;\n\t //cerr << \"target_length = \" << c.target_length << endl;\n\n\t cell_length_dh += c.lambda_celllength * ( DSQR(c.target_length - new_celllength) - DSQR(c.target_length-old_celllength) );\n\n\t Vector norm_long_axis(lambda_b - ixx, ixy, 0);\n\t norm_long_axis.Normalise();\n\n\t double alignment_before = InnerProduct(old_axis, c.cellvec);\n\t double alignment_after = InnerProduct(norm_long_axis, c.cellvec);\n\n\t /* cerr << \"Delta alignment = \" << alignment_before - alignment_after << endl;\n\t cerr << \"Old alignment is \" << alignment_before << \", new alignment is \" << alignment_after << endl;\n\t cerr << \"Old axis is \" << old_axis << \", new axis is \" << norm_long_axis << endl; \n\t */\n\t alignment_dh += alignment_before - alignment_after;\n\n\t /* cerr << \"alignment_dh = \" << alignment_dh << endl;\n\t cerr << \"cellvec = \" << c.cellvec << endl;*/\n\n\t } else {\n\t // if we have no length constraint, still need to update area\n\t delta_intgrl_list.push_back(DeltaIntgrl(delta_A,0,0,0,0,0));\n\n\t }\n\n\t old_l1=(old_p-i_min_1).Norm();\n\t old_l2=(old_p-i_plus_1).Norm();\n\t new_l1=(new_p-i_min_1).Norm();\n\t new_l2=(new_p-i_plus_1).Norm();\n\n\t static int count=0;\n\t // Insertion of nodes (cell wall yielding)\n\t if (!node.fixed) {\n\t if (old_l1 > par.yielding_threshold*Node::target_length && !cit->nb1->fixed) {\n\t node_insertion_queue.push( Edge(cit->nb1, &node) );\n\t }\n\t if (old_l2 > par.yielding_threshold*Node::target_length && !cit->nb2->fixed) {\n\t node_insertion_queue.push( Edge(&node, cit->nb2 ) );\n\t }\n\t count++;\n\n\t }\n\n\n // We must double the weights for the perimeter (otherwise they start bulging...)\n double w1, w2;\n#ifdef FLEMING\n \tif (node.boundary && cit->nb1->boundary)\n \t w1 = par.rel_perimeter_stiffness;\n \telse\n \t w1 = 1;\n \tif (node.boundary && cit->nb2->boundary)\n \t w2 = par.rel_perimeter_stiffness;\n \telse\n \t w2 = 1;\n\n#else\n \tif (node.boundary && cit->nb1->boundary)\n \t\tw1=2;\n \telse\n \t\tw1 = 1;\n \tif (node.boundary && cit->nb2->boundary)\n \t\tw2 = 2;\n \telse\n \t\tw2 = 1;\n#endif\n\n\n // Cell specific wall stiffness\n double cell_w = c.GetWallStiffness();\n w1 = w1*cell_w;\n w2 = w2*cell_w;\n\n\n double w_w1 = 1;\n double w_w2 = 1;\n double bl_minus_1 = 0.0;\n double bl_plus_1 = 0.0;\n\n if (activateWallStiffnessHamiltonian()) {\n \tcalculateWallStiffness(&c, *i, &w_w1, &w_w2, &bl_minus_1, &bl_plus_1);\n }\n if (bl_minus_1>0 && bl_plus_1>0) {\n w1 = cell_w * (w_w1);\n w2 = cell_w * (w_w2);\n //check if wall elements are defined and pick the appropriate length_dh\n\n length_dh +=\n \t\telastic_modulus * w1 *\n \t\tbl_minus_1 *(DSQR(new_l1/bl_minus_1 - 1)-DSQR(old_l1/bl_minus_1 - 1)) +\n elastic_modulus * w2 *\n\t\t\t\tbl_plus_1 *(DSQR(new_l2/bl_plus_1 - 1)-DSQR(old_l2/bl_plus_1 - 1));\n }\n else {\n \tlength_dh +=2*Node::target_length * (\n \t\t\tw1*(old_l1 - new_l1) +\n \t\t\tw2*(old_l2 - new_l2) ) +\n \t\tw1*(DSQR(new_l1) - DSQR(old_l1)) +\n\t\t\t\tw2*(DSQR(new_l2) - DSQR(old_l2));\n\t}\n// cout << node << \"\\t\" << bl_minus_1 << \"\\t\" << bl_plus_1 << \"\\t\" << w_w1 << \"\\t\" << w_w2 << \"\\n\";\n\t}\n\n\t// bending energy also holds for outer boundary\n\t// first implementation. Can probably be done more efficiently\n\t// calculate osculating circle radius (gives local curvature)\n\t// the ideal bending state is flat... (K=0)\n\tif (abs(par.bend_lambda) > 0.01)\t {\n\t // strong bending energy to resist \"cleaving\" by division planes\n\t double r1, r2;\n\n\t Vector before_a(i_min_1.x,i_min_1.y,0);\n\t Vector before_b(old_p.x, old_p.y,0);\n\t Vector before_c(i_plus_1.x, i_plus_1.y,0);\n\t r1 = osculating_circle_radius(before_a, before_b, before_c);\n\n\t Vector after_a(i_min_1.x, i_min_1.y,0);\n\t Vector after_b(new_p.x, new_p.y,0);\n\t Vector after_c(i_plus_1.x, i_plus_1.y,0);\n\t r2 = osculating_circle_radius(after_a, after_b, after_c);\n\n\t if (r1<0 || r2<0) {\n\t MyWarning::warning(\"r1 = %f, r2 = %f\",r1,r2);\n\t }\n\t bending_dh += DSQR(1/r2 - 1/r1);\n\t}\n }\n dh = \tarea_dh + cell_length_dh +\n par.lambda_length * length_dh + par.bend_lambda * bending_dh + par.alignment_lambda * alignment_dh;\n\n //(length_constraint_after - length_constraint_before);\n\n if (dh < 0 || RANDOM()::const_iterator i=cells.begin(); i!=cells.end(); i++) {\n\t\tCell &cell(**i);\n\n\t\t// check lengths of wall elements and apply plastic deformation\n\t\tcell.LoopWallElements([this](auto wallElementInfo){\n\t\t\tif(wallElementInfo->hasWallElement()){\n\t\t\t\tif(wallElementInfo->plasticStretch(this->elastic_limit)){\n\t\t\t\t\twallElementInfo->updateBaseLength(this->elastic_limit);\n } else if(std::isnan(wallElementInfo->getBaseLength())){\n wallElementInfo->getWallElement()->setBaseLength(wallElementInfo->getLength()/this->elastic_limit);\n }\n\t\t\t}\n\t\t});\n\t}\n}\n\nvoid extractWallData(WallElementInfo* wallElementInfo,double *w,double* bl){\n\tdouble stiffness=.0;\n\tdouble base_length=.0;\n\tif (wallElementInfo->hasWallElement()) {\n\t\tstiffness = wallElementInfo->getWallElement()->getStiffness();\n\t\tbase_length = wallElementInfo->getBaseLength();\n\t} else {\n\t\tstiffness = wallElementInfo->getCell()->GetWallStiffness();\n\t}\n\tif (!std::isnan(stiffness)){\n\t\t(*w) += stiffness;\n\t\t(*bl) += base_length;\n\t}\n}\n\nvoid Mesh::calculateWallStiffness(CellBase* c, Node* node, double *w_p1,double *w_p2, double* bl_minus_1, double* bl_plus_1) {\n\tc->LoopWallElements([node,w_p1,w_p2,bl_minus_1,bl_plus_1](auto wallElementInfo){\n\t\tint points = 0;\n\t\tif (wallElementInfo->isTo(node)) {\n extractWallData(wallElementInfo,w_p1,bl_minus_1);\n points++;\n\t\t} else\tif (wallElementInfo->isFrom(node)) {\n extractWallData(wallElementInfo,w_p2,bl_plus_1);\n points++;\n }\n\t\tif (points == 2) {\n //stop the loop, as we do not need to go further.\n \twallElementInfo->stopLoop();\n\t\t}\n\t});\n}\n\n\n\n\n\nvoid Mesh::InsertNode(Edge &e) {\n\n\n // Construct a new node in the middle of the edge\n Node *new_node = AddNode( new Node ( ( *e.first + *e.second )/2 ) );\n\n // if new node is inserted into the boundary\n // it will be part of the boundary, fixed, and source, too\n\n // The new node is part of the boundary only if both its neighbors are boundary nodes and the boundray proceeds from first to second.\n new_node->boundary = (e.first->BoundaryP() && e.first->BoundaryP()) && ((findNextBoundaryNode(e.first))->Index() == e.second->Index());\n new_node->fixed = e.first->fixed && e.second->fixed;\n new_node->sam = new_node->boundary && (e.first->sam || e.second->sam);\n\n // insert it into the boundary polygon;\n /* if (new_node->boundary) {\n\n // find the position of the first node in the boundary\n list::iterator ins_pos = find\n (boundary_polygon->nodes.begin(),\n boundary_polygon->nodes.end(),\n e.first);\n // ... second node comes before or after it ...\n if (*(++ins_pos!=boundary_polygon->nodes.end()?\n ins_pos:boundary_polygon->nodes.begin())!=e.second) {\n\n boundary_polygon->nodes.insert(((ins_pos--)!=boundary_polygon->nodes.begin()?ins_pos:(--boundary_polygon->nodes.end())), new_node);\n\n // .. set the neighbors of the new node ...\n // in this case e.second and e.first are inverted\n new_node->owners.push_back( Neighbor(boundary_polygon, e.second, e.first ) );\n //cerr << \"pushing back \" << Neighbor(boundary_polygon->index, e.second, e.first ) << endl;\n } else {\n // insert before second node, so leave ins_pos as it is,\n // that is incremented\n boundary_polygon->nodes.insert(ins_pos, new_node);\n\n // .. set the neighbors of the new node ...\n new_node->owners.push_back( Neighbor(boundary_polygon, e.first, e.second ) );\n // cerr << \"pushing back \" << Neighbor(boundary_polygon->index, e.second, e.first ) << endl;\n }\n\n }*/\n\n\n list owners;\n\n // push all cells owning the two nodes of the divided edges\n // onto a list\n copy(e.first->owners.begin(),\n e.first->owners.end(),\n back_inserter(owners));\n copy(e.second->owners.begin(),\n e.second->owners.end(),\n back_inserter(owners));\n\n //copy(owners.begin(), owners.end(), ostream_iterator(cerr, \" \"));\n //cerr << endl;\n\n // sort the nodes\n owners.sort( mem_fn( &Neighbor::Cmp ) );\n\n // extern ofstream debug_stream;\n\n // debug_stream << \"Nodes \" << e.first << \" and \" << e.second << endl;\n // copy(owners.begin(), owners.end(), ostream_iterator(debug_stream, \" \"));\n // debug_stream << endl;\n\n // the duplicates in this list indicate cells owning this edge \n list::iterator c=owners.begin();\n while (c!=owners.end()) {\n c=adjacent_find(c,owners.end(), neighbor_cell_eq);\n\n\n if (c!=owners.end()) { // else break;\n\n // debug_stream << \"Cell \" << c->cell << \" owns Edge \" << e << endl;\n\n \n // find the position of the edge's first node in cell c...\n list::iterator ins_pos = find\n\t(c->cell->nodes.begin(),\n\t c->cell->nodes.end(),\n\t e.first);\n // ... second node comes before or after it ...\n\n // XXXX probably this test is always false XXXX: No, works okay.\n if (*(++ins_pos!=c->cell->nodes.end()?\n\t ins_pos:c->cell->nodes.begin())!=e.second) {\n\tc->cell->nodes.insert(((ins_pos--)!=c->cell->nodes.begin()?ins_pos:(--c->cell->nodes.end())), new_node);\n\t//cells[c->cell].nodes.insert(--ins_pos, new_node->index);\n\t// .. set the neighbors of the new node ...\n\t// in this case e.second and e.first are inverted\n\t// cerr << \"Inverted\\n\";\n\tnew_node->owners.push_back( Neighbor(c->cell, e.second, e.first ) );\n } else {\n\t// insert before second node, so leave ins_pos as it is,\n\t// that is incremented\n\tc->cell->nodes.insert(ins_pos, new_node);\t\n\t// .. set the neighbors of the new node ...\n\t// cerr << \"Not inverted\\n\";\n\tnew_node->owners.push_back( Neighbor(c->cell, e.first, e.second ) );\n }\n\n // redo the neighbors:\n //}\n\n\n // - find cell c among owners of Node e.first\n list::iterator cpos=\n\tfind_if( e.first->owners.begin(),\n\t\t e.first->owners.end(),\n\t\t [c](auto neighbor){return neighbor.CellEquals(c->cell->Index());});\n\n // - correct the record\n if (cpos->nb1 == e.second) {\n\tcpos->nb1 = new_node;\n } else \n\tif (cpos->nb2 == e.second) {\n\t cpos->nb2 = new_node;\n\t}\n\n // - same for Node e.second\n cpos=\n\tfind_if( e.second->owners.begin(),\n\t\t e.second->owners.end(),\n\t\t [c](auto neighbor){return neighbor.CellEquals(c->cell->Index());});\n\n // - correct the record\n if (cpos->nb1 == e.first) {\n\tcpos->nb1 = new_node;\n } else \n\tif (cpos->nb2 == e.first) {\n\t cpos->nb2 = new_node;\n\t}\n\n\n } else break;\n c++; \n }\n\n // Repair neighborhood lists in a second loop, to make sure all\n // `administration' is up to date\n while (c!=owners.end()) {\n c=adjacent_find(c,owners.end(), neighbor_cell_eq);\n // repair neighborhood lists of cell and Wall lists\n\n if (!c->cell->BoundaryPolP()) {\n c->cell->ConstructNeighborList();\n \n }\n c++;\n }\n\n new_node->splittWallElementsBetween(e.first, e.second);\n}\n\n//\n\n// return the total amount of chemical \"ch\" in the leaf\ndouble Mesh::SumChemical(int ch) {\n\n double sum=0.;\n for (vector::iterator i=cells.begin(); i!=cells.end(); i++) {\n sum+=(*i)->chem[ch];\n }\n return sum;\n}\n\n\n\nvoid Mesh::CleanUpCellNodeLists(void) {\n\n typedef vector ::iterator> CellItVect;\n\n CellItVect cellstoberemoved;\n vector cellind;\n\n // Start of by removing all stale walls.\n //DeleteLooseWalls();\n // collect all dead cells that need to be removed from the simulation\n for (vector::iterator i=cells.begin(); i!=cells.end(); i++) {\n if ((*i)->DeadP()) {\n // collect the iterators\n cellstoberemoved.push_back(i);\n\n // collect the indices\n cellind.push_back((*i)->index);\n } else {\n // Remove pointers to dead Walls\n for (list::iterator w=(*i)->walls.begin(); w!=(*i)->walls.end(); w++) {\n\tif ((*w)->DeadP()) {\n\t (*w)=0;\n\t}\n }\n (*i)->walls.remove(0);\n }\n }\n\n // Remove pointers to dead Walls from BoundaryPolygon\n for (list::iterator w=boundary_polygon->walls.begin(); w!=boundary_polygon->walls.end(); w++) {\n if ((*w)->DeadP()) {\n (*w)=0;\n }\n }\n boundary_polygon->walls.remove(0);\n\n\n // Renumber cells; this is most efficient if the list of dead cell indices is sorted\n sort(cellind.begin(),cellind.end());\n\n\n // Reindexing of Cells\n for (vector::reverse_iterator j=cellind.rbegin(); j!=cellind.rend(); j++) {\n for (vector::reverse_iterator i=cells.rbegin(); i!=cells.rend(); i++) {\n if (*j < (*i)->index) (*i)->index--;\n }\n }\n\n\n // Actual deleting of Cells\n // We must delete in reverse order, otherwise the iterators become redefined\n for ( CellItVect::reverse_iterator i=cellstoberemoved.rbegin(); i!=cellstoberemoved.rend(); i++) {\n Cell::NCells()--;\n cells.erase(*i);\n }\n\n\n // same for nodes\n typedef vector ::iterator> NodeItVect;\n\n NodeItVect nodestoberemoved;\n vector nodeindlist;\n\n // collect iterators and indices of dead nodes\n for (vector::iterator i=nodes.begin(); i!=nodes.end(); i++) {\n if ((*i)->DeadP()) {\n nodestoberemoved.push_back( i );\n nodeindlist.push_back((*i)->index);\n }\n }\n\n // sort the list of dead nodes for renumbering\n sort(nodeindlist.begin(),nodeindlist.end());\n\n\n // Reindicing of Nodes\n for (vector::reverse_iterator j=nodeindlist.rbegin(); j!=nodeindlist.rend(); j++) {\n for (vector::reverse_iterator i=nodes.rbegin(); i!=nodes.rend(); i++) {\n if (*j < (*i)->index) { \n\t(*i)->index--;\n } \n }\n }\n\n // Actual deleting of nodes\n // We must delete in reverse order, otherwise the iterators become redefined\n for ( NodeItVect::reverse_iterator i=nodestoberemoved.rbegin(); i!=nodestoberemoved.rend(); i++) {\n Node::nnodes--;\n nodes.erase(*i);\n }\n\n\n\n for (list::iterator w=walls.begin(); w!=walls.end(); w++) {\n if ((*w)->DeadP()) {\n Wall::nwalls--;\n delete *w;\n *w = 0;\n }\n }\n\n walls.remove( 0 );\n\n\n\n // Clean up all intercellular connections and redo everything\n for (vector::iterator i=nodes.begin(); i!=nodes.end(); i++) {\n (*i)->owners.clear();\n }\n\n for (vector::iterator i=cells.begin(); i!=cells.end(); i++) {\n (*i)->ConstructConnections();\n }\n\n boundary_polygon->ConstructConnections();\n\n // remake shuffled_nodes and shuffled cells\n shuffled_nodes.clear();\n shuffled_nodes = nodes;\n\n shuffled_cells.clear();\n shuffled_cells = cells;\n}\n\nvoid Mesh::CutAwayBelowLine( Vector startpoint, Vector endpoint) {\n\n // Kills all cells below the line startpoint -> endpoint\n\n Vector perp = (endpoint-startpoint).Perp2D().Normalised();\n\n#ifdef QDEBUG\n qDebug() << \"Before Apoptose\" << endl;\n#endif\n\n TestIllegalWalls();\n for (vector::iterator i=cells.begin(); i!=cells.end(); i++) {\n\n // do some vector geometry to check whether the cell is below the cutting line\n Vector cellvec = ((*i)->Centroid()-startpoint);\n\n if ( InnerProduct(perp, cellvec) < 0 ) {\n // remove those cells\n (*i)->Apoptose();\n }\n }\n\n#ifdef QDEBUG\n qDebug() << \"Before CleanUpCellNodeLists\" << endl;\n#endif\n TestIllegalWalls();\n\n CleanUpCellNodeLists();\n}\n\nvoid Mesh::CutAwaySAM(void) {\n\n for (vector::iterator i=cells.begin(); i!=cells.end(); i++) {\n if( (*i)->Boundary() == Cell::SAM ) {\n (*i)->Apoptose();\n }\n }\n TestIllegalWalls();\n CleanUpCellNodeLists();\n}\n\nvoid Mesh::TestIllegalWalls(void) {\n\n for (list::iterator w = walls.begin(); w!=walls.end(); w++) {\n if ((*w)->IllegalP() ) {\n#ifdef QDEBUG\n cerr << \"Wall \" << **w << \" is illegal.\" << endl;\n#endif\n }\n }\n}\n\n\n\nclass node_owners_eq : public unary_function {\n int no;\npublic:\n\n explicit node_owners_eq(int nn) { no=nn; }\n\n bool operator() (const Node &n) const {\n if (n.CellsSize()==1) \n return true;\n else \n return false;\n }\n};\n\n\nvoid Mesh::RepairBoundaryPolygon(void) {\n\n // After serious manipulations (e.g. after cutting part off the\n // leaf) repair the boundary polygon. It assumes the cut line has\n // already been marked \"boundary\" and the original boundary marks\n // were not removed. \n //\n // So, this function just puts boundary nodes into the boundary\n // polygon in the right order; it cannot detect boundaries from\n // scratch.\n\n Node *boundary_node=0, *next_boundary_node=0, *internal_node;\n set original_boundary_nodes, repaired_boundary_nodes;\n vector difference; // set difference result\n\n // Step 0: print out current boundary polygon\n#ifdef QDEBUG\n qDebug() << endl << \"Original Boundary Polygon node indices: \";\n foreach (Node* node, boundary_polygon->nodes) {\n qDebug() << node->Index() << \" \" ;\n } \n qDebug() << endl << endl;\n#endif\n\n // Step 1a: Create a set containing the current boundary polygon nodes' Indices.\n for (Node * node : boundary_polygon->nodes) {\n original_boundary_nodes.insert(node->Index());\n }\n\n // Step 1b: remove all nodes from boundary polygon\n boundary_polygon->nodes.clear();\n\n // Step 2: Remove all references to the boundary polygon from the Mesh's current list of nodes\n for (Node* node : nodes) {\n node->Unmark(); // remove marks, we need them to determine if we have closed the circle\n list::iterator boundary_ref_pos;\n if ((boundary_ref_pos = find_if (node->owners.begin(), node->owners.end(), \n\t\t\t\t [](auto neighbor){return neighbor.CellEquals(-1);})) != node->owners.end()) {\n // i.e. if one of the node's owners is the boundary polygon \n node->owners.erase(boundary_ref_pos); // remove the reference\n }\n }\n\n // Step 3: Search for the first boundary node. We reconstruct the\n // boundary polygon by moving along the boundary nodes until we've\n // encircled the polygon. Since manually adding nodes may have\n // turned nodes previously along the boundary into internal nodes,\n // we search through all the node until we find first boundary node\n // and proceed from there. If findNextBoundaryNode() returns a node\n // other than the one passed to it, the original node is the first\n // boundary node.\n for (Node* node : nodes) {\n\t\tNode *nextNode = findNextBoundaryNode(node);\n\t\tif (nextNode && (nextNode)->index != node->index) {\n next_boundary_node = node;\n break;\n }\n }\n\n // We have a problem if we arrive here without having found a boundary node.\n if (!next_boundary_node) throw(\"Cannot find a boundary node!.\");\n\n // Reconstruct the list of boundary polygon nodes.\n do {\n boundary_node = next_boundary_node;\n boundary_node->Mark();\n boundary_polygon->nodes.push_back(boundary_node);\n next_boundary_node = findNextBoundaryNode(boundary_node);\n if (next_boundary_node == NULL) {\n \tcout << \"boundary null\\n\";\n \tbreak;\n }\n } while ( !next_boundary_node->Marked() );\n\n\n // Create a set containing the reconstructed boundary polygon nodes' Indices.\n for (list::iterator it = boundary_polygon->nodes.begin(); it!=boundary_polygon->nodes.end(); ++it) {\n repaired_boundary_nodes.insert((*it)->Index());\n }\n\n // Calculate the difference between the original and repaired sets of boundary nodes\n // yielding the set of nodes that are no longer part of the boundary polygon.\n set_difference(original_boundary_nodes.begin(), original_boundary_nodes.end(),\n repaired_boundary_nodes.begin(), repaired_boundary_nodes.end(), back_inserter(difference));\n\n // Tell each node in the difference that it's no longer part of the boundary polygon\n vector::iterator internal_node_it;\n for (int i : difference){\n internal_node_it = find_if (nodes.begin(), nodes.end(), [i](auto node){return node->IndexEquals(i);});\n internal_node = *internal_node_it; // dereference the itterator to get to the node pointer\n if (!internal_node) throw(\"Found a null Node pointer.\");\n internal_node->UnsetBoundary();\n }\n\n boundary_polygon->ConstructConnections();\n for (list::iterator w=boundary_polygon->walls.begin(); w!=boundary_polygon->walls.end(); w++) {\n if ((*w)->DeadP()) {\n (*w)=0;\n }\n }\n boundary_polygon->walls.remove(0);\n boundary_polygon->ConstructNeighborList();\n\n#ifdef QDEBUG\n qDebug() << \"Repaired Boundary Polygon node indices: \";\n foreach (Node* node, boundary_polygon->nodes){\n qDebug() << node->Index() << \" \" ;\n }\n qDebug() << endl ;\n\n#ifdef _undefined_\n qDebug() << \"NODES:\" << endl;\n foreach(Node* node, nodes) {\n qDebug() << *node;\n }\n qDebug() << endl;\n\n qDebug() << \"WALLS:\" << endl;\n foreach(Wall* wall, walls) {\n qDebug() << *wall;\n }\n qDebug() << endl;\n\n qDebug() << \"CELLS:\" << endl;\n foreach(Cell* cell, cells) {\n qDebug() << *cell;\n }\n qDebug() << endl;\n#endif\n#endif\n}\n\n\nNode* Mesh::findNextBoundaryNode(Node* boundary_node) {\n //bool found_next_boundary_node = false;\n Node *next_boundary_node = 0;\n set boundary_node_owners; // This is a list of the current boundary node's owners' Ids\n vector neighborIds; // A list of the current boundary node's owners' 2nd neighbor Ids\n vector *> nodeOwners; // A vector of set pointers where each set contains the owner Ids of the nodes in the neighborIds list.\n vector intersection; // set intersection result\n\n // The next boundary node is that which has only one owner in common with the current boundary node\n for (list::iterator it=boundary_node->owners.begin(); it!=boundary_node->owners.end(); ++it) {\n if (it->cell->Index() != -1) boundary_node_owners.insert(it->cell->Index()); // Save each of the current boundary node's owners' Ids - except the boundary polygon \n set *owners = new set; // create a set to hold a 2nd neighbor's owners' Ids\n nodeOwners.push_back(owners);\n neighborIds.push_back(it->nb2->Index());\n for (Neighbor neighbor : it->nb2->owners){\n if (neighbor.cell->Index() != -1) owners->insert(neighbor.cell->Index()); // Save second neighbors' owners' Ids - except the boundary polygon \n }\n }\n vector::iterator itt = neighborIds.begin();\n vector *>::iterator it = nodeOwners.begin();\n\n#ifdef QDEBUG \n qDebug() << \"Boundary node: \" << boundary_node->Index() << \" is owned by the following cells: \";\n foreach (int i, boundary_node_owners){\n qDebug() << i << \" \";\n }\n qDebug() << endl;\n#endif\n\n for (; it < nodeOwners.end(); it++, itt++) {\n intersection.clear();\n set_intersection(boundary_node_owners.begin(), boundary_node_owners.end(), (*it)->begin(), (*it)->end(), back_inserter(intersection));\n\n#ifdef QDEBUG \n qDebug() << \"The intersection of the boundary node(\" << boundary_node->Index() << \") owners and its 2nd neighbor(\" << *itt << \") owners is: \";\n foreach (int i, intersection){\n qDebug() << i << \" \";\n }\n qDebug() << endl;\n#endif\n\n if (intersection.size() == 1){\n //found_next_boundary_node = true;\n vector::iterator next_boundary_node_it = find_if (nodes.begin(), nodes.end(), [itt](auto node){return node->IndexEquals(*itt);});\n next_boundary_node = *next_boundary_node_it; // defeference the itterator to get to the node pointer\n\n#ifdef QDEBUG \n qDebug() << \"The Current boundary node is: \" << boundary_node->Index()\n\t << \". The Next boundary node is: \" << *itt << ((next_boundary_node->Marked()) ? \" Marked\" : \" Unmarked\") << endl << endl;\n#endif\n\n break;\n }\n }\n\n#ifdef QDEBUG \n if (!found_next_boundary_node) {\n qDebug() << \"OOPS! Didn't find the next boundrary node!\" << endl;\n }\n#endif\n\n return next_boundary_node;\n}\n\n\nvoid Mesh::CleanUpWalls(void) {\n for (list::iterator w=walls.begin(); w!=walls.end(); w++) {\n if ((*w)->DeadP()) {\n delete *w;\n (*w)=0; \n }\n }\n walls.remove(0);\n}\n\nvoid Mesh::Rotate(double angle, Vector center) {\n\n // Rotate the mesh over the angle \"angle\", relative to center point \"center\".\n\n Matrix rotmat;\n\n rotmat.Rot2D(angle);\n\n for (vector::iterator n=nodes.begin(); n!=nodes.end(); n++) {\n (*n)->setPos ( rotmat * ( *(*n) - center ) + center ); \n }\n}\n\n\nvoid Mesh::PrintWallList( void ) {\n\n transform ( walls.begin(), walls.end(), ostream_iterator(cerr, \"\\n\"), deref_ptr );\n}\n\n#include \n//#include \"forwardeuler.h\"\n#include \"rungekutta.h\"\n\n//class SolveMesh : public ForwardEuler{\nclass SolveMesh : public RungeKutta{\nprivate:\n SolveMesh(void);\n\npublic:\n SolveMesh(Mesh *m_) {\n\n m = m_;\n\n kmax=0;\n kount=0;\n xp=0; yp=0; dxsav=0;\n\n\n }\n\nprotected:\n virtual void derivs(double x, double *y, double *dydx) {\n\n // set mesh with new values given by ODESolver\n // (we must do this, because only mesh knows the connections\n // between the variables)\n\n m->setValues(x,y);\n m->Derivatives(dydx);\n\n //cerr << \"Calculated derivatives at \" << x << \"\\n\"; \n }\n\nprivate:\n Mesh *m;\n int kmax,kount;\n double *xp,**yp,dxsav;\n bool monitor_window;\n};\n\n\n\nvoid Mesh::ReactDiffuse(double delta_t) {\n\n // Set Lengths of Walls\n for_each ( walls.begin(), walls.end(), \n mem_fn( &Wall::SetLength ) );\n\n static SolveMesh *solver = new SolveMesh(this);\n\n int nok, nbad, nvar;\n double *ystart = getValues(&nvar);\n\n solver->odeint(ystart, nvar, getTime(), getTime() + delta_t, \n\t\t par.ode_accuracy, par.dt, 1e-10, &nok, &nbad);\n\n setTime(getTime()+delta_t);\n setValues(getTime(),ystart);\n}\n\n\nVector Mesh::FirstConcMoment(int chem) {\n\n Vector moment;\n for (vector::const_iterator c=cells.begin(); c!=cells.end(); c++) {\n moment += (*c)->Chemical(chem) * (*c)->Centroid();\n }\n return moment / (double)cells.size();\n}\n\n/*! This member function deletes all walls connected to two dead cells from the mesh.\n It should be called before the Cells are actually removed.\n If the cell is connect to one dead cell only, that reference is substituted for a reference \n to the boundary polygon.\n*/\nvoid Mesh::DeleteLooseWalls(void) {\n\n list::iterator w=walls.begin();\n\n while (w!=walls.end()) {\n\n // if both cells of the wall are dead, remove the wall\n if ((*w)->C1()->DeadP() || (*w)->C2()->DeadP()) {\n if ((*w)->C1()->DeadP() && (*w)->C2()->DeadP()) {\n\tdelete *w;\n\tw=walls.erase(w);\n } else {\n\tif ((*w)->C1()->DeadP())\n\t (*w)->c1 = boundary_polygon;\n\telse\n\t (*w)->c2 = boundary_polygon;\n\tw++;\n }\n } else {\n w++;\n }\n\n }\n}\n\n/*void Mesh::FitLeafToCanvas(double width, double height) {\n\n Vector bbll,bbur;\n BoundingBox(bbll,bbur);\n\n double scale_x = width/(bbur.x-bbll.x);\n double scale_y = height/(bbur.y-bbll.y);\n\n double factor = scale_x &clean_chem) {\n\n if (clean_chem.size()!=(unsigned)Cell::NChem()) {\n throw \"Run time error in Mesh::CleanChemicals: size of clean_chem should be equal to Cell::NChem()\";\n }\n for (vector::iterator c=cells.begin(); c!=cells.end(); c++) {\n for (int i=0;iSetChemical(i,clean_chem[i]);\n }\n (*c)->SetNewChemToChem();\n }\n}\n\n\nvoid Mesh::CleanTransporters(const vector &clean_transporters) {\n\n if (clean_transporters.size()!=(unsigned)Cell::NChem()) {\n throw \"Run time error in Mesh::CleanTransporters: size ofclean_transporters should be equal to Cell::NChem()\";\n }\n\n\n // clean transporters\n for (list::iterator w=walls.begin(); w!=walls.end(); w++) {\n for (int i=0;isetTransporters1(i,clean_transporters[i]); (*w)->setNewTransporters1(i,clean_transporters[i]);\n (*w)->setTransporters2(i,clean_transporters[i]); (*w)->setNewTransporters2(i,clean_transporters[i]);\n }\n }\n}\n\n\nvoid Mesh::RandomizeChemicals(const vector &max_chem, const vector &max_transporters) {\n\n if (max_chem.size()!=(unsigned)Cell::NChem() || max_transporters.size()!=(unsigned)Cell::NChem()) {\n throw \"Run time error in Mesh::CleanChemicals: size of max_chem and max_transporters should be equal to Cell::NChem()\";\n }\n\n for (vector::iterator c=cells.begin(); c!=cells.end(); c++) {\n for (int i=0;iSetChemical(i,max_chem[i]*RANDOM());\n //(*c)->SetChemical(i,RANDOM()*max_chem[i]*0.1+0.9*max_chem[i]);\n //(*c)->SetChemical(i,RANDOM()*max_chem[i]*(par -> range)+(1 - par -> range)*max_chem[i]); // must be a number between 0 and 0.99\n }\n (*c)->SetNewChemToChem();\n }\n\n // randomize transporters\n for (list::iterator w=walls.begin(); w!=walls.end(); w++) {\n for (int i=0;isetTransporters1(i,max_transporters[i] * RANDOM()); (*w)->setNewTransporters1(i, (*w)->Transporters1(i) );\n (*w)->setTransporters2(i,max_transporters[i] * RANDOM()); (*w)->setNewTransporters2(i, (*w)->Transporters1(i) );\n }\n }\n}\n\n//!\\brief Calculates a vector with derivatives of all variables, which\n// we can pass to an ODESolver. \nvoid Mesh::Derivatives(double *derivs) {\n\n int nwalls = walls.size();\n int ncells = cells.size();\n int nchems = Cell::NChem();\n\n // two eqs per chemical for each walls, and one eq per chemical for each cell\n // This is for generality. For a specific model you may optimize\n // this by removing superfluous (empty) equations.\n int neqs = 2 * nwalls * nchems + ncells * nchems;\n\n //static double *derivs = 0; \n // derivs is allocated by RungeKutta class.\n\n for (int i=0;i::iterator c=cells.begin(); c!=cells.end(); c++) {\n plugin->CellDynamics(*c, &(derivs[i]));\n i+=nchems;\n }\n\n for (list::iterator w=walls.begin(); w!=walls.end(); w++) {\n // (*wr)(*w, &(derivs[i]), &(derivs[i+nchems]));\n plugin->WallDynamics(*w, &(derivs[i]), &(derivs[i+nchems]));\n // Transport function adds to derivatives of cell chemicals\n double *dchem_c1 = &(derivs[(*w)->c1->Index() * nchems]);\n double *dchem_c2 = &(derivs[(*w)->c2->Index() * nchems]);\n //plugin->CelltoCellTransport(*w, &(derivs[(*w)->c1->Index() * nchems]),\n //\t &(derivs[(*w)->c2->Index() * nchems]));\n // quick fix: dummy values to prevent end user from writing into outer space and causing a crash :-)\n // start here if you want to implement chemical input/output into environment over boundaries\n double dummy1, dummy2;\n if ((*w)->c1->Index()<0) { // tests if c1 is the boundary pol\n dchem_c1 = &dummy1;\n }\n if ((*w)->c2->Index()<0) {\n dchem_c2 = &dummy2;\n }\n plugin->CelltoCellTransport(*w, dchem_c1, dchem_c2); \n\n //(*tf)(*w, &(derivs[(*w)->c1->Index() * nchems]),\n //&(derivs[(*w)->c2->Index() * nchems] ) );\n i+=2*nchems;\n }\n}\n\nvoid Mesh::setValues(double x, double *y) {\n\n //int nwalls = walls.size();\n //int ncells = cells.size();\n int nchems = Cell::NChem();\n\n // two eqs per chemical for each walls, and one eq per chemical for each cell\n // This is for generality. For a specific model you may optimize\n // this by removing superfluous (empty) equations.\n //int neqs = 2 * nwalls * nchems + ncells * nchems;\n\n // Layout of derivatives: cells [ chem1 ... chem n] walls [ [ w1(chem 1) ... w1(chem n) ] [ w2(chem 1) ... w2(chem n) ] ]\n\n int i=0;\n static int emit_count=0;\n const int stride = 100;\n for (vector::iterator c=cells.begin(); c!=cells.end(); c++) {\n for (int ch=0;chSetChemical(ch, y[i+ch]);\n }\n if ( !(emit_count%stride)) {\n (*c)->EmitValues(x);\n }\n i+=nchems;\n }\n\n for (list::iterator w=walls.begin(); w!=walls.end(); w++) {\n for (int ch=0;chsetTransporters1(ch,y[i+ch]);\n }\n i+=nchems;\n\n for (int ch=0;chsetTransporters2(ch,y[i+ch]);\n }\n i+=nchems;\n }\n emit_count++;\n}\n\ndouble *Mesh::getValues(int *neqs) {\n\n int nwalls = walls.size();\n int ncells = cells.size();\n int nchems = Cell::NChem();\n\n // two eqs per chemical for each wall, and one eq per chemical for each cell\n // This is for generality. For a specific model you may optimize\n // this by removing superfluous (empty) equations.\n (*neqs) = 2 * nwalls * nchems + ncells * nchems;\n\n // Layout of derivatives: cells [ chem1 ... chem n] walls [ [ w1(chem 1) ... w1(chem n) ] [ w2(chem 1) ... w2(chem n) ] ]\n\n static double *values = 0;\n if (values!=0) { delete[] values; }\n\n values = new double[*neqs];\n\n int i=0;\n for (vector::iterator c=cells.begin(); c!=cells.end(); c++) {\n for (int ch=0;chChemical(ch);\n }\n i+=nchems;\n }\n\n for (list::iterator w=walls.begin(); w!=walls.end(); w++) {\n for (int ch=0;chTransporters1(ch);\n }\n i+=nchems;\n\n for (int ch=0;chTransporters2(ch);\n }\n i+=nchems;\n }\n for (int j=0;j::const_iterator n=nodes.begin(); n!=nodes.end(); n++) {\n Node *i=*n;\n\n NodeItem *item = new NodeItem ( &(*i), c );\n item->setColor();\n\n item->setZValue(5);\n item->show();\n item ->setPos(((Cell::offset[0]+i->x)*Cell::factor),\n ((Cell::offset[1]+i->y)*Cell::factor) );\n }\n}\n\n/*! Returns the sum of protein \"ch\" of a cycling protein in cells and walls */\ndouble Mesh::CalcProtCellsWalls(int ch) const {\n\n\n double sum_prot=0.;\n\n // At membranes\n for (list::const_iterator w=walls.begin(); w!=walls.end(); w++) {\n sum_prot += (*w)->Transporters1(ch);\n sum_prot += (*w)->Transporters2(ch);\n }\n\n // At cells\n for (vector::const_iterator c=cells.begin(); c!=cells.end(); c++) {\n sum_prot += (*c)->Chemical(ch);\n }\n return sum_prot;\n}\n\nvoid Mesh::SettoInitVals(void) {\n\n vector clean_chem(Cell::NChem());\n vector clean_transporters(Cell::NChem());\n\n for (int i=0;i Mesh::VertexAngles(void) {\n QVector angles;\n for (vector::const_iterator n=nodes.begin(); n!=nodes.end(); n++) {\n if ((*n)->Value()>2 && !(*n)->BoundaryP() ) {\n angles+=(*n)->NeighbourAngles();\n }\n }\n return angles;\n}\n\nQVector< QPair > Mesh::VertexAnglesValues(void) {\n\n QVector< QPair > anglesvalues;\n for (vector::const_iterator n=nodes.begin(); n!=nodes.end(); n++) {\n if ((*n)->Value()>2 && !(*n)->BoundaryP() ) {\n QVector angles = (*n)->NeighbourAngles();\n int value_vertex = angles.size();\n for (QVector::ConstIterator i=angles.begin(); i!=angles.end(); i++) {\n\tanglesvalues += QPair< qreal, int > (*i, value_vertex);\n }\n }\n }\n return anglesvalues;\n}\n\nvoid Mesh::Clean(void) {\n#ifdef QDEBUG\n qDebug() << \"Freeing nodes\" << endl;\n#endif\n for (vector::iterator i=nodes.begin(); i!=nodes.end(); i++) {\n delete *i;\n }\n nodes.clear();\n Node::nnodes=0;\n\n#ifdef QDEBUG\n qDebug() << \"Freeing node sets\" << endl;\n#endif\n for (vector::iterator i=node_sets.begin(); i!=node_sets.end(); i++) {\n delete *i;\n }\n node_sets.clear();\n\n\n#ifdef QDEBUG\n qDebug() << \"Freeing cells\" << endl;\n#endif\t\n //CellsStaticDatamembers *old_static_data_mem = Cell::GetStaticDataMemberPointer();\n for (vector::iterator i=cells.begin(); i!=cells.end(); i++) {\n delete *i;\n }\n //Cell::static_data_members = old_static_data_mem;\n\n cells.clear();\n Cell::NCells()=0;\n\n if (boundary_polygon) {\n delete boundary_polygon; // (already deleted during cleaning of cells?)\n boundary_polygon=0;\n }\n#ifdef QDEBUG\n qDebug() << \"Freeing walls\" << endl;\n#endif\n for (list::iterator i=walls.begin(); i!=walls.end(); i++) {\n delete *i;\n }\n walls.clear();\n Wall::nwalls=0;\n\n node_insertion_queue.clear();\n shuffled_nodes.clear();\n shuffled_cells.clear();\n time = 0.0;\n}\n\nvoid Mesh::StandardInit(void) {\n\n boundary_polygon = new BoundaryPolygon();\n Cell &circle=CircularCell(0,0,10,10);\n\n circle.SetTargetArea(circle.CalcArea());\n circle.SetTargetLength(par.target_length);\n circle.SetLambdaLength(par.lambda_celllength);\n SetBaseArea();\n // clean up chemicals \n for (int c=0; cnodes.size()+1];\n for (list::const_iterator i = boundary_polygon->nodes.begin(); \n i!=boundary_polygon->nodes.end(); i++) {\n p[pc++]=Point((*i)->x,(*i)->y);\n }\n \n // chainHull algorithm requires sorted points\n sort( p, p+pc );\n\n \n // Step 2: call 2D Hull code\n int np=boundary_polygon->nodes.size();\n Point *hull=new Point[np+1];\n int nph=chainHull_2D(p,np,hull);\n \n \n // Step 3: calculate area and circumference of convex hull\n double hull_area=0.;\n double hull_circumference=0.;\n\n for (int i=0;iCalcArea();\n \n\n /* ofstream datastr(\"hull.dat\");\n for (int i=0;i::const_iterator i=cells.begin();\n i!=cells.end();\n i++) {\n Vector centroid = (*i)->Centroid();\n csv_stream << (*i)->Index() << \", \"\n\t << centroid.x << \", \"\n\t << centroid.y << \", \" \n\t << (*i)->Area() << \", \"\n\t <<(*i)->Length();\n for (int c=0;cChemical(c);\n }\n csv_stream << Qt::endl;\n }\n\n \n}\n\n\n// DataExport\nvoid Mesh::CSVExportWallData(QTextStream &csv_stream) const {\n\n csv_stream << \"\\\"Wall Index\\\",\\\"Cell A\\\",\\\"Cell B\\\",\\\"Length\\\"\";\n \n for (int c=0;c::const_iterator i=walls.begin();\n i!=walls.end();\n i++) {\n csv_stream << (*i)->Index() << \",\"\n\t << (*i)->C1()->Index() << \",\"\n\t << (*i)->C2()->Index() << \",\"\n\t << (*i)->Length();\n\t \n for (int c=0;cTransporters1(c);\n }\n for (int c=0;cTransporters2(c);\n }\n\n csv_stream << Qt::endl;\n }\n\n \n}\n\n\nvoid Mesh::CSVExportMeshData(QTextStream &csv_stream) { \n \n csv_stream << \"\\\"Morph area\\\",\\\"Number of cells\\\",\\\"Number of nodes\\\",\\\"Compactness\\\",\\\"Hull area\\\",\\\"Morph circumference\\\",\\\"Hull circumference\\\"\" << Qt::endl;\n \n double res_compactness, res_area, res_cell_area, hull_circumference;\n Compactness(&res_compactness, &res_area, &res_cell_area, &hull_circumference);\n double morph_circumference = boundary_polygon->ExactCircumference();\n csv_stream << Area() << \", \" << NCells() << \", \" << NNodes() << \", \" << res_compactness << \", \" << res_area << \", \" << morph_circumference << \", \" << hull_circumference << Qt::endl;\n \n}\n/* finis */\n +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/src/GUI/mesh.cpp b/src/GUI/mesh.cpp +--- a/src/GUI/mesh.cpp (revision c9763b319a64e0a25643e4681bffbcbc9a263036) ++++ b/src/GUI/mesh.cpp (date 1747136022979) +@@ -53,81 +53,96 @@ + + extern Parameter par; + ++/*Inserts a node into a cell at a specific position and updates ownership relationships. ++c - Pointer to the cell where the node will be inserted ++n - Pointer to the node to insert ++nb1 - Pointer to the first neighbor node ++nb2 - Pointer to the second neighbor node ++ins_pos - Iterator indicating the insertion position in the cell's node list ++This method provides precise control over the node's position in the cell's topology.*/ + void Mesh::AddNodeToCellAtIndex(Cell *c, Node *n, Node *nb1, Node *nb2, list::iterator ins_pos) { +- c->nodes.insert(ins_pos, n); ++ c->nodes.insert(ins_pos, n); + n->owners.push_back( Neighbor(c, nb1, nb2 ) ); + } + +- ++/* Same but insert the node at the end*/ + void Mesh::AddNodeToCell(Cell *c, Node *n, Node *nb1, Node *nb2) { +- + c->nodes.push_back( n ); + n->owners.push_back( Neighbor(c, nb1, nb2 ) ); + } + ++/*Adds random perturbation to the specified chemical concentration in all cells. ++chemnum - Index of the chemical to perturb ++range - Magnitude of the perturbation ++This method iterates through all cells in the mesh and adds a random value ++to the concentration of the specified chemical. The random value is centered ++around zero (by using RANDOM()-0.5) and scaled by the range parameter. ++If the resulting concentration would be negative, it is set to zero instead.*/ + void Mesh::PerturbChem(int chemnum, double range) { +- + for (vector::iterator i=cells.begin(); i!=cells.end(); i++) { + (*i)->chem[chemnum] += range*(RANDOM()-0.5); + if ((*i)->chem[chemnum]<0.) (*i)->chem[chemnum]=0.; + } + } + ++ ++ ++ /* Creates a structured grid of cells by dividing a rectangular cell multiple times. ++ ll - Vector representing the lower left corner of the initial rectangle ++ ur - Vector representing the upper right corner of the initial rectangle ++ This method creates an initial rectangular cell and initializes its chemical concentrations ++ based on parameters. It then repeatedly divides all cells in a structured manner by ++ alternating between horizontal and vertical division axes. The method performs 7 rounds ++ of division in total - 6 rounds with axis rotation followed by a final round. ++ After cell division, it calculates the average side length of the cells and sets the ++ target length for nodes to a fraction of this average (creating tension in the structure). ++ Finally, it establishes the base area for the mesh using the current cell configuration.*/ + void Mesh::CellFiles(const Vector ll, const Vector ur) { +- +- Cell *cell = RectangularCell(ll,ur,0.001); +- ++ Cell *cell = RectangularCell(ll,ur,0.001); + for (int c=0;cSetChemical(c,par.initval[c]); + } + + cell->SetTargetArea(cell->CalcArea()); +- + Vector axis(1,0,0); + + // divide rectangle a number of times + for (int i=0;i<6;i++) { + IncreaseCellCapacityIfNecessary(); +- + vector current_cells = cells; + for (vector::iterator j=current_cells.begin(); j!=current_cells.end();j++) { + (*j)->DivideOverAxis(axis); + } + axis=axis.Perp2D(); +- + } + + IncreaseCellCapacityIfNecessary(); +- + axis=axis.Perp2D(); +- + vector current_cells = cells; + for (vector::iterator j=current_cells.begin(); j!=current_cells.end();j++) { + (*j)->DivideOverAxis(axis); + } + +- + double sum_l=0; int n_l=0; + for (list::const_iterator i=cell->nodes.begin(); i!=cell->nodes.end(); i++) { +- list::const_iterator nb=i; nb++; +- if (nb==cell->nodes.end()) ++ list::const_iterator nb=i; nb++; ++ if (nb==cell->nodes.end()) + nb=cell->nodes.begin(); + + double l = (**nb-**i).Norm(); +- + sum_l += l; + n_l++; + + } + +- + Node::target_length = sum_l/(double)n_l; + // a bit more tension + Node::target_length/=4.; +- + SetBaseArea(); + } + ++ ++ + Cell *Mesh::RectangularCell(const Vector ll, const Vector ur, double rotation) { + + Cell *cell=AddCell(new Cell()); +@@ -148,33 +163,33 @@ + + //n1.fixed=n2.fixed=n3.fixed=n4.fixed=true; + +- AddNodeToCell(cell, n4, ++ AddNodeToCell(cell, n4, + n1, + n3); + +- AddNodeToCell(cell, n3, ++ AddNodeToCell(cell, n3, + n4, + n2); + +- AddNodeToCell(cell, n2, ++ AddNodeToCell(cell, n2, + n3, + n1); + +- AddNodeToCell(cell, n1, ++ AddNodeToCell(cell, n1, + n2, + n4); + + +- AddNodeToCell(boundary_polygon, n4, ++ AddNodeToCell(boundary_polygon, n4, + n1, + n3); +- AddNodeToCell(boundary_polygon, n3, ++ AddNodeToCell(boundary_polygon, n3, + n4, + n2); +- AddNodeToCell(boundary_polygon, n2, ++ AddNodeToCell(boundary_polygon, n2, + n3, + n1); +- AddNodeToCell(boundary_polygon, n1, ++ AddNodeToCell(boundary_polygon, n1, + n2, + n4); + +@@ -190,7 +205,7 @@ + // a bit more tension + Node::target_length/=2; + +- cell->SetIntegrals(); ++ cell->SetIntegrals(); + cell->ConstructNeighborList(); + + return cell; +@@ -216,7 +231,7 @@ + Node *n=AddNode(new Node(x,y,0)); + n->boundary = true; + +- } ++ } + + for (int i=0;iSetIntegrals(); ++ c->SetIntegrals(); + c->at_boundary=true; + + return *c; +@@ -287,7 +302,7 @@ + // a bit more tension + Node::target_length/=2; + +- circle->SetIntegrals(); ++ circle->SetIntegrals(); + + //return c; + +@@ -297,7 +312,7 @@ + // get position of the (n/4)'th and (3*(n/4))'th node. + + list::reverse_iterator it_n1=circle->nodes.rbegin(); +- for (int i=0; iboundary=true; + n4->boundary=true; + +- AddNodeToCell(petiole, *it_n1, ++ AddNodeToCell(petiole, *it_n1, + n4, +- nodes[(*it_n2)->Index() ++ nodes[(*it_n2)->Index() + + (( (*it_n1)->Index() - (*it_n2)->Index() )-1+nnodes)%nnodes]); + + +@@ -336,7 +351,7 @@ + AddNodeToCell(petiole, n4, n3, n1); + + +-#ifdef QDEBUG ++#ifdef QDEBUG + qDebug() << circle << endl; + qDebug() << petiole << endl; + #endif +@@ -368,7 +383,7 @@ + petiole->Fix(); + + petiole->area=petiole->CalcArea(); +- petiole->target_area=petiole->area; ++ petiole->target_area=petiole->area; + petiole->ConstructNeighborList(); + circle->ConstructNeighborList(); + boundary_polygon->ConstructConnections(); +@@ -395,9 +410,9 @@ + LowerLeft.y = (*c)->y; + if ((*c)->z < LowerLeft.z) + LowerLeft.z = (*c)->z; +- if ((*c)->x > UpperRight.x) ++ if ((*c)->x > UpperRight.x) + UpperRight.x = (*c)->x; +- if ((*c)->y > UpperRight.y) ++ if ((*c)->y > UpperRight.y) + UpperRight.y = (*c)->y; + if ((*c)->z > UpperRight.z) + UpperRight.z = (*c)->z; +@@ -417,7 +432,7 @@ + + void Mesh::SetBaseArea(void) { + +- // Set base area to mean area. ++ // Set base area to mean area. + // This method is typically called during initiation, after + // defining the first cell + Cell::BaseArea() = Area()/cells.size(); +@@ -441,8 +456,9 @@ + } + }; + ++ ++ + void Mesh::Clear(void) { +- + // clear nodes + for (vector::iterator i=nodes.begin(); i!=nodes.end(); i++) { + delete *i; +@@ -450,8 +466,8 @@ + + nodes.clear(); + Node::nnodes=0; +- + node_insertion_queue.clear(); ++ + // Clear NodeSets + for (vector::iterator i=node_sets.begin(); i!=node_sets.end(); i++) { + delete *i; +@@ -461,7 +477,6 @@ + time = 0; + + // clear cells +- + for (vector::iterator i=cells.begin(); i!=cells.end(); i++) { + delete *i; + } +@@ -485,7 +500,7 @@ + + shuffled_cells.clear(); + shuffled_nodes.clear(); +- ++ + #ifdef QDEBUG + qDebug() << "cells.size() = " << cells.size() << endl; + qDebug() << "walls.size() = " << walls.size() << endl; +@@ -493,6 +508,23 @@ + #endif + } + ++ ++ ++/* Calculates cell-specific wall stiffness for one side of a node connection. ++Parameters: ++nb - Pointer to a neighbor node ++nodeown - Set of indices of cells that own the current node ++ ++This function determines the stiffness contribution from cells that are common ++to both the current node and its neighbor. It first creates a set of cell indices ++that own the neighbor node, then finds the intersection between this set and the ++nodeown set. For each cell in the intersection, it adds its wall stiffness value ++to the total (either from the cell's specific stiffness value or from the global ++parameter if the cell index is invalid). ++The function breaks early if an invalid (NaN) stiffness value is encountered. ++ ++Returns: ++The calculated total stiffness value for the shared cells.*/ + double Mesh::CellSpecificStiffnessOneSide(Node *nb,set &nodeown) { + // determines the list of cells belonging to the node and its neighbors + set nb1own; +@@ -514,6 +546,9 @@ + } + return cell_w; + } ++ ++ ++ + void Mesh::updateAreasOfCells(list * delta_intgrl_list,Node * node) { + + // update areas of cells +@@ -533,6 +568,20 @@ + } + } + ++/* Finds a cell that is common to the specified nodes, different from the given cell. ++ ++Parameters: ++c - Pointer to a cell to exclude from the search ++node1 - Pointer to the first node ++node2 - Pointer to the second node ++ ++This function iterates through the owners of both nodes to find a cell ++that is connected to both node1 and node2, but is not the cell c. ++It first iterates through node1's owners, then for each owner that is ++not c, it checks if it's also an owner of node2. ++ ++Returns: ++A pointer to the common cell found, or NULL if no common cell is found. */ + CellBase * Mesh::getOtherCell(CellBase* c,Node* node1,Node * node2) { + for (list::iterator nb1=node1->owners.begin(); nb1!=node1->owners.end(); nb1++) { + if (nb1->getCell() != c) { +@@ -559,9 +608,9 @@ + return b; + } + +-//http://dx.doi.org/10.1016/j.cis.2014.01.018 +-// radius of circle with center on line B-C and connecting at norm of the lines (A-B ode A-C) +-// and sharing one point with the other line. This we define the kissing circle ++/*http://dx.doi.org/10.1016/j.cis.2014.01.018 ++radius of circle with center on line B-C and connecting at norm of the lines (A-B ode A-C) ++and sharing one point with the other line. This we define the kissing circle*/ + double osculating_circle_radius(const Vector& B, const Vector& A, const Vector& C) { + Vector AC = (C-A).Normalised(); + Vector AB = (B-A).Normalised(); +@@ -583,6 +632,27 @@ + + } + ++ ++/* Searches for a sequence of four consecutive nodes in a cell where two specific nodes ++are in the middle positions. ++ ++Parameters: ++c - Pointer to the cell to search in ++z1, z2 - Pointers to the two specific nodes to find in middle positions ++w0, w1, w2, w3 - Pointers to node pointers that will be updated with the found sequence ++ ++This function looks for a sequence of four consecutive nodes in the cell's node list ++where w1 and w2 are equal to z1 and z2 (in any order). It uses a sliding window approach, ++first checking the regular sequence of nodes, then checking wrap-around cases by considering ++nodes from the beginning of the list. This accounts for the circular nature of cell boundaries. ++ ++If a matching sequence is found, the function updates w0, w1, w2, and w3 to point to the ++four consecutive nodes and returns true. If no match is found, it sets all pointers to NULL ++and returns false. ++ ++Returns: ++true if a sequence containing z1 and z2 in middle positions was found ++false otherwise */ + bool Mesh::findOtherSide(CellBase * c,Node * z1,Node * z2,Node ** w0,Node ** w1,Node ** w2,Node ** w3) { + list ::iterator i=c->nodes.begin(); + * w0=*i; +@@ -625,8 +695,25 @@ + *w3=NULL; + return false; + } +-double lambda_for_shift=0.1; ++ + ++double lambda_for_shift=0.1; // Définie en global mais n'est utilisée nulle part, Rouges 2025 ++ ++/* Retrieves the base length of a wall element between two nodes in a cell. ++ ++Parameters: ++c - Pointer to the cell containing the wall element ++n1 - Pointer to the first node ++n2 - Pointer to the second node ++elastic_limit - Factor used to calculate a default length when needed ++ ++This function first tries to get the wall element associated with node n1 in cell c. ++If no wall element exists or if its base length is invalid (NaN), it calculates ++a default length by dividing the distance between the two nodes by the elastic_limit. ++Otherwise, it returns the actual base length stored in the wall element. ++ ++Returns: ++The base length of the wall element, or a calculated default value if unavailable */ + double getBaseLength(CellBase* c,NodeBase* n1, NodeBase * n2,double elastic_limit) { + WallElement* wallElement = n1->getWallElement(c); + if (wallElement == NULL) { +@@ -640,6 +727,20 @@ + } + } + ++ ++/* Retrieves the stiffness of a wall element associated with a node in a cell. ++ ++Parameters: ++c - Pointer to the cell containing the wall element ++n1 - Pointer to the node whose wall element stiffness is needed ++ ++This function first tries to get the wall element associated with node n1 in cell c. ++If no wall element exists or if its stiffness value is invalid (NaN), it returns ++the default wall stiffness from the cell. Otherwise, it returns the actual stiffness ++value stored in the wall element. ++ ++Returns: ++The stiffness of the wall element, or the cell's default wall stiffness if unavailable */ + double getStiffness(CellBase* c,NodeBase* n1) { + WallElement* wallElement = n1->getWallElement(c); + if (wallElement == NULL) { +@@ -653,12 +754,41 @@ + } + } + ++ ++/* RemodelWallElement - Evaluates and potentially executes wall remodeling between connected cells ++ ++Parameters: ++- curves: Vector of CellWallCurve objects to store modified wall information ++- c: Pointer to the current cell being processed ++- w0, w1, w2, w3, w4: Five consecutive nodes in the current cell ++ ++This function evaluates whether inserting a new connection between nodes w1 and w3 ++(replacing the w1-w2 connection) would be energetically favorable. The process: ++ ++1. First identifies the neighboring cell (c2) that shares nodes w1 and w2 ++2. If a valid neighbor cell is found, locates the corresponding sequence of nodes ++ in that cell using findOtherSide (nodes o0-o1-o2-o3) ++3. Calculates the energy of the current configuration using osculating circle radius ++4. Calculates the predicted energy if the remodeling were performed ++5. If the new configuration has lower energy, performs the remodeling by: ++ - Updating node connections in both cells ++ - Updating the geometric properties of affected walls ++ - Recalculating cell areas and neighbor relationships ++ ++The function implements a key biological process where cell walls dynamically ++reorganize to minimize mechanical stress and optimize tissue geometry. ++ ++Returns: void (modifies the mesh structure directly) ++ ++Implemented by Großeholz and al. ++*/ + void Mesh::RemodelWallElement(vector & curves,CellBase* c,Node* w0,Node* w1,Node* w2,Node* w3,Node* w4) { + + Node * o0; + Node * o1; + Node * o2; + Node * o3; ++ + double angle = (*w1-*w2).SignedAngle((*w3-*w2)); + if ((angle>0&&c->BoundaryPolP())||(angle<0&&!c->BoundaryPolP())) { + //we would bend inward and intersect cells +@@ -666,15 +796,14 @@ + } + + CellBase* c2 = getOtherCell(c,w1,w2); +- if (c2 != NULL && !(c2->GetCellVeto()) && findOtherSide(c2,w2,w1,&o0,&o1,&o2,&o3)){ +- ++ if (c2 != NULL && !(c2->GetCellVeto()) && findOtherSide(c2,w2,w1,&o0,&o1,&o2,&o3)){ // + + //now check how profitable the move of wall element w1-w2 to w1-w3 + //this changes also cell c2 where wall element o1->o2 will be replaced + //by wall elements o1->w3 and w3->o2 all other surrounding cells will remain + //unchanged. + double bending_dh = 0.; +- if (abs(par.bend_lambda) > 0.01) { ++ if (abs(par.bend_lambda) > 0.01) { // c'est quoi le critère qui définit la valeur de bend_lambda? , Rouges 2025 + // angles that are before w0-w1-w2/w1-w2-w3/w2-w3-w4 and o0-o1-o2/o1-o2-o3 + // angles after move w0-w1-w3/w1-w3-w4 and o0-o1-w3/o1-w3-o2/w3-o2-o3 + double r1 = osculating_circle_radius(*w0,*w1,*w2); +@@ -682,24 +811,29 @@ + double r3 = osculating_circle_radius(*w2,*w3,*w4); + double r4 = osculating_circle_radius(*w0,*w1,*w3); + double r5 = osculating_circle_radius(*w1,*w3,*w4); ++ + double energy_before = + 1./(r1)+ + 1./(r2)+ + 1./(r3)+ + 1./((osculating_circle_radius(*o0,*o1,*o2)))+ + 1./((osculating_circle_radius(*o1,*o2,*o3))); ++ + double energy_after = + 1./(r4)+ + 1./((osculating_circle_radius(*o1,*w3,*o2)))+ + 1./(r5)+ + 1./((osculating_circle_radius(*o0,*o1,*w3)))+ + 1./((osculating_circle_radius(*w3,*o2,*o3))); +- bending_dh = par.bend_lambda*(energy_after-energy_before*1.5+12.); ++ ++ bending_dh = par.bend_lambda*(energy_after-energy_before*1.5+12.); // comment sont définis ces coefficients (*1.5 et +12)?, Rouges 2025 + } ++ + // the length contraint just needs to be calculated for the wall elements that change length + double wl1=((*w1)-(*w2)).Norm(); + double wl2=((*w3)-(*w2)).Norm(); + double wl3=((*w1)-(*w3)).Norm(); ++ + double s_bef = wl1; + double s_aft = wl3+wl2; + +@@ -708,7 +842,7 @@ + + double length_before = wl1+wl2+wl1; + +- double stiffness = ( ++ double stiffness = ( // Pourquoi j'ai pas getStiffness(c2,01)*wl2 ?, Rouges 2025 + getStiffness(c, w1)*wl1+ + getStiffness(c, w2)*wl2+ + getStiffness(c2, o2)*wl1 +@@ -750,6 +884,21 @@ + } + } + ++ ++/* Extracts base length and stiffness data from a wall element and adds them to provided variables. ++Parameters: ++we: Pointer to the wall element from which to extract data ++base_length: Reference to variable where the base length will be accumulated ++stiffness: Reference to variable where the stiffness will be accumulated ++If the wall element is valid (not NULL): ++Accumulates its base length to the base_length parameter ++For stiffness, checks if the wall element has a valid stiffness value: ++If valid: adds the actual stiffness value ++If invalid (NaN): adds the default stiffness from the wall element's cell ++If the wall element is NULL: ++Sets both base_length and stiffness to NaN to indicate invalid data ++This function is typically used in calculations involving wall properties where ++data needs to be aggregated across multiple wall elements while handling edge cases. */ + void extractData(WallElement *we,double & base_length,double &stiffness) { + if (we != NULL) { + base_length += we->getBaseLength(); +@@ -764,6 +913,8 @@ + } + } + ++ ++ + void Mesh::RemodelCellWallElements(vector & curves,CellBase *c) { + //The algorithm needs at least 5 nodes along the wall + if (c->nodes.size()<5) { +@@ -809,6 +960,11 @@ + RemodelWallElement(curves,c,w0,w1,w2,w3,w4) ; + } + ++ ++/*This function iterates over all cells in the mesh and resets their wall curves. ++For each cell that is not vetoed (i.e., not excluded from processing), it calls RemodelCellWallElements to attempt remodeling of its wall elements. ++After processing all regular cells, it also applies the remodeling to the boundary polygon to ensure the mesh boundary is updated. ++The function always returns 0.0, indicating its main purpose is to perform side effects on the mesh structure.*/ + double Mesh::RemodelWallElements(vector & curves) { + for (vector::iterator ii=cells.begin(); ii!=cells.end(); ii++) { + Cell *c = *ii; +@@ -821,6 +977,8 @@ + return 0.0; + } + ++ ++ + double Mesh::DisplaceNodes(void) { + + MyUrand r(shuffled_nodes.size()); +Index: data/leaves/cambium_updated.xml +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP +<+>\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/data/leaves/cambium_updated.xml b/data/leaves/cambium_updated.xml +--- a/data/leaves/cambium_updated.xml (revision c9763b319a64e0a25643e4681bffbcbc9a263036) ++++ b/data/leaves/cambium_updated.xml (date 1745860595601) +@@ -5,7 +5,7 @@ + + + +- ++ + + + +@@ -1445,7 +1445,7 @@ + + + +- ++ + + + +Index: src/Models/Cambium/cambium.cpp +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP +<+>/*\n *\n * This file is part of the Virtual Leaf.\n *\n * The Virtual Leaf is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * The Virtual Leaf is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with the Virtual Leaf. If not, see .\n *\n * Copyright 2010 Roeland Merks.\n *\n */\n\n#include \n#include \n\n#include \"parameter.h\"\n\n#include \"wallbase.h\"\n#include \"cellbase.h\"\n#include \"cambium.h\"\n#include \"node.h\"\n\nstatic const std::string _module_id(\"$Id$\");\n\n/*\nCell Types and Their Behavior:\n\nCellType(0) : Bark Cells\n- Can grow slightly (prevents potential bugs if restricted completely).\n- Cannot divide.\n- Stiffness = 10 × Cambium stiffness.\n\nCellType(1) : Cambium Cells\n- Can grow until a specific threshold is reached.\n- Upon reaching the threshold, the cell divides:\n - If only one daughter cell is in contact with the bark, it becomes CellType(1) (Cambium), and the other becomes CellType(2) (Growing Xylem).\n - If both daughter cells are in contact with the bark, both become CellType(1).\n\nCellType(2) : Growing Xylem Cells\n- Can grow until they reach a threshold of 3 × BaseArea().\n- Cannot divide.\n- When growth limit is reached, they transform into CellType(3) (Mature Xylem).\n\nCellType(3) : Mature Xylem Cells\n- Cannot grow or divide.\n- Stiffness = 100 × Cambium stiffness.\n*/\n\n\n\nQString cambium::ModelID(void) {\n // specify the name of your model here\n return QString( \"Cambium\" );\n}\n\n// return the number of chemicals your model uses\nint cambium::NChem(void) { return 0; }\n// Constructor - add this code to initialize the bark_cells vector\ncambium::cambium() {\n // Initialize bark cells with the original values\n bark_cells = {0, 15, 27, 28, 21, 20, 29, 16, 17, 18, 19, 24, 25, 23, 22, 26, 14, 1};\n}\n\n// To be executed after cell division\n\nvoid cambium::AfficherNoeuds(CellBase *c) {\n qDebug() << \"=== INFORMATIONS DES NOEUDS DE LA CELLULE \" << c->Index() << \" ===\";\n qDebug() << \"Type de cellule: \" << c->CellType();\n qDebug() << \"Nombre total de noeuds: \" << c->getNodes().size();\n\n int i = 0;\n for (list::const_iterator it = c->getNodes().begin(); it != c->getNodes().end(); ++it, ++i) {\n Node* noeud = *it;\n qDebug() << \"Nœud \" << noeud->Index() << \":\";\n\n qDebug() << \" - À la frontière: \" << (noeud->BoundaryP() ? \"Oui\" : \"Non\");\n\n }\n qDebug() << \"=========================================\";\n}\n\nvoid cambium::SetCellTypeProperties(CellBase *c) { // Set cell properties\n/* SetLambdaLength => Cette propriété fout la merde partout :\n -les cellules \"coulent\" avec une valeur élevée(>2)\n -une valeur très faible pour l'écorce (<0.01) fait que les cellules ne s'immmicent pas entre les cellules d'écorce\nNormal c'est le coefficient d'élasticité de la paroi donc elle peut s'allnger de lambda* la valeut initiiale (?)\n*/\n if (c->CellType()==0){\n c-> SetWallStiffness(3);\n c-> SetLambdaLength(0);\n }\n else if (c->CellType()==1){\n c-> SetWallStiffness(1);\n c-> SetLambdaLength(0);\n }\n else if (c->CellType()==2){\n c-> SetWallStiffness(1);\n c-> SetLambdaLength(0);\n }\n else {\n c-> SetWallStiffness(1);\n c-> SetLambdaLength(0);\n }\n}\n\n\n\n\nvoid cambium::SetCellColor(CellBase *c, QColor *color) {\n //cell Coloring depending on type\n if (c->CellType()==0){\n if (c->Area() < 0.8 * c->BaseArea()) {\n color->setNamedColor(\"yellow\");\n }\n else {\n color->setNamedColor(\"brown\");\n }\n }\n else if (c->CellType()==1){\n color->setNamedColor(\"red\");\n }\n else if (c->CellType()==2){\n color->setNamedColor(\"lightblue\");\n }\n else {\n color->setNamedColor(\"blue\");\n }\n}\n\n\nvoid cambium::OnDivide(ParentInfo *parent_info, CellBase *daughter1, CellBase *daughter2) {\n // Rules to be executed after cell division go here\n // (e.g., cell differentiation rules)\n\n// Partie division de la solution n°1 à propos des cellules de cambium\n//qui touchent l'extérieur\n\n // Vérifier si c'est une division spéciale\n int parent_id1 = daughter1->Index(); // Récupérer l'ID de la cellule mère via une fille\n int parent_id2 = daughter2->Index();\n if (special_division_cells.find(parent_id1) != special_division_cells.end() or special_division_cells.find(parent_id2) != special_division_cells.end() ) {\n // Déterminer quelle cellule fille est plus proche de l'extérieur\n bool d1_more_exposed = false;\n bool d2_more_exposed = false;\n\n // Compter les nœuds exposés pour chaque cellule fille\n int d1_exposed_nodes = 0;\n int d2_exposed_nodes = 0;\n\n for (auto node_it = daughter1->getNodes().begin(); node_it != daughter1->getNodes().end(); ++node_it) {\n if ((*node_it)->BoundaryP()) d1_exposed_nodes++;\n }\n\n for (auto node_it = daughter2->getNodes().begin(); node_it != daughter2->getNodes().end(); ++node_it) {\n if ((*node_it)->BoundaryP()) d2_exposed_nodes++;\n }\n\n d1_more_exposed = (d1_exposed_nodes > d2_exposed_nodes);\n d2_more_exposed = (d2_exposed_nodes > d1_exposed_nodes);\n\n // Transformer la cellule plus exposée en écorce, l'autre reste cambium\n if (d1_more_exposed) {\n daughter1->SetCellType(0); // Écorce\n daughter2->SetCellType(1); // Cambium\n\n // Ajouter la nouvelle cellule d'écorce à notre liste\n bark_cells.push_back(daughter1->Index());\n } else {\n daughter1->SetCellType(1); // Cambium\n daughter2->SetCellType(0); // Écorce\n\n // Ajouter la nouvelle cellule d'écorce à notre liste\n bark_cells.push_back(daughter2->Index());\n }\n\n // Supprimer la cellule de notre ensemble après traitement\n special_division_cells.erase(parent_id1);\n special_division_cells.erase(parent_id2);\n return;\n }\n\n\n // Construct neighbor lists for both daughter cells\n daughter1->GetNeighborIndices();\n daughter2->GetNeighborIndices();\n // Get neighbor indices for both daughter cells\n std::vector d1_neighbor_indices = daughter1->GetNeighborIndices();\n std::vector d2_neighbor_indices = daughter2->GetNeighborIndices();\n\n // Check if daughter cells are neighbors with any bark cells\n bool d1_neighbors_bark = false;\n bool d2_neighbors_bark = false;\n\n // Check daughter1's neighbors\n for (auto idx : d1_neighbor_indices) {\n if (std::find(bark_cells.begin(), bark_cells.end(), idx) != bark_cells.end()) {\n d1_neighbors_bark = true; // daughter1 has a neighbor bark cell\n //qDebug() << \"Daughter1 (ID:\" << daughter1->Index() << \") is neighbor with bark cell ID:\" << idx;\n }\n }\n\n // Check daughter2's neighbors\n for (auto idx : d2_neighbor_indices) {\n if (std::find(bark_cells.begin(), bark_cells.end(), idx) != bark_cells.end()) {\n d2_neighbors_bark = true; // daughter1 has a neighbor bark cell\n //qDebug() << \"Daughter2 (ID:\" << daughter2->Index() << \") is neighbor with bark cell ID:\" << idx;\n }\n }\n\n // Handle the case where both daughter cells are neighbors to bark cells\n if (d1_neighbors_bark && d2_neighbors_bark) {\n // Both cells become type 1 (Cambium cells)\n daughter1->SetCellType(1);\n daughter2->SetCellType(1);\n }\n // Handle cases where only one daughter cell is neighbor to bark cells\n else if (d1_neighbors_bark) { // Daughter 1 is neighbor to a bark cell\n daughter1->SetCellType(1); // Daughter 1 becomes a Cambium cell on division\n daughter2->SetCellType(2); // Daughter 2 becomes a Growing Xylem on division\n }\n else if (d2_neighbors_bark) {// Daughter 2 is neighbor to a bark cell\n daughter1->SetCellType(2);// Daughter 1 becomes a Growing Xylem on division\n daughter2->SetCellType(1);// Daughter 2 becomes a Cambium cell on division\n }\n else { // Neither are neighbor to a bark cell.\n daughter1->SetCellType(2);// Daughter 1 becomes a Growing Xylem cell on division\n daughter2->SetCellType(2);// Daughter 2 becomes a Growing Xylem cell on division\n }\n /*\n // Debug print to confirm new cell types\n qDebug() << \"New cell types - Daughter1 (ID:\" << daughter1->Index() << \") is now type:\" << daughter1->CellType()\n << \", Daughter2 (ID:\" << daughter2->Index() << \") is now type:\" << daughter2->CellType();\n */\n /*\n // Print all bark cell IDs after division\n qDebug() << \"Bark cells after division:\" << bark_cells.size() << \"cells:\";\n QStringList bark_ids;\n for (auto id : bark_cells) {\n bark_ids << QString::number(id);\n }\n qDebug() << \"Barks cells :\" << bark_cells.size() << \"cell IDs: [\" << bark_ids.join(\", \") << \"]\";\n */\n}\n\n\n\n\nvoid cambium::CellHouseKeeping(CellBase *c) { // How cells behave after division\n SetCellTypeProperties(c);\n /*//See value of lambda_length prperty (i.e Spring constant of wall elements, idk the difference between this and wall stiffness)\n qDebug() << \"Processing cell in CellHouseKeeping. Cell ID:\" << c->Index()\n << \", Type:\" << c->CellType()\n << \", Lambda_Length:\" << c->GetLambdaLength();*/\n /*// See value of the wall stiffness property\n qDebug() << \"Processing cell in CellHouseKeeping. Cell ID:\" << c->Index()\n << \", Type:\" << c->CellType()\n << \", Wall Stiffness:\" << c->GetWallStiffness();*/\n\n\n // Check if a cambium cell is no longer adjacent to the bark, if not it has to be transformed into a Growing Xylem cell\n\nif (c->CellType() == 1) {\n\n/* Solution n°1 au problème du cambium qui touche l'extérieur :\nla cellule de cambium se divise en deux et la cellule la plus a l'extérieur\nse transforme en cellule d'écorce.\nC'est pas forcément la bonne approche mais ça fonctionne.\nVoir solution n°2 dans la méthode CellHouseKeeping partie CellType(0)\n*/\n\n // Vérifier si des nœuds de la cellule sont exposés à l'extérieur\n bool nodeExposed = false;\n Node* exposedNode = nullptr;\n Vector boundaryDirection;\n AfficherNoeuds(c);\n\n // Parcourir tous les nœuds de la cellule\n for (list::const_iterator it = c->getNodes().begin(); it != c->getNodes().end(); ++it) {\n Node* noeud = *it;\n if (noeud->BoundaryP()) { // Correction: noeud au lieu de node\n nodeExposed = true;\n exposedNode = noeud;\n\n qDebug() << \"=== DIVISION CELLULE EXPOSÉE ===\";\n qDebug() << \"Cellule cambium ID:\" << c->Index() << \"a un nœud exposé\";\n\n // Forcer la division selon cet axe\n c->Divide();\n\n // OnDivide s'occupera du reste\n special_division_cells.insert(c->Index());\n return; // Sortir après avoir initié la division\n }\n }\n\n // Si aucun nœud exposé n'a été trouvé\n if (!nodeExposed) {\n qDebug() << \"Aucun nœud exposé trouvé pour la cellule cambium ID:\" << c->Index();\n }\n\n/* Solution pour les cellules de cambium qui se retrouvent au milieu\ndu tissu de Xylème :\n- It does't work because for the new isolated bark cell, the program still consider a bark cell as a neighbor,\nto resolve this issue actualize the neighbor cell list.\n\n\n std::vector neighbor_indices = c->GetNeighborIndices();\n //c->SetWallStiffness(1.0);\n // Check if at least one neighbor is a bark cell\n bool has_bark_neighbor = false;\n for (auto idx : neighbor_indices) {\n if (std::find(bark_cells.begin(), bark_cells.end(), idx) != bark_cells.end()) {\n has_bark_neighbor = true;\n break;\n }\n }\n\n // Logs if cambium cell has no neighbor bark cell before transforming it into bark cell\n if (!has_bark_neighbor) {\n qDebug() << \"=== CAMBIUM ISOLÉ DÉTECTÉ ===\";\n qDebug() << \"Cellule ID:\" << c->Index() << \", Area:\" << c->Area() << \", BaseArea:\" << c->BaseArea();\n qDebug() << \"Position: (\" << c->Centroid().x << \",\" << c->Centroid().y << \")\";\n\n // Liste des indices des voisins (sans accéder aux objets voisins)\n qDebug() << \"Indices des\" << neighbor_indices.size() << \"voisins:\";\n for (auto idx : neighbor_indices) {\n qDebug() << \" - Voisin ID:\" << idx;\n }\n\n // Vérifie si les voisins sont des cellules d'écorce\n qDebug() << \"Vérification bark_cells:\";\n for (auto bark_idx : bark_cells) {\n qDebug() << \" - Bark cell ID:\" << bark_idx;\n }\n\n qDebug() << \"Analyse: La cellule cambium est isolée, transformation en Growing Xylem (type 2)\";\n qDebug() << \"==============================\";\n\n c->SetCellType(2);\n\n return;\n\n }\n*/\n\n // Normal behavior for cambium cells\n c->EnlargeTargetArea(par->cell_expansion_rate);\n if (c->Area() > par->rel_cell_div_threshold * c->BaseArea()) {\n c->Divide();\n }\n }\n else if(c->CellType() == 2) { // If cell is a type 2, grow until it reach 3*BaseArea then transform into a Type 3\n\n if (c->Area() < 3 * c->BaseArea()) {\n c->EnlargeTargetArea(par->cell_expansion_rate);\n }\n else {\n c->SetCellType(3); // Set grown Type 2 cell to a Type 3\n\n }\n }\n else if (c->CellType() == 0) {\n/* If the cell is a bark cell (i.e., type 0), we need to slightly enlarge it to prevent excessive stretching,\n which could cause issues in the simulation. This adjustment ensures stability during runtime. */\n\n double perimeter = c->ExactCircumference(); // perimètre de ma cellule\n double area = c->Area();\n double ratio = perimeter / sqrt(area);\n\n if (ratio > 6.0) {\n // La cellule est trop déformée, augmenter sa rigidité\n c->SetWallStiffness(c->GetWallStiffness() * 1.5);\n // Forcer une légère expansion\n c->EnlargeTargetArea(2.0 * par->cell_expansion_rate);\n\n }\n }\n //if ()\n\n}\n\nvoid cambium::CelltoCellTransport(Wall *w, double *dchem_c1, double *dchem_c2) {\n // add biochemical transport rules here\n}\nvoid cambium::WallDynamics(Wall *w, double *dw1, double *dw2) {\n // add biochemical networks for reactions occuring at walls here\n}\nvoid cambium::CellDynamics(CellBase *c, double *dchem) {\n // add biochemical networks for intracellular reactions here\n}\n#include // Ajoutez cet include en haut du fichier\n\n\n\n\n//Q_EXPORT_PLUGIN2(cambium, cambium)\n +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/src/Models/Cambium/cambium.cpp b/src/Models/Cambium/cambium.cpp +--- a/src/Models/Cambium/cambium.cpp (revision c9763b319a64e0a25643e4681bffbcbc9a263036) ++++ b/src/Models/Cambium/cambium.cpp (date 1746540008374) +@@ -95,7 +95,7 @@ + Normal c'est le coefficient d'élasticité de la paroi donc elle peut s'allnger de lambda* la valeut initiiale (?) + */ + if (c->CellType()==0){ +- c-> SetWallStiffness(3); ++ c-> SetWallStiffness(1); + c-> SetLambdaLength(0); + } + else if (c->CellType()==1){ +@@ -140,7 +140,7 @@ + void cambium::OnDivide(ParentInfo *parent_info, CellBase *daughter1, CellBase *daughter2) { + // Rules to be executed after cell division go here + // (e.g., cell differentiation rules) +- ++/* + // Partie division de la solution n°1 à propos des cellules de cambium + //qui touchent l'extérieur + +@@ -187,7 +187,7 @@ + special_division_cells.erase(parent_id2); + return; + } +- ++ */ + + // Construct neighbor lists for both daughter cells + daughter1->GetNeighborIndices(); +@@ -276,7 +276,7 @@ + C'est pas forcément la bonne approche mais ça fonctionne. + Voir solution n°2 dans la méthode CellHouseKeeping partie CellType(0) + */ +- ++ /* + // Vérifier si des nœuds de la cellule sont exposés à l'extérieur + bool nodeExposed = false; + Node* exposedNode = nullptr; +@@ -306,7 +306,7 @@ + if (!nodeExposed) { + qDebug() << "Aucun nœud exposé trouvé pour la cellule cambium ID:" << c->Index(); + } +- ++ */ + /* Solution pour les cellules de cambium qui se retrouvent au milieu + du tissu de Xylème : + - It does't work because for the new isolated bark cell, the program still consider a bark cell as a neighbor, +Index: src/GUI/cell.h +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP +<+>/*\n *\n * $Id$\n *\n * This file is part of the Virtual Leaf.\n *\n * VirtualLeaf is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * VirtualLeaf is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with the Virtual Leaf. If not, see .\n *\n * Copyright 2010 Roeland Merks.\n *\n */\n\n#ifndef _CELL_H_\n#define _CELL_H_\n\n#include \n#include \n#include \n#include \n#include \"vector.h\"\n#include \"parameter.h\"\n#include \"wall.h\"\n#include \"warning.h\"\n#include \"cellbase.h\"\n#include \"Neighbor.h\"\n//#include \"cell.h\"\n\n#include \n#include \n#include \n#include \n\nenum DivisionAxisType { // Division selon un axe bien défini, Rajout Rouges 2025\n SHORTEST_AXIS = 0,\n LONGEST_AXIS = 1,\n RANDOM_AXIS = 2,\n MECHANICAL_AXIS = 3\n};\n\nclass Cell : public CellBase \n{\n\n Q_OBJECT\n friend class Mesh;\n friend class FigureEditor;\n\n public:\n Cell(double x, double y, double z = 0.);\n Cell(void);\n Cell(const Cell &src);\n Cell operator=(const Cell &src);\n bool Cmp(Cell*) const;\n bool Eq(Cell*) const;\n\n inline bool IndexEquals(int i) { return i == index; }\n\n static void SetMagnification(const double &magn) {\n factor=magn;\n }\n static Vector Offset(void) {\n Vector offs;\n offs.x=offset[0];\n offs.y=offset[1];\n return offs;\n }\n\n static void Translate(const double &tx,const double &ty) {\n offset[0]+=tx;\n offset[1]+=ty;\n }\n\n inline static double Factor(void) {\n return factor;\n }\n static void setOffset(double ox, double oy) {\n offset[0]=ox;\n offset[1]=oy;\n }\n static double Magnification(void) {\n return factor;\n }\n\n static double Scale(const double scale) {\n factor*=scale;\n return factor;\n }\n void Divide(void); // Divide cell over a chosen axis, Rajout Rouges 2025\n Vector CalculateDivisionAxis(void);\n\n void DivideOverAxis(Vector axis); // divide cell over axis\n\n // divide over the line (if line and cell intersect)\n bool DivideOverGivenLine(const Vector v1, const Vector v2, bool wall_fixed = false, NodeSet *node_set = 0);\n\n\n /*void Divide(void) { // Divide cell over short axis\n\n Vector long_axis;\n Length(&long_axis);\n DivideOverAxis(long_axis.Perp2D());\n }\n*/\n\n\n\n\n //void CheckForGFDrivenDivision(void);\n inline int NNodes(void) const { return nodes.size(); }\n\n void Move(Vector T);\n void Move(double dx, double dy, double dz=0) {\n Move( Vector (dx, dy, dz) );\n }\n\n double Displace(double dx, double dy, double dh);\n void Displace(void);\n double Energy(void) const;\n bool SelfIntersect(void);\n bool MoveSelfIntersectsP(Node *nid, Vector new_pos);\n bool LinePieceIntersectsP(const Vector v1, const Vector v2) const;\n bool IntersectsWithLineP(const Vector v1, const Vector v2);\n\n void XMLAdd(QDomDocument &doc, QDomElement &cells_node) const;\n\n void ConstructWalls(void);\n void Flux(double *flux, double *D);\n\n void OnClick(QMouseEvent *e);\n inline Mesh& getMesh(void) const { return *m; }\n double MeanArea(void);\n\n void Apoptose(void); // Cell kills itself\n list::iterator RemoveWall( Wall *w );\n void AddWall( Wall *w );\n\n void Draw(QGraphicsScene *c, bool showStiffness, QString tooltip = \"\");\n\n // Draw a text in the cell's center\n void DrawText(QGraphicsScene *c, const QString &text) const;\n void DrawIndex(QGraphicsScene *c) const;\n void DrawCenter(QGraphicsScene *c) const;\n void DrawNodes(QGraphicsScene *c) const;\n void DrawMiddleLamella(QGraphicsScene *c, QString tooltip = \"\");\n\n void DrawAxis(QGraphicsScene *c) const;\n void DrawStrain(QGraphicsScene *c) const;\n void DrawFluxes(QGraphicsScene *c, double arrowsize = 1.);\n void DrawWalls(QGraphicsScene *c) const;\n void DrawValence(QGraphicsScene *c) const;\n void EmitValues(double t);\n void insertNodeAfterFirst(NodeBase * position1, NodeBase * position2, NodeBase * newNode);\n virtual void correctNeighbors();\n virtual WallBase* newWall(NodeBase* from,NodeBase* to,CellBase * other);\n virtual void InsertWall( WallBase *w );\n virtual CellBase* getOtherWallElementSide(NodeBase * spikeEnd,NodeBase * over);\n virtual double elastic_limit();\n\n signals:\n void ChemMonValue(double t, double *x);\n\n protected:\n void XMLAddCore(QDomDocument &doc, QDomElement &xmlcell) const;\n int XMLRead(QDomElement &cur);\n void DivideWalls(ItList new_node_locations, const Vector from, const Vector to, bool wall_fixed = false, NodeSet *node_set = 0);\n\n private:\n\n static QPen *cell_outline_pen;\n static double offset[3];\n static double factor;\n Mesh *m;\n void ConstructConnections(void);\n void SetWallLengths(void);\n void checkCellLooseWallEnds(Wall * wall,bool&n1Connected,bool&n2Connected);\n Node * followNeighborsToWall(Node * n1, Node * n2, double &distance);\n Neighbor getNeighbor(Node * node);\n Wall* getBoundaryWallAt(Node * node);\n Node * attachFreeWallEnd(Cell * cellWithOtherWalls, Cell * cellWithSingleWalls, Wall * wall, Node * loseWallNode);\n Wall * findWall(Node * n1, Node * n2);\n void splittWallElementsBetween(Node* node, Cell* daughter);\n\n void findBeforeAfter(Node * node, Node ** before, Node**after);\n Cell* findOtherCell(Cell*other, Node * node, Node * node2);\n Cell* findNeighbourCellOnDivide(Cell* daughter,Node* node,Node * before1,Node * after1 ,Node * before2,Node * after2);\n\n};\n\n\n// Boundarypolygon is a special cell; will not increase ncells\n// and will not be part of Mesh::cells\nclass BoundaryPolygon : public Cell {\n\n public:\n BoundaryPolygon(void) : Cell() {\n NCells()--;\n index=-1;\n }\n\n BoundaryPolygon(double x,double y,double z=0) : Cell (x,y,z) {\n NCells()--;\n index=-1;\n }\n\n BoundaryPolygon &operator=(Cell &src) {\n Cell::operator=(src);\n index=-1;\n return *this;\n }\n virtual void Draw(QGraphicsScene *c, QString tooltip = \"\");\n\n virtual void XMLAdd(QDomDocument &doc, QDomElement &parent_node) const;\n\n virtual bool BoundaryPolP(void) const { return true; } \n};\n\n#endif\n\n/* finis */\n +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/src/GUI/cell.h b/src/GUI/cell.h +--- a/src/GUI/cell.h (revision c9763b319a64e0a25643e4681bffbcbc9a263036) ++++ b/src/GUI/cell.h (date 1746622456538) +@@ -95,8 +95,9 @@ + factor*=scale; + return factor; + } +- void Divide(void); // Divide cell over a chosen axis, Rajout Rouges 2025 +- Vector CalculateDivisionAxis(void); ++ ++// void Divide(void); // Divide cell over a chosen axis, Rajout Rouges 2025 ++// Vector CalculateDivisionAxis(void); + + void DivideOverAxis(Vector axis); // divide cell over axis + +@@ -104,13 +105,13 @@ + bool DivideOverGivenLine(const Vector v1, const Vector v2, bool wall_fixed = false, NodeSet *node_set = 0); + + +- /*void Divide(void) { // Divide cell over short axis ++ void Divide(void) { // Divide cell over short axis + + Vector long_axis; + Length(&long_axis); + DivideOverAxis(long_axis.Perp2D()); + } +-*/ ++ + + + +Index: src/GUI/cell.cpp +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP +<+>/*\n *\n * This file is part of the Virtual Leaf.\n *\n * VirtualLeaf is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * VirtualLeaf is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with the Virtual Leaf. If not, see .\n *\n * Copyright 2010 Roeland Merks.\n *\n */\n\n#include \n\n#include \n#include \"pi.h\"\n#include \"cell.h\"\n#include \"node.h\"\n#include \"mesh.h\"\n#include \"tiny.h\"\n#include \"nodeset.h\"\n#include \"cellitem.h\"\n#include \"nodeitem.h\"\n#include \"qcanvasarrow.h\"\n#include \"parameter.h\"\n\n\nstatic const std::string _module_id(\"$Id$\");\n\nextern Parameter par;\n\ndouble Cell::factor=1.;\ndouble Cell::offset[3]={0,0,0};\n\nCell::Cell(void) : CellBase()\n{\n m=0;\n}\n\nCell::Cell(double x, double y, double z) : CellBase(x,y,z)\n{\n m=0;\n}\n\nCell::Cell(const Cell &src) : CellBase(src)\n{\n m=src.m;\n}\n\nbool Cell::Cmp(Cell *c) const { return this->Index() < c->Index(); }\nbool Cell::Eq(Cell *c) const { return this->Index() == c->Index(); }\n\nCell Cell::operator=(const Cell &src) \n{\n CellBase::operator=(src);\n m=src.m;\n return *this;\n}\n\n\nDivisionAxisType axis_type = static_cast(par.division_axis_type);\nVector Cell::CalculateDivisionAxis(void) {\n // Déclaration des variables locales\n Vector axis;\n Vector long_axis;\n double width = 0.0;\n switch(static_cast(par.division_axis_type)) {\n case SHORTEST_AXIS:\n // Calculer le grand axe puis prendre sa perpendiculaire\n Length(&long_axis, &width);\n axis = long_axis.Perp2D();\n break;\n }\n case LONGEST_AXIS: {\n // Utiliser le grand axe\n Length(&long_axis, &width);\n axis = long_axis;\n break;\n }\n case RANDOM_AXIS: {\n // Générer un axe aléatoire\n double angle = 2 * Pi * RANDOM();\n axis = Vector(cos(angle), sin(angle), 0);\n break;\n }\n /*case MECHANICAL_AXIS: {\n // Calcul basé sur les contraintes mécaniques\n Vector stress_direction;\n\n // Sommation des forces sur tous les nœuds\n for (list::iterator i = nodes.begin(); i != nodes.end(); i++) {\n stress_direction += (*i)->CalcForce();\n }\n\n if (stress_direction.Norm() > 1e-6) {\n // Direction perpendiculaire à la contrainte principale\n axis = stress_direction.Normalised().Perp2D();\n } else {\n // Par défaut, utiliser le grand axe\n Length(&long_axis, &width);\n axis = long_axis;\n }\n break;\n }*/\n default: {\n // Par défaut, utiliser le petit axe\n Length(&long_axis, &width);\n axis = long_axis.Perp2D();\n break;\n }\n }\n\n // Définir division_axis pour la cellule si nécessaire\n if (division_axis) {\n *division_axis = axis;\n }\n\n return axis;\n}\n\nvoid Cell::Divide(void) {\n Vector division_axis = CalculateDivisionAxis();\n DivideOverAxis(division_axis);\n}\n\n\n\nvoid Cell::DivideOverAxis(Vector axis) \n{\n // Build a wall\n // -> find the position of the wall\n\n // better look for intersection with a simple line intersection algorithm as below?\n // this leads to some exceptions: e.g. dividing a horizontal rectangle.\n // leaving it like this for the time being\n\n if (dead) return;\n\n Vector centroid=Centroid();\n double prev_cross_z=(axis * (centroid - *(nodes.back()) ) ).z ;\n\n ItList new_node_locations;\n\n for (list::iterator i=nodes.begin(); i!=nodes.end(); i++) {\n\n // cross product to detect position of division\n Vector cross = axis * (centroid - *(*i));\n\n if (cross.z * prev_cross_z < 0 ) {\n\n new_node_locations.push_back(i);\n\n }\t\t\n prev_cross_z=cross.z;\n }\n\n DivideWalls(new_node_locations, centroid, centroid+axis);\n}\n\ndouble Cell::MeanArea(void)\n{\n return m->MeanArea();\n}\n\n\nvoid Cell::Apoptose(void)\n{\n // First kill walls\n#ifdef QDEBUG\n qDebug() << \"This is cell \" << Index() << endl;\n qDebug() << \"Number of walls: \" << walls.size() << endl;\n#endif\n for (list::iterator w=walls.begin(); w!=walls.end(); w++) {\n#ifdef QDEBUG\n qDebug() << \"Before apoptosis, wall \" << (*w)->Index() << \" says: c1 = \"\n\t << (*w)->c1->Index() << \", c2 = \" << (*w)->c2->Index() << endl;\n#endif\n }\n for (list::iterator w=walls.begin(); w!=walls.end(); w++) {\n\n#ifdef QDEBUG\n bool illegal_flag = false;\n if ((*w)->c1 == (*w)->c2 )\n illegal_flag=true;\n#endif\n if ((*w)->c1 == this) {\n\n // invert wall?\n (*w)->c1 = (*w)->c2; \n (*w)->c2 = m->boundary_polygon;\n\n Node *n1 = (*w)->n1;\n (*w)->n1 = (*w)->n2;\n (*w)->n2 = n1;\n\n } else {\n (*w)->c2 = m->boundary_polygon;\n }\n\n#ifdef QDEBUG\n if (illegal_flag && (*w)->c1==(*w)->c2) {\n qDebug() << \"I created an illegal wall.\" << endl;\n }\n#endif\n\n if ( ((*w)->N1()->DeadP() || (*w)->N2()->DeadP()) ||\n\t ((*w)->C1() == (*w)->C2() ) ){\n // kill wall\n#ifdef QDEBUG\n qDebug() << \"Killing wall.\" << endl;\n#endif\n (*w)->Kill();\n\n#ifdef QDEBUG\n if ((*w)) {\n\tqDebug() << \"Wall \" << (*w)->Index() << \" says: c1 = \" \n\t\t << (*w)->c1->Index() << \", c2 = \" << (*w)->c2->Index() << endl;\n }\n#endif\n (*w)=0;\n } else {\n#ifdef QDEBUG\n qDebug() << \"Not killing wall.\" << endl;\n qDebug() << \"Wall \" << (*w)->Index() << \" says: c1 = \" \n\t << (*w)->c1->Index() << \", c2 = \" << (*w)->c2->Index() << endl;\n#endif\n }\n }\n walls.remove(0);\n\n // Unregister me from my nodes, and delete the node if it no longer belongs to any cells\n list superfluous_nodes;\n for (list::iterator n=nodes.begin(); n!=nodes.end(); n++) {\n\n Node &no(*(*n));\n // locate myself in the node's owner list\n list::iterator cellpos;\n bool cell_found=false;\n for (list::iterator nb=no.owners.begin(); nb!=no.owners.end(); nb++) {\n if (nb->cell == this) {\n\tcellpos = nb;\n\tcell_found = true;\n\tbreak;\n }\n }\n\n if (!cell_found) {\n // I think this cannot happen; but if I am wrong, unpredictable things would happen. So throw an exception.\n throw (\"Cell not found in CellBase::Apoptose()\\n\\rPlease correct the code to handle this situation.\");\n }\n\n Neighbor tmp = *cellpos;\n no.owners.erase(cellpos);\n\n // if node has no owners left, or only has a connection to special cell -1 (outside world), mark it as dead.\n\n if (no.owners.size()==0 || (no.owners.size()==1 && no.owners.front().cell->BoundaryPolP()) ) {\n no.MarkDead();\n } else {\n // register node with outside world\n if (find_if( no.owners.begin(), no.owners.end(), \n\t\t [this](auto neighbor){return neighbor.CellEquals(m->boundary_polygon->Index());} ) == no.owners.end() ) {\n\ttmp.cell = m->boundary_polygon;\n\tno.owners.push_back(tmp);\n }\n }\n }\n\n // mark cell as dead\n MarkDead();\n}\n\nvoid Cell::ConstructConnections(void)\n{\n // Tie up the nodes of this cell, assuming they are correctly ordered\n\n //cerr << \"Constructing connections of cell \" << index << endl;\n\n for (list::iterator i=nodes.begin(); i!=nodes.end(); i++) {\n\n //cerr << \"Connecting node \" << *i << endl;\n //cerr << \"Node \" << *i << endl << \" = \" << *(*i) << endl;\n // 1. Tidy up existing connections (which are part of this cell)\n if ((*i)->owners.size()>0) {\n list::iterator neighb_with_this_cell=\n\t// remove myself from the neighbor list of the node\n\tfind_if((*i)->owners.begin(),\n\t\t(*i)->owners.end(),\n\t\t [this](auto neighbor){return neighbor.CellEquals(this->Index());});\n if (neighb_with_this_cell!=(*i)->owners.end()) \n\t(*i)->owners.erase(neighb_with_this_cell);\n }\n\n Node *previous;\n if (i!=nodes.begin()) {\n list::iterator previous_iterator=i;\n previous_iterator--;\n previous=*previous_iterator;\n } else {\n previous=nodes.back();\n }\n\n Node *next;\n list::iterator next_iterator=i;\n next_iterator++;\n if (next_iterator==nodes.end()) {\n next=nodes.front();\n } else {\n next=*next_iterator;\n }\n (*i)->owners.push_back( Neighbor( this, previous, next ) );\n }\n}\n\nbool Cell::DivideOverGivenLine(const Vector v1, const Vector v2, bool fix_cellwall, NodeSet *node_set )\n{\n if (dead) return false;\n\n // check each edge for intersection with the line\n ItList new_node_locations;\n\n#ifdef QDEBUG\n qDebug() << \"Cell \" << Index() << \" is doing DivideOverGivenLine\" << endl;\n#endif\n for (list::iterator i=nodes.begin(); i!=nodes.end(); i++) {\n\n Vector v3 = *(*i);\n list::iterator nb=i;\n nb++;\n if (nb == nodes.end()) {\n nb = nodes.begin();\n }\n Vector v4 = *(*nb);\n\n double denominator = \n (v4.y - v3.y)*(v2.x - v1.x) - (v4.x - v3.x)*(v2.y - v1.y);\n\n double ua = \n ((v4.x - v3.x)*(v1.y - v3.y) - (v4.y - v3.y)*(v1.x -v3.x))/denominator;\n double ub = \n ((v2.x - v1.x)*(v1.y-v3.y) - (v2.y- v1.y)*(v1.x - v3.x))/denominator;\n\n\n //cerr << \"Edge \" << *i << \" to \" << *nb << \": ua = \" << ua << \", ub = \" << ub << \": \";\n // this construction with \"TINY\" should simulate open/closed interval <0,1]\n if ( ( TINY < ua && ua < 1.+TINY ) && ( TINY < ub && ub < 1.+TINY ) ) {\n // yes, intersection detected. Push the location to the list of iterators\n new_node_locations.push_back(nb);\n\n } \n }\n\n#ifdef QDEBUG\n if (new_node_locations.size()<2) { \n qDebug() << \"Line does not intersect with two edges of Cell \" << Index() << endl;\n qDebug() << \"new_node_locations.size() = \" << new_node_locations.size() << endl;\n return false;\n }\n\n ItList::iterator i = new_node_locations.begin();\n list< Node *>::iterator j;\n qDebug() << \"-------------------------------\" << endl;\n qDebug() << \"Location of new nodes: \" << (**i)->Index() << \" and \";\n\n ++i;\n j = *i; \n if (j==nodes.begin()) j=nodes.end(); j--;\n\n qDebug() << (*j)->Index() << endl;\n qDebug() << \"-------------------------------\" << endl;\n\n if ( **new_node_locations.begin() == *j ) {\n qDebug() << \"Rejecting proposed division (cutting off zero area).\" << endl;\n return false;\n }\n#endif\n\n DivideWalls(new_node_locations, v1, v2, fix_cellwall, node_set);\n\n return true;\n}\nvoid Cell::checkCellLooseWallEnds(Wall * wall,bool&n1Connected,bool&n2Connected) {\n\tn1Connected = false;\n\tn2Connected = false;\n\t// check free swinging wall\n\tfor (list::iterator w = walls.begin(); w!=walls.end(); w++) {\n\t\t Wall* other = *w;\n\t\t if (wall != other && (wall->N1()==other->N1() ||wall->N1()==other->N2() )){\n\t\t\t n1Connected=true;\n\t\t }\n\t\t if (wall != other && (wall->N2()==other->N1() ||wall->N2()==other->N2() )){\n\t\t\t n2Connected=true;\n\t\t }\n\t\t if (n1Connected&& n2Connected) {\n\t\t\t break;\n\t\t }\n\t}\n}\n\nNeighbor Cell::getNeighbor(Node * node) {\n\t Neighbor result;\n\t Neighbor * presult=&result;\n\t node->LoopNeighbors([this,presult](auto neighbor){\n\t\t if (neighbor.cell == this) {\n\t\t\t (*presult) = neighbor;\n\t\t }\n\t });\n\t return result;\n}\n\nWall* Cell::getBoundaryWallAt(Node * node) {\n\tWall* wall=NULL;\n\tWall** pwall=&wall;\n\t this->LoopWalls([node,pwall,this](auto wall){\n\t\t if ((wall->N1()==node ||wall->N1()==node)&& (wall->C1()==this->m->boundary_polygon ||wall->C2()==this->m->boundary_polygon) ) {\n\t\t\t *pwall=wall;\n\t\t }\n\t });\n\t return wall;\n}\n\nNode * Cell::followNeighborsToWall(Node * n1, Node * n2, double &distance) {\n\tbool isWallEnd=false;\n\tbool* pisWallEnd=&isWallEnd;\n\t this->LoopWalls([n2,pisWallEnd](auto wall){\n\t\t if (wall->N1()==n2 ||wall->N2()==n2) {\n\t\t\t *pisWallEnd=true;\n\t\t }\n\t });\n\t if (isWallEnd) {\n\t\t return n2;\n\t }else {\n\t\t Neighbor neighbor = getNeighbor(n2);\n\t\t distance+=((*n1)-(*n2)).Norm();\n\t\t Node * other = neighbor.nb1 == n1?neighbor.nb2:neighbor.nb1;\n\t\t return followNeighborsToWall( n2, other, distance);\n\t }\n}\n\nWall * Cell::findWall(Node * n1, Node * n2) {\n\tWall* splittWall = NULL;\n\tWall** psplittWall = &splittWall;\n\n\tLoopWalls([psplittWall,n1,n2](auto wallToSplit) {\n\t\tif (wallToSplit->N1() == n1 && wallToSplit->N2() == n2) {\n\t\t\t(*psplittWall)=wallToSplit;\n\t\t}\n\t\tif (wallToSplit->N2() == n1 && wallToSplit->N1() == n2) {\n\t\t\t(*psplittWall)=wallToSplit;\n\t\t}\n\t});\n\treturn splittWall;\n}\n\nNode* Cell::attachFreeWallEnd(Cell * cellWithOtherWalls, Cell * cellWithSingleWalls, Wall * wall, Node * loseWallNode) {\n\tNeighbor neighbors = cellWithOtherWalls->getNeighbor(loseWallNode);\n\tcout << \"wall needed (n1) after devision in cell \" << Index() << \"\\n\";\n\tdouble distance1=0.0;\n\tNode * startOfOtherWall1 = cellWithOtherWalls->followNeighborsToWall(loseWallNode, neighbors.nb1, distance1);\n\tdouble distance2=0.0;\n\tNode * startOfOtherWall2 = cellWithOtherWalls->followNeighborsToWall(loseWallNode, neighbors.nb2, distance2);\n\tif (!loseWallNode->BoundaryP()) {\n\t\tcout << \"!BoundaryP\\n\" ;\n\t\t// ok this is not good we are inside the cell structure and missed the wall to split\n\t\t// but this wall must be between startOfOtherWall1 and startOfOtherWall2 so we find it and split it up\n\t\tWall* splittWall = findWall(startOfOtherWall1,startOfOtherWall2);\n\n\t\tif (splittWall == NULL) {\n\t\t\tcout << \"!BoundaryP but no wall to split...\\n\" ;\n\t\t\treturn NULL;\n\t\t} else {\n\t\t\t// this node must have 3 neighbors, we need the 3e one.\n\t\t\tCell* opposedCell = NULL;\n\t\t\tCell** popposedCell = &opposedCell;\n\t\t\tloseWallNode->LoopNeighbors([popposedCell,cellWithOtherWalls,cellWithSingleWalls](auto neighbors){\n\t\t\t\tif (neighbors.getCell() != cellWithOtherWalls && neighbors.getCell() != cellWithSingleWalls) {\n\t\t\t\t\t(*popposedCell) = neighbors.getCell();\n\t\t\t\t}\n\t\t\t});\n\t\t\tdouble orgLength=splittWall->Length();\n\t\t\tWall * connectWall = new Wall(startOfOtherWall1, loseWallNode, cellWithSingleWalls, opposedCell );\n\t\t\tsplittWall->replaceNode(startOfOtherWall1, loseWallNode);\n\t\t\tconnectWall->CopyWallContents(*splittWall);\n\t\t\tconnectWall->SetLength();\n\t\t\tconnectWall->CorrectTransporters(orgLength);\n\t\t\tsplittWall->SetLength();\n\t\t\tsplittWall->CorrectTransporters(orgLength);\n\t\t\topposedCell->AddWall(connectWall);\n\t\t\tcellWithOtherWalls->AddWall(connectWall);\n\t\t\tcellWithSingleWalls->AddWall(connectWall);\n\t\t\tconnectWall->CorrectWall();\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tNode * startOfOtherWall = distance1Index() << \" to \" << startOfOtherWall->Index() << \"\\n\";\n\tWall * connectWall = new Wall(startOfOtherWall, loseWallNode, cellWithSingleWalls, m->boundary_polygon );\n\tWall * donorWall = cellWithOtherWalls->getBoundaryWallAt(startOfOtherWall);\n\tconnectWall->SetLength();\n\tdouble orgLength=connectWall->Length();\n\tif (donorWall!=NULL) {\n\t connectWall->CopyWallContents(*donorWall);\n\t orgLength += donorWall->Length();\n\t donorWall->CorrectTransporters(orgLength);\n\t}\n\tconnectWall->CorrectTransporters(orgLength);\n\n\tcellWithSingleWalls->AddWall(connectWall);\n\tm->boundary_polygon->AddWall(connectWall);\n\tconnectWall->CorrectWall();\n\treturn startOfOtherWall;\n}\n\n// Core division procedure\nvoid Cell::DivideWalls(ItList new_node_locations, const Vector from, const Vector to, bool fix_cellwall, NodeSet *node_set)\n{\n\n if (dead) return;\n\n bool boundary_touched_flag=false;\n\n // Step 0: keep some data about the parent before dividing\n\n ParentInfo parent_info;\n parent_info.polarization = ReduceCellAndWalls( PINdir );\n parent_info.polarization.Normalise();\n parent_info.PINmembrane = SumTransporters(1);\n parent_info.PINendosome = Chemical(1);\n\n //cerr << \"Parent polarization before division: \" << parent_info.polarization << endl;\n\n // Step 1: create a daughter cell\n Cell *daughter=m->AddCell(new Cell());\n\n // Step 2: Copy the basics of parent cell to daughter\n for (int i=0;ichem[i]=chem[i];\n }\n\n daughter->cell_type = cell_type;\n\n for (int i=0;inew_chem[i]=new_chem[i];\n }\n\n daughter->boundary=boundary;\n daughter->m=m;\n\n daughter->target_area=target_area/2.;\n\n target_area/=2;\n daughter->cellvec=cellvec;\n\n // Division currently only works for convex cells: i.e. if the division line\n // intersects the cells at two points only.\n if (new_node_locations.size()!=2) {\n\n // Note: if you would add the possibility of dividing non-convex\n // cells, remember to update the code below. There are some\n // fixed-size arrays over there!\n\n cerr << \"Warning in Cell::Division: division of non-convex cells not fully implemented\" << endl;\n\n // Reject the daughter cell and decrement the amount of cells\n // again. We can do this here because it is the last cell added.\n // Never, ever try to fully erase a cell elsewhere, because we\n // make heavy use of cell indices in this project; if you erase a\n // Cell somewhere in the middle of Mesh::Cells the indices will\n // get totally messed up...! (e.g. the indices used in Nodes::cells)\n\n#ifdef QDEBUG\n qDebug() << \"new_node_locations.size() = \" << new_node_locations.size() <index = \" << daughter->index << endl;\n qDebug() << \"cells.size() = \" << m->cells.size() << endl;\n#endif\n\n m->cells.pop_back();\n Cell::NCells()--;\n m->shuffled_cells.pop_back();\n return;\n }\n\n // We can be sure we only need two positions here because divisions\n // of non-convex cells are rejected above.\n Vector new_node[2];\n Node *new_node_ind[2];\n\n int new_node_flag[2];\n Edge div_edges[2];\n\n int nnc=0;\n\n Wall *div_wall[4];\n double orig_length[2];\n for (int i=0;i<4;i++) { div_wall[i]=0; orig_length[i/2] = 0.; }\n\n // construct new Nodes at the intersection points\n // unless they coincide with existing points\n for ( ItList::const_iterator i=new_node_locations.begin(); i!=new_node_locations.end(); i++) {\n\n // intersection between division axis\n // and line from this node to its predecessor\n\n // method used: http://astronomy.swin.edu.au/~pbourke/geometry/lineline2d/\n Vector v1 = from;\n Vector v2 = to;\n Vector v3 = *(**i);\n\n // get previous node\n list::iterator nb=*i;\n if (nb == nodes.begin()) {\n nb = nodes.end();\n } \n nb--;\n Vector v4=*( *nb ); \n\n double denominator = \n (v4.y - v3.y)*(v2.x - v1.x) - (v4.x - v3.x)*(v2.y - v1.y);\n\n double ua = \n ((v4.x - v3.x)*(v1.y - v3.y) - (v4.y - v3.y)*(v1.x -v3.x))/denominator;\n\n double intersec_x = v1.x + ua*(v2.x-v1.x);\n double intersec_y = v1.y + ua*(v2.y-v1.y);\n\n // construct a new node at intersec\n // we construct a vector temporarily,\n // until we are sure we are going to keep the node...\n // Node count is damaged if we construct superfluous nodes\n Vector *n=new Vector(intersec_x,intersec_y,0);\n\n div_edges[nnc].first=*nb;\n div_edges[nnc].second=**i;\n\n // Insert this new Node if it is far enough (5% of element length)\n // from one of the two existing nodes, else use existing node\n //\n // old, fixed value was: par.collapse_node_threshold = 0.05\n double collapse_node_threshold = 0.05;\n#ifdef FLEMING\n collapse_node_threshold = par.collapse_node_threshold;\n#endif\n\n double elem_length = ( (*(**i)) - (*(*nb)) ).Norm();\n if ( ( *(**i) - *n ).Norm() < collapse_node_threshold * elem_length ) {\n new_node_flag[nnc]=1;\n new_node[nnc] = *(**i);\n new_node_ind[nnc] = **i;\n //cerr << **i << endl ;\n } else \n if ( (*(*nb) - *n).Norm() < collapse_node_threshold * elem_length ) {\n\tnew_node_flag[nnc]=2;\n\tnew_node[nnc] = *(*nb);\n\tnew_node_ind[nnc] = *nb;\n } else {\n\tnew_node_flag[nnc]=0;\n\tnew_node[nnc] = *n;\n }\n\n nnc++;\n delete n;\n }\n\n\n for (int i=0;i<2;i++) {\n\n Cell *neighbor_cell=0; // we need this to split up the \"Wall\" objects.\n\n // for both divided edges: \n // insert its new node into all cells that own the divided edge\n // but only if it really is a new node:\n if (new_node_flag[i]!=0) {\n if (fix_cellwall) {\n\t(new_node_ind[i])->fixed = true;\n\n\t// all this we'll do later for the node set :-)\n\t/* (new_node_ind[i])->boundary = true;\n\t (new_node_ind[i])->sam = true;\n\t boundary = SAM;\n\t daughter->boundary = SAM;\n\t boundary_touched_flag = true;\n\t*/ \n }\n\n } else {\n\n // (Construct a list of all owners:)\n // really construct the new node (if this is a new node)\n new_node_ind[i] = \n\tm->AddNode(new Node (new_node[i]) );\n\n\n\n // if a new node is inserted into a fixed edge (i.e. in the petiole)\n // make the new node fixed as well\n (new_node_ind[i])->fixed = (div_edges[i].first)->fixed &&\n\t(div_edges[i].second)->fixed;\n\n // Insert Node into NodeSet if the div_edge is part of it.\n if (\n\t (div_edges[i].first->node_set && div_edges[i].second->node_set) &&\n\t (div_edges[i].first->node_set == div_edges[i].second->node_set))\n\t{\n\t //cerr << \"Inserting node into node set\\n\";\n\t div_edges[i].first->node_set->AddNode( new_node_ind[i] );\n\t}\n\n // if the new wall should be fixed (i.e. immobile, or moving as\n // solid body), make it so, and make it part of the boundary. Using\n // this to make a nice initial condition by cutting off part of a\n // growing leaf.\n\n if (fix_cellwall) {\n\t(new_node_ind[i])->fixed = true;\n\n\t// All this we'll do later for the node set only\n }\n\n // if new node is inserted into the boundary\n // it will be part of the boundary, too\n\n new_node_ind[i]->UnsetBoundary();\n if ((div_edges[i].first->BoundaryP() && div_edges[i].second->BoundaryP()) && // Both edge nodes are boundary nodes AND\n\t ((m->findNextBoundaryNode(div_edges[i].first))->Index() == div_edges[i].second->Index())){ // The boundary proceeds from first to second.\n\n#ifdef QDEBUG\n\tqDebug() << \"Index of the first node: \" << div_edges[i].first->Index() << endl;\n\tqDebug() << \"Index of the second node: \" << div_edges[i].second->Index() << endl;\n\tqDebug() << \"Boundary proceeds from: \" << div_edges[i].first->Index() \n\t\t << \"to: \" << (m->findNextBoundaryNode(div_edges[i].first))->Index() << endl << endl;\n#endif\n\tnew_node_ind[i]->SetBoundary();\n\n\t// We will need to repair the boundary polygon later, since we will insert new nodes\n\t//cerr << \"Boundary touched for Node \" << new_node_ind[i]->Index() << \"\\n\";\n\tboundary_touched_flag=true;\n\n\t// and insert it into the boundary_polygon\n\t// find the position of the first node in the boundary\n\tlist::iterator ins_pos = find\n\t (m->boundary_polygon->nodes.begin(),\n\t m->boundary_polygon->nodes.end(),\n\t div_edges[i].first);\n\t// ... second node comes before or after it ...\n\tif (*(++ins_pos!=m->boundary_polygon->nodes.end()?\n\t ins_pos:m->boundary_polygon->nodes.begin())!=div_edges[i].second) {\n\n\t m->boundary_polygon->nodes.insert(((ins_pos--)!=m->boundary_polygon->nodes.begin()?ins_pos:(--m->boundary_polygon->nodes.end())), new_node_ind[i]);\n\n\t // .. set the neighbors of the new node ...\n\t // in this case e.second and e.first are inverted\n\t} else {\n\t // insert before second node, so leave ins_pos as it is,\n\t // that is: incremented\n\t m->boundary_polygon->nodes.insert(ins_pos, new_node_ind[i]);\t\n\t // .. set the neighbors of the new node ...\n\t}\n }\n\n list owners;\n\n // push all cells owning the two nodes of the divides edges\n // onto a list\n\n copy((div_edges[i].first)->owners.begin(),\n\t (div_edges[i].first)->owners.end(),\n\t back_inserter(owners));\n copy((div_edges[i].second)->owners.begin(),\n\t (div_edges[i].second)->owners.end(),\n\t back_inserter(owners));\n\n\n // find first non-self duplicate in the owners: \n // cells owning the same two nodes\n // share an edge with me\n owners.sort( [](auto neighbor_a, auto neighbor_b){return neighbor_a.Cmp(neighbor_b);} );\n\n\n#ifdef QDEBUG \n list unique_owners;\n copy(owners.begin(), owners.end(), back_inserter(unique_owners));\n unique_owners.unique( mem_fn( &Neighbor::Eq ) );\n qDebug() << \"The dividing edge nodes: \" << div_edges[i].first->Index() \n\t << \" and \" << div_edges[i].second->Index() << \" are owned by cells: \";\n\n // spit out each owners' cell index\n foreach(Neighbor neighbor, unique_owners){\n\tqDebug() << neighbor.cell->Index() << \" \";\n }\n qDebug() << endl;\n#endif\n\n // Search through the sorted list of edge node owners looking for duplicate pairs. Each pair represents an actual edge owner.\n list edge_owners;\n list::iterator it;\n for (it=owners.begin(); it!=owners.end(); it++) {\n\tit = adjacent_find(it, owners.end(), neighbor_cell_eq);\n\tif (it == owners.end()) break; // bail if reach the end of the list\n#ifdef QDEBUG\n\tqDebug() << \"Considering: \" << it->cell->Index() << \" as a possible edge owner.\" << endl;\n#endif\n\tif (it->cell->Index() != this->Index()) {\n#ifdef QDEBUG\n\t qDebug() << \"Adding: \" << it->cell->Index() << \" to the list of edge owners.\" << endl;\n#endif\n\t edge_owners.push_back(*it);\n\t}\n } \n\n if (edge_owners.size() > 1){\n\t// Remove the boundary polygon - if its there\n\tlist::iterator it;\n\tif ((it = find_if (edge_owners.begin(), edge_owners.end(), [](auto neighbor){return neighbor.CellEquals(-1);}))\n\t != edge_owners.end()) {\n#ifdef QDEBUG\n qDebug() << \"deleting: \" << it->cell->Index() << \" from the list of edge owners.\" << endl;\n#endif\n\t edge_owners.erase(it);\n\t}\n }\n\n#ifdef QDEBUG\n qDebug() << \"The edge owners list has: \" << edge_owners.size() << \" elements\" << endl;\n#endif\n\n // Since the list should always contain exactly one element, pass it on as an iterator\n list::iterator c = (edge_owners.size() != 0) ? edge_owners.begin() : edge_owners.end();\n\n // (can we have more than one neighboring cell here??)\n if (c!=owners.end()) { \n\tneighbor_cell = c->cell;\n\tif (c->cell == NULL) {\n\t\tcout << \"error\";\n\t} else\n\tif (!c->cell->BoundaryPolP()) {\n\n\t // find correct position in the cells node list\n\t // to insert the new node\n\t list::iterator ins_pos = find\n\t (neighbor_cell->nodes.begin(),\n\t neighbor_cell->nodes.end(),\n\t div_edges[i].first);\n\n\t neighbor_cell->nodes.insert(ins_pos, new_node_ind[i]);\n\t neighbor_cell->ConstructConnections();\n\n\t // give walls to daughter later\n\t}\n } else {\n\tneighbor_cell = 0;\n }\n }\n\n // Split the Wall with the neighboring cell\n\n // if the neighbor cell has not yet been identified above, do it now\n if (neighbor_cell == 0) {\n\n list owners;\n\n // push all cells owning the two nodes of the divides edges\n // onto a list\n copy((div_edges[i].first)->owners.begin(),\n\t (div_edges[i].first)->owners.end(),\n\t back_inserter(owners));\n copy((div_edges[i].second)->owners.begin(),\n\t (div_edges[i].second)->owners.end(),\n\t back_inserter(owners));\n\n\n // find first non-self duplicate in the owners: \n // cells owning the same two nodes\n // share an edge with me\n owners.sort( mem_fn ( &Neighbor::Cmp ) );\n\n list::iterator c;\n for (c=owners.begin(); c!=owners.end(); c++) {\n\tc=adjacent_find(c,owners.end(),neighbor_cell_eq);\n\tif (c->cell->Index() != this->Index() || c==owners.end()) break;\n }\n\n if (c!=owners.end())\n\tneighbor_cell = c->cell;\n else \n\tneighbor_cell = 0;\n }\n\n\n if (neighbor_cell /* && !neighbor_cell->BoundaryPolP() */) {\n\n //cerr << \"Cell \" << index << \" says: neighboring cell is \" << neighbor_cell->index << endl;\n\n /*************** 1. Find the correct wall element ********************/\n\n list::iterator w, start_search;\n w = start_search = walls.begin();\n do {\n\t// Find wall between this cell and neighbor cell\n w = find_if( start_search, walls.end(), [neighbor_cell](auto wall){\n\t\t\treturn wall->is_wall_of_cell_p(neighbor_cell);} );\n\tstart_search = w; start_search++; // continue searching at next element\n } while ( w!=walls.end() && !(*w)->IntersectsWithDivisionPlaneP( from, to ) ); // go on until we find the right one.\n\n if (w == walls.end()) {\n#ifdef QDEBUG\n\tqDebug() << \"Whoops, wall element not found...!\" << endl;\n\tqDebug() << \"Cell ID: \" << neighbor_cell->Index() << endl;\n\tqDebug() << \"My cell ID: \" << Index() << endl;\n#endif\n } else {\n\n\t// 2. Split it up, if we should (sometimes, the new node coincides with an existing node so\n\t// we should not split up the Wall)\n\n\tif (new_node_ind[i]!=(*w)->n1 && new_node_ind[i]!=(*w)->n2) {\n\n\t Wall *new_wall;\n\n\t // keep the length of the original wall; we need it to equally divide the transporter concentrations\n\t // over the two daughter walls\n\t (*w)->SetLength(); // make sure we've got the current length\n\t orig_length[i] = (*w)->Length();\n\t //cerr << \"Original length is \" << orig_length[i] << endl;\n\t if ((*w)->c1 == this ) {\n\n\t // cerr << \"Cell \" << (*w)->c1->Index() << \" splits up wall \" << *(*w) << \", into: \" << endl;\n\t new_wall = new Wall( (*w)->n1, new_node_ind[i], this, neighbor_cell);\n\t (*w)->n1 = new_node_ind[i];\n\n\t // cerr << \"wall \" << *(*w) << \", and new wall \" << *new_wall << endl;\n\n\t } else {\n\t new_wall = new Wall( (*w)->n1, new_node_ind[i], neighbor_cell, this);\n\n\t (*w)->n1 = new_node_ind[i];\n\t }\n\n\n\t // 3. Give wall elements to appropriate cells\n\t if (new_wall->n1 != new_wall->n2) {\n\n\t if (par.copy_wall)\n\t new_wall->CopyWallContents(**w);\n\t else {\n\t // If wall contents are not copied, decide randomly which wall will be the \"parent\"\n\t // otherwise we will get biases (to the left), for example in the meristem growth model\n\t if (RANDOM()<0.5) {\n\t\tnew_wall->SwapWallContents(*w);\n\t }\n\t }\n\t AddWall(new_wall);\n\t // cerr << \"Building new wall: this=\" << Index() << \", neighbor_cell = \" << neighbor_cell->Index() << endl;\n\n\t neighbor_cell->AddWall( new_wall);\n\t //cerr << \"Existing wall: c1 = \" << (*w)->c1->Index() << \", neighbor_cell = \" << (*w)->c2->Index() << endl;\n\n\t // Remember the addresses of the new walls\n\t div_wall[2*i+0] = *w;\n\t div_wall[2*i+1] = new_wall;\n\n\t // we will correct the transporter concentrations later in this member function, after division\n\t // First the new nodes should be inserted into the cells, before we can calculate wall lengths\n\t // Remember that cell walls can be bent, so have a bigger length than the Euclidean distance n1->n2\n\n\t } else {\n\t delete new_wall;\n\t }\n\t}\n }\n }\n } // closing loop over the two divided edges (for (int i=0;i<2;i++) )\n\n // move half of the nodes to the daughter\n {\n //cerr << \"Daughter: \";\n list::iterator start, stop;\n\n start=new_node_locations.front();\n\n //cerr << \"*new_node_locations.front() = \" << *new_node_locations.front() << endl;\n if (new_node_flag[0]==1) {\n start++;\n if (start==nodes.end())\n\tstart=nodes.begin();\n } \n\n stop=new_node_locations.back();\n if (new_node_flag[1]==2) {\n if (stop==nodes.begin())\n\tstop=nodes.end();\n stop--;\n }\n list::iterator i=start;\n while ( i!=stop) {\n\n // give the node to the daughter\n // (find references to parent cell from this node,\n // and remove them)\n list::iterator neighb_with_this_cell=\n\tfind_if((*i)->owners.begin(),\n\t\t(*i)->owners.end(),\n\t [this](auto neighbor){return neighbor.CellEquals(this->Index());});\n if (neighb_with_this_cell==(*i)->owners.end()) {\n\n#ifdef QDEBUG\n\tqDebug() << \"not found\" << endl;\n#endif\n\tabort();\n }\n\n (*i)->owners.erase(neighb_with_this_cell);\n\n daughter->nodes.push_back( *i );\n\n\n i++;\n if (i==nodes.end())\n\ti=nodes.begin();\n };\n }\n\n // new node list of parent\n list new_nodes_parent;\n\n // half of the nodes stay with the parent\n {\n list::iterator start, stop;\n start=new_node_locations.back();\n if (new_node_flag[1]==1) {\n start++;\n if (start==nodes.end())\n\tstart=nodes.begin();\n }\n stop=new_node_locations.front();\n if (new_node_flag[0]==2) {\n if (stop==nodes.begin())\n\tstop=nodes.end();\n stop--;\n }\n\n list::iterator i=start;\n while (i!=stop) {\n new_nodes_parent.push_back( *i );\n\n i++;\n if (i==nodes.end()) \n\ti = nodes.begin();\n };\n }\n\n // insert shared wall\n // insert shared nodes on surface of parent cell\n new_nodes_parent.push_back( new_node_ind[0] );\n daughter->nodes.push_back ( new_node_ind[1] );\n\n // optionally add the new node to the nodeset (passed by pointer)\n // (in this way we can move the NodeSet as a whole; useful for a fixed cutting line)\n if (node_set) {\n node_set->AddNode( new_node_ind[0] );\n }\n\n#define MULTIPLE_NODES\n#ifdef MULTIPLE_NODES\n // intermediate, extra nodes\n // Calculate distance between the two new nodes\n double dist=( new_node[1] - new_node[0] ).Norm();\n //bool fixed_wall = (new_node_ind[0])->fixed && (new_node_ind[1])->fixed;\n bool fixed_wall = false;\n\n // Estimate number of extra nodes in wall\n // factor 4 is to keep tension on the walls;\n // this is a hidden parameter and should be made explicit\n // later on.\n int n=(int)((dist/Node::target_length)/4+0.5);\n\n Vector nodevec = ( new_node[1]- new_node[0]).Normalised();\n\n double element_length = dist/(double)(n+1);\n\n // note that wall nodes need to run in inverse order in parent\n list::iterator ins_pos = daughter->nodes.end();\n\n for (int i=1;i<=n;i++) {\n Node *node=\n m->AddNode( new Node( new_node[0] + i*element_length*nodevec ) );\n\n node->fixed=fixed_wall;\n\n if (!fix_cellwall)\n node->boundary = false;\n else {\n node->fixed = true;\n }\n\n ins_pos=daughter->nodes.insert(ins_pos, node );\n new_nodes_parent.push_back( node );\n\n // optionally add the new node to the nodeset (passed by pointer)\n // (in this way we can move the NodeSet as a whole; useful for a fixed cutting line)\n if (node_set) {\n node_set->AddNode( node );\n }\n\n }\n#endif\n daughter->nodes.push_back( new_node_ind[0] );\n new_nodes_parent.push_back( new_node_ind[1] );\n\n // optionally add the new node to the nodeset (passed by pointer)\n // (in this way we can move the NodeSet as a whole; useful for a fixed cutting line)\n if (node_set) {\n node_set->AddNode( new_node_ind[1] );\n }\n\n // move the new nodes to the parent\n nodes.clear();\n copy( new_nodes_parent.begin(), \n\tnew_nodes_parent.end(), \n\tback_inserter(nodes) );\n\n\n // Repair cell lists of Nodes, and node connectivities\n ConstructConnections();\n daughter->ConstructConnections();\n\n if (boundary_touched_flag) {\n m->boundary_polygon->ConstructConnections();\n } \n\n // collecting neighbors of divided cell\n list broken_neighbors;\n\n // this cell's old neighbors\n copy(neighbors.begin(), neighbors.end(), back_inserter(broken_neighbors) );\n\n // this cell\n broken_neighbors.push_back(this);\n\n // its daughter\n broken_neighbors.push_back(daughter);\n\n // Recalculate area of parent and daughter\n area = CalcArea();\n daughter->area = daughter->CalcArea();\n\n SetIntegrals();\n daughter->SetIntegrals();\n\n // Add a \"Cell Wall\" for diffusion algorithms\n Wall *wall = new Wall( new_node_ind[0], new_node_ind[1], this, daughter );\n\n AddWall( wall );\n\n daughter->AddWall( wall );\n\n //cerr << \"Correct walls of cell \" << Index() << \" and daughter \" << daughter->Index() << endl;\n\n // Move Walls to daughter cell\n list copy_walls = walls;\n for (list::iterator w = copy_walls.begin(); w!=copy_walls.end(); w++) {\n\n //cerr << \"Doing wall, before: \" << **w << endl;\n\n // checks the nodes of the wall and gives it away if appropriate\n (*w)->CorrectWall ( );\n\n //cerr << \"and after: \" << **w << endl;\n\n }\n\n // Correct tranporterconcentrations of divided walls\n for (int i=0;i<4;i++) {\n if (div_wall[i]) {\n div_wall[i]->SetLength();\n div_wall[i]->CorrectTransporters(orig_length[i/2]);\n }\n }\n\n //cerr << \"Cell \" << index << \" has been dividing, and gave birth to Cell \" << daughter->index << endl;\n\n // now reconstruct neighbor list for all \"broken\" neighbors\n\n for (list::iterator i=broken_neighbors.begin(); i!=broken_neighbors.end(); i++) {\n ((Cell *)(*i))->ConstructNeighborList();\n }\n\n ConstructNeighborList();\n daughter->ConstructNeighborList();\n\n \t/**\n * Here we reconnect the wall elements if they got lose ends, if both ends are lose then\n * the original wall has to be deleted.\n *\n * Important we need to distribute the properties over the newly created walls.\n */\n\tbool n1Connected;\n\tbool n2Connected;\n\tcheckCellLooseWallEnds(wall,n1Connected,n2Connected);\n\tCell * cellWithOtherWalls = this;\n\tCell * cellWithSingleWalls = daughter;\n\tif (walls.size() < daughter->walls.size()) {\n\t\tcellWithOtherWalls = daughter;\n\t\tcellWithSingleWalls = this;\n\t}\n\tif (!n1Connected && !n2Connected) {\n\t\t\tNode * fist = attachFreeWallEnd(cellWithOtherWalls,cellWithSingleWalls,wall,wall->N1());\n\t\t\tNode * second = attachFreeWallEnd(cellWithOtherWalls,cellWithSingleWalls,wall,wall->N2());\n\t\t\tWall * wallToRemove = findWall(fist, second);\n\t\t\tif (wallToRemove != NULL) {\n\t\t\t\tm->walls.remove(wallToRemove);\n\t\t\t\twallToRemove->c1->removeWall(wallToRemove);\n\t\t\t\twallToRemove->c2->removeWall(wallToRemove);\n\t\t\t\tdelete wallToRemove;\n\t\t\t}\n\t} else if (!n1Connected) {\n\t\tattachFreeWallEnd(cellWithOtherWalls,cellWithSingleWalls,wall,wall->N1());\n\t} else if (!n2Connected) {\n\t\tattachFreeWallEnd(cellWithOtherWalls,cellWithSingleWalls,wall,wall->N2());\n\t}\n\n this->splittWallElementsBetween(new_node_ind[0], daughter);\n\n\tthis->splittWallElementsBetween(new_node_ind[1], daughter);\n\n\tm->plugin->OnDivide(&parent_info, daughter, this);\n\n\tdaughter->div_counter=(++div_counter);\n}\n\nvoid Cell::findBeforeAfter(Node * node, Node ** before, Node**after) {\n\tfor (list::iterator i=this->nodes.begin(); i!=this->nodes.end(); i++) {\n\t list::const_iterator next=i;\n\t next++;\n\t if (next == this->nodes.end()) {\n\t next = this->nodes.begin();\n\t }\n\t if (*next == node) {\n\t \t(*before) = *i;\n\t }\n\t if (*i == node) {\n\t \t(*after) = *next;\n\t }\n\t}\n}\n\nCell* Cell::findOtherCell(Cell*other, Node * node, Node * node2) {\n\tfor (list::const_iterator n=node->owners.begin(); n!=node->owners.end(); n++) {\n\t\tif (n->cell != this && n->cell != other) {\n\t\t\treturn n->cell;\n\t\t}\n\t}\n\tif (other== NULL) {\n\t\tfor (list::const_iterator n=node2->owners.begin(); n!=node2->owners.end(); n++) {\n\t\t if (n->cell != this && n->cell != other) {\n\t\t\t return n->cell;\n\t\t }\n\t }\n\t}\n\treturn NULL;\n}\n\n/**\n * find neighbour cell for splittWallElementsBetween\n */\nCell* Cell::findNeighbourCellOnDivide(Cell* daughter,Node* node,Node * before1,Node * after1 ,Node * before2,Node * after2) {\n\tCell* other = findOtherCell(daughter, before1, after2);\n\tif (other == NULL) {\n\t\tother = findOtherCell(daughter, after1, before2);\n\t}\n\treturn other;\n}\n/**\n * o before1\n * | THIS\n * |\n * | after1\n * OTHER +-----o\n * | before2\n * |\n * | DOUGHTER\n * o after2\n *\n * blow the reverse case (on the other side)\n *\n * o after1\n * THIS |\n * |\n * before1 |\n * o-----+ OTHER\n * after2 |\n * |\n * DOUGHTER |\n * o before2\n *\n */\nvoid Cell::splittWallElementsBetween(Node* node, Cell* daughter) {\n\tNode * before1 = NULL;\n\tNode * after1 = NULL;\n\tNode * before2 = NULL;\n\tNode * after2 = NULL;\n\tthis->findBeforeAfter(node, &before1, &after1);\n\tdaughter->findBeforeAfter(node, &before2, &after2);\n\n\t// find the other node on the outside of the split\n\tCell* other = findNeighbourCellOnDivide(daughter, node, before1, after1, before2, after2);\n\n\t// get wall element info of the walls that are now splitt.\n\tWallElementInfo oldInfoB1ToA2_B2A1;\n\tWallElementInfo oldInfoA2ToB1_A1B2;\n\tthis->fillWallElementInfo(&oldInfoB1ToA2_B2A1, before1, after2);\n\tbool reverse = false;\n\tif (oldInfoB1ToA2_B2A1.hasWallElement()) {\n\t\tother->fillWallElementInfo(&oldInfoA2ToB1_A1B2, after2, before1);\n\t} else {\n\t\tthis->fillWallElementInfo(&oldInfoB1ToA2_B2A1, before2, after1);\n\t\tother->fillWallElementInfo(&oldInfoA2ToB1_A1B2, after1, before2);\n\t\treverse=true;\n\t}\n\t//save a backup of the data to distribute the data over the new parts.\n\tWallElement weB1A2_B2A1= *(oldInfoB1ToA2_B2A1.getWallElement());\n\toldInfoB1ToA2_B2A1.setWallElement(&weB1A2_B2A1);\n\tWallElement weA2B1_A1B2= *(oldInfoA2ToB1_A1B2.getWallElement());\n\toldInfoA2ToB1_A1B2.setWallElement(&weA2B1_A1B2);\n\n\tdouble patrialLengthBefore = ((*before1) - (*node)).Norm();\n\tdouble patrialLengthAfter = ((*after2) - (*node)).Norm();\n\tdouble ratio = patrialLengthBefore / (patrialLengthBefore+patrialLengthAfter);\n\tdouble elastic_limit = this->m->elastic_limit;\n\tWallElementInfo element;\n\tif (!reverse) {\n\t\tthis->fillWallElementInfo(&element, before1, node);\n\t\telement.updateFrom(&oldInfoB1ToA2_B2A1, ratio, elastic_limit);\n\t\tthis->fillWallElementInfo(&element, node, after1);\n\t\telement.updateBaseLength(elastic_limit);\n\t\tdaughter->fillWallElementInfo(&element, before2, node);\n\t\telement.updateBaseLength(elastic_limit);\n\t\tdaughter->fillWallElementInfo(&element, node, after2);\n\t\telement.updateFrom(&oldInfoB1ToA2_B2A1, 1.-ratio, elastic_limit);\n\t\tif (!other->BoundaryPolP()) {\n\t\t\tother->fillWallElementInfo(&element, after2, node);\n\t\t\telement.updateFrom(&oldInfoA2ToB1_A1B2, ratio, elastic_limit);\n\t\t\tother->fillWallElementInfo(&element, node, before2);\n\t\t\telement.updateFrom(&oldInfoA2ToB1_A1B2, 1.-ratio, elastic_limit);\n\t\t}\n\t} else {\n\t\tthis->fillWallElementInfo(&element, before1, node);\n\t\telement.updateBaseLength(elastic_limit);\n\t\tthis->fillWallElementInfo(&element, node, after1);\n\t\telement.updateFrom(&oldInfoB1ToA2_B2A1, ratio, elastic_limit);\n\t\tdaughter->fillWallElementInfo(&element, before2, node);\n\t\telement.updateFrom(&oldInfoB1ToA2_B2A1, 1.-ratio, elastic_limit);\n\t\tdaughter->fillWallElementInfo(&element, node, after2);\n\t\telement.updateBaseLength(elastic_limit);\n\t\tif (!other->BoundaryPolP()) {\n\t\t\tother->fillWallElementInfo(&element, after1, node);\n\t\t\telement.updateFrom(&oldInfoA2ToB1_A1B2, ratio, elastic_limit);\n\t\t\tother->fillWallElementInfo(&element, node, before2);\n\t\t\telement.updateFrom(&oldInfoA2ToB1_A1B2, 1.-ratio, elastic_limit);\n\t\t}\n\t}\n}\n\n// Move the whole cell\nvoid Cell::Move(const Vector T) {\n\n for (list::const_iterator i=nodes.begin(); i!=nodes.end(); i++) {\n *(*i)+=T;\n }\n}\n\ndouble Cell::Displace(double dx, double dy, double dh)\n{\n\n // Displace whole cell, add resulting energy to dh,\n // and accept displacement if energetically favorable\n // \n // Method is called if a \"fixed\" node is displaced\n\n // Warning: length constraint not yet CORRECTLY implemented for this function\n\n // Attempt to move this cell in a random direction\n // Vector movement(par.mc_cell_stepsize*(RANDOM()-0.5),par.mc_cell_stepsize*(RANDOM()-0.5),0);\n\n\n dh=0;\n\n Vector movement(dx,dy,0);\n\n vector< pair > length_edges;\n vector cellareas;\n cellareas.reserve(neighbors.size());\n\n // for the length constraint, collect all edges to this cell's nodes,\n // which are not part of the cell\n // the length of these edges will change\n\n double old_length=0.;\n for (list::const_iterator i=nodes.begin(); i!=nodes.end(); i++) {\n for (list::const_iterator n=(*i)->owners.begin(); n!=(*i)->owners.end(); n++) {\n if (n->getCell()!=this) {\n\tlength_edges.push_back( pair (*i, n->nb1) );\n\tlength_edges.push_back( pair (*i, n->nb2) );\n\told_length += \n\t DSQR(Node::target_length-(*(*i)-*(n->nb1)).Norm())+\n\t DSQR(Node::target_length-(*(*i)-*(n->nb2)).Norm());\n }\n }\n }\n\n // calculate area energy difference of neighboring cells\n // (this cells' shape remains unchanged)\n double old_area_energy=0., old_length_energy=0.;\n for (list::const_iterator i=neighbors.begin(); i!=neighbors.end(); i++) {\n old_area_energy += DSQR((*i)->Area()-(*i)->TargetArea());\n old_length_energy += DSQR((*i)->Length()-(*i)->TargetLength());\n }\n\n Move(movement);\n\n double new_area_energy=0., new_length_energy=0.;\n for (list::const_iterator i=neighbors.begin(); i!=neighbors.end(); i++) {\n cellareas.push_back((*i)->CalcArea());\n new_area_energy += DSQR(cellareas.back()-(*i)->TargetArea());\n new_length_energy += DSQR((*i)->CalcLength()-(*i)->TargetLength());\n }\n\n double new_length=0;\n for ( vector< pair< Node *, Node * > >::const_iterator e = length_edges.begin(); e != length_edges.end(); e++) {\n new_length += DSQR(Node::target_length - (*(e->first) - *(e->second)).Norm());\n }\n\n\n dh += (new_area_energy - old_area_energy) + (new_length_energy - old_length_energy) * lambda_celllength +\n par.lambda_length * (new_length - old_length);\n\n if (dh<0 || RANDOM()::const_iterator nb_it = neighbors.begin();\n for (vector::const_iterator ar_it = cellareas.begin(); ar_it!=cellareas.end(); ( ar_it++, nb_it++) ) {\n ((Cell *)(*nb_it))->area = *ar_it;\n (*nb_it)->SetIntegrals(); \n }\n\n //cerr << endl;\n\n } else {\n\n Move ( -1*movement);\n\n }\n\n return dh;\n}\n\n\nvoid Cell::Displace (void)\n{\n Displace(par.mc_cell_stepsize*(RANDOM()-0.5),par.mc_cell_stepsize*(RANDOM()-0.5),0);\n}\n\n// Get energy level of whole cell (excluding length constraint?)\ndouble Cell::Energy(void) const\n{\n double energy = 0.;\n double length_contribution = 0.;\n\n for (list::const_iterator i=nodes.begin(); i!=nodes.end(); i++) {\n for (list::const_iterator n=(*i)->owners.begin(); n!=(*i)->owners.end(); n++) {\n if (n->getCell()==this) {\n\tlength_contribution += \n\t DSQR(Node::target_length-(*(*i)-*(n->nb1)).Norm()) +\n\t DSQR(Node::target_length-(*(*i)-*(n->nb2)).Norm());\n }\n }\n }\n\n // wall elasticity constraint\n energy += par.lambda_length * length_contribution;\n\n // area constraint\n energy += DSQR(CalcArea() - target_area);\n\n // cell length constraint\n energy += lambda_celllength * DSQR(Length() - target_length);\n\n return energy;\n}\n\n\n\n\nbool Cell::SelfIntersect(void)\n{\n // The (obvious) O(N*N) algorithm\n\n // Compare each edge against each other edge\n\n // An O(N log(N)) algorithm by Shamos & Hoey (1976) supposedly exists;\n // it was mentioned on comp.graphics.algorithms\n\n // But I haven't been able to lay my hand on the paper.\n // Let's try whether we need it....\n\n // method used: http://astronomy.swin.edu.au/~pbourke/geometry/lineline2d/\n\n for (list::const_iterator i=nodes.begin(); i!=nodes.end(); i++) {\n\n list::const_iterator j=i; \n ++j;\n for (; j!=nodes.end(); j++) \n {\n\t\n\tVector v1 = *(*i);\n\tlist::const_iterator nb=i;\n\tnb++;\n\tif (nb == nodes.end()) {\n\t nb = nodes.begin();\n\t} \n\tVector v2 = *(*nb);\n\tVector v3 = *(*j);\n\tnb=j;\n\tnb++;\n\tif (nb == nodes.end()) {\n\t nb = nodes.begin();\n\t} \n\tVector v4=*( *nb ); \n\n\tdouble denominator = \n\t (v4.y - v3.y)*(v2.x - v1.x) - (v4.x - v3.x)*(v2.y - v1.y);\n\n\tdouble ua = \n\t ((v4.x - v3.x)*(v1.y - v3.y) - (v4.y - v3.y)*(v1.x -v3.x))/denominator;\n\tdouble ub = \n\t ((v2.x - v1.x)*(v1.y-v3.y) - (v2.y- v1.y)*(v1.x - v3.x))/denominator;\n\n\n\tif ( ( TINY < ua && ua < 1.-TINY ) && ( TINY < ub && ub < 1.-TINY ) ) {\n\t //cerr << \"ua = \" << ua << \", ub = \" << ub << endl;\n\t return true;\n\t}\n }\n }\n\n return false;\n}\n\n\n/*\nbool Cell::MoveSelfIntersectsP(Node *moving_node_ind, Vector new_pos)\n{\n\n // Check whether the polygon will self-intersect if moving_node_ind \n // were displaced to new_pos\n\n // Compare the two new edges against each other edge\n\n // O(2*N)\n\n // method used for segment intersection:\n // http://astronomy.swin.edu.au/~pbourke/geometry/lineline2d/\n\n Vector neighbor_of_moving_node[2];\n\n //cerr << \"list::const_iterator moving_node_ind_pos = find (nodes.begin(),nodes.end(),moving_node_ind);\\n\";\n list::const_iterator moving_node_ind_pos = find (nodes.begin(),nodes.end(),moving_node_ind);\n\n list::const_iterator nb = moving_node_ind_pos;\n //cerr << \"Done\\n\";\n nb++;\n if (nb == nodes.end()) {\n nb = nodes.begin();\n } \n\n neighbor_of_moving_node[0]=*(*nb); \n\n nb=moving_node_ind_pos;\n if (nb == nodes.begin()) {\n nb = nodes.end();\n }\n nb--;\n\n neighbor_of_moving_node[1]=*( *nb ); \n\n\n for (list::const_iterator i=nodes.begin(); i!=nodes.end(); i++) {\n for (int j=0;j<2;j++) { // loop over the two neighbors of moving node\n list::const_iterator nb=i;\n nb++;\n if (nb == nodes.end()) {\n\tnb = nodes.begin();\n } \n if (*i == moving_node_ind || *nb == moving_node_ind) {\n\t// do not compare to self\n\tcontinue;\n }\n\n Vector v3 = *(*i);\n Vector v4 = *(*nb);\n\n double denominator = \n\t(v4.y - v3.y)*(neighbor_of_moving_node[j].x - new_pos.x) - (v4.x - v3.x)*(neighbor_of_moving_node[j].y - new_pos.y);\n\n double ua = \n\t((v4.x - v3.x)*(new_pos.y - v3.y) - (v4.y - v3.y)*(new_pos.x -v3.x))/denominator;\n double ub = \n\t((neighbor_of_moving_node[j].x - new_pos.x)*(new_pos.y-v3.y) - (neighbor_of_moving_node[j].y- new_pos.y)*(new_pos.x - v3.x))/denominator;\n\n if ( ( TINY < ua && ua < 1.-TINY ) && ( TINY < ub && ub < 1.-TINY ) ) {\n\t//cerr << \"ua = \" << ua << \", ub = \" << ub << endl;\n\treturn true;\n }\n }\n }\n return false;\n}\n\n\n\n*/\n\nbool Cell::MoveSelfIntersectsP(Node *moving_node_ind, Vector new_pos)\n{\n \n // Check whether the polygon will self-intersect if moving_node_ind\n // were displaced to new_pos\n \n // Compare the two new edges against each other edge\n \n // O(2*N)\n \n // method used for segment intersection:\n // http://astronomy.swin.edu.au/~pbourke/geometry/lineline2d/\n \n Vector neighbor_of_moving_node[2];\n \n //cerr << \"list::const_iterator moving_node_ind_pos = find (nodes.begin(),nodes.end(),moving_node_ind);\\n\";\n list::const_iterator moving_node_ind_pos = find (nodes.begin(),nodes.end(),moving_node_ind);\n \n list::const_iterator nb = moving_node_ind_pos;\n //cerr << \"Done\\n\";\n nb++;\n if (nb == nodes.end()) {\n nb = nodes.begin();\n }\n \n neighbor_of_moving_node[0]=*(*nb);\n \n nb=moving_node_ind_pos;\n if (nb == nodes.begin()) {\n nb = nodes.end();\n }\n nb--;\n \n neighbor_of_moving_node[1]=*( *nb );\n \n \n for (list::const_iterator i=nodes.begin(); i!=nodes.end(); i++) {\n for (int j=0;j<2;j++) { // loop over the two neighbors of moving node\n list::const_iterator nb=i;\n nb++;\n if (nb == nodes.end()) {\n nb = nodes.begin();\n }\n if (*i == moving_node_ind || *nb == moving_node_ind) {\n // do not compare to self\n continue;\n }\n \n Vector v3 = *(*i);\n Vector v4 = *(*nb);\n \n double denominator =\n (v4.y - v3.y)*(neighbor_of_moving_node[j].x - new_pos.x) - (v4.x - v3.x)*(neighbor_of_moving_node[j].y - new_pos.y);\n \n // double ua =\n // ((v4.x - v3.x)*(new_pos.y - v3.y) - (v4.y - v3.y)*(new_pos.x -v3.x))/denominator;\n // double ub =\n // ((neighbor_of_moving_node[j].x - new_pos.x)*(new_pos.y-v3.y) - (neighbor_of_moving_node[j].y- new_pos.y)*(new_pos.x - v3.x))/denominator;\n\n double numera = ((v4.x - v3.x)*(new_pos.y - v3.y) - (v4.y - v3.y)*(new_pos.x -v3.x));\n double numerb = ((neighbor_of_moving_node[j].x - new_pos.x)*(new_pos.y-v3.y) - (neighbor_of_moving_node[j].y- new_pos.y)*(new_pos.x - v3.x));\n \n // Are the wall elements coincident?\n if (fabs(numera) < TINY && fabs(numerb) < TINY && fabs(denominator) < TINY) {\n return true;\n }\n \n // Are the wall elements parallel?\n if (fabs(denominator) < TINY) {\n continue;\n }\n double ua = numera / denominator;\n double ub = numerb / denominator;\n \n \n //if ( ( TINY < ua && ua < 1.-TINY ) && ( TINY < ub && ub < 1.-TINY ) ) {\n if ( ( 0 < ua && ua < 1. ) && ( 0 < ub && ub < 1.) ) {\n //cerr << \"ua = \" << ua << \", ub = \" << ub << endl;\n return true;\n }\n }\n }\n return false;\n}\n\n\n\n\nbool Cell::LinePieceIntersectsP(const Vector n1, const Vector n2) const\n{\n \n // Check whether the polygon will self-intersect if moving_node_ind\n // were displaced to new_pos\n \n // Compare the two new edges against each other edge\n \n // O(2*N)\n \n // method used for segment intersection:\n // http://astronomy.swin.edu.au/~pbourke/geometry/lineline2d/\n \n /*Vector neighbor_of_moving_node[2];\n \n //cerr << \"list::const_iterator moving_node_ind_pos = find (nodes.begin(),nodes.end(),moving_node_ind);\\n\";\n list::const_iterator moving_node_ind_pos = find (nodes.begin(),nodes.end(),moving_node_ind);\n \n list::const_iterator nb = moving_node_ind_pos;\n //cerr << \"Done\\n\";\n nb++;\n if (nb == nodes.end()) {\n nb = nodes.begin();\n }\n \n neighbor_of_moving_node[0]=*(*nb);\n \n nb=moving_node_ind_pos;\n if (nb == nodes.begin()) {\n nb = nodes.end();\n }\n nb--;\n \n neighbor_of_moving_node[1]=*( *nb );\n */\n \n for (list::const_iterator i=nodes.begin(); i!=nodes.end(); i++) {\n list::const_iterator nb=i;\n nb++;\n if (nb == nodes.end()) {\n nb = nodes.begin();\n }\n \n /* if (*i == moving_node_ind || *nb == moving_node_ind) {\n // do not compare to self\n continue;\n }*/\n \n Vector v3 = *(*i);\n Vector v4 = *(*nb);\n \n double denominator =\n (v4.y - v3.y)*(n1.x - n2.x) - (v4.x - v3.x)*(n1.y - n2.y);\n \n /* double ua =\n ((v4.x - v3.x)*(new_pos.y - v3.y) - (v4.y - v3.y)*(new_pos.x -v3.x))/denominator;\n double ub =\n ((neighbor_of_moving_node[j].x - new_pos.x)*(new_pos.y-v3.y) - (neighbor_of_moving_node[j].y- new_pos.y)*(new_pos.x - v3.x))/denominator;*/\n double numera = ((v4.x - v3.x)*(n1.y - v3.y) - (v4.y - v3.y)*(n1.x -v3.x));\n double numerb = ((n2.x - n1.x)*(n1.y-v3.y) - (n2.y- n1.y)*(n1.x - v3.x));\n \n /* Are the wall elements coincident? */\n if (fabs(numera) < TINY && fabs(numerb) < TINY && fabs(denominator) < TINY) {\n return true;\n }\n \n /* Are the wall elements parallel? */\n if (fabs(denominator) < TINY) {\n continue;\n }\n double ua = numera / denominator;\n double ub = numerb / denominator;\n \n \n //if ( ( TINY < ua && ua < 1.-TINY ) && ( TINY < ub && ub < 1.-TINY ) ) {\n if ( ( 0 < ua && ua < 1. ) && ( 0 < ub && ub < 1.) ) {\n //cerr << \"ua = \" << ua << \", ub = \" << ub << endl;\n return true;\n }\n \n }\n return false;\n}\n\n/*! \\brief Test if this cell intersects with the given line.\n\n */\nbool Cell::IntersectsWithLineP(const Vector v1, const Vector v2)\n{\n // Compare the line against each edge\n // method used: http://astronomy.swin.edu.au/~pbourke/geometry/lineline2d/\n\n for (list::const_iterator i=nodes.begin(); i!=nodes.end(); i++) \n {\n Vector v3 = *(*i);\n list::const_iterator nb=i;\n nb++;\n if (nb == nodes.end()) {\n\tnb = nodes.begin();\n }\n Vector v4 = *(*nb);\n\n double denominator = \n\t(v4.y - v3.y)*(v2.x - v1.x) - (v4.x - v3.x)*(v2.y - v1.y);\n\n double ua = \n\t((v4.x - v3.x)*(v1.y - v3.y) - (v4.y - v3.y)*(v1.x -v3.x))/denominator;\n double ub = \n\t((v2.x - v1.x)*(v1.y-v3.y) - (v2.y- v1.y)*(v1.x - v3.x))/denominator;\n\n if ( ( TINY < ua && ua < 1.-TINY ) && ( TINY < ub && ub < 1.-TINY ) ) {\n\treturn true;\n }\n }\n return false;\n}\n/*! \\brief Constructs Walls, but only one per cell boundary.\n\n Standard method constructs a Wall for each cell wall element,\n making transport algorithms computationally more intensive than needed.\n\n We can remove this? Well, let's leave it in the code in case we need it for something else. E.g. for importing leaf architectures in different formats than our own... :-)\n\n*/\nvoid Cell::ConstructWalls(void)\n{\n return;\n if (dead) return;\n\n walls.clear();\n neighbors.clear();\n\n // Get \"corner points; i.e. nodes where more than 2 cells are connected\n list corner_points;\n\n for (list::const_iterator i=nodes.begin(); i!=nodes.end();i++) {\n\n // look for nodes belonging to >2 cells\n if ((*i)->owners.size()>2) {\n\n // push onto list\n corner_points.push_back(*i);\n }\n }\n\n // Construct Walls between corner points\n\n // previous one in list\n list::const_iterator nb = (--corner_points.end());\n\n // loop over list, \n for (list::const_iterator i=corner_points.begin(); i!=corner_points.end(); ( i++, nb++) ) {\n\n if (nb==corner_points.end()) nb=corner_points.begin();\n // add owning cells to a list\n list owning_cells;\n Node &n(*(*i));\n\n for (list::const_iterator j=n.owners.begin(); j!=n.owners.end(); j++) {\n owning_cells.push_back(j->cell);\n }\n\n Node &n2(*(*nb));\n for (list::const_iterator j=n2.owners.begin(); j!=n2.owners.end(); j++) {\n owning_cells.push_back(j->cell);\n }\n\n // sort cell owners\n owning_cells.sort( mem_fn( &Cell::Cmp ));\n\n // find duplicates\n vector duplicates;\n list::const_iterator prevj = (--owning_cells.end());\n for (list::const_iterator j=owning_cells.begin(); j!=owning_cells.end(); ( j++, prevj++) ) {\n if (prevj==owning_cells.end())\n\tprevj=owning_cells.begin();\n if (*j==*prevj) \n\tduplicates.push_back(*j);\n }\n\n if (duplicates.size()==3) { // ignore cell boundary (this occurs only after the first division, I think)\n vector::iterator dup_it = find_if(duplicates.begin(),duplicates.end(),mem_fn(&Cell::BoundaryPolP) );\n if (dup_it!=duplicates.end()) \n\tduplicates.erase(dup_it);\n else {\n\treturn;\n }\n }\n\n\n // One Wall for each neighbor, so we should be able to correctly construct neighbor lists here.\n if (duplicates[0]==this) {\n AddWall( new Wall(*nb,*i,duplicates[0],duplicates[1]) );\n if (!duplicates[1]->BoundaryPolP()) {\n\n\tneighbors.push_back(duplicates[1]);\n }\n } else {\n AddWall ( new Wall(*nb,*i,duplicates[1],duplicates[0]) );\n if (!duplicates[0]->BoundaryPolP()) {\n\tneighbors.push_back(duplicates[0]);\n\n }\n }\n }\n}\n\n\nvoid BoundaryPolygon::Draw(QGraphicsScene *c, QString tooltip)\n{\n\n // Draw the BoundaryPolygon on a QCanvas object\n\n CellItem* p = new CellItem(this, c);\n\n QPolygonF pa(nodes.size());\n int cc=0;\n\n for (list::const_iterator n=nodes.begin(); n!=nodes.end(); n++) {\n Node *i=*n;\n pa[cc++] = QPoint((qreal)((Offset().x+i->x)*Factor()), (qreal)((Offset().y+i->y)*Factor()) );\n }\n\n p->setPolygon(pa);\n p->setPen(par.outlinewidth>=0?QPen( QColor(par.cell_outline_color),par.outlinewidth):QPen(Qt::NoPen));\n p->setBrush( Qt::NoBrush );\n p->setZValue(1);\n\n if (!tooltip.isEmpty()) {\n p->setToolTip(tooltip);\n }\n\n c->addItem(p);\n p->show();\n}\n\nvoid Cell::Flux(double *flux, double *D)\n{\n // loop over cell edges\n\n for (int c=0;c::iterator i=walls.begin(); i!=walls.end(); i++) {\n\n // leaf cannot take up chemicals from environment (\"no flux boundary\")\n if ((*i)->c2->BoundaryPolP()) continue;\n\n\n // flux depends on edge length and concentration difference\n for (int c=0;clength * ( D[c] ) * ( ((Cell *)(*i)->c2)->chem[c] - chem[c] );\n\n#ifdef QDEBUG\n if ((*i)->c1!=this) {\n\tqDebug() << \"Warning, bad cells boundary: \" << (*i)->c1->Index() << \", \" << index << endl;\n }\n#endif\n\n flux[c] += phi;\n } \n }\n}\n\n\n// graphics stuff, not compiled for batch versions\n#ifdef QTGRAPHICS\n\n#include \"canvas.h\"\n\nvoid Cell::Draw(QGraphicsScene *c, bool showStiffness, QString tooltip)\n{\n\n // Draw the cell on a QCanvas object\n\n if (DeadP()) { \n#ifdef QDEBUG\n qDebug() << \"Cell \" << index << \" not drawn, because dead.\" << endl;\n#endif\n return;\n }\n\n CellItem* p = new CellItem(this, c);\n\n int cc=0;\n int* pcc=&cc;\n QPolygonF pa(nodes.size());\n QPolygonF *ppa =&pa;\n LoopWallElements([p,pcc,ppa,c,showStiffness](auto wallElementInfo){\n \twallElementInfo->getWallElement();\n \tVector start = *wallElementInfo->getFrom();\n \tVector end = *wallElementInfo->getTo();\n Vector edgevec = end-start;\n\tVector edgevecNormalised = edgevec.Normalised();\n Vector perp = edgevecNormalised.Perp2D();\n\n Vector offs = Cell::Offset();\n double factor = Cell::Factor();\n double stiffness = wallElementInfo->stiffness();\n if (std::isnan(stiffness)) {\n \tstiffness=1.0;\n }\n\n\tVector startEndOffset = edgevecNormalised * stiffness * 0.25 * factor;\n Vector thicknessOffset = (-1) * stiffness * 0.5 * factor * perp;\n Vector from = ( offs + start) * factor + thicknessOffset + startEndOffset;\n Vector to = ( offs + end) * factor + thicknessOffset - startEndOffset;\n\n\n QGraphicsLineItem *line = new QGraphicsLineItem((qreal)(from.x), (qreal)(from.y ),(qreal)(to.x), (qreal)(to.y ),p);\n if (showStiffness) {\n line->setPen(QPen( QColor(par.cell_outline_color),stiffness,Qt::SolidLine,Qt::RoundCap, Qt::BevelJoin));\n }else {\n line->setPen(par.outlinewidth>=0?QPen( QColor(par.cell_outline_color),par.outlinewidth):QPen(Qt::NoPen));\n }\n line->setZValue(2);\n c->addItem(line);\n line->show();\n\n\n (*ppa)[(*pcc)++] = QPointF((qreal)(from.x), (qreal)(from.y ));\n });\n\n QColor cell_color;\n\n m->plugin->SetCellColor(this,&cell_color);\n\n p->setPolygon(pa);\n p->setPen(QPen(Qt::NoPen));\n p->setBrush( cell_color );\n p->setZValue(1);\n\n if (!tooltip.isEmpty()) {\n p->setToolTip(tooltip);\n }\n c->addItem(p);\n p->show();\n}\n\nvoid Cell::DrawMiddleLamella(QGraphicsScene *c, QString tooltip){\n QGraphicsPathItem *middle = new QGraphicsPathItem;\n QPainterPath path;\n int cc=0;\n\n for (list::const_iterator n=nodes.begin(); n!=nodes.end(); n++) {\n Node *i=*n;\n if(cc ==0){\n path.moveTo(QPointF(i->x, i->y));\n }\n else{\n path.lineTo(QPointF(i->x, i->y));\n }\n cc++;\n }\n\n\n middle->setPath(path);\n middle->setPen(QPen(QColor(\"white\"),0.1));\n middle->setZValue(3);\n\n if (!tooltip.isEmpty()) {\n middle->setToolTip(tooltip);\n }\n c->addItem(middle);\n middle->show();\n}\n\n\nvoid Cell::DrawCenter(QGraphicsScene *c) const {\n // Maginfication derived similarly to that in nodeitem.cpp\n // Why not use Cell::Magnification()?\n const double mag = par.node_mag;\n int indicator = (CellType()+1)&3;\n int dimm=((CellType()+1)&(12))<<2;\n int intensity = 255 - (255/3)*dimm;\n int red= indicator == 1?intensity:0;\n int green= indicator == 2?intensity:0;\n int blue= indicator == 3?intensity:0;\n QColor color(red, green, blue, 255);\n // construct an ellipse\n QGraphicsEllipseItem *disk = new QGraphicsEllipseItem ( -1*mag, -1*mag, 2*mag, 2*mag, 0);\n disk->setBrush(color);\n disk->setZValue(5);\n Vector centroid=Centroid();\n disk -> setPos((offset[0]+centroid.x)*factor,(offset[1]+centroid.y)*factor);\n c->addItem(disk);\n disk->show();\n}\n\nvoid Cell::DrawNodes(QGraphicsScene *c) const {\n\n for (list::const_iterator n=nodes.begin(); n!=nodes.end(); n++) {\n Node *i=*n;\n\n NodeItem *item = new NodeItem ( &(*i), c );\n item->setColor();\n item->setZValue(5);\n item ->setPos(((offset[0]+i->x)*factor), ((offset[1]+i->y)*factor) );\n c->addItem(item);\n item->show();\n \n }\n}\n\nvoid Cell::DrawIndex(QGraphicsScene *c) const {\n\n DrawText( c, QString(\"%1\").arg(index));\n}\n\n// Draw any text in the cell's center\nvoid Cell::DrawText(QGraphicsScene *c, const QString &text) const {\n \n Vector centroid = Centroid();\n QGraphicsSimpleTextItem *ctext = new QGraphicsSimpleTextItem ( text, 0);\n // ctext->setPen( QPen(QColor(par.textcolor)) );\n ctext->setBrush( QBrush(QColor(par.textcolor)) );\n ctext->setZValue(20);\n ctext->setFont( QFont( \"Helvetica\", par.cellnumsize, QFont::Normal) );\n \n ctext ->setPos(((offset[0]+centroid.x)*factor),\n ((offset[1]+centroid.y)*factor) );\n c->addItem(ctext);\n ctext->show();\n \n}\n\n\nvoid Cell::DrawAxis(QGraphicsScene *c) const {\n\n Vector long_axis;\n double width;\n Length(&long_axis, &width);\n\n //cerr << \"Length is \" << length << endl;\n long_axis.Normalise();\n Vector short_axis=long_axis.Perp2D();\n\n\n Vector centroid = Centroid();\n Vector from = centroid - 0.5 * width * short_axis;\n Vector to = centroid + 0.5 * width *short_axis;\n\n\n QGraphicsLineItem *line = new QGraphicsLineItem(0);\n line->setPen( QPen(QColor(par.arrowcolor),2) );\n line->setZValue(2);\n\n line->setLine( ( (offset[0]+from.x)*factor ),\n\t\t ( (offset[1]+from.y)*factor ), \n\t\t ( (offset[0]+to.x)*factor ),\n\t\t ( (offset[1]+to.y)*factor ) );\n line->setZValue(10);\n c->addItem(line);\n line->show();\n \n}\n\nvoid Cell::DrawStrain(QGraphicsScene *c) const {\n MyWarning::warning(\"Sorry, Cell::DrawStrain temporarily not implemented.\");\n}\n\n\nvoid Cell::DrawFluxes(QGraphicsScene *c, double arrowsize)\n{\n\n // get the mean flux through this cell\n Vector vec_flux = ReduceCellAndWalls( PINdir );\n\n vec_flux.Normalise();\n\n vec_flux *= arrowsize;\n\n QGraphicsArrowItem *arrow = new QGraphicsArrowItem(0);\n\n Vector centroid = Centroid();\n Vector from = centroid - vec_flux/2.;\n Vector to = centroid + vec_flux/2.;\n\n\n arrow->setPen( QPen(QColor(par.arrowcolor),par.outlinewidth));\n arrow->setZValue(2);\n\n arrow->setLine( ( (offset[0]+from.x)*factor ),\n\t\t ( (offset[1]+from.y)*factor ), \n\t\t ( (offset[0]+to.x)*factor ),\n\t\t ( (offset[1]+to.y)*factor ) );\n arrow->setZValue(10);\n c->addItem(arrow);\n arrow->show();\n}\n\n\nvoid Cell::DrawWalls(QGraphicsScene *c) const {\n for_each(walls.begin(), walls.end(), [c](auto wall){return wall->Draw(c);});\n\n // to see the cells connected the each wall (for debugging), uncomment the following\n //for_each(walls.begin(), walls.end(), [c](auto wall){return wall->ShowStructure(c);});\n}\n\n\nvoid Cell::DrawValence(QGraphicsScene *c) const {\n\n DrawText(c, QString(\"%1\").arg(walls.size()) );\n}\n\n#endif // QTGRAPHICS !\n\n/*! \\brief Recalculate the lengths of the cell's Walls.\n\n Call this function after the Monte Carlo updates, and before doing the reaction-diffusion iterations.\n\n*/\nvoid Cell::SetWallLengths(void)\n{\n\n for (list::iterator de=walls.begin(); de!=walls.end(); de++) {\n\n // Step 1: find the path of nodes leading along the Wall.\n // A Wall often represents a curved cell wall: we want the total\n // length _along_ the wall here...\n\n\n // Locate first and second nodes of the edge in list of nodes\n list::const_iterator first_node_edge = find(nodes.begin(), nodes.end(), (*de)->n1);\n list::const_iterator second_node_edge_plus_1 = ++find(nodes.begin(), nodes.end(), (*de)->n2);\n\n double sum_length = 0.;\n\n // Now, walk to the second node of the edge in the list of nodes\n for (list::const_iterator n=++first_node_edge; n!=second_node_edge_plus_1; ++n ) {\n if (n==nodes.end())\n\tn=nodes.begin(); /* wrap around */ \n list::const_iterator prev_n = n; \n if (prev_n==nodes.begin())\n\tprev_n=nodes.end();\n --prev_n;\n\n // Note that Node derives from a Vector, so we can do vector calculus as defined in vector.h \n sum_length += (*(*prev_n) - *(*n)).Norm(); \n\n //cerr << \"Node \" << *prev_n << \" to \" << *n << \", cumulative length = \" << sum_length << endl;\n }\n\n // We got the total length of the Wall now, store it:\n (*de)->length = sum_length;\n\n //cerr << endl;\n // goto next de\n }\n}\n\nCellBase* Cell::getOtherWallElementSide(NodeBase *spikeEnd, NodeBase *over) {\n\tfor (list::iterator nb = ((Node*) spikeEnd)->owners.begin();\n\t\t\tnb != ((Node*) spikeEnd)->owners.end(); nb++) {\n\t\tif (nb->cell != this) {\n\t\t\tfor (list::iterator nb2 = ((Node*) over)->owners.begin();\n\t\t\t\t\tnb2 != ((Node*) over)->owners.end(); nb2++) {\n\t\t\t\tif (nb2->cell == nb->cell) {\n\t\t\t\t\treturn nb2->cell;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn NULL;\n}\n\nvoid Cell::InsertWall( WallBase *w )\n{\n\tlist::iterator it;\n\tif ((it=find_if ( walls.begin(), walls.end(),\n\t\t[w](auto wall){\n\t\t\treturn wall->N1() == w->N2();\n\t\t} )) == walls.end() ) {\n\t\twalls.insert(it, (Wall*)w);\n\t} else {\n\t\twalls.push_back( (Wall*)w );\n\t}\n if (find ( m->walls.begin(), m->walls.end(), w ) == m->walls.end() ) {\n \tm->walls.push_back((Wall*)w);\n\t}\n\n}\n//! Add Wall w to the list of Walls\nvoid Cell::AddWall( Wall *w )\n{\n\n // if necessary, we could try later inserting it at the correct position\n#ifdef QDEBUG\n if (w->c1 == w->c2 ){\n qDebug() << \"Wall between identical cells: \" << w->c1->Index()<< endl;\n }\n#endif\n\n // Add Wall to Cell's list\n walls.push_back( w );\n\n // Add wall to Mesh's list if it isn't there yet\n if (find ( m->walls.begin(), m->walls.end(), w ) == m->walls.end() ) { m->walls.push_back(w);\n }\n}\n\n//! Remove Wall w from the list of Walls\nlist::iterator Cell::RemoveWall( Wall *w )\n{\n\n // remove wall from Mesh's list\n m->walls.erase( find( m->walls.begin(), m->walls.end(), w ) );\n\n // remove wall from Cell's list\n return walls.erase (find( walls.begin(), walls.end(), w ));\n}\n\n\nvoid Cell::EmitValues(double t)\n{\n // cerr << \"Attempting to emit \" << t << \", \" << chem[0] << \", \" << chem[1] << endl;\n emit ChemMonValue(t, chem);\n}\n\nvoid Cell::insertNodeAfterFirst(NodeBase * position1,NodeBase * position2, NodeBase * newNode) {\n CellBase::insertNodeAfterFirst(position1,position2, newNode);\n ((Node*)newNode)->addCell(this);\n}\n\nWallBase* Cell::newWall(NodeBase* from,NodeBase* to,CellBase * other) {\n return new Wall((Node*)from, (Node*)to, this, other);\n}\n\nvoid Cell::correctNeighbors() {\n list::iterator nit=this->nodes.begin();\n Node* n1 = *nit;\n Node* n2 = *(++nit);\n Node* n3 = *(++nit);\n Node* first = n1;\n Node* second = n2;\n while (nit != this->nodes.end()) {\n n2->correctNeighbors(this->Index(), n1, n3);\n n1=n2;\n n2=n3;\n n3=*(++nit);\n }\n n3=first;\n n2->correctNeighbors(this->Index(), n1, n3);\n n1=n2;\n n2=n3;\n n3=second;\n n2->correctNeighbors(this->Index(), n1, n3);\n ConstructNeighborList();\n RecalcArea();\n}\n\ndouble Cell::elastic_limit() {\n\treturn this->m->elastic_limit;\n}\n/* finis */\n +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/src/GUI/cell.cpp b/src/GUI/cell.cpp +--- a/src/GUI/cell.cpp (revision c9763b319a64e0a25643e4681bffbcbc9a263036) ++++ b/src/GUI/cell.cpp (date 1746622456560) +@@ -66,75 +66,7 @@ + return *this; + } + +- +-DivisionAxisType axis_type = static_cast(par.division_axis_type); +-Vector Cell::CalculateDivisionAxis(void) { +- // Déclaration des variables locales +- Vector axis; +- Vector long_axis; +- double width = 0.0; +- switch(static_cast(par.division_axis_type)) { +- case SHORTEST_AXIS: +- // Calculer le grand axe puis prendre sa perpendiculaire +- Length(&long_axis, &width); +- axis = long_axis.Perp2D(); +- break; +- } +- case LONGEST_AXIS: { +- // Utiliser le grand axe +- Length(&long_axis, &width); +- axis = long_axis; +- break; +- } +- case RANDOM_AXIS: { +- // Générer un axe aléatoire +- double angle = 2 * Pi * RANDOM(); +- axis = Vector(cos(angle), sin(angle), 0); +- break; +- } +- /*case MECHANICAL_AXIS: { +- // Calcul basé sur les contraintes mécaniques +- Vector stress_direction; +- +- // Sommation des forces sur tous les nœuds +- for (list::iterator i = nodes.begin(); i != nodes.end(); i++) { +- stress_direction += (*i)->CalcForce(); +- } +- +- if (stress_direction.Norm() > 1e-6) { +- // Direction perpendiculaire à la contrainte principale +- axis = stress_direction.Normalised().Perp2D(); +- } else { +- // Par défaut, utiliser le grand axe +- Length(&long_axis, &width); +- axis = long_axis; +- } +- break; +- }*/ +- default: { +- // Par défaut, utiliser le petit axe +- Length(&long_axis, &width); +- axis = long_axis.Perp2D(); +- break; +- } +- } +- +- // Définir division_axis pour la cellule si nécessaire +- if (division_axis) { +- *division_axis = axis; +- } +- +- return axis; +-} +- +-void Cell::Divide(void) { +- Vector division_axis = CalculateDivisionAxis(); +- DivideOverAxis(division_axis); +-} +- +- +- +-void Cell::DivideOverAxis(Vector axis) ++void Cell::DivideOverAxis(Vector axis) + { + // Build a wall + // -> find the position of the wall +@@ -159,7 +91,7 @@ + + new_node_locations.push_back(i); + +- } ++ } + prev_cross_z=cross.z; + } + +@@ -195,7 +127,7 @@ + if ((*w)->c1 == this) { + + // invert wall? +- (*w)->c1 = (*w)->c2; ++ (*w)->c1 = (*w)->c2; + (*w)->c2 = m->boundary_polygon; + + Node *n1 = (*w)->n1; +@@ -222,7 +154,7 @@ + + #ifdef QDEBUG + if ((*w)) { +- qDebug() << "Wall " << (*w)->Index() << " says: c1 = " ++ qDebug() << "Wall " << (*w)->Index() << " says: c1 = " + << (*w)->c1->Index() << ", c2 = " << (*w)->c2->Index() << endl; + } + #endif +@@ -230,7 +162,7 @@ + } else { + #ifdef QDEBUG + qDebug() << "Not killing wall." << endl; +- qDebug() << "Wall " << (*w)->Index() << " says: c1 = " ++ qDebug() << "Wall " << (*w)->Index() << " says: c1 = " + << (*w)->c1->Index() << ", c2 = " << (*w)->c2->Index() << endl; + #endif + } +@@ -267,7 +199,7 @@ + no.MarkDead(); + } else { + // register node with outside world +- if (find_if( no.owners.begin(), no.owners.end(), ++ if (find_if( no.owners.begin(), no.owners.end(), + [this](auto neighbor){return neighbor.CellEquals(m->boundary_polygon->Index());} ) == no.owners.end() ) { + tmp.cell = m->boundary_polygon; + no.owners.push_back(tmp); +@@ -296,7 +228,7 @@ + find_if((*i)->owners.begin(), + (*i)->owners.end(), + [this](auto neighbor){return neighbor.CellEquals(this->Index());}); +- if (neighb_with_this_cell!=(*i)->owners.end()) ++ if (neighb_with_this_cell!=(*i)->owners.end()) + (*i)->owners.erase(neighb_with_this_cell); + } + +@@ -341,12 +273,12 @@ + } + Vector v4 = *(*nb); + +- double denominator = ++ double denominator = + (v4.y - v3.y)*(v2.x - v1.x) - (v4.x - v3.x)*(v2.y - v1.y); + +- double ua = ++ double ua = + ((v4.x - v3.x)*(v1.y - v3.y) - (v4.y - v3.y)*(v1.x -v3.x))/denominator; +- double ub = ++ double ub = + ((v2.x - v1.x)*(v1.y-v3.y) - (v2.y- v1.y)*(v1.x - v3.x))/denominator; + + +@@ -356,11 +288,11 @@ + // yes, intersection detected. Push the location to the list of iterators + new_node_locations.push_back(nb); + +- } ++ } + } + + #ifdef QDEBUG +- if (new_node_locations.size()<2) { ++ if (new_node_locations.size()<2) { + qDebug() << "Line does not intersect with two edges of Cell " << Index() << endl; + qDebug() << "new_node_locations.size() = " << new_node_locations.size() << endl; + return false; +@@ -372,7 +304,7 @@ + qDebug() << "Location of new nodes: " << (**i)->Index() << " and "; + + ++i; +- j = *i; ++ j = *i; + if (j==nodes.begin()) j=nodes.end(); j--; + + qDebug() << (*j)->Index() << endl; +@@ -620,14 +552,14 @@ + list::iterator nb=*i; + if (nb == nodes.begin()) { + nb = nodes.end(); +- } ++ } + nb--; +- Vector v4=*( *nb ); ++ Vector v4=*( *nb ); + +- double denominator = ++ double denominator = + (v4.y - v3.y)*(v2.x - v1.x) - (v4.x - v3.x)*(v2.y - v1.y); + +- double ua = ++ double ua = + ((v4.x - v3.x)*(v1.y - v3.y) - (v4.y - v3.y)*(v1.x -v3.x))/denominator; + + double intersec_x = v1.x + ua*(v2.x-v1.x); +@@ -657,7 +589,7 @@ + new_node[nnc] = *(**i); + new_node_ind[nnc] = **i; + //cerr << **i << endl ; +- } else ++ } else + if ( (*(*nb) - *n).Norm() < collapse_node_threshold * elem_length ) { + new_node_flag[nnc]=2; + new_node[nnc] = *(*nb); +@@ -676,7 +608,7 @@ + + Cell *neighbor_cell=0; // we need this to split up the "Wall" objects. + +- // for both divided edges: ++ // for both divided edges: + // insert its new node into all cells that own the divided edge + // but only if it really is a new node: + if (new_node_flag[i]!=0) { +@@ -689,14 +621,14 @@ + boundary = SAM; + daughter->boundary = SAM; + boundary_touched_flag = true; +- */ ++ */ + } + + } else { + + // (Construct a list of all owners:) + // really construct the new node (if this is a new node) +- new_node_ind[i] = ++ new_node_ind[i] = + m->AddNode(new Node (new_node[i]) ); + + +@@ -736,7 +668,7 @@ + #ifdef QDEBUG + qDebug() << "Index of the first node: " << div_edges[i].first->Index() << endl; + qDebug() << "Index of the second node: " << div_edges[i].second->Index() << endl; +- qDebug() << "Boundary proceeds from: " << div_edges[i].first->Index() ++ qDebug() << "Boundary proceeds from: " << div_edges[i].first->Index() + << "to: " << (m->findNextBoundaryNode(div_edges[i].first))->Index() << endl << endl; + #endif + new_node_ind[i]->SetBoundary(); +@@ -762,7 +694,7 @@ + } else { + // insert before second node, so leave ins_pos as it is, + // that is: incremented +- m->boundary_polygon->nodes.insert(ins_pos, new_node_ind[i]); ++ m->boundary_polygon->nodes.insert(ins_pos, new_node_ind[i]); + // .. set the neighbors of the new node ... + } + } +@@ -780,17 +712,17 @@ + back_inserter(owners)); + + +- // find first non-self duplicate in the owners: ++ // find first non-self duplicate in the owners: + // cells owning the same two nodes + // share an edge with me + owners.sort( [](auto neighbor_a, auto neighbor_b){return neighbor_a.Cmp(neighbor_b);} ); + + +-#ifdef QDEBUG ++#ifdef QDEBUG + list unique_owners; + copy(owners.begin(), owners.end(), back_inserter(unique_owners)); + unique_owners.unique( mem_fn( &Neighbor::Eq ) ); +- qDebug() << "The dividing edge nodes: " << div_edges[i].first->Index() ++ qDebug() << "The dividing edge nodes: " << div_edges[i].first->Index() + << " and " << div_edges[i].second->Index() << " are owned by cells: "; + + // spit out each owners' cell index +@@ -815,7 +747,7 @@ + #endif + edge_owners.push_back(*it); + } +- } ++ } + + if (edge_owners.size() > 1){ + // Remove the boundary polygon - if its there +@@ -837,7 +769,7 @@ + list::iterator c = (edge_owners.size() != 0) ? edge_owners.begin() : edge_owners.end(); + + // (can we have more than one neighboring cell here??) +- if (c!=owners.end()) { ++ if (c!=owners.end()) { + neighbor_cell = c->cell; + if (c->cell == NULL) { + cout << "error"; +@@ -878,7 +810,7 @@ + back_inserter(owners)); + + +- // find first non-self duplicate in the owners: ++ // find first non-self duplicate in the owners: + // cells owning the same two nodes + // share an edge with me + owners.sort( mem_fn ( &Neighbor::Cmp ) ); +@@ -891,7 +823,7 @@ + + if (c!=owners.end()) + neighbor_cell = c->cell; +- else ++ else + neighbor_cell = 0; + } + +@@ -992,7 +924,7 @@ + start++; + if (start==nodes.end()) + start=nodes.begin(); +- } ++ } + + stop=new_node_locations.back(); + if (new_node_flag[1]==2) { +@@ -1053,7 +985,7 @@ + new_nodes_parent.push_back( *i ); + + i++; +- if (i==nodes.end()) ++ if (i==nodes.end()) + i = nodes.begin(); + }; + } +@@ -1124,8 +1056,8 @@ + + // move the new nodes to the parent + nodes.clear(); +- copy( new_nodes_parent.begin(), +- new_nodes_parent.end(), ++ copy( new_nodes_parent.begin(), ++ new_nodes_parent.end(), + back_inserter(nodes) ); + + +@@ -1135,7 +1067,7 @@ + + if (boundary_touched_flag) { + m->boundary_polygon->ConstructConnections(); +- } ++ } + + // collecting neighbors of divided cell + list broken_neighbors; +@@ -1336,6 +1268,7 @@ + double patrialLengthAfter = ((*after2) - (*node)).Norm(); + double ratio = patrialLengthBefore / (patrialLengthBefore+patrialLengthAfter); + double elastic_limit = this->m->elastic_limit; ++ + WallElementInfo element; + if (!reverse) { + this->fillWallElementInfo(&element, before1, node); +@@ -1383,7 +1316,7 @@ + + // Displace whole cell, add resulting energy to dh, + // and accept displacement if energetically favorable +- // ++ // + // Method is called if a "fixed" node is displaced + + // Warning: length constraint not yet CORRECTLY implemented for this function +@@ -1410,7 +1343,7 @@ + if (n->getCell()!=this) { + length_edges.push_back( pair (*i, n->nb1) ); + length_edges.push_back( pair (*i, n->nb2) ); +- old_length += ++ old_length += + DSQR(Node::target_length-(*(*i)-*(n->nb1)).Norm())+ + DSQR(Node::target_length-(*(*i)-*(n->nb2)).Norm()); + } +@@ -1450,7 +1383,7 @@ + list::const_iterator nb_it = neighbors.begin(); + for (vector::const_iterator ar_it = cellareas.begin(); ar_it!=cellareas.end(); ( ar_it++, nb_it++) ) { + ((Cell *)(*nb_it))->area = *ar_it; +- (*nb_it)->SetIntegrals(); ++ (*nb_it)->SetIntegrals(); + } + + //cerr << endl; +@@ -1479,7 +1412,7 @@ + for (list::const_iterator i=nodes.begin(); i!=nodes.end(); i++) { + for (list::const_iterator n=(*i)->owners.begin(); n!=(*i)->owners.end(); n++) { + if (n->getCell()==this) { +- length_contribution += ++ length_contribution += + DSQR(Node::target_length-(*(*i)-*(n->nb1)).Norm()) + + DSQR(Node::target_length-(*(*i)-*(n->nb2)).Norm()); + } +@@ -1501,6 +1434,7 @@ + + + ++ + bool Cell::SelfIntersect(void) + { + // The (obvious) O(N*N) algorithm +@@ -1517,32 +1451,32 @@ + + for (list::const_iterator i=nodes.begin(); i!=nodes.end(); i++) { + +- list::const_iterator j=i; ++ list::const_iterator j=i; + ++j; +- for (; j!=nodes.end(); j++) ++ for (; j!=nodes.end(); j++) + { +- ++ + Vector v1 = *(*i); + list::const_iterator nb=i; + nb++; + if (nb == nodes.end()) { + nb = nodes.begin(); +- } ++ } + Vector v2 = *(*nb); + Vector v3 = *(*j); + nb=j; + nb++; + if (nb == nodes.end()) { + nb = nodes.begin(); +- } +- Vector v4=*( *nb ); ++ } ++ Vector v4=*( *nb ); + +- double denominator = ++ double denominator = + (v4.y - v3.y)*(v2.x - v1.x) - (v4.x - v3.x)*(v2.y - v1.y); + +- double ua = ++ double ua = + ((v4.x - v3.x)*(v1.y - v3.y) - (v4.y - v3.y)*(v1.x -v3.x))/denominator; +- double ub = ++ double ub = + ((v2.x - v1.x)*(v1.y-v3.y) - (v2.y- v1.y)*(v1.x - v3.x))/denominator; + + +@@ -1561,7 +1495,7 @@ + bool Cell::MoveSelfIntersectsP(Node *moving_node_ind, Vector new_pos) + { + +- // Check whether the polygon will self-intersect if moving_node_ind ++ // Check whether the polygon will self-intersect if moving_node_ind + // were displaced to new_pos + + // Compare the two new edges against each other edge +@@ -1581,9 +1515,9 @@ + nb++; + if (nb == nodes.end()) { + nb = nodes.begin(); +- } ++ } + +- neighbor_of_moving_node[0]=*(*nb); ++ neighbor_of_moving_node[0]=*(*nb); + + nb=moving_node_ind_pos; + if (nb == nodes.begin()) { +@@ -1591,7 +1525,7 @@ + } + nb--; + +- neighbor_of_moving_node[1]=*( *nb ); ++ neighbor_of_moving_node[1]=*( *nb ); + + + for (list::const_iterator i=nodes.begin(); i!=nodes.end(); i++) { +@@ -1600,7 +1534,7 @@ + nb++; + if (nb == nodes.end()) { + nb = nodes.begin(); +- } ++ } + if (*i == moving_node_ind || *nb == moving_node_ind) { + // do not compare to self + continue; +@@ -1609,12 +1543,12 @@ + Vector v3 = *(*i); + Vector v4 = *(*nb); + +- double denominator = ++ double denominator = + (v4.y - v3.y)*(neighbor_of_moving_node[j].x - new_pos.x) - (v4.x - v3.x)*(neighbor_of_moving_node[j].y - new_pos.y); + +- double ua = ++ double ua = + ((v4.x - v3.x)*(new_pos.y - v3.y) - (v4.y - v3.y)*(new_pos.x -v3.x))/denominator; +- double ub = ++ double ub = + ((neighbor_of_moving_node[j].x - new_pos.x)*(new_pos.y-v3.y) - (neighbor_of_moving_node[j].y- new_pos.y)*(new_pos.x - v3.x))/denominator; + + if ( ( TINY < ua && ua < 1.-TINY ) && ( TINY < ub && ub < 1.-TINY ) ) { +@@ -1632,40 +1566,40 @@ + + bool Cell::MoveSelfIntersectsP(Node *moving_node_ind, Vector new_pos) + { +- ++ + // Check whether the polygon will self-intersect if moving_node_ind + // were displaced to new_pos +- ++ + // Compare the two new edges against each other edge +- ++ + // O(2*N) +- ++ + // method used for segment intersection: + // http://astronomy.swin.edu.au/~pbourke/geometry/lineline2d/ +- ++ + Vector neighbor_of_moving_node[2]; +- ++ + //cerr << "list::const_iterator moving_node_ind_pos = find (nodes.begin(),nodes.end(),moving_node_ind);\n"; + list::const_iterator moving_node_ind_pos = find (nodes.begin(),nodes.end(),moving_node_ind); +- ++ + list::const_iterator nb = moving_node_ind_pos; + //cerr << "Done\n"; + nb++; + if (nb == nodes.end()) { + nb = nodes.begin(); + } +- ++ + neighbor_of_moving_node[0]=*(*nb); +- ++ + nb=moving_node_ind_pos; + if (nb == nodes.begin()) { + nb = nodes.end(); + } + nb--; +- ++ + neighbor_of_moving_node[1]=*( *nb ); +- +- ++ ++ + for (list::const_iterator i=nodes.begin(); i!=nodes.end(); i++) { + for (int j=0;j<2;j++) { // loop over the two neighbors of moving node + list::const_iterator nb=i; +@@ -1677,13 +1611,13 @@ + // do not compare to self + continue; + } +- ++ + Vector v3 = *(*i); + Vector v4 = *(*nb); +- ++ + double denominator = + (v4.y - v3.y)*(neighbor_of_moving_node[j].x - new_pos.x) - (v4.x - v3.x)*(neighbor_of_moving_node[j].y - new_pos.y); +- ++ + // double ua = + // ((v4.x - v3.x)*(new_pos.y - v3.y) - (v4.y - v3.y)*(new_pos.x -v3.x))/denominator; + // double ub = +@@ -1691,20 +1625,20 @@ + + double numera = ((v4.x - v3.x)*(new_pos.y - v3.y) - (v4.y - v3.y)*(new_pos.x -v3.x)); + double numerb = ((neighbor_of_moving_node[j].x - new_pos.x)*(new_pos.y-v3.y) - (neighbor_of_moving_node[j].y- new_pos.y)*(new_pos.x - v3.x)); +- ++ + // Are the wall elements coincident? + if (fabs(numera) < TINY && fabs(numerb) < TINY && fabs(denominator) < TINY) { + return true; + } +- ++ + // Are the wall elements parallel? + if (fabs(denominator) < TINY) { + continue; + } + double ua = numera / denominator; + double ub = numerb / denominator; +- +- ++ ++ + //if ( ( TINY < ua && ua < 1.-TINY ) && ( TINY < ub && ub < 1.-TINY ) ) { + if ( ( 0 < ua && ua < 1. ) && ( 0 < ub && ub < 1.) ) { + //cerr << "ua = " << ua << ", ub = " << ub << endl; +@@ -1720,84 +1654,84 @@ + + bool Cell::LinePieceIntersectsP(const Vector n1, const Vector n2) const + { +- ++ + // Check whether the polygon will self-intersect if moving_node_ind + // were displaced to new_pos +- ++ + // Compare the two new edges against each other edge +- ++ + // O(2*N) +- ++ + // method used for segment intersection: + // http://astronomy.swin.edu.au/~pbourke/geometry/lineline2d/ +- ++ + /*Vector neighbor_of_moving_node[2]; +- ++ + //cerr << "list::const_iterator moving_node_ind_pos = find (nodes.begin(),nodes.end(),moving_node_ind);\n"; + list::const_iterator moving_node_ind_pos = find (nodes.begin(),nodes.end(),moving_node_ind); +- ++ + list::const_iterator nb = moving_node_ind_pos; + //cerr << "Done\n"; + nb++; + if (nb == nodes.end()) { + nb = nodes.begin(); + } +- ++ + neighbor_of_moving_node[0]=*(*nb); +- ++ + nb=moving_node_ind_pos; + if (nb == nodes.begin()) { + nb = nodes.end(); + } + nb--; +- ++ + neighbor_of_moving_node[1]=*( *nb ); + */ +- ++ + for (list::const_iterator i=nodes.begin(); i!=nodes.end(); i++) { + list::const_iterator nb=i; + nb++; + if (nb == nodes.end()) { + nb = nodes.begin(); + } +- ++ + /* if (*i == moving_node_ind || *nb == moving_node_ind) { + // do not compare to self + continue; + }*/ +- ++ + Vector v3 = *(*i); + Vector v4 = *(*nb); +- ++ + double denominator = + (v4.y - v3.y)*(n1.x - n2.x) - (v4.x - v3.x)*(n1.y - n2.y); +- ++ + /* double ua = + ((v4.x - v3.x)*(new_pos.y - v3.y) - (v4.y - v3.y)*(new_pos.x -v3.x))/denominator; + double ub = + ((neighbor_of_moving_node[j].x - new_pos.x)*(new_pos.y-v3.y) - (neighbor_of_moving_node[j].y- new_pos.y)*(new_pos.x - v3.x))/denominator;*/ + double numera = ((v4.x - v3.x)*(n1.y - v3.y) - (v4.y - v3.y)*(n1.x -v3.x)); + double numerb = ((n2.x - n1.x)*(n1.y-v3.y) - (n2.y- n1.y)*(n1.x - v3.x)); +- ++ + /* Are the wall elements coincident? */ + if (fabs(numera) < TINY && fabs(numerb) < TINY && fabs(denominator) < TINY) { + return true; + } +- ++ + /* Are the wall elements parallel? */ + if (fabs(denominator) < TINY) { + continue; + } + double ua = numera / denominator; + double ub = numerb / denominator; +- +- ++ ++ + //if ( ( TINY < ua && ua < 1.-TINY ) && ( TINY < ub && ub < 1.-TINY ) ) { + if ( ( 0 < ua && ua < 1. ) && ( 0 < ub && ub < 1.) ) { + //cerr << "ua = " << ua << ", ub = " << ub << endl; + return true; + } +- ++ + } + return false; + } +@@ -1810,7 +1744,7 @@ + // Compare the line against each edge + // method used: http://astronomy.swin.edu.au/~pbourke/geometry/lineline2d/ + +- for (list::const_iterator i=nodes.begin(); i!=nodes.end(); i++) ++ for (list::const_iterator i=nodes.begin(); i!=nodes.end(); i++) + { + Vector v3 = *(*i); + list::const_iterator nb=i; +@@ -1820,12 +1754,12 @@ + } + Vector v4 = *(*nb); + +- double denominator = ++ double denominator = + (v4.y - v3.y)*(v2.x - v1.x) - (v4.x - v3.x)*(v2.y - v1.y); + +- double ua = ++ double ua = + ((v4.x - v3.x)*(v1.y - v3.y) - (v4.y - v3.y)*(v1.x -v3.x))/denominator; +- double ub = ++ double ub = + ((v2.x - v1.x)*(v1.y-v3.y) - (v2.y- v1.y)*(v1.x - v3.x))/denominator; + + if ( ( TINY < ua && ua < 1.-TINY ) && ( TINY < ub && ub < 1.-TINY ) ) { +@@ -1868,7 +1802,7 @@ + // previous one in list + list::const_iterator nb = (--corner_points.end()); + +- // loop over list, ++ // loop over list, + for (list::const_iterator i=corner_points.begin(); i!=corner_points.end(); ( i++, nb++) ) { + + if (nb==corner_points.end()) nb=corner_points.begin(); +@@ -1894,13 +1828,13 @@ + for (list::const_iterator j=owning_cells.begin(); j!=owning_cells.end(); ( j++, prevj++) ) { + if (prevj==owning_cells.end()) + prevj=owning_cells.begin(); +- if (*j==*prevj) ++ if (*j==*prevj) + duplicates.push_back(*j); + } + + if (duplicates.size()==3) { // ignore cell boundary (this occurs only after the first division, I think) + vector::iterator dup_it = find_if(duplicates.begin(),duplicates.end(),mem_fn(&Cell::BoundaryPolP) ); +- if (dup_it!=duplicates.end()) ++ if (dup_it!=duplicates.end()) + duplicates.erase(dup_it); + else { + return; +@@ -1978,7 +1912,7 @@ + #endif + + flux[c] += phi; +- } ++ } + } + } + +@@ -1993,7 +1927,7 @@ + + // Draw the cell on a QCanvas object + +- if (DeadP()) { ++ if (DeadP()) { + #ifdef QDEBUG + qDebug() << "Cell " << index << " not drawn, because dead." << endl; + #endif +@@ -2118,7 +2052,7 @@ + item ->setPos(((offset[0]+i->x)*factor), ((offset[1]+i->y)*factor) ); + c->addItem(item); + item->show(); +- ++ + } + } + +@@ -2129,19 +2063,19 @@ + + // Draw any text in the cell's center + void Cell::DrawText(QGraphicsScene *c, const QString &text) const { +- ++ + Vector centroid = Centroid(); + QGraphicsSimpleTextItem *ctext = new QGraphicsSimpleTextItem ( text, 0); + // ctext->setPen( QPen(QColor(par.textcolor)) ); + ctext->setBrush( QBrush(QColor(par.textcolor)) ); + ctext->setZValue(20); + ctext->setFont( QFont( "Helvetica", par.cellnumsize, QFont::Normal) ); +- ++ + ctext ->setPos(((offset[0]+centroid.x)*factor), + ((offset[1]+centroid.y)*factor) ); + c->addItem(ctext); + ctext->show(); +- ++ + } + + +@@ -2166,13 +2100,13 @@ + line->setZValue(2); + + line->setLine( ( (offset[0]+from.x)*factor ), +- ( (offset[1]+from.y)*factor ), ++ ( (offset[1]+from.y)*factor ), + ( (offset[0]+to.x)*factor ), + ( (offset[1]+to.y)*factor ) ); + line->setZValue(10); + c->addItem(line); + line->show(); +- ++ + } + + void Cell::DrawStrain(QGraphicsScene *c) const { +@@ -2201,7 +2135,7 @@ + arrow->setZValue(2); + + arrow->setLine( ( (offset[0]+from.x)*factor ), +- ( (offset[1]+from.y)*factor ), ++ ( (offset[1]+from.y)*factor ), + ( (offset[0]+to.x)*factor ), + ( (offset[1]+to.y)*factor ) ); + arrow->setZValue(10); +@@ -2249,14 +2183,14 @@ + // Now, walk to the second node of the edge in the list of nodes + for (list::const_iterator n=++first_node_edge; n!=second_node_edge_plus_1; ++n ) { + if (n==nodes.end()) +- n=nodes.begin(); /* wrap around */ +- list::const_iterator prev_n = n; ++ n=nodes.begin(); /* wrap around */ ++ list::const_iterator prev_n = n; + if (prev_n==nodes.begin()) + prev_n=nodes.end(); + --prev_n; + +- // Note that Node derives from a Vector, so we can do vector calculus as defined in vector.h +- sum_length += (*(*prev_n) - *(*n)).Norm(); ++ // Note that Node derives from a Vector, so we can do vector calculus as defined in vector.h ++ sum_length += (*(*prev_n) - *(*n)).Norm(); + + //cerr << "Node " << *prev_n << " to " << *n << ", cumulative length = " << sum_length << endl; + } +@@ -2372,4 +2306,5 @@ + double Cell::elastic_limit() { + return this->m->elastic_limit; + } ++ + /* finis */ +Index: src/Library/parameter.cpp +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP +<+>/*\n *\n * This file is part of the Virtual Leaf.\n *\n * VirtualLeaf is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * VirtualLeaf is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with the Virtual Leaf. If not, see .\n *\n * Copyright 2010 Roeland Merks.\n *\n */\n\n// WARNING: This file is automatically generated by make_parameter_source.pl.\n// Do not edit. All edits will be discarded.\n\n#include \"parameter.h\"\n#include \n#include \n#include \n#include \n#include \n#include \n#include \"output.h\"\n#include \"parse.h\"\n#include \"xmlwrite.h\"\n#include \"warning.h\"\n#include \n#include \n#include \n\nusing namespace std;\n\nstatic const std::string _module_id(\"$Id$\");\n\nParameter::Parameter() {\n arrowcolor = strdup(\"white\");\n arrowsize = 100;\n textcolor = strdup(\"red\");\n cellnumsize = 1;\n nodenumsize = 1;\n node_mag = 1.0;\n outlinewidth = 1.0;\n cell_outline_color = strdup(\"forestgreen\");\n resize_stride = 0;\n export_interval = 0;\n export_fn_prefix = strdup(\"cell.\");\n storage_stride = 10;\n xml_storage_stride = 500;\n datadir = strdup(\".\");\n datadir = AppendHomeDirIfPathRelative(datadir);\n T = 1.0;\n lambda_length = 100.;\n yielding_threshold = 4.;\n lambda_celllength = 0.;\n target_length = 60.;\n cell_expansion_rate = 1.;\n cell_div_expansion_rate = 0.;\n auxin_dependent_growth = true;\n ode_accuracy = 1e-4;\n mc_stepsize = 0.4;\n mc_cell_stepsize = 0.2;\n energy_threshold = 1000.;\n bend_lambda = 0.;\n alignment_lambda = 0.;\n rel_cell_div_threshold = 2.;\n rel_perimeter_stiffness = 2;\n collapse_node_threshold = 0.05;\n morphogen_div_threshold = 0.2;\n morphogen_expansion_threshold = 0.01;\n copy_wall = true;\n source = 0.;\n D = new double[15];\n D[0] = 0.;\n D[1] = 0.0;\n D[2] = 0.0;\n D[3] = 0.;\n D[4] = 0.;\n D[5] = 0.;\n D[6] = 0.;\n D[7] = 0.;\n D[8] = 0.;\n D[9] = 0.;\n D[10] = 0.;\n D[11] = 0.;\n D[12] = 0.;\n D[13] = 0.;\n D[14] = 0.;\n initval = new double[15];\n initval[0] = 0.;\n initval[1] = 0.;\n initval[2] = 0.;\n initval[3] = 0.;\n initval[4] = 0.;\n initval[5] = 0.;\n initval[6] = 0.;\n initval[7] = 0.;\n initval[8] = 0.;\n initval[9] = 0.;\n initval[10] = 0.;\n initval[11] = 0.;\n initval[12] = 0.;\n initval[13] = 0.;\n initval[14] = 0.;\n k1 = 1.;\n k2 = 0.3;\n r = 1.;\n kr = 1.;\n km = 1.;\n Pi_tot = 1.;\n transport = 0.036;\n ka = 1;\n pin_prod = 0.001;\n pin_prod_in_epidermis = 0.1;\n pin_breakdown = 0.001;\n pin_breakdown_internal = 0.001;\n aux1prod = 0.001;\n aux1prodmeso = 0.;\n aux1decay = 0.001;\n aux1decaymeso = 0.1;\n aux1transport = 0.036;\n aux_cons = 0.;\n aux_breakdown = 0.;\n kaux1 = 1;\n kap = 1;\n leaf_tip_source = 0.001;\n sam_efflux = 0.0001;\n sam_auxin = 10.;\n sam_auxin_breakdown = 0;\n van3prod = 0.002;\n van3autokat = 0.1;\n van3sat = 10;\n k2van3 = 0.3;\n dt = 0.1;\n rd_dt = 1.0;\n movie = false;\n nit = 100000;\n maxt = 1000.;\n rseed = -1;\n constituous_expansion_limit = 16;\n vessel_inh_level = 1;\n vessel_expansion_rate = 0.25;\n d = 0.;\n e = 0.;\n f = 0.;\n c = 0.;\n mu = 0.;\n nu = 0.;\n rho0 = 0.;\n rho1 = 0.;\n c0 = 0.;\n gamma = 0.;\n eps = 0.;\n betaN = 0.;\n gammaN = 0.;\n betaD = 0.;\n gammaD = 0.;\n betaR = 0.;\n gammaR = 0.;\n tau = 0.;\n kt = 0.;\n kc = 0.;\n krs = 0.;\n k = new double[15];\n k[0] = 0.;\n k[1] = 0.0;\n k[2] = 0.0;\n k[3] = 0.;\n k[4] = 0.;\n k[5] = 0.;\n k[6] = 0.;\n k[7] = 0.;\n k[8] = 0.;\n k[9] = 0.;\n k[10] = 0.;\n k[11] = 0.;\n k[12] = 0.;\n k[13] = 0.;\n k[14] = 0.;\n i1 = 0;\n i2 = 0;\n b4 = false;\n dir1 = strdup(\".\");\n dir2 = strdup(\".\");\n division_axis_type = 0;\n}\n\nParameter::~Parameter() {\n \n// destruct parameter object\n// free string parameter\nCleanUp();\n}\n\nvoid Parameter::CleanUp(void) {\n if (arrowcolor) \n free(arrowcolor);\n if (textcolor) \n free(textcolor);\n if (cell_outline_color) \n free(cell_outline_color);\n if (export_fn_prefix) \n free(export_fn_prefix);\n if (datadir) \n free(datadir);\n if (D) \n free(D);\n if (initval) \n free(initval);\n if (k) \n free(k);\n if (dir1) \n free(dir1);\n if (dir2) \n free(dir2);\n\n}\n\nvoid Parameter::Read(const char *filename) {\n \n static bool ReadP=false;\n\n if (ReadP) {\n\n //throw \"Run Time Error in parameter.cpp: Please Read parameter file only once!!\";\n CleanUp();\n\t\n } else\n ReadP=true;\n\n FILE *fp=OpenReadFile(filename);\n\n\n arrowcolor = sgetpar(fp, \"arrowcolor\", \"white\", true);\n arrowsize = fgetpar(fp, \"arrowsize\", 100, true);\n textcolor = sgetpar(fp, \"textcolor\", \"red\", true);\n cellnumsize = igetpar(fp, \"cellnumsize\", 1, true);\n nodenumsize = igetpar(fp, \"nodenumsize\", 1, true);\n node_mag = fgetpar(fp, \"node_mag\", 1.0, true);\n outlinewidth = fgetpar(fp, \"outlinewidth\", 1.0, true);\n cell_outline_color = sgetpar(fp, \"cell_outline_color\", \"forestgreen\", true);\n resize_stride = igetpar(fp, \"resize_stride\", 0, true);\n export_interval = igetpar(fp, \"export_interval\", 0, true);\n export_fn_prefix = sgetpar(fp, \"export_fn_prefix\", \"cell.\", true);\n storage_stride = igetpar(fp, \"storage_stride\", 10, true);\n xml_storage_stride = igetpar(fp, \"xml_storage_stride\", 500, true);\n datadir = sgetpar(fp, \"datadir\", \".\", true);\n datadir = AppendHomeDirIfPathRelative(datadir);\n if (strcmp(datadir, \".\"))\n MakeDir(datadir);\n T = fgetpar(fp, \"T\", 1.0, true);\n lambda_length = fgetpar(fp, \"lambda_length\", 100., true);\n yielding_threshold = fgetpar(fp, \"yielding_threshold\", 4., true);\n lambda_celllength = fgetpar(fp, \"lambda_celllength\", 0., true);\n target_length = fgetpar(fp, \"target_length\", 60., true);\n cell_expansion_rate = fgetpar(fp, \"cell_expansion_rate\", 1., true);\n cell_div_expansion_rate = fgetpar(fp, \"cell_div_expansion_rate\", 0., true);\n auxin_dependent_growth = bgetpar(fp, \"auxin_dependent_growth\", true, true);\n ode_accuracy = fgetpar(fp, \"ode_accuracy\", 1e-4, true);\n mc_stepsize = fgetpar(fp, \"mc_stepsize\", 0.4, true);\n mc_cell_stepsize = fgetpar(fp, \"mc_cell_stepsize\", 0.2, true);\n energy_threshold = fgetpar(fp, \"energy_threshold\", 1000., true);\n bend_lambda = fgetpar(fp, \"bend_lambda\", 0., true);\n alignment_lambda = fgetpar(fp, \"alignment_lambda\", 0., true);\n rel_cell_div_threshold = fgetpar(fp, \"rel_cell_div_threshold\", 2., true);\n rel_perimeter_stiffness = fgetpar(fp, \"rel_perimeter_stiffness\", 2, true);\n collapse_node_threshold = fgetpar(fp, \"collapse_node_threshold\", 0.05, true);\n morphogen_div_threshold = fgetpar(fp, \"morphogen_div_threshold\", 0.2, true);\n morphogen_expansion_threshold = fgetpar(fp, \"morphogen_expansion_threshold\", 0.01, true);\n copy_wall = bgetpar(fp, \"copy_wall\", true, true);\n source = fgetpar(fp, \"source\", 0., true);\n D = dgetparlist(fp, \"D\", 15, true);\n initval = dgetparlist(fp, \"initval\", 15, true);\n k1 = fgetpar(fp, \"k1\", 1., true);\n k2 = fgetpar(fp, \"k2\", 0.3, true);\n r = fgetpar(fp, \"r\", 1., true);\n kr = fgetpar(fp, \"kr\", 1., true);\n km = fgetpar(fp, \"km\", 1., true);\n Pi_tot = fgetpar(fp, \"Pi_tot\", 1., true);\n transport = fgetpar(fp, \"transport\", 0.036, true);\n ka = fgetpar(fp, \"ka\", 1, true);\n pin_prod = fgetpar(fp, \"pin_prod\", 0.001, true);\n pin_prod_in_epidermis = fgetpar(fp, \"pin_prod_in_epidermis\", 0.1, true);\n pin_breakdown = fgetpar(fp, \"pin_breakdown\", 0.001, true);\n pin_breakdown_internal = fgetpar(fp, \"pin_breakdown_internal\", 0.001, true);\n aux1prod = fgetpar(fp, \"aux1prod\", 0.001, true);\n aux1prodmeso = fgetpar(fp, \"aux1prodmeso\", 0., true);\n aux1decay = fgetpar(fp, \"aux1decay\", 0.001, true);\n aux1decaymeso = fgetpar(fp, \"aux1decaymeso\", 0.1, true);\n aux1transport = fgetpar(fp, \"aux1transport\", 0.036, true);\n aux_cons = fgetpar(fp, \"aux_cons\", 0., true);\n aux_breakdown = fgetpar(fp, \"aux_breakdown\", 0., true);\n kaux1 = fgetpar(fp, \"kaux1\", 1, true);\n kap = fgetpar(fp, \"kap\", 1, true);\n leaf_tip_source = fgetpar(fp, \"leaf_tip_source\", 0.001, true);\n sam_efflux = fgetpar(fp, \"sam_efflux\", 0.0001, true);\n sam_auxin = fgetpar(fp, \"sam_auxin\", 10., true);\n sam_auxin_breakdown = fgetpar(fp, \"sam_auxin_breakdown\", 0, true);\n van3prod = fgetpar(fp, \"van3prod\", 0.002, true);\n van3autokat = fgetpar(fp, \"van3autokat\", 0.1, true);\n van3sat = fgetpar(fp, \"van3sat\", 10, true);\n k2van3 = fgetpar(fp, \"k2van3\", 0.3, true);\n dt = fgetpar(fp, \"dt\", 0.1, true);\n rd_dt = fgetpar(fp, \"rd_dt\", 1.0, true);\n movie = bgetpar(fp, \"movie\", false, true);\n nit = igetpar(fp, \"nit\", 100000, true);\n maxt = fgetpar(fp, \"maxt\", 1000., true);\n rseed = igetpar(fp, \"rseed\", -1, true);\n constituous_expansion_limit = igetpar(fp, \"constituous_expansion_limit\", 16, true);\n vessel_inh_level = fgetpar(fp, \"vessel_inh_level\", 1, true);\n vessel_expansion_rate = fgetpar(fp, \"vessel_expansion_rate\", 0.25, true);\n d = fgetpar(fp, \"d\", 0., true);\n e = fgetpar(fp, \"e\", 0., true);\n f = fgetpar(fp, \"f\", 0., true);\n c = fgetpar(fp, \"c\", 0., true);\n mu = fgetpar(fp, \"mu\", 0., true);\n nu = fgetpar(fp, \"nu\", 0., true);\n rho0 = fgetpar(fp, \"rho0\", 0., true);\n rho1 = fgetpar(fp, \"rho1\", 0., true);\n c0 = fgetpar(fp, \"c0\", 0., true);\n gamma = fgetpar(fp, \"gamma\", 0., true);\n eps = fgetpar(fp, \"eps\", 0., true);\n betaN = fgetpar(fp, \"betaN\", 0., true);\n gammaN = fgetpar(fp, \"gammaN\", 0., true);\n betaD = fgetpar(fp, \"betaD\", 0., true);\n gammaD = fgetpar(fp, \"gammaD\", 0., true);\n betaR = fgetpar(fp, \"betaR\", 0., true);\n gammaR = fgetpar(fp, \"gammaR\", 0., true);\n tau = fgetpar(fp, \"tau\", 0., true);\n kt = fgetpar(fp, \"kt\", 0., true);\n kc = fgetpar(fp, \"kc\", 0., true);\n krs = fgetpar(fp, \"krs\", 0., true);\n k = dgetparlist(fp, \"k\", 15, true);\n i1 = igetpar(fp, \"i1\", 0, true);\n i2 = fgetpar(fp, \"i2\", 0, true);\n b4 = bgetpar(fp, \"b4\", false, true);\n dir1 = sgetpar(fp, \"dir1\", \".\", true);\n if (strcmp(dir1, \".\"))\n MakeDir(dir1);\n dir2 = sgetpar(fp, \"dir2\", \".\", true);\n if (strcmp(dir2, \".\"))\n MakeDir(dir2);\n division_axis_type = igetpar(fp, \"division_axis_type\", 0, true);\n}\n\nconst char *sbool(const bool &p) {\n\n const char *true_str=\"true\";\n const char *false_str=\"false\";\n if (p)\n return true_str;\n else\n return false_str;\n}\n\nvoid Parameter::Write(ostream &os) const {\n\n\n if (arrowcolor) \n os << \" arrowcolor = \" << arrowcolor << endl;\n os << \" arrowsize = \" << arrowsize << endl;\n\n if (textcolor) \n os << \" textcolor = \" << textcolor << endl;\n os << \" cellnumsize = \" << cellnumsize << endl;\n os << \" nodenumsize = \" << nodenumsize << endl;\n os << \" node_mag = \" << node_mag << endl;\n os << \" outlinewidth = \" << outlinewidth << endl;\n\n if (cell_outline_color) \n os << \" cell_outline_color = \" << cell_outline_color << endl;\n os << \" resize_stride = \" << resize_stride << endl;\n os << \" export_interval = \" << export_interval << endl;\n\n if (export_fn_prefix) \n os << \" export_fn_prefix = \" << export_fn_prefix << endl;\n os << \" storage_stride = \" << storage_stride << endl;\n os << \" xml_storage_stride = \" << xml_storage_stride << endl;\n if (datadir) {\n QDir dataDir = QDir::home().relativeFilePath(datadir);\n os << \" datadir = \" << dataDir.dirName().toStdString() << endl;\n }\n else {\n os << \"datadir = .\" << endl;\n }\n os << \" T = \" << T << endl;\n os << \" lambda_length = \" << lambda_length << endl;\n os << \" yielding_threshold = \" << yielding_threshold << endl;\n os << \" lambda_celllength = \" << lambda_celllength << endl;\n os << \" target_length = \" << target_length << endl;\n os << \" cell_expansion_rate = \" << cell_expansion_rate << endl;\n os << \" cell_div_expansion_rate = \" << cell_div_expansion_rate << endl;\n os << \" auxin_dependent_growth = \" << sbool(auxin_dependent_growth) << endl;\n os << \" ode_accuracy = \" << ode_accuracy << endl;\n os << \" mc_stepsize = \" << mc_stepsize << endl;\n os << \" mc_cell_stepsize = \" << mc_cell_stepsize << endl;\n os << \" energy_threshold = \" << energy_threshold << endl;\n os << \" bend_lambda = \" << bend_lambda << endl;\n os << \" alignment_lambda = \" << alignment_lambda << endl;\n os << \" rel_cell_div_threshold = \" << rel_cell_div_threshold << endl;\n os << \" rel_perimeter_stiffness = \" << rel_perimeter_stiffness << endl;\n os << \" collapse_node_threshold = \" << collapse_node_threshold << endl;\n os << \" morphogen_div_threshold = \" << morphogen_div_threshold << endl;\n os << \" morphogen_expansion_threshold = \" << morphogen_expansion_threshold << endl;\n os << \" copy_wall = \" << sbool(copy_wall) << endl;\n os << \" source = \" << source << endl;\n os << \" D = \"<< D[0] << \", \" << D[1] << \", \" << D[2] << \", \" << D[3] << \", \" << D[4] << \", \" << D[5] << \", \" << D[6] << \", \" << D[7] << \", \" << D[8] << \", \" << D[9] << \", \" << D[10] << \", \" << D[11] << \", \" << D[12] << \", \" << D[13] << \", \" << D[14] << endl;\n os << \" initval = \"<< initval[0] << \", \" << initval[1] << \", \" << initval[2] << \", \" << initval[3] << \", \" << initval[4] << \", \" << initval[5] << \", \" << initval[6] << \", \" << initval[7] << \", \" << initval[8] << \", \" << initval[9] << \", \" << initval[10] << \", \" << initval[11] << \", \" << initval[12] << \", \" << initval[13] << \", \" << initval[14] << endl;\n os << \" k1 = \" << k1 << endl;\n os << \" k2 = \" << k2 << endl;\n os << \" r = \" << r << endl;\n os << \" kr = \" << kr << endl;\n os << \" km = \" << km << endl;\n os << \" Pi_tot = \" << Pi_tot << endl;\n os << \" transport = \" << transport << endl;\n os << \" ka = \" << ka << endl;\n os << \" pin_prod = \" << pin_prod << endl;\n os << \" pin_prod_in_epidermis = \" << pin_prod_in_epidermis << endl;\n os << \" pin_breakdown = \" << pin_breakdown << endl;\n os << \" pin_breakdown_internal = \" << pin_breakdown_internal << endl;\n os << \" aux1prod = \" << aux1prod << endl;\n os << \" aux1prodmeso = \" << aux1prodmeso << endl;\n os << \" aux1decay = \" << aux1decay << endl;\n os << \" aux1decaymeso = \" << aux1decaymeso << endl;\n os << \" aux1transport = \" << aux1transport << endl;\n os << \" aux_cons = \" << aux_cons << endl;\n os << \" aux_breakdown = \" << aux_breakdown << endl;\n os << \" kaux1 = \" << kaux1 << endl;\n os << \" kap = \" << kap << endl;\n os << \" leaf_tip_source = \" << leaf_tip_source << endl;\n os << \" sam_efflux = \" << sam_efflux << endl;\n os << \" sam_auxin = \" << sam_auxin << endl;\n os << \" sam_auxin_breakdown = \" << sam_auxin_breakdown << endl;\n os << \" van3prod = \" << van3prod << endl;\n os << \" van3autokat = \" << van3autokat << endl;\n os << \" van3sat = \" << van3sat << endl;\n os << \" k2van3 = \" << k2van3 << endl;\n os << \" dt = \" << dt << endl;\n os << \" rd_dt = \" << rd_dt << endl;\n os << \" movie = \" << sbool(movie) << endl;\n os << \" nit = \" << nit << endl;\n os << \" maxt = \" << maxt << endl;\n os << \" rseed = \" << rseed << endl;\n os << \" constituous_expansion_limit = \" << constituous_expansion_limit << endl;\n os << \" vessel_inh_level = \" << vessel_inh_level << endl;\n os << \" vessel_expansion_rate = \" << vessel_expansion_rate << endl;\n os << \" d = \" << d << endl;\n os << \" e = \" << e << endl;\n os << \" f = \" << f << endl;\n os << \" c = \" << c << endl;\n os << \" mu = \" << mu << endl;\n os << \" nu = \" << nu << endl;\n os << \" rho0 = \" << rho0 << endl;\n os << \" rho1 = \" << rho1 << endl;\n os << \" c0 = \" << c0 << endl;\n os << \" gamma = \" << gamma << endl;\n os << \" eps = \" << eps << endl;\n os << \" betaN = \" << betaN << endl;\n os << \" gammaN = \" << gammaN << endl;\n os << \" betaD = \" << betaD << endl;\n os << \" gammaD = \" << gammaD << endl;\n os << \" betaR = \" << betaR << endl;\n os << \" gammaR = \" << gammaR << endl;\n os << \" tau = \" << tau << endl;\n os << \" kt = \" << kt << endl;\n os << \" kc = \" << kc << endl;\n os << \" krs = \" << krs << endl;\n os << \" k = \"<< k[0] << \", \" << k[1] << \", \" << k[2] << \", \" << k[3] << \", \" << k[4] << \", \" << k[5] << \", \" << k[6] << \", \" << k[7] << \", \" << k[8] << \", \" << k[9] << \", \" << k[10] << \", \" << k[11] << \", \" << k[12] << \", \" << k[13] << \", \" << k[14] << endl;\n os << \" i1 = \" << i1 << endl;\n os << \" i2 = \" << i2 << endl;\n os << \" b4 = \" << sbool(b4) << endl;\n\n if (dir1) \n os << \" dir1 = \" << dir1 << endl;\n\n if (dir2) \n os << \" dir2 = \" << dir2 << endl;\n os << \" division_axis_type = \" << division_axis_type << endl;\n}\n\nvoid Parameter::XMLAdd(QDomDocument &doc, QDomElement &root) const {\n //xmlNode *xmlparameter = xmlNewChild(root, NULL, BAD_CAST \"parameter\", NULL);\n QDomElement xmlparameter = doc.createElement(\"parameter\");\n root.appendChild(xmlparameter);\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"arrowcolor\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n\n if (arrowcolor) \n text << arrowcolor;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"arrowsize\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << arrowsize;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"textcolor\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n\n if (textcolor) \n text << textcolor;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"cellnumsize\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << cellnumsize;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"nodenumsize\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << nodenumsize;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"node_mag\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << node_mag;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"outlinewidth\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << outlinewidth;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"cell_outline_color\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n\n if (cell_outline_color) \n text << cell_outline_color;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"resize_stride\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << resize_stride;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"export_interval\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << export_interval;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"export_fn_prefix\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n\n if (export_fn_prefix) \n text << export_fn_prefix;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"storage_stride\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << storage_stride;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"xml_storage_stride\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << xml_storage_stride;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"datadir\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n\n if (datadir) {\n QDir dataDir = QDir::home().relativeFilePath(datadir);\n text << dataDir.dirName().toStdString();\n }\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"T\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << T;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"lambda_length\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << lambda_length;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"yielding_threshold\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << yielding_threshold;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"lambda_celllength\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << lambda_celllength;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"target_length\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << target_length;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"cell_expansion_rate\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << cell_expansion_rate;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"cell_div_expansion_rate\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << cell_div_expansion_rate;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"auxin_dependent_growth\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\ntext << sbool(auxin_dependent_growth);\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"ode_accuracy\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << ode_accuracy;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"mc_stepsize\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << mc_stepsize;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"mc_cell_stepsize\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << mc_cell_stepsize;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"energy_threshold\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << energy_threshold;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"bend_lambda\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << bend_lambda;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"alignment_lambda\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << alignment_lambda;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"rel_cell_div_threshold\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << rel_cell_div_threshold;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"rel_perimeter_stiffness\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << rel_perimeter_stiffness;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"collapse_node_threshold\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << collapse_node_threshold;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"morphogen_div_threshold\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << morphogen_div_threshold;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"morphogen_expansion_threshold\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << morphogen_expansion_threshold;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"copy_wall\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\ntext << sbool(copy_wall);\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"source\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << source;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"D\" );\n xmlparameter.appendChild(xmlpar);\n QDomElement xmlvalarray = doc.createElement(\"valarray\");\n xmlpar.appendChild(xmlvalarray);\n {\n ostringstream text;\n text << D[0];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << D[1];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << D[2];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << D[3];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << D[4];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << D[5];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << D[6];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << D[7];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << D[8];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << D[9];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << D[10];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << D[11];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << D[12];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << D[13];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << D[14];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"initval\" );\n xmlparameter.appendChild(xmlpar);\n QDomElement xmlvalarray = doc.createElement(\"valarray\");\n xmlpar.appendChild(xmlvalarray);\n {\n ostringstream text;\n text << initval[0];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << initval[1];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << initval[2];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << initval[3];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << initval[4];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << initval[5];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << initval[6];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << initval[7];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << initval[8];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << initval[9];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << initval[10];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << initval[11];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << initval[12];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << initval[13];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << initval[14];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"k1\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << k1;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"k2\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << k2;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"r\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << r;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"kr\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << kr;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"km\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << km;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"Pi_tot\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << Pi_tot;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"transport\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << transport;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"ka\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << ka;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"pin_prod\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << pin_prod;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"pin_prod_in_epidermis\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << pin_prod_in_epidermis;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"pin_breakdown\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << pin_breakdown;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"pin_breakdown_internal\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << pin_breakdown_internal;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"aux1prod\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << aux1prod;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"aux1prodmeso\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << aux1prodmeso;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"aux1decay\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << aux1decay;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"aux1decaymeso\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << aux1decaymeso;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"aux1transport\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << aux1transport;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"aux_cons\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << aux_cons;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"aux_breakdown\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << aux_breakdown;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"kaux1\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << kaux1;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"kap\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << kap;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"leaf_tip_source\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << leaf_tip_source;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"sam_efflux\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << sam_efflux;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"sam_auxin\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << sam_auxin;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"sam_auxin_breakdown\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << sam_auxin_breakdown;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"van3prod\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << van3prod;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"van3autokat\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << van3autokat;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"van3sat\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << van3sat;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"k2van3\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << k2van3;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"dt\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << dt;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"rd_dt\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << rd_dt;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"movie\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\ntext << sbool(movie);\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"nit\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << nit;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"maxt\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << maxt;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"rseed\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << rseed;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"constituous_expansion_limit\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << constituous_expansion_limit;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"vessel_inh_level\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << vessel_inh_level;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"vessel_expansion_rate\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << vessel_expansion_rate;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"d\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << d;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"e\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << e;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"f\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << f;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"c\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << c;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"mu\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << mu;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"nu\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << nu;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"rho0\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << rho0;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"rho1\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << rho1;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"c0\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << c0;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"gamma\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << gamma;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"eps\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << eps;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"betaN\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << betaN;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"gammaN\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << gammaN;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"betaD\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << betaD;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"gammaD\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << gammaD;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"betaR\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << betaR;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"gammaR\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << gammaR;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"tau\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << tau;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"kt\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << kt;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"kc\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << kc;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"krs\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << krs;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"k\" );\n xmlparameter.appendChild(xmlpar);\n QDomElement xmlvalarray = doc.createElement(\"valarray\");\n xmlpar.appendChild(xmlvalarray);\n {\n ostringstream text;\n text << k[0];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << k[1];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << k[2];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << k[3];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << k[4];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << k[5];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << k[6];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << k[7];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << k[8];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << k[9];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << k[10];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << k[11];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << k[12];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << k[13];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n {\n ostringstream text;\n text << k[14];\n QDomElement xmlval = doc.createElement(\"val\");\n xmlval.setAttribute(\"v\",text.str().c_str());\n xmlvalarray.appendChild(xmlval);\n }\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"i1\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << i1;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"i2\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << i2;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"b4\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\ntext << sbool(b4);\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"dir1\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n\n if (dir1) \n text << dir1;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"dir2\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n\n if (dir2) \n text << dir2;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n{\n QDomElement xmlpar = doc.createElement(\"par\");\n xmlpar.setAttribute(\"name\",\"division_axis_type\" );\n xmlparameter.appendChild(xmlpar);\n ostringstream text;\n text << division_axis_type;\n xmlpar.setAttribute(\"val\",text.str().c_str());\n}\n}\nvoid Parameter::AssignValToPar(const char *namec, const char *valc) {\n QLocale standardlocale(QLocale::C);\n bool ok;\nif (!strcmp(namec, \"arrowcolor\")) {\n if (arrowcolor) { free(arrowcolor); }\n arrowcolor=strdup(valc);\n}\nif (!strcmp(namec, \"arrowsize\")) {\n arrowsize = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'arrowsize' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"textcolor\")) {\n if (textcolor) { free(textcolor); }\n textcolor=strdup(valc);\n}\nif (!strcmp(namec, \"cellnumsize\")) {\n cellnumsize = standardlocale.toInt(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to integer while reading parameter 'cellnumsize' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"nodenumsize\")) {\n nodenumsize = standardlocale.toInt(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to integer while reading parameter 'nodenumsize' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"node_mag\")) {\n node_mag = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'node_mag' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"outlinewidth\")) {\n outlinewidth = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'outlinewidth' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"cell_outline_color\")) {\n if (cell_outline_color) { free(cell_outline_color); }\n cell_outline_color=strdup(valc);\n}\nif (!strcmp(namec, \"resize_stride\")) {\n resize_stride = standardlocale.toInt(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to integer while reading parameter 'resize_stride' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"export_interval\")) {\n export_interval = standardlocale.toInt(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to integer while reading parameter 'export_interval' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"export_fn_prefix\")) {\n if (export_fn_prefix) { free(export_fn_prefix); }\n export_fn_prefix=strdup(valc);\n}\nif (!strcmp(namec, \"storage_stride\")) {\n storage_stride = standardlocale.toInt(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to integer while reading parameter 'storage_stride' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"xml_storage_stride\")) {\n xml_storage_stride = standardlocale.toInt(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to integer while reading parameter 'xml_storage_stride' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"datadir\")) {\n if (datadir) { free(datadir); }\n datadir=strdup(valc);\n datadir = AppendHomeDirIfPathRelative(datadir);\n}\nif (!strcmp(namec, \"T\")) {\n T = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'T' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"lambda_length\")) {\n lambda_length = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'lambda_length' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"yielding_threshold\")) {\n yielding_threshold = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'yielding_threshold' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"lambda_celllength\")) {\n lambda_celllength = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'lambda_celllength' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"target_length\")) {\n target_length = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'target_length' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"cell_expansion_rate\")) {\n cell_expansion_rate = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'cell_expansion_rate' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"cell_div_expansion_rate\")) {\n cell_div_expansion_rate = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'cell_div_expansion_rate' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"auxin_dependent_growth\")) {\nauxin_dependent_growth = strtobool(valc);\n}\nif (!strcmp(namec, \"ode_accuracy\")) {\n ode_accuracy = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'ode_accuracy' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"mc_stepsize\")) {\n mc_stepsize = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'mc_stepsize' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"mc_cell_stepsize\")) {\n mc_cell_stepsize = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'mc_cell_stepsize' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"energy_threshold\")) {\n energy_threshold = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'energy_threshold' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"bend_lambda\")) {\n bend_lambda = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'bend_lambda' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"alignment_lambda\")) {\n alignment_lambda = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'alignment_lambda' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"rel_cell_div_threshold\")) {\n rel_cell_div_threshold = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'rel_cell_div_threshold' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"rel_perimeter_stiffness\")) {\n rel_perimeter_stiffness = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'rel_perimeter_stiffness' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"collapse_node_threshold\")) {\n collapse_node_threshold = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'collapse_node_threshold' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"morphogen_div_threshold\")) {\n morphogen_div_threshold = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'morphogen_div_threshold' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"morphogen_expansion_threshold\")) {\n morphogen_expansion_threshold = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'morphogen_expansion_threshold' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"copy_wall\")) {\ncopy_wall = strtobool(valc);\n}\nif (!strcmp(namec, \"source\")) {\n source = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'source' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"k1\")) {\n k1 = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'k1' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"k2\")) {\n k2 = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'k2' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"r\")) {\n r = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'r' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"kr\")) {\n kr = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'kr' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"km\")) {\n km = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'km' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"Pi_tot\")) {\n Pi_tot = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'Pi_tot' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"transport\")) {\n transport = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'transport' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"ka\")) {\n ka = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'ka' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"pin_prod\")) {\n pin_prod = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'pin_prod' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"pin_prod_in_epidermis\")) {\n pin_prod_in_epidermis = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'pin_prod_in_epidermis' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"pin_breakdown\")) {\n pin_breakdown = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'pin_breakdown' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"pin_breakdown_internal\")) {\n pin_breakdown_internal = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'pin_breakdown_internal' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"aux1prod\")) {\n aux1prod = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'aux1prod' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"aux1prodmeso\")) {\n aux1prodmeso = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'aux1prodmeso' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"aux1decay\")) {\n aux1decay = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'aux1decay' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"aux1decaymeso\")) {\n aux1decaymeso = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'aux1decaymeso' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"aux1transport\")) {\n aux1transport = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'aux1transport' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"aux_cons\")) {\n aux_cons = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'aux_cons' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"aux_breakdown\")) {\n aux_breakdown = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'aux_breakdown' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"kaux1\")) {\n kaux1 = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'kaux1' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"kap\")) {\n kap = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'kap' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"leaf_tip_source\")) {\n leaf_tip_source = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'leaf_tip_source' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"sam_efflux\")) {\n sam_efflux = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'sam_efflux' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"sam_auxin\")) {\n sam_auxin = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'sam_auxin' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"sam_auxin_breakdown\")) {\n sam_auxin_breakdown = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'sam_auxin_breakdown' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"van3prod\")) {\n van3prod = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'van3prod' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"van3autokat\")) {\n van3autokat = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'van3autokat' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"van3sat\")) {\n van3sat = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'van3sat' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"k2van3\")) {\n k2van3 = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'k2van3' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"dt\")) {\n dt = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'dt' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"rd_dt\")) {\n rd_dt = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'rd_dt' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"movie\")) {\nmovie = strtobool(valc);\n}\nif (!strcmp(namec, \"nit\")) {\n nit = standardlocale.toInt(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to integer while reading parameter 'nit' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"maxt\")) {\n maxt = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'maxt' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"rseed\")) {\n rseed = standardlocale.toInt(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to integer while reading parameter 'rseed' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"constituous_expansion_limit\")) {\n constituous_expansion_limit = standardlocale.toInt(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to integer while reading parameter 'constituous_expansion_limit' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"vessel_inh_level\")) {\n vessel_inh_level = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'vessel_inh_level' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"vessel_expansion_rate\")) {\n vessel_expansion_rate = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'vessel_expansion_rate' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"d\")) {\n d = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'd' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"e\")) {\n e = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'e' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"f\")) {\n f = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'f' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"c\")) {\n c = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'c' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"mu\")) {\n mu = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'mu' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"nu\")) {\n nu = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'nu' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"rho0\")) {\n rho0 = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'rho0' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"rho1\")) {\n rho1 = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'rho1' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"c0\")) {\n c0 = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'c0' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"gamma\")) {\n gamma = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'gamma' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"eps\")) {\n eps = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'eps' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"betaN\")) {\n betaN = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'betaN' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"gammaN\")) {\n gammaN = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'gammaN' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"betaD\")) {\n betaD = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'betaD' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"gammaD\")) {\n gammaD = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'gammaD' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"betaR\")) {\n betaR = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'betaR' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"gammaR\")) {\n gammaR = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'gammaR' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"tau\")) {\n tau = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'tau' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"kt\")) {\n kt = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'kt' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"kc\")) {\n kc = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'kc' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"krs\")) {\n krs = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'krs' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"i1\")) {\n i1 = standardlocale.toInt(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to integer while reading parameter 'i1' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"i2\")) {\n i2 = standardlocale.toDouble(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to double while reading parameter 'i2' from XML file.\",valc); }\n}\nif (!strcmp(namec, \"b4\")) {\nb4 = strtobool(valc);\n}\nif (!strcmp(namec, \"dir1\")) {\n if (dir1) { free(dir1); }\n dir1=strdup(valc);\n}\nif (!strcmp(namec, \"dir2\")) {\n if (dir2) { free(dir2); }\n dir2=strdup(valc);\n}\nif (!strcmp(namec, \"division_axis_type\")) {\n division_axis_type = standardlocale.toInt(valc, &ok);\n if (!ok) { MyWarning::error(\"Read error: cannot convert string \\\"%s\\\" to integer while reading parameter 'division_axis_type' from XML file.\",valc); }\n}\n}\nvoid Parameter::AssignValArrayToPar(const char *namec, vector valarray) {\nif (!strcmp(namec, \"D\")) {\n int i=0;\n vector::const_iterator v=valarray.begin();\n while (v!=valarray.end() && i <= 14 ) {\n D[i++]=*(v++);\n }\n}\nif (!strcmp(namec, \"initval\")) {\n int i=0;\n vector::const_iterator v=valarray.begin();\n while (v!=valarray.end() && i <= 14 ) {\n initval[i++]=*(v++);\n }\n}\nif (!strcmp(namec, \"k\")) {\n int i=0;\n vector::const_iterator v=valarray.begin();\n while (v!=valarray.end() && i <= 14 ) {\n k[i++]=*(v++);\n }\n}\n}\n\nostream &operator<<(ostream &os, Parameter &p) {\n p.Write(os);\n return os;\n}\n\n +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/src/Library/parameter.cpp b/src/Library/parameter.cpp +--- a/src/Library/parameter.cpp (revision c9763b319a64e0a25643e4681bffbcbc9a263036) ++++ b/src/Library/parameter.cpp (date 1746539795121) +@@ -141,6 +141,9 @@ + k2van3 = 0.3; + dt = 0.1; + rd_dt = 1.0; ++ elastic_modulus = 50.; ++ elastic_limit = DEFAULT_ELASTIC_LIMIT; ++ compatibility_level = 0xFFFF; + movie = false; + nit = 100000; + maxt = 1000.; +@@ -190,49 +193,48 @@ + b4 = false; + dir1 = strdup("."); + dir2 = strdup("."); +- division_axis_type = 0; + } + + Parameter::~Parameter() { +- ++ + // destruct parameter object + // free string parameter + CleanUp(); + } + + void Parameter::CleanUp(void) { +- if (arrowcolor) ++ if (arrowcolor) + free(arrowcolor); +- if (textcolor) ++ if (textcolor) + free(textcolor); +- if (cell_outline_color) ++ if (cell_outline_color) + free(cell_outline_color); +- if (export_fn_prefix) ++ if (export_fn_prefix) + free(export_fn_prefix); +- if (datadir) ++ if (datadir) + free(datadir); +- if (D) ++ if (D) + free(D); +- if (initval) ++ if (initval) + free(initval); +- if (k) ++ if (k) + free(k); +- if (dir1) ++ if (dir1) + free(dir1); +- if (dir2) ++ if (dir2) + free(dir2); + + } + + void Parameter::Read(const char *filename) { +- ++ + static bool ReadP=false; + + if (ReadP) { + + //throw "Run Time Error in parameter.cpp: Please Read parameter file only once!!"; + CleanUp(); +- ++ + } else + ReadP=true; + +@@ -310,8 +312,11 @@ + k2van3 = fgetpar(fp, "k2van3", 0.3, true); + dt = fgetpar(fp, "dt", 0.1, true); + rd_dt = fgetpar(fp, "rd_dt", 1.0, true); ++ elastic_limit = fgetpar(fp, "elastic_limit", DEFAULT_ELASTIC_LIMIT, true); ++ elastic_modulus = fgetpar(fp, "elastic_modulus", 50., true); + movie = bgetpar(fp, "movie", false, true); + nit = igetpar(fp, "nit", 100000, true); ++ compatibility_level = igetpar(fp, "compatibility_level", 0xFFFF, true); + maxt = fgetpar(fp, "maxt", 1000., true); + rseed = igetpar(fp, "rseed", -1, true); + constituous_expansion_limit = igetpar(fp, "constituous_expansion_limit", 16, true); +@@ -340,7 +345,7 @@ + krs = fgetpar(fp, "krs", 0., true); + k = dgetparlist(fp, "k", 15, true); + i1 = igetpar(fp, "i1", 0, true); +- i2 = fgetpar(fp, "i2", 0, true); ++ i2 = igetpar(fp, "i2", 0, true); + b4 = bgetpar(fp, "b4", false, true); + dir1 = sgetpar(fp, "dir1", ".", true); + if (strcmp(dir1, ".")) +@@ -348,7 +353,6 @@ + dir2 = sgetpar(fp, "dir2", ".", true); + if (strcmp(dir2, ".")) + MakeDir(dir2); +- division_axis_type = igetpar(fp, "division_axis_type", 0, true); + } + + const char *sbool(const bool &p) { +@@ -364,23 +368,23 @@ + void Parameter::Write(ostream &os) const { + + +- if (arrowcolor) ++ if (arrowcolor) + os << " arrowcolor = " << arrowcolor << endl; + os << " arrowsize = " << arrowsize << endl; + +- if (textcolor) ++ if (textcolor) + os << " textcolor = " << textcolor << endl; + os << " cellnumsize = " << cellnumsize << endl; + os << " nodenumsize = " << nodenumsize << endl; + os << " node_mag = " << node_mag << endl; + os << " outlinewidth = " << outlinewidth << endl; + +- if (cell_outline_color) ++ if (cell_outline_color) + os << " cell_outline_color = " << cell_outline_color << endl; + os << " resize_stride = " << resize_stride << endl; + os << " export_interval = " << export_interval << endl; + +- if (export_fn_prefix) ++ if (export_fn_prefix) + os << " export_fn_prefix = " << export_fn_prefix << endl; + os << " storage_stride = " << storage_stride << endl; + os << " xml_storage_stride = " << xml_storage_stride << endl; +@@ -445,8 +449,11 @@ + os << " k2van3 = " << k2van3 << endl; + os << " dt = " << dt << endl; + os << " rd_dt = " << rd_dt << endl; ++ os << " elastic_limit = " << elastic_limit << endl; ++ os << " elastic_modulus = " << elastic_modulus << endl; + os << " movie = " << sbool(movie) << endl; + os << " nit = " << nit << endl; ++ os << " compatibility_level = " << compatibility_level << endl; + os << " maxt = " << maxt << endl; + os << " rseed = " << rseed << endl; + os << " constituous_expansion_limit = " << constituous_expansion_limit << endl; +@@ -478,12 +485,11 @@ + os << " i2 = " << i2 << endl; + os << " b4 = " << sbool(b4) << endl; + +- if (dir1) ++ if (dir1) + os << " dir1 = " << dir1 << endl; + +- if (dir2) ++ if (dir2) + os << " dir2 = " << dir2 << endl; +- os << " division_axis_type = " << division_axis_type << endl; + } + + void Parameter::XMLAdd(QDomDocument &doc, QDomElement &root) const { +@@ -496,7 +502,7 @@ + xmlparameter.appendChild(xmlpar); + ostringstream text; + +- if (arrowcolor) ++ if (arrowcolor) + text << arrowcolor; + xmlpar.setAttribute("val",text.str().c_str()); + } +@@ -514,7 +520,7 @@ + xmlparameter.appendChild(xmlpar); + ostringstream text; + +- if (textcolor) ++ if (textcolor) + text << textcolor; + xmlpar.setAttribute("val",text.str().c_str()); + } +@@ -556,7 +562,7 @@ + xmlparameter.appendChild(xmlpar); + ostringstream text; + +- if (cell_outline_color) ++ if (cell_outline_color) + text << cell_outline_color; + xmlpar.setAttribute("val",text.str().c_str()); + } +@@ -582,7 +588,7 @@ + xmlparameter.appendChild(xmlpar); + ostringstream text; + +- if (export_fn_prefix) ++ if (export_fn_prefix) + text << export_fn_prefix; + xmlpar.setAttribute("val",text.str().c_str()); + } +@@ -1253,6 +1259,22 @@ + ostringstream text; + text << rd_dt; + xmlpar.setAttribute("val",text.str().c_str()); ++} ++{ ++ QDomElement xmlpar = doc.createElement("par"); ++ xmlpar.setAttribute("name","elastic_limit" ); ++ xmlparameter.appendChild(xmlpar); ++ ostringstream text; ++ text << elastic_limit; ++ xmlpar.setAttribute("val",text.str().c_str()); ++} ++{ ++ QDomElement xmlpar = doc.createElement("par"); ++ xmlpar.setAttribute("name","elastic_modulus" ); ++ xmlparameter.appendChild(xmlpar); ++ ostringstream text; ++ text << elastic_modulus; ++ xmlpar.setAttribute("val",text.str().c_str()); + } + { + QDomElement xmlpar = doc.createElement("par"); +@@ -1269,6 +1291,14 @@ + ostringstream text; + text << nit; + xmlpar.setAttribute("val",text.str().c_str()); ++} ++{ ++ QDomElement xmlpar = doc.createElement("par"); ++ xmlpar.setAttribute("name","compatibility_level" ); ++ xmlparameter.appendChild(xmlpar); ++ ostringstream text; ++ text << compatibility_level; ++ xmlpar.setAttribute("val",text.str().c_str()); + } + { + QDomElement xmlpar = doc.createElement("par"); +@@ -1620,7 +1650,7 @@ + xmlparameter.appendChild(xmlpar); + ostringstream text; + +- if (dir1) ++ if (dir1) + text << dir1; + xmlpar.setAttribute("val",text.str().c_str()); + } +@@ -1630,17 +1660,9 @@ + xmlparameter.appendChild(xmlpar); + ostringstream text; + +- if (dir2) ++ if (dir2) + text << dir2; + xmlpar.setAttribute("val",text.str().c_str()); +-} +-{ +- QDomElement xmlpar = doc.createElement("par"); +- xmlpar.setAttribute("name","division_axis_type" ); +- xmlparameter.appendChild(xmlpar); +- ostringstream text; +- text << division_axis_type; +- xmlpar.setAttribute("val",text.str().c_str()); + } + } + void Parameter::AssignValToPar(const char *namec, const char *valc) { +@@ -1909,6 +1931,10 @@ + rd_dt = standardlocale.toDouble(valc, &ok); + if (!ok) { MyWarning::error("Read error: cannot convert string \"%s\" to double while reading parameter 'rd_dt' from XML file.",valc); } + } ++if (!strcmp(namec, "elastic_limit")) { ++ elastic_limit = standardlocale.toDouble(valc, &ok); ++ if (!ok) { MyWarning::error("Read error: cannot convert string \"%s\" to double while reading parameter 'elastic_limit' from XML file.",valc); } ++} + if (!strcmp(namec, "movie")) { + movie = strtobool(valc); + } +@@ -1916,6 +1942,10 @@ + nit = standardlocale.toInt(valc, &ok); + if (!ok) { MyWarning::error("Read error: cannot convert string \"%s\" to integer while reading parameter 'nit' from XML file.",valc); } + } ++if (!strcmp(namec, "compatibility_level")) { ++ compatibility_level = standardlocale.toInt(valc, &ok); ++ if (!ok) { MyWarning::error("Read error: cannot convert string \"%s\" to integer while reading parameter 'compatibility_level' from XML file.",valc); } ++} + if (!strcmp(namec, "maxt")) { + maxt = standardlocale.toDouble(valc, &ok); + if (!ok) { MyWarning::error("Read error: cannot convert string \"%s\" to double while reading parameter 'maxt' from XML file.",valc); } +@@ -2025,8 +2055,8 @@ + if (!ok) { MyWarning::error("Read error: cannot convert string \"%s\" to integer while reading parameter 'i1' from XML file.",valc); } + } + if (!strcmp(namec, "i2")) { +- i2 = standardlocale.toDouble(valc, &ok); +- if (!ok) { MyWarning::error("Read error: cannot convert string \"%s\" to double while reading parameter 'i2' from XML file.",valc); } ++ i2 = standardlocale.toInt(valc, &ok); ++ if (!ok) { MyWarning::error("Read error: cannot convert string \"%s\" to integer while reading parameter 'i2' from XML file.",valc); } + } + if (!strcmp(namec, "b4")) { + b4 = strtobool(valc); +@@ -2039,10 +2069,6 @@ + if (dir2) { free(dir2); } + dir2=strdup(valc); + } +-if (!strcmp(namec, "division_axis_type")) { +- division_axis_type = standardlocale.toInt(valc, &ok); +- if (!ok) { MyWarning::error("Read error: cannot convert string \"%s\" to integer while reading parameter 'division_axis_type' from XML file.",valc); } +-} + } + void Parameter::AssignValArrayToPar(const char *namec, vector valarray) { + if (!strcmp(namec, "D")) { +Index: src/Library/parameter.h +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP +<+>/*\n *\n * $Id$\n *\n * This file is part of the Virtual Leaf.\n *\n * VirtualLeaf is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * VirtualLeaf is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with the Virtual Leaf. If not, see .\n *\n * Copyright 2010 Roeland Merks.\n *\n */\n\n// WARNING: This file is automatically generated by make_parameter_source.pl. Do not edit.\n// Do not edit. All edits will be discarded.\n\n#ifndef _PARAMETER_H_\n#define _PARAMETER_H_\n#include \"vector.h\"\n#include \n\n//#include \n//#include \n#include \n\n class Parameter {\n\t\t\n public: \n Parameter();\n ~Parameter();\n void CleanUp(void);\n void Read(const char *filename);\n void Write(ostream &os) const;\n void XMLAdd(QDomDocument &doc, QDomElement &root) const;\n void XMLRead(QDomElement &root);\n void AssignValToPar(const char *namec, const char *valc);\n void AssignValArrayToPar(const char *namec, vector valarray);\n char * arrowcolor;\n double arrowsize;\n char * textcolor;\n int cellnumsize;\n int nodenumsize;\n double node_mag;\n double outlinewidth;\n char * cell_outline_color;\n int resize_stride;\n int export_interval;\n char * export_fn_prefix;\n int storage_stride;\n int xml_storage_stride;\n char * datadir;\n double T;\n double lambda_length;\n double yielding_threshold;\n double lambda_celllength;\n double target_length;\n double cell_expansion_rate;\n double cell_div_expansion_rate;\n bool auxin_dependent_growth;\n double ode_accuracy;\n double mc_stepsize;\n double mc_cell_stepsize;\n double energy_threshold;\n double bend_lambda;\n double alignment_lambda;\n double rel_cell_div_threshold;\n double rel_perimeter_stiffness;\n double collapse_node_threshold;\n double morphogen_div_threshold;\n double morphogen_expansion_threshold;\n bool copy_wall;\n double source;\n double * D;\n double * initval;\n double k1;\n double k2;\n double r;\n double kr;\n double km;\n double Pi_tot;\n double transport;\n double ka;\n double pin_prod;\n double pin_prod_in_epidermis;\n double pin_breakdown;\n double pin_breakdown_internal;\n double aux1prod;\n double aux1prodmeso;\n double aux1decay;\n double aux1decaymeso;\n double aux1transport;\n double aux_cons;\n double aux_breakdown;\n double kaux1;\n double kap;\n double leaf_tip_source;\n double sam_efflux;\n double sam_auxin;\n double sam_auxin_breakdown;\n double van3prod;\n double van3autokat;\n double van3sat;\n double k2van3;\n double dt;\n double rd_dt;\n bool movie;\n int nit;\n double maxt;\n int rseed;\n int constituous_expansion_limit;\n double vessel_inh_level;\n double vessel_expansion_rate;\n double d;\n double e;\n double f;\n double c;\n double mu;\n double nu;\n double rho0;\n double rho1;\n double c0;\n double gamma;\n double eps;\n double betaN;\n double gammaN;\n double betaD;\n double gammaD;\n double betaR;\n double gammaR;\n double tau;\n double kt;\n double kc;\n double krs;\n double * k;\n int i1;\n double i2;\n bool b4;\n char * dir1;\n char * dir2;\n int division_axis_type;\n private:\n };\n\n ostream &operator<<(ostream &os, Parameter &p);\n const char *sbool(const bool &p);\n\n\n#endif\n +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/src/Library/parameter.h b/src/Library/parameter.h +--- a/src/Library/parameter.h (revision c9763b319a64e0a25643e4681bffbcbc9a263036) ++++ b/src/Library/parameter.h (date 1746539795130) +@@ -29,13 +29,15 @@ + #include "vector.h" + #include + ++#define DEFAULT_ELASTIC_LIMIT 1.15 ++ + //#include + //#include + #include + + class Parameter { +- +- public: ++ ++ public: + Parameter(); + ~Parameter(); + void CleanUp(void); +@@ -113,6 +115,9 @@ + double k2van3; + double dt; + double rd_dt; ++ double elastic_modulus; ++ double elastic_limit; ++ int compatibility_level; + bool movie; + int nit; + double maxt; +@@ -143,11 +148,10 @@ + double krs; + double * k; + int i1; +- double i2; ++ int i2; + bool b4; + char * dir1; + char * dir2; +- int division_axis_type; + private: + }; + +Index: data/leaves/Cambium_Lebovka.xml +=================================================================== +diff --git a/data/leaves/Cambium_Lebovka.xml b/data/leaves/Cambium_Lebovka.xml +deleted file mode 100644 +--- a/data/leaves/Cambium_Lebovka.xml (revision c9763b319a64e0a25643e4681bffbcbc9a263036) ++++ /dev/null (revision c9763b319a64e0a25643e4681bffbcbc9a263036) +@@ -1,10776 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +Index: data/leaves/Cambium_Rami.xml +=================================================================== +diff --git a/data/leaves/Cambium_Rami.xml b/data/leaves/Cambium_Rami.xml +deleted file mode 100644 +--- a/data/leaves/Cambium_Rami.xml (revision c9763b319a64e0a25643e4681bffbcbc9a263036) ++++ /dev/null (revision c9763b319a64e0a25643e4681bffbcbc9a263036) +@@ -1,2417 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- diff --git a/.idea/shelf/Uncommitted_changes_before_Update_at_13_05_2025_13_42__Changes_.xml b/.idea/shelf/Uncommitted_changes_before_Update_at_13_05_2025_13_42__Changes_.xml new file mode 100644 index 00000000..da735f0c --- /dev/null +++ b/.idea/shelf/Uncommitted_changes_before_Update_at_13_05_2025_13_42__Changes_.xml @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..c8397c94 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 00000000..3b1ba065 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,336 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + "lastFilter": { + "state": "OPEN", + "assignee": "regiroc" + } +} + { + "selectedUrlAndAccountId": { + "url": "https://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0@github.com/regiroc/VirtualLeaf2021.git", + "accountId": "8105f130-6909-4c7e-9180-03453d9f651f" + } +} + + + { + "customColor": "", + "associatedIndex": 8 +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1744195022159 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Change_XML.py b/Change_XML.py index 68356a10..6f5b3271 100644 --- a/Change_XML.py +++ b/Change_XML.py @@ -522,4 +522,4 @@ def angle_about_center(node): # ── housekeeping and save ──────────────────────────────────────────────── objectify.deannotate(doc.root, cleanup_namespaces=True) etree.indent(doc.tree, space=" ") -doc.save(output_xml) +doc.save(output_xml) \ No newline at end of file diff --git a/Creating Cambium XML.py b/Creating Cambium XML.py new file mode 100644 index 00000000..891db5d9 --- /dev/null +++ b/Creating Cambium XML.py @@ -0,0 +1,566 @@ +import math +import numpy as np +import xml.etree.ElementTree as ET +import xml.dom.minidom as minidom +from datetime import datetime + + +def generer_structure_trois_cercles(nom_fichier_sortie="structure_trois_cercles.xml", + fichier_structure_vierge="structure_vierge.xml", + rayons=[100, 150, 250], + nb_cellules_anneau1=12, + nb_cellules_anneau2=15): + """ + Génère un fichier XML avec une structure de tissu composée de trois cercles concentriques + et deux couronnes de cellules, en important les paramètres du fichier structure_vierge.xml + """ + # Importer les paramètres du fichier structure_vierge.xml + try: + tree_vierge = ET.parse(fichier_structure_vierge) + root_vierge = tree_vierge.getroot() + parametres = root_vierge.find("parameter") + except Exception as e: + print(f"Erreur lors de l'importation des paramètres: {e}") + parametres = None + + # Création de la racine du document XML + root = ET.Element("leaf") + root.set("name", "structure_trois_cercles") + root.set("date", datetime.now().strftime("%Y-%m-%d")) + root.set("simtime", "0") + + # Ajout de la section paramètres importée + if parametres is not None: + root.append(parametres) + else: + print("Utilisation de paramètres par défaut") + parametres_elem = ET.SubElement(root, "parameter") + # Ajouter des paramètres par défaut si nécessaire + + # Calcul des positions des nœuds + nodes = [] + node_index = 0 + R1, R2, R3 = rayons + + # Génération des nœuds sur le cercle intérieur (R1) + R1_nodes = [] + for i in range(nb_cellules_anneau1): + angle = i * (2 * math.pi / nb_cellules_anneau1) + x = R1 * math.cos(angle) + y = R1 * math.sin(angle) + nodes.append({ + "nr": node_index, + "x": x, + "y": y, + "radius": R1, + "angle": angle, + "special_tag": "special" # Ajout du tag spécial à tous les nœuds + }) + R1_nodes.append(node_index) + node_index += 1 + + # Génération des nœuds sur le cercle intermédiaire (R2) + # Création d'un ensemble combiné de tous les angles nécessaires sur R2 + R2_angles = set() + + # Ajouter les angles pour le premier anneau (important: correspondance avec R1) + for i in range(nb_cellules_anneau1): + angle = i * (2 * math.pi / nb_cellules_anneau1) + R2_angles.add(angle) + + # Ajouter les angles pour le second anneau (correspondance avec R3) + for i in range(nb_cellules_anneau2): + angle = i * (2 * math.pi / nb_cellules_anneau2) + R2_angles.add(angle) + + # Convertir en liste et trier + R2_angles = sorted(list(R2_angles)) + + # Créer les nœuds sur le cercle intermédiaire + R2_nodes_start_idx = node_index + R2_nodes = [] + for angle in R2_angles: + x = R2 * math.cos(angle) + y = R2 * math.sin(angle) + nodes.append({ + "nr": node_index, + "x": x, + "y": y, + "radius": R2, + "angle": angle, + "special_tag": "special" # Ajout du tag spécial à tous les nœuds + }) + R2_nodes.append(node_index) + node_index += 1 + + # Génération des nœuds sur le cercle extérieur (R3) + R3_nodes_start_idx = node_index + R3_nodes = [] + for i in range(nb_cellules_anneau2): + angle = i * (2 * math.pi / nb_cellules_anneau2) + x = R3 * math.cos(angle) + y = R3 * math.sin(angle) + nodes.append({ + "nr": node_index, + "x": x, + "y": y, + "radius": R3, + "angle": angle, + "boundary": True, # Nœuds du cercle extérieur sont des nœuds de frontière + "special_tag": "special" # Ajout du tag spécial à tous les nœuds + }) + R3_nodes.append(node_index) + node_index += 1 + + # Création de la section nodes + nodes_elem = ET.SubElement(root, "nodes") + nodes_elem.set("n", str(len(nodes))) + nodes_elem.set("target_length", "2.5") + + for node in nodes: + node_elem = ET.SubElement(nodes_elem, "node") + node_elem.set("nr", str(node["nr"])) + node_elem.set("x", str(node["x"])) + node_elem.set("y", str(node["y"])) + node_elem.set("sam", "false") + node_elem.set("boundary", "true" if node.get("boundary", False) else "false") + node_elem.set("fixed", "false") + # Ajout du tag spécial dans le XML + node_elem.set("special_tag", node["special_tag"]) + + # Création des cellules + cells = [] + cell_index = 0 + + # Fonction pour trouver le nœud avec l'angle le plus proche + def trouver_meilleur_noeud(angle_ref, noeuds_cercle): + meilleur_noeud = None + meilleure_diff = float('inf') + + for idx in noeuds_cercle: + angle_noeud = nodes[idx]["angle"] + # Calcul de la différence d'angle en tenant compte du rebouclage + diff = min(abs(angle_noeud - angle_ref), + 2*math.pi - abs(angle_noeud - angle_ref)) + + if diff < meilleure_diff: + meilleure_diff = diff + meilleur_noeud = idx + + return meilleur_noeud + + # Premier anneau - nb_cellules_anneau1 cellules + for k in range(nb_cellules_anneau1): + # Nœuds du cercle intérieur pour cette cellule + n1 = R1_nodes[k] + n2 = R1_nodes[(k + 1) % nb_cellules_anneau1] + angle1 = nodes[n1]["angle"] + angle2 = nodes[n2]["angle"] + + # Trouver les nœuds de R2 qui sont entre ces deux angles + r2_nodes_for_cell = [] + + # Ajouter le nœud aligné avec angle1 + r2_node_current = trouver_meilleur_noeud(angle1, R2_nodes) + r2_nodes_for_cell.append(r2_node_current) + + # Trouver tous les nœuds intermédiaires de R2 entre angle1 et angle2 + for r2_node in R2_nodes: + angle_node = nodes[r2_node]["angle"] + + # Gérer le cas où on passe par 0/2π + if angle2 > angle1: + # Cas simple: on vérifie si l'angle est entre angle1 et angle2 + if angle1 < angle_node < angle2 and r2_node != r2_node_current: + r2_nodes_for_cell.append(r2_node) + else: + # Cas où on passe par 0/2π: l'angle doit être soit > angle1, soit < angle2 + if (angle_node > angle1 or angle_node < angle2) and r2_node != r2_node_current: + r2_nodes_for_cell.append(r2_node) + + # Ajouter le nœud aligné avec angle2 s'il n'est pas déjà dans la liste + r2_node_next = trouver_meilleur_noeud(angle2, R2_nodes) + if r2_node_next not in r2_nodes_for_cell: + r2_nodes_for_cell.append(r2_node_next) + + # Trier les nœuds R2 par angle croissant + r2_nodes_for_cell.sort(key=lambda idx: nodes[idx]["angle"]) + + # Si on passe par 0/2π, il faut réarranger les nœuds pour avoir une séquence correcte + if angle2 < angle1: + # Trouver l'index du plus grand angle + max_idx = 0 + max_angle = -1 + for i, node_idx in enumerate(r2_nodes_for_cell): + if nodes[node_idx]["angle"] > max_angle: + max_angle = nodes[node_idx]["angle"] + max_idx = i + + # Réarranger la liste pour avoir les angles dans l'ordre correct + r2_nodes_for_cell = r2_nodes_for_cell[max_idx + 1:] + r2_nodes_for_cell[:max_idx + 1] + + # Créer une cellule quadrilatérale en utilisant les deux nœuds de R1 + # et deux nœuds consécutifs de R2 + for i in range(len(r2_nodes_for_cell) - 1): + r2_current = r2_nodes_for_cell[i] + r2_next = r2_nodes_for_cell[i + 1] + + # Indices des nœuds qui forment cette cellule + node_indices = [n1, n2, r2_next, r2_current] + + # Points pour calculer l'aire + points = [(nodes[idx]["x"], nodes[idx]["y"]) for idx in node_indices] + area = calculer_aire_polygone(points) + + cells.append({ + "index": cell_index, + "area": area, + "target_area": area, + "nodes": node_indices + }) + cell_index += 1 + + + + # Deuxième anneau - nb_cellules_anneau2 cellules + for k in range(nb_cellules_anneau2): + # Indices des nœuds qui forment cette cellule + angle_k = k * (2 * math.pi / nb_cellules_anneau2) + angle_k_plus_1 = ((k + 1) % nb_cellules_anneau2) * (2 * math.pi / nb_cellules_anneau2) + + # Trouver les nœuds correspondants dans R2 et R3 avec la méthode robuste + r2_node_k = trouver_meilleur_noeud(angle_k, R2_nodes) + r2_node_k_plus_1 = trouver_meilleur_noeud(angle_k_plus_1, R2_nodes) + r3_node_k = R3_nodes[k] + r3_node_k_plus_1 = R3_nodes[(k + 1) % nb_cellules_anneau2] + + node_indices = [r2_node_k, r2_node_k_plus_1, r3_node_k_plus_1, r3_node_k] + + # Points pour calculer l'aire + points = [(nodes[idx]["x"], nodes[idx]["y"]) for idx in node_indices] + area = calculer_aire_polygone(points) + + cells.append({ + "index": cell_index, + "nodes": node_indices, + "area": area, + "target_area": area + }) + cell_index += 1 + + # Création de la cellule externe (boundary_polygon) + boundary_nodes = [] + for i in range(nb_cellules_anneau2): + boundary_nodes.append(R3_nodes[i]) + + boundary_area = math.pi * R3 * R3 + + # Création de la section cellules + cells_elem = ET.SubElement(root, "cells") + cells_elem.set("n", str(len(cells) + 1)) # +1 pour le boundary_polygon + cells_elem.set("magnification", "1") + cells_elem.set("nchem", "0") + cells_elem.set("offsetx", "0") + cells_elem.set("offsety", "0") + cells_elem.set("base_area", str(boundary_area)) + + # Ajout des cellules normales + for cell in cells: + cell_elem = ET.SubElement(cells_elem, "cell") + cell_elem.set("index", str(cell["index"])) + cell_elem.set("area", str(cell["area"])) + cell_elem.set("target_area", str(cell["target_area"])) + cell_elem.set("cell_type", "1") # Type de cellule standard + cell_elem.set("boundary", "0") + cell_elem.set("stiffness", "1") + cell_elem.set("fixed", "false") + cell_elem.set("target_length", "0") + cell_elem.set("lambda_celllength", "0") + cell_elem.set("at_boundary", "true") + cell_elem.set("pin_fixed", "false") + cell_elem.set("div_counter", "0") + cell_elem.set("dead", "false") + cell_elem.set("source", "false") + + for node_idx in cell["nodes"]: + node_elem = ET.SubElement(cell_elem, "node") + node_elem.set("n", str(node_idx)) + + # Ajout du boundary_polygon + boundary_elem = ET.SubElement(cells_elem, "boundary_polygon") + boundary_elem.set("index", "-1") + boundary_elem.set("area", str(boundary_area)) + boundary_elem.set("target_area", str(boundary_area)) + boundary_elem.set("cell_type", "0") + boundary_elem.set("boundary", "0") + boundary_elem.set("stiffness", "1") + boundary_elem.set("fixed", "false") + boundary_elem.set("target_length", "0") + boundary_elem.set("lambda_celllength", "0") + boundary_elem.set("at_boundary", "true") + boundary_elem.set("pin_fixed", "false") + boundary_elem.set("div_counter", "0") + boundary_elem.set("dead", "false") + boundary_elem.set("source", "false") + + for node_idx in boundary_nodes: + node_elem = ET.SubElement(boundary_elem, "node") + node_elem.set("n", str(node_idx)) + + # Fonction pour vérifier si une arête touche le boundary_polygon + def est_liee_au_boundary(n1, n2, cells): + """ + Vérifie si l'arête entre n1 et n2 appartient à une cellule avec index -1 (boundary_polygon) + """ + for cell in cells: + cell_idx = cell.get("index", None) + if cell_idx == -1: # C'est le boundary_polygon + nodes_list = [int(n.get("n")) for n in cell.findall("node")] + if n1 in nodes_list and n2 in nodes_list: + return True + return False + + # Fonction pour trouver le nœud le plus proche sur le même cercle avec tag spécial + def trouver_noeud_plus_proche_meme_cercle(node_idx): + node = nodes[node_idx] + cercle_nodes = [] + + # Déterminer à quel cercle appartient ce nœud + if node_idx in R1_nodes: + cercle_nodes = R1_nodes + elif node_idx in R2_nodes: + cercle_nodes = R2_nodes + elif node_idx in R3_nodes: + cercle_nodes = R3_nodes + else: + return None + + # Trouver le nœud le plus proche avec tag spécial + min_dist = float('inf') + closest = None + angle_node = node["angle"] + + for other_idx in cercle_nodes: + if other_idx == node_idx: + continue + + other_node = nodes[other_idx] + if other_node.get("special_tag") == "special": + # Pour R2, vérifier l'espacement angulaire + if node_idx in R2_nodes: + angle_diff = min(abs(other_node["angle"] - angle_node), + 2 * math.pi - abs(other_node["angle"] - angle_node)) + # Accepter uniquement les nœuds avec espacement angulaire proche de π/12 ou π/15 + pi_12 = math.pi / 12 + pi_15 = math.pi / 15 + if not (abs(angle_diff - pi_12) < 0.01 or abs(angle_diff - pi_15) < 0.01): + continue + + dist = min(abs(other_node["angle"] - angle_node), 2 * math.pi - abs(other_node["angle"] - angle_node)) + if dist < min_dist: + min_dist = dist + closest = other_idx + + return closest + + # Fonction pour vérifier si deux nœuds sont alignés (même angle) + def sont_alignes(node1_idx, node2_idx, tolerance=0.01): + node1 = nodes[node1_idx] + node2 = nodes[node2_idx] + angle_diff = min(abs(node1["angle"] - node2["angle"]), 2 * math.pi - abs(node1["angle"] - node2["angle"])) + return angle_diff < tolerance + + # Fonction pour trouver les cellules adjacentes à une arête + def trouver_cellules_adjacentes(n1, n2, cells_list): + cell1, cell2 = -2, -2 # -2 signifie "non trouvé" + + for cell in cells_list: + nodes_list = cell["nodes"] + if n1 in nodes_list and n2 in nodes_list: + # Cette cellule contient les deux nœuds + if cell1 == -2: + cell1 = cell["index"] + else: + cell2 = cell["index"] + break + + return cell1, cell2 + + # Création des parois (walls) + walls = [] + wall_index = 0 + + # 1. Connexion des nœuds d'un même cercle avec leur plus proche voisin ayant le tag spécial + # Nœuds du cercle R1 + for node_idx in R1_nodes: + closest = trouver_noeud_plus_proche_meme_cercle(node_idx) + if closest is not None: + # Vérifier si ce mur existe déjà + if not any(w["n1"] == node_idx and w["n2"] == closest or + w["n1"] == closest and w["n2"] == node_idx for w in walls): + # Identifier les cellules adjacentes (sans inclure le boundary) + c1, c2 = trouver_cellules_adjacentes(node_idx, closest, cells) + + # Ne créer le mur que si aucune des cellules n'est le boundary_polygon + if c1 != -1 and c2 != -1: + walls.append({ + "index": wall_index, + "c1": c1 if c1 != -2 else -1, + "c2": c2 if c2 != -2 else -1, + "n1": node_idx, + "n2": closest + }) + wall_index += 1 + + # Nœuds du cercle R2 + for node_idx in R2_nodes: + closest = trouver_noeud_plus_proche_meme_cercle(node_idx) + if closest is not None: + # Vérifier si ce mur existe déjà + if not any(w["n1"] == node_idx and w["n2"] == closest or + w["n1"] == closest and w["n2"] == node_idx for w in walls): + # Identifier les cellules adjacentes + c1, c2 = trouver_cellules_adjacentes(node_idx, closest, cells) + + # Ne créer le mur que si aucune des cellules n'est le boundary_polygon + if c1 != -1 and c2 != -1: + walls.append({ + "index": wall_index, + "c1": c1 if c1 != -2 else -1, + "c2": c2 if c2 != -2 else -1, + "n1": node_idx, + "n2": closest + }) + wall_index += 1 + + # Nœuds du cercle R3 - ATTENTION: Ces nœuds sont sur la frontière externe + # On ne crée PAS de walls entre les nœuds du cercle R3, car ils pourraient + # connecter une cellule normale au boundary_polygon + + # 2. Connexions entre les différents cercles (radiales) + # Parcourir toutes les cellules pour trouver les connexions radiales + for cell in cells: + nodes_list = cell["nodes"] + num_nodes = len(nodes_list) + + for i in range(num_nodes): + n1 = nodes_list[i] + n2 = nodes_list[(i + 1) % num_nodes] + + node1_info = next(node for node in nodes if node["nr"] == n1) + node2_info = next(node for node in nodes if node["nr"] == n2) + + # Si les nœuds sont sur des cercles différents et alignés (connexion radiale) + if abs(node1_info["radius"] - node2_info["radius"]) > 0.1 and sont_alignes(n1, n2): + if not any(w["n1"] == n1 and w["n2"] == n2 or + w["n1"] == n2 and w["n2"] == n1 for w in walls): + # Déterminer les cellules adjacentes + c1, c2 = trouver_cellules_adjacentes(n1, n2, cells) + + # IMPORTANT: Ne créer le mur que si aucune des cellules n'est le boundary_polygon + if c1 != -1 and c2 != -1: + walls.append({ + "index": wall_index, + "c1": c1 if c1 != -2 else -1, + "c2": c2 if c2 != -2 else -1, + "n1": n1, + "n2": n2 + }) + wall_index += 1 + + # Création de la section walls dans le XML + walls_elem = ET.SubElement(root, "walls") + walls_elem.set("n", str(len(walls))) + + for wall in walls: + wall_elem = ET.SubElement(walls_elem, "wall") + wall_elem.set("index", str(wall["index"])) + wall_elem.set("c1", str(wall["c1"])) + wall_elem.set("c2", str(wall["c2"])) + wall_elem.set("n1", str(wall["n1"])) + wall_elem.set("n2", str(wall["n2"])) + wall_elem.set("wall_type", "normal") + wall_elem.set("viz_flux", "0") + + # Calculer la longueur du mur + node1 = next(node for node in nodes if node["nr"] == wall["n1"]) + node2 = next(node for node in nodes if node["nr"] == wall["n2"]) + length = math.sqrt((node1["x"] - node2["x"]) ** 2 + (node1["y"] - node2["y"]) ** 2) + wall_elem.set("length", f"{length:.4f}") + + # Ajouter les transporteurs (vides) + transp1_elem = ET.SubElement(wall_elem, "transporters1") + transp2_elem = ET.SubElement(wall_elem, "transporters2") + + # Ajout des nodesets (vide) + nodesets_elem = ET.SubElement(root, "nodesets") + nodesets_elem.set("n", "0") + + # Copier les paramètres d'affichage du fichier vierge ou créer par défaut + try: + settings = root_vierge.find("settings") + if settings is not None: + root.append(settings) + else: + raise Exception("Paramètres d'affichage non trouvés dans le fichier vierge") + except: + settings_elem = ET.SubElement(root, "settings") + settings_elem.append(ET.Element("setting", {"name": "show_cell_centers", "val": "true"})) + settings_elem.append(ET.Element("setting", {"name": "show_nodes", "val": "true"})) + settings_elem.append(ET.Element("setting", {"name": "show_node_numbers", "val": "false"})) + settings_elem.append(ET.Element("setting", {"name": "show_cell_numbers", "val": "true"})) + settings_elem.append(ET.Element("setting", {"name": "show_borders_cells", "val": "false"})) + settings_elem.append(ET.Element("setting", {"name": "show_cell_axes", "val": "false"})) + settings_elem.append(ET.Element("setting", {"name": "show_cell_strain", "val": "false"})) + settings_elem.append(ET.Element("setting", {"name": "show_fluxes", "val": "false"})) + settings_elem.append(ET.Element("setting", {"name": "show_walls", "val": "false"})) + settings_elem.append(ET.Element("setting", {"name": "save_movie_frames", "val": "true"})) + settings_elem.append(ET.Element("setting", {"name": "show_only_leaf_boundary", "val": "false"})) + settings_elem.append(ET.Element("setting", {"name": "cell_growth", "val": "true"})) + settings_elem.append(ET.Element("setting", {"name": "hide_cells", "val": "false"})) + viewport_elem = ET.SubElement(settings_elem, "viewport") + viewport_elem.set("m11", "2.5") + viewport_elem.set("m12", "0") + viewport_elem.set("m21", "0") + viewport_elem.set("m22", "2.5") + viewport_elem.set("dx", "0") + viewport_elem.set("dy", "0") + + # Conversion en chaîne XML et formatage + rough_string = ET.tostring(root, encoding='UTF-8') + reparsed = minidom.parseString(rough_string) + + # Écriture du XML formaté dans un fichier + with open(nom_fichier_sortie, 'w', encoding='UTF-8') as f: + f.write(reparsed.toprettyxml(indent=" ", encoding='UTF-8').decode('UTF-8')) + + print(f"Fichier '{nom_fichier_sortie}' généré avec succès.") + return nom_fichier_sortie + + +def calculer_aire_polygone(points): + """Calcule l'aire d'un polygone en utilisant la formule des trapèzes""" + points = np.array(points) + x = points[:, 0] + y = points[:, 1] + return 0.5 * abs(np.sum(x[:-1] * y[1:] - x[1:] * y[:-1]) + x[-1] * y[0] - x[0] * y[-1]) + + +def trouver_cellule_adjacente(index_cellule, nb_cellules_second_anneau, nb_cellules_premier_anneau): + """Trouve la cellule du premier anneau adjacente à une cellule du second anneau""" + angle_cellule = index_cellule * (2 * math.pi / nb_cellules_second_anneau) + index_approx = int(angle_cellule / (2 * math.pi / nb_cellules_premier_anneau)) + return index_approx + + +# Exemple d'utilisation +if __name__ == "__main__": + # Pour créer une structure à trois cercles avec 12 cellules dans le premier anneau et 15 dans le second + nom_fichier = generer_structure_trois_cercles( + nom_fichier_sortie="structure_trois_cercles.xml", + fichier_structure_vierge="structure_vierge.xml", + rayons=[10, 15, 25], + nb_cellules_anneau1=12, + nb_cellules_anneau2=15 + ) + print(f"Fichier '{nom_fichier}' généré avec succès.") \ No newline at end of file diff --git a/Ncouches cambium.py b/Ncouches cambium.py new file mode 100644 index 00000000..c87b7a02 --- /dev/null +++ b/Ncouches cambium.py @@ -0,0 +1,409 @@ +import math +import numpy as np +import xml.etree.ElementTree as ET +from xml.dom import minidom +import os + + +def generer_structure_n_cercles(nom_fichier_sortie, fichier_structure_vierge=None, + rayon_interne=10, nombre_cercles=3, + param_a=12, param_b=15): + """ + Génère une structure à n cercles concentriques avec des rayons calculés selon les règles spécifiées. + + Args: + nom_fichier_sortie: Chemin du fichier XML de sortie + fichier_structure_vierge: Fichier XML vierge optionnel pour les paramètres d'affichage + rayon_interne: Rayon du cercle intérieur (cercle 0) + nombre_cercles: Nombre total de cercles (n+1 en comptant le cercle 0) + param_a: Paramètre a pour les cercles intermédiaires + param_b: Paramètre b pour le cercle extérieur + """ + # Chargement du fichier vierge si fourni + root_vierge = None + if fichier_structure_vierge and os.path.exists(fichier_structure_vierge): + try: + tree_vierge = ET.parse(fichier_structure_vierge) + root_vierge = tree_vierge.getroot() + except Exception as e: + print(f"Erreur lors du chargement du fichier vierge: {e}") + print("Utilisation des paramètres par défaut.") + + # Création de la structure XML de base + root = ET.Element("leaf") + + # ======= CALCUL DES RAYONS ======= + rayons = [rayon_interne] + + # Calcul des rayons des cercles intermédiaires (1 à n-1) + for i in range(1, nombre_cercles - 1): + # rayon(i) = rayon(i-1) / (1 - π/(2a)) + rayon = rayons[i - 1] / (1 - math.pi / (2 * param_a)) + rayons.append(rayon) + + # Calcul du rayon du cercle extérieur (n) + if nombre_cercles > 1: + # rayon(n) = rayon(n-1) × (1 + 2π/b) + rayon_exterieur = rayons[-1] * (1 + 2 * math.pi / param_b) + rayons.append(rayon_exterieur) + + print(f"Rayons calculés: {[round(r, 2) for r in rayons]}") + + # ======= CRÉATION DES NŒUDS ======= + nodes = [] + node_index = 0 + cell_index = 0 + cells = [] + + # Création de la cellule centrale (si nécessaire) + if nombre_cercles > 1: + # Cellule centrale (cellule 0) + central_cell_nodes = [] + num_points_cercle_interne = param_a # Utilisation du paramètre a pour le cercle interne + + for i in range(num_points_cercle_interne): + angle = 2 * math.pi * i / num_points_cercle_interne + x = rayons[0] * math.cos(angle) + y = rayons[0] * math.sin(angle) + + nodes.append({ + "nr": node_index, + "x": x, + "y": y, + "radius": rayons[0] + }) + central_cell_nodes.append(node_index) + node_index += 1 + + cells.append({ + "index": cell_index, + "nodes": central_cell_nodes, + "boundary": False, + "radius": 0 # Centre + }) + cell_index += 1 + + # Création des cercles intermédiaires (1 à n-2 si n > 2) + for circle_idx in range(1, nombre_cercles - 1): + num_points = param_a # Utilisation du paramètre a pour les cercles intermédiaires + circle_nodes = [] + + for i in range(num_points): + angle = 2 * math.pi * i / num_points + # Décalage d'angle pour mieux distribuer les points entre cercles + if circle_idx % 2 == 1: + angle += math.pi / num_points + + x = rayons[circle_idx] * math.cos(angle) + y = rayons[circle_idx] * math.sin(angle) + + nodes.append({ + "nr": node_index, + "x": x, + "y": y, + "radius": rayons[circle_idx] + }) + circle_nodes.append(node_index) + node_index += 1 + + # Création des cellules pour ce cercle + for i in range(num_points): + cell_nodes = [] + + # Nœuds du cercle actuel + n1 = circle_nodes[i] + n2 = circle_nodes[(i + 1) % num_points] + cell_nodes.extend([n1, n2]) + + # Pour les cercles intermédiaires, connectons aussi avec le cercle interne et externe + if circle_idx > 0: + # Connexion avec le cercle intérieur + inner_circle_index = circle_idx - 1 + inner_num_points = param_a # Même nombre de points sur les cercles intermédiaires + + # Trouver les 2 nœuds les plus proches sur le cercle intérieur + inner_start_idx = (i * inner_num_points) // num_points + inner_n1 = inner_start_idx + (circle_idx - 1) * inner_num_points + inner_n2 = (inner_start_idx + 1) % inner_num_points + (circle_idx - 1) * inner_num_points + + cell_nodes.extend([inner_n1, inner_n2]) + + cells.append({ + "index": cell_index, + "nodes": cell_nodes, + "boundary": False, + "radius": rayons[circle_idx] + }) + cell_index += 1 + + # Création du cercle extérieur (n-1) + if nombre_cercles > 1: + num_points_externe = param_b # Utilisation du paramètre b pour le cercle externe + external_circle_nodes = [] + + for i in range(num_points_externe): + angle = 2 * math.pi * i / num_points_externe + x = rayons[-1] * math.cos(angle) + y = rayons[-1] * math.sin(angle) + + nodes.append({ + "nr": node_index, + "x": x, + "y": y, + "radius": rayons[-1] + }) + external_circle_nodes.append(node_index) + node_index += 1 + + # Création des cellules pour le cercle externe + for i in range(num_points_externe): + cell_nodes = [] + + # Nœuds du cercle externe + n1 = external_circle_nodes[i] + n2 = external_circle_nodes[(i + 1) % num_points_externe] + cell_nodes.extend([n1, n2]) + + # Connexion avec le cercle intérieur précédent + inner_circle_idx = nombre_cercles - 2 + inner_num_points = param_a # Pour le cercle juste avant l'externe + + # Trouver les 2 nœuds les plus proches sur le cercle intérieur + inner_start_idx = (i * inner_num_points) // num_points_externe + if inner_circle_idx > 0: + start_node = sum(param_a for _ in range(inner_circle_idx)) + inner_n1 = start_node + inner_start_idx + inner_n2 = start_node + ((inner_start_idx + 1) % inner_num_points) + cell_nodes.extend([inner_n1, inner_n2]) + + cells.append({ + "index": cell_index, + "nodes": cell_nodes, + "boundary": True, # Le cercle externe est la frontière + "radius": rayons[-1] + }) + cell_index += 1 + + # ======= GÉNÉRATION DU XML ======= + # Ajouter les nœuds au XML + nodes_elem = ET.SubElement(root, "nodes") + nodes_elem.set("n", str(len(nodes))) + + for node in nodes: + node_elem = ET.SubElement(nodes_elem, "node") + node_elem.set("index", str(node["nr"])) + node_elem.set("x", f"{node['x']:.4f}") + node_elem.set("y", f"{node['y']:.4f}") + + # Ajouter les cellules au XML + cells_elem = ET.SubElement(root, "cells") + cells_elem.set("n", str(len(cells))) + + for cell in cells: + cell_elem = ET.SubElement(cells_elem, "cell") + cell_elem.set("index", str(cell["index"])) + cell_elem.set("boundary", "true" if cell["boundary"] else "false") + + # Nœuds de la cellule + nodelist = ET.SubElement(cell_elem, "nodelist") + for node_idx in cell["nodes"]: + node_ref = ET.SubElement(nodelist, "noderef") + node_ref.set("node", str(node_idx)) + + # Facteurs chimiques (vides par défaut) + chem_elem = ET.SubElement(cell_elem, "chemicals") + + # Génération des murs + walls = [] + wall_index = 0 + + # Fonction pour vérifier si deux nœuds sont alignés radialement + def sont_alignes(n1, n2): + node1 = next(node for node in nodes if node["nr"] == n1) + node2 = next(node for node in nodes if node["nr"] == n2) + + # Calculer l'angle entre la ligne qui connecte les nœuds et la ligne radiale + dx = node2["x"] - node1["x"] + dy = node2["y"] - node1["y"] + + # Vecteur radial du centre au premier nœud + rx = node1["x"] + ry = node1["y"] + + # Produit scalaire + dot_product = dx * rx + dy * ry + len1 = math.sqrt(dx ** 2 + dy ** 2) + len2 = math.sqrt(rx ** 2 + ry ** 2) + + if len1 * len2 == 0: + return False + + cos_angle = dot_product / (len1 * len2) + + # Alignés si l'angle est proche de 0° ou 180° + return abs(cos_angle) > 0.9 + + # Fonction pour trouver les cellules adjacentes à un mur + def trouver_cellules_adjacentes(n1, n2, cells): + cellules = [] + + for cell in cells: + nodes_cell = cell["nodes"] + if n1 in nodes_cell and n2 in nodes_cell: + cellules.append(cell["index"]) + + # Si deux cellules trouvées, les retourner + if len(cellules) == 2: + return cellules[0], cellules[1] + # Si une seule cellule trouvée, c'est une frontière + elif len(cellules) == 1: + return cellules[0], -1 + # Aucune cellule trouvée + return -2, -2 + + # Création des murs pour chaque paire de nœuds adjacents dans chaque cercle + for circle_idx in range(nombre_cercles): + if circle_idx == 0 and nombre_cercles > 1: + # Cercle intérieur + num_points = param_a + start_node = 0 + elif circle_idx == nombre_cercles - 1: + # Cercle extérieur + num_points = param_b + start_node = sum(param_a for _ in range(circle_idx)) + else: + # Cercles intermédiaires + num_points = param_a + start_node = sum(param_a for _ in range(circle_idx)) + + # Murs le long du cercle + for i in range(num_points): + n1 = start_node + i + n2 = start_node + ((i + 1) % num_points) + + c1, c2 = trouver_cellules_adjacentes(n1, n2, cells) + + if c1 != -2: # Au moins une cellule trouvée + walls.append({ + "index": wall_index, + "c1": c1, + "c2": c2, + "n1": n1, + "n2": n2 + }) + wall_index += 1 + + # Murs radiaux entre cercles + if circle_idx < nombre_cercles - 1: + inner_num_points = param_a if circle_idx == 0 else param_a + outer_num_points = param_b if circle_idx == nombre_cercles - 2 else param_a + + inner_start = sum(param_a for _ in range(circle_idx)) + outer_start = sum(param_a for _ in range(circle_idx + 1)) if circle_idx < nombre_cercles - 2 else sum( + param_a for _ in range(circle_idx + 1)) + + for i in range(inner_num_points): + n1 = inner_start + i + + # Trouver le nœud radial correspondant sur le cercle extérieur + angle_proportion = i / inner_num_points + j = int(angle_proportion * outer_num_points) % outer_num_points + + n2 = outer_start + j + + # Vérifier si ce sont des nœuds différents et qu'ils sont alignés radialement + if n1 != n2 and sont_alignes(n1, n2): + c1, c2 = trouver_cellules_adjacentes(n1, n2, cells) + + if c1 != -2: # Au moins une cellule trouvée + walls.append({ + "index": wall_index, + "c1": c1, + "c2": c2, + "n1": n1, + "n2": n2 + }) + wall_index += 1 + + # Création de la section walls dans le XML + walls_elem = ET.SubElement(root, "walls") + walls_elem.set("n", str(len(walls))) + + for wall in walls: + wall_elem = ET.SubElement(walls_elem, "wall") + wall_elem.set("index", str(wall["index"])) + wall_elem.set("c1", str(wall["c1"])) + wall_elem.set("c2", str(wall["c2"])) + wall_elem.set("n1", str(wall["n1"])) + wall_elem.set("n2", str(wall["n2"])) + wall_elem.set("wall_type", "normal") + wall_elem.set("viz_flux", "0") + + # Calculer la longueur du mur + node1 = next(node for node in nodes if node["nr"] == wall["n1"]) + node2 = next(node for node in nodes if node["nr"] == wall["n2"]) + length = math.sqrt((node1["x"] - node2["x"]) ** 2 + (node1["y"] - node2["y"]) ** 2) + wall_elem.set("length", f"{length:.4f}") + + # Ajouter les transporteurs (vides) + transp1_elem = ET.SubElement(wall_elem, "transporters1") + transp2_elem = ET.SubElement(wall_elem, "transporters2") + + # Ajout des nodesets (vide) + nodesets_elem = ET.SubElement(root, "nodesets") + nodesets_elem.set("n", "0") + + # Copier les paramètres d'affichage du fichier vierge ou créer par défaut + try: + settings = root_vierge.find("settings") + if settings is not None: + root.append(settings) + else: + raise Exception("Paramètres d'affichage non trouvés dans le fichier vierge") + except: + settings_elem = ET.SubElement(root, "settings") + settings_elem.append(ET.Element("setting", {"name": "show_cell_centers", "val": "true"})) + settings_elem.append(ET.Element("setting", {"name": "show_nodes", "val": "true"})) + settings_elem.append(ET.Element("setting", {"name": "show_node_numbers", "val": "false"})) + settings_elem.append(ET.Element("setting", {"name": "show_cell_numbers", "val": "true"})) + settings_elem.append(ET.Element("setting", {"name": "show_borders_cells", "val": "false"})) + settings_elem.append(ET.Element("setting", {"name": "show_cell_axes", "val": "false"})) + settings_elem.append(ET.Element("setting", {"name": "show_cell_strain", "val": "false"})) + settings_elem.append(ET.Element("setting", {"name": "show_fluxes", "val": "false"})) + settings_elem.append(ET.Element("setting", {"name": "show_walls", "val": "false"})) + settings_elem.append(ET.Element("setting", {"name": "save_movie_frames", "val": "true"})) + settings_elem.append(ET.Element("setting", {"name": "show_only_leaf_boundary", "val": "false"})) + settings_elem.append(ET.Element("setting", {"name": "cell_growth", "val": "true"})) + settings_elem.append(ET.Element("setting", {"name": "hide_cells", "val": "false"})) + viewport_elem = ET.SubElement(settings_elem, "viewport") + viewport_elem.set("m11", "2.5") + viewport_elem.set("m12", "0") + viewport_elem.set("m21", "0") + viewport_elem.set("m22", "2.5") + viewport_elem.set("dx", "0") + viewport_elem.set("dy", "0") + + # Conversion en chaîne XML et formatage + rough_string = ET.tostring(root, encoding='UTF-8') + reparsed = minidom.parseString(rough_string) + + # Écriture du XML formaté dans un fichier + with open(nom_fichier_sortie, 'w', encoding='UTF-8') as f: + f.write(reparsed.toprettyxml(indent=" ", encoding='UTF-8').decode('UTF-8')) + + print(f"Fichier '{nom_fichier_sortie}' généré avec succès.") + return nom_fichier_sortie + + +# Exemple d'utilisation +if __name__ == "__main__": + # Pour créer une structure à 5 cercles + nom_fichier = generer_structure_n_cercles( + nom_fichier_sortie="structure_n_cercles.xml", + fichier_structure_vierge="structure_vierge.xml", + rayon_interne=10, + nombre_cercles=4, + param_a=12, # Nombre de points sur les cercles intermédiaires + param_b=24 # Nombre de points sur le cercle extérieur + ) + print(f"Fichier '{nom_fichier}' généré avec succès.") \ No newline at end of file diff --git a/data/leaves/cambium.xml b/data/leaves/cambium.xml index c9e834ac..9c4d4f7b 100644 --- a/data/leaves/cambium.xml +++ b/data/leaves/cambium.xml @@ -14,7 +14,7 @@ - + diff --git a/data/leaves/cambium_new.xml b/data/leaves/cambium_new.xml new file mode 100644 index 00000000..7d6fe942 --- /dev/null +++ b/data/leaves/cambium_new.xml @@ -0,0 +1,1906 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/empty_XML_VirtualLeaf.py b/empty_XML_VirtualLeaf.py new file mode 100644 index 00000000..8833e1e0 --- /dev/null +++ b/empty_XML_VirtualLeaf.py @@ -0,0 +1,183 @@ +import xml.etree.ElementTree as ET +import xml.dom.minidom as minidom + + +def creer_fichier_xml_vierge(nom_fichier="structure_vierge.xml"): + """ + Crée un fichier XML vierge avec la même structure que le fichier 'structure_vierge.xml'. + """ + # Racine du document + root = ET.Element("leaf") + root.set("name", "") + root.set("date", "") + root.set("simtime", "") + + # Section des paramètres + parameter = ET.SubElement(root, "parameter") + + # Liste complète des paramètres simples + parametres_simples = [ + "arrowcolor", "arrowsize", "textcolor", "cellnumsize", "nodenumsize", + "node_mag", "outlinewidth", "cell_outline_color", "resize_stride", + "export_interval", "export_fn_prefix", "storage_stride", "xml_storage_stride", + "datadir", "T", "lambda_length", "yielding_threshold", "lambda_celllength", + "target_length", "cell_expansion_rate", "cell_div_expansion_rate", + "auxin_dependent_growth", "ode_accuracy", "mc_stepsize", "mc_cell_stepsize", + "energy_threshold", "bend_lambda", "alignment_lambda", "rel_cell_div_threshold", + "rel_perimeter_stiffness", "collapse_node_threshold", "morphogen_div_threshold", + "morphogen_expansion_threshold", "copy_wall", "source", "k1", "k2", "r", "kr", + "km", "Pi_tot", "transport", "ka", "pin_prod", "pin_prod_in_epidermis", + "pin_breakdown", "pin_breakdown_internal", "aux1prod", "aux1prodmeso", + "aux1decay", "aux1decaymeso", "aux1transport", "aux_cons", "aux_breakdown", + "kaux1", "kap", "leaf_tip_source", "sam_efflux", "sam_auxin", + "sam_auxin_breakdown", "van3prod", "van3autokat", "van3sat", "k2van3", "dt", + "rd_dt", "potential_slide_angle", "elastic_modulus", "movie", "nit", + "compatibility_level", "maxt", "rseed", "constituous_expansion_limit", + "vessel_inh_level", "vessel_expansion_rate", "d", "e", "f", "c", "mu", "nu", + "rho0", "rho1", "c0", "gamma", "eps", "betaN", "gammaN", "betaD", "gammaD", + "betaR", "gammaR", "tau", "kt", "kc", "krs", "i1", "i2", "b4", "dir1", "dir2" + ] + + # Ajouter les paramètres simples + for nom in parametres_simples: + par = ET.SubElement(parameter, "par") + par.set("name", nom) + par.set("val", "") + + # Ajouter les paramètres avec tableaux + array_params = ["D", "initval", "k"] + for nom_array in array_params: + par = ET.SubElement(parameter, "par") + par.set("name", nom_array) + valarray = ET.SubElement(par, "valarray") + + # Créer 15 éléments vides pour chaque tableau + for _ in range(15): + val = ET.SubElement(valarray, "val") + val.set("v", "") + + # Section des nœuds + nodes = ET.SubElement(root, "nodes") + nodes.set("n", "") + nodes.set("target_length", "") + + # Ajouter un nœud vide + node = ET.SubElement(nodes, "node") + node.set("nr", "") + node.set("x", "") + node.set("y", "") + node.set("fixed", "") + node.set("boundary", "") + node.set("sam", "") + + # Forcer l'utilisation d'un commentaire vide pour garder la structure + node.text = "" + + # Section des cellules + cells = ET.SubElement(root, "cells") + cells.set("n", "") + cells.set("offsetx", "") + cells.set("offsety", "") + cells.set("magnification", "") + cells.set("base_area", "") + cells.set("nchem", "") + + # Ajouter une cellule vide + cell = ET.SubElement(cells, "cell") + cell.set("index", "") + cell.set("cell_type", "") + cell.set("area", "") + cell.set("target_area", "") + cell.set("target_length", "") + cell.set("lambda_celllength", "") + cell.set("stiffness", "") + cell.set("fixed", "") + cell.set("pin_fixed", "") + cell.set("boundary", "") + cell.set("at_boundary", "") + cell.set("dead", "") + cell.set("source", "") + cell.set("div_counter", "") + + # Forcer la structure + cell.text = "\n " + cell.tail = "\n " + + # Ajouter le polygone de frontière + boundary_polygon = ET.SubElement(cells, "boundary_polygon") + boundary_polygon.set("index", "") + boundary_polygon.set("cell_type", "") + boundary_polygon.set("area", "") + boundary_polygon.set("target_area", "") + boundary_polygon.set("target_length", "") + boundary_polygon.set("lambda_celllength", "") + boundary_polygon.set("stiffness", "") + boundary_polygon.set("fixed", "") + boundary_polygon.set("pin_fixed", "") + boundary_polygon.set("boundary", "") + boundary_polygon.set("at_boundary", "") + boundary_polygon.set("dead", "") + boundary_polygon.set("source", "") + boundary_polygon.set("div_counter", "") + # Forcer la structure + boundary_polygon.text = "\n " + boundary_polygon.tail = "\n" + + # Section des parois + walls = ET.SubElement(root, "walls") + walls.set("n", "") + # Forcer la structure + walls.text = "\n" + + # Section des nodesets + nodesets = ET.SubElement(root, "nodesets") + nodesets.set("n", "") + + # Section des paramètres d'affichage + settings = ET.SubElement(root, "settings") + + # Paramètres d'affichage + affichages = [ + "show_cell_centers", + "show_nodes", + "show_node_numbers", + "show_cell_numbers", + "show_border_cells", + "show_cell_axes", + "show_cell_strain", + "show_fluxes", + "show_walls", + "save_movie_frames", + "show_only_leaf_boundary", + "cell_growth", + "hide_cells" + ] + + for nom in affichages: + setting = ET.SubElement(settings, "setting") + setting.set("name", nom) + setting.set("val", "") + + # Viewport + viewport = ET.SubElement(settings, "viewport") + viewport.set("m11", "") + viewport.set("m12", "") + viewport.set("m21", "") + viewport.set("m22", "") + viewport.set("dx", "") + viewport.set("dy", "") + + # Convertir en chaîne XML bien formatée + xml_str = ET.tostring(root, encoding='utf-8') + dom = minidom.parseString(xml_str) + pretty_xml = dom.toprettyxml(indent=" ") + + # Enregistrer le fichier + with open(nom_fichier, "w", encoding="utf-8") as f: + f.write(pretty_xml) + + print(f"Fichier '{nom_fichier}' créé avec succès.") + + +# Créer le fichier XML vierge +creer_fichier_xml_vierge() \ No newline at end of file diff --git a/src/GUI/cell.h b/src/GUI/cell.h index 2851ebd0..1257832c 100755 --- a/src/GUI/cell.h +++ b/src/GUI/cell.h @@ -98,7 +98,7 @@ class Cell : public CellBase Vector long_axis; Length(&long_axis); - DivideOverAxis(long_axis.Perp2D()); + DivideOverAxis(long_axis.Perp2D()); } //void CheckForGFDrivenDivision(void); diff --git a/src/Models/Cambium/cambium.cpp b/src/Models/Cambium/cambium.cpp index e6fd8575..e1bfe704 100755 --- a/src/Models/Cambium/cambium.cpp +++ b/src/Models/Cambium/cambium.cpp @@ -22,7 +22,9 @@ #include #include #include + #include "parameter.h" +#include "pi.h" #include "wallbase.h" #include "cellbase.h" @@ -254,7 +256,9 @@ void cambium::CellHouseKeeping(CellBase *c) { // How cells behave after division // Normal behavior for cambium cells c->EnlargeTargetArea(par->cell_expansion_rate); if (c->Area() > par->rel_cell_div_threshold * c->BaseArea()) { - c->Divide(); + double orientation = Pi*RANDOM(); + Vector axis(sin(orientation),cos(orientation),0.); + c->DivideOverAxis(axis); } } else if(c->CellType() == 2) { // If cell is a type 2, grow until it reach 3*BaseArea then transform into a Type 3 diff --git a/structure_n_cercles.xml b/structure_n_cercles.xml new file mode 100644 index 00000000..ae71a9cc --- /dev/null +++ b/structure_n_cercles.xml @@ -0,0 +1,807 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/structure_trois_cercles.xml b/structure_trois_cercles.xml new file mode 100644 index 00000000..a0e4e98f --- /dev/null +++ b/structure_trois_cercles.xml @@ -0,0 +1,1007 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/structure_vierge.xml b/structure_vierge.xml new file mode 100644 index 00000000..43c10c4b --- /dev/null +++ b/structure_vierge.xml @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/virtualleaf_xml_model.py b/virtualleaf_xml_model.py index 71f0d2bb..68e8d61f 100644 --- a/virtualleaf_xml_model.py +++ b/virtualleaf_xml_model.py @@ -88,11 +88,18 @@ class ParameterSection: """ Wrapper around the ```` XML block. - Implements container-like behaviour so that you can:: - - >>> len(doc.parameter) # number of parameters - >>> for p in doc.parameter: ... # iterate over Parameter objects - >>> doc.parameter.names() # list the parameter names + Implements container-like behaviour so that you can: + + * Get number of parameters with ``len()`` + * Iterate over Parameter objects with a for loop + * List all parameter names with ``names()`` method + + Examples: + # Assuming 'model' is a VirtualLeaf_XML instance: + model.parameter.names() # liste les noms de paramètres + len(model.parameter) # nombre de paramètres + for p in model.parameter: # itère sur les objets Parameter + print(p.name, p.value) """ elem: objectify.ObjectifiedElement = field(repr=False) parameters: List[Parameter] = field(init=False) From bc00bb23da57ff7165c8bb30c7ae53f90d566cb6 Mon Sep 17 00:00:00 2001 From: Rojas Date: Thu, 12 Jun 2025 18:34:13 +0200 Subject: [PATCH 3/8] XML file creation, new division rules --- .idea/VirtualLeaf2021.iml | 15 +- .idea/codeStyles/Project.xml | 11 + .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/customTargets.xml | 12 + .idea/editor.xml | 247 + .idea/modules.xml | 8 + .../shelved.patch | 15135 ---------------- ...e_Update_at_13_05_2025_13_42__Changes_.xml | 4 - .idea/tools/External Tools.xml | 16 + .idea/workspace.xml | 262 +- Change_XML.py | 6 +- Create_new_Cambium_XML.py | 274 + Creating Cambium XML.py | 566 - Old_run_in_batch.py | 130 + Pipfile | 12 + data/leaves/Cambium_nCercles.xml | 1922 ++ data/leaves/Cambium_test_bug.xml | 1906 ++ data/leaves/cambium_new.xml | 2602 ++- nCercles.py | 1347 ++ src/GUI/VirtualLeaf.cpp | 4 +- src/GUI/cell.cpp | 2 + src/GUI/mesh.h | 2 +- src/Library/cellbase.cpp | 69 + src/Library/cellbase.h | 12 +- src/Library/parameter.cpp | 4 + src/Models/Cambium/cambium.cpp | 747 +- src/Models/Cambium/cambium.h | 18 +- structure_trois_cercles.xml | 1007 - test_XML.py | 1371 ++ 29 files changed, 9270 insertions(+), 18446 deletions(-) create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/customTargets.xml create mode 100644 .idea/editor.xml create mode 100644 .idea/modules.xml delete mode 100644 .idea/shelf/Uncommitted_changes_before_Update_at_13_05_2025_13_42_[Changes]/shelved.patch delete mode 100644 .idea/shelf/Uncommitted_changes_before_Update_at_13_05_2025_13_42__Changes_.xml create mode 100644 .idea/tools/External Tools.xml create mode 100644 Create_new_Cambium_XML.py delete mode 100644 Creating Cambium XML.py create mode 100644 Old_run_in_batch.py create mode 100644 Pipfile create mode 100644 data/leaves/Cambium_nCercles.xml create mode 100644 data/leaves/Cambium_test_bug.xml create mode 100644 nCercles.py delete mode 100644 structure_trois_cercles.xml create mode 100644 test_XML.py diff --git a/.idea/VirtualLeaf2021.iml b/.idea/VirtualLeaf2021.iml index 0365a06b..17a8457a 100644 --- a/.idea/VirtualLeaf2021.iml +++ b/.idea/VirtualLeaf2021.iml @@ -1,7 +1,14 @@ - - -