From 5ecb319dee5c364b77818efef4b5f940018f1f80 Mon Sep 17 00:00:00 2001 From: Tommaso Bianchi Date: Tue, 30 Jun 2026 15:00:05 +0200 Subject: [PATCH] Reject .f3d import with a STEP redirect hint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fusion 360 .f3d uses Autodesk's closed ShapeManager kernel — no offline reader exists and it is input-only even in Autodesk's own cloud API, so native import/export is infeasible. Intercept .f3d at priv::load_files (the single funnel for drag-drop and File > Open) and show a dialog pointing the user to export STEP from Fusion, then load any other files in the batch. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01BVzKmX6Y1aEteit1HTXG4Q --- src/slic3r/GUI/Plater.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index bdee81b867..53c3e8a80c 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -5872,6 +5872,27 @@ std::vector Plater::priv::load_files(const std::vector& input_ if (input_files.empty()) return std::vector(); + // Fusion 360 .f3d cannot be opened: closed Autodesk ShapeManager kernel, no offline reader + // exists. Redirect the user to STEP (which we import natively). Skip any .f3d, load the rest. + { + bool any_f3d = false; + for (const auto& p : input_files) + if (boost::iends_with(p.string(), ".f3d")) { any_f3d = true; break; } + if (any_f3d) { + MessageDialog(static_cast(q), + _L("Fusion 360 .f3d files can't be opened directly — they use Autodesk's " + "closed file format, which no offline tool can read.\n\n" + "In Fusion 360, use File ▸ Export and choose STEP (.step), then open that " + "file here."), + _L("Unsupported format: .f3d"), wxOK | wxICON_INFORMATION).ShowModal(); + std::vector kept; + for (const auto& p : input_files) + if (!boost::iends_with(p.string(), ".f3d")) kept.push_back(p); + if (kept.empty()) return std::vector(); + return load_files(kept, strategy, ask_multi); + } + } + if (!input_files.empty()) q->m_3mf_path = input_files[0].string();