From 2bc217773ec481ac64d91a6cf74686685b391186 Mon Sep 17 00:00:00 2001 From: guille Date: Thu, 24 Mar 2022 19:06:47 -0400 Subject: [PATCH] Correct merge error add deleted files --- .../ecore_greenery/greenerycatalog.ecore | 268 +++++++++++++++ .../ecore_greenery/greenerycatalog.py | 318 ++++++++++++++++++ .../greenerycatalog_no_quantities.ecore | 268 +++++++++++++++ city_model_structure/iot/sensor_measure.py | 40 +++ city_model_structure/iot/sensor_type.py | 20 ++ city_model_structure/iot/station.py | 41 +++ city_model_structure/lca_material.py | 242 +++++++++++++ city_model_structure/material.py | 118 ------- data/greenery/ecore_greenery_catalog.xml | 59 ++++ 9 files changed, 1256 insertions(+), 118 deletions(-) create mode 100644 catalogs/greenery/ecore_greenery/greenerycatalog.ecore create mode 100644 catalogs/greenery/ecore_greenery/greenerycatalog.py create mode 100644 catalogs/greenery/ecore_greenery/greenerycatalog_no_quantities.ecore create mode 100644 city_model_structure/iot/sensor_measure.py create mode 100644 city_model_structure/iot/sensor_type.py create mode 100644 city_model_structure/iot/station.py create mode 100644 city_model_structure/lca_material.py delete mode 100644 city_model_structure/material.py create mode 100644 data/greenery/ecore_greenery_catalog.xml 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +