import streamlit as st import os import tempfile from io import BytesIO from fpdf import FPDF import requests from stl import mesh from pathlib import Path # Directly assign the Groq API key (without using secrets) GROQ_API_KEY = "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" GROQ_API_URL = "https://api.groq.com/v1/query" # Function to generate a technical report using the AI model (Groq API) def generate_report(cad_data): # Making the API request to Groq API headers = { "Authorization": f"Bearer {GROQ_API_KEY}", "Content-Type": "application/json" } payload = { "model": "llama-3.3-70b-versatile", "input": cad_data, "output_format": "text" } response = requests.post(GROQ_API_URL, headers=headers, json=payload) if response.status_code == 200: return response.json()['generated_text'] else: st.error(f"Error in report generation: {response.text}") return "Error generating report." # Function to parse STL CAD files using pySTL def parse_stl_file(file_path): # Load the STL file and extract basic information cad_mesh = mesh.Mesh.from_file(file_path) # Example: Get the number of faces and volume num_faces = cad_mesh.vectors.shape[0] volume = cad_mesh.get_mass_properties()[0] # Get volume from mass properties cad_data = f"Extracted information from {file_path.name}:\n - Number of Faces: {num_faces}\n - Volume: {volume} cubic units." return cad_data # Function to create a PDF report def create_pdf_report(report_text): pdf = FPDF() pdf.set_auto_page_break(auto=True, margin=15) pdf.add_page() # Set title and content pdf.set_font("Arial", style="B", size=16) pdf.cell(200, 10, txt="Technical Report for CAD Analysis", ln=True, align="C") pdf.ln(10) # Line break pdf.set_font("Arial", size=12) pdf.multi_cell(0, 10, report_text) # Save PDF to a file temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") pdf.output(temp_file.name) return temp_file.name # Streamlit UI st.title("CAD File Analysis and Technical Report Generation") # File uploader uploaded_file = st.file_uploader("Upload a CAD file", type=["stl"]) if uploaded_file is not None: # Ensure the temporary directory exists temp_dir = tempfile.mkdtemp() # Save uploaded file temporarily temp_file_path = Path(temp_dir) / uploaded_file.name # Use the temporary directory with open(temp_file_path, "wb") as f: f.write(uploaded_file.getbuffer()) # Parse the STL file and extract relevant data cad_data = parse_stl_file(temp_file_path) if cad_data: # Display extracted data as a preview st.write("Extracted Data from CAD File:") st.text(cad_data) # Generate report using Groq API report_text = generate_report(cad_data) st.write("Generated Report:") st.text(report_text) # Create a PDF report pdf_file_path = create_pdf_report(report_text) # Provide a download link for the PDF report with open(pdf_file_path, "rb") as f: pdf_bytes = f.read() st.download_button( label="Download Technical Report", data=pdf_bytes, file_name="technical_report.pdf", mime="application/pdf" ) else: st.write("Please upload a CAD file to begin.")