mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-27 02:41:17 +00:00
Mirror CAD persistence (K1+K2+G1) from snaporca-cad onto mainline OrcaSlicer
Dual-fork mandate: port the parametric-recipe 3MF persistence from snaporca-cad commits ed19eac+147e1c4 so a saved project reopens with the editable CAD feature tree, not just the baked mesh. Shared kernel/format/GUI (identical to snaporca-cad): - CadDocument serialize_recipe/deserialize_recipe (cereal BinaryArchive, versioned) + CadFeature split save/load + imported_solid<->BRep string. - Model::cad_recipe carried through 3MF zip entry Metadata/SnapOrca_cad.bin (writer + binary-verbatim reader branch). - DesignPanel on_commit() stamps the recipe; on_tab_shown() rehydrates a loaded project via load_recipe() (deserialize -> feed_bodies + refresh_tree). Mainline-only adapters (no snaporca-cad counterpart — Catch2 v3 vs v2): - tests/libslic3r/test_caddocument.cpp: <catch2/catch_all.hpp> + `using Catch::Approx;` (v3 scopes Approx under Catch::). - tests/libslic3r/CMakeLists.txt: register test_caddocument.cpp (the original CAD port had left it out of the test build). Verified on behemoth (snaporca-deps toolchain): libslic3r_tests clean; [CadDocument] 17/18 (only the pre-existing tangent-to-circle SIGABRT fails, identical to snaporca-tkz); K1 serialize round-trip + version-reject pass (13 assertions); new [3mf] "CAD recipe blob survives a 3mf save/load cycle" passes byte-for-byte; orca-slicer GUI links clean (186/186, DesignPanel.cpp compiled). Interactive :10 click-through pending (no Design-tab automation). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BVzKmX6Y1aEteit1HTXG4Q
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
c22351f63a
commit
2c0140afb9
@@ -42,6 +42,10 @@
|
||||
#include <cmath>
|
||||
#include <stdexcept>
|
||||
#include <algorithm>
|
||||
#include <sstream>
|
||||
|
||||
#include <cereal/archives/binary.hpp>
|
||||
#include <BRepTools.hxx>
|
||||
|
||||
namespace Slic3r {
|
||||
|
||||
@@ -1537,4 +1541,52 @@ bool CadDocument::preview(const CadFeature& candidate, TriangleMesh& out_mesh, s
|
||||
return preview(candidate, out_mesh, ignore, err);
|
||||
}
|
||||
|
||||
std::string brep_to_string(const TopoDS_Shape& s)
|
||||
{
|
||||
if (s.IsNull()) return {};
|
||||
std::ostringstream oss;
|
||||
BRepTools::Write(s, oss);
|
||||
return oss.str();
|
||||
}
|
||||
|
||||
TopoDS_Shape brep_from_string(const std::string& d)
|
||||
{
|
||||
if (d.empty()) return {};
|
||||
std::istringstream iss(d);
|
||||
TopoDS_Shape s;
|
||||
BRep_Builder b;
|
||||
BRepTools::Read(s, iss, b);
|
||||
return s;
|
||||
}
|
||||
|
||||
std::string CadDocument::serialize_recipe() const
|
||||
{
|
||||
std::ostringstream oss;
|
||||
{
|
||||
cereal::BinaryOutputArchive ar(oss);
|
||||
uint32_t v = SNAPORCA_CAD_RECIPE_VERSION;
|
||||
ar(v);
|
||||
ar(features);
|
||||
}
|
||||
return oss.str();
|
||||
}
|
||||
|
||||
bool CadDocument::deserialize_recipe(const std::string& blob)
|
||||
{
|
||||
try {
|
||||
std::istringstream iss(blob);
|
||||
cereal::BinaryInputArchive ar(iss);
|
||||
uint32_t v;
|
||||
ar(v);
|
||||
if (v > SNAPORCA_CAD_RECIPE_VERSION)
|
||||
return false;
|
||||
ar(features);
|
||||
return recompute();
|
||||
} catch (const Standard_Failure&) {
|
||||
return false;
|
||||
} catch (...) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Slic3r
|
||||
|
||||
Reference in New Issue
Block a user