not-sure / app /main.py
mabuseif's picture
Upload 25 files
6cc22a6 verified
"""
Main application module for HVAC Load Calculator.
This module integrates all components and provides the main Streamlit interface.
"""
import streamlit as st
import pandas as pd
import numpy as np
import os
import datetime
from models.building import Building, CoolingLoadResult
from views.building_info_form import display_building_info_form
from views.internal_loads_form import display_internal_loads_form
from views.enhanced_results_display import display_enhanced_results
from controllers.building_manager import BuildingManager
from controllers.enhanced_cooling_load_calculator import calculate_cooling_load
from controllers.monthly_breakdown import calculate_monthly_breakdown
from utils.data_io import display_export_options, display_import_options
# Set page config
st.set_page_config(
page_title="Enhanced HVAC Load Calculator",
page_icon="❄️",
layout="wide",
initial_sidebar_state="expanded"
)
# Initialize session state
if 'building' not in st.session_state:
st.session_state.building = None
if 'result' not in st.session_state:
st.session_state.result = None
if 'monthly_breakdown' not in st.session_state:
st.session_state.monthly_breakdown = None
if 'show_comparison' not in st.session_state:
st.session_state.show_comparison = False
# Initialize building manager
building_manager = BuildingManager()
# Main title
st.title("Enhanced HVAC Load Calculator")
# Sidebar
with st.sidebar:
st.header("Navigation")
# Navigation
page = st.radio(
"Select Page",
["Building Information", "Internal Loads", "Results", "Building Manager", "Import/Export"]
)
# Building management
st.header("Building Management")
# Create new building
if st.button("Create New Building"):
st.session_state.building = Building()
st.session_state.result = None
st.session_state.monthly_breakdown = None
st.success("New building created")
# Save current building
if st.session_state.building:
if st.button("Save Current Building"):
if building_manager.add_building(st.session_state.building):
st.success(f"Building {st.session_state.building.settings.name} saved")
else:
if st.checkbox(f"Update existing building {st.session_state.building.settings.name}?"):
if building_manager.update_building(st.session_state.building):
st.success(f"Building {st.session_state.building.settings.name} updated")
else:
st.error(f"Failed to update building {st.session_state.building.settings.name}")
# Load building
if building_manager.get_buildings():
st.header("Load Building")
building_names = list(building_manager.get_buildings().keys())
selected_building = st.selectbox("Select Building", building_names)
if st.button("Load Selected Building"):
st.session_state.building = building_manager.get_buildings()[selected_building]
# Load result if available
if selected_building in building_manager.get_results():
st.session_state.result = building_manager.get_results()[selected_building]
else:
st.session_state.result = None
# Load monthly breakdown if available
if selected_building in building_manager.get_monthly_breakdowns():
st.session_state.monthly_breakdown = building_manager.get_monthly_breakdowns()[selected_building]
else:
st.session_state.monthly_breakdown = None
st.success(f"Building {selected_building} loaded")
# Compare buildings
if len(building_manager.get_buildings()) >= 2:
st.header("Compare Buildings")
if st.button("Compare Buildings"):
st.session_state.show_comparison = True
# About
st.header("About")
st.write("Enhanced HVAC Load Calculator v2.0")
st.write("Based on ASHRAE cooling load calculation methods")
st.write("© 2025 HVAC Engineering")
# Main content
if st.session_state.show_comparison:
# Display building comparison
st.header("Building Comparison")
# Check if we have results for all buildings
buildings = building_manager.get_buildings()
results = building_manager.get_results()
monthly_breakdowns = building_manager.get_monthly_breakdowns()
missing_results = [name for name in buildings if name not in results]
if missing_results:
st.warning(f"Missing results for buildings: {', '.join(missing_results)}. Please calculate these buildings first.")
# Calculate missing results
if st.button("Calculate Missing Results"):
with st.spinner("Calculating missing results..."):
for name in missing_results:
building_manager.calculate_building(name)
st.success("All calculations completed")
# Exit comparison mode
if st.button("Exit Comparison Mode"):
st.session_state.show_comparison = False
st.experimental_rerun()
else:
# Display comparison
building_manager.display_building_comparison()
# Exit comparison mode
if st.button("Exit Comparison Mode"):
st.session_state.show_comparison = False
st.experimental_rerun()
elif page == "Building Information":
# Display building information form
st.header("Building Information")
if st.session_state.building is None:
st.info("No building loaded. Create a new building or load an existing one.")
else:
display_building_info_form(st.session_state.building)
elif page == "Internal Loads":
# Display internal loads form
st.header("Internal Loads")
if st.session_state.building is None:
st.info("No building loaded. Create a new building or load an existing one.")
else:
display_internal_loads_form(st.session_state.building)
elif page == "Results":
# Display results
st.header("Calculation Results")
if st.session_state.building is None:
st.info("No building loaded. Create a new building or load an existing one.")
else:
# Calculate button
if st.button("Calculate Cooling Load"):
with st.spinner("Calculating cooling load..."):
# Calculate cooling load
st.session_state.result = calculate_cooling_load(st.session_state.building)
# Calculate monthly breakdown
st.session_state.monthly_breakdown = calculate_monthly_breakdown(st.session_state.building)
st.success("Calculation completed")
# Display results
if st.session_state.result:
display_enhanced_results(st.session_state.result, st.session_state.building, st.session_state.monthly_breakdown)
else:
st.info("No calculation results available. Click 'Calculate Cooling Load' to perform calculation.")
elif page == "Building Manager":
# Display building manager
building_manager.display_building_manager()
# Display building list
building_manager.display_building_list()
elif page == "Import/Export":
# Display import/export options
st.header("Import/Export")
# Create tabs
import_export_tabs = st.tabs(["Export", "Import"])
with import_export_tabs[0]:
# Export options
st.subheader("Export Options")
if st.session_state.building is None:
st.info("No building loaded. Create a new building or load an existing one.")
elif st.session_state.result is None:
st.info("No calculation results available. Calculate cooling load first.")
else:
display_export_options(st.session_state.building, st.session_state.result, st.session_state.monthly_breakdown)
with import_export_tabs[1]:
# Import options
st.subheader("Import Options")
import_result = display_import_options()
if import_result:
building, result, monthly_breakdown = import_result
# Update session state
st.session_state.building = building
st.session_state.result = result
st.session_state.monthly_breakdown = monthly_breakdown
st.success(f"Successfully imported building: {building.settings.name}")
# Footer
st.markdown("---")
st.write("Enhanced HVAC Load Calculator | Developed with Streamlit")