mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-10-07 15:51:08 +00:00
Sketch layer - Trim/extend of an arc (and a circle opened into an arc) rewrites p0/p1 from the new angles; the wire builder, the solver and snapping read them. - Tangency binds the arc end that touches the line (or the other arc) instead of always the start, so a fillet tangent to both legs solves; circle-circle / circle-arc tangency uses the centre distance instead of CURVE_CURVE_TANGENT, which aborts on a circle. - Point-on-line distances and circle-line tangency keep the side the geometry is on; a point on an arc's rim uses PT_ON_CIRCLE. - The partitioned solve keeps constraints onto the origin/axes and counts free entities' DOF. - Zero-radius circles get no solver primitive and build no wire; constraints the solver cannot apply are reported in SketchSolveResult::skipped. - EllipseArc: mirror no longer yields the complement; after a solve its angles and ends are re-derived; on the XZ plane it is no longer built mirrored. - Offset: a circle follows the "+d = left of travel" rule (it shrinks, like a CCW arc chain); chains are joined at the weld tolerance. Bridge end pole fixed (G1, no cusp). Negative-scale transforms keep arcs and ellipses on their ends. Inference tolerances aligned with the weld. Model layer - Body references follow the body across delete / reorder / hide (resolved by the feature that made it); datum-plane ordinals are re-pointed; an index past the end is an error, not "the last body". New set_feature_enabled(). A move that puts a consumer above its input is refused. - Threads made from now on read thread_radius as the nominal major radius (internal: bore to minor, groove to major; external: groove cut into the rod); older recipes build as before. Bad thread parameters say why. Circular patterns span their angle end to end (new ones); add_pattern pivots on the modeling origin. - clear() drops variables; expression fields the GUI offers are bindable (thread_diameter, helix_*, thicken_thickness, ...); deg()/rad() in expressions; the recipe saves the modeling origin and body colours; names/colours follow bodies by identity. - Boolean and dress-up failures throw instead of returning the input; one produces_body(); hole standards corrected (82° inch countersinks, UNC names, #10-24); legacy profile solve validates indices and writes back only on success; v4 recipes read with a frozen field list. Tests cover each of the above. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QK4VgguuCAk2hZLWgcjJb9
42 lines
1.7 KiB
C++
42 lines
1.7 KiB
C++
#ifndef slic3r_ThreadStandards_hpp_
|
|
#define slic3r_ThreadStandards_hpp_
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace Slic3r {
|
|
|
|
// Canonical mechanical thread specifications (ISO metric + Unified imperial).
|
|
// All dimensions are stored in millimetres so the CAD kernel can consume them
|
|
// directly. The profile is the common 60deg V shared by ISO 261/965 and ASME
|
|
// B1.1 (UTS), so the cut/ridge depth used by the Design-tab Thread tool is the
|
|
// basic external thread height h = 0.6134 * pitch, and the internal (tapped)
|
|
// minor diameter is D1 = D - 1.0825 * pitch (= D - 2*5H/8).
|
|
struct ThreadSpec {
|
|
enum class Series { MetricCoarse, MetricFine, UNC, UNF };
|
|
|
|
std::string name; // designation, e.g. "M6", "1/4-20 UNC"
|
|
double major_diameter_mm; // nominal (crest) diameter
|
|
double pitch_mm; // axial advance per turn
|
|
Series series;
|
|
|
|
// 60deg basic external thread height (radial crest-to-root engagement).
|
|
double thread_depth_mm() const { return 0.6134 * pitch_mm; }
|
|
// Internal/tapped minor (tap-drill) diameter for the same nominal thread.
|
|
double minor_diameter_mm() const { return major_diameter_mm - 1.0825 * pitch_mm; }
|
|
// Radial depth of the internal (tapped) thread, minor to major: (D - D1) / 2.
|
|
double internal_depth_mm() const { return 0.5 * (major_diameter_mm - minor_diameter_mm()); }
|
|
|
|
bool imperial() const { return series == Series::UNC || series == Series::UNF; }
|
|
};
|
|
|
|
// Full ordered table (metric coarse, metric fine, UNC, UNF) for GUI listing.
|
|
const std::vector<ThreadSpec>& thread_standards();
|
|
|
|
// Exact case-sensitive designation lookup; nullptr if not a known standard.
|
|
const ThreadSpec* find_thread_standard(const std::string& name);
|
|
|
|
} // namespace Slic3r
|
|
|
|
#endif
|