diff --git a/catalogs/greenery/ecore_greenery/greenerycatalog.ecore b/catalogs/greenery/ecore_greenery/greenerycatalog.ecore
new file mode 100644
index 00000000..5c3bb85d
--- /dev/null
+++ b/catalogs/greenery/ecore_greenery/greenerycatalog.ecore
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/catalogs/greenery/ecore_greenery/greenerycatalog.py b/catalogs/greenery/ecore_greenery/greenerycatalog.py
new file mode 100644
index 00000000..30ac116c
--- /dev/null
+++ b/catalogs/greenery/ecore_greenery/greenerycatalog.py
@@ -0,0 +1,318 @@
+"""Definition of meta model 'greenerycatalog'."""
+from functools import partial
+import pyecore.ecore as Ecore
+from pyecore.ecore import *
+
+
+name = 'greenerycatalog'
+nsURI = 'http://ca.concordia/greenerycatalog'
+nsPrefix = 'greenery'
+
+eClass = EPackage(name=name, nsURI=nsURI, nsPrefix=nsPrefix)
+
+eClassifiers = {}
+getEClassifier = partial(Ecore.getEClassifier, searchspace=eClassifiers)
+Management = EEnum('Management', literals=['Intensive', 'Extensive', 'SemiIntensive', 'NA'])
+
+Roughness = EEnum('Roughness', literals=['VeryRough', 'Rough',
+ 'MediumRough', 'MediumSmooth', 'Smooth', 'VerySmooth'])
+
+
+class Soil(EObject, metaclass=MetaEClass):
+
+ name = EAttribute(eType=EString, unique=True, derived=False, changeable=True)
+ roughness = EAttribute(eType=Roughness, unique=True, derived=False,
+ changeable=True, default_value=Roughness.MediumRough)
+ conductivityOfDrySoil = EAttribute(
+ eType=EString, unique=True, derived=False, changeable=True, default_value='1.0 W/(m*K)')
+ densityOfDrySoil = EAttribute(eType=EString, unique=True, derived=False,
+ changeable=True, default_value='1100 kg/m³')
+ specificHeatOfDrySoil = EAttribute(
+ eType=EString, unique=True, derived=False, changeable=True, default_value='1200 J/(kg*K)')
+ thermalAbsorptance = EAttribute(eType=EString, unique=True,
+ derived=False, changeable=True, default_value='0.9')
+ solarAbsorptance = EAttribute(eType=EString, unique=True,
+ derived=False, changeable=True, default_value='0.7')
+ visibleAbsorptance = EAttribute(eType=EString, unique=True,
+ derived=False, changeable=True, default_value='0.75')
+ saturationVolumetricMoistureContent = EAttribute(
+ eType=EString, unique=True, derived=False, changeable=True, default_value='0.0')
+ residualVolumetricMoistureContent = EAttribute(
+ eType=EString, unique=True, derived=False, changeable=True, default_value='0.05')
+ initialVolumetricMoistureContent = EAttribute(
+ eType=EString, unique=True, derived=False, changeable=True, default_value='0.1')
+
+ def __init__(self, *, name=None, roughness=None, conductivityOfDrySoil=None, densityOfDrySoil=None, specificHeatOfDrySoil=None, thermalAbsorptance=None, solarAbsorptance=None, visibleAbsorptance=None, saturationVolumetricMoistureContent=None, residualVolumetricMoistureContent=None, initialVolumetricMoistureContent=None):
+ # if kwargs:
+ # raise AttributeError('unexpected arguments: {}'.format(kwargs))
+
+ super().__init__()
+
+ if name is not None:
+ self.name = name
+
+ if roughness is not None:
+ self.roughness = roughness
+
+ if conductivityOfDrySoil is not None:
+ self.conductivityOfDrySoil = conductivityOfDrySoil
+
+ if densityOfDrySoil is not None:
+ self.densityOfDrySoil = densityOfDrySoil
+
+ if specificHeatOfDrySoil is not None:
+ self.specificHeatOfDrySoil = specificHeatOfDrySoil
+
+ if thermalAbsorptance is not None:
+ self.thermalAbsorptance = thermalAbsorptance
+
+ if solarAbsorptance is not None:
+ self.solarAbsorptance = solarAbsorptance
+
+ if visibleAbsorptance is not None:
+ self.visibleAbsorptance = visibleAbsorptance
+
+ if saturationVolumetricMoistureContent is not None:
+ self.saturationVolumetricMoistureContent = saturationVolumetricMoistureContent
+
+ if residualVolumetricMoistureContent is not None:
+ self.residualVolumetricMoistureContent = residualVolumetricMoistureContent
+
+ if initialVolumetricMoistureContent is not None:
+ self.initialVolumetricMoistureContent = initialVolumetricMoistureContent
+
+
+class Plant(EObject, metaclass=MetaEClass):
+
+ name = EAttribute(eType=EString, unique=True, derived=False, changeable=True)
+ height = EAttribute(eType=EString, unique=True, derived=False,
+ changeable=True, default_value='0.1 m')
+ leafAreaIndex = EAttribute(eType=EString, unique=True, derived=False,
+ changeable=True, default_value='2.5')
+ leafReflectivity = EAttribute(eType=EString, unique=True,
+ derived=False, changeable=True, default_value='0.1')
+ leafEmissivity = EAttribute(eType=EString, unique=True, derived=False,
+ changeable=True, default_value='0.9')
+ minimalStomatalResistance = EAttribute(
+ eType=EString, unique=True, derived=False, changeable=True, default_value='100.0 s/m')
+ co2Sequestration = EAttribute(eType=EString, unique=True, derived=False,
+ changeable=True, default_value='kgCO₂eq')
+ growsOn = EReference(ordered=True, unique=True, containment=False, derived=False, upper=-1)
+
+ def __init__(self, *, name=None, height=None, leafAreaIndex=None, leafReflectivity=None, leafEmissivity=None, minimalStomatalResistance=None, growsOn=None, co2Sequestration=None):
+ # if kwargs:
+ # raise AttributeError('unexpected arguments: {}'.format(kwargs))
+
+ super().__init__()
+
+ if name is not None:
+ self.name = name
+
+ if height is not None:
+ self.height = height
+
+ if leafAreaIndex is not None:
+ self.leafAreaIndex = leafAreaIndex
+
+ if leafReflectivity is not None:
+ self.leafReflectivity = leafReflectivity
+
+ if leafEmissivity is not None:
+ self.leafEmissivity = leafEmissivity
+
+ if minimalStomatalResistance is not None:
+ self.minimalStomatalResistance = minimalStomatalResistance
+
+ if co2Sequestration is not None:
+ self.co2Sequestration = co2Sequestration
+
+ if growsOn:
+ self.growsOn.extend(growsOn)
+
+
+class SupportEnvelope(EObject, metaclass=MetaEClass):
+
+ roughness = EAttribute(eType=Roughness, unique=True, derived=False,
+ changeable=True, default_value=Roughness.MediumRough)
+ solarAbsorptance = EAttribute(eType=EDouble, unique=True,
+ derived=False, changeable=True, default_value=0.0)
+ conductivity = EAttribute(eType=EDouble, unique=True, derived=False,
+ changeable=True, default_value=0.0)
+ visibleAbsorptance = EAttribute(eType=EDouble, unique=True,
+ derived=False, changeable=True, default_value=0.0)
+ specificHeat = EAttribute(eType=EDouble, unique=True, derived=False,
+ changeable=True, default_value=0.0)
+ density = EAttribute(eType=EDouble, unique=True, derived=False,
+ changeable=True, default_value=0.0)
+ thermalAbsorptance = EAttribute(eType=EDouble, unique=True,
+ derived=False, changeable=True, default_value=0.0)
+
+ def __init__(self, *, roughness=None, solarAbsorptance=None, conductivity=None, visibleAbsorptance=None, specificHeat=None, density=None, thermalAbsorptance=None):
+ # if kwargs:
+ # raise AttributeError('unexpected arguments: {}'.format(kwargs))
+
+ super().__init__()
+
+ if roughness is not None:
+ self.roughness = roughness
+
+ if solarAbsorptance is not None:
+ self.solarAbsorptance = solarAbsorptance
+
+ if conductivity is not None:
+ self.conductivity = conductivity
+
+ if visibleAbsorptance is not None:
+ self.visibleAbsorptance = visibleAbsorptance
+
+ if specificHeat is not None:
+ self.specificHeat = specificHeat
+
+ if density is not None:
+ self.density = density
+
+ if thermalAbsorptance is not None:
+ self.thermalAbsorptance = thermalAbsorptance
+
+
+class GreeneryCatalog(EObject, metaclass=MetaEClass):
+
+ name = EAttribute(eType=EString, unique=True, derived=False, changeable=True)
+ description = EAttribute(eType=EString, unique=True, derived=False, changeable=True)
+ source = EAttribute(eType=EString, unique=True, derived=False, changeable=True)
+ plantCategories = EReference(ordered=True, unique=True,
+ containment=True, derived=False, upper=-1)
+ vegetationCategories = EReference(ordered=True, unique=True,
+ containment=True, derived=False, upper=-1)
+ soils = EReference(ordered=True, unique=True, containment=True, derived=False, upper=-1)
+
+ def __init__(self, *, name=None, description=None, source=None, plantCategories=None, vegetationCategories=None, soils=None):
+ # if kwargs:
+ # raise AttributeError('unexpected arguments: {}'.format(kwargs))
+
+ super().__init__()
+
+ if name is not None:
+ self.name = name
+
+ if description is not None:
+ self.description = description
+
+ if source is not None:
+ self.source = source
+
+ if plantCategories:
+ self.plantCategories.extend(plantCategories)
+
+ if vegetationCategories:
+ self.vegetationCategories.extend(vegetationCategories)
+
+ if soils:
+ self.soils.extend(soils)
+
+
+class PlantCategory(EObject, metaclass=MetaEClass):
+ """Excluding (that is non-overlapping) categories like Trees, Hedeges, Grasses that help users finding a specific biol. plant species."""
+ name = EAttribute(eType=EString, unique=True, derived=False, changeable=True)
+ plants = EReference(ordered=True, unique=True, containment=True, derived=False, upper=-1)
+
+ def __init__(self, *, name=None, plants=None):
+ # if kwargs:
+ # raise AttributeError('unexpected arguments: {}'.format(kwargs))
+
+ super().__init__()
+
+ if name is not None:
+ self.name = name
+
+ if plants:
+ self.plants.extend(plants)
+
+
+class IrrigationSchedule(EObject, metaclass=MetaEClass):
+
+ name = EAttribute(eType=EString, unique=True, derived=False, changeable=True)
+
+ def __init__(self, *, name=None):
+ # if kwargs:
+ # raise AttributeError('unexpected arguments: {}'.format(kwargs))
+
+ super().__init__()
+
+ if name is not None:
+ self.name = name
+
+
+class Vegetation(EObject, metaclass=MetaEClass):
+ """Plant life or total plant cover (as of an area)"""
+ name = EAttribute(eType=EString, unique=True, derived=False, changeable=True)
+ thicknessOfSoil = EAttribute(eType=EString, unique=True, derived=False,
+ changeable=True, default_value='20 cm')
+ management = EAttribute(eType=Management, unique=True, derived=False,
+ changeable=True, default_value=Management.NA)
+ airGap = EAttribute(eType=EString, unique=True, derived=False,
+ changeable=True, default_value='0.0 cm')
+ soil = EReference(ordered=True, unique=True, containment=False, derived=False)
+ plants = EReference(ordered=True, unique=True, containment=True, derived=False, upper=-1)
+
+ def __init__(self, *, name=None, thicknessOfSoil=None, soil=None, plants=None, management=None, airGap=None):
+ # if kwargs:
+ # raise AttributeError('unexpected arguments: {}'.format(kwargs))
+
+ super().__init__()
+
+ if name is not None:
+ self.name = name
+
+ if thicknessOfSoil is not None:
+ self.thicknessOfSoil = thicknessOfSoil
+
+ if management is not None:
+ self.management = management
+
+ if airGap is not None:
+ self.airGap = airGap
+
+ if soil is not None:
+ self.soil = soil
+
+ if plants:
+ self.plants.extend(plants)
+
+
+class VegetationCategory(EObject, metaclass=MetaEClass):
+ """Excluding (that is non-overlapping) categories to help users finding a specific vegetation template."""
+ name = EAttribute(eType=EString, unique=True, derived=False, changeable=True)
+ vegetationTemplates = EReference(ordered=True, unique=True,
+ containment=True, derived=False, upper=-1)
+
+ def __init__(self, *, vegetationTemplates=None, name=None):
+ # if kwargs:
+ # raise AttributeError('unexpected arguments: {}'.format(kwargs))
+
+ super().__init__()
+
+ if name is not None:
+ self.name = name
+
+ if vegetationTemplates:
+ self.vegetationTemplates.extend(vegetationTemplates)
+
+
+class PlantPercentage(EObject, metaclass=MetaEClass):
+
+ percentage = EAttribute(eType=EString, unique=True, derived=False,
+ changeable=True, default_value='100')
+ plant = EReference(ordered=True, unique=True, containment=False, derived=False)
+
+ def __init__(self, *, percentage=None, plant=None):
+ # if kwargs:
+ # raise AttributeError('unexpected arguments: {}'.format(kwargs))
+
+ super().__init__()
+
+ if percentage is not None:
+ self.percentage = percentage
+
+ if plant is not None:
+ self.plant = plant
diff --git a/catalogs/greenery/ecore_greenery/greenerycatalog_no_quantities.ecore b/catalogs/greenery/ecore_greenery/greenerycatalog_no_quantities.ecore
new file mode 100644
index 00000000..db58a9c0
--- /dev/null
+++ b/catalogs/greenery/ecore_greenery/greenerycatalog_no_quantities.ecore
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/city_model_structure/iot/sensor_measure.py b/city_model_structure/iot/sensor_measure.py
new file mode 100644
index 00000000..608d97f4
--- /dev/null
+++ b/city_model_structure/iot/sensor_measure.py
@@ -0,0 +1,40 @@
+"""
+Sensor measure module
+SPDX - License - Identifier: LGPL - 3.0 - or -later
+Copyright © 2022 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
+"""
+
+class SensorMeasure:
+ def __init__(self, latitude, longitude, utc_timestamp, value):
+ self._latitude = latitude
+ self._longitude = longitude
+ self._utc_timestamp = utc_timestamp
+ self._value = value
+
+ @property
+ def latitude(self):
+ """
+ Get measure latitude
+ """
+ return self._latitude
+
+ @property
+ def longitude(self):
+ """
+ Get measure longitude
+ """
+ return self._longitude
+
+ @property
+ def utc_timestamp(self):
+ """
+ Get measure timestamp in utc
+ """
+ return self._utc_timestamp
+
+ @property
+ def value(self):
+ """
+ Get sensor measure value
+ """
+ return self._value
diff --git a/city_model_structure/iot/sensor_type.py b/city_model_structure/iot/sensor_type.py
new file mode 100644
index 00000000..414b6f60
--- /dev/null
+++ b/city_model_structure/iot/sensor_type.py
@@ -0,0 +1,20 @@
+"""
+Sensor type module
+SPDX - License - Identifier: LGPL - 3.0 - or -later
+Copyright © 2022 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
+"""
+
+from enum import Enum
+
+class SensorType(Enum):
+ HUMIDITY = 0
+ TEMPERATURE = 1
+ CO2 = 2
+ NOISE = 3
+ PRESSURE = 4
+ DIRECT_RADIATION = 5
+ DIFFUSE_RADIATION = 6
+ GLOBAL_RADIATION = 7
+ AIR_QUALITY = 8
+ GAS_FLOW = 9
+ ENERGY = 10
diff --git a/city_model_structure/iot/station.py b/city_model_structure/iot/station.py
new file mode 100644
index 00000000..8a15e62d
--- /dev/null
+++ b/city_model_structure/iot/station.py
@@ -0,0 +1,41 @@
+"""
+Station
+SPDX - License - Identifier: LGPL - 3.0 - or -later
+Copyright © 2022 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
+"""
+import uuid
+
+from city_model_structure.iot.sensor import Sensor
+
+
+class Station:
+ def __init__(self, station_id=None, _mobile=False):
+ self._id = station_id
+ self._mobile = _mobile
+ self._sensors = []
+
+ @property
+ def id(self):
+ """
+ Get the station id a random uuid will be assigned if no ID was provided to the constructor
+ :return: Id
+ """
+ if self._id is None:
+ self._id = uuid.uuid4()
+ return self._id
+
+ @property
+ def _mobile(self):
+ """
+ Get if the station is mobile or not
+ :return: bool
+ """
+ return self._mobile
+
+ @property
+ def sensors(self) -> [Sensor]:
+ """
+ Get the sensors belonging to the station
+ :return: [Sensor]
+ """
+ return self._sensors
diff --git a/city_model_structure/lca_material.py b/city_model_structure/lca_material.py
new file mode 100644
index 00000000..f9c620a7
--- /dev/null
+++ b/city_model_structure/lca_material.py
@@ -0,0 +1,242 @@
+"""
+Material module
+SPDX - License - Identifier: LGPL - 3.0 - or -later
+Copyright © 2020 Project Author Atiya atiya.atiya@mail.concordia.ca
+Contributor Mohammad Reza mohammad.seyedabadi@mail.concordia.ca
+"""
+
+from typing import Union
+
+class LcaMaterial:
+ def __init__(self):
+ self._id = None
+ self._type = None
+ self._name = None
+ self._density = None
+ self._density_unit = None
+ self._embodied_carbon = None
+ self._embodied_carbon_unit = None
+ self._recycling_ratio = None
+ self._company_recycling_ratio = None
+ self._onsite_recycling_ratio = None
+ self._landfilling_ratio = None
+ self._cost = None
+ self._cost_unit = None
+
+ @property
+ def id(self):
+ """
+ Get material id
+ :return: int
+ """
+ return self._id
+
+ @id.setter
+ def id(self, value):
+ """
+ Set material id
+ :param value: int
+ """
+ self._id = int(value)
+
+ @property
+ def type(self):
+ """
+ Get material type
+ :return: str
+ """
+ return self._type
+
+ @type.setter
+ def type(self, value):
+ """
+ Set material type
+ :param value: string
+ """
+ self._type = str(value)
+
+ @property
+ def name(self):
+ """
+ Get material name
+ :return: str
+ """
+ return self._name
+
+ @name.setter
+ def name(self, value):
+ """
+ Set material name
+ :param value: string
+ """
+ self._name = str(value)
+
+ @property
+ def density(self) -> Union[None, float]:
+ """
+ Get material density in kg/m3
+ :return: None or float
+ """
+ return self._density
+
+ @density.setter
+ def density(self, value):
+ """
+ Set material density
+ :param value: float
+ """
+ if value is not None:
+ self._density = float(value)
+
+ @property
+ def density_unit(self) -> Union[None, str]:
+ """
+ Get material density unit
+ :return: None or string
+ """
+ return self._density_unit
+
+ @density_unit.setter
+ def density_unit(self, value):
+ """
+ Set material density unit
+ :param value: string
+ """
+ if value is not None:
+ self._density_unit = str(value)
+
+ @property
+ def embodied_carbon(self) -> Union[None, float]:
+ """
+ Get material embodied carbon
+ :return: None or float
+ """
+ return self._embodied_carbon
+
+ @embodied_carbon.setter
+ def embodied_carbon(self, value):
+ """
+ Set material embodied carbon
+ :param value: float
+ """
+ if value is not None:
+ self._embodied_carbon = float(value)
+
+ @property
+ def embodied_carbon_unit(self) -> Union[None, str]:
+ """
+ Get material embodied carbon unit
+ :return: None or string
+ """
+ return self._embodied_carbon
+
+ @embodied_carbon_unit.setter
+ def embodied_carbon_unit(self, value):
+ """
+ Set material embodied carbon unit
+ :param value: string
+ """
+ if value is not None:
+ self._embodied_carbon_unit = str(value)
+
+ @property
+ def recycling_ratio(self) -> Union[None, float]:
+ """
+ Get material recycling ratio
+ :return: None or float
+ """
+ return self._recycling_ratio
+
+ @recycling_ratio.setter
+ def recycling_ratio(self, value):
+ """
+ Set material recycling ratio
+ :param value: float
+ """
+ if value is not None:
+ self._recycling_ratio = float(value)
+
+ @property
+ def onsite_recycling_ratio(self) -> Union[None, float]:
+ """
+ Get material onsite recycling ratio
+ :return: None or float
+ """
+ return self._onsite_recycling_ratio
+
+ @onsite_recycling_ratio.setter
+ def onsite_recycling_ratio(self, value):
+ """
+ Set material onsite recycling ratio
+ :param value: float
+ """
+ if value is not None:
+ self._onsite_recycling_ratio = float(value)
+
+ @property
+ def company_recycling_ratio(self) -> Union[None, float]:
+ """
+ Get material company recycling ratio
+ :return: None or float
+ """
+ return self._company_recycling_ratio
+
+ @company_recycling_ratio.setter
+ def company_recycling_ratio(self, value):
+ """
+ Set material company recycling ratio
+ :param value: float
+ """
+ if value is not None:
+ self._company_recycling_ratio = float(value)
+
+ @property
+ def landfilling_ratio(self) -> Union[None, float]:
+ """
+ Get material landfilling ratio
+ :return: None or float
+ """
+ return self._landfilling_ratio
+
+ @landfilling_ratio.setter
+ def landfilling_ratio(self, value):
+ """
+ Set material landfilling ratio
+ :param value: float
+ """
+ if value is not None:
+ self._landfilling_ratio = float(value)
+
+ @property
+ def cost(self) -> Union[None, float]:
+ """
+ Get material cost
+ :return: None or float
+ """
+ return self._cost
+
+ @cost.setter
+ def cost(self, value):
+ """
+ Set material cost
+ :param value: float
+ """
+ if value is not None:
+ self._cost = float(value)
+
+ @property
+ def cost_unit(self) -> Union[None, str]:
+ """
+ Get material cost unit
+ :return: None or string
+ """
+ return self._cost_unit
+
+ @cost_unit.setter
+ def cost_unit(self, value):
+ """
+ Set material cost unit
+ :param value: string
+ """
+ if value is not None:
+ self._cost_unit = float(value)
diff --git a/city_model_structure/material.py b/city_model_structure/material.py
deleted file mode 100644
index d0ef2c53..00000000
--- a/city_model_structure/material.py
+++ /dev/null
@@ -1,118 +0,0 @@
-"""
-LifeCycleAssessment retrieve the specific Life Cycle Assessment module for the given region
-SPDX - License - Identifier: LGPL - 3.0 - or -later
-Copyright © 2020 Project Author Atiya
-"""
-
-class Material:
- """
- LCA Material class
- """
-
- def __init__(self, material_name, material_id, type, density, density_unit, embodied_carbon, embodied_carbon_unit, recycling_ratio,
- onsite_recycling_ratio, company_recycling_ratio, landfilling_ratio, cost, cost_unit):
- self._material_name = material_name
- self._material_id = material_id
- self._type = type
- self._density = density
- self._density_unit = density_unit
- self._embodied_carbon = embodied_carbon
- self._embodied_carbon_unit = embodied_carbon_unit
- self._recycling_ratio = recycling_ratio
- self._onsite_recycling_ratio = onsite_recycling_ratio
- self._company_recycling_ratio = company_recycling_ratio
- self._landfilling_ratio = landfilling_ratio
- self._cost = cost
- self._cost_unit = cost_unit
-
- @property
- def material_name(self):
- """
- Get material name
- """
- return self._material_name
-
- @property
- def id(self):
- """
- Get material id
- """
- return self._material_id
-
- @property
- def type(self):
- """
- Get material type
- """
- return self._type
-
- @property
- def density(self):
- """
- Get material density
- """
- return self._density
-
- @property
- def density_unit(self):
- """
- Get material density unit
- """
- return self._density_unit
-
- @property
- def embodied_carbon(self):
- """
- Get material embodied carbon
- """
- return self._embodied_carbon
-
- @property
- def embodied_carbon_unit(self):
- """
- Get material embodied carbon unit
- """
- return self._embodied_carbon_unit
-
- @property
- def recycling_ratio(self):
- """
- Get material recycling ratio
- """
- return self._recycling_ratio
-
- @property
- def onsite_recycling_ratio(self):
- """
- Get material onsite recycling ratio
- """
- return self._onsite_recycling_ratio
-
- @property
- def company_recycling_ratio(self):
- """
- Get material company recycling ratio
- """
- return self._company_recycling_ratio
-
- @property
- def landfilling_ratio(self):
- """
- Get material landfilling ratio
- """
- return self._landfilling_ratio
-
- @property
- def cost(self):
- """
- Get material cost
- """
- return self._cost
-
- @property
- def cost_unit(self):
- """
- Get material cost unit
- """
- return self._cost_unit
-
diff --git a/data/greenery/ecore_greenery_catalog.xml b/data/greenery/ecore_greenery_catalog.xml
new file mode 100644
index 00000000..41b7801c
--- /dev/null
+++ b/data/greenery/ecore_greenery_catalog.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+