mabuseif commited on
Commit
21d5af2
·
verified ·
1 Parent(s): d4b5a07

Update data/building_components.py

Browse files
Files changed (1) hide show
  1. data/building_components.py +26 -2
data/building_components.py CHANGED
@@ -93,7 +93,7 @@ class BuildingComponent:
93
  u_value: float # W/(m²·K)
94
  area: float # m²
95
  orientation: Orientation = Orientation.NOT_APPLICABLE
96
- color: str = "Medium" # Light, Medium, Dark
97
  material_layers: List[MaterialLayer] = field(default_factory=list)
98
 
99
  def __post_init__(self):
@@ -102,6 +102,13 @@ class BuildingComponent:
102
  raise ValueError("Area must be greater than zero")
103
  if self.u_value < 0:
104
  raise ValueError("U-value cannot be negative")
 
 
 
 
 
 
 
105
 
106
  @property
107
  def r_value(self) -> float:
@@ -152,7 +159,7 @@ class BuildingComponent:
152
  "u_value": self.u_value,
153
  "area": self.area,
154
  "orientation": self.orientation.value,
155
- "color": self.color,
156
  "r_value": self.r_value,
157
  "material_layers": [layer.to_dict() for layer in self.material_layers],
158
  "calculated_u_value": self.calculated_u_value,
@@ -532,6 +539,23 @@ class BuildingComponentFactory:
532
  if isinstance(component_type, str):
533
  component_type = ComponentType[component_type]
534
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
535
  # Handle drapery for Window components
536
  if component_type == ComponentType.WINDOW:
537
  drapery_data = component_data.pop("drapery", None)
 
93
  u_value: float # W/(m²·K)
94
  area: float # m²
95
  orientation: Orientation = Orientation.NOT_APPLICABLE
96
+ solar_absorptivity: float = 0.6 # Solar absorptivity (0-1), default Medium
97
  material_layers: List[MaterialLayer] = field(default_factory=list)
98
 
99
  def __post_init__(self):
 
102
  raise ValueError("Area must be greater than zero")
103
  if self.u_value < 0:
104
  raise ValueError("U-value cannot be negative")
105
+ # Enforce solar_absorptivity to be one of the five allowed values
106
+ valid_absorptivities = [0.3, 0.45, 0.6, 0.75, 0.9]
107
+ if not 0 <= self.solar_absorptivity <= 1:
108
+ raise ValueError("Solar absorptivity must be between 0 and 1")
109
+ if self.solar_absorptivity not in valid_absorptivities:
110
+ # Find the closest valid value
111
+ self.solar_absorptivity = min(valid_absorptivities, key=lambda x: abs(x - self.solar_absorptivity))
112
 
113
  @property
114
  def r_value(self) -> float:
 
159
  "u_value": self.u_value,
160
  "area": self.area,
161
  "orientation": self.orientation.value,
162
+ "solar_absorptivity": self.solar_absorptivity,
163
  "r_value": self.r_value,
164
  "material_layers": [layer.to_dict() for layer in self.material_layers],
165
  "calculated_u_value": self.calculated_u_value,
 
539
  if isinstance(component_type, str):
540
  component_type = ComponentType[component_type]
541
 
542
+ # Handle legacy 'color' field for backward compatibility
543
+ if "color" in component_data and "solar_absorptivity" not in component_data:
544
+ color_map = {
545
+ "Light": 0.3, # Maps to Light
546
+ "Light to Medium": 0.45, # Maps to Light to Medium
547
+ "Light-Medium": 0.45, # Alternative spelling for legacy data
548
+ "Medium": 0.6, # Maps to Medium
549
+ "Medium to Dark": 0.75, # Maps to Medium to Dark
550
+ "Medium-Dark": 0.75, # Alternative spelling for legacy data
551
+ "Dark": 0.9 # Maps to Dark
552
+ }
553
+ # Use the mapped value or default to 0.6 (Medium) for unrecognized colors
554
+ color = component_data["color"]
555
+ component_data["solar_absorptivity"] = color_map.get(color, 0.6)
556
+ if color not in color_map:
557
+ print(f"Warning: Unrecognized legacy color '{color}' in component data. Defaulting to solar_absorptivity = 0.6 (Medium).")
558
+
559
  # Handle drapery for Window components
560
  if component_type == ComponentType.WINDOW:
561
  drapery_data = component_data.pop("drapery", None)