|
|
import streamlit as st |
|
|
import math |
|
|
|
|
|
def calculate_plaster(length, width, thickness, cement_ratio, sand_ratio, cement_bag_weight, dry_volume_factor, wastage_percent, cement_bag_price, plaster_price_per_m2, unit_system): |
|
|
|
|
|
if unit_system == "Imperial": |
|
|
length = length * 0.3048 |
|
|
width = width * 0.3048 |
|
|
thickness = thickness * 0.0254 |
|
|
|
|
|
|
|
|
plaster_area = length * width |
|
|
|
|
|
|
|
|
wet_mortar_volume = plaster_area * thickness |
|
|
|
|
|
|
|
|
dry_mortar_volume = wet_mortar_volume * dry_volume_factor |
|
|
|
|
|
|
|
|
total_dry_mortar = dry_mortar_volume * (1 + wastage_percent/100) |
|
|
|
|
|
|
|
|
total_parts = cement_ratio + sand_ratio |
|
|
cement_volume = (cement_ratio / total_parts) * total_dry_mortar |
|
|
sand_volume = (sand_ratio / total_parts) * total_dry_mortar |
|
|
|
|
|
|
|
|
cement_density = 1440 |
|
|
cement_weight = cement_volume * cement_density |
|
|
cement_bags = cement_weight / cement_bag_weight |
|
|
|
|
|
|
|
|
cement_cost = cement_bags * cement_bag_price |
|
|
total_plaster_cost = plaster_area * plaster_price_per_m2 |
|
|
|
|
|
return { |
|
|
"Plaster area": plaster_area, |
|
|
"Wet mortar volume": wet_mortar_volume, |
|
|
"Dry mortar volume": dry_mortar_volume, |
|
|
"Total dry mortar (with wastage)": total_dry_mortar, |
|
|
"Cement volume": cement_volume, |
|
|
"Cement weight": cement_weight, |
|
|
"Cement bags": cement_bags, |
|
|
"Sand volume": sand_volume, |
|
|
"Cement cost": cement_cost, |
|
|
"Total plaster cost": total_plaster_cost |
|
|
} |
|
|
|
|
|
def calculate_paint(length, width, subtract_area, coats, coverage_per_liter, paint_price_per_liter, unit_system): |
|
|
|
|
|
if unit_system == "Imperial": |
|
|
length = length * 0.3048 |
|
|
width = width * 0.3048 |
|
|
subtract_area = subtract_area * 0.0929 |
|
|
|
|
|
|
|
|
total_area = (length * width) - subtract_area |
|
|
|
|
|
|
|
|
total_liters = (total_area * coats) / coverage_per_liter |
|
|
|
|
|
|
|
|
total_cost = total_liters * paint_price_per_liter |
|
|
|
|
|
return { |
|
|
"Total area": total_area, |
|
|
"Total liters": total_liters, |
|
|
"Total cost": total_cost |
|
|
} |
|
|
|
|
|
def calculate_tiles(floor_length, floor_width, tile_length, tile_width, wastage_percent, tile_price_per_m2, unit_system): |
|
|
|
|
|
if unit_system == "Imperial": |
|
|
floor_length = floor_length * 0.3048 |
|
|
floor_width = floor_width * 0.3048 |
|
|
tile_length = tile_length * 0.0254 |
|
|
tile_width = tile_width * 0.0254 |
|
|
|
|
|
|
|
|
floor_area = floor_length * floor_width |
|
|
|
|
|
|
|
|
tile_area = tile_length * tile_width |
|
|
|
|
|
|
|
|
num_tiles = floor_area / tile_area |
|
|
|
|
|
|
|
|
total_tiles = num_tiles * (1 + wastage_percent/100) |
|
|
|
|
|
|
|
|
total_cost = floor_area * tile_price_per_m2 |
|
|
|
|
|
return { |
|
|
"Floor area": floor_area, |
|
|
"Tile area": tile_area, |
|
|
"Number of tiles (without wastage)": num_tiles, |
|
|
"Total tiles (with wastage)": math.ceil(total_tiles), |
|
|
"Total cost": total_cost |
|
|
} |
|
|
|
|
|
def main(): |
|
|
st.title("Construction Calculator") |
|
|
|
|
|
|
|
|
st.sidebar.title("Navigation") |
|
|
calculation_type = st.sidebar.radio( |
|
|
"Select Calculation Type", |
|
|
("Plaster", "Paint", "Tiles") |
|
|
) |
|
|
|
|
|
|
|
|
unit_system = st.sidebar.radio("Unit System", ("Metric", "Imperial")) |
|
|
|
|
|
if calculation_type == "Plaster": |
|
|
st.header("Plaster Calculation") |
|
|
|
|
|
col1, col2 = st.columns(2) |
|
|
|
|
|
with col1: |
|
|
length = st.number_input("Length", min_value=0.0, value=1.0) |
|
|
width = st.number_input("Width", min_value=0.0, value=1.0) |
|
|
thickness = st.number_input("Plaster Thickness (m)", min_value=0.0, value=0.02) |
|
|
|
|
|
st.subheader("Mortar Ratio") |
|
|
cement_ratio = st.number_input("Cement", min_value=1, value=1) |
|
|
sand_ratio = st.number_input("Sand", min_value=1, value=5) |
|
|
|
|
|
with col2: |
|
|
cement_bag_weight = st.number_input("Cement Bag Weight (kg)", min_value=0.0, value=50.0) |
|
|
dry_volume_factor = st.number_input("Dry Volume Factor", min_value=0.0, value=1.27) |
|
|
wastage_percent = st.number_input("Wastage %", min_value=0.0, value=2.0) |
|
|
cement_bag_price = st.number_input("Cement Bag Price ($)", min_value=0.0, value=0.0) |
|
|
plaster_price_per_m2 = st.number_input("Plaster Price per m² ($)", min_value=0.0, value=0.0) |
|
|
|
|
|
if st.button("Calculate Plaster"): |
|
|
results = calculate_plaster( |
|
|
length, width, thickness, cement_ratio, sand_ratio, |
|
|
cement_bag_weight, dry_volume_factor, wastage_percent, |
|
|
cement_bag_price, plaster_price_per_m2, unit_system |
|
|
) |
|
|
|
|
|
st.subheader("Results") |
|
|
st.table({ |
|
|
"Material": [ |
|
|
"Plaster area", "Wet mortar volume", "Dry mortar volume", |
|
|
"Total dry mortar (with wastage)", "Cement volume", |
|
|
"Cement weight", "Cement bags", "Sand volume", |
|
|
"Cement cost", "Total plaster cost" |
|
|
], |
|
|
"Quantity": [ |
|
|
f"{results['Plaster area']:.2f} m²", |
|
|
f"{results['Wet mortar volume']:.4f} m³", |
|
|
f"{results['Dry mortar volume']:.4f} m³", |
|
|
f"{results['Total dry mortar (with wastage)']:.4f} m³", |
|
|
f"{results['Cement volume']:.4f} m³", |
|
|
f"{results['Cement weight']:.2f} kg", |
|
|
f"{results['Cement bags']:.2f} bags", |
|
|
f"{results['Sand volume']:.4f} m³", |
|
|
f"${results['Cement cost']:.2f}", |
|
|
f"${results['Total plaster cost']:.2f}" |
|
|
] |
|
|
}) |
|
|
|
|
|
st.subheader("Calculation Steps") |
|
|
st.write(f"1. Plaster Area = Length × Width = {length} × {width} = {results['Plaster area']:.2f} m²") |
|
|
st.write(f"2. Wet Mortar Volume = Plaster Area × Thickness = {results['Plaster area']:.2f} × {thickness} = {results['Wet mortar volume']:.4f} m³") |
|
|
st.write(f"3. Dry Mortar Volume = Wet Mortar Volume × Dry Volume Factor = {results['Wet mortar volume']:.4f} × {dry_volume_factor} = {results['Dry mortar volume']:.4f} m³") |
|
|
st.write(f"4. Total Dry Mortar (with {wastage_percent}% wastage) = {results['Dry mortar volume']:.4f} × {1 + wastage_percent/100} = {results['Total dry mortar (with wastage)']:.4f} m³") |
|
|
st.write(f"5. Cement Volume = (Cement Ratio / Total Parts) × Total Dry Mortar = ({cement_ratio}/{cement_ratio + sand_ratio}) × {results['Total dry mortar (with wastage)']:.4f} = {results['Cement volume']:.4f} m³") |
|
|
st.write(f"6. Cement Weight = Cement Volume × Cement Density (1440 kg/m³) = {results['Cement volume']:.4f} × 1440 = {results['Cement weight']:.2f} kg") |
|
|
st.write(f"7. Cement Bags = Cement Weight / Bag Weight = {results['Cement weight']:.2f} / {cement_bag_weight} = {results['Cement bags']:.2f} bags") |
|
|
st.write(f"8. Sand Volume = (Sand Ratio / Total Parts) × Total Dry Mortar = ({sand_ratio}/{cement_ratio + sand_ratio}) × {results['Total dry mortar (with wastage)']:.4f} = {results['Sand volume']:.4f} m³") |
|
|
st.write(f"9. Cement Cost = Cement Bags × Bag Price = {results['Cement bags']:.2f} × {cement_bag_price} = ${results['Cement cost']:.2f}") |
|
|
st.write(f"10. Total Plaster Cost = Plaster Area × Price per m² = {results['Plaster area']:.2f} × {plaster_price_per_m2} = ${results['Total plaster cost']:.2f}") |
|
|
|
|
|
elif calculation_type == "Paint": |
|
|
st.header("Paint Calculation") |
|
|
|
|
|
col1, col2 = st.columns(2) |
|
|
|
|
|
with col1: |
|
|
length = st.number_input("Length", min_value=0.0, value=1.0) |
|
|
width = st.number_input("Width", min_value=0.0, value=1.0) |
|
|
subtract_area = st.number_input("Subtract Area", min_value=0.0, value=0.0) |
|
|
|
|
|
with col2: |
|
|
coats = st.number_input("Number of Coats", min_value=1, value=1) |
|
|
coverage_per_liter = st.number_input("Coverage per Liter (m²)", min_value=0.0, value=9.5) |
|
|
paint_price_per_liter = st.number_input("Paint Price per Liter ($)", min_value=0.0, value=0.0) |
|
|
|
|
|
if st.button("Calculate Paint"): |
|
|
results = calculate_paint( |
|
|
length, width, subtract_area, coats, |
|
|
coverage_per_liter, paint_price_per_liter, unit_system |
|
|
) |
|
|
|
|
|
st.subheader("Results") |
|
|
st.table({ |
|
|
"Material": ["Total area", "Total liters", "Total cost"], |
|
|
"Quantity": [ |
|
|
f"{results['Total area']:.2f} m²", |
|
|
f"{results['Total liters']:.2f} liters", |
|
|
f"${results['Total cost']:.2f}" |
|
|
] |
|
|
}) |
|
|
|
|
|
st.subheader("Calculation Steps") |
|
|
st.write(f"1. Total Area = (Length × Width) - Subtract Area = ({length} × {width}) - {subtract_area} = {results['Total area']:.2f} m²") |
|
|
st.write(f"2. Total Paint Required = (Total Area × Number of Coats) / Coverage per Liter = ({results['Total area']:.2f} × {coats}) / {coverage_per_liter} = {results['Total liters']:.2f} liters") |
|
|
st.write(f"3. Total Cost = Total Liters × Price per Liter = {results['Total liters']:.2f} × {paint_price_per_liter} = ${results['Total cost']:.2f}") |
|
|
|
|
|
elif calculation_type == "Tiles": |
|
|
st.header("Tiles Calculation") |
|
|
|
|
|
st.subheader("Floor Dimensions") |
|
|
col1, col2 = st.columns(2) |
|
|
|
|
|
with col1: |
|
|
floor_length = st.number_input("Floor Length", min_value=0.0, value=1.0) |
|
|
floor_width = st.number_input("Floor Width", min_value=0.0, value=1.0) |
|
|
|
|
|
st.subheader("Tile Dimensions") |
|
|
with col2: |
|
|
tile_length = st.number_input("Tile Length", min_value=0.0, value=0.3) |
|
|
tile_width = st.number_input("Tile Width", min_value=0.0, value=0.3) |
|
|
|
|
|
st.subheader("Other Parameters") |
|
|
wastage_percent = st.number_input("Wastage %", min_value=0.0, value=5.0) |
|
|
tile_price_per_m2 = st.number_input("Tile Price per m² ($)", min_value=0.0, value=0.0) |
|
|
|
|
|
if st.button("Calculate Tiles"): |
|
|
results = calculate_tiles( |
|
|
floor_length, floor_width, tile_length, tile_width, |
|
|
wastage_percent, tile_price_per_m2, unit_system |
|
|
) |
|
|
|
|
|
st.subheader("Results") |
|
|
st.table({ |
|
|
"Material": [ |
|
|
"Floor area", "Tile area", "Number of tiles (without wastage)", |
|
|
"Total tiles (with wastage)", "Total cost" |
|
|
], |
|
|
"Quantity": [ |
|
|
f"{results['Floor area']:.2f} m²", |
|
|
f"{results['Tile area']:.4f} m²", |
|
|
f"{results['Number of tiles (without wastage)']:.0f}", |
|
|
f"{results['Total tiles (with wastage)']}", |
|
|
f"${results['Total cost']:.2f}" |
|
|
] |
|
|
}) |
|
|
|
|
|
st.subheader("Calculation Steps") |
|
|
st.write(f"1. Floor Area = Length × Width = {floor_length} × {floor_width} = {results['Floor area']:.2f} m²") |
|
|
st.write(f"2. Tile Area = Tile Length × Tile Width = {tile_length} × {tile_width} = {results['Tile area']:.4f} m²") |
|
|
st.write(f"3. Number of Tiles (without wastage) = Floor Area / Tile Area = {results['Floor area']:.2f} / {results['Tile area']:.4f} = {results['Number of tiles (without wastage)']:.0f}") |
|
|
st.write(f"4. Total Tiles (with {wastage_percent}% wastage) = {results['Number of tiles (without wastage)']:.0f} × {1 + wastage_percent/100} = {results['Total tiles (with wastage)']}") |
|
|
st.write(f"5. Total Cost = Floor Area × Price per m² = {results['Floor area']:.2f} × {tile_price_per_m2} = ${results['Total cost']:.2f}") |
|
|
|
|
|
if __name__ == "__main__": |
|
|
main() |