Every 3-D solid OCS makes or opens now goes through cadkernel, which holds analytic surfaces — a cylinder is a cylinder record, not a spline that looks like one. That is what lets a solid built here be written back out as exact ACIS instead of a triangulation, and a facetted export is a one-way door: the next application to open the file would have no way back to the circle. The Model tab's seven primitives, the Design-group booleans, 3DROTATE, 3DMIRROR, 3DALIGN, SLICE, SECTION, POLYSOLID and PYRAMID all come from the kernel now, and `scene.solid_models` holds a `Body`. A mirrored solid needed its own care before; the kernel reverses the loops on the way through, so it comes back the right way out rather than lighting black. EXTRUDE and REVOLVE sweep the profile `entities::curve` already defines, so a circle, an arc-bulged polyline and a closed spline arrive as the same thing. A circle extrudes into four cylinder patches rather than a run of chords, and a profile turned about an axis becomes a cone, a sphere or a torus. A spline profile has no analytic side wall and is refused rather than approximated. ACIS goes both ways through the codec's own bridge: `lift` to read and `append` to write. That drops the 679-line truck conversion and the planar- only exporter, and the tessellator keeps its bespoke sampler as a fallback for whatever the kernel cannot yet express — reported rather than passed off as whole, since a mesh missing a wall looks finished. truck-shapeops is no longer used and is gone from the manifest. truck-modeling stays for now: fourteen files use it as a 3-D NURBS evaluator, which the kernel has no answer for yet, and SWEEP and LOFT have no kernel operation behind them either. The two `automation` test failures are unchanged from before this and are not caused by it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
32 lines
1.4 KiB
Rust
32 lines
1.4 KiB
Rust
//! Export a B-rep [`Body`] to an exact ACIS `SatDocument`.
|
|
//!
|
|
//! A solid built by the Model tab, by EXTRUDE / REVOLVE, or by a boolean
|
|
//! carries no ACIS geometry of its own, so other CAD applications drop it on
|
|
//! open. Writing the body out as real modeller geometry is what stops that.
|
|
//!
|
|
//! # Exact, not facetted
|
|
//!
|
|
//! The kernel keeps analytic surfaces — a cylinder is a `cylinder` record and
|
|
//! a sphere a `sphere` — so what lands in the document is the shape itself
|
|
//! rather than a triangulation of it. That is the whole reason the Model tab
|
|
//! builds bodies at all: a facetted export is a one-way door, and the next
|
|
//! application to open the file would have no way back to the circle.
|
|
//!
|
|
//! The writing is [`acis::append`], which lives with the codec because it has
|
|
//! to know both sides. What is left here is the small matter of putting one
|
|
//! body into a fresh document.
|
|
|
|
use acadrust::acis::append;
|
|
use acadrust::entities::acis::SatDocument;
|
|
use acadrust::kernel::brep::Body;
|
|
|
|
/// An exact ACIS document holding `body`, or `None` when the kernel has no
|
|
/// record form for something in it — a spline curve, at present.
|
|
///
|
|
/// Refusing is the point: a document missing a face is one that parses into a
|
|
/// different solid, and nothing downstream could tell.
|
|
pub fn planar_solid_to_sat(body: &Body) -> Option<SatDocument> {
|
|
let mut document = SatDocument::new();
|
|
append(body, &mut document).ok()?;
|
|
Some(document)
|
|
}
|