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..38562759
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 00000000..9661ac71
--- /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..6ed82ce7
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,596 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ "lastFilter": {
+ "state": "OPEN",
+ "assignee": "regiroc"
+ }
+}
+ {
+ "selectedUrlAndAccountId": {
+ "url": "https://github.com/LRouges/VirtualLeaf2021.git",
+ "accountId": "8105f130-6909-4c7e-9180-03453d9f651f"
+ }
+}
+
+
+
+
+
+
+
+
+
+ {
+ "customColor": "",
+ "associatedIndex": 8
+}
+
+
+
+
+
+ {
+ "keyToString": {
+ "ASKED_MARK_IGNORED_FILES_AS_EXCLUDED": "true",
+ "Custom Build Application.VirtualLeaf Build & Run.executor": "Run",
+ "Makefile Target.Cambium.executor": "Run",
+ "Makefile Target.Unnamed.executor": "Run",
+ "Makefile Target.make.executor": "Run",
+ "ModuleVcsDetector.initialDetectionPerformed": "true",
+ "Python tests.Doctests in virtualleaf_xml_model.executor": "Run",
+ "Python.Change stifness parameter XML.executor": "Run",
+ "Python.Change_XML.executor": "Run",
+ "Python.Create_new_Cambium_XML.executor": "Run",
+ "Python.Creating XML cambium.executor": "Run",
+ "Python.Creating Cambium XML.executor": "Run",
+ "Python.Creating cambium.executor": "Run",
+ "Python.GetBoudaryNodes.executor": "Run",
+ "Python.Ncouches cambium.executor": "Run",
+ "Python.__main__.executor": "Run",
+ "Python.change bark node.executor": "Run",
+ "Python.empty_XML_VirtualLeaf.executor": "Run",
+ "Python.nCercles.executor": "Run",
+ "Python.readsvg.executor": "Run",
+ "Python.test XML.executor": "Run",
+ "Python.test.executor": "Run",
+ "Python.test_XML.executor": "Run",
+ "Python.virtualleaf_xml_model.executor": "Run",
+ "RunOnceActivity.RadMigrateCodeStyle": "true",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "RunOnceActivity.cidr.known.project.marker": "true",
+ "RunOnceActivity.git.unshallow": "true",
+ "RunOnceActivity.readMode.enableVisualFormatting": "true",
+ "Shell Script.Run virtualLeaf.executor": "Run",
+ "Shell Script.Unnamed.executor": "Run",
+ "cf.first.check.clang-format": "false",
+ "cidr.known.project.marker": "true",
+ "git-widget-placeholder": "Rouges",
+ "junie.onboarding.icon.badge.shown": "true",
+ "last_opened_file_path": "C:/Users/Rojas/PycharmProjects/VirtualLeaf2021",
+ "node.js.detected.package.eslint": "true",
+ "node.js.detected.package.tslint": "true",
+ "node.js.selected.package.eslint": "(autodetect)",
+ "node.js.selected.package.tslint": "(autodetect)",
+ "nodejs_package_manager_path": "npm",
+ "settings.editor.selected.configurable": "preferences.pluginManager",
+ "two.files.diff.last.used.file": "C:/Users/Rojas/PycharmProjects/VirtualLeaf2021/data/leaves/cambium.xml",
+ "vue.rearranger.settings.migration": "true"
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1744195022159
+
+
+ 1744195022159
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1745416053129
+
+
+
+ 1745416053129
+
+
+
+ 1745862945512
+
+
+
+ 1745862945512
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Change_XML.py b/Change_XML.py
index 68356a10..7b49cb34 100644
--- a/Change_XML.py
+++ b/Change_XML.py
@@ -5,13 +5,13 @@
from virtualleaf_xml_model import VirtualLeaf_XML, Node
import math
-doc = VirtualLeaf_XML("data/leaves/cambium_virgin.xml")
+doc = VirtualLeaf_XML("data/leaves/cambium_test_new.xml")
doc.leaf.name = "Cambium_01"
doc.leaf.date = str(date.today())
doc.leaf.simtime = 0
-output_xml = "data/leaves/cambium.xml"
-datadir = "/home/ardati/Data_VirtualLeaf/Cambium_01"
+output_xml = "data/leaves/Cambium_nCercles_new.xml"
+datadir = "/home/rojas/Cambium_New01"
# Parameters
doc.parameter.set_parameter(name='datadir',value=datadir)
doc.parameter.set_parameter(name='maxt',value="10000")
@@ -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/Create_new_Cambium_XML.py b/Create_new_Cambium_XML.py
new file mode 100644
index 00000000..3627bf97
--- /dev/null
+++ b/Create_new_Cambium_XML.py
@@ -0,0 +1,274 @@
+from datetime import date, datetime
+from collections import defaultdict
+from lxml import etree, objectify
+import numpy as np
+from virtualleaf_xml_model import VirtualLeaf_XML, Node
+import math
+from test_XML import generer_donnees
+
+doc = VirtualLeaf_XML("data/leaves/cambium.xml")
+doc.leaf.name = "Cambium_New"
+doc.leaf.date = str(date.today())
+doc.leaf.simtime = 0
+
+output_xml = "data/leaves/cambium_test_new.xml"
+datadir = "/home/rojas/Cambium_New01"
+# Parameters
+doc.parameter.set_parameter(name='datadir',value=datadir)
+doc.parameter.set_parameter(name='maxt',value="10000")
+
+
+#Remove nodes, cells, walls
+
+
+
+# Remove Nodes
+nodes_parent = doc.root.find("nodes")
+for node in list(nodes_parent.findall("node")):
+ nodes_parent.remove(node)
+
+
+ # Récupérer les noeuds et cellules générés
+k_noeuds_n_cercle_cartesien_raffine, cellules, liste_walls, basearea = generer_donnees()
+print("liste noeuds : ",k_noeuds_n_cercle_cartesien_raffine,"\n")
+print("nombre éléments noeuds : ",len(k_noeuds_n_cercle_cartesien_raffine))
+
+# Dictionnaire pour stocker les coordonnées des noeuds
+coords = {}
+next_nr = 0 # compteur pour les indices de noeuds
+
+# Ajouter tous les noeuds au XML
+for noeud in k_noeuds_n_cercle_cartesien_raffine:
+
+ # print(noeud['index'])
+ mx = noeud['x']
+ my = noeud['y']
+ sam_flag = noeud['sam']
+ boundary_flag = noeud['boundary']
+ fixed_flag = noeud['fixed']
+ # Créer l'élément XML pour le noeud
+ new_node_elem = etree.SubElement(
+ nodes_parent,
+ "node",
+ nr=str(noeud['index']),
+ x=f"{mx:.6g}",
+ y=f"{my:.6g}",
+ sam=str(noeud['sam']).lower(), # Conversion en "true" ou "false"
+ boundary=str(noeud['boundary']).lower(),
+ fixed=str(noeud['fixed']).lower(),
+ )
+
+ # Stocker les coordonnées pour la création des murs
+ coords[next_nr] = (mx, my)
+ # Ajouter à la liste de noeuds du document
+ doc.nodes.nodes.append(Node(
+ next_nr, mx, my, sam_flag, boundary_flag, fixed_flag, new_node_elem
+ ))
+
+ next_nr += 1
+
+
+# Mettre à jour le nombre total de noeuds
+nodes_parent.set("n", str(next_nr))
+
+#----------------------------------------------------------------------------------------------------#
+#------------------------- Cellules -----------------------------------------------------------------#
+#----------------------------------------------------------------------------------------------------#
+
+#------------------------Balise parent cells---------------------------------------------------------#
+# Supprimer l'élément cells existant s'il existe déjà
+cells_parent = doc.root.find("cells")
+if cells_parent is not None:
+ doc.root.remove(cells_parent)
+
+# Créer le nouvel élément cells
+cells_elem = etree.Element(
+ "cells",
+ n=str(len(cellules)),
+ magnfication="1",
+ nchem="0",
+ offsetx="0",
+ offsety="0",
+ base_area= str(basearea)
+)
+
+# Ne pas essayer d'ajouter les dictionnaires de cellules directement ici
+# Les cellules seront ajoutées plus tard avec SubElement
+
+# Rechercher l'élément walls
+walls_elem = doc.root.find("walls")
+
+if walls_elem is not None:
+ # Si walls existe, insérer cells avant walls
+ parent = walls_elem.getparent()
+ index = parent.index(walls_elem)
+ parent.insert(index, cells_elem)
+else:
+ # Rechercher nodes pour insérer après
+ nodes_elem = doc.root.find("nodes")
+ if nodes_elem is not None:
+ parent = nodes_elem.getparent()
+ index = parent.index(nodes_elem)
+ parent.insert(index + 1, cells_elem)
+ else:
+ # Si aucun repère n'est trouvé, ajouter à la fin
+ doc.root.append(cells_elem)
+
+# Mettre à jour la référence à cells dans doc
+doc.cells = cells_elem
+
+# Dictionnaire pour stocker les arêtes entre les cellules
+pair2edges = defaultdict(list)
+
+
+
+#------------------------Balise enfant Cell---------------------------------------------------------#
+
+# Créer les cellules à partir de la variable cellules existante
+for cellule in cellules:
+ # Créer l'élément XML pour la cellule avec toutes les propriétés
+ cell_elem = etree.SubElement(
+ cells_elem,
+ "cell",
+ index=str(cellule["index"]),
+ boundary=str(cellule["boundary"]),
+ cell_type=str(cellule["cell_type"]),
+ target_area=str(cellule["area"]),
+ lambda_celllength=str(cellule["lambda_celllength"]),
+ at_boundary="true" if cellule["at_boundary"] else "false",
+ dead="true" if cellule["dead"] else "false",
+ target_length=str(cellule["target_length"]),
+ stiffness=str(cellule["stiffness"]),
+ source="true" if cellule["source"] else "false",
+ pin_fixed="true" if cellule["pin_fixed"] else "false",
+ area=str(cellule["area"]),
+ fixed="true" if cellule["fixed"] else "false",
+ div_counter=str(cellule["div_counter"]),
+ )
+ cell_idx = cellule["index"]
+ cell_nodes = cellule["noeuds"]
+ # Ajouter les nœuds à la cellule (une seule fois)
+ for i, node_id in enumerate(cell_nodes):
+ # Créer l'élément nœud pour la cellule
+ etree.SubElement(cell_elem, "node", n=str(node_id))
+
+ # Enregistrer l'arête pour la création des murs
+ next_node = cell_nodes[(i + 1) % len(cell_nodes)]
+ if cell_idx < 0: # Cellule externe
+ pair2edges[(cell_idx, 0)].append((cellule(""), next_node))
+ else:
+ pair2edges[(min(cell_idx, 0), max(cell_idx, 0))].append((node_id, next_node))
+
+
+
+#------------------------Boundary_Polygon----------------------------------------------
+# Supprimer l'ancien élément walls s'il existe
+boundary_polygon = doc.root.find("cell/boundary_polygon")
+if boundary_polygon is not None:
+ doc.root.remove(boundary_polygon)
+# Créer un nouveau boundary_polygon avec les bons nœuds (uniquement ceux marqués boundary=true)
+boundary_nodes = []
+print("boundary nodes",boundary_nodes)
+print("k_noeuds_n_cercle_cartesien_raffine",k_noeuds_n_cercle_cartesien_raffine)
+for i, noeud in enumerate(k_noeuds_n_cercle_cartesien_raffine):
+ # Vérification stricte: l'attribut doit être exactement True (booléen)
+ if noeud.get('boundary') is True:
+ boundary_nodes.append(noeud['index'])
+
+# print(f"Nœuds de frontière détectés: {boundary_nodes}")
+
+# Créer le boundary_polygon avec seulement ces nœuds
+boundary_polygon = etree.SubElement(
+ cells_elem, "boundary_polygon",
+ index="-1",
+ boundary="0",
+ cell_type="0",
+ target_area=str(basearea*len(cellules)),
+ lambda_celllength="0",
+ at_boundary="true",
+ dead="false",
+ target_length="0",
+ stiffness="1",
+ source="false",
+ pin_fixed="false",
+ area=str(basearea*len(cellules)),
+ fixed="false",
+ div_counter="0"
+)
+
+# Ajouter seulement les nœuds de frontière actuels au boundary_polygon
+for node_nr in boundary_nodes:
+ etree.SubElement(boundary_polygon, "node", n=str(node_nr))
+
+print("boundary nodes",boundary_nodes)
+
+#---------Walls------------------------------------------------------#
+
+
+# Supprimer l'ancien élément walls s'il existe
+walls_elem = doc.root.find("walls")
+if walls_elem is not None:
+ doc.root.remove(walls_elem)
+
+# Créer le nouvel élément walls sans l'ajouter immédiatement au document
+walls_elem = etree.Element("walls", n=str(len(liste_walls)))
+
+# Trouver l'élément cells
+cells_elem = doc.root.find("cells")
+if cells_elem is None:
+ # print("Erreur: élément cells non trouvé dans le document XML")
+ # Créer l'élément cells si nécessaire
+ cells_elem = etree.SubElement(doc.root, "cells", n="0")
+else:
+ # Insérer walls juste après cells
+ parent = cells_elem.getparent()
+ index = parent.index(cells_elem)
+ parent.insert(index + 1, walls_elem)
+
+# Regrouper les murs par cellule
+walls_by_cell = defaultdict(list)
+for wall in liste_walls:
+ walls_by_cell[wall['c1']].append(wall['index'])
+ walls_by_cell[wall['c2']].append(wall['index'])
+
+# Ajouter les références aux murs dans chaque cellule
+for cell_elem in cells_elem.findall("cell"):
+ cell_idx = cell_elem.get("index")
+ if cell_idx in walls_by_cell:
+ for wall_idx in walls_by_cell[cell_idx]:
+ etree.SubElement(cell_elem, "wall", w=str(wall_idx))
+
+# Ajouter chaque wall avec ses attributs
+for wall_data in liste_walls:
+ wall = etree.SubElement(
+ walls_elem, "wall",
+ length=str(wall_data["length"]),
+ c1=str(wall_data["c1"]),
+ c2=str(wall_data["c2"]),
+ n1=str(wall_data["n1"]),
+ n2=str(wall_data["n2"]),
+ wall_type=str(wall_data["wall_type"]),
+ viz_flux=str(wall_data["viz_flux"]),
+ index=str(wall_data["index"])
+ )
+
+ # Ajouter les éléments transporters (vides)
+ etree.SubElement(wall, "transporters1")
+ etree.SubElement(wall, "transporters2")
+
+# print(f"{len(liste_walls)} murs ajoutés au document XML")
+
+
+
+
+
+# Settings
+doc.settings.set_setting(name='save_movie_frames',value="true")
+doc.settings.set_setting(name='show_node_numbers',value="true")
+
+# ── housekeeping and save ────────────────────────────────────────────────
+objectify.deannotate(doc.root, cleanup_namespaces=True)
+etree.indent(doc.tree, space=" ")
+doc.save(output_xml)
+
+print(f"Fichier XML créé avec succès: {output_xml}")
diff --git a/Old_run_in_batch.py b/Old_run_in_batch.py
new file mode 100644
index 00000000..251bc0bb
--- /dev/null
+++ b/Old_run_in_batch.py
@@ -0,0 +1,130 @@
+import xml.etree.ElementTree as ET
+from pathlib import Path
+import subprocess
+import numpy as np
+
+class MyXML:
+ """Utility to clone a LeafML file and tweak simple entries."""
+
+ def __init__(self, templatefile: str):
+ self.tree = ET.parse(templatefile)
+ self.root = self.tree.getroot()
+ self.parameters = self.root.find("parameter")
+
+ def set_simple_param(self, name: str, value) -> None:
+ """Change the ‘val’ attribute of ."""
+ par = self.parameters.find(f"./par[@name='{name}']")
+ if par is None:
+ raise KeyError(f"Parameter '{name}' not found in XML")
+ par.set("val", str(value))
+
+ def write(self, filename: str) -> None:
+ """Write a full XML document in UTF‑8."""
+ # ① simply pass the *path* to ElementTree; it opens the file in 'wb'
+ self.tree.write(filename, encoding="utf-8", xml_declaration=True)
+
+ # --- alternative ---
+ # with open(filename, "wb") as fh: # binary mode!
+ # self.tree.write(fh, encoding="utf-8", xml_declaration=True)
+
+# -----------------------------------------------------------------------------
+leaf_in = Path("data/leaves/cambium.xml")
+model = "libmodel_exp.so"
+# Fixed expansion rate and different elastic modulus values
+number_of_runs = 3
+for r in number_of_runs:
+ # Create unique output names
+ datadir = f"/home/ardati/Data_VirtualLeaf/Cambium_r_{r}"
+ output_suffix = f"_{r}"
+ leaf_out = leaf_in.with_name(leaf_in.stem + output_suffix + ".xml")
+
+ # Create and modify XML
+ xml = MyXML(leaf_in)
+ xml.set_simple_param("maxt", 1500)
+ xml.set_simple_param("datadir", datadir)
+ xml.set_simple_param("xml_storage_stride", 1) # Pour enregiustrer tous les pas de temps
+ xml.set_simple_param("rseed", 1) #set seed to 1 for reproducibility
+
+
+ # Write XML file
+ xml.write(leaf_out)
+
+ # Run simulation
+ print(f"Running simulation with number {r} and output {leaf_out}")
+ subprocess.run([
+ "./bin/VirtualLeaf",
+ "-b",
+ "-l", str(leaf_out),
+ "-m", model
+ ], check=True)
+
+# After all simulations complete, analyze and plot the results
+import matplotlib.pyplot as plt
+import os
+import re
+
+# Collect area data for each elastic modulus value
+areas = []
+
+for r in number_of_runs:
+ datadir = f"/home/ardati/Data_VirtualLeaf/model_exp_pressure_em{r}"
+ print(f"getcwd : {os.getcwd()}")
+ # Find the latest XML file based on numeric part
+ xml_files = [f for f in os.listdir(datadir) if f.endswith('.xml')]
+ if not xml_files:
+ print(f"No XML files found in {datadir}")
+ continue
+
+ # Extract numbers from filenames like "leaf.000050.xml"
+ pattern = re.compile(r'leaf\.(\d+)\.xml')
+ latest_num = -1
+ latest_file = None
+
+ for file in xml_files:
+ match = pattern.match(file)
+ if match:
+ num = int(match.group(1))
+ if num > latest_num:
+ latest_num = num
+ latest_file = file
+
+ if not latest_file:
+ print(f"No matching XML files found in {datadir}")
+ continue
+
+ latest_xml = os.path.join(datadir, latest_file)
+ print(f"Using {latest_file} for elastic_modulus {elastic_modulus}")
+
+ # Parse the XML
+ # Parse the XML
+ tree = ET.parse(latest_xml)
+ root = tree.getroot()
+ cells = root.find("cells")
+ if cells is not None:
+ found = False
+ for cell in cells.findall("cell"):
+ if cell.get("index") == "0":
+ found = True
+ area = float(cell.get("area"))
+ areas.append((elastic_modulus, area))
+ print(f"Elastic modulus {elastic_modulus}: Cell area = {area}")
+ break # Stop after finding the target cell
+ if not found:
+ print(f"Cell with index 131 not found in {latest_xml}")
+
+# Plot the results
+if areas:
+ modulus_values, area_values = zip(*sorted(areas))
+ area_mean = sum(area_values) / len(area_values)
+ plt.figure(figsize=(10, 6))
+ plt.plot(modulus_values, area_values, 'o-')
+ # plt.ylim(area_mean*0.9, area_mean*1.1) # fixed, generous y‑window
+ # plt.yticks(np.arange(area_mean, area_mean*1.1, 2)) # tidy ticks
+ plt.xlabel('Elastic Modulus')
+ plt.ylabel('Cell Area')
+ plt.title(f'Cell Area vs Elastic Modulus (Expansion Rate = {expansion_rate})')
+ plt.grid(True)
+ plt.savefig('area_vs_elastic_modulus.png')
+ plt.show()
+else:
+ print("No area data found to plot")
\ No newline at end of file
diff --git a/Pipfile b/Pipfile
new file mode 100644
index 00000000..3b15f876
--- /dev/null
+++ b/Pipfile
@@ -0,0 +1,12 @@
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+
+[dev-packages]
+
+[requires]
+python_version = "3.13"
+python_full_version = "3.13.2"
diff --git a/data/leaves/Cambium_nCercles.xml b/data/leaves/Cambium_nCercles.xml
new file mode 100644
index 00000000..f724704c
--- /dev/null
+++ b/data/leaves/Cambium_nCercles.xml
@@ -0,0 +1,2931 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/leaves/Cambium_nCercles_new.xml b/data/leaves/Cambium_nCercles_new.xml
new file mode 100644
index 00000000..50ad0228
--- /dev/null
+++ b/data/leaves/Cambium_nCercles_new.xml
@@ -0,0 +1,6586 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/leaves/Cambium_test_bug.xml b/data/leaves/Cambium_test_bug.xml
new file mode 100644
index 00000000..16327453
--- /dev/null
+++ b/data/leaves/Cambium_test_bug.xml
@@ -0,0 +1,1906 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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..7da0f81b
--- /dev/null
+++ b/data/leaves/cambium_new.xml
@@ -0,0 +1,2283 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/leaves/cambium_test_new.xml b/data/leaves/cambium_test_new.xml
new file mode 100644
index 00000000..3cf38019
--- /dev/null
+++ b/data/leaves/cambium_test_new.xml
@@ -0,0 +1,5715 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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/nCercles.py b/nCercles.py
new file mode 100644
index 00000000..3aa890c7
--- /dev/null
+++ b/nCercles.py
@@ -0,0 +1,1347 @@
+import math as math
+import matplotlib.pyplot as plt
+from random import *
+
+# ----------------------------------------------------------------------------------------------------------#
+# ------------- CONVERSION POLAIRE-CARTÉSIEN ---------------------------------------------------------------#
+# ----------------------------------------------------------------------------------------------------------#
+
+def polaire_vers_cartesien(k_noeuds_n_cercle_polaire):
+ """Convertit les coordonnées polaires des noeuds en coordonnées cartésiennes.
+
+ Args:
+ k_noeuds_n_cercle_polaire: Liste des noeuds en coordonnées polaires pour chaque cercle
+
+ Returns:
+ Liste des noeuds en coordonnées cartésiennes pour chaque cercle
+ """
+ return [
+ {
+ "x": noeud["r"] * math.cos(noeud["theta"]),
+ "y": noeud["r"] * math.sin(noeud["theta"]),
+ "index": noeud["index"],
+ "initial": noeud["initial"],
+ "sam": noeud["sam"],
+ "boundary": noeud["boundary"],
+ "fixed": noeud["fixed"]
+ }
+ for cercle in k_noeuds_n_cercle_polaire
+ for noeud in cercle
+ ]
+
+
+
+#-----------------------------------------------------------------------------------------------------#
+#------------ GÉNÉRATION DES RAYONS ------------------------------------------------------------------#
+#-----------------------------------------------------------------------------------------------------#
+
+def n_cercles(n, rayon_0, a, rapport_R_T, debug=False):
+ """Calcule les rayons de n cercles concentriques.
+
+ Args:
+ n: Nombre de cercles à générer
+ rayon_0: Rayon du premier cercle (le plus interne)
+ a: Liste des nombres de points/cellules par cercle
+ rapport_R_T: Liste des rapports entre rayon et longueur de corde
+ debug: Active/désactive l'affichage des informations de débogage
+
+ Returns:
+ Liste des rayons des cercles générés
+ """
+ if n <= 0:
+ return []
+
+ rayon_n_cercles = [rayon_0] # Initialisation avec le premier rayon
+
+ if debug:
+ print(f"cercle 0: rayon = {rayon_0}\n")
+
+ for i in range(1, n):
+ rayon_precedent = rayon_n_cercles[i - 1]
+
+ # Sélection de l'indice correct pour a
+ a_idx = i - 1 if i < n - 1 or len(a) <= i - 1 else i - 2
+
+ # Facteur multiplicatif pour calculer l'incrément de rayon
+
+ # Calcul du nouveau rayon
+ sin_term = math.sin(math.pi / a[a_idx])
+ increment = rapport_R_T[i - 1] * 2 * sin_term * rayon_precedent
+ nouveau_rayon = rayon_precedent + increment
+ rayon_n_cercles.append(nouveau_rayon)
+
+ if debug:
+ print(f"cercle {i}:")
+ print(f"rayon précédent = {rayon_precedent}")
+ print(f"nouveau rayon = {nouveau_rayon}")
+ print(f"incrément = {increment}")
+ if i < n - 1:
+ ratio_calcule = (nouveau_rayon - rayon_precedent) / (2 * sin_term * rayon_precedent)
+ print(f"ratio R/T calculé = {ratio_calcule}")
+ print(f"ratio R/T attendu = {rapport_R_T[i]}")
+ else:
+ ratio_calcule = (nouveau_rayon - rayon_precedent) / (sin_term * rayon_precedent)
+ print(f"ratio R/T = {ratio_calcule}")
+ print(f"a[{a_idx}] = {a[a_idx]}\n")
+
+ return rayon_n_cercles
+
+
+
+
+
+#----------------------------------------------------------------------------------------------------#
+#---------- CRÉATION DES NOEUDS INITIAUX ------------------------------------------------------------#
+#----------------------------------------------------------------------------------------------------#
+
+def creer_noeuds_initiaux(n, rayon_n_cercles, a):
+ """Crée les nœuds initiaux sans fusion.
+
+ Args:
+ n: Nombre de cercles
+ rayon_n_cercles: Liste des rayons de chaque cercle
+ a: Liste des nombres de points/cellules par cercle
+
+ Returns:
+ Tuple contenant:
+ - Liste des noeuds en coordonnées polaires pour chaque cercle
+ - Nombre total de noeuds créés
+ """
+ k_noeuds_n_cercle_polaire = []
+ index_noeud = 0
+
+ # Fonction auxiliaire pour créer un nœud
+ def creer_noeud(r, theta, boundary=False, fixed=False):
+ nonlocal index_noeud
+ noeud = {
+ "r": r,
+ "theta": theta,
+ "index": index_noeud,
+ "initial": True,
+ "sam": False,
+ "boundary": boundary,
+ "fixed": fixed
+ }
+ index_noeud += 1
+ return noeud
+
+ for i in range(n):
+ rayon = rayon_n_cercles[i]
+ cercle_noeuds = []
+
+ if i == 0:
+ # Premier cercle - tous les nœuds sont fixes
+ cercle_noeuds = [
+ creer_noeud(
+ r=rayon,
+ theta=2 * math.pi * j / a[i],
+ fixed=True
+ ) for j in range(a[i])
+ ]
+
+ elif 0 < i < n - 1:
+ # Cercles intermédiaires
+ # D'abord les points alignés avec le cercle précédent
+ cercle_noeuds.extend([
+ creer_noeud(
+ r=rayon,
+ theta=2 * math.pi * j / a[i-1]
+ ) for j in range(a[i-1])
+ ])
+
+ # Puis les points propres à ce cercle
+ cercle_noeuds.extend([
+ creer_noeud(
+ r=rayon,
+ theta=2 * math.pi * j / a[i]
+ ) for j in range(a[i])
+ ])
+
+ else:
+ # Dernier cercle - tous les points sont sur la frontière
+ cercle_noeuds = [
+ creer_noeud(
+ r=rayon,
+ theta=2 * math.pi * j / a[i-1],
+ boundary=True
+ ) for j in range(a[i-1])
+ ]
+
+ k_noeuds_n_cercle_polaire.append(cercle_noeuds)
+
+ return k_noeuds_n_cercle_polaire, index_noeud
+
+
+
+#----------------------------------------------------------------------------------------------------#
+#------------- FUSION DES NOEUDS PROCHES ------------------------------------------------------------#
+#----------------------------------------------------------------------------------------------------#
+
+def fusionner_noeuds(k_noeuds_n_cercle_polaire, n, index_noeud_depart=0, seuil_distance=5):
+ """ Fusionne les nœuds qui se chevauchent.
+
+ Args:
+ k_noeuds_n_cercle_polaire: Liste des noeuds en coordonnées polaires
+ n: Nombre de cercles
+ index_noeud_depart: Index de départ pour les nouveaux noeuds créés
+ seuil_distance: Distance minimale entre deux noeuds pour les considérer distincts
+
+ Returns:
+ Tuple contenant:
+ - Liste mise à jour des noeuds en coordonnées polaires
+ - Dictionnaire de correspondance des indices fusionnés """
+
+ index_noeud = index_noeud_depart
+
+ # Trier chaque sous-liste par ordre croissant de theta
+ for i in range(len(k_noeuds_n_cercle_polaire)):
+ k_noeuds_n_cercle_polaire[i].sort(key=lambda noeud: noeud["theta"])
+
+ # Collecter tous les nœuds avec leur cercle d'origine
+ tous_noeuds = []
+ for i, cercle in enumerate(k_noeuds_n_cercle_polaire):
+ for noeud in cercle:
+ r = noeud["r"]
+ theta = noeud["theta"]
+ idx = noeud["index"]
+ initial = noeud["initial"]
+ sam = noeud["sam"]
+ boundary = noeud["boundary"]
+ fixed = noeud["fixed"]
+ x = r * math.cos(theta)
+ y = r * math.sin(theta)
+ tous_noeuds.append((x, y, r, theta, idx, i, initial, sam,boundary,fixed))
+
+ # Identifier les paires de nœuds qui se chevauchent
+ map_indices = {}
+ noeuds_a_fusionner = []
+
+ for i in range(len(tous_noeuds)):
+ x1, y1, r1, theta1, idx1, cercle1, initial1,sam1,boundary1,fixed1 = tous_noeuds[i]
+
+ for j in range(i + 1, len(tous_noeuds)):
+ x2, y2, r2, theta2, idx2, cercle2, initial2,sam2,boundary2,fixed2 = tous_noeuds[j]
+
+ # Distance entre les nœuds
+ distance = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
+
+ if distance < seuil_distance:
+ print(f"Nœuds à fusionner : {idx1} et {idx2} (distance={distance:.3f})")
+ noeuds_a_fusionner.append((i, j))
+
+ # Création des nouveaux nœuds
+ nouveaux_noeuds = []
+ indices_a_supprimer = set()
+
+ for i, j in noeuds_a_fusionner:
+ x1, y1, r1, theta1, idx1, cercle1, initial1,sam1,boundary1,fixed1 = tous_noeuds[i]
+ x2, y2, r2, theta2, idx2, cercle2, initial2,sam2,boundary2,fixed2 = tous_noeuds[j]
+
+ # Créer le nœud entre les deux
+ x_nouveau = (x1 + x2) / 2
+ y_nouveau = (y1 + y2) / 2
+ r_nouveau = math.sqrt(x_nouveau ** 2 + y_nouveau ** 2)
+ theta_nouveau = math.atan2(y_nouveau, x_nouveau)
+
+ if theta_nouveau < 0:
+ theta_nouveau += 2 * math.pi
+
+ nouvel_indice = index_noeud
+ index_noeud += 1
+
+ # Un nœud est initial seulement si tous les nœuds fusionnés sont initiaux
+ initial_nouveau = initial1 and initial2
+ boundary_nouveau = boundary1 or boundary2
+ sam_nouveau = False
+ fixed_nouveau = False
+ # Création du nouveau nœud
+ nouveau_noeud = {
+ "r": r_nouveau,
+ "theta": theta_nouveau,
+ "index": nouvel_indice,
+ "initial": initial_nouveau,
+ "sam":sam_nouveau,
+ "boundary":boundary_nouveau,
+ "fixed": fixed_nouveau
+ }
+
+ nouveaux_noeuds.append((nouveau_noeud, cercle1, cercle2))
+
+ map_indices[idx1] = nouvel_indice
+ map_indices[idx2] = nouvel_indice
+
+ indices_a_supprimer.add(i)
+ indices_a_supprimer.add(j)
+
+ # Reconstruction des nœuds sans ceux qui sont supprimés
+ nouveau_k_noeuds_n_cercle_polaire = [[] for _ in range(n)]
+
+ # Ajouter les nœuds non supprimés
+ for i, (x, y, r, theta, idx, cercle, initial, sam,boundary, fixed) in enumerate(tous_noeuds):
+ if i not in indices_a_supprimer:
+ nouveau_k_noeuds_n_cercle_polaire[cercle].append({
+ "r": r,
+ "theta": theta,
+ "index": idx,
+ "initial": initial,
+ "sam": sam,
+ "boundary": boundary,
+ "fixed": fixed
+ })
+
+ # Ajouter les nouveaux nœuds
+ for nouveau_noeud, cercle1, cercle2 in nouveaux_noeuds:
+ nouveau_k_noeuds_n_cercle_polaire[cercle1].append(nouveau_noeud.copy())
+ if cercle1 != cercle2:
+ nouveau_k_noeuds_n_cercle_polaire[cercle2].append(nouveau_noeud.copy())
+
+ # Trier à nouveau
+ for i in range(len(nouveau_k_noeuds_n_cercle_polaire)):
+ nouveau_k_noeuds_n_cercle_polaire[i].sort(key=lambda noeud: noeud["theta"])
+
+ print(f"Nombre de nouveaux nœuds créés: {len(nouveaux_noeuds)}")
+
+ return nouveau_k_noeuds_n_cercle_polaire, map_indices
+
+
+
+# ----------------------------------------------------------------------------------------------------#
+# ------------ CRÉATION DES CELLULES AVEC NOEUDS INTERMÉDIAIRES ---------------------------------------#
+# ----------------------------------------------------------------------------------------------------#
+def creer_cellules(rayon_n_cercles, k_noeuds_n_cercle_polaire, n, a):
+
+ """Crée des cellules à 4 nœuds entre cercles consécutifs.
+
+ Args:
+ rayon_n_cercles: Liste des rayons des cercles
+ k_noeuds_n_cercle_polaire: Coordonnées polaires des nœuds pour chaque cercle
+ n: Nombre de cercles
+ a: Liste des nombres de cellules entre chaque paire de cercles consécutifs
+
+ Returns:
+ Liste des cellules, chaque cellule étant définie par une liste de noeuds (indices)
+ """
+ # Fonction auxiliaire pour la comparaison d'angles
+ def angles_equivalents(a1, a2, tolerance=0.001):
+ a1_norm = a1 % (2 * math.pi)
+ a2_norm = a2 % (2 * math.pi)
+ diff = min(abs(a1_norm - a2_norm), 2 * math.pi - abs(a1_norm - a2_norm))
+ return diff < tolerance
+
+ # Fonction pour vérifier si un angle est entre deux autres
+ def est_entre_angles(theta, debut, fin, tolerance=0.001):
+ theta_norm = theta % (2 * math.pi)
+ debut_norm = debut % (2 * math.pi)
+ fin_norm = fin % (2 * math.pi)
+
+ if debut_norm <= fin_norm:
+ return debut_norm - tolerance <= theta_norm <= fin_norm + tolerance
+ else:
+ return theta_norm >= debut_norm - tolerance or theta_norm <= fin_norm + tolerance
+
+ # Prétraitement : indexer et trier les nœuds par angle pour chaque cercle
+ noeuds_par_cercle = []
+ for i in range(n):
+ if i < len(k_noeuds_n_cercle_polaire):
+ noeuds_par_cercle.append(sorted(k_noeuds_n_cercle_polaire[i], key=lambda noeud: noeud["theta"]))
+ else:
+ noeuds_par_cercle.append([])
+
+ cellules_temp = [] # Liste temporaire pour les cellules
+
+ # Création de la cellule centrale (cercle 0)
+ if n > 0 and len(k_noeuds_n_cercle_polaire) > 0:
+ noeuds_cercle_0 = [noeud["index"] for noeud in noeuds_par_cercle[0]]
+
+ cellule_centrale = {
+ "index": 0,
+ "noeuds": noeuds_cercle_0,
+ "boundary": 0,
+ "cell_type": 1,
+ "target_area": 100.0,
+ "lambda_celllength": 0,
+ "at_boundary": True,
+ "dead": False,
+ "target_length": 0,
+ "stiffness": 1,
+ "source": False,
+ "pin_fixed": False,
+ "area": 0.0,
+ "fixed": False,
+ "div_counter": 0,
+ "cercle": 0,
+ "angle": 0
+ }
+
+ cellules_temp.append(cellule_centrale)
+ print(f"Cellule centrale créée avec {len(noeuds_cercle_0)} noeuds")
+
+ # Création des cellules entre les cercles
+ for i in range(n - 1):
+ nb_cellules = a[i] if i < len(a) else a[-1]
+
+ for j in range(nb_cellules):
+ angle_j = 2 * j * math.pi / nb_cellules
+ angle_j_moins_1 = 2 * (j - 1) * math.pi / nb_cellules
+ if angle_j_moins_1 < 0:
+ angle_j_moins_1 += 2 * math.pi
+
+ # Variables pour stocker les informations des nœuds trouvés
+ noeud1, noeud2, noeud3, noeud4 = None, None, None, None
+ angle1, angle2, angle3, angle4 = None, None, None, None
+ r1, r2, r3, r4 = None, None, None, None
+ tolerance = 0.001
+
+ # Recherche optimisée des nœuds aux angles spécifiques
+ for point in noeuds_par_cercle[i]:
+ theta = point["theta"]
+ if noeud1 is None and angles_equivalents(theta, angle_j, tolerance):
+ noeud1, angle1, r1 = point["index"], theta, point["r"]
+ elif noeud2 is None and angles_equivalents(theta, angle_j_moins_1, tolerance):
+ noeud2, angle2, r2 = point["index"], theta, point["r"]
+
+ # Si les deux nœuds sont trouvés, on peut passer au cercle suivant
+ if noeud1 is not None and noeud2 is not None:
+ break
+
+ for point in noeuds_par_cercle[i + 1]:
+ theta = point["theta"]
+ if noeud3 is None and angles_equivalents(theta, angle_j_moins_1, tolerance):
+ noeud3, angle3, r3 = point["index"], theta, point["r"]
+ elif noeud4 is None and angles_equivalents(theta, angle_j, tolerance):
+ noeud4, angle4, r4 = point["index"], theta, point["r"]
+
+ if noeud3 is not None and noeud4 is not None:
+ break
+
+ # Si tous les nœuds principaux sont trouvés
+ if noeud1 is not None and noeud2 is not None and noeud3 is not None and noeud4 is not None:
+ # Calculer le centre de la cellule
+ x1, y1 = r1 * math.cos(angle1), r1 * math.sin(angle1)
+ x2, y2 = r2 * math.cos(angle2), r2 * math.sin(angle2)
+ x3, y3 = r3 * math.cos(angle3), r3 * math.sin(angle3)
+ x4, y4 = r4 * math.cos(angle4), r4 * math.sin(angle4)
+
+ centre_x = (x1 + x2 + x3 + x4) / 4
+ centre_y = (y1 + y2 + y3 + y4) / 4
+ angle_centre = math.atan2(centre_y, centre_x)
+ if angle_centre < 0:
+ angle_centre += 2 * math.pi
+
+ # Recherche des nœuds intermédiaires
+ noeuds_arc_sup = []
+ for point in noeuds_par_cercle[i]:
+ theta, index = point["theta"], point["index"]
+ if index != noeud1 and index != noeud2:
+ if (est_entre_angles(theta, angle2, angle1, tolerance) or
+ angles_equivalents(theta, angle1, tolerance) or
+ angles_equivalents(theta, angle2, tolerance)):
+ noeuds_arc_sup.append((theta, index))
+
+ noeuds_arc_sup.sort(reverse=True)
+ noeuds_arc_sup = [idx for _, idx in noeuds_arc_sup]
+
+ noeuds_arc_inf = []
+ for point in noeuds_par_cercle[i + 1]:
+ theta, index = point["theta"], point["index"]
+ if index != noeud3 and index != noeud4:
+ if (est_entre_angles(theta, angle3, angle4, tolerance) or
+ angles_equivalents(theta, angle3, tolerance) or
+ angles_equivalents(theta, angle4, tolerance)):
+ noeuds_arc_inf.append((theta, index))
+
+ noeuds_arc_inf.sort()
+ noeuds_arc_inf = [idx for _, idx in noeuds_arc_inf]
+
+ # Construction des noeuds de la cellule dans l'ordre
+ tous_noeuds = [noeud1] + noeuds_arc_sup + [noeud2, noeud3] + noeuds_arc_inf + [noeud4]
+
+ cellule = {
+ "index": len(cellules_temp),
+ "noeuds": tous_noeuds,
+ "boundary": 0,
+ "cell_type": 0 if i == n - 2 else (3 if i == 0 else 0),
+ "target_area": 100.0,
+ "lambda_celllength": 0,
+ "at_boundary": True if i == n - 2 else False,
+ "dead": False,
+ "target_length": 0,
+ "stiffness": 1,
+ "source": False,
+ "pin_fixed": False,
+ "area": 0.0,
+ "fixed": False,
+ "div_counter": 0,
+ "cercle": i + 1,
+ "angle": angle_centre
+ }
+
+ cellules_temp.append(cellule)
+ else:
+ print(f"Impossible de créer la cellule à i={i}, j={j}: nœuds manquants")
+ print(f"Nœuds trouvés: {noeud1}, {noeud2}, {noeud3}, {noeud4}")
+
+ # Organiser les cellules par cercle puis par angle
+ cellules_par_cercle = {}
+ for cellule in cellules_temp:
+ cercle = cellule.get("cercle", 0)
+ if cercle not in cellules_par_cercle:
+ cellules_par_cercle[cercle] = []
+ cellules_par_cercle[cercle].append(cellule)
+
+ # Trier et réassembler les cellules
+ cellules_triees = []
+ for cercle in sorted(cellules_par_cercle.keys()):
+ cellules_par_cercle[cercle].sort(key=lambda c: c.get("angle", 0))
+ cellules_triees.extend(cellules_par_cercle[cercle])
+
+ # Réindexer les cellules triées
+ cellules = []
+ for i, cellule in enumerate(cellules_triees):
+ cellule_copy = cellule.copy()
+ cellule_copy["index"] = i
+ cellules.append(cellule_copy)
+
+ print("cellules", cellules)
+ return cellules
+
+
+# ----------------------------------------------------------------------------------------------------#
+# ---------- RAFFINNAGE DU MAILLAGE (AJOUT DE NOEUDS) --------------------------------------------------------------#
+# ----------------------------------------------------------------------------------------------------#
+
+def raffiner_maillage_separe(k_noeuds_n_cercle_polaire, n, cellules, longueur_seuil_cercle, longueur_seuil_radial,
+ rayons_n_cercles, seuil_proximite):
+ # Copier les données initiales
+ nouveau_k_noeuds_n_cercle_polaire = [[] for _ in range(n)]
+ for i in range(min(n, len(k_noeuds_n_cercle_polaire))):
+ for noeud in k_noeuds_n_cercle_polaire[i]:
+ nouveau_k_noeuds_n_cercle_polaire[i].append(noeud.copy())
+
+ nouvelles_cellules = [cellule.copy() for cellule in cellules]
+
+ # Tableau pour stocker les nœuds intermédiaires radiaux (qui ne sont pas sur les cercles)
+ noeuds_radiaux = []
+
+ # Identifier les noeuds avec tag spécial
+ noeuds_speciaux = {}
+ for i_cercle, cercle in enumerate(nouveau_k_noeuds_n_cercle_polaire):
+ for noeud in cercle:
+ if noeud.get("tag_special", False):
+ r = noeud["r"]
+ theta = noeud["theta"]
+ x = r * math.cos(theta)
+ y = r * math.sin(theta)
+ noeuds_speciaux[noeud["index"]] = (x, y, r, theta)
+
+ # Phase 1: Remaillage des cercles (segments circulaires)
+ iterations_cercles = 0
+ segments_cercles_raffines = True
+
+ while segments_cercles_raffines and iterations_cercles < 5:
+ iterations_cercles += 1
+ segments_cercles_raffines = False
+
+ # Convertir en coordonnées cartésiennes pour le calcul des distances
+ noeuds_cartesien = {}
+ for i_cercle in range(len(nouveau_k_noeuds_n_cercle_polaire)):
+ for noeud in nouveau_k_noeuds_n_cercle_polaire[i_cercle]:
+ r = noeud["r"]
+ theta = noeud["theta"]
+ index = noeud["index"]
+ initial = noeud["initial"]
+ boundary = noeud["boundary"]
+ x = r * math.cos(theta)
+ y = r * math.sin(theta)
+ noeuds_cartesien[index] = (x, y, r, theta, i_cercle, initial, boundary)
+
+ # Ajouter les noeuds radiaux à la liste des noeuds cartésiens
+ for noeud in noeuds_radiaux:
+ r = noeud["r"]
+ theta = noeud["theta"]
+ index = noeud["index"]
+ initial = noeud["initial"]
+ boundary = noeud["boundary"]
+ x = r * math.cos(theta)
+ y = r * math.sin(theta)
+ noeuds_cartesien[index] = (x, y, r, theta, -1, initial, boundary) # -1 indique un noeud radial
+
+ # Dictionnaire pour stocker les nouveaux noeuds à ajouter sur les cercles
+ segments_cercles_a_raffiner = {}
+
+ # Vérifier les segments sur un même cercle
+ for i_cercle in range(n):
+ if i_cercle >= len(nouveau_k_noeuds_n_cercle_polaire):
+ continue
+
+ cercle_noeuds = nouveau_k_noeuds_n_cercle_polaire[i_cercle]
+ nb_noeuds = len(cercle_noeuds)
+
+ for i in range(nb_noeuds):
+ idx1 = cercle_noeuds[i]["index"]
+ idx2 = cercle_noeuds[(i + 1) % nb_noeuds]["index"]
+
+ if idx1 in noeuds_cartesien and idx2 in noeuds_cartesien:
+ x1, y1, r1, theta1, _, _, boundary1 = noeuds_cartesien[idx1]
+ x2, y2, r2, theta2, _, _, boundary2 = noeuds_cartesien[idx2]
+
+ # Distance euclidienne entre les deux noeuds
+ distance = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
+
+ if distance > longueur_seuil_cercle:
+ # Gestion de l'interpolation angulaire
+ if theta1 < 0: theta1 += 2 * math.pi
+ if theta2 < 0: theta2 += 2 * math.pi
+
+ # Gérer le cas où l'arc traverse la ligne θ=0
+ if abs(theta1 - theta2) > math.pi:
+ if theta1 > theta2:
+ theta2 += 2 * math.pi
+ else:
+ theta1 += 2 * math.pi
+
+ # Interpolation angulaire en respectant le rayon du cercle
+ theta_new = (theta1 + theta2) / 2
+ r_new = rayons_n_cercles[i_cercle] # Utiliser le rayon exact du cercle
+
+ # Normaliser l'angle entre 0 et 2π
+ if theta_new >= 2 * math.pi:
+ theta_new -= 2 * math.pi
+
+ # Calculer les coordonnées cartésiennes
+ x_new = r_new * math.cos(theta_new)
+ y_new = r_new * math.sin(theta_new)
+
+ # Vérifier proximité avec noeuds spéciaux
+ trop_proche = False
+ for _, (x_special, y_special, _, _) in noeuds_speciaux.items():
+ dist_special = math.sqrt((x_new - x_special) ** 2 + (y_new - y_special) ** 2)
+ if dist_special < seuil_proximite:
+ trop_proche = True
+ break
+
+ if not trop_proche:
+ # Hériter le statut boundary si au moins un des nœuds est boundary
+ is_boundary = boundary1 or boundary2
+ segments_cercles_a_raffiner[tuple(sorted([idx1, idx2]))] = (x_new, y_new, r_new, theta_new, i_cercle, is_boundary)
+ segments_cercles_raffines = True
+
+ # Assigner des indices aux nouveaux noeuds
+ indices_max = [noeud["index"] for cercle in nouveau_k_noeuds_n_cercle_polaire for noeud in cercle]
+ indices_max.extend([noeud["index"] for noeud in noeuds_radiaux])
+ prochain_indice = max(indices_max) + 1 if indices_max else 0
+
+ # Ajouter les nouveaux noeuds aux cercles et créer le mappage
+ map_segments_cercles_indices = {}
+ for segment_key, (x_new, y_new, r_new, theta_new, cercle, is_boundary) in segments_cercles_a_raffiner.items():
+ idx1, idx2 = segment_key
+
+ nouveau_noeud = {
+ "r": r_new,
+ "theta": theta_new,
+ "index": prochain_indice,
+ "initial": False, # Nouveau nœud intermédiaire
+ "sam": False,
+ "boundary": is_boundary, # Hériter le statut boundary
+ "fixed": False
+ }
+
+ # Ajouter au cercle correspondant
+ nouveau_k_noeuds_n_cercle_polaire[cercle].append(nouveau_noeud)
+
+ # Mapper le segment au nouvel indice pour mise à jour des cellules
+ map_segments_cercles_indices[segment_key] = prochain_indice
+ prochain_indice += 1
+
+ # Trier les noeuds de chaque cercle par angle
+ for i in range(n):
+ if i < len(nouveau_k_noeuds_n_cercle_polaire):
+ nouveau_k_noeuds_n_cercle_polaire[i].sort(key=lambda point: point["theta"])
+
+ # Mettre à jour les cellules
+ maj_cellules = []
+ for cellule in nouvelles_cellules:
+ nouvelle_liste_noeuds = []
+ noeuds = cellule["noeuds"]
+
+ for i in range(len(noeuds)):
+ idx1 = noeuds[i]
+ idx2 = noeuds[(i + 1) % len(noeuds)]
+
+ nouvelle_liste_noeuds.append(idx1)
+
+ # Vérifier si ce segment a été raffiné (cercle)
+ segment_key = tuple(sorted([idx1, idx2]))
+ if segment_key in map_segments_cercles_indices:
+ nouvelle_liste_noeuds.append(map_segments_cercles_indices[segment_key])
+
+ nouvelle_cellule = cellule.copy()
+ nouvelle_cellule["noeuds"] = nouvelle_liste_noeuds
+ maj_cellules.append(nouvelle_cellule)
+
+ nouvelles_cellules = maj_cellules
+
+ # Phase 2: Remaillage des segments radiaux entre nœuds UNIQUEMENT où des segments radiaux existent déjà
+ iterations_radiaux = 0
+ segments_radiaux_raffines = True
+
+ while segments_radiaux_raffines and iterations_radiaux < 5:
+ iterations_radiaux += 1
+ segments_radiaux_raffines = False
+
+ # Convertir en coordonnées cartésiennes pour le calcul des distances
+ noeuds_cartesien = {}
+ for i_cercle in range(len(nouveau_k_noeuds_n_cercle_polaire)):
+ for noeud in nouveau_k_noeuds_n_cercle_polaire[i_cercle]:
+ r = noeud["r"]
+ theta = noeud["theta"]
+ index = noeud["index"]
+ initial = noeud["initial"]
+ boundary = noeud["boundary"]
+ x = r * math.cos(theta)
+ y = r * math.sin(theta)
+ noeuds_cartesien[index] = (x, y, r, theta, i_cercle, initial, boundary)
+
+ # Ajouter les noeuds radiaux à la liste des noeuds cartésiens
+ for noeud in noeuds_radiaux:
+ r = noeud["r"]
+ theta = noeud["theta"]
+ index = noeud["index"]
+ initial = noeud["initial"]
+ boundary = noeud["boundary"]
+ x = r * math.cos(theta)
+ y = r * math.sin(theta)
+ noeuds_cartesien[index] = (x, y, r, theta, -1, initial, boundary)
+
+ # Collecter les segments radiaux existants dans les cellules
+ segments_radiaux_existants = set()
+ for cellule in nouvelles_cellules:
+ noeuds = cellule["noeuds"]
+ for i in range(len(noeuds)):
+ idx1 = noeuds[i]
+ idx2 = noeuds[(i + 1) % len(noeuds)]
+
+ if idx1 in noeuds_cartesien and idx2 in noeuds_cartesien:
+ x1, y1, r1, theta1, cercle1, _, _ = noeuds_cartesien[idx1]
+ x2, y2, r2, theta2, cercle2, _, _ = noeuds_cartesien[idx2]
+
+ # Vérifier si c'est un segment radial (rayons différents)
+ if abs(r1 - r2) > 0.001: # Tolérance pour éviter erreurs d'arrondi
+ segments_radiaux_existants.add(tuple(sorted([idx1, idx2])))
+
+ # Dictionnaire pour stocker les nouveaux nœuds à ajouter
+ segments_radiaux_a_raffiner = {}
+
+ # Pour chaque segment radial existant
+ for segment in segments_radiaux_existants:
+ idx1, idx2 = segment
+
+ if idx1 in noeuds_cartesien and idx2 in noeuds_cartesien:
+ x1, y1, r1, theta1, cercle1, initial1, boundary1 = noeuds_cartesien[idx1]
+ x2, y2, r2, theta2, cercle2, initial2, boundary2 = noeuds_cartesien[idx2]
+
+ # Distance euclidienne entre les deux noeuds
+ distance = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
+
+ # Si la distance est supérieure au seuil, on ajoute un nœud intermédiaire
+ if distance > longueur_seuil_radial:
+ # Calculer la position du nouveau nœud intermédiaire
+ x_new = (x1 + x2) / 2
+ y_new = (y1 + y2) / 2
+ r_new = math.sqrt(x_new**2 + y_new**2)
+ theta_new = math.atan2(y_new, x_new)
+ if theta_new < 0:
+ theta_new += 2 * math.pi
+
+ # Hériter le statut boundary si l'un des nœuds est boundary
+ is_boundary = boundary1 or boundary2
+
+ # Sauvegarder les coordonnées du nouveau nœud
+ segments_radiaux_a_raffiner[segment] = (x_new, y_new, r_new, theta_new, is_boundary)
+ segments_radiaux_raffines = True
+
+ # Assigner des indices aux nouveaux noeuds radiaux
+ indices_max = [noeud["index"] for cercle in nouveau_k_noeuds_n_cercle_polaire for noeud in cercle]
+ indices_max.extend([noeud["index"] for noeud in noeuds_radiaux])
+ prochain_indice = max(indices_max) + 1 if indices_max else 0
+
+ # Créer les nouveaux noeuds radiaux
+ map_segments_radiaux_indices = {}
+ for segment_key, (x_new, y_new, r_new, theta_new, is_boundary) in segments_radiaux_a_raffiner.items():
+ idx1, idx2 = segment_key
+
+ nouveau_noeud = {
+ "r": r_new,
+ "theta": theta_new,
+ "index": prochain_indice,
+ "initial": False, # Nouveau nœud intermédiaire
+ "sam": False,
+ "boundary": False, # Hériter le statut boundary
+ "fixed": False
+ }
+
+ # Ajouter aux nœuds radiaux
+ noeuds_radiaux.append(nouveau_noeud)
+
+ # Mapper le segment au nouvel indice pour mise à jour des cellules
+ map_segments_radiaux_indices[segment_key] = prochain_indice
+ prochain_indice += 1
+
+ # Mettre à jour les cellules avec les nouveaux noeuds radiaux
+ maj_cellules = []
+ for cellule in nouvelles_cellules:
+ nouvelle_liste_noeuds = []
+ noeuds = cellule["noeuds"]
+
+ for i in range(len(noeuds)):
+ idx1 = noeuds[i]
+ idx2 = noeuds[(i + 1) % len(noeuds)]
+
+ nouvelle_liste_noeuds.append(idx1)
+
+ # Vérifier si ce segment a été raffiné (radialement)
+ segment_key = tuple(sorted([idx1, idx2]))
+ if segment_key in map_segments_radiaux_indices:
+ nouvelle_liste_noeuds.append(map_segments_radiaux_indices[segment_key])
+
+ nouvelle_cellule = cellule.copy()
+ nouvelle_cellule["noeuds"] = nouvelle_liste_noeuds
+ maj_cellules.append(nouvelle_cellule)
+
+ nouvelles_cellules = maj_cellules
+
+ k_noeuds_n_cercle_polaire_final = []
+ for cercle in nouveau_k_noeuds_n_cercle_polaire:
+ k_noeuds_n_cercle_polaire_final.append(cercle)
+
+ # Créer un cercle virtuel pour les noeuds radiaux (permet de rester compatible avec le format attendu)
+ if noeuds_radiaux:
+ k_noeuds_n_cercle_polaire_final.append(noeuds_radiaux)
+
+ return k_noeuds_n_cercle_polaire_final, nouvelles_cellules
+
+
+
+
+
+
+#----------------------------------------------------------------------------------------------------#
+#-------------------------------------walls-------------------------------------------#
+#----------------------------------------------------------------------------------------------------#
+
+def generer_walls_initiaux(k_noeuds_n_cercle_cartesien, cellules_list):
+ """
+ Génère les walls (parois) entre les cellules adjacentes.
+
+ Args:
+ k_noeuds_n_cercle_cartesien: Liste des noeuds en coordonnées cartésiennes
+ cellules_list: Liste des cellules
+
+ Returns:
+ Liste des walls générés
+ """
+ # Créer un dictionnaire pour accès rapide aux noeuds
+ noeuds_dict = {}
+ for noeud in k_noeuds_n_cercle_cartesien:
+ noeuds_dict[noeud["index"]] = (noeud["x"], noeud["y"], noeud.get("initial", False),
+ noeud.get("boundary", False))
+
+ # Identifier les segments et les cellules qui les partagent
+ segments_par_cellule = {}
+ for cellule in cellules_list:
+ noeuds = cellule["noeuds"]
+ cell_index = cellule["index"]
+
+ # Pour chaque paire de noeuds consécutifs
+ for i in range(len(noeuds)):
+ n1 = noeuds[i]
+ n2 = noeuds[(i + 1) % len(noeuds)]
+ segment = tuple(sorted([n1, n2]))
+
+ # Ajouter la cellule à ce segment
+ if segment not in segments_par_cellule:
+ segments_par_cellule[segment] = []
+ segments_par_cellule[segment].append(cell_index)
+
+ # Générer les walls uniquement pour les segments partagés par deux cellules
+ walls_liste = []
+ wall_index = 0
+
+ for segment, cellules in segments_par_cellule.items():
+ # Un wall ne peut exister qu'entre deux cellules
+ if len(cellules) == 2:
+ n1, n2 = segment
+ c1, c2 = sorted(cellules)
+
+ # Vérifier que les noeuds existent et sont initiaux
+ if n1 in noeuds_dict and n2 in noeuds_dict:
+ _, _, initial1, boundary1 = noeuds_dict[n1]
+ _, _, initial2, boundary2 = noeuds_dict[n2]
+
+ # Vérifier que les deux noeuds sont initiaux
+ if initial1 and initial2:
+ # Ne pas créer de wall si les deux noeuds sont sur la frontière
+ if boundary1 and boundary2:
+ continue
+
+ # Calculer la longueur du wall
+ (x1, y1, _, _), (x2, y2, _, _) = noeuds_dict[n1], noeuds_dict[n2]
+ longueur = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
+
+ # Créer le wall avec exactement la structure demandée
+ wall = {
+ "length": f"{longueur:.4f}",
+ "c1": str(c1),
+ "c2": str(c2),
+ "n1": str(n1),
+ "n2": str(n2),
+ "wall_type": "normal",
+ "viz_flux": "0",
+ "index": str(wall_index)
+ }
+
+ walls_liste.append(wall)
+ wall_index += 1
+
+ return walls_liste
+
+
+#----------------------------------------------------------------------------------------------------#
+#------------------------- Aire cellules ---------------------------------------------------------------------#
+#----------------------------------------------------------------------------------------------------#
+
+def shoelace_formula(cellules_list, noeuds_list, absoluteValue=True):
+ """
+ Calcule l'aire de chaque cellule en utilisant la formule de Shoelace (Gauss).
+
+ Args:
+ cellules_list: Liste des cellules à traiter
+ noeuds_list: Liste des noeuds avec leurs coordonnées
+ absoluteValue: Si True, retourne la valeur absolue de l'aire
+
+ Returns:
+ Liste des cellules avec l'aire calculée
+ """
+ # Optimisation par précalcul du dictionnaire de coordonnées
+ noeuds_dict = {}
+ for noeud in noeuds_list:
+ noeuds_dict[noeud["index"]] = (noeud["x"], noeud["y"])
+
+ # Préallocation de la liste de résultat
+ n_cellules = len(cellules_list)
+ cellules_avec_aire = [None] * n_cellules
+
+ # Traitement optimisé par cellule
+ for i, cellule in enumerate(cellules_list):
+ indices_noeuds = cellule["noeuds"]
+ nb_noeuds = len(indices_noeuds)
+
+ # Traitement rapide des polygones dégénérés
+ if nb_noeuds < 3:
+ cellule_maj = cellule.copy()
+ cellule_maj["area"] = 0.0
+ cellules_avec_aire[i] = cellule_maj
+ continue
+
+ # Extraction optimisée des coordonnées avec gestion d'erreur intégrée
+ try:
+ # Extraction en une seule fois pour éviter les accès répétés
+ coords = [noeuds_dict[idx] for idx in indices_noeuds]
+
+ # Boucle unifiée pour le calcul de l'aire (sans allocation supplémentaire)
+ somme = 0.0
+ for j in range(nb_noeuds):
+ k = (j + 1) % nb_noeuds
+ # Formule de Shoelace optimisée
+ somme += coords[j][0] * coords[k][1] - coords[k][0] * coords[j][1]
+
+ # Calcul final avec une seule multiplication
+ aire = abs(somme * 0.5) if absoluteValue else somme * 0.5
+
+ except KeyError:
+ # En cas d'indice invalide, attribuer une aire nulle
+ aire = 0.0
+
+ # Minimiser les copies en utilisant copy() au lieu de deepcopy()
+ cellule_maj = cellule.copy()
+ cellule_maj["area"] = aire
+ cellules_avec_aire[i] = cellule_maj
+
+ return cellules_avec_aire
+
+
+def calculer_aire_totale_boundary(noeuds_list, absoluteValue=True):
+ """
+ Calcule l'aire totale du tissu en utilisant uniquement les noeuds marqués comme boundary.
+ Version optimisée.
+
+ Args:
+ noeuds_list: Liste des noeuds avec leurs coordonnées
+ absoluteValue: Si True, retourne la valeur absolue de l'aire
+
+ Returns:
+ Aire totale du tissu délimité par les noeuds boundary
+ """
+ # Extraction directe des noeuds boundary (plus efficace qu'une compréhension de liste)
+ noeuds_boundary = []
+ for noeud in noeuds_list:
+ if noeud.get("boundary", False):
+ noeuds_boundary.append(noeud)
+
+ # Vérification rapide du nombre de noeuds
+ n_noeuds = len(noeuds_boundary)
+ if n_noeuds < 3:
+ return 0.0
+
+ # Calcul du véritable centroïde (dans la version originale, il était initialisé à 0,0)
+ centre_x = sum(noeud["x"] for noeud in noeuds_boundary) / n_noeuds
+ centre_y = sum(noeud["y"] for noeud in noeuds_boundary) / n_noeuds
+
+ # Pré-calcul des angles pour le tri (évite les calculs répétés)
+ noeuds_avec_angle = []
+ for noeud in noeuds_boundary:
+ dx = noeud["x"] - centre_x
+ dy = noeud["y"] - centre_y
+ angle = math.atan2(dy, dx)
+ if angle < 0:
+ angle += 2 * math.pi
+ noeuds_avec_angle.append((noeud, angle))
+
+ # Tri efficace
+ noeuds_avec_angle.sort(key=lambda x: x[1])
+
+ # Préextraction des coordonnées pour un accès plus rapide
+ coords_x = []
+ coords_y = []
+ for noeud, _ in noeuds_avec_angle:
+ coords_x.append(noeud["x"])
+ coords_y.append(noeud["y"])
+
+ # Formule de Shoelace optimisée en une seule passe
+ aire = 0.0
+ for i in range(n_noeuds):
+ j = (i + 1) % n_noeuds
+ # Version optimisée de la formule
+ aire += (coords_x[i] * coords_y[j]) - (coords_x[j] * coords_y[i])
+
+ # Division par 2 une seule fois à la fin
+ aire *= 0.5
+
+ return abs(aire) if absoluteValue else aire
+
+#----------------------------------------------------------------------------------------------------#
+#--------- VISUALISATION DES POINTS ET CERCLES ------------------------------------------------------#
+#----------------------------------------------------------------------------------------------------#
+
+def tracer_points_cercles(k_noeuds, n, a, cellules=None):
+ """ Visualise les noeuds, les cercles et les segments radiaux.
+
+ Args:
+ k_noeuds_n_cercle_polaire: Liste des noeuds en coordonnées polaires
+ n: Nombre de cercles
+ a: Liste des nombres de cellules/points par cercle
+
+ Returns:
+ None. Affiche un graphique avec matplotlib. """
+
+ plt.figure(figsize=(10, 10))
+
+ # Couleurs différentes pour chaque cercle
+ couleurs = ['r', 'g', 'b', 'm', 'c', 'y', 'k', 'orange', 'purple', 'brown']
+ couleur_radiale = 'gray' # Couleur pour les segments radiaux
+ est_format_cartesien = not isinstance(k_noeuds[0], list)
+ # Grouper les noeuds par rayon pour identifier les cercles
+ noeuds_par_rayon = {}
+ if est_format_cartesien:
+ # Traitement des noeuds cartésiens (liste plate)
+ for noeud in k_noeuds:
+ # Calculer r pour le groupement
+ if "r" in noeud:
+ r = noeud["r"]
+ else:
+ r = math.sqrt(noeud["x"] ** 2 + noeud["y"] ** 2)
+
+ if r not in noeuds_par_rayon:
+ noeuds_par_rayon[r] = []
+
+ # S'assurer que les coordonnées cartésiennes sont présentes
+ if "x" not in noeud or "y" not in noeud:
+ noeud["x"] = r * math.cos(noeud["theta"])
+ noeud["y"] = r * math.sin(noeud["theta"])
+
+ noeuds_par_rayon[r].append(noeud)
+ else:
+ # Traitement original pour les noeuds polaires (liste de listes)
+ for i_cercle in range(len(k_noeuds)):
+ for point in k_noeuds[i_cercle]:
+ r = point["r"]
+ if r not in noeuds_par_rayon:
+ noeuds_par_rayon[r] = []
+
+ # Ajouter les coordonnées cartésiennes calculées
+ x = r * math.cos(point["theta"])
+ y = r * math.sin(point["theta"])
+ point_avec_xy = point.copy()
+ point_avec_xy["x"] = x
+ point_avec_xy["y"] = y
+ noeuds_par_rayon[r].append(point_avec_xy)
+
+ # Dictionnaire pour accès rapide aux coordonnées
+ noeuds_dict = {}
+ for rayon, points in noeuds_par_rayon.items():
+ for point in points:
+ noeuds_dict[point["index"]] = (point["x"], point["y"], rayon)
+
+
+ # Segments déjà tracés (pour éviter les doublons)
+ segments_traces = set()
+
+ # Tracer chaque cercle et ses points
+ for i, (rayon, points) in enumerate(sorted(noeuds_par_rayon.items())):
+ # Séparer les nœuds initiaux des nœuds raffinés
+ points_initiaux = [point for point in points if point.get("initial", False)]
+ points_raffines = [point for point in points if not point.get("initial", False)]
+
+ # Tracer les points initiaux
+ x_init = [p["x"] for p in points_initiaux]
+ y_init = [p["y"] for p in points_initiaux]
+ indices_init = [p["index"] for p in points_initiaux]
+ if x_init:
+ plt.scatter(x_init, y_init, color=couleurs[i % len(couleurs)], marker='o',
+ label=f'Cercle {i} (initial)' if i == 0 else "")
+
+ # Tracer les points raffinés
+ x_raff = [p["x"] for p in points_raffines]
+ y_raff = [p["y"] for p in points_raffines]
+ indices_raff = [p["index"] for p in points_raffines]
+ if x_raff:
+ plt.scatter(x_raff, y_raff, color=couleurs[i % len(couleurs)], marker='x',
+ label=f'Cercle {i} (raffiné)' if i == 0 else "")
+
+ # Afficher les indices des nœuds
+ for j in range(len(x_init)):
+ plt.text(x_init[j] + 0.3, y_init[j] + 0.3, str(indices_init[j]), fontsize=8,
+ bbox=dict(facecolor='white', alpha=0.7, edgecolor='none'))
+ for j in range(len(x_raff)):
+ plt.text(x_raff[j] + 0.3, y_raff[j] + 0.3, str(indices_raff[j]), fontsize=8,
+ bbox=dict(facecolor='lightyellow', alpha=0.7, edgecolor='none'))
+
+ # Tracer les segments à partir des cellules
+ if cellules:
+ rayons_tries = sorted(noeuds_par_rayon.keys())
+ for cellule in cellules:
+ noeuds = cellule["noeuds"]
+ for i in range(len(noeuds)):
+ idx1 = noeuds[i]
+ idx2 = noeuds[(i + 1) % len(noeuds)]
+
+ segment_key = tuple(sorted([idx1, idx2]))
+ if segment_key in segments_traces:
+ continue
+
+ if idx1 in noeuds_dict and idx2 in noeuds_dict:
+ x1, y1, rayon1 = noeuds_dict[idx1]
+ x2, y2, rayon2 = noeuds_dict[idx2]
+
+ # Tracer le segment selon le type
+ if rayon1 == rayon2: # Segment sur le même cercle
+ i_couleur = rayons_tries.index(rayon1) % len(couleurs)
+ plt.plot([x1, x2], [y1, y2],
+ color=couleurs[i_couleur],
+ linestyle='-', linewidth=1)
+ else: # Segment radial
+ plt.plot([x1, x2], [y1, y2],
+ color=couleur_radiale,
+ linestyle='--', linewidth=0.8)
+
+ segments_traces.add(segment_key)
+
+ plt.grid(True)
+ plt.axis('equal')
+ plt.title('Visualisation des cercles (o=initial, x=raffiné)')
+ plt.xlabel('x')
+ plt.ylabel('y')
+ plt.show()
+
+
+
+
+#----------------------------------------------------------------------------------------------------#
+#---------- VISUALISATION DES CELLULES --------------------------------------------------------------#
+#----------------------------------------------------------------------------------------------------#
+def tracer_cellules(points, cellules):
+ """ Visualise les cellules avec leur indice au centre.
+
+ Args:
+ k_noeuds_n_cercle_cartesien: Liste des noeuds en coordonnées cartésiennes
+ cellules: Liste des cellules définies par leurs indices de noeuds
+
+ Returns:
+ None. Affiche un graphique avec matplotlib. """
+
+ plt.figure(figsize=(10, 10))
+
+ # Couleurs différentes pour colorer les cellules par groupe
+ couleurs = ['r', 'g', 'b', 'm', 'c', 'y', 'k', 'orange', 'purple', 'brown']
+
+
+ noeuds_dict = {} # Créer un dictionnaire pour accéder rapidement aux coordonnées des noeuds
+ noeuds_initiaux = set() # Pour distinguer les noeuds initiaux des noeuds raffinés
+
+ for point in points:
+ if isinstance(point, dict) and "index" in point:
+ # Récupérer les coordonnées cartésiennes du point
+ if "x" in point and "y" in point:
+ noeuds_dict[point["index"]] = (point["x"], point["y"])
+ elif "r" in point and "theta" in point:
+ # Convertir de polaire à cartésien
+ r = point["r"]
+ theta = point["theta"]
+ x = r * math.cos(theta)
+ y = r * math.sin(theta)
+ noeuds_dict[point["index"]] = (x, y)
+
+ # Marquer les noeuds initiaux
+ if point.get("initial", False):
+ noeuds_initiaux.add(point["index"])
+
+ # Identifier les rayons pour grouper les cellules (code existant)
+ rayons_cellules = {}
+ for cellule in cellules:
+ # Code de groupement inchangé
+ cell_type = cellule.get("cell_type", 0)
+ if cell_type not in rayons_cellules:
+ rayons_cellules[cell_type] = []
+ rayons_cellules[cell_type].append(cellule)
+
+ # Tracer les polygones des cellules
+ for i, (rayon, groupe_cellules) in enumerate(sorted(rayons_cellules.items())):
+ couleur = couleurs[i % len(couleurs)]
+ for cellule in groupe_cellules:
+ # Récupérer les coordonnées des noeuds de la cellule
+ coords = []
+ for noeud_idx in cellule["noeuds"]:
+ if noeud_idx in noeuds_dict:
+ coords.append(noeuds_dict[noeud_idx])
+
+ # Tracer le polygone
+ if len(coords) >= 3:
+ xs, ys = zip(*coords)
+ plt.fill(xs, ys, alpha=0.5, color=couleur, edgecolor='black')
+
+ # Ajouter l'indice de la cellule au centre
+ centre_x = sum(xs) / len(xs)
+ centre_y = sum(ys) / len(ys)
+ plt.text(centre_x, centre_y, str(cellule["index"]),
+ ha='center', va='center', fontweight='bold')
+
+ # Tracer tous les noeuds
+ for noeud_idx, (x, y) in noeuds_dict.items():
+ # Utiliser un marqueur différent selon le type de noeud
+ marker = 'o' if noeud_idx in noeuds_initiaux else 'x'
+ plt.scatter(x, y, color='black', marker=marker, s=30, zorder=3)
+ plt.text(x + 0.2, y + 0.2, str(noeud_idx), fontsize=8,
+ bbox=dict(facecolor='white', alpha=0.7, edgecolor='none'))
+
+ # Tracer les segments entre noeuds consécutifs de chaque cellule
+ segments_traces = set()
+ for cellule in cellules:
+ noeuds = cellule["noeuds"]
+ for i in range(len(noeuds)):
+ idx1 = noeuds[i]
+ idx2 = noeuds[(i + 1) % len(noeuds)]
+
+ segment_key = tuple(sorted([idx1, idx2]))
+ if segment_key not in segments_traces and idx1 in noeuds_dict and idx2 in noeuds_dict:
+ x1, y1 = noeuds_dict[idx1]
+ x2, y2 = noeuds_dict[idx2]
+ plt.plot([x1, x2], [y1, y2], 'k-', linewidth=1, alpha=0.7, zorder=2)
+ segments_traces.add(segment_key)
+
+ plt.grid(True)
+ plt.axis('equal')
+ plt.title('Visualisation des cellules avec noeuds intermédiaires')
+ plt.xlabel('x')
+ plt.ylabel('y')
+ plt.show()
+
+
+
+#----------------------------------------------------------------------------------------------------#
+#------------------------- MAIN ---------------------------------------------------------------------#
+#----------------------------------------------------------------------------------------------------#
+""" Programme principal. """
+
+
+def generer_donnees():
+ rayon_0 = 200
+ a = [25,25,30]
+ n = len(a)+1
+ rapport_R_T = [1,0.5,0.5]
+ seuil_proximite = 1
+ longueur_max_cercles = 10 # Seuil pour les segments circulaires
+ longueur_max_radiaux = 10 # Seuil pour les segments radiaux
+ maillage = True
+
+ rayons_n_cercles = n_cercles(n, rayon_0, a, rapport_R_T)
+ k_noeuds_n_cercle_polaire_initial, index_noeud_max = creer_noeuds_initiaux(n, rayons_n_cercles, a)
+ k_noeuds_n_cercle_polaire, map_indices = fusionner_noeuds(k_noeuds_n_cercle_polaire_initial, n, index_noeud_max)
+ cellules_list = creer_cellules(rayons_n_cercles, k_noeuds_n_cercle_polaire, n, a)
+ if not(maillage):
+
+ #Walls
+ k_noeuds_n_cercle_cartesien = polaire_vers_cartesien(k_noeuds_n_cercle_polaire)
+ liste_walls = generer_walls_initiaux(k_noeuds_n_cercle_cartesien, cellules_list)
+ cellules_finales = shoelace_formula(cellules_list, k_noeuds_n_cercle_cartesien)
+ basearea = calculer_aire_totale_boundary(k_noeuds_n_cercle_cartesien) / (len(cellules_finales))
+ #Tracé
+ # tracer_points_cercles(k_noeuds_n_cercle_polaire, n, a, cellules_list)
+ # tracer_cellules(polaire_vers_cartesien(k_noeuds_n_cercle_polaire, n, a), cellules_list)
+ #
+ # print(f"Aire totale du tissu : {basearea:.4f}")
+
+ return k_noeuds_n_cercle_cartesien, cellules_finales, liste_walls, basearea
+
+ else :
+ k_noeuds_n_cercle_polaire_raffine, cellules_list_raffine = raffiner_maillage_separe(
+ k_noeuds_n_cercle_polaire, n, cellules_list,
+ longueur_max_cercles, longueur_max_radiaux,
+ rayons_n_cercles, seuil_proximite
+ )
+
+ #Walls
+ k_noeuds_n_cercle_cartesien_raffine = polaire_vers_cartesien(k_noeuds_n_cercle_polaire_raffine)
+ liste_walls = generer_walls_initiaux(k_noeuds_n_cercle_cartesien_raffine, cellules_list_raffine)
+ cellules_finales = shoelace_formula(cellules_list_raffine, k_noeuds_n_cercle_cartesien_raffine)
+ basearea = calculer_aire_totale_boundary(k_noeuds_n_cercle_cartesien_raffine) / (len(cellules_finales))
+ print(f"Aire totale du tissu : {basearea:.4f}")
+
+ # Tracé
+ k_noeuds_n_cercle_cartesien_raffine = polaire_vers_cartesien(k_noeuds_n_cercle_polaire_raffine)
+ tracer_points_cercles(k_noeuds_n_cercle_polaire_raffine, n, a, cellules_list_raffine)
+ # tracer_cellules(polaire_vers_cartesien(k_noeuds_n_cercle_polaire_raffine, n, a), cellules_list_raffine)
+
+ return k_noeuds_n_cercle_cartesien_raffine, cellules_finales, liste_walls, basearea
+
+
+
+
+
+ # k_noeuds_renommes, cellules_renommees, walls_renommes = reindexer_noeuds_par_cellule(
+ # k_noeuds_n_cercle_cartesien_raffine,
+ # cellules_list_raffine,
+ # liste_walls
+ # )
+
+
+
+
+
+
+
+
+
+
+
+
+generer_donnees()
\ No newline at end of file
diff --git a/src/GUI/VirtualLeaf.cpp b/src/GUI/VirtualLeaf.cpp
index 4ba2b3ea..ab2f1bd4 100755
--- a/src/GUI/VirtualLeaf.cpp
+++ b/src/GUI/VirtualLeaf.cpp
@@ -185,7 +185,7 @@ void MainBase::Plot(int resize_stride)
PNGname.width(6);
PNGname << count << ".png";
// Write high-res PNG snapshot every plot step
- Save(PNGname.str().c_str(), "PNG", 1024, 768);
+ Save(PNGname.str().c_str(), "PNG", 2560, 2560);
//}
}
@@ -206,7 +206,7 @@ void MainBase::Plot(int resize_stride)
PDFname.width(6);
PDFname << count << ".pdf";
// Write PDF snapshot with every xml file
- Save(PDFname.str().c_str(), "PDF", 1024, 768);
+ Save(PDFname.str().c_str(), "PDF", 2560, 1440);
}
}
diff --git a/src/GUI/cell.cpp b/src/GUI/cell.cpp
index a8efe353..ecb66209 100755
--- a/src/GUI/cell.cpp
+++ b/src/GUI/cell.cpp
@@ -20,7 +20,6 @@
*/
#include
-
#include
#include "pi.h"
#include "cell.h"
@@ -33,6 +32,7 @@
#include "qcanvasarrow.h"
#include "parameter.h"
+// Division type enumeration
static const std::string _module_id("$Id$");
@@ -78,8 +78,8 @@ void Cell::DivideOverAxis(Vector axis)
if (dead) return;
- Vector centroid=Centroid();
- double prev_cross_z=(axis * (centroid - *(nodes.back()) ) ).z ;
+ Vector centroid = Centroid();
+ double prev_cross_z = (axis * (centroid - *(nodes.back()))).z ;
ItList new_node_locations;
@@ -88,12 +88,12 @@ void Cell::DivideOverAxis(Vector axis)
// cross product to detect position of division
Vector cross = axis * (centroid - *(*i));
- if (cross.z * prev_cross_z < 0 ) {
+ if (cross.z * prev_cross_z < 0) {
new_node_locations.push_back(i);
}
- prev_cross_z=cross.z;
+ prev_cross_z = cross.z;
}
DivideWalls(new_node_locations, centroid, centroid+axis);
@@ -469,6 +469,8 @@ void Cell::DivideWalls(ItList new_node_locations, const Vector from, const Vecto
parent_info.polarization.Normalise();
parent_info.PINmembrane = SumTransporters(1);
parent_info.PINendosome = Chemical(1);
+ parent_info.ParentCellType = CellType();
+ parent_info.ParentCentroid = Centroid();
//cerr << "Parent polarization before division: " << parent_info.polarization << endl;
@@ -2306,5 +2308,56 @@ void Cell::correctNeighbors() {
double Cell::elastic_limit() {
return this->m->elastic_limit;
}
+Vector Cell::CalculateDivisionPlane()
+{
+ Vector div_vec;
+
+ switch (division_type) {
+ case NO_DIVISION:
+ // No division, return empty vector
+ return Vector(0, 0, 0);
+
+ case RANDOM_DIVISION:
+ // Random division vector
+ div_vec = Vector(RANDOM() - 0.5, RANDOM() - 0.5, 0);
+ div_vec.Normalise();
+ return div_vec;
+
+ case MAX_STRESS_AXIS: {
+ // Calculate principal stress axis for this cell
+ Vector max_stress_axis = CalculatePrincipalStressAxis();
+
+ return max_stress_axis;
+ }
+ case SHORT_AXIS: {
+ // Use the short axis of the cell for division
+ Vector long_axis;
+ double width;
+ Length(&long_axis, &width);
+ return long_axis.Perp2D(); // Perpendicular to long axis = short axis
+ }
+
+ case LONG_AXIS: {
+ // Use the long axis of the cell for division
+ Vector long_axis;
+ double width;
+ Length(&long_axis, &width);
+ return long_axis;
+ }
+
+
+ case PERP_STRESS: {
+ // Calculate principal stress axis and return its perpendicular
+ Vector max_stress_axis = CalculatePrincipalStressAxis();
+ return max_stress_axis.Perp2D();
+ }
+
+ default:
+ // Default to random division
+ div_vec = Vector(RANDOM() - 0.5, RANDOM() - 0.5, 0);
+ div_vec.Normalise();
+ return div_vec;
+ }
+}
/* finis */
diff --git a/src/GUI/cell.h b/src/GUI/cell.h
index 2851ebd0..789bf3c0 100755
--- a/src/GUI/cell.h
+++ b/src/GUI/cell.h
@@ -34,6 +34,8 @@
#include "warning.h"
#include "cellbase.h"
#include "Neighbor.h"
+#include "random.h"
+#include "pi.h"
//#include "cell.h"
#include
@@ -94,11 +96,70 @@ class Cell : public CellBase
// divide over the line (if line and cell intersect)
bool DivideOverGivenLine(const Vector v1, const Vector v2, bool wall_fixed = false, NodeSet *node_set = 0);
- void Divide(void) { // Divide cell over short axis
-
- Vector long_axis;
- Length(&long_axis);
- DivideOverAxis(long_axis.Perp2D());
+ void Divide(void) { // Divide cell based on division_type
+ std::cout << "Cell " << index << ": Starting division process" << std::endl;
+ Vector axis;
+ Length(&axis); // Get the long axis
+ std::cout << "Cell " << index << ": Long axis = (" << axis.x << ", " << axis.y << ", " << axis.z << ")" << std::endl;
+
+ switch (division_type) {
+ case NO_DIVISION:
+ std::cout << "Cell " << index << ": Division type = NO_DIVISION, skipping" << std::endl;
+ return;
+ case RANDOM_DIVISION:
+ {
+ std::cout << "Cell " << index << ": Division type = RANDOM_DIVISION" << std::endl;
+ // Random angle between 0 and π
+ double orientation = Pi*RANDOM();
+ Vector divAxis(sin(orientation), cos(orientation), 0.);
+ std::cout << "Cell " << index << ": Random division axis = (" << divAxis.x << ", " << divAxis.y << ", " << divAxis.z << "), orientation = " << orientation << std::endl;
+ DivideOverAxis(divAxis);
+ }
+ break;
+ case MAX_STRESS_AXIS:
+ std::cout << "Cell " << index << ": Division type = MAX_STRESS_AXIS" << std::endl;
+ // Calculate principal stress axis and divide along it
+ {
+ Vector stressAxis = CalculateDivisionPlane();
+ std::cout << "Cell " << index << ": Stress division axis = (" << stressAxis.x << ", " << stressAxis.y << ", " << stressAxis.z << ")" << std::endl;
+ DivideOverAxis(stressAxis);
+ }
+ break;
+ case SHORT_AXIS:
+ std::cout << "Cell " << index << ": Division type = SHORT_AXIS" << std::endl;
+ // Divide over short axis (perpendicular to long axis)
+ {
+ Vector shortAxis = axis.Perp2D();
+ std::cout << "Cell " << index << ": Short axis = (" << shortAxis.x << ", " << shortAxis.y << ", " << shortAxis.z << ")" << std::endl;
+ DivideOverAxis(shortAxis);
+ }
+ break;
+ case LONG_AXIS:
+ std::cout << "Cell " << index << ": Division type = LONG_AXIS" << std::endl;
+ // Divide over long axis
+ std::cout << "Cell " << index << ": Using long axis for division" << std::endl;
+ DivideOverAxis(axis);
+ break;
+ case PERP_STRESS:
+ std::cout << "Cell " << index << ": Division type = PERP_STRESS" << std::endl;
+ // Divide perpendicular to principal stress
+ {
+ Vector perpStressAxis = CalculateDivisionPlane();
+ std::cout << "Cell " << index << ": Perpendicular stress axis = (" << perpStressAxis.x << ", " << perpStressAxis.y << ", " << perpStressAxis.z << ")" << std::endl;
+ DivideOverAxis(perpStressAxis);
+ }
+ break;
+ default:
+ std::cout << "Cell " << index << ": Division type = UNKNOWN (" << division_type << "), defaulting to SHORT_AXIS" << std::endl;
+ // Default to short axis division
+ {
+ Vector shortAxis = axis.Perp2D();
+ std::cout << "Cell " << index << ": Default short axis = (" << shortAxis.x << ", " << shortAxis.y << ", " << shortAxis.z << ")" << std::endl;
+ DivideOverAxis(shortAxis);
+ }
+ break;
+ }
+ std::cout << "Cell " << index << ": Division complete" << std::endl;
}
//void CheckForGFDrivenDivision(void);
@@ -179,7 +240,7 @@ class Cell : public CellBase
void findBeforeAfter(Node * node, Node ** before, Node**after);
Cell* findOtherCell(Cell*other, Node * node, Node * node2);
Cell* findNeighbourCellOnDivide(Cell* daughter,Node* node,Node * before1,Node * after1 ,Node * before2,Node * after2);
-
+ Vector CalculateDivisionPlane();
};
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/GUI/mesh.h b/src/GUI/mesh.h
index 17b42aae..c4b0536e 100755
--- a/src/GUI/mesh.h
+++ b/src/GUI/mesh.h
@@ -386,7 +386,6 @@ class Mesh {
void XMLSave(const char *docname, QDomElement &settings) const;
void XMLRead(const char *docname, QDomElement &settings, bool geometry = true, bool pars = true, bool simtime = true);
- //void QtXMLRead(const char *docname, QDomElement &settings, bool geometry = true, bool pars = true, bool simtime = true);
void XMLReadPars(const QDomElement &a_node);
void XMLReadGeometry(QDomElement root_node);
void XMLReadSimtime(const QDomElement &root_node);
@@ -407,6 +406,7 @@ class Mesh {
void PrintWallList( void );
void TestIllegalWalls(void);
Vector FirstConcMoment(int chem);
+
inline Vector Centroid(void) {
return boundary_polygon->Centroid();
}
diff --git a/src/Library/cellbase.cpp b/src/Library/cellbase.cpp
index f574c713..327e7b6d 100755
--- a/src/Library/cellbase.cpp
+++ b/src/Library/cellbase.cpp
@@ -339,6 +339,7 @@ Vector CellBase::Centroid(void) const
Vector centroid(integral_x_dxdy,integral_y_dxdy,0);
centroid/=area;
return centroid;
+
}
@@ -508,6 +509,71 @@ double CellBase::CalcLength(Vector *long_axis, double *width) const
return 4*sqrt(lambda_b/my_area);
}
+
+std::tuple CellBase::GetLengthAndWidthWithAxis() const
+{
+ // Calculs identiques à CalcLength
+ double my_intgrl_xx=0., my_intgrl_xy=0., my_intgrl_yy=0.;
+ double my_intgrl_x=0., my_intgrl_y=0., my_area=0.;
+ my_area=0.;
+ auto nb = nodes.begin();
+ auto i = nodes.begin();
+
+ for (; i != nodes.end(); i++) {
+ nb = i; nb++; if (nb == nodes.end()) nb = nodes.begin();
+
+ my_area += (*i)->x * (*nb)->y;
+ my_area -= (*nb)->x * (*i)->y;
+ my_intgrl_xx +=
+ ((*i)->x * (*i)->x +
+ (*nb)->x * (*i)->x +
+ (*nb)->x * (*nb)->x) *
+ ((*i)->x * (*nb)->y -
+ (*nb)->x * (*i)->y);
+ my_intgrl_xy +=
+ ((*nb)->x * (*i)->y -
+ (*i)->x * (*nb)->y) *
+ ((*i)->x * (2 * (*i)->y + (*nb)->y) +
+ (*nb)->x * ((*i)->y + 2 * (*nb)->y));
+ my_intgrl_yy +=
+ ((*i)->x * (*nb)->y -
+ (*nb)->x * (*i)->y) *
+ ((*i)->y * (*i)->y +
+ (*nb)->y * (*i)->y +
+ (*nb)->y * (*nb)->y);
+ my_intgrl_x +=
+ ((*nb)->x + (*i)->x) *
+ ((*i)->x * (*nb)->y -
+ (*nb)->x * (*i)->y);
+ my_intgrl_y +=
+ ((*nb)->y + (*i)->y) *
+ ((*i)->x * (*nb)->y -
+ (*nb)->x * (*i)->y);
+ }
+
+ my_area = fabs(my_area) / 2.0;
+
+ double intrx = my_intgrl_x / 6.;
+ double intry = my_intgrl_y / 6.;
+ double ixx = (my_intgrl_xx / 12.) - (intrx * intrx) / my_area;
+ double ixy = (my_intgrl_xy / 24.) + (intrx * intry) / my_area;
+ double iyy = (my_intgrl_yy / 12.) - (intry * intry) / my_area;
+
+ double rhs1 = (ixx + iyy) / 2., rhs2 = sqrt((ixx - iyy) * (ixx - iyy) + 4 * ixy * ixy) / 2.;
+
+ double lambda_b = rhs1 + rhs2;
+ double lambda_s = rhs1 - rhs2;
+
+ double length = 4 * sqrt(lambda_b / my_area);
+ double width = 4 * sqrt(lambda_s / my_area);
+
+ // Calcul du vecteur de l'axe principal, identique à CalcLength
+ Vector long_axis(-ixy, lambda_b - ixx, 0);
+
+ return std::make_tuple(length, width, long_axis);
+}
+
+
WallBase* CellBase::newWall(NodeBase* from,NodeBase* to,CellBase * other){
return NULL;
}
@@ -701,4 +767,94 @@ void CellBase::correctNeighbors() {}
double CellBase::elastic_limit() {
return std::nan("1");
}
+
+double CellBase::SetInitialArea(void) {
+ InitialArea = this->CalcArea();
+ return InitialArea;
+}
+Vector CellBase::CalculatePrincipalStressAxis() {
+ cout << "CalculatePrincipalStressAxis" << endl; // Calculate cell centroid
+ Vector centroid(0, 0, 0);
+ int n = nodes.size();
+ for (auto it = nodes.begin(); it != nodes.end(); it++) {
+ centroid += Vector((*it)->x, (*it)->y, (*it)->z);
+ }
+ centroid = centroid * (1.0 / n);
+
+ // Construct stress tensor
+ double stress_tensor[2][2] = {{0, 0}, {0, 0}};
+
+ // Calculate stress contribution from each wall
+ for (auto wall_it = walls.begin(); wall_it != walls.end(); ++wall_it) {
+ Wall* wall = *wall_it;
+ Vector wall_vec = Vector(wall->n2->x - wall->n1->x, wall->n2->y - wall->n1->y, wall->n2->z - wall->n1->z);
+ double wall_length = wall_vec.Norm();
+
+ if (wall_length > 0) {
+ // Normalize wall vector
+ wall_vec = wall_vec * (1.0 / wall_length);
+
+ // Get wall tension (stress)
+ double wall_stiffness;
+ if (std::isnan(wall->c1WallStiffness)) {
+ wall_stiffness = std::max(wall->c1->GetWallStiffness(), wall->c2WallStiffness);
+ } else if (std::isnan(wall->c2WallStiffness)) {
+ wall_stiffness = std::max(wall->c2->GetWallStiffness(), wall->c1WallStiffness);
+ } else {
+ wall_stiffness = std::max(wall->c1WallStiffness, wall->c2WallStiffness);
+ }
+ double wall_length_original = wall_vec.Norm();
+ double tension = wall_stiffness * (wall_length - wall_length_original) / wall_length_original;
+ // Add contribution to stress tensor (outer product)
+ stress_tensor[0][0] += tension * wall_vec.x * wall_vec.x;
+ stress_tensor[0][1] += tension * wall_vec.x * wall_vec.y;
+ stress_tensor[1][0] += tension * wall_vec.y * wall_vec.x;
+ stress_tensor[1][1] += tension * wall_vec.y * wall_vec.y;
+ }
+ }
+
+ // Calculate eigenvalues and eigenvectors to find principal stress
+ double trace = stress_tensor[0][0] + stress_tensor[1][1];
+ double det = stress_tensor[0][0] * stress_tensor[1][1] - stress_tensor[0][1] * stress_tensor[1][0];
+
+ // Eigenvalues
+ double lambda1 = (trace + sqrt(trace * trace - 4 * det)) / 2;
+ double lambda2 = (trace - sqrt(trace * trace - 4 * det)) / 2;
+
+ // Eigenvector for the larger eigenvalue is the principal stress direction
+ Vector principal_stress;
+ if (fabs(lambda1) >= fabs(lambda2)) {
+ // Calculate eigenvector for lambda1
+ if (fabs(stress_tensor[0][1]) > 1e-10) {
+ principal_stress = Vector(stress_tensor[0][1], lambda1 - stress_tensor[0][0], 0);
+ } else if (fabs(stress_tensor[1][0]) > 1e-10) {
+ principal_stress = Vector(lambda1 - stress_tensor[1][1], stress_tensor[1][0], 0);
+ } else {
+ // Diagonal matrix - eigenvectors are axis-aligned
+ principal_stress = (fabs(stress_tensor[0][0]) > fabs(stress_tensor[1][1])) ?
+ Vector(1, 0, 0) : Vector(0, 1, 0);
+ }
+ } else {
+ // Calculate eigenvector for lambda2
+ if (fabs(stress_tensor[0][1]) > 1e-10) {
+ principal_stress = Vector(stress_tensor[0][1], lambda2 - stress_tensor[0][0], 0);
+ } else if (fabs(stress_tensor[1][0]) > 1e-10) {
+ principal_stress = Vector(lambda2 - stress_tensor[1][1], stress_tensor[1][0], 0);
+ } else {
+ // Diagonal matrix - eigenvectors are axis-aligned
+ principal_stress = (fabs(stress_tensor[0][0]) < fabs(stress_tensor[1][1])) ?
+ Vector(1, 0, 0) : Vector(0, 1, 0);
+ }
+ }
+
+ // Normalize the principal stress vector
+ principal_stress.Normalise();
+
+ std::cout << "Cell " << index << ": Calculated principal stress axis = ("
+ << principal_stress.x << ", " << principal_stress.y << ", "
+ << principal_stress.z << ")" << std::endl;
+
+ return principal_stress;
+}
+// void XMLReadSimtime(const QDomElement &root_node);
/* finis*/
diff --git a/src/Library/cellbase.h b/src/Library/cellbase.h
index e3d954bd..d6fdd9c5 100755
--- a/src/Library/cellbase.h
+++ b/src/Library/cellbase.h
@@ -42,7 +42,15 @@
#include "wallelementinfo.h"
-//#include "wallelementinfo.h"
+// Division type enumeration
+enum DivisionType {
+ NO_DIVISION,
+ RANDOM_DIVISION,
+ MAX_STRESS_AXIS,
+ SHORT_AXIS,
+ LONG_AXIS,
+ PERP_STRESS
+};
extern Parameter par;
using namespace std;
@@ -60,6 +68,8 @@ struct ParentInfo {
Vector polarization;
double PINmembrane;
double PINendosome;
+ int ParentCellType;
+ Vector ParentCentroid;
};
// We need a little trick here, to make sure the plugin and the main application will see the same static datamembers
@@ -101,6 +111,7 @@ class CellBase : public QObject, public Vector
public:
CellBase(QObject *parent=0);
CellBase(double x,double y,double z=0); // constructor
+ double InitialArea = 0.0; // Initialize to zero
virtual ~CellBase() {
delete[] chem;
@@ -112,6 +123,7 @@ class CellBase : public QObject, public Vector
CellBase(const CellBase &src); // copy constructor
virtual bool BoundaryPolP(void) const { return false; }
+ const list& getNodes() const { return nodes; } // Ajout Rouges 2025
CellBase operator=(const CellBase &src); // assignment operator
CellBase operator=(const Vector &src);
@@ -194,11 +206,14 @@ class CellBase : public QObject, public Vector
double Length(Vector *long_axis = 0, double *width = 0) const;
double CalcLength(Vector *long_axis = 0, double *width = 0) const;
+ std::tuple GetLengthAndWidthWithAxis() const;
double ExactCircumference(void) const;
inline int Index(void) const { return index; }
+ double SetInitialArea(void); // Calculate and store the initial area
+ double GetInitialArea(void) const { return InitialArea; } // Getter method
void SetTargetArea(double tar_ar) { target_area=tar_ar; }
inline void SetTargetLength(double tar_l) { target_length=tar_l; }
@@ -245,6 +260,12 @@ class CellBase : public QObject, public Vector
virtual CellBase* getOtherWallElementSide(NodeBase * spikeEnd,NodeBase * over);
virtual double elastic_limit();
+ void SetDivisionType(DivisionType type) { division_type = type; }
+ DivisionType GetDivisionType() const { return division_type; }
+ DivisionType division_type;
+
+ virtual Vector CalculatePrincipalStressAxis();
+
QList getWalls(void) {
QList wall_list;
for (list::iterator i=walls.begin();
@@ -383,6 +404,8 @@ class CellBase : public QObject, public Vector
}
return n;
}
+
+
// RamiNote: To access neighbor indices, add this method to cellbase.h in the public section:
std::vector GetNeighborIndices() const {
std::vector indices;
@@ -584,7 +607,9 @@ inline Vector PINdir(CellBase *here, CellBase *nb, Wall *w)
{
return w->getTransporter( here, 1) * w->getInfluxVector(here);
}
-
#endif
+
+
+
/* finis*/
diff --git a/src/Library/parameter.cpp b/src/Library/parameter.cpp
index db9d9cda..ed27647a 100644
--- a/src/Library/parameter.cpp
+++ b/src/Library/parameter.cpp
@@ -1935,6 +1935,10 @@ 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, "elastic_modulus")) {
+ elastic_modulus = standardlocale.toDouble(valc, &ok);
+ if (!ok) { MyWarning::error("Read error: cannot convert string \"%s\" to double while reading parameter 'elastic_modulus' from XML file.",valc); }
+}
if (!strcmp(namec, "movie")) {
movie = strtobool(valc);
}
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.cpp b/src/Models/Cambium/cambium.cpp
index e6fd8575..265d5422 100755
--- a/src/Models/Cambium/cambium.cpp
+++ b/src/Models/Cambium/cambium.cpp
@@ -22,7 +22,11 @@
#include
#include
#include
+#include
+
#include "parameter.h"
+#include "pi.h"
+
#include "wallbase.h"
#include "cellbase.h"
@@ -31,32 +35,71 @@
static const std::string _module_id("$Id$");
+
/*
Cell Types and Their Behavior:
-CellType(0) : Bark Cells
-- Can grow slightly (prevents potential bugs if restricted completely).
-- Cannot divide.
-- Stiffness = 10 × Cambium stiffness.
-
-CellType(1) : Cambium Cells
-- Can grow until a specific threshold is reached.
-- Upon reaching the threshold, the cell divides:
- - If only one daughter cell is in contact with the bark, it becomes CellType(1) (Cambium), and the other becomes CellType(2) (Growing Xylem).
- - If both daughter cells are in contact with the bark, both become CellType(1).
-
-CellType(2) : Growing Xylem Cells
-- Can grow until they reach a threshold of 3 × BaseArea().
-- Cannot divide.
-- When growth limit is reached, they transform into CellType(3) (Mature Xylem).
-
-CellType(3) : Mature Xylem Cells
-- Cannot grow or divide.
-- Stiffness = 100 × Cambium stiffness.
+CellType(0): Bark Cells
+- Elasticity defined by SetLambdaLength(0)
+- Stiffness = bark_added_stiffness (default value = 1)
+- Expansion rate = cell_expansion_rate * 1
+- Division threshold = 10, ratio = 2
+- Can transform into type 1 (Bark Cambium) if surrounded only by:
+ * Type 2 cells
+ * A combination of types 0 and 2
+ * A combination of types 0, 1, and 2
+
+CellType(1): Bark Cambium
+- Elasticity defined by SetLambdaLength(0)
+- Stiffness = cambium_added_stiffness (default value = 1)
+- Expansion rate = cell_expansion_rate * 1
+- Division threshold = 1, ratio = 1
+- Can transform into:
+ * Type 0 (Bark) if surrounded by type 0 cells or types 0 and 1
+ * Type 2 (Xylem Cambium) if surrounded by cells of types 1 and 2
+- During division, the daughter cell farther from the center becomes type 0, the other remains type 1
+
+CellType(2): Xylem Cambium
+- Elasticity defined by SetLambdaLength(0)
+- Stiffness = cambium_added_stiffness (default value = 1)
+- Expansion rate = cell_expansion_rate * 2
+- Division threshold = 1, ratio = 1
+- Complex transformations based on neighbors:
+ * Type 1 if surrounded only by type 1
+ * Type 3 if surrounded only by type 3
+ * Type 4 if surrounded only by type 4 (and different from index 0)
+ * Type 3 if surrounded by types 3 and 4, or types 2, 3, 4 without index 0
+ * Type 3 if surrounded by more than 2 neighbors of type 3
+- During division, the daughter cell farther from the center remains type 2, the other becomes type 3
+
+CellType(3): Growing Xylem
+- Elasticity defined by SetLambdaLength(0)
+- Stiffness = 1.5 (fixed)
+- Expansion rate = cell_expansion_rate * 2
+- Can transform into type 2 if surrounded by:
+ * Types 1 and 2 without other types
+ * Only type 4
+ * Types 1, 2, and 3 without type 4
+ * Types 1, 3, and 4 without type 2
+- Transforms into type 4 (Mature Xylem) when:
+ * Its area exceeds 4000
+ * T > 0 and R/T > 3 and area < 4000
+
+CellType(4): Mature Xylem
+- Elasticity defined by SetLambdaLength(0)
+- Stiffness = mature_xylem_added_stiffness * 2 (default value = 2)
+- No division (terminal cells)
+- If area < 4000, expansion rate = cell_expansion_rate * 5 // Keep cell area
+(it should'nt move bcs of encreased stiffness but doesnt work)
+
+Additional Notes:
+- Division rules depend on the ratio between radial (R) and tangential (T) dimensions
+- If both daughter cells are at equivalent distance from the center (±5%), they retain the parent's type
+- Stiffness values and expansion rates can be adjusted via model parameters
+- Radial/tangential orientation is calculated by comparing the cell's principal axis with the radial direction
*/
-
QString cambium::ModelID(void) {
// specify the name of your model here
return QString( "Cambium" );
@@ -65,10 +108,9 @@ QString cambium::ModelID(void) {
// return the number of chemicals your model uses
int cambium::NChem(void) { return 0; }
-// Constructor - initializes the bark_cells vector
+
cambium::cambium() {
- // Initialize bark cells with the original values
- bark_cells = {13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30};
+
}
// Display node information for a cell
@@ -79,244 +121,635 @@ void cambium::AfficherNoeuds(CellBase *c) {
}
}
+
+void PrintWallStiffness(CellBase *c) {
+// qDebug() << "Cell" << c->Index() << "wall stiffness values:";
+// int wall_count = 0;
+//
+// c->LoopWallElements([&wall_count](auto wallElementInfo){
+// double stiffness = wallElementInfo->getWallElement()->getStiffness();
+// qDebug() << " Wall element" << wall_count++ << "stiffness:" << stiffness;
+// });
+}
+
void cambium::SetCellTypeProperties(CellBase *c) { // Set cell properties
/* SetLambdaLength property notes:
+ - Default value 0 for all cell mode 0
- High values (>2) cause cells to "flow"
- Very low values (<0.01) for bark prevent cells from moving between bark cells
- This is the elasticity coefficient of the wall, allowing it to extend to lambda * initial value
*/
- if (c->CellType()==0){
- c-> SetWallStiffness(1);
- c-> SetLambdaLength(0);
+ // Define stiffness parameters for different cell types
+ const double cambium_added_stiffness = 1; // Base stiffness (used by cambium)
+ const double bark_added_stiffness = 1; // Additional stiffness for bark cells
+ const double mature_xylem_added_stiffness = 1; // Additional stiffness for mature xylem
+
+ if (c->CellType()==0) { // Bark Cells
+ c->SetLambdaLength(0);
+
+ // Set stiffness to default + added stiffness for bark
+ double stiffness = bark_added_stiffness;
+ double* p_stiffness = &stiffness;
+
+ c->LoopWallElements([p_stiffness](auto wallElementInfo){
+ wallElementInfo->getWallElement()->setStiffness(*p_stiffness);
+ });
}
- else if (c->CellType()==1){
- c-> SetWallStiffness(1);
- c-> SetLambdaLength(0);
+ else if (c->CellType()==1 || c->CellType()==2) { // Cambium Cells
+ c->SetLambdaLength(0);
+
+ // Set stiffness to default (no modification)
+ double stiffness = cambium_added_stiffness;
+ double* p_stiffness = &stiffness;
+
+ c->LoopWallElements([p_stiffness](auto wallElementInfo){
+ wallElementInfo->getWallElement()->setStiffness(*p_stiffness);
+ });
}
- else if (c->CellType()==2){
- c-> SetWallStiffness(1);
- c-> SetLambdaLength(0);
+ else if (c->CellType()==3) { // Growing Xylem Cells
+ c->SetLambdaLength(0);
+
+// // Calculate growth progress (0.0 to 1.0)
+// double progress = (c->Area() - 4000) / (2.0 * 4000);
+// progress = std::min(1.0, std::max(0.0, progress)); // Clamp between 0 and 1
+//
+// // Gradually increase stiffness from default to higher values as the cell grows
+// // Add up to 0.5 additional stiffness as the cell reaches full growth
+// double stiffness = mature_xylem_added_stiffness *(1+progress);
+ double stiffness = 1.5;
+ double* p_stiffness = &stiffness;
+
+ c->LoopWallElements([p_stiffness](auto wallElementInfo){
+ wallElementInfo->getWallElement()->setStiffness(*p_stiffness);
+ });
}
- else {
- c-> SetWallStiffness(1);
- c-> SetLambdaLength(0);
+ else { // Mature Xylem Cells (Type 3)
+ c->SetLambdaLength(0);
+
+ // Set stiffness to default + added stiffness for mature xylem
+ double stiffness = mature_xylem_added_stiffness*2;
+ double* p_stiffness = &stiffness;
+
+ c->LoopWallElements([p_stiffness](auto wallElementInfo){
+ wallElementInfo->getWallElement()->setStiffness(*p_stiffness);
+ });
}
}
+
+
void cambium::SetCellColor(CellBase *c, QColor *color) {
//cell Coloring depending on type
- if (c->CellType()==0){
- color->setNamedColor("cornflowerblue");
+ if (c->CellType()==0){ // Bark
+ color->setNamedColor("brown");
}
- else if (c->CellType()==1){
+ else if (c->CellType()==1){ // Bark Cambium
+ color->setNamedColor("green");
+ }
+ else if (c->CellType()==2){ // Wood cambium
color->setNamedColor("seagreen");
}
- else if (c->CellType()==2){
+ else if (c->CellType()==3){ // growing wood
color->setNamedColor("darkorange");
}
- else {
- color->setNamedColor("blue");
+ else { // mature wood
+ color->setNamedColor("Blue");
}
}
-void cambium::OnDivide(ParentInfo *parent_info, CellBase *daughter1, CellBase *daughter2) {
- // Rules to be executed after cell division
+// Method to select which parameters ill enable division and which axis
+DivisionType cambium::DividingRules(CellBase *c, int division_rule_case) {
+ // Initialiser les variables avec des valeurs par défaut
+ double R = 0, T = 0;
- // Check if this is a special division
- int parent_id1 = daughter1->Index(); // Get parent ID via daughter cell
- int parent_id2 = daughter2->Index();
- if (special_division_cells.find(parent_id1) != special_division_cells.end() or special_division_cells.find(parent_id2) != special_division_cells.end() ) {
- // Determine which daughter cell is closer to the exterior
- bool d1_more_exposed = false;
+ // Récupérer les valeurs depuis la fonction
+ std::tie(R, T) = DetermineRadialOrientation(c);
- // Count exposed nodes for each daughter cell
- int d1_exposed_nodes = 0;
- int d2_exposed_nodes = 0;
+ // Définir seuil et ratio selon le type de cellule
+ int seuil = 2; // Valeur par défaut
+ int ratio = 2; // Valeur par défaut
- for (auto node_it = daughter1->getNodes().begin(); node_it != daughter1->getNodes().end(); ++node_it) {
- if ((*node_it)->BoundaryP()) d1_exposed_nodes++;
- }
+ if (c->CellType() == 0) {
+ seuil = 10;
+ }
+ else if (c->CellType() == 1) {
+ seuil = 2;
+ }
+ else if (c->CellType() == 2){
+ seuil = 2;
+ }
- for (auto node_it = daughter2->getNodes().begin(); node_it != daughter2->getNodes().end(); ++node_it) {
- if ((*node_it)->BoundaryP()) d2_exposed_nodes++;
- }
- d1_more_exposed = (d1_exposed_nodes > d2_exposed_nodes);
+ Vector axis = c->Centroid();
+ Vector radial_axis = axis;
+ Vector tangential_axis = axis.Perp2D();
- // Transform the more exposed cell into bark, the other remains cambium
- if (d1_more_exposed) {
- daughter1->SetCellType(0); // Bark
- daughter2->SetCellType(1); // Cambium
- // Add the new bark cell to our list
- bark_cells.push_back(daughter1->Index());
- } else {
- daughter1->SetCellType(1); // Cambium
- daughter2->SetCellType(0); // Bark
+ // Vérifier si la cellule dépasse le seuil de croissance
+ double initial_area = c->GetInitialArea();
+ bool growth_condition = false;
- // Add the new bark cell to our list
- bark_cells.push_back(daughter2->Index());
- }
+ if (c-> Area() > 1500){
+ growth_condition = true;
+ }
+ else if (c-> Area() < 1500) {
+ growth_condition = c->Area() > initial_area * seuil;
+ }
- // Remove the cell from our set after processing
- special_division_cells.erase(parent_id1);
- special_division_cells.erase(parent_id2);
- return;
+
+ // Vérifier les conditions de ratio
+ std::cout << "Ratio R/T = " << R/T <<" ";
+ std::cout << "Growth_condition = " << growth_condition << " ";
+ // Traiter selon le cas de règle de division
+ switch(division_rule_case) {
+ case 1: // Division plus petit axe basée uniquement sur la croissance
+ if (growth_condition) {
+ std::cout << "Cellule " << c->Index() << ": Cas 1 - Division petit axe (Seuil de croissance atteint)" << std::endl;
+ c->SetDivisionType(SHORT_AXIS); // Short axis
+ c->Divide();
+ }
+ break;
+ case 2: // Division plus grand axe basée uniquement sur la croissance
+ if (growth_condition) {
+ std::cout << "Cellule " << c->Index() << ": Cas 1 - Division plus grand axe (Seuil de croissance atteint)" << std::endl;
+ c->SetDivisionType(LONG_AXIS); // Long axis
+ c->Divide();
+ }
+ break;
+ case 3: // Division axe aléatoire basée uniquement sur la croissance
+ if (growth_condition) {
+ std::cout << "Cellule " << c->Index() << ": Cas 1 - Division axe aléatoire (Seuil de croissance atteint)" << std::endl;
+ c->SetDivisionType(RANDOM_DIVISION); // Random axis
+ c->Divide();
+ }
+ break;
+
+ case 4: // Division radiale ou tangentielle basée uniquement sur la croissance
+ if (growth_condition) {
+ if (R/T < 0.25) { // Division selon l'axe radial (cellules plus allongées tangentiellement qu zradialement )
+ std::cout << "Cellule " << c->Index() << ": Cas 2 - Division radiale (Seuil de croissance atteint)" << std::endl;
+ c->DivideOverAxis(radial_axis);
+ }
+ else if (R/T > 0.5) {// Division selon l'axe tangentiel (cellule allongée radialement)
+ std::cout << "Cellule " << c->Index() << ": Cas 2 - Division tangentielle (Seuil de croissance atteint)" << std::endl;
+ c->DivideOverAxis(tangential_axis);
+ }
+ }
+ break;
+ case 5: // Division axe contrainte basée uniquement sur la croissance
+ if (growth_condition) {
+ std::cout << "Cellule " << c->Index() << ": Cas 1 - Division axe contrainte (Seuil de croissance atteint)" << std::endl;
+ c->SetDivisionType(PERP_STRESS); //Stess axis
+ c->Divide();
+ }
+ break;
+
+ case 6: // Division plus petit axe selon le ratio R/T uniquement
+ if ((R/T > 0.5) || (R/T < 0.25)) {
+ std::cout << "Cellule " << c->Index() << ": Cas 4 - Division basée sur le plsu petit axe (ratio R/T > seuil)" << std::endl;
+ c->SetDivisionType(SHORT_AXIS);
+ c->Divide();
+ }
+ break;
+
+ case 7: // Division radiale ou tangentielle selon le ratio R/T uniquement
+ if (R/T > 0.5) {
+ std::cout << "Cellule " << c->Index() << "Division radiale (R/T > 0.5)" << std::endl;
+ c->DivideOverAxis(tangential_axis);
+ }
+ else if (R/T < 0.25) {
+ std::cout << " Cellule " << c->Index() << "Division tangentielle (R/T <0.25>)" << std::endl;
+ c->DivideOverAxis(radial_axis);
+ }
+ break;
+
+ case 8: // Division selon l'axe de contrainte selon le ratio R/T uniquement
+ if ((R/T > 0.5) || (R/T < 0.25)) {
+ std::cout << "Cellule " << c->Index() << ": Cas 4 - Division basée sur les contraintes (ratio R/T > seuil)" << std::endl;
+ c->SetDivisionType(MAX_STRESS_AXIS);
+ c->Divide();
+ }
+ break;
+
+ case 9: // Division basée sur croissance ET ratio
+ if ((growth_condition && (R/T >0.5)) || (growth_condition && (R/T < 0.25))) {
+ std::cout << "Cellule " << c->Index() << ": Cas 5 - Division petit axe (taille et ratio > seuils)" << std::endl;
+ c->SetDivisionType(SHORT_AXIS);
+ c->Divide();
+ }
+ break;
+
+ case 10: // Division radiale/tangentielle basée sur croissance ET ratio
+ if (growth_condition && (R/T >0.5)) {
+ std::cout << "Cellule " << c->Index() << ": Cas 6 - Division radiale (croissance + T/R)" << "tangential axis : "<< tangential_axis << std::endl;
+ c->DivideOverAxis(tangential_axis);
+ }
+ else if (growth_condition && (R/T < 0.25)) {
+ std::cout << "Cellule " << c->Index() << ": Cas 6 - Division tangentielle (croissance + R/T)" << "radial axis : "<< radial_axis << std::endl;
+ c->DivideOverAxis(radial_axis);
+ }
+ break;
+
+ case 11: // Division selon l'axe de stress basée sur croissance ET ratio
+ if ((growth_condition && (R/T >0.5)) || (growth_condition && (R/T < 0.25))) {
+ std::cout << "Cellule " << c->Index() << ": Cas 7 - Division par contraintes (croissance + ratio)" << std::endl;
+ c->SetDivisionType(MAX_STRESS_AXIS);
+ c->Divide();
+ }
+ break;
+
+ default:
+ std::cout << "Cellule " << c->Index() << ": Cas par défaut - Aucune règle de division spécifiée" << std::endl;
+ break;
}
+ // Par défaut, ne pas diviser
+ return NO_DIVISION;
+}
+
- // Construct neighbor lists for both daughter cells
- daughter1->GetNeighborIndices();
- daughter2->GetNeighborIndices();
- // Get neighbor indices for both daughter cells
- std::vector d1_neighbor_indices = daughter1->GetNeighborIndices();
- std::vector d2_neighbor_indices = daughter2->GetNeighborIndices();
+void cambium::CellHouseKeeping(CellBase *c) {
+ SetCellTypeProperties(c);
+ PrintWallStiffness(c);
+// Debug pour afficher les informations sur la cellule et ses voisins
+// qDebug() << "------------------------------------------";
+// qDebug() << "Cellule" << c->Index() << "de type" << c->CellType() << "- Aire:" << c->Area();
+// qDebug() << " Voisins de la cellule" << c->Index() << ":";
- // Check if daughter cells are neighbors with any bark cells
- bool d1_neighbors_bark = false;
- bool d2_neighbors_bark = false;
+ int division_type = 7;
+ std::vector neighbors = c->GetNeighborIndices();
- // Check daughter1's neighbors
- for (auto idx : d1_neighbor_indices) {
- if (std::find(bark_cells.begin(), bark_cells.end(), idx) != bark_cells.end()) {
- d1_neighbors_bark = true; // daughter1 has a neighbor bark cell
- }
- }
+ bool has_index_0 = false;
- // Check daughter2's neighbors
- for (auto idx : d2_neighbor_indices) {
- if (std::find(bark_cells.begin(), bark_cells.end(), idx) != bark_cells.end()) {
- d2_neighbors_bark = true; // daughter1 has a neighbor bark cell
+ for (int idx : neighbors) {
+ if (idx == 0) {
+ has_index_0 = true;
+ break; // On peut sortir dès qu'on trouve l'indice 0
}
}
- // Handle the case where both daughter cells are neighbors to bark cells
- if (d1_neighbors_bark && d2_neighbors_bark) {
- // Both cells become type 1 (Cambium cells)
- daughter1->SetCellType(1);
- daughter2->SetCellType(1);
+ cell_registry[c->Index()] = c;
+ static std::set initialized_cells;
+
+ if (initialized_cells.find(c->Index()) == initialized_cells.end()) {
+ c->SetInitialArea();
+ initialized_cells.insert(c->Index());
}
- // Handle cases where only one daughter cell is neighbor to bark cells
- else if (d1_neighbors_bark) { // Daughter 1 is neighbor to a bark cell
- daughter1->SetCellType(1); // Daughter 1 becomes a Cambium cell on division
- daughter2->SetCellType(2); // Daughter 2 becomes a Growing Xylem on division
+ double initial_area = c->GetInitialArea();
+ UpdateCellTypeLists(c->Index(), c->CellType());
+ // Ne pas lancer les regles tant que toutes les cellules ne sont pas initialisées dans le cell registry
+ for (int idx : neighbors) {
+ CellBase* neighbor = GetCellByIndex(idx);
+ if (neighbor) {
+ //qDebug() << " Cellule" << idx << "de type" << neighbor->CellType();
+ }
+ else {
+ //qDebug() << " Cellule" << idx << "(non trouvée dans le registre)";
+ return;
+ }
}
- else if (d2_neighbors_bark) {// Daughter 2 is neighbor to a bark cell
- daughter1->SetCellType(2);// Daughter 1 becomes a Growing Xylem on division
- daughter2->SetCellType(1);// Daughter 2 becomes a Cambium cell on division
+ // Une seule boucle pour vérifier tous les types de voisins
+ bool has_type0_neighbor = false;
+ bool has_type1_neighbor = false;
+ bool has_type2_neighbor = false;
+ bool has_type3_neighbor = false;
+ bool has_type4_neighbor = false;
+ for (int idx : neighbors) {
+ CellBase* neighbor = GetCellByIndex(idx);
+ if (!neighbor) continue;
+ if (neighbor->CellType() == 0) has_type0_neighbor = true;
+ if (neighbor->CellType() == 1) has_type1_neighbor = true;
+ if (neighbor->CellType() == 2) has_type2_neighbor = true;
+ if (neighbor->CellType() == 3) has_type3_neighbor = true;
+ if (neighbor->CellType() == 4) has_type4_neighbor = true;
}
- else { // Neither are neighbor to a bark cell.
- daughter1->SetCellType(2);// Daughter 1 becomes a Growing Xylem cell on division
- daughter2->SetCellType(2);// Daughter 2 becomes a Growing Xylem cell on division
+
+ int count_type2_neighbors = 0;
+ int count_type3_neighbors = 0;
+ for (int idx : neighbors) {
+ CellBase* neighbor = GetCellByIndex(idx);
+ if (!neighbor) continue;
+ if (neighbor->CellType() == 2) {
+ count_type2_neighbors++;
+ }
}
-}
-//void cambium::CellHouseKeeping(CellBase *c) { // Simple test function
-// // Simple test: if cell Index is 3, double its size and divide
-// if (c->Index() == 10) {
-// // Double the target area
-// c->EnlargeTargetArea(par->cell_expansion_rate);
-// if (c->Area() > par->rel_cell_div_threshold * c->BaseArea()) {
-// c->Divide();
-// }
-// }
-//}
+ for (int idx : neighbors) {
+ CellBase* neighbor = GetCellByIndex(idx);
+ if (!neighbor) continue;
+ if (neighbor->CellType() == 3) {
+ count_type3_neighbors++;
+ }
+ }
-void cambium::CellHouseKeeping(CellBase *c) { // How cells behave after division
- qDebug() << "Cell elastic limit :" << c->elastic_limit() ;
- SetCellTypeProperties(c);
+ if (c->CellType() == 0) { // Bark
+ //Si entourées uniquement de type 2
+ if (!has_type0_neighbor && !has_type1_neighbor && has_type2_neighbor && !has_type3_neighbor && !has_type4_neighbor) {
+ c->SetCellType(1);
+ UpdateCellTypeLists(c->Index(), 1);
+ return;
+ }
+// // Si entouré de type 0 et 2
+// else if (has_type0_neighbor && !has_type1_neighbor && has_type2_neighbor && !has_type3_neighbor && !has_type4_neighbor) {
+// c->SetCellType(1);
+// UpdateCellTypeLists(c->Index(), 1);
+// return;
+// }
+ // Si entouré de type 0 1 et 2
+ else if (has_type0_neighbor && has_type1_neighbor && has_type2_neighbor && !has_type3_neighbor && !has_type4_neighbor) {
+ c->SetCellType(1);
+ UpdateCellTypeLists(c->Index(), 1);
+ return;
+ }
+
+ else {
+ c->EnlargeTargetArea(par->cell_expansion_rate*1);
+
+ }
+ }
- // Check if a cambium cell is no longer adjacent to the bark, if not it has to be transformed into a Growing Xylem cell
- if (c->CellType() == 1) {
- // Solution #1 for cambium cells touching the exterior:
- // The cambium cell divides in two and the cell closest to the exterior
- // transforms into a bark cell.
+ else if (c->CellType() == 1) { // Bark cambium
- // Check if any of the cell's nodes are exposed to the exterior
- AfficherNoeuds(c);
+ int count_type1_neighbors = 0;
- // Check all nodes of the cell
- for (list::const_iterator it = c->getNodes().begin(); it != c->getNodes().end(); ++it) {
- Node* noeud = *it;
- if (noeud->BoundaryP()) {
+ for (int idx : neighbors) {
+ CellBase* neighbor = GetCellByIndex(idx);
+ if (!neighbor) continue;
+ if (neighbor->CellType() == 1) {
+ count_type1_neighbors++;
+ }
+ }
+ // Si entouré de type 0
+ if (has_type0_neighbor && !has_type1_neighbor && !has_type2_neighbor && !has_type3_neighbor && !has_type4_neighbor) {
+ c->SetCellType(0);
+ UpdateCellTypeLists(c->Index(), 0);
+ return;
+ }
+ // Si entouré de type 0 et 1
+ else if(has_type0_neighbor && has_type1_neighbor && !has_type2_neighbor && !has_type3_neighbor && !has_type4_neighbor) {
+ c->SetCellType(0);
+ UpdateCellTypeLists(c->Index(), 0);
- // Force division along this axis
-// c->Divide();
+ return;
+ }
+ // Si voisins type 1 et type 2
+ else if (!has_type0_neighbor && has_type1_neighbor && has_type2_neighbor && !has_type3_neighbor && !has_type4_neighbor) {
+ c->SetCellType(2);
+ UpdateCellTypeLists(c->Index(), 2);
+ return;
+ }
+ // Si voisins type 1 2 4
+ else if (!has_type0_neighbor && has_type1_neighbor && has_type2_neighbor && !has_type3_neighbor && has_type4_neighbor) {
+ c->SetCellType(2);
+ UpdateCellTypeLists(c->Index(), 2);
+ return;
+ }
- // OnDivide will handle the rest
- special_division_cells.insert(c->Index());
- return; // Exit after initiating division
+ else {
+ c->EnlargeTargetArea(par->cell_expansion_rate*1.8);
+ DividingRules(c, division_type);
}
}
- // Normal behavior for cambium cells
- c->EnlargeTargetArea(par->cell_expansion_rate);
- if (c->Area() > par->rel_cell_div_threshold * c->BaseArea()) {
- c->Divide();
+
+ else if (c->CellType() == 2) { // Xylem Cambium
+ // Si entourées uniquement par type 1
+ if (!has_type0_neighbor && !has_type2_neighbor && !has_type3_neighbor && !has_type4_neighbor) {
+ c->SetCellType(1);
+ UpdateCellTypeLists(c->Index(), 1);
+ return;
+ }
+ // Si entourées uniquement par type 2
+ else if (!has_type0_neighbor && !has_type1_neighbor && has_type2_neighbor && !has_type3_neighbor && !has_type4_neighbor && !has_index_0) {
+ c->SetCellType(2);
+ UpdateCellTypeLists(c->Index(), 2);
+ return;
+ }
+ // Si entourées uniquement par type 3
+ else if (!has_type0_neighbor && !has_type1_neighbor && !has_type2_neighbor && has_type3_neighbor && !has_type4_neighbor) {
+ c->SetCellType(3);
+ UpdateCellTypeLists(c->Index(), 3);
+ return;
+ }
+ // Si entourées uniquement par type 4 et différent de l'index 0
+ else if (!has_type0_neighbor && !has_type1_neighbor && !has_type2_neighbor && !has_type3_neighbor && has_type4_neighbor && !has_index_0) {
+ c->SetCellType(4);
+ UpdateCellTypeLists(c->Index(), 4);
+ return;
+ }
+
+ // Si entourée uniquement par type 1 et 2
+ else if (!has_type0_neighbor && has_type1_neighbor && has_type2_neighbor && !has_type3_neighbor && !has_type4_neighbor) {
+ c->SetCellType(2);
+ UpdateCellTypeLists(c->Index(), 2);
+ return;
+ }
+
+ // Si entourée uniquement par type 3 et 4
+ else if (!has_type0_neighbor && !has_type1_neighbor && !has_type2_neighbor && has_type3_neighbor && has_type4_neighbor) {
+ c->SetCellType(3);
+ UpdateCellTypeLists(c->Index(), 3);
+ return;
+ }
+
+ //Si entourée par type 2 3 et 4 sans indice 0
+ else if (!has_type0_neighbor && !has_type1_neighbor && has_type2_neighbor && has_type3_neighbor && has_type4_neighbor && !has_index_0) {
+ c->SetCellType(3);
+ UpdateCellTypeLists(c->Index(), 3);
+ return;
+ }
+ // Si entouré type 1 3 et 4 (=! indice 0)
+ else if (!has_type0_neighbor && has_type1_neighbor && !has_type2_neighbor && has_type3_neighbor && has_type4_neighbor && !has_index_0) {
+ c->SetCellType(3);
+ UpdateCellTypeLists(c->Index(), 3);
+ return;
+ }
+ // Si entouré type 2 3 et 4 (=! indice 0)
+ else if (!has_type0_neighbor && !has_type1_neighbor && has_type2_neighbor && has_type3_neighbor && has_type4_neighbor && !has_index_0) {
+ c->SetCellType(3);
+ UpdateCellTypeLists(c->Index(), 3);
+ return;
+ }
+ //Si entouré de type 2 et de plus de 2 cellules de type 3
+ else if (!has_type0_neighbor && !has_type1_neighbor && has_type2_neighbor && has_type3_neighbor && count_type3_neighbors > 2 && !has_type4_neighbor && !has_index_0) {
+ c->SetCellType(3);
+ UpdateCellTypeLists(c->Index(), 3);
+ return;
+ }
+ //Si entouré de plus de 2 cellules de type 2 et 3
+ else if (!has_type0_neighbor && !has_type1_neighbor && count_type2_neighbors >=2 && has_type2_neighbor && has_type3_neighbor && count_type3_neighbors >= 2 && !has_type4_neighbor && !has_index_0) {
+ c->SetCellType(3);
+ UpdateCellTypeLists(c->Index(), 3);
+ return;
+ }
+ //Si entouré de type 2 et collé à la cellule 0
+ else if (!has_type0_neighbor && !has_type1_neighbor && count_type2_neighbors > 2 && has_type2_neighbor && !has_type3_neighbor && has_type4_neighbor && has_index_0) {
+ c->SetCellType(3);
+ UpdateCellTypeLists(c->Index(), 3);
+ return;
+ }
+ else {
+ c->EnlargeTargetArea(par->cell_expansion_rate*2);
+ DividingRules(c, division_type);
+ }
}
- }
- else if(c->CellType() == 2) { // If cell is a type 2, grow until it reach 3*BaseArea then transform into a Type 3
- if (c->Area() < 3 * c->BaseArea()) {
- c->EnlargeTargetArea(par->cell_expansion_rate);
+
+ else if (c->CellType() == 3) { // Growing Xylem
+
+
+ // Si entourée par un type 4
+ if (!has_type0_neighbor && !has_type1_neighbor && !has_type2_neighbor && !has_type3_neighbor && has_type4_neighbor) {
+ c->SetCellType(4);
+ UpdateCellTypeLists(c->Index(), 4);
+ return;
+ }
+
+ // Si entourée par un type 1 et 2
+ if (!has_type0_neighbor && has_type1_neighbor && has_type2_neighbor && !has_type3_neighbor && !has_type4_neighbor) {
+ c->SetCellType(2);
+ UpdateCellTypeLists(c->Index(), 2);
+ return;
+ }
+ // Si entouré par 2 et 4
+ else if (!has_type0_neighbor && !has_type1_neighbor && has_type2_neighbor && !has_type3_neighbor && has_type4_neighbor) {
+ c->SetCellType(3);
+ UpdateCellTypeLists(c->Index(), 3);
+ return;
+ }
+ // Si entourée par un type 1 2 et 3
+ else if (!has_type0_neighbor && has_type1_neighbor && has_type2_neighbor && has_type3_neighbor && !has_type4_neighbor) {
+ c->SetCellType(2);
+ UpdateCellTypeLists(c->Index(), 2);
+ return;
+ }
+ // Si entourée par un type 1 3 et 4
+ else if (!has_type0_neighbor && has_type1_neighbor && !has_type2_neighbor && has_type3_neighbor && has_type4_neighbor) {
+ c->SetCellType(2);
+ UpdateCellTypeLists(c->Index(), 2);
+ return;
+ }
+
+ // Si entourée par un type 0 2 3 et 4
+ else if (has_type0_neighbor && !has_type1_neighbor && has_type2_neighbor && has_type3_neighbor && has_type4_neighbor) {
+ c->SetCellType(2);
+ UpdateCellTypeLists(c->Index(), 2);
+ return;
+ }
+ // Si entourée par un type 0 2 3
+ else if (has_type0_neighbor && !has_type1_neighbor && has_type2_neighbor && has_type3_neighbor && !has_type4_neighbor) {
+ c->SetCellType(2);
+ UpdateCellTypeLists(c->Index(), 2);
+ return;
+ }
+ // Si entourée par un type 0 2 4
+ else if (has_type0_neighbor && !has_type1_neighbor && has_type2_neighbor && !has_type3_neighbor && has_type4_neighbor && count_type2_neighbors > 2) {
+ c->SetCellType(2);
+ UpdateCellTypeLists(c->Index(), 2);
+ return;
+ }
+ // Si entourée par un type 1 2 4
+ else if (!has_type0_neighbor && has_type1_neighbor && has_type2_neighbor && !has_type3_neighbor && has_type4_neighbor) {
+ c->SetCellType(2);
+ UpdateCellTypeLists(c->Index(), 2);
+ return;
+ }
+
+ // Si entourée par un type 1 3 et 4
+ else if (!has_type0_neighbor && has_type1_neighbor && !has_type2_neighbor && has_type3_neighbor && has_type4_neighbor) {
+ c->SetCellType(2);
+ UpdateCellTypeLists(c->Index(), 2);
+ return;
+ }
+
+// // Si entourée par un type 2 3 et 4
+// else if (!has_type0_neighbor && !has_type1_neighbor && has_type2_neighbor && has_type3_neighbor && has_type4_neighbor) {
+// c->SetCellType(2);
+// UpdateCellTypeLists(c->Index(), 2);
+// return;
+ else{
+
+ // Croissance uniquement
+ if (c->Area() < 1500*3) {
+ c->EnlargeTargetArea(par->cell_expansion_rate*10);
+ return;
+ }
+ else {
+ c->SetCellType(4); // Debug pour afficher les informations sur la cellule et ses voisins
+ UpdateCellTypeLists(c->Index(),4);
+ return;
+ }
+ }
}
- else {
- c->SetCellType(3); // Set grown Type 2 cell to a Type 3
+ else if (c->CellType() == 4) { // Mature Xylem
+ // Aucune croissance ou division pour les cellules de type 4
+ // Ce sont des cellules finales/terminales
+ for (list::const_iterator it = c->getNodes().begin();
+ it != c->getNodes().end(); ++it) {
+ (*it)->Fix();
+ }
}
- }
- else if (c->CellType() == 0) {
- /* If the cell is a bark cell (type 0), we need to slightly enlarge it to prevent excessive stretching,
- which could cause issues in the simulation. This adjustment ensures stability during runtime. */
-
- // Get current area values
- double area = c->Area();
- double baseArea = c->BaseArea();
-
- // Use static maps to store growth data for each cell by its index
- static std::map growth_additions;
- static std::map last_growth_step;
- static int current_step = 0;
-
- // Increment step counter each time function is called (simulation step)
- current_step++;
-
- // Initialize growth addition for this cell if not present
- if (growth_additions.find(c->Index()) == growth_additions.end()) {
- growth_additions[c->Index()] = 0.0;
- last_growth_step[c->Index()] = 0;
- }
- // Check if we need to increase the growth_addition (every 500 simulation steps)
- if (current_step - last_growth_step[c->Index()] >= 200) {
- // Increase growth_addition by 5% of baseArea
- growth_additions[c->Index()] += baseArea * 0.15;
- // Update last growth step
- last_growth_step[c->Index()] = current_step;
+}
- if (c->Index() == 28) {
- qDebug() << "Cell 28 - GROWTH UPDATE - Step:" << current_step
- << "New Growth Addition:" << growth_additions[c->Index()];
- }
- }
- // Use effective base area (original baseArea + growth_addition)
- double effective_base_area = baseArea + growth_additions[c->Index()];
- // Maintain effective base area if cell has shrunk
- if (area < effective_base_area) {
- // Gradually increase target area to reach effective base area
- c->EnlargeTargetArea(par->cell_expansion_rate);
+void cambium::OnDivide(ParentInfo *parent_info, CellBase *daughter1, CellBase *daughter2) {
+ // Centre du tissu
+ Vector tissue_center(0.0, 0.0, 0.0);
+
+ // Distances au centre
+ double d_parent = (parent_info->ParentCentroid- tissue_center).Norm();
+ double d1 = (daughter1->Centroid() - tissue_center).Norm();
+ double d2 = (daughter2->Centroid() - tissue_center).Norm();
+
+ // Tolérance pour "proche"
+ double tol = 0.01 * d_parent; // 5% de la distance du parent
+
+ int ParentCellType = parent_info->ParentCellType;
+// qDebug() <<"Parent type"<< parent_info->ParentCellType;
+// qDebug() <<"Parent centroid"<< parent_info->ParentCentroid;
+
+ if (fabs(d1 - d_parent) < tol && fabs(d2 - d_parent) < tol) {
+ // Les deux filles gardent le type du parent
+ daughter1->SetCellType(ParentCellType);
+ daughter2->SetCellType(ParentCellType);
- if (c->Index() == 28) {
- qDebug() << "Cell 28 - ENLARGING TARGET AREA - Step:" << current_step
- << "Effective base area:" << effective_base_area
- << "Current area:" << area
- << "Target area:" << c->TargetArea()
- << "Rate:" << par->cell_expansion_rate;
}
- }
+ else {
+ if (ParentCellType == 1) {
+ if (d1 > d2) {
+ daughter1->SetCellType(0);
+ daughter2->SetCellType(1);
+ } else {
+ daughter1->SetCellType(1);
+ daughter2->SetCellType(0);
+ }
+ }
+ else if (ParentCellType == 2) {
+ if (d1 > d2) {
+ daughter1->SetCellType(2);
+ daughter2->SetCellType(3);
+ }
+ else {
+ daughter1->SetCellType(3);
+ daughter2->SetCellType(2);
+ }
+ }
+ // Ajoute d'autres cas si besoin
+ }
+ UpdateCellTypeLists(daughter1->Index(), daughter1->CellType());
+ UpdateCellTypeLists(daughter2->Index(), daughter2->CellType());
}
+
+
+CellBase* cambium::GetCellByIndex(int idx) {
+ auto it = cell_registry.find(idx);
+ if (it != cell_registry.end()) {
+ return it->second;
+ }
+ return nullptr;
}
@@ -332,4 +765,105 @@ void cambium::CellDynamics(CellBase *c, double *dchem) {
// add biochemical networks for intracellular reactions here
}
+void cambium::UpdateCellTypeLists(int idx, int type) {
+ // Retirer l'index de l'ancienne liste si le type a changé
+ if (last_cell_types.count(idx) && last_cell_types[idx] != type) {
+ int old_type = last_cell_types[idx];
+ std::vector* old_list = nullptr;
+ if (old_type == 0) old_list = &bark_cells;
+ else if (old_type == 1) old_list = &bark_cambium_cells;
+ else if (old_type == 2) old_list = &xylem_cambium_cells;
+ else if (old_type == 3) old_list = &growing_xylem_cells;
+ else if (old_type == 4) old_list = &mature_xylem_cells;
+
+ if (old_list) {
+ old_list->erase(std::remove(old_list->begin(), old_list->end(), idx), old_list->end());
+ }
+ }
+
+ // Ajouter l'index à la bonne liste si absent
+ std::vector* new_list = nullptr;
+ if (type == 0) new_list = &bark_cells;
+ else if (type == 1) new_list = &bark_cambium_cells;
+ else if (type == 2) new_list = &xylem_cambium_cells;
+ else if (type == 3) new_list = &growing_xylem_cells;
+ else if (type == 4) new_list = &mature_xylem_cells;
+
+ if (new_list && std::find(new_list->begin(), new_list->end(), idx) == new_list->end()) {
+ new_list->push_back(idx);
+ }
+
+ // IMPORTANT : Mettre à jour le type dans cell_registry
+ if (cell_registry.find(idx) != cell_registry.end() && cell_registry[idx]) {
+ cell_registry[idx]->SetCellType(type);
+ }
+
+ last_cell_types[idx] = type;
+}
+
+
+std::pair cambium::DetermineRadialOrientation(CellBase *c) {
+ // Déclarer des variables par défaut
+ double length = 0, width = 0;
+ Vector long_axis;
+
+ // Récupérer les dimensions et l'axe principal de la cellule
+ std::tie(length, width, long_axis) = c->GetLengthAndWidthWithAxis();
+
+ // Calculer le vecteur radial (du centre 0,0 vers le centre de la cellule)
+ Vector radial_vector = c->Centroid();
+ double radial_magnitude = radial_vector.Norm();
+
+ // Éviter la division par zéro pour les cellules trop proches du centre
+ if (radial_magnitude < 1e-6) {
+ return std::make_pair(length, width); // Par défaut radial
+ }
+
+ // Normaliser les vecteurs pour comparer uniquement leur direction
+ long_axis.Normalise();
+ radial_vector.Normalise();
+
+ // Calculer le vecteur perpendiculaire à long_axis dans le plan XY
+ Vector perp_long_axis(-long_axis.y, long_axis.x, 0);
+
+ // Calculer les angles entre le vecteur radial et les deux axes
+ double dot_long = long_axis.x * radial_vector.x + long_axis.y * radial_vector.y;
+ double dot_perp = perp_long_axis.x * radial_vector.x + perp_long_axis.y * radial_vector.y;
+
+ // Limiter les produits scalaires pour éviter les erreurs numériques
+ dot_long = std::min(1.0, std::max(-1.0, dot_long));
+ dot_perp = std::min(1.0, std::max(-1.0, dot_perp));
+
+ double angle_long_rad = acos(fabs(dot_long));
+ double angle_perp_rad = acos(fabs(dot_perp));
+
+ double angle_long_deg = angle_long_rad * 180.0 / M_PI;
+ double angle_perp_deg = angle_perp_rad * 180.0 / M_PI;
+
+ // Si l'angle avec long_axis est plus petit que l'angle avec l'axe perpendiculaire, orientation radiale
+ bool is_radial_orientation = (angle_long_deg < angle_perp_deg);
+
+ // Assigner les valeurs R et T selon l'orientation
+ double R, T;
+ if (is_radial_orientation) {
+ // Le long_axis est plus aligné avec la direction radiale
+ R = length;
+ T = width;
+ } else {
+ // Le long_axis est plus aligné avec la direction tangentielle
+ R = width;
+ T = length;
+ }
+
+ // Afficher pour le débogage
+ qDebug() << "Cellule =" << c->Index()
+ << ": Base Area =" << c->GetInitialArea()
+ << ": Area =" << c->Area()
+ << ": Angle long_axis-radial =" << angle_long_deg
+ << "°, Angle perp-radial =" << angle_perp_deg
+ << "° - Orientation:" << (is_radial_orientation ? "Radiale" : "Tangentielle")
+ << " R =" << R << ", T =" << T;
+
+ return std::make_pair(R, T);
+ }
//Q_EXPORT_PLUGIN2(cambium, cambium)
\ No newline at end of file
diff --git a/src/Models/Cambium/cambium.h b/src/Models/Cambium/cambium.h
index e512d3d5..76c82170 100755
--- a/src/Models/Cambium/cambium.h
+++ b/src/Models/Cambium/cambium.h
@@ -26,6 +26,7 @@
#include
#include
#include "simplugin.h"
+#include
@@ -62,22 +63,30 @@ 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_nCercles_new.XML"); }
virtual void SetCellTypeProperties(CellBase *c);
- // For internal use; not to be redefined by end users
-// virtual void SetParameters(Parameter *pass_pars) { par = pass_pars; }
-// virtual void SetCellsStaticDatamembers (CellsStaticDatamembers *cells_static_data_members_of_main);
-//
-//protected:
-// class Parameter *par;
+ //Test nouveau tissu Rouges
+ CellBase* GetCellByIndex(int idx);
+ // Dans la section public de la classe cambium
+ std::pair DetermineRadialOrientation(CellBase *c);
+ virtual DivisionType DividingRules(CellBase *c, int division_rule_case);
private:
// bark_cells should be defined in cambium.h, not here
+ void UpdateCellTypeLists(int idx, int type); // Gestion des listes des cellules pour la division
std::vector bark_cells;
- std::set special_division_cells; // Pour stocker les ID des cellules qui doivent se diviser de manière spéciale
+ std::vector bark_cambium_cells;
+ std::vector xylem_cambium_cells;
+ std::vector growing_xylem_cells;
+ std::vector mature_xylem_cells;
+ std::map last_cell_types; // index -> dernier type connu
+ std::map cell_registry;
+ std::set special_division_cells; // Pour stocker les ID des cellules qui doivent se diviser de manière spéciale
+ double simulation_time; // Variable pour stocker le temps de simulation
+ double aire_instant_t0 = 0.0; // Aire à t = 0
};
\ No newline at end of file
diff --git a/structure_n_cercles.xml b/structure_n_cercles.xml
new file mode 100644
index 00000000..88a308ed
--- /dev/null
+++ b/structure_n_cercles.xml
@@ -0,0 +1,806 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/structure_vierge.xml b/structure_vierge.xml
new file mode 100644
index 00000000..a6434c34
--- /dev/null
+++ b/structure_vierge.xml
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_XML.py b/test_XML.py
new file mode 100644
index 00000000..d494f3bc
--- /dev/null
+++ b/test_XML.py
@@ -0,0 +1,1371 @@
+import math as math
+import matplotlib.pyplot as plt
+from random import *
+
+# ----------------------------------------------------------------------------------------------------------#
+# ------------- CONVERSION POLAIRE-CARTÉSIEN ---------------------------------------------------------------#
+# ----------------------------------------------------------------------------------------------------------#
+
+def polaire_vers_cartesien(k_noeuds_n_cercle_polaire):
+ """Convertit les coordonnées polaires des noeuds en coordonnées cartésiennes.
+
+ Args:
+ k_noeuds_n_cercle_polaire: Liste des noeuds en coordonnées polaires pour chaque cercle
+
+ Returns:
+ Liste des noeuds en coordonnées cartésiennes pour chaque cercle
+ """
+ return [
+ {
+ "x": noeud["r"] * math.cos(noeud["theta"]),
+ "y": noeud["r"] * math.sin(noeud["theta"]),
+ "index": noeud["index"],
+ "initial": noeud["initial"],
+ "sam": noeud["sam"],
+ "boundary": noeud["boundary"],
+ "fixed": noeud["fixed"]
+ }
+ for cercle in k_noeuds_n_cercle_polaire
+ for noeud in cercle
+ ]
+
+
+
+#-----------------------------------------------------------------------------------------------------#
+#------------ GÉNÉRATION DES RAYONS ------------------------------------------------------------------#
+#-----------------------------------------------------------------------------------------------------#
+
+def n_cercles(n, rayon_0, a, rapport_R_T, debug=False):
+ """Calcule les rayons de n cercles concentriques.
+
+ Args:
+ n: Nombre de cercles à générer
+ rayon_0: Rayon du premier cercle (le plus interne)
+ a: Liste des nombres de points/cellules par cercle
+ rapport_R_T: Liste des rapports entre rayon et longueur de corde
+ debug: Active/désactive l'affichage des informations de débogage
+
+ Returns:
+ Liste des rayons des cercles générés
+ """
+ if n <= 0:
+ return []
+
+ rayon_n_cercles = [rayon_0] # Initialisation avec le premier rayon
+
+ if debug:
+ print(f"cercle 0: rayon = {rayon_0}\n")
+
+ for i in range(1, n):
+ rayon_precedent = rayon_n_cercles[i - 1]
+
+ # Sélection de l'indice correct pour a
+ a_idx = i - 1 if i < n - 1 or len(a) <= i - 1 else i - 2
+
+ # Facteur multiplicatif pour calculer l'incrément de rayon
+
+ # Calcul du nouveau rayon
+ sin_term = math.sin(math.pi / a[a_idx])
+ increment = rapport_R_T[i - 1] * 2 * sin_term * rayon_precedent
+ nouveau_rayon = rayon_precedent + increment
+ rayon_n_cercles.append(nouveau_rayon)
+
+ if debug:
+ print(f"cercle {i}:")
+ print(f"rayon précédent = {rayon_precedent}")
+ print(f"nouveau rayon = {nouveau_rayon}")
+ print(f"incrément = {increment}")
+ if i < n - 1:
+ ratio_calcule = (nouveau_rayon - rayon_precedent) / (2 * sin_term * rayon_precedent)
+ print(f"ratio R/T calculé = {ratio_calcule}")
+ print(f"ratio R/T attendu = {rapport_R_T[i]}")
+ else:
+ ratio_calcule = (nouveau_rayon - rayon_precedent) / (sin_term * rayon_precedent)
+ print(f"ratio R/T = {ratio_calcule}")
+ print(f"a[{a_idx}] = {a[a_idx]}\n")
+
+ return rayon_n_cercles
+
+
+
+
+
+#----------------------------------------------------------------------------------------------------#
+#---------- CRÉATION DES NOEUDS INITIAUX ------------------------------------------------------------#
+#----------------------------------------------------------------------------------------------------#
+
+def creer_noeuds_initiaux(n, rayon_n_cercles, a):
+ """Crée les nœuds initiaux sans fusion.
+
+ Args:
+ n: Nombre de cercles
+ rayon_n_cercles: Liste des rayons de chaque cercle
+ a: Liste des nombres de points/cellules par cercle
+
+ Returns:
+ Tuple contenant:
+ - Liste des noeuds en coordonnées polaires pour chaque cercle
+ - Nombre total de noeuds créés
+ """
+ k_noeuds_n_cercle_polaire = []
+ index_noeud = 0
+
+ # Fonction auxiliaire pour créer un nœud
+ def creer_noeud(r, theta, boundary=False, fixed=False):
+ nonlocal index_noeud
+ noeud = {
+ "r": r,
+ "theta": theta,
+ "index": index_noeud,
+ "initial": True,
+ "sam": False,
+ "boundary": boundary,
+ "fixed": fixed
+ }
+ index_noeud += 1
+ return noeud
+
+ for i in range(n):
+ rayon = rayon_n_cercles[i]
+ cercle_noeuds = []
+
+ if i == 0:
+ # Premier cercle - tous les nœuds sont fixes
+ cercle_noeuds = [
+ creer_noeud(
+ r=rayon,
+ theta=2 * math.pi * j / a[i],
+ fixed=True
+ ) for j in range(a[i])
+ ]
+
+ elif 0 < i < n - 1:
+ # Cercles intermédiaires
+ # D'abord les points alignés avec le cercle précédent
+ cercle_noeuds.extend([
+ creer_noeud(
+ r=rayon,
+ theta=2 * math.pi * j / a[i-1]
+ ) for j in range(a[i-1])
+ ])
+
+ # Puis les points propres à ce cercle
+ cercle_noeuds.extend([
+ creer_noeud(
+ r=rayon,
+ theta=2 * math.pi * j / a[i]
+ ) for j in range(a[i])
+ ])
+
+ else:
+ # Dernier cercle - tous les points sont sur la frontière
+ cercle_noeuds = [
+ creer_noeud(
+ r=rayon,
+ theta=2 * math.pi * j / a[i-1],
+ boundary=True
+ ) for j in range(a[i-1])
+ ]
+
+ k_noeuds_n_cercle_polaire.append(cercle_noeuds)
+
+ return k_noeuds_n_cercle_polaire, index_noeud
+
+
+
+#----------------------------------------------------------------------------------------------------#
+#------------- FUSION DES NOEUDS PROCHES ------------------------------------------------------------#
+#----------------------------------------------------------------------------------------------------#
+
+def fusionner_noeuds(k_noeuds_n_cercle_polaire, n, index_noeud_depart=0, seuil_distance=1):
+ """ Fusionne les nœuds qui se chevauchent.
+
+ Args:
+ k_noeuds_n_cercle_polaire: Liste des noeuds en coordonnées polaires
+ n: Nombre de cercles
+ index_noeud_depart: Index de départ pour les nouveaux noeuds créés
+ seuil_distance: Distance minimale entre deux noeuds pour les considérer distincts
+
+ Returns:
+ Tuple contenant:
+ - Liste mise à jour des noeuds en coordonnées polaires
+ - Dictionnaire de correspondance des indices fusionnés """
+
+ index_noeud = index_noeud_depart
+
+ # Trier chaque sous-liste par ordre croissant de theta
+ for i in range(len(k_noeuds_n_cercle_polaire)):
+ k_noeuds_n_cercle_polaire[i].sort(key=lambda noeud: noeud["theta"])
+
+ # Collecter tous les nœuds avec leur cercle d'origine
+ tous_noeuds = []
+ for i, cercle in enumerate(k_noeuds_n_cercle_polaire):
+ for noeud in cercle:
+ r = noeud["r"]
+ theta = noeud["theta"]
+ idx = noeud["index"]
+ initial = noeud["initial"]
+ sam = noeud["sam"]
+ boundary = noeud["boundary"]
+ fixed = noeud["fixed"]
+ x = r * math.cos(theta)
+ y = r * math.sin(theta)
+ tous_noeuds.append((x, y, r, theta, idx, i, initial, sam,boundary,fixed))
+
+ # Identifier les paires de nœuds qui se chevauchent
+ map_indices = {}
+ noeuds_a_fusionner = []
+
+ for i in range(len(tous_noeuds)):
+ x1, y1, r1, theta1, idx1, cercle1, initial1,sam1,boundary1,fixed1 = tous_noeuds[i]
+
+ for j in range(i + 1, len(tous_noeuds)):
+ x2, y2, r2, theta2, idx2, cercle2, initial2,sam2,boundary2,fixed2 = tous_noeuds[j]
+
+ # Distance entre les nœuds
+ distance = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
+
+ if distance < seuil_distance:
+ print(f"Nœuds à fusionner : {idx1} et {idx2} (distance={distance:.3f})")
+ noeuds_a_fusionner.append((i, j))
+
+ # Création des nouveaux nœuds
+ nouveaux_noeuds = []
+ indices_a_supprimer = set()
+
+ for i, j in noeuds_a_fusionner:
+ x1, y1, r1, theta1, idx1, cercle1, initial1,sam1,boundary1,fixed1 = tous_noeuds[i]
+ x2, y2, r2, theta2, idx2, cercle2, initial2,sam2,boundary2,fixed2 = tous_noeuds[j]
+
+ # Créer le nœud entre les deux
+ x_nouveau = (x1 + x2) / 2
+ y_nouveau = (y1 + y2) / 2
+ r_nouveau = math.sqrt(x_nouveau ** 2 + y_nouveau ** 2)
+ theta_nouveau = math.atan2(y_nouveau, x_nouveau)
+
+ if theta_nouveau < 0:
+ theta_nouveau += 2 * math.pi
+
+ nouvel_indice = index_noeud
+ index_noeud += 1
+
+ # Un nœud est initial seulement si tous les nœuds fusionnés sont initiaux
+ initial_nouveau = initial1 and initial2
+ boundary_nouveau = boundary1 or boundary2
+ sam_nouveau = False
+ fixed_nouveau = False
+ # Création du nouveau nœud
+ nouveau_noeud = {
+ "r": r_nouveau,
+ "theta": theta_nouveau,
+ "index": nouvel_indice,
+ "initial": initial_nouveau,
+ "sam":sam_nouveau,
+ "boundary":boundary_nouveau,
+ "fixed": fixed_nouveau
+ }
+
+ nouveaux_noeuds.append((nouveau_noeud, cercle1, cercle2))
+
+ map_indices[idx1] = nouvel_indice
+ map_indices[idx2] = nouvel_indice
+
+ indices_a_supprimer.add(i)
+ indices_a_supprimer.add(j)
+
+ # Reconstruction des nœuds sans ceux qui sont supprimés
+ nouveau_k_noeuds_n_cercle_polaire = [[] for _ in range(n)]
+
+ # Ajouter les nœuds non supprimés
+ for i, (x, y, r, theta, idx, cercle, initial, sam,boundary, fixed) in enumerate(tous_noeuds):
+ if i not in indices_a_supprimer:
+ nouveau_k_noeuds_n_cercle_polaire[cercle].append({
+ "r": r,
+ "theta": theta,
+ "index": idx,
+ "initial": initial,
+ "sam": sam,
+ "boundary": boundary,
+ "fixed": fixed
+ })
+
+ # Ajouter les nouveaux nœuds
+ for nouveau_noeud, cercle1, cercle2 in nouveaux_noeuds:
+ nouveau_k_noeuds_n_cercle_polaire[cercle1].append(nouveau_noeud.copy())
+ if cercle1 != cercle2:
+ nouveau_k_noeuds_n_cercle_polaire[cercle2].append(nouveau_noeud.copy())
+
+ # Trier à nouveau
+ for i in range(len(nouveau_k_noeuds_n_cercle_polaire)):
+ nouveau_k_noeuds_n_cercle_polaire[i].sort(key=lambda noeud: noeud["theta"])
+
+ print(f"Nombre de nouveaux nœuds créés: {len(nouveaux_noeuds)}")
+
+ return nouveau_k_noeuds_n_cercle_polaire, map_indices
+
+
+
+# ----------------------------------------------------------------------------------------------------#
+# ------------ CRÉATION DES CELLULES AVEC NOEUDS INTERMÉDIAIRES ---------------------------------------#
+# ----------------------------------------------------------------------------------------------------#
+def creer_cellules(k_noeuds_n_cercle_polaire, n, a,cell_type):
+
+ """Crée des cellules à 4 nœuds entre cercles consécutifs.
+
+ Args:
+ rayon_n_cercles: Liste des rayons des cercles
+ k_noeuds_n_cercle_polaire: Coordonnées polaires des nœuds pour chaque cercle
+ n: Nombre de cercles
+ a: Liste des nombres de cellules entre chaque paire de cercles consécutifs
+
+ Returns:
+ Liste des cellules, chaque cellule étant définie par une liste de noeuds (indices)
+ """
+ # Fonction auxiliaire pour la comparaison d'angles
+ def angles_equivalents(a1, a2, tolerance=0.001):
+ a1_norm = a1 % (2 * math.pi)
+ a2_norm = a2 % (2 * math.pi)
+ diff = min(abs(a1_norm - a2_norm), 2 * math.pi - abs(a1_norm - a2_norm))
+ return diff < tolerance
+
+ # Fonction pour vérifier si un angle est entre deux autres
+ def est_entre_angles(theta, debut, fin, tolerance=0.001):
+ theta_norm = theta % (2 * math.pi)
+ debut_norm = debut % (2 * math.pi)
+ fin_norm = fin % (2 * math.pi)
+
+ if debut_norm <= fin_norm:
+ return debut_norm - tolerance <= theta_norm <= fin_norm + tolerance
+ else:
+ return theta_norm >= debut_norm - tolerance or theta_norm <= fin_norm + tolerance
+
+ # Prétraitement : indexer et trier les nœuds par angle pour chaque cercle
+ noeuds_par_cercle = []
+ for i in range(n):
+ if i < len(k_noeuds_n_cercle_polaire):
+ noeuds_par_cercle.append(sorted(k_noeuds_n_cercle_polaire[i], key=lambda noeud: noeud["theta"]))
+ else:
+ noeuds_par_cercle.append([])
+
+ cellules_temp = [] # Liste temporaire pour les cellules
+
+ # Création de la cellule centrale (cercle 0)
+ if n > 0 and len(k_noeuds_n_cercle_polaire) > 0:
+ noeuds_cercle_0 = [noeud["index"] for noeud in noeuds_par_cercle[0]]
+
+ cellule_centrale = {
+ "index": 0,
+ "noeuds": noeuds_cercle_0,
+ "boundary": 0,
+ "cell_type": 4,
+ "target_area": 100.0,
+ "lambda_celllength": 0,
+ "at_boundary": True,
+ "dead": False,
+ "target_length": 0,
+ "stiffness": 1,
+ "source": False,
+ "pin_fixed": False,
+ "area": 0.0,
+ "fixed": True,
+ "div_counter": 0,
+ "cercle": 0,
+ "angle": 0
+ }
+
+ cellules_temp.append(cellule_centrale)
+ print(f"Cellule centrale créée avec {len(noeuds_cercle_0)} noeuds")
+
+ # Création des cellules entre les cercles
+ for i in range(n - 1):
+ nb_cellules = a[i] if i < len(a) else a[-1]
+
+ for j in range(nb_cellules):
+ angle_j = 2 * j * math.pi / nb_cellules
+ angle_j_moins_1 = 2 * (j - 1) * math.pi / nb_cellules
+ if angle_j_moins_1 < 0:
+ angle_j_moins_1 += 2 * math.pi
+
+ # Variables pour stocker les informations des nœuds trouvés
+ noeud1, noeud2, noeud3, noeud4 = None, None, None, None
+ angle1, angle2, angle3, angle4 = None, None, None, None
+ r1, r2, r3, r4 = None, None, None, None
+ tolerance = 0.01
+
+ # Recherche optimisée des nœuds aux angles spécifiques
+ for point in noeuds_par_cercle[i]:
+ theta = point["theta"]
+ if noeud1 is None and angles_equivalents(theta, angle_j, tolerance):
+ noeud1, angle1, r1 = point["index"], theta, point["r"]
+ elif noeud2 is None and angles_equivalents(theta, angle_j_moins_1, tolerance):
+ noeud2, angle2, r2 = point["index"], theta, point["r"]
+
+ # Si les deux nœuds sont trouvés, on peut passer au cercle suivant
+ if noeud1 is not None and noeud2 is not None:
+ break
+
+ for point in noeuds_par_cercle[i + 1]:
+ theta = point["theta"]
+ if noeud3 is None and angles_equivalents(theta, angle_j_moins_1, tolerance):
+ noeud3, angle3, r3 = point["index"], theta, point["r"]
+ elif noeud4 is None and angles_equivalents(theta, angle_j, tolerance):
+ noeud4, angle4, r4 = point["index"], theta, point["r"]
+
+ if noeud3 is not None and noeud4 is not None:
+ break
+
+ # Si tous les nœuds principaux sont trouvés
+ if noeud1 is not None and noeud2 is not None and noeud3 is not None and noeud4 is not None:
+ # Calculer le centre de la cellule
+ x1, y1 = r1 * math.cos(angle1), r1 * math.sin(angle1)
+ x2, y2 = r2 * math.cos(angle2), r2 * math.sin(angle2)
+ x3, y3 = r3 * math.cos(angle3), r3 * math.sin(angle3)
+ x4, y4 = r4 * math.cos(angle4), r4 * math.sin(angle4)
+
+ centre_x = (x1 + x2 + x3 + x4) / 4
+ centre_y = (y1 + y2 + y3 + y4) / 4
+ angle_centre = math.atan2(centre_y, centre_x)
+ if angle_centre < 0:
+ angle_centre += 2 * math.pi
+
+ # Recherche des nœuds intermédiaires
+ noeuds_arc_sup = []
+ for point in noeuds_par_cercle[i]:
+ theta, index = point["theta"], point["index"]
+ if index != noeud1 and index != noeud2:
+ if (est_entre_angles(theta, angle2, angle1, tolerance) or
+ angles_equivalents(theta, angle1, tolerance) or
+ angles_equivalents(theta, angle2, tolerance)):
+ noeuds_arc_sup.append((theta, index))
+
+ noeuds_arc_sup.sort(reverse=True)
+ noeuds_arc_sup = [idx for _, idx in noeuds_arc_sup]
+
+ noeuds_arc_inf = []
+ for point in noeuds_par_cercle[i + 1]:
+ theta, index = point["theta"], point["index"]
+ if index != noeud3 and index != noeud4:
+ if (est_entre_angles(theta, angle3, angle4, tolerance) or
+ angles_equivalents(theta, angle3, tolerance) or
+ angles_equivalents(theta, angle4, tolerance)):
+ noeuds_arc_inf.append((theta, index))
+
+ noeuds_arc_inf.sort()
+ noeuds_arc_inf = [idx for _, idx in noeuds_arc_inf]
+
+ # Construction des noeuds de la cellule dans l'ordre
+ tous_noeuds = [noeud1] + noeuds_arc_sup + [noeud2, noeud3] + noeuds_arc_inf + [noeud4]
+
+ cellule = {
+ "index": len(cellules_temp),
+ "noeuds": tous_noeuds,
+ "boundary": 0,
+ "cell_type": cell_type[i],
+ "target_area": 100.0,
+ "lambda_celllength": 0,
+ "at_boundary": True if i == n - 2 else False,
+ "dead": False,
+ "target_length": 0,
+ "stiffness": 1,
+ "source": False,
+ "pin_fixed": False,
+ "area": 0.0,
+ "fixed": False,
+ "div_counter": 0,
+ "cercle": i + 1,
+ "angle": angle_centre
+ }
+
+ cellules_temp.append(cellule)
+ else:
+ print(f"Impossible de créer la cellule à i={i}, j={j}: nœuds manquants")
+ print(f"Nœuds trouvés: {noeud1}, {noeud2}, {noeud3}, {noeud4}")
+
+ # Organiser les cellules par cercle puis par angle
+ cellules_par_cercle = {}
+ for cellule in cellules_temp:
+ cercle = cellule.get("cercle", 0)
+ if cercle not in cellules_par_cercle:
+ cellules_par_cercle[cercle] = []
+ cellules_par_cercle[cercle].append(cellule)
+
+ # Trier et réassembler les cellules
+ cellules_triees = []
+ for cercle in sorted(cellules_par_cercle.keys()):
+ cellules_par_cercle[cercle].sort(key=lambda c: c.get("angle", 0))
+ cellules_triees.extend(cellules_par_cercle[cercle])
+
+ # Réindexer les cellules triées
+ cellules = []
+ for i, cellule in enumerate(cellules_triees):
+ cellule_copy = cellule.copy()
+ cellule_copy["index"] = i
+ cellules.append(cellule_copy)
+
+ print("cellules", cellules)
+ return cellules
+
+
+# ----------------------------------------------------------------------------------------------------#
+# ---------- RAFFINNAGE DU MAILLAGE (AJOUT DE NOEUDS) --------------------------------------------------------------#
+# ----------------------------------------------------------------------------------------------------#
+
+def raffiner_maillage_separe(k_noeuds_n_cercle_polaire, n, cellules, longueur_seuil_cercle, longueur_seuil_radial,
+ rayons_n_cercles, seuil_proximite):
+ # Copier les données initiales
+ nouveau_k_noeuds_n_cercle_polaire = [[] for _ in range(n)]
+ for i in range(min(n, len(k_noeuds_n_cercle_polaire))):
+ for noeud in k_noeuds_n_cercle_polaire[i]:
+ nouveau_k_noeuds_n_cercle_polaire[i].append(noeud.copy())
+
+ nouvelles_cellules = [cellule.copy() for cellule in cellules]
+
+ # Tableau pour stocker les nœuds intermédiaires radiaux (qui ne sont pas sur les cercles)
+ noeuds_radiaux = []
+
+ # Identifier les noeuds avec tag spécial
+ noeuds_speciaux = {}
+ for i_cercle, cercle in enumerate(nouveau_k_noeuds_n_cercle_polaire):
+ for noeud in cercle:
+ if noeud.get("tag_special", False):
+ r = noeud["r"]
+ theta = noeud["theta"]
+ x = r * math.cos(theta)
+ y = r * math.sin(theta)
+ noeuds_speciaux[noeud["index"]] = (x, y, r, theta)
+
+ # Phase 1: Remaillage des cercles (segments circulaires)
+ iterations_cercles = 0
+ segments_cercles_raffines = True
+
+ while segments_cercles_raffines and iterations_cercles < 5:
+ iterations_cercles += 1
+ segments_cercles_raffines = False
+
+ # Convertir en coordonnées cartésiennes pour le calcul des distances
+ noeuds_cartesien = {}
+ for i_cercle in range(len(nouveau_k_noeuds_n_cercle_polaire)):
+ for noeud in nouveau_k_noeuds_n_cercle_polaire[i_cercle]:
+ r = noeud["r"]
+ theta = noeud["theta"]
+ index = noeud["index"]
+ initial = noeud["initial"]
+ boundary = noeud["boundary"]
+ x = r * math.cos(theta)
+ y = r * math.sin(theta)
+ noeuds_cartesien[index] = (x, y, r, theta, i_cercle, initial, boundary)
+
+ # Ajouter les noeuds radiaux à la liste des noeuds cartésiens
+ for noeud in noeuds_radiaux:
+ r = noeud["r"]
+ theta = noeud["theta"]
+ index = noeud["index"]
+ initial = noeud["initial"]
+ boundary = noeud["boundary"]
+ x = r * math.cos(theta)
+ y = r * math.sin(theta)
+ noeuds_cartesien[index] = (x, y, r, theta, -1, initial, boundary) # -1 indique un noeud radial
+
+ # Dictionnaire pour stocker les nouveaux noeuds à ajouter sur les cercles
+ segments_cercles_a_raffiner = {}
+
+ # Vérifier les segments sur un même cercle
+ for i_cercle in range(n):
+ if i_cercle >= len(nouveau_k_noeuds_n_cercle_polaire):
+ continue
+
+ cercle_noeuds = nouveau_k_noeuds_n_cercle_polaire[i_cercle]
+ nb_noeuds = len(cercle_noeuds)
+
+ for i in range(nb_noeuds):
+ idx1 = cercle_noeuds[i]["index"]
+ idx2 = cercle_noeuds[(i + 1) % nb_noeuds]["index"]
+
+ if idx1 in noeuds_cartesien and idx2 in noeuds_cartesien:
+ x1, y1, r1, theta1, _, _, boundary1 = noeuds_cartesien[idx1]
+ x2, y2, r2, theta2, _, _, boundary2 = noeuds_cartesien[idx2]
+
+ # Distance euclidienne entre les deux noeuds
+ distance = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
+
+ if distance > longueur_seuil_cercle:
+ # Gestion de l'interpolation angulaire
+ if theta1 < 0: theta1 += 2 * math.pi
+ if theta2 < 0: theta2 += 2 * math.pi
+
+ # Gérer le cas où l'arc traverse la ligne θ=0
+ if abs(theta1 - theta2) > math.pi:
+ if theta1 > theta2:
+ theta2 += 2 * math.pi
+ else:
+ theta1 += 2 * math.pi
+
+ # Interpolation angulaire en respectant le rayon du cercle
+ theta_new = (theta1 + theta2) / 2
+ r_new = rayons_n_cercles[i_cercle] # Utiliser le rayon exact du cercle
+
+ # Normaliser l'angle entre 0 et 2π
+ if theta_new >= 2 * math.pi:
+ theta_new -= 2 * math.pi
+
+ # Calculer les coordonnées cartésiennes
+ x_new = r_new * math.cos(theta_new)
+ y_new = r_new * math.sin(theta_new)
+
+ # Vérifier proximité avec noeuds spéciaux
+ trop_proche = False
+ for _, (x_special, y_special, _, _) in noeuds_speciaux.items():
+ dist_special = math.sqrt((x_new - x_special) ** 2 + (y_new - y_special) ** 2)
+ if dist_special < seuil_proximite:
+ trop_proche = True
+ break
+
+ if not trop_proche:
+ # Hériter le statut boundary si au moins un des nœuds est boundary
+ is_boundary = boundary1 or boundary2
+ segments_cercles_a_raffiner[tuple(sorted([idx1, idx2]))] = (x_new, y_new, r_new, theta_new, i_cercle, is_boundary)
+ segments_cercles_raffines = True
+
+ # Assigner des indices aux nouveaux noeuds
+ indices_max = [noeud["index"] for cercle in nouveau_k_noeuds_n_cercle_polaire for noeud in cercle]
+ indices_max.extend([noeud["index"] for noeud in noeuds_radiaux])
+ prochain_indice = max(indices_max) + 1 if indices_max else 0
+
+ # Ajouter les nouveaux noeuds aux cercles et créer le mappage
+ map_segments_cercles_indices = {}
+ for segment_key, (x_new, y_new, r_new, theta_new, cercle, is_boundary) in segments_cercles_a_raffiner.items():
+ idx1, idx2 = segment_key
+
+ nouveau_noeud = {
+ "r": r_new,
+ "theta": theta_new,
+ "index": prochain_indice,
+ "initial": False, # Nouveau nœud intermédiaire
+ "sam": False,
+ "boundary": is_boundary, # Hériter le statut boundary
+ "fixed": False
+ }
+
+ # Ajouter au cercle correspondant
+ nouveau_k_noeuds_n_cercle_polaire[cercle].append(nouveau_noeud)
+
+ # Mapper le segment au nouvel indice pour mise à jour des cellules
+ map_segments_cercles_indices[segment_key] = prochain_indice
+ prochain_indice += 1
+
+ # Trier les noeuds de chaque cercle par angle
+ for i in range(n):
+ if i < len(nouveau_k_noeuds_n_cercle_polaire):
+ nouveau_k_noeuds_n_cercle_polaire[i].sort(key=lambda point: point["theta"])
+
+ # Mettre à jour les cellules
+ maj_cellules = []
+ for cellule in nouvelles_cellules:
+ nouvelle_liste_noeuds = []
+ noeuds = cellule["noeuds"]
+
+ for i in range(len(noeuds)):
+ idx1 = noeuds[i]
+ idx2 = noeuds[(i + 1) % len(noeuds)]
+
+ nouvelle_liste_noeuds.append(idx1)
+
+ # Vérifier si ce segment a été raffiné (cercle)
+ segment_key = tuple(sorted([idx1, idx2]))
+ if segment_key in map_segments_cercles_indices:
+ nouvelle_liste_noeuds.append(map_segments_cercles_indices[segment_key])
+
+ nouvelle_cellule = cellule.copy()
+ nouvelle_cellule["noeuds"] = nouvelle_liste_noeuds
+ maj_cellules.append(nouvelle_cellule)
+
+ nouvelles_cellules = maj_cellules
+ # Marquer les noeuds de la cellule centrale (index 0) comme fixes
+ if nouvelles_cellules and nouvelles_cellules[0]["index"] == 0:
+ indices_noeuds_centre = nouvelles_cellules[0]["noeuds"]
+ # Construire un dictionnaire d'accès rapide à tous les noeuds
+ noeuds_dict = {noeud["index"]: noeud for cercle in nouveau_k_noeuds_n_cercle_polaire for noeud in cercle}
+ for idx in indices_noeuds_centre:
+ if idx in noeuds_dict:
+ noeuds_dict[idx]["fixed"] = True
+
+
+
+
+
+ # Phase 2: Remaillage des segments radiaux entre nœuds UNIQUEMENT où des segments radiaux existent déjà
+ iterations_radiaux = 0
+ segments_radiaux_raffines = True
+
+ while segments_radiaux_raffines and iterations_radiaux < 5:
+ iterations_radiaux += 1
+ segments_radiaux_raffines = False
+
+ # Convertir en coordonnées cartésiennes pour le calcul des distances
+ noeuds_cartesien = {}
+ for i_cercle in range(len(nouveau_k_noeuds_n_cercle_polaire)):
+ for noeud in nouveau_k_noeuds_n_cercle_polaire[i_cercle]:
+ r = noeud["r"]
+ theta = noeud["theta"]
+ index = noeud["index"]
+ initial = noeud["initial"]
+ boundary = noeud["boundary"]
+ x = r * math.cos(theta)
+ y = r * math.sin(theta)
+ noeuds_cartesien[index] = (x, y, r, theta, i_cercle, initial, boundary)
+
+ # Ajouter les noeuds radiaux à la liste des noeuds cartésiens
+ for noeud in noeuds_radiaux:
+ r = noeud["r"]
+ theta = noeud["theta"]
+ index = noeud["index"]
+ initial = noeud["initial"]
+ boundary = noeud["boundary"]
+ x = r * math.cos(theta)
+ y = r * math.sin(theta)
+ noeuds_cartesien[index] = (x, y, r, theta, -1, initial, boundary)
+
+ # Collecter les segments radiaux existants dans les cellules
+ segments_radiaux_existants = set()
+ for cellule in nouvelles_cellules:
+ noeuds = cellule["noeuds"]
+ for i in range(len(noeuds)):
+ idx1 = noeuds[i]
+ idx2 = noeuds[(i + 1) % len(noeuds)]
+
+ if idx1 in noeuds_cartesien and idx2 in noeuds_cartesien:
+ x1, y1, r1, theta1, cercle1, _, _ = noeuds_cartesien[idx1]
+ x2, y2, r2, theta2, cercle2, _, _ = noeuds_cartesien[idx2]
+
+ # Vérifier si c'est un segment radial (rayons différents)
+ if abs(r1 - r2) > 0.001: # Tolérance pour éviter erreurs d'arrondi
+ segments_radiaux_existants.add(tuple(sorted([idx1, idx2])))
+
+ # Dictionnaire pour stocker les nouveaux nœuds à ajouter
+ segments_radiaux_a_raffiner = {}
+
+ # Pour chaque segment radial existant
+ for segment in segments_radiaux_existants:
+ idx1, idx2 = segment
+
+ if idx1 in noeuds_cartesien and idx2 in noeuds_cartesien:
+ x1, y1, r1, theta1, cercle1, initial1, boundary1 = noeuds_cartesien[idx1]
+ x2, y2, r2, theta2, cercle2, initial2, boundary2 = noeuds_cartesien[idx2]
+
+ # Distance euclidienne entre les deux noeuds
+ distance = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
+
+ # Si la distance est supérieure au seuil, on ajoute un nœud intermédiaire
+ if distance > longueur_seuil_radial:
+ # Calculer la position du nouveau nœud intermédiaire
+ x_new = (x1 + x2) / 2
+ y_new = (y1 + y2) / 2
+ r_new = math.sqrt(x_new**2 + y_new**2)
+ theta_new = math.atan2(y_new, x_new)
+ if theta_new < 0:
+ theta_new += 2 * math.pi
+
+ # Hériter le statut boundary si l'un des nœuds est boundary
+ is_boundary = boundary1 or boundary2
+
+ # Sauvegarder les coordonnées du nouveau nœud
+ segments_radiaux_a_raffiner[segment] = (x_new, y_new, r_new, theta_new, is_boundary)
+ segments_radiaux_raffines = True
+
+ # Assigner des indices aux nouveaux noeuds radiaux
+ indices_max = [noeud["index"] for cercle in nouveau_k_noeuds_n_cercle_polaire for noeud in cercle]
+ indices_max.extend([noeud["index"] for noeud in noeuds_radiaux])
+ prochain_indice = max(indices_max) + 1 if indices_max else 0
+
+ # Créer les nouveaux noeuds radiaux
+ map_segments_radiaux_indices = {}
+ for segment_key, (x_new, y_new, r_new, theta_new, is_boundary) in segments_radiaux_a_raffiner.items():
+ idx1, idx2 = segment_key
+
+ nouveau_noeud = {
+ "r": r_new,
+ "theta": theta_new,
+ "index": prochain_indice,
+ "initial": False, # Nouveau nœud intermédiaire
+ "sam": False,
+ "boundary": False,
+ "fixed": False
+ }
+
+ # Ajouter aux nœuds radiaux
+ noeuds_radiaux.append(nouveau_noeud)
+
+ # Mapper le segment au nouvel indice pour mise à jour des cellules
+ map_segments_radiaux_indices[segment_key] = prochain_indice
+ prochain_indice += 1
+
+ # Mettre à jour les cellules avec les nouveaux noeuds radiaux
+ maj_cellules = []
+ for cellule in nouvelles_cellules:
+ nouvelle_liste_noeuds = []
+ noeuds = cellule["noeuds"]
+
+ for i in range(len(noeuds)):
+ idx1 = noeuds[i]
+ idx2 = noeuds[(i + 1) % len(noeuds)]
+
+ nouvelle_liste_noeuds.append(idx1)
+
+ # Vérifier si ce segment a été raffiné (radialement)
+ segment_key = tuple(sorted([idx1, idx2]))
+ if segment_key in map_segments_radiaux_indices:
+ nouvelle_liste_noeuds.append(map_segments_radiaux_indices[segment_key])
+
+ nouvelle_cellule = cellule.copy()
+ nouvelle_cellule["noeuds"] = nouvelle_liste_noeuds
+ maj_cellules.append(nouvelle_cellule)
+
+ nouvelles_cellules = maj_cellules
+
+ k_noeuds_n_cercle_polaire_final = []
+ for cercle in nouveau_k_noeuds_n_cercle_polaire:
+ k_noeuds_n_cercle_polaire_final.append(cercle)
+
+ # Créer un cercle virtuel pour les noeuds radiaux (permet de rester compatible avec le format attendu)
+ if noeuds_radiaux:
+ k_noeuds_n_cercle_polaire_final.append(noeuds_radiaux)
+
+ return k_noeuds_n_cercle_polaire_final, nouvelles_cellules
+
+
+
+
+
+
+#----------------------------------------------------------------------------------------------------#
+#-------------------------------------walls-------------------------------------------#
+#----------------------------------------------------------------------------------------------------#
+
+def generer_walls_initiaux(k_noeuds_n_cercle_cartesien, cellules_list):
+ """
+ Génère les walls (parois) entre les cellules adjacentes.
+
+ Args:
+ k_noeuds_n_cercle_cartesien: Liste des noeuds en coordonnées cartésiennes
+ cellules_list: Liste des cellules
+
+ Returns:
+ Liste des walls générés
+ """
+ # Créer un dictionnaire pour accès rapide aux noeuds
+ noeuds_dict = {}
+ for noeud in k_noeuds_n_cercle_cartesien:
+ noeuds_dict[noeud["index"]] = (noeud["x"], noeud["y"], noeud.get("initial", False),
+ noeud.get("boundary", False))
+
+ # Identifier les segments et les cellules qui les partagent
+ segments_par_cellule = {}
+ for cellule in cellules_list:
+ noeuds = cellule["noeuds"]
+ cell_index = cellule["index"]
+
+ # Pour chaque paire de noeuds consécutifs
+ for i in range(len(noeuds)):
+ n1 = noeuds[i]
+ n2 = noeuds[(i + 1) % len(noeuds)]
+ segment = tuple(sorted([n1, n2]))
+
+ # Ajouter la cellule à ce segment
+ if segment not in segments_par_cellule:
+ segments_par_cellule[segment] = []
+ segments_par_cellule[segment].append(cell_index)
+
+ # Générer les walls uniquement pour les segments partagés par deux cellules
+ walls_liste = []
+ wall_index = 0
+
+ for segment, cellules in segments_par_cellule.items():
+ # Un wall ne peut exister qu'entre deux cellules
+ if len(cellules) == 2:
+ n1, n2 = segment
+ c1, c2 = sorted(cellules)
+
+ # Vérifier que les noeuds existent et sont initiaux
+ if n1 in noeuds_dict and n2 in noeuds_dict:
+ _, _, initial1, boundary1 = noeuds_dict[n1]
+ _, _, initial2, boundary2 = noeuds_dict[n2]
+
+ # Vérifier que les deux noeuds sont initiaux
+ if initial1 and initial2:
+ # Ne pas créer de wall si les deux noeuds sont sur la frontière
+ if boundary1 and boundary2:
+ continue
+
+ # Calculer la longueur du wall
+ (x1, y1, _, _), (x2, y2, _, _) = noeuds_dict[n1], noeuds_dict[n2]
+ longueur = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
+
+ # Créer le wall avec exactement la structure demandée
+ wall = {
+ "length": f"{longueur:.4f}",
+ "c1": str(c1),
+ "c2": str(c2),
+ "n1": str(n1),
+ "n2": str(n2),
+ "wall_type": "normal",
+ "viz_flux": "0",
+ "index": str(wall_index)
+ }
+
+ walls_liste.append(wall)
+ wall_index += 1
+
+ return walls_liste
+
+
+#----------------------------------------------------------------------------------------------------#
+#------------------------- Aire cellules ---------------------------------------------------------------------#
+#----------------------------------------------------------------------------------------------------#
+
+def shoelace_formula(cellules_list, noeuds_list, absoluteValue=True):
+ """
+ Calcule l'aire de chaque cellule en utilisant la formule de Shoelace (Gauss).
+
+ Args:
+ cellules_list: Liste des cellules à traiter
+ noeuds_list: Liste des noeuds avec leurs coordonnées
+ absoluteValue: Si True, retourne la valeur absolue de l'aire
+
+ Returns:
+ Liste des cellules avec l'aire calculée
+ """
+ # Optimisation par précalcul du dictionnaire de coordonnées
+ noeuds_dict = {}
+ for noeud in noeuds_list:
+ noeuds_dict[noeud["index"]] = (noeud["x"], noeud["y"])
+
+ # Préallocation de la liste de résultat
+ n_cellules = len(cellules_list)
+ cellules_avec_aire = [None] * n_cellules
+
+ # Traitement optimisé par cellule
+ for i, cellule in enumerate(cellules_list):
+ indices_noeuds = cellule["noeuds"]
+ nb_noeuds = len(indices_noeuds)
+
+ # Traitement rapide des polygones dégénérés
+ if nb_noeuds < 3:
+ cellule_maj = cellule.copy()
+ cellule_maj["area"] = 0.0
+ cellules_avec_aire[i] = cellule_maj
+ continue
+
+ # Extraction optimisée des coordonnées avec gestion d'erreur intégrée
+ try:
+ # Extraction en une seule fois pour éviter les accès répétés
+ coords = [noeuds_dict[idx] for idx in indices_noeuds]
+
+ # Boucle unifiée pour le calcul de l'aire (sans allocation supplémentaire)
+ somme = 0.0
+ for j in range(nb_noeuds):
+ k = (j + 1) % nb_noeuds
+ # Formule de Shoelace optimisée
+ somme += coords[j][0] * coords[k][1] - coords[k][0] * coords[j][1]
+
+ # Calcul final avec une seule multiplication
+ aire = abs(somme * 0.5) if absoluteValue else somme * 0.5
+
+ except KeyError:
+ # En cas d'indice invalide, attribuer une aire nulle
+ aire = 0.0
+
+ # Minimiser les copies en utilisant copy() au lieu de deepcopy()
+ cellule_maj = cellule.copy()
+ cellule_maj["area"] = aire
+ cellules_avec_aire[i] = cellule_maj
+
+ return cellules_avec_aire
+
+
+def calculer_aire_totale_boundary(noeuds_list, absoluteValue=True):
+ """
+ Calcule l'aire totale du tissu en utilisant uniquement les noeuds marqués comme boundary.
+ Version optimisée.
+
+ Args:
+ noeuds_list: Liste des noeuds avec leurs coordonnées
+ absoluteValue: Si True, retourne la valeur absolue de l'aire
+
+ Returns:
+ Aire totale du tissu délimité par les noeuds boundary
+ """
+ # Extraction directe des noeuds boundary (plus efficace qu'une compréhension de liste)
+ noeuds_boundary = []
+ for noeud in noeuds_list:
+ if noeud.get("boundary", False):
+ noeuds_boundary.append(noeud)
+
+ # Vérification rapide du nombre de noeuds
+ n_noeuds = len(noeuds_boundary)
+ if n_noeuds < 3:
+ return 0.0
+
+ # Calcul du véritable centroïde (dans la version originale, il était initialisé à 0,0)
+ centre_x = sum(noeud["x"] for noeud in noeuds_boundary) / n_noeuds
+ centre_y = sum(noeud["y"] for noeud in noeuds_boundary) / n_noeuds
+
+ # Pré-calcul des angles pour le tri (évite les calculs répétés)
+ noeuds_avec_angle = []
+ for noeud in noeuds_boundary:
+ dx = noeud["x"] - centre_x
+ dy = noeud["y"] - centre_y
+ angle = math.atan2(dy, dx)
+ if angle < 0:
+ angle += 2 * math.pi
+ noeuds_avec_angle.append((noeud, angle))
+
+ # Tri efficace
+ noeuds_avec_angle.sort(key=lambda x: x[1])
+
+ # Préextraction des coordonnées pour un accès plus rapide
+ coords_x = []
+ coords_y = []
+ for noeud, _ in noeuds_avec_angle:
+ coords_x.append(noeud["x"])
+ coords_y.append(noeud["y"])
+
+ # Formule de Shoelace optimisée en une seule passe
+ aire = 0.0
+ for i in range(n_noeuds):
+ j = (i + 1) % n_noeuds
+ # Version optimisée de la formule
+ aire += (coords_x[i] * coords_y[j]) - (coords_x[j] * coords_y[i])
+
+ # Division par 2 une seule fois à la fin
+ aire *= 0.5
+
+ return abs(aire) if absoluteValue else aire
+
+#----------------------------------------------------------------------------------------------------#
+#--------- VISUALISATION DES POINTS ET CERCLES ------------------------------------------------------#
+#----------------------------------------------------------------------------------------------------#
+
+def tracer_points_cercles(k_noeuds, n, a, cellules=None):
+ """ Visualise les noeuds, les cercles et les segments radiaux.
+
+ Args:
+ k_noeuds_n_cercle_polaire: Liste des noeuds en coordonnées polaires
+ n: Nombre de cercles
+ a: Liste des nombres de cellules/points par cercle
+
+ Returns:
+ None. Affiche un graphique avec matplotlib. """
+
+ plt.figure(figsize=(10, 10))
+
+ # Couleurs différentes pour chaque cercle
+ couleurs = ['r', 'g', 'b', 'm', 'c', 'y', 'k', 'orange', 'purple', 'brown']
+ couleur_radiale = 'gray' # Couleur pour les segments radiaux
+ est_format_cartesien = not isinstance(k_noeuds[0], list)
+ # Grouper les noeuds par rayon pour identifier les cercles
+ noeuds_par_rayon = {}
+ if est_format_cartesien:
+ # Traitement des noeuds cartésiens (liste plate)
+ for noeud in k_noeuds:
+ # Calculer r pour le groupement
+ if "r" in noeud:
+ r = noeud["r"]
+ else:
+ r = math.sqrt(noeud["x"] ** 2 + noeud["y"] ** 2)
+
+ if r not in noeuds_par_rayon:
+ noeuds_par_rayon[r] = []
+
+ # S'assurer que les coordonnées cartésiennes sont présentes
+ if "x" not in noeud or "y" not in noeud:
+ noeud["x"] = r * math.cos(noeud["theta"])
+ noeud["y"] = r * math.sin(noeud["theta"])
+
+ noeuds_par_rayon[r].append(noeud)
+ else:
+ # Traitement original pour les noeuds polaires (liste de listes)
+ for i_cercle in range(len(k_noeuds)):
+ for point in k_noeuds[i_cercle]:
+ r = point["r"]
+ if r not in noeuds_par_rayon:
+ noeuds_par_rayon[r] = []
+
+ # Ajouter les coordonnées cartésiennes calculées
+ x = r * math.cos(point["theta"])
+ y = r * math.sin(point["theta"])
+ point_avec_xy = point.copy()
+ point_avec_xy["x"] = x
+ point_avec_xy["y"] = y
+ noeuds_par_rayon[r].append(point_avec_xy)
+
+ # Dictionnaire pour accès rapide aux coordonnées
+ noeuds_dict = {}
+ for rayon, points in noeuds_par_rayon.items():
+ for point in points:
+ noeuds_dict[point["index"]] = (point["x"], point["y"], rayon)
+
+
+ # Segments déjà tracés (pour éviter les doublons)
+ segments_traces = set()
+
+ # Tracer chaque cercle et ses points
+ for i, (rayon, points) in enumerate(sorted(noeuds_par_rayon.items())):
+ # Séparer les nœuds initiaux des nœuds raffinés
+ points_initiaux = [point for point in points if point.get("initial", False)]
+ points_raffines = [point for point in points if not point.get("initial", False)]
+
+ # Tracer les points initiaux
+ x_init = [p["x"] for p in points_initiaux]
+ y_init = [p["y"] for p in points_initiaux]
+ indices_init = [p["index"] for p in points_initiaux]
+ if x_init:
+ plt.scatter(x_init, y_init, color=couleurs[i % len(couleurs)], marker='o',
+ label=f'Cercle {i} (initial)' if i == 0 else "")
+
+ # Tracer les points raffinés
+ x_raff = [p["x"] for p in points_raffines]
+ y_raff = [p["y"] for p in points_raffines]
+ indices_raff = [p["index"] for p in points_raffines]
+ if x_raff:
+ plt.scatter(x_raff, y_raff, color=couleurs[i % len(couleurs)], marker='x',
+ label=f'Cercle {i} (raffiné)' if i == 0 else "")
+
+ # Afficher les indices des nœuds
+ for j in range(len(x_init)):
+ plt.text(x_init[j] + 0.3, y_init[j] + 0.3, str(indices_init[j]), fontsize=8,
+ bbox=dict(facecolor='white', alpha=0.7, edgecolor='none'))
+ for j in range(len(x_raff)):
+ plt.text(x_raff[j] + 0.3, y_raff[j] + 0.3, str(indices_raff[j]), fontsize=8,
+ bbox=dict(facecolor='lightyellow', alpha=0.7, edgecolor='none'))
+
+ # Tracer les segments à partir des cellules
+ if cellules:
+ rayons_tries = sorted(noeuds_par_rayon.keys())
+ for cellule in cellules:
+ noeuds = cellule["noeuds"]
+ for i in range(len(noeuds)):
+ idx1 = noeuds[i]
+ idx2 = noeuds[(i + 1) % len(noeuds)]
+
+ segment_key = tuple(sorted([idx1, idx2]))
+ if segment_key in segments_traces:
+ continue
+
+ if idx1 in noeuds_dict and idx2 in noeuds_dict:
+ x1, y1, rayon1 = noeuds_dict[idx1]
+ x2, y2, rayon2 = noeuds_dict[idx2]
+
+ # Tracer le segment selon le type
+ if rayon1 == rayon2: # Segment sur le même cercle
+ i_couleur = rayons_tries.index(rayon1) % len(couleurs)
+ plt.plot([x1, x2], [y1, y2],
+ color=couleurs[i_couleur],
+ linestyle='-', linewidth=1)
+ else: # Segment radial
+ plt.plot([x1, x2], [y1, y2],
+ color=couleur_radiale,
+ linestyle='--', linewidth=0.8)
+
+ segments_traces.add(segment_key)
+
+ plt.grid(True)
+ plt.axis('equal')
+ plt.title('Visualisation des cercles (o=initial, x=raffiné)')
+ plt.xlabel('x')
+ plt.ylabel('y')
+ plt.show()
+
+
+
+
+#----------------------------------------------------------------------------------------------------#
+#---------- VISUALISATION DES CELLULES --------------------------------------------------------------#
+#----------------------------------------------------------------------------------------------------#
+def tracer_cellules(points, cellules):
+ """ Visualise les cellules avec leur indice au centre.
+
+ Args:
+ k_noeuds_n_cercle_cartesien: Liste des noeuds en coordonnées cartésiennes
+ cellules: Liste des cellules définies par leurs indices de noeuds
+
+ Returns:
+ None. Affiche un graphique avec matplotlib. """
+
+ plt.figure(figsize=(10, 10))
+
+ # Couleurs différentes pour colorer les cellules par groupe
+ couleurs = ['r', 'g', 'b', 'm', 'c', 'y', 'k', 'orange', 'purple', 'brown']
+
+
+ noeuds_dict = {} # Créer un dictionnaire pour accéder rapidement aux coordonnées des noeuds
+ noeuds_initiaux = set() # Pour distinguer les noeuds initiaux des noeuds raffinés
+
+ for point in points:
+ if isinstance(point, dict) and "index" in point:
+ # Récupérer les coordonnées cartésiennes du point
+ if "x" in point and "y" in point:
+ noeuds_dict[point["index"]] = (point["x"], point["y"])
+ elif "r" in point and "theta" in point:
+ # Convertir de polaire à cartésien
+ r = point["r"]
+ theta = point["theta"]
+ x = r * math.cos(theta)
+ y = r * math.sin(theta)
+ noeuds_dict[point["index"]] = (x, y)
+
+ # Marquer les noeuds initiaux
+ if point.get("initial", False):
+ noeuds_initiaux.add(point["index"])
+
+ # Identifier les rayons pour grouper les cellules (code existant)
+ rayons_cellules = {}
+ for cellule in cellules:
+ # Code de groupement inchangé
+ cell_type = cellule.get("cell_type", 0)
+ if cell_type not in rayons_cellules:
+ rayons_cellules[cell_type] = []
+ rayons_cellules[cell_type].append(cellule)
+
+ # Tracer les polygones des cellules
+ for i, (rayon, groupe_cellules) in enumerate(sorted(rayons_cellules.items())):
+ couleur = couleurs[i % len(couleurs)]
+ for cellule in groupe_cellules:
+ # Récupérer les coordonnées des noeuds de la cellule
+ coords = []
+ for noeud_idx in cellule["noeuds"]:
+ if noeud_idx in noeuds_dict:
+ coords.append(noeuds_dict[noeud_idx])
+
+ # Tracer le polygone
+ if len(coords) >= 3:
+ xs, ys = zip(*coords)
+ plt.fill(xs, ys, alpha=0.5, color=couleur, edgecolor='black')
+
+ # Ajouter l'indice de la cellule au centre
+ centre_x = sum(xs) / len(xs)
+ centre_y = sum(ys) / len(ys)
+ plt.text(centre_x, centre_y, str(cellule["index"]),
+ ha='center', va='center', fontweight='bold')
+
+ # Tracer tous les noeuds
+ for noeud_idx, (x, y) in noeuds_dict.items():
+ # Utiliser un marqueur différent selon le type de noeud
+ marker = 'o' if noeud_idx in noeuds_initiaux else 'x'
+ plt.scatter(x, y, color='black', marker=marker, s=30, zorder=3)
+ plt.text(x + 0.2, y + 0.2, str(noeud_idx), fontsize=8,
+ bbox=dict(facecolor='white', alpha=0.7, edgecolor='none'))
+
+ # Tracer les segments entre noeuds consécutifs de chaque cellule
+ segments_traces = set()
+ for cellule in cellules:
+ noeuds = cellule["noeuds"]
+ for i in range(len(noeuds)):
+ idx1 = noeuds[i]
+ idx2 = noeuds[(i + 1) % len(noeuds)]
+
+ segment_key = tuple(sorted([idx1, idx2]))
+ if segment_key not in segments_traces and idx1 in noeuds_dict and idx2 in noeuds_dict:
+ x1, y1 = noeuds_dict[idx1]
+ x2, y2 = noeuds_dict[idx2]
+ plt.plot([x1, x2], [y1, y2], 'k-', linewidth=1, alpha=0.7, zorder=2)
+ segments_traces.add(segment_key)
+
+ plt.grid(True)
+ plt.axis('equal')
+ plt.title('Visualisation des cellules avec noeuds intermédiaires')
+ plt.xlabel('x')
+ plt.ylabel('y')
+ plt.show()
+
+
+
+#----------------------------------------------------------------------------------------------------#
+#------------------------- MAIN ---------------------------------------------------------------------#
+#----------------------------------------------------------------------------------------------------#
+""" Programme principal. """
+
+
+def generer_donnees():
+
+ #1st Radius
+ rayon_0 = 300
+
+ #Number of cells per rings
+ a = [20,20,25]
+
+ # Type of cells (must be length of a) : 0 = bark, 1 = cambium 2 = Growing Xylem, 3 = Mature Xylem
+ cell_type = [2,1,0]
+
+ #ratio between width and length of initial cells, pilots radius
+ rapport_R_T = [0.5,0.5,0.25]
+
+ #Number of radius, length of a +1 bcs len(a) is the number of cell rings except ring 0
+ n = len(a)+1
+
+ seuil_proximite = 0.1
+ longueur_max_cercles = 10 # Seuil pour les segments circulaires
+ longueur_max_radiaux = 10 # Seuil pour les segments radiaux
+ maillage = True
+
+ rayons_n_cercles = n_cercles(n, rayon_0, a, rapport_R_T)
+ k_noeuds_n_cercle_polaire_initial, index_noeud_max = creer_noeuds_initiaux(n, rayons_n_cercles, a)
+ k_noeuds_n_cercle_polaire, map_indices = fusionner_noeuds(k_noeuds_n_cercle_polaire_initial, n, index_noeud_max)
+ cellules_list = creer_cellules(k_noeuds_n_cercle_polaire, n, a,cell_type)
+ if not(maillage):
+
+ #Walls
+ k_noeuds_n_cercle_cartesien = polaire_vers_cartesien(k_noeuds_n_cercle_polaire)
+ liste_walls = generer_walls_initiaux(k_noeuds_n_cercle_cartesien, cellules_list)
+ cellules_finales = shoelace_formula(cellules_list, k_noeuds_n_cercle_cartesien)
+ basearea = calculer_aire_totale_boundary(k_noeuds_n_cercle_cartesien) / (len(cellules_finales))
+ #Tracé
+ # tracer_points_cercles(k_noeuds_n_cercle_polaire, n, a, cellules_list)
+ # tracer_cellules(polaire_vers_cartesien(k_noeuds_n_cercle_polaire, n, a), cellules_list)
+ #
+ # print(f"Aire totale du tissu : {basearea:.4f}")
+
+ return k_noeuds_n_cercle_cartesien, cellules_finales, liste_walls, basearea
+
+ else :
+ k_noeuds_n_cercle_polaire_raffine, cellules_list_raffine = raffiner_maillage_separe(
+ k_noeuds_n_cercle_polaire, n, cellules_list,
+ longueur_max_cercles, longueur_max_radiaux,
+ rayons_n_cercles, seuil_proximite
+ )
+
+ #Walls
+ k_noeuds_n_cercle_cartesien_raffine = polaire_vers_cartesien(k_noeuds_n_cercle_polaire_raffine)
+ liste_walls = generer_walls_initiaux(k_noeuds_n_cercle_cartesien_raffine, cellules_list_raffine)
+ cellules_finales = shoelace_formula(cellules_list_raffine, k_noeuds_n_cercle_cartesien_raffine)
+ basearea = calculer_aire_totale_boundary(k_noeuds_n_cercle_cartesien_raffine) / (len(cellules_finales))
+ print(f"Aire totale du tissu : {basearea:.4f}")
+
+ # Tracé
+ k_noeuds_n_cercle_cartesien_raffine = polaire_vers_cartesien(k_noeuds_n_cercle_polaire_raffine)
+ tracer_points_cercles(k_noeuds_n_cercle_polaire_raffine, n, a, cellules_list_raffine)
+ # tracer_cellules(polaire_vers_cartesien(k_noeuds_n_cercle_polaire_raffine, n, a), cellules_list_raffine)
+
+ return k_noeuds_n_cercle_cartesien_raffine, cellules_finales, liste_walls, basearea
+
+
+
+
+
+ # k_noeuds_renommes, cellules_renommees, walls_renommes = reindexer_noeuds_par_cellule(
+ # k_noeuds_n_cercle_cartesien_raffine,
+ # cellules_list_raffine,
+ # liste_walls
+ # )
+
+
+
+
+
+
+
+
+
+
+
+
+generer_donnees()
\ No newline at end of file
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)
| | | | | |