import pathlib import sys from flask import Flask, Response, jsonify, request try: from .freecad_worker import FreeCADWorker from .step_tree import load_deleted_paths except ImportError: repo_root = pathlib.Path(__file__).resolve().parents[2] if str(repo_root) not in sys.path: sys.path.insert(0, str(repo_root)) from tools.step_service.freecad_worker import FreeCADWorker from tools.step_service.step_tree import load_deleted_paths def create_app(worker=None): app = Flask(__name__) step_worker = worker or FreeCADWorker() @app.after_request def add_cors_headers(response): response.headers["Access-Control-Allow-Origin"] = "*" response.headers["Access-Control-Allow-Methods"] = "POST, OPTIONS" response.headers["Access-Control-Allow-Headers"] = "Content-Type" return response @app.route("/save-step", methods=["OPTIONS"]) def save_step_options(): return ("", 204) @app.post("/save-step") def save_step(): uploaded_file = request.files.get("file") if uploaded_file is None or uploaded_file.filename == "": return jsonify({"message": "Missing STEP file."}), 400 raw_deleted_paths = request.form.get("deletedPaths", "[]") try: deleted_paths = load_deleted_paths(raw_deleted_paths) except ValueError as err: return jsonify({"message": str(err)}), 400 output_bytes, output_name = step_worker.trim_step_file( uploaded_file.filename, uploaded_file.read(), deleted_paths, ) return Response( output_bytes, mimetype="application/step", headers={ "Content-Disposition": f'attachment; filename="{output_name}"' }, ) return app if __name__ == "__main__": create_app().run(host="127.0.0.1", port=17890, debug=False)