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): # Convert inputs to metric if necessary if unit_system == "Imperial": length = length * 0.3048 # feet to meters width = width * 0.3048 # feet to meters thickness = thickness * 0.0254 # inches to meters # Calculate plaster area plaster_area = length * width # Calculate wet mortar volume wet_mortar_volume = plaster_area * thickness # Calculate dry mortar volume (accounting for dry volume factor) dry_mortar_volume = wet_mortar_volume * dry_volume_factor # Calculate total dry mortar volume with wastage total_dry_mortar = dry_mortar_volume * (1 + wastage_percent/100) # Calculate cement and sand quantities total_parts = cement_ratio + sand_ratio cement_volume = (cement_ratio / total_parts) * total_dry_mortar sand_volume = (sand_ratio / total_parts) * total_dry_mortar # Convert cement volume to weight and bags cement_density = 1440 # kg/m3 cement_weight = cement_volume * cement_density cement_bags = cement_weight / cement_bag_weight # Calculate costs 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): # Convert inputs to metric if necessary if unit_system == "Imperial": length = length * 0.3048 # feet to meters width = width * 0.3048 # feet to meters subtract_area = subtract_area * 0.0929 # sqft to sqm # Calculate total paintable area total_area = (length * width) - subtract_area # Calculate total paint required total_liters = (total_area * coats) / coverage_per_liter # Calculate total cost 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): # Convert inputs to metric if necessary if unit_system == "Imperial": floor_length = floor_length * 0.3048 # feet to meters floor_width = floor_width * 0.3048 # feet to meters tile_length = tile_length * 0.0254 # inches to meters tile_width = tile_width * 0.0254 # inches to meters # Calculate floor area floor_area = floor_length * floor_width # Calculate tile area tile_area = tile_length * tile_width # Calculate number of tiles needed (without wastage) num_tiles = floor_area / tile_area # Add wastage total_tiles = num_tiles * (1 + wastage_percent/100) # Calculate total cost 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") # Sidebar for navigation st.sidebar.title("Navigation") calculation_type = st.sidebar.radio( "Select Calculation Type", ("Plaster", "Paint", "Tiles") ) # Unit system selection 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()