diff --git a/wntr/network/base.py b/wntr/network/base.py index c2229469..a569ab04 100644 --- a/wntr/network/base.py +++ b/wntr/network/base.py @@ -257,7 +257,7 @@ def to_dict(self): d['node_type'] = self.node_type for k in dir(self): if not k.startswith('_') and \ - k not in ['demand', 'base_demand', 'head', 'leak_area', 'leak_demand', + k not in ['demand', 'head', 'leak_area', 'leak_demand', 'leak_discharge_coeff', 'leak_status', 'level', 'pressure', 'quality', 'vol_curve', 'head_timeseries']: try: val = getattr(self, k) diff --git a/wntr/network/elements.py b/wntr/network/elements.py index 28e3e7fe..561676ff 100644 --- a/wntr/network/elements.py +++ b/wntr/network/elements.py @@ -81,7 +81,10 @@ class Junction(Node): _base_attributes = ["name", "elevation", "coordinates"] - _optional_attributes = ["emitter_coefficient", + _optional_attributes = ["base_demand", + "demand_pattern", + "demand_category", + "emitter_coefficient", "initial_quality", "minimum_pressure", "required_pressure", @@ -216,6 +219,32 @@ def base_demand(self): def base_demand(self, value): raise RuntimeWarning('The base_demand property is read-only. Please modify using demand_timeseries_list[0].base_value.') + @property + def demand_pattern(self): + """Get the pattern_name of the first demand in the demand_timeseries_list. + + This is a read-only property. + """ + if len(self.demand_timeseries_list) > 0: + return self.demand_timeseries_list[0].pattern_name + return 0.0 + @demand_pattern.setter + def demand_pattern(self, value): + raise RuntimeWarning('The demand_pattern property is read-only. Please modify using demand_timeseries_list[0].pattern_name') + + @property + def demand_category(self): + """Get the category of the first demand in the demand_timeseries_list. + + This is a read-only property. + """ + if len(self.demand_timeseries_list) > 0: + return self.demand_timeseries_list[0].category + return 0.0 + @demand_category.setter + def demand_category(self, value): + raise RuntimeWarning('The demand_category property is read-only. Please modify using demand_timeseries_list[0].category.') + def add_leak(self, wn, area, discharge_coeff=0.75, start_time=None, end_time=None): """ Add a leak control to the water network model diff --git a/wntr/network/io.py b/wntr/network/io.py index e4ceac8d..8539bbbd 100644 --- a/wntr/network/io.py +++ b/wntr/network/io.py @@ -117,18 +117,18 @@ def from_dict(d: dict, append=None): if dl is not None and len(dl) > 0: base_demand = dl[0].setdefault("base_val", 0.0) pattern_name = dl[0].setdefault("pattern_name") - category = dl[0].setdefault("category") + demand_category = dl[0].setdefault("category") else: - base_demand = 0.0 - pattern_name = None - category = None + base_demand = node.setdefault('base_demand',0.0) + pattern_name = node.setdefault('pattern_name') + demand_category = node.setdefault('demand_category') wn.add_junction( name=name, base_demand=base_demand, demand_pattern=pattern_name, elevation=node.setdefault("elevation"), coordinates=node.setdefault("coordinates", list()), - demand_category=category, + demand_category=demand_category, ) j = wn.get_node(name) j.emitter_coefficient = node.setdefault("emitter_coefficient") diff --git a/wntr/tests/test_gis.py b/wntr/tests/test_gis.py index 31513f26..86b2c7c1 100644 --- a/wntr/tests/test_gis.py +++ b/wntr/tests/test_gis.py @@ -131,6 +131,9 @@ def test_wn_to_gis(self): assert set(['link_type', 'start_node_name', 'end_node_name', 'geometry']).issubset(self.gis_data.pipes.columns) assert set(['link_type', 'start_node_name', 'end_node_name', 'geometry']).issubset(self.gis_data.pumps.columns) #assert set(['link_type', 'start_node_name', 'end_node_name', 'geometry']).issubset(self.gis_data.valves.columns) # Net1 has no valves + + #check base_demand and demand_pattern attrivutes + assert set(['base_demand','demand_pattern']).issubset(self.gis_data.junctions.columns) def test_gis_to_wn(self):