engrmuhammadrizwan01's picture
Update app.py
23ae417 verified
import streamlit as st
import fitz # PyMuPDF
import pandas as pd
import re
st.set_page_config(page_title="Villa Quantity Surveyor", layout="wide")
st.title("🏗️ Villa Quantity Surveyor")
st.markdown("Upload your villa drawing in PDF format to get detailed quantity estimation and floor-wise breakdown.")
# --- Helper Functions ---
def extract_text_from_pdf(uploaded_file):
doc = fitz.open(stream=uploaded_file.read(), filetype="pdf")
text_data = ""
for page in doc:
text_data += page.get_text()
return text_data
def parse_floor_data(text):
floors = {"Ground Floor": {}, "First Floor": {}, "Second Floor": {}}
matches = re.findall(r'(Ground|First|Second) Floor.*?(?=(Ground|First|Second) Floor|$)', text, re.DOTALL)
for match in matches:
floor_name = match[0] + " Floor"
content = match[1] if isinstance(match, tuple) and len(match) > 1 else ""
rooms = re.findall(r'(Room|Bedroom|Kitchen|Toilet|Bath|Living|Drawing).*?(\d+\.?\d*) ?x ?(\d+\.?\d*)', content)
floor_area = 0
paint_area = 0
room_list = []
for room in rooms:
name = room[0]
width = float(room[1])
length = float(room[2])
height = 3 # Assuming standard height for paint
wall_area = 2 * height * (width + length)
room_area = width * length
floor_area += room_area
paint_area += wall_area
room_list.append({
"Room": name,
"Width (m)": width,
"Length (m)": length,
"Wall Area for Paint (m²)": wall_area,
"Floor Area (m²)": room_area
})
floors[floor_name]["Total Floor Area (m²)"] = floor_area
floors[floor_name]["Total Paint Area (m²)"] = paint_area
floors[floor_name]["Rooms"] = room_list
return floors
def estimate_quantities(floor_data):
explanation = "Estimated based on standard villa layout, assuming 3m height walls and standard block dimensions.\n"
quantities = {
"Bricks (1000 bricks)": 0,
"Cement (bags)": 0,
"Sand (m³)": 0,
"Paint (litres)": 0
}
total_paint_area = 0
total_wall_area = 0
for floor in floor_data.values():
total_paint_area += floor["Total Paint Area (m²)"]
for room in floor["Rooms"]:
width = room["Width (m)"]
length = room["Length (m)"]
height = 3 # Assuming 3m height
wall_area = 2 * height * (width + length)
total_wall_area += wall_area
# Estimate values
quantities["Bricks (1000 bricks)"] = round(total_wall_area / 20) # Roughly 20 m² per 1000 bricks
quantities["Cement (bags)"] = round(total_wall_area / 5) # One bag for 5 m²
quantities["Sand (m³)"] = round(total_wall_area / 10, 2) # 0.1 m³ per m² of wall
quantities["Paint (litres)"] = round(total_paint_area / 10) # 1 litre covers approx 10 m²
return quantities, explanation
# --- Streamlit UI ---
uploaded_file = st.file_uploader("📤 Upload Villa Drawing (PDF)", type=["pdf"])
if uploaded_file:
with st.spinner("📖 Reading and analyzing drawing..."):
text = extract_text_from_pdf(uploaded_file)
floor_data = parse_floor_data(text)
quantities, explanation = estimate_quantities(floor_data)
st.subheader("📊 Quantity Estimation")
st.write(quantities)
st.markdown("#### 📌 Explanation:")
st.markdown(explanation)
for floor_name, data in floor_data.items():
st.markdown(f"### 🏢 {floor_name}")
st.write(f"**Total Floor Area:** {data['Total Floor Area (m²)']} m²")
st.write(f"**Total Paint Area:** {data['Total Paint Area (m²)']} m²")
df_rooms = pd.DataFrame(data["Rooms"])
st.dataframe(df_rooms)