import os import streamlit as st import tempfile import trimesh import pymeshlab import cadquery as cq from pathlib import Path import subprocess # Ensure FreeCAD is in the system path os.environ["PATH"] += r";C:\Program Files\FreeCAD 0.21\bin" # Set title st.title("3D Model Converter") # Supported formats input_formats = ["obj", "stl", "ply", "glb", "gltf", "off", "3ds", "fbx", "dae", "stp", "skp"] output_formats = ["obj", "stl", "ply", "glb", "gltf", "off", "3ds", "fbx", "dae"] # Upload file uploaded_file = st.file_uploader("Upload a 3D model file", type=input_formats) if uploaded_file: file_ext = uploaded_file.name.split(".")[-1].lower() # Select output format output_format = st.selectbox("Select output format", [fmt for fmt in output_formats if fmt != file_ext]) # Process and convert if st.button("Convert"): with tempfile.TemporaryDirectory() as temp_dir: input_path = os.path.join(temp_dir, uploaded_file.name) output_path = os.path.join(temp_dir, f"converted.{output_format}") # Save uploaded file with open(input_path, "wb") as f: f.write(uploaded_file.read()) try: if file_ext == "stp": temp_stl_path = os.path.join(temp_dir, "temp.stl") # Temporary STL file # Convert STEP to STL using FreeCAD freecad_script = f""" import FreeCAD import Part import Mesh doc = FreeCAD.newDocument() shape = Part.Shape() shape.read("{input_path}") Mesh.export([shape], "{temp_stl_path}") """ script_path = os.path.join(temp_dir, "convert_stp.py") with open(script_path, "w") as f: f.write(freecad_script) subprocess.run(["freecadcmd", script_path], check=True) if output_format == "stl": output_path = temp_stl_path else: mesh = trimesh.load(temp_stl_path) # Convert STL to other formats mesh.export(output_path) elif file_ext in ["obj", "stl", "ply", "off"]: mesh = trimesh.load(input_path) mesh.export(output_path) else: ms = pymeshlab.MeshSet() ms.load_new_mesh(input_path) ms.save_current_mesh(output_path, binary=True) # Provide download link with open(output_path, "rb") as f: st.download_button(label="Download Converted File", data=f, file_name=f"converted.{output_format}") except Exception as e: st.error(f"Conversion failed: {e}") # Show error if conversion fails