|
|
import streamlit as st |
|
|
import pandas as pd |
|
|
from fractions import Fraction |
|
|
from utils import calculate_reduced_dimensions, calculate_area_and_frame, generate_pdf |
|
|
from convertion import decimal_to_fraction |
|
|
|
|
|
|
|
|
object_item_value = { |
|
|
'shutter': {'Door': {'height': 3, 'width': 0.5}, |
|
|
'Window': {'height': 3, 'width': 0.5}}, |
|
|
'glass': {'Door': {'height': 3, 'width': 0.5}, |
|
|
'Window': {'height': 3, 'width': 0.5}}, |
|
|
'divider_sh': {'Door': {'height': 1, 'width': 2.0}, |
|
|
'Window': {'height': 1, 'width': 2.0}}, |
|
|
'divider_gl': {'Door': {'height': 1, 'width': 2.0}, |
|
|
'Window': {'height': 1, 'width': 2.0}}, |
|
|
} |
|
|
|
|
|
lst_frac = ['0', '1/16', '1/8', '3/16', '1/4', '5/16', '3/8', '7/16', '1/2', |
|
|
'9/16', '5/8', '11/16', '3/4', '13/16', '7/8', '15/16'] |
|
|
|
|
|
|
|
|
st.title("UPVC Door/Window Dim. Calculator") |
|
|
|
|
|
|
|
|
if 'page' not in st.session_state: |
|
|
st.session_state.page = 0 |
|
|
|
|
|
|
|
|
if st.session_state.page == 0: |
|
|
st.header("Set Parameters") |
|
|
|
|
|
|
|
|
col01, col02 = st.columns([2, 2]) |
|
|
with col01: |
|
|
num_items = st.number_input('Enter the number of items to process:', min_value=1,max_value=20, value=1, step=1) |
|
|
with col02: |
|
|
unit = st.selectbox(f'Select the unit of measurement:', ('Inches', 'Feet')) |
|
|
|
|
|
|
|
|
i = 0 |
|
|
reduction_h_shttr = object_item_value['shutter']['Door']['height'] |
|
|
reduction_w_shttr = object_item_value['shutter']['Door']['width'] |
|
|
divider_h_shttr = object_item_value['divider_sh']['Door']['height'] |
|
|
divider_w_shttr = object_item_value['divider_sh']['Door']['width'] |
|
|
reduction_h_glass = object_item_value['glass']['Door']['height'] |
|
|
reduction_w_glass = object_item_value['glass']['Door']['width'] |
|
|
divider_w_glass = object_item_value['divider_gl']['Door']['width'] |
|
|
|
|
|
|
|
|
col05, col06, col07 = st.columns([2, 2, 2]) |
|
|
with col05: |
|
|
st.text('Shutter - Reduction Height:') |
|
|
with col06: |
|
|
reduction_h_shttr_new_num = st.number_input('', key=f"reduction_h_shttr_n_{i}", min_value=0, value=int(reduction_h_shttr), step=1) |
|
|
with col07: |
|
|
reduction_h_shttr_new_frac = st.selectbox('', lst_frac, key=f"reduction_h_shttr_f_{i}") |
|
|
reduction_h_shttr_new = reduction_h_shttr_new_num + float(Fraction(reduction_h_shttr_new_frac)) |
|
|
|
|
|
col08, col09, col010 = st.columns([2, 2, 2]) |
|
|
default_s_w = 8 if reduction_w_shttr < 1 else 0 |
|
|
with col08: |
|
|
st.text('Shutter - Reduction Width:') |
|
|
with col09: |
|
|
reduction_w_shttr_new_num = st.number_input('', key=f"reduction_w_shttr_n_{i}", min_value=0, value=int(reduction_w_shttr), step=1) |
|
|
with col010: |
|
|
reduction_w_shttr_new_frac = st.selectbox('', lst_frac,index = default_s_w, key=f"reduction_w_shttr_f_{i}") |
|
|
reduction_w_shttr_new = reduction_w_shttr_new_num + float(Fraction(reduction_w_shttr_new_frac)) |
|
|
|
|
|
col011, col012, col013 = st.columns([2, 2, 2]) |
|
|
default_s_d_1 = 15 if divider_w_shttr == 0 else 0 |
|
|
with col011: |
|
|
st.text('Divider - Width - Shutter:') |
|
|
with col012: |
|
|
divider_w_shttr_new_num = st.number_input('', key=f"divider_w_shttr_n_{i}", min_value=0, value=int(divider_w_shttr), step=1) |
|
|
with col013: |
|
|
divider_w_shttr_new_frac = st.selectbox('', lst_frac,index = default_s_d_1 , key=f"divider_w_shttr_f_{i}") |
|
|
divider_w_shttr_new = divider_w_shttr_new_num + float(Fraction(divider_w_shttr_new_frac)) |
|
|
|
|
|
col014, col015, col016 = st.columns([2, 2, 2]) |
|
|
with col014: |
|
|
st.text('Glass - Reduction Height:') |
|
|
with col015: |
|
|
reduction_h_glass_new_num = st.number_input('', key=f"reduction_h_g_n_{i}", min_value=0, value=int(reduction_h_glass), step=1) |
|
|
with col016: |
|
|
reduction_h_glass_new_frac = st.selectbox('', lst_frac, key=f"reduction_h_g_f_{i}") |
|
|
reduction_h_glass_new = reduction_h_glass_new_num + float(Fraction(reduction_h_glass_new_frac)) |
|
|
|
|
|
col017, col018, col019 = st.columns([2, 2, 2]) |
|
|
default_g_w = 8 if reduction_w_glass < 1 else 0 |
|
|
with col017: |
|
|
st.text('Glass - Reduction Width:') |
|
|
with col018: |
|
|
reduction_w_glass_new_num = st.number_input('', key=f"reduction_w_g_n_{i}", min_value=0, value=int(reduction_w_glass), step=1) |
|
|
with col019: |
|
|
reduction_w_glass_new_frac = st.selectbox('', lst_frac,index = default_g_w, key=f"reduction_w_g_f_{i}") |
|
|
reduction_w_glass_new = reduction_w_glass_new_num + float(Fraction(reduction_w_glass_new_frac)) |
|
|
|
|
|
col020, col021, col022 = st.columns([2, 2, 2]) |
|
|
default_d_w = 15 if divider_w_glass == 0 else 0 |
|
|
with col020: |
|
|
st.text('Divider - Width - Glass:') |
|
|
with col021: |
|
|
divider_w_glass_new_num = st.number_input('', key=f"divider_w_g_n_{i}", min_value=0, value=int(divider_w_glass), step=1) |
|
|
with col022: |
|
|
divider_w_glass_new_frac = st.selectbox('', lst_frac,index = default_d_w, key=f"divider_w_g_f_{i}") |
|
|
divider_w_glass_new = divider_w_glass_new_num + float(Fraction(divider_w_glass_new_frac)) |
|
|
|
|
|
if st.button("Next"): |
|
|
st.session_state.page = 1 |
|
|
st.session_state.params = { |
|
|
'num_items': num_items, |
|
|
'unit': unit, |
|
|
'reduction_h_shttr_new': reduction_h_shttr_new, |
|
|
'reduction_w_shttr_new': reduction_w_shttr_new, |
|
|
'divider_w_shttr_new': divider_w_shttr_new, |
|
|
'reduction_h_glass_new': reduction_h_glass_new, |
|
|
'reduction_w_glass_new': reduction_w_glass_new, |
|
|
'divider_w_glass_new': divider_w_glass_new, |
|
|
} |
|
|
st.rerun() |
|
|
|
|
|
|
|
|
elif st.session_state.page == 1: |
|
|
st.header("Calculate and Display Results") |
|
|
|
|
|
|
|
|
num_items = st.session_state.params['num_items'] |
|
|
unit = st.session_state.params['unit'] |
|
|
reduction_h_shttr_new = st.session_state.params['reduction_h_shttr_new'] |
|
|
reduction_w_shttr_new = st.session_state.params['reduction_w_shttr_new'] |
|
|
divider_w_shttr_new = st.session_state.params['divider_w_shttr_new'] |
|
|
reduction_h_glass_new = st.session_state.params['reduction_h_glass_new'] |
|
|
reduction_w_glass_new = st.session_state.params['reduction_w_glass_new'] |
|
|
divider_w_glass_new = st.session_state.params['divider_w_glass_new'] |
|
|
|
|
|
|
|
|
combined_results = [] |
|
|
|
|
|
|
|
|
num_items = st.number_input('Enter the number of items to process:', min_value=1,max_value = 20, value=num_items, step=1) |
|
|
|
|
|
for i in range(num_items): |
|
|
option = st.selectbox(f'Select item {i+1}:', ('Door', 'Window'), key=f"item_{i}") |
|
|
|
|
|
|
|
|
if option not in object_item_value['shutter']: |
|
|
object_item_value['shutter'][option] = {'height': reduction_h_shttr_new, 'width': reduction_w_shttr_new} |
|
|
|
|
|
if option not in object_item_value['glass']: |
|
|
object_item_value['glass'][option] = {'height': reduction_h_glass_new, 'width': reduction_w_glass_new} |
|
|
|
|
|
if option not in object_item_value['divider_sh']: |
|
|
object_item_value['divider_sh'][option] = {'height': divider_w_shttr_new, 'width': divider_w_shttr_new} |
|
|
|
|
|
if option not in object_item_value['divider_gl']: |
|
|
object_item_value['divider_gl'][option] = {'height': divider_w_glass_new, 'width': divider_w_glass_new} |
|
|
|
|
|
|
|
|
object_item_value['shutter'][option]['height'] = reduction_h_shttr_new |
|
|
object_item_value['shutter'][option]['width'] = reduction_w_shttr_new |
|
|
object_item_value['divider_sh'][option]['width'] = divider_w_shttr_new |
|
|
object_item_value['glass'][option]['height'] = reduction_h_glass_new |
|
|
object_item_value['glass'][option]['width'] = reduction_w_glass_new |
|
|
object_item_value['divider_gl'][option]['width'] = divider_w_glass_new |
|
|
|
|
|
|
|
|
col12, col13, col15, col16 = st.columns([2, 2, 2, 2]) |
|
|
default_i_v = 24 if unit == "Inches" else 2 |
|
|
with col12: |
|
|
height = st.number_input(f'Height for Item {i+1}:', key=f"height_{i}", min_value=0, value=default_i_v, step=1) |
|
|
|
|
|
with col13: |
|
|
frac_h = st.selectbox('', lst_frac, key=f"frac_height_{i}") |
|
|
height += float(Fraction(frac_h)) |
|
|
|
|
|
with col15: |
|
|
width = st.number_input(f'Width for Item {i+1}:', key=f"width_{i}", min_value=0, value=default_i_v, step=1) |
|
|
|
|
|
with col16: |
|
|
frac_w = st.selectbox('', lst_frac, key=f"frac_width_{i}") |
|
|
width += float(Fraction(frac_w)) |
|
|
|
|
|
reduced_shutter_width, reduced_shutter_height,reduced_shutter_area = calculate_reduced_dimensions(width, height, unit, 'shutter', object_item_value, item_type=option) |
|
|
reduced_glass_width, reduced_glass_height,reduced_glass_area = calculate_reduced_dimensions(width, height, unit, 'glass', object_item_value, item_type=option) |
|
|
|
|
|
|
|
|
results = { |
|
|
'Sl no': i + 1, |
|
|
'Type': option, |
|
|
'Outer Frame': f"{decimal_to_fraction(height)}\" | {decimal_to_fraction(width)}\"", |
|
|
'Shutter': f"{decimal_to_fraction(reduced_shutter_height)}\" | {decimal_to_fraction(reduced_shutter_width)}\"", |
|
|
'Glass': f"{decimal_to_fraction(reduced_glass_height)}\" | {decimal_to_fraction(reduced_glass_width)}\"", |
|
|
'Area': f"{round(calculate_area_and_frame(width, height, unit, option)[0], 2)} Sq. Feet" |
|
|
} |
|
|
|
|
|
combined_results.append(results) |
|
|
|
|
|
|
|
|
df_combined = pd.DataFrame(combined_results) |
|
|
|
|
|
|
|
|
st.write(df_combined.drop('Sl no', axis=1)) |
|
|
|
|
|
|
|
|
pdf_data = generate_pdf(df_combined, 'Alpa Pvt Ltd', '#123 HBR Layout', unit) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
col1, col2 = st.columns([2, 2]) |
|
|
with col1: |
|
|
if st.button("Back"): |
|
|
st.session_state.page = 0 |
|
|
st.rerun() |
|
|
|
|
|
with col2: |
|
|
pdf_button = st.download_button( |
|
|
label="Download PDF", |
|
|
data=pdf_data, |
|
|
file_name="upvc_calculation_results.pdf", |
|
|
mime="application/pdf" |
|
|
) |
|
|
|