Merge pull request #301 from tdamsma/surface/owner-zone-tol

surface: cache the owning face's zone tolerance on Surface (2115 deferred cases now compared)
This commit is contained in:
bherbruck
2026-10-21 23:26:05 +00:00
committed by GitHub
76 changed files with 14222 additions and 23853 deletions
+4
View File
@@ -341,6 +341,10 @@ impl UnitDiff for Runner {
{
let _ = surface.set_owner(Some(arena_identity(CacheObject::Face(id))));
}
// the face's tolerance, as the face upstream answers GetTolerance with
scene
.sync_face_surface_tolerance(id)
.map_err(|e| harness(e.to_string()))?;
}
let [x0, y0, z0, x1, y1, z1] = s.scene_box;
let (lo, hi) = (Vec3::new(x0, y0, z0), Vec3::new(x1, y1, z1));
@@ -426,6 +426,9 @@ impl Pool {
)));
}
}
// a new owner key drops the cached face tolerance: record it again
brep.sync_face_surface_tolerance(face)
.map_err(|error| harness(&error))?;
}
breps.push(brep);
}
+5 -1
View File
@@ -463,7 +463,11 @@ pub(crate) fn rust_brep(k: &Kernel, f: &FaceIn) -> Result<(Brep, FaceId), Harnes
.map_err(e)?;
b.shell_mut(shell).map_err(e)?.faces.push(face);
let up = next_id!(b.faceuses(), FaceuseId);
let down = next_id!(b.faceuses(), FaceuseId);
// the down face use is the record after the up one (both ids are taken before either
// record is added, so they cannot both come from the arena's length)
let down = FaceuseId::from_index(
u32::try_from(b.faceuses().len() + 1).map_err(|_| harness("too many records"))?,
);
for (mate, orientation) in [(down, OrientType::Same), (up, OrientType::Opposite)] {
b.add_faceuse_record(Faceuse {
shell: Some(shell),
@@ -10,7 +10,8 @@
//! optional `face` (a one-face B-rep built with `SmBrepConstructor` as in unit
//! `heal.face_props`: a plane or `SmSurfOfRevolution::CreateCanonical` surface, cylinder or
//! sphere among them, with a vertex loop or edge loops of line edges; rebuilt record by record
//! on the Rust side by `heal_face_props::rust_brep`) whose face, loops, edges, vertices and edge
//! on the Rust side by `heal_face_props::rust_brep` plus its down face use's side,
//! `heal_face_props::add_down_side`) whose face, loops, edges, vertices and edge
//! uses join the pool after the objects, and `ops` on two default classifications `cc[0]`,
//! `cc[1]`: the setters of unit `intersect.curve_class_p1` build them (intervals, boundary
//! classifications on the face's edges and vertices, the classification curve, face and
@@ -775,7 +776,10 @@ fn build_pool(k: &Kernel, s: &Script) -> Result<Pool, HarnessError> {
pool.handles.push(H::Obj(i, class_kind_of(obj_kind(o))));
}
if let Some(face) = &s.face {
let (b, f) = face_brep(k, face)?;
let (mut b, f) = face_brep(k, face)?;
// the down face use's loops, so that edge mates (an edge's end vertex, the end edge
// use of a vertex use's UV sector) exist as upstream
hfp::add_down_side(&mut b, f)?;
for (e, _) in topology_entities(&b, f)? {
pool.handles.push(H::Topo(e));
}
@@ -1116,6 +1116,7 @@ fn rust_surface(k: &Kernel, op: &OpIn, s: &mut BSplineSurface, o: &mut Vec<f64>)
pseudo_guess: pg.as_ref(),
polar_guess: plg.as_ref(),
expand_by_zone_tol: *expand,
expand_tolerance: None,
};
let b = s.calculate_bounding_box(k, &domain_of(*domain), &req)?;
if let Some(nb) = b.normal {
@@ -403,6 +403,9 @@ fn imported(k: &Kernel, a: &[f64; 22], export_op: i32) -> std::result::Result<Br
{
let _ = surface.set_owner(Some(arena_identity(CacheObject::Face(id))));
}
// the face's tolerance, as the face upstream answers GetTolerance with
b.sync_face_surface_tolerance(id)
.map_err(|e| HarnessError::new(e.to_string()))?;
}
Ok(b)
}
@@ -224,6 +224,9 @@ pub(crate) fn model(brep: &Value) -> Result<Model, HarnessError> {
key: ObjectKey(i as u64),
}));
}
// the face's tolerance, as the face upstream answers GetTolerance with
b.sync_face_surface_tolerance(f)
.map_err(|e| harness(e.to_string()))?;
}
Ok(Model {
path,
@@ -861,6 +861,9 @@ pub(crate) fn import(ex: &[f64], graph_at: usize) -> Result<(Brep, ImportTypes),
{
let _ = surface.set_owner(Some(arena_identity(CacheObject::Face(id))));
}
// the face's tolerance, as the face upstream answers GetTolerance with
b.sync_face_surface_tolerance(id)
.map_err(|e| harness(e.to_string()))?;
}
// the shared import leaves `m_pFU` unset: the face's upward (SAME) face use
let ups: Vec<(FaceId, FaceuseId)> = b
@@ -1960,6 +1963,21 @@ fn run_rust_op(
dir,
} => {
let id = |i: i64| (i >= 0).then(|| EdgeuseId::from_index(i as u32));
// a blend (flag != 0) samples both edge uses' face surfaces (DropPoint,
// normals, directional derivatives): an analytic surface the export hands
// over as its B-spline part takes other paths in C++ (e.g.
// SmSurfOfRevolution::DropPointFast), so those cases are not comparable
if *f != 0 {
if let (Some(e1), Some(e2)) = (id(*eu1), id(*eu2)) {
let face = solidcore::topology::edgeuse::p1::face;
let has_edges = b.edgeuse(e1)?.edge.is_some() && b.edgeuse(e2)?.edge.is_some();
if let (true, Some(f1), Some(f2)) = (has_edges, face(b, e1)?, face(b, e2)?) {
if let Some(d) = inexact(types, Some(&[f1, f2]), Some(&[])) {
return Ok(Err(d));
}
}
}
}
match bp1::create_edge_edge_blend(
k,
u64::from(*f),
@@ -25,11 +25,13 @@
//! Rust side reports [`SolidError::InvalidInput`] or fails the same guard), `-3` a call
//! the shim skips because the Rust side defers it to an unported unit.
//!
//! Deferred: `SmFace::ComputeLoopOrientation` (`CheckFace` after its first loop check,
//! `FixTrimLoopOrientation`, `FixTrimLoopOrder`) at its `sm_AreConnected` /
//! `GetOrCreateUVTrimCurve` / `NormalizedEvaluate` calls (`topology.edgeuse_p3`),
//! `SplitAtSeams` (`topology.face_p1` / `topology.face_p4`), `CreateUVTrimCurves` at the
//! face-owned surface's `SmFace::GetTolerance` stub of `GetSingularities`
//! `CheckFace`, `FixTrimLoopOrientation` and `FixTrimLoopOrder` run in full on both sides
//! (`SmFace::ComputeLoopOrientation` is ported; it was skipped with `-3` while the Rust
//! side still deferred it), guarded (`-2`) where a loop lacks its loop use, the face its
//! surface or UV trim curves, or `CheckLoop` a loop's UV extremes.
//!
//! Deferred: `SplitAtSeams` (`topology.face_p1` / `topology.face_p4`), `CreateUVTrimCurves`
//! at the face-owned surface's `SmFace::GetTolerance` stub of `GetSingularities`
//! (`topology.face_p2`; it and `ClearUVTrimCurves` are compared, with every edge use's
//! UV trim curve after the call), `SmEdgeuse::GetOrCreateUVTrimCurve`
//! (`topology.edgeuse_p3`), and the vertex-use UV points some B-reps need
@@ -1573,6 +1575,20 @@ fn ok_loop_extremes(b: &Brep, l: LoopId) -> Result<bool, Fail> {
Ok(true)
}
/// The shim's `tt_ok_face_loops`: every loop has its loop use, and a face with loops
/// has a surface and UV trim curves everywhere.
fn ok_face_loops(b: &Brep, f: FaceId) -> Result<bool, Fail> {
let loops = face_loops(b, f)?;
for &l in &loops {
if !ok_loop(b, l)? {
return Ok(false);
}
}
Ok(loops.is_empty()
|| (b.face(f).map_err(|e| fail(&e))?.surface.is_some()
&& tt::face_uv_curves_present(b, f).map_err(|e| fail(&e))?))
}
/// The surface of a loop's face (a copy), `None` without face or surface.
fn loop_surface(b: &Brep, l: LoopId) -> Result<Option<Surface>, Fail> {
let f = lu1::loop_face(b, l).map_err(|e| fail(&e))?;
@@ -1754,6 +1770,21 @@ fn run_rust_brep(k: &Kernel, b: &mut Brep, op: &OpIn) -> Result<Vec<f64>, Fail>
return Ok(o);
}
}
// the shim's guards of the CheckLoop / ComputeLoopOrientation walk
let loops = face_loops(b, fc)?;
if !loops.is_empty() && tt::face_uv_curves_present(b, fc).map_err(|e| fail(&e))? {
let mut ok = b.face(fc).map_err(|e| fail(&e))?.surface.is_some();
for &l in &loops {
if !ok || *skip {
break;
}
ok = ok_loop_extremes(b, l)?;
}
if !ok {
o.push(NULL_DEREF);
return Ok(o);
}
}
let mut a = AssertArray::new();
let r = tt::check_face(k, b, fc, *tol, list.then_some(&mut a), *skip);
o.push(status(&r)?);
@@ -1886,11 +1917,19 @@ fn run_rust_brep(k: &Kernel, b: &mut Brep, op: &OpIn) -> Result<Vec<f64>, Fail>
put_uv_curves(&mut o, b);
}
OpIn::BOrient { f: face, .. } => {
if !ok_face_loops(b, fid(*face))? {
o.push(NULL_DEREF);
return Ok(o);
}
let r = tt::fix_face_loop_orientations(k, b, fid(*face));
o.push(status(&r)?);
o.push(r.map_or(0.0, |n| n as f64));
}
OpIn::BOrder { f: face, .. } => {
if !ok_face_loops(b, fid(*face))? {
o.push(NULL_DEREF);
return Ok(o);
}
let r = tt::fix_trim_loop_order(k, b, fid(*face));
o.push(status(&r)?);
}
@@ -106,7 +106,9 @@
//! surface the tolerance of its edge or face (`GetEdge` / `GetFace`), and every other
//! non-topology object the system zone tolerance. A curve's edge is found with
//! [`Curve::edge`] (intermediate owners through [`ClassGeometry::owner_of`]); a
//! surface's face is [`Surface::face`](crate::surface::surface::Surface::face);
//! surface's face is [`Surface::face`](crate::surface::surface::Surface::face),
//! whose tolerance is the one its B-rep cached on the surface
//! ([`Surface::owner_zone_tol_3d`](crate::surface::surface::Surface::owner_zone_tol_3d));
//! an edge's or face's tolerance is that of the edge or face. Topology
//! kinds without a `GetTolerance` override (region, faceuse, loop, loopuse,
//! vertexuse) get `SmTopology::GetTolerance`, `SM_ZONE_TOL_3D`, and a faceuse
@@ -1591,14 +1593,9 @@ pub fn object_zone_tol_3d<O: ClassObject>(
| ClassObjectKind::Region => Ok(ZONE_TOL_3D),
ClassObjectKind::Surface => {
let surface = geometry.surface(o).ok_or_else(|| unresolved(OP_GEOMETRY))?;
if surface.face()?.is_some() {
// UNPORTED(topology.face_p2): SmFace::GetTolerance
return Err(SolidError::unported(
"SmFace::GetTolerance",
"topology.face_p2",
));
}
Ok(system)
// GetFace() ? its tolerance (cached on the surface by its B-rep;
// UNPORTED(topology.face_p2): SmFace::GetTolerance for a bare face handle)
Ok(surface.face_zone_tol_3d()?.unwrap_or(system))
}
ClassObjectKind::Curve => {
let curve = geometry.curve(o).ok_or_else(|| unresolved(OP_GEOMETRY))?;
@@ -115,7 +115,8 @@
//! `SmSurface::EvaluateNormal` (`surface::surface::p7`); its zone tolerance expansion
//! reads `GetFace()`, and a bare B-spline has no owner (the owner is held by the
//! [`Surface`](crate::surface::surface::Surface) wrapper), so it uses
//! `SM_ZONE_TOL_3D`; `CreateOffsetSurface` uses the base `SmSurface` body and
//! `SM_ZONE_TOL_3D` unless the wrapper passes its face's cached tolerance as
//! [`BoundingBoxRequest::expand_tolerance`]; `CreateOffsetSurface` uses the base `SmSurface` body and
//! constructs an `OffsetSurface`, asking the copy for its singularities.
//! `STEPInversion` runs `GlobalPointSolve` and `IsClosed` on the owning surface
//! (including plane overrides) and calls the base `LocalPointSolve` and
@@ -379,6 +380,11 @@ pub struct BoundingBoxRequest<'a> {
/// Expand the normal and pseudo boxes by the zone tolerance
/// (`bExpandPosBoxesByZoneTol3d`, upstream default `TRUE`).
pub expand_by_zone_tol: bool,
/// The zone tolerance of the owning face to expand by (`GetFace()->GetTolerance()`):
/// a bare B-spline has no owner, so the [`Surface`](crate::surface::surface::Surface)
/// wrapper holding it passes its face's cached tolerance here; `None` expands by
/// the ownerless `SM_ZONE_TOL_3D`.
pub expand_tolerance: Option<f64>,
}
/// The boxes of [`BSplineSurface::calculate_bounding_box`] (each present when asked).
@@ -499,11 +505,13 @@ fn evaluate_normal(k: &Kernel, srf: &BSplineSurface, uv: Point2) -> Result<Vec3>
/// bare B-spline has no owner (the owner is held by the
/// [`Surface`](crate::surface::surface::Surface) wrapper, whose
/// [`calculate_bounding_box`](crate::surface::surface::Surface::calculate_bounding_box)
/// handles a face owner before calling here): `SM_ZONE_TOL_3D`. Callers that hold a
/// `Surface` with a face must check it first (as `Surface::calculate_bounding_box` and
/// `Surface::is_planar` do); the patch boxes of surface caches are ownerless.
const fn owner_zone_tolerance(_srf: &BSplineSurface) -> f64 {
crate::geom::tol::ZONE_TOL_3D
/// passes a face owner's tolerance as [`BoundingBoxRequest::expand_tolerance`]):
/// that tolerance when given, else `SM_ZONE_TOL_3D`. Callers that hold a `Surface` with
/// a face must pass it (as `Surface::calculate_bounding_box` and `Surface::is_planar`
/// do); the patch boxes of surface caches are ownerless.
fn owner_zone_tolerance(req: &BoundingBoxRequest<'_>) -> f64 {
req.expand_tolerance
.unwrap_or(crate::geom::tol::ZONE_TOL_3D)
}
/// `SmSurface::IsDegenerateCurve` (the base body, on a copy of the B-spline as an
@@ -1415,11 +1423,11 @@ impl BSplineSurface {
// When asked, expand the normal box by the zone tolerance
if req.expand_by_zone_tol {
if let Some(nb) = normal_box.as_mut() {
nb.expand_absolute(owner_zone_tolerance(self));
nb.expand_absolute(owner_zone_tolerance(req));
}
// When asked, expand the pPseudoBox box by the zone tolerance
if let Some(pb) = pseudo_box.as_mut() {
pb.expand_absolute(owner_zone_tolerance(self));
pb.expand_absolute(owner_zone_tolerance(req));
}
}
+31 -11
View File
@@ -26,16 +26,18 @@
//! face's own tolerance (what `SmBSplineSurface::CalculateBoundingBox` reads through
//! `GetFace()`): arena surfaces hold no owning face, so the B-spline/plane/revolution
//! box is computed unexpanded and expanded here, as the override's last step does.
//! `Point3DClassify` builds no surface cache (the Rust point solvers take none, as in
//! `topology::vertexuse` and `intersect::curve_class::p1`), so upstream's temporary
//! switch-off of the cache's point test (SmFace.cpp:12801) has nothing to act on yet:
//! the face-owned surface's solve stops at `surface::surface::p4`'s
//! `UNPORTED(query.face_p2)` `SmFace::PointClassify` stub, a call the C++ never makes
//! here, and that stub's NOTE lists this caller so the switch is added for it when it is
//! wired. `PointClassify` gets
//! no trimmed surface cache (a fresh one is never face-containment-complete, so its
//! cache branch cannot run). `EdgeCurveOnClassify` lifts a 2D curve to a curve on the
//! face's surface only when an upward edge use of the face is found (upstream lifts it
//! `Point3DClassify` builds the surface's trimmed surface cache first
//! (`smsurf_GetSurfaceCache`, SmFace.cpp:12792) and hands it to `PointClassify`, which
//! upstream finds again through `SmCacheMgr::GetObjectCache`: built for a face with
//! loops, its face containment is done, so `PointClassify` classifies through the
//! leaf node containing the point before the vertex and loop tests (`query.face_p1`
//! `gen0160`: C++ FACE from an inside leaf, the vertex test alone gives VERTEX). Its
//! face walk is [`SolidError::Unported`] today (`SmFace handle of a surface's face`,
//! `topology.face_p2`), so every face-owned surface defers there. The Rust point solvers
//! take no cache (as in `topology::vertexuse` and `intersect::curve_class::p1`), so
//! upstream's temporary switch-off of the cache's point test (SmFace.cpp:12801) and the
//! cache check-out have nothing to act on. `EdgeCurveOnClassify` lifts a 2D curve to a
//! curve on the face's surface only when an upward edge use of the face is found (upstream lifts it
//! first and ignores `SetAll`'s status); an `SmCrvOnSurf` over a surface other than a
//! B-spline is a dispatch gap (`curve.crv_on_surf`). No recursion.
@@ -53,6 +55,7 @@ use crate::kernel::Kernel;
use crate::nurbs::b_spline_curve::BoundingBoxRequest;
use crate::nurbs::b_spline_surface::SurfParamType;
use crate::nurbs::b_spline_surface_n_lib::p2::OrientType;
use crate::surface::surface::p1::{make_surface_cache, make_trim_srf_cache};
use crate::surface::surface::p4::NoObject;
use crate::surface::surface::{Surface, SurfaceKind};
use crate::surface::volume::Volume;
@@ -433,6 +436,23 @@ pub fn point_3d_classify(
pc.set_face(Some(EntityRef::Face(f)));
pc.set_src_zone_tol_3d(src_zone_tol_3d);
// SmSurfaceCache *pTSC = smsurf_GetSurfaceCache(pSurface): the surface's trimmed
// surface cache (built with its face containment when the face has loops), else
// its surface cache. PointClassify below finds the trimmed one again
// (SmCacheMgr::GetObjectCache) and classifies through its leaf nodes first.
let mut trim_cache = {
let surface = fp2::surface(b, f)?
.ok_or_else(|| SolidError::invalid_input(OP_POINT, "face without surface"))?;
match make_trim_srf_cache(k, surface, None::<EntityRef>) {
Ok(c) => Some(c),
Err(e) if e.is_unported() => return Err(e),
Err(_) => {
ignored(make_surface_cache(k, surface, None::<EntityRef>))?;
None
}
}
};
let uv = {
let surface = fp2::surface(b, f)?
.ok_or_else(|| SolidError::invalid_input(OP_POINT, "face without surface"))?;
@@ -496,7 +516,7 @@ pub fn point_3d_classify(
tgt_loops_only: opts.tgt_loops_only,
tgt_loops: opts.tgt_loops,
uv_space_okay: opts.uv_space_okay,
trim_cache: None,
trim_cache: trim_cache.as_mut(),
},
)?;
+95 -1
View File
@@ -71,6 +71,14 @@
//! - Boundary views use required handle mappings and the same [`ClassGeometry`]
//! implementation as part 5. Lazy UV and gap calculations run on a private B-rep
//! snapshot; numerical results are preserved while cache-only updates are discarded.
//! - **Vertex/face gaps.** With `bHasBigGaps`, `IntersectVertices` reads each vertex's
//! `GetVertexuseOfFace(pFace)->GetVertexFaceGap()` length. [`curve_on_classify`]
//! computes them from the B-rep (on one private snapshot per call, which keeps the
//! gap caches across both passes) for the face's vertices before the vertex
//! intersections, and answers [`ClassGeometry::vertex_face_gap`] for them around the
//! caller's [`ClassGeometry`]; a gap error therefore surfaces before the earlier
//! vertices are intersected (upstream: a null dereference or the same unported
//! callee). A vertex without a face use is unresolved (upstream dereferences null).
//! - No recursion.
use crate::curve::curve::Curve;
@@ -626,6 +634,70 @@ pub trait CurveOnClassifyObjects<O: ClassObject>: ClassGeometry<O> {
}
}
/// `pVertex->GetVertexuseOfFace(pFace)->GetVertexFaceGap()->GetLength()`, 0 when the
/// vertex use has no vertex/face gap (`IntersectVertices`' `dMaxGap3d`), on the B-rep
/// snapshot `b` (which keeps the gap cache `GetVertexFaceGap` fills). `None` for a
/// vertex without a use on a face (upstream dereferences the null vertex use; part 5
/// reports the unresolved gap as invalid input).
fn vertex_face_gap_length(k: &Kernel, b: &mut Brep, v: VertexId, f: FaceId) -> Result<Option<f64>> {
let Some(vu) = crate::topology::vertex::vertexuse_of_face(b, v, Some(f))? else {
return Ok(None);
};
Ok(Some(
crate::topology::vertexuse::vertex_face_gap(k, b, vu, false)?.map_or(0.0, |g| g.gap_3d),
))
}
/// The caller's [`ClassGeometry`] answering [`ClassGeometry::vertex_face_gap`] for the
/// vertices `IntersectVertices` intersects (their gaps computed from the B-rep, as
/// upstream's vertex pointers reach them); everything else is the caller's.
///
/// Every [`ClassGeometry`] method must be forwarded to `inner` here, including any added
/// later: a trait default would otherwise silently replace the inner adapter's override.
struct WithVertexFaceGaps<'g, G, O> {
inner: &'g G,
gaps: Vec<(O, Option<f64>)>,
}
impl<G: ClassGeometry<O>, O: ClassObject> ClassGeometry<O> for WithVertexFaceGaps<'_, G, O> {
fn curve(&self, o: O) -> Option<&Curve> {
self.inner.curve(o)
}
fn surface(&self, o: O) -> Option<&Surface> {
self.inner.surface(o)
}
fn volume(&self, o: O) -> Option<&crate::surface::volume::Volume> {
self.inner.volume(o)
}
fn point(&self, o: O) -> Option<Point3> {
self.inner.point(o)
}
fn classification_vertex_point(&self, vertex: O) -> Option<Point3> {
self.inner.classification_vertex_point(vertex)
}
fn topology_zone_tol_3d(&self, object: O) -> Option<f64> {
self.inner.topology_zone_tol_3d(object)
}
fn vertex_face_gap(&self, vertex: O, surface: &Surface, face: Option<O>) -> Option<f64> {
match self.gaps.iter().find(|(h, _)| *h == vertex) {
Some((_, gap)) => *gap,
None => self.inner.vertex_face_gap(vertex, surface, face),
}
}
fn topology_entity(&self, object: O) -> Option<(&Brep, EntityRef)> {
self.inner.topology_entity(object)
}
fn topology_handle(&self, entity: EntityRef) -> Option<O> {
self.inner.topology_handle(entity)
}
fn owner_of(
&self,
owner: crate::geom::object::ObjectRef,
) -> Option<crate::geom::object::ObjectRef> {
self.inner.owner_of(owner)
}
}
/// Resolve stored edge data and its optional gap on this face. The snapshot
/// retains lazy gap-cache updates without mutating the caller's borrowed B-rep.
fn boundary_edge<O: ClassObject>(
@@ -754,6 +826,8 @@ pub fn curve_on_classify<O: ClassObject>(
reset_classification(k, cc)?;
cc.set_face(Some(objects.face(f)));
let mut modified = false;
// (the vertex/face gap caches GetVertexFaceGap fills: a private B-rep snapshot)
let mut gap_snapshot: Option<Brep> = None;
// for two iterations to allow the surf/surf/surf intersection heuristic a chance to
// update curve and edge shapes.
@@ -794,11 +868,31 @@ pub fn curve_on_classify<O: ClassObject>(
.surface
.as_ref()
.ok_or_else(|| null(OP_CURVE, "face without surface"))?;
// bHasBigGaps: each vertex's GetVertexuseOfFace(pFace)->GetVertexFaceGap()
// (pFace is this face, set on the classification above)
let gaps = if has_big_gaps {
let snapshot = gap_snapshot.get_or_insert_with(|| b.clone());
vertices
.iter()
.map(|&v| {
Ok((
objects.vertex(v),
vertex_face_gap_length(k, snapshot, v, f)?,
))
})
.collect::<Result<Vec<_>>>()?
} else {
Vec::new()
};
let vertices = vertices
.iter()
.map(|&v| objects.vertex(v))
.collect::<Vec<_>>();
cc.intersect_vertices(k, objects, &vertices, surface, has_big_gaps, true)?;
let geometry = WithVertexFaceGaps {
inner: objects,
gaps,
};
cc.intersect_vertices(k, &geometry, &vertices, surface, has_big_gaps, true)?;
// 2nd intersect face edges with the curve
let edges = face_edges(b, f, cc.tgt_loops_only(), Some(&tgt_loops))?;
+1
View File
@@ -279,6 +279,7 @@ fn surface_is_planar(k: &Kernel, b: &Brep, f: FaceId, s: &Surface, tol_3d: f64)
pseudo_guess: None,
polar_guess: None,
expand_by_zone_tol: false,
expand_tolerance: None,
};
let pseudo = ignored(bs.calculate_bounding_box(k, &s.natural_uv_domain(), &req))?
.and_then(|r| r.pseudo)
+31 -13
View File
@@ -46,6 +46,7 @@ use crate::kernel::Kernel;
use crate::math::{max2, min2, EFF_ZERO, EFF_ZERO_SQRT, PI, UNDEF_DOUBLE};
use crate::nurbs::b_spline_curve::BSplineCurve;
use crate::nurbs::b_spline_surface::{BoundingBoxRequest, LocationType};
use crate::surface::plane::p2::PlaneOwner;
use crate::surface::plane::Plane;
use crate::surface::surf_of_extrusion::SurfOfExtrusion;
use crate::surface::surf_of_revolution::p3::Revolved;
@@ -287,23 +288,40 @@ impl Cone {
plane: &Plane,
other_domain: &Extent2d,
approx_tol: Option<f64>,
) -> Result<(bool, SurfaceIntersection)> {
self.intersect_with_plane_owned(
k,
domain,
plane,
PlaneOwner::NoFace,
other_domain,
approx_tol,
)
}
/// [`Cone::intersect_with_plane`] with the plane's owner: its box is expanded by the
/// tolerance of the plane's face (`GetFace()->GetTolerance()`), else by
/// `SM_ZONE_TOL_3D`.
///
/// # Errors
///
/// Those of [`Cone::intersect_with_plane`]; [`SolidError::Unported`]
/// (`SmFace::GetTolerance`) for a plane with a face whose tolerance is not cached.
pub(crate) fn intersect_with_plane_owned(
&self,
k: &Kernel,
domain: &Extent2d,
plane: &Plane,
plane_owner: PlaneOwner,
other_domain: &Extent2d,
approx_tol: Option<f64>,
) -> Result<(bool, SurfaceIntersection)> {
let mut out = SurfaceIntersection::default();
let tol = approx_tol.map_or(EFF_ZERO_SQRT, |t| approx_tol3d(k, t));
let box1 = bbox(k, self, domain)?;
let mut box2 = plane
.base_with_nurb()?
.calculate_bounding_box(
k,
other_domain,
&BoundingBoxRequest {
normal: true,
expand_by_zone_tol: true,
..BoundingBoxRequest::default()
},
)?
.normal
.ok_or_else(|| SolidError::sm_err(OP))?;
// crPlane.CalculateBoundingBox: expanded by its face's tolerance (no face:
// SM_ZONE_TOL_3D)
let mut box2 = plane.bounding_boxes(k, other_domain, plane_owner)?.0;
box2.expand_absolute(tol);
if box1.are_disjoint(&box2, 0.0) {
return Ok((false, out));
@@ -713,8 +713,9 @@ impl OffsetSurface {
///
/// Those of the base surface's [`Surface::calculate_bounding_box`] and of
/// [`Surface::base_calculate_bounding_box`] (an owned base reaches this offset's face
/// through its owner, so a face-owned B-spline-kind base's expanded box returns
/// `SmFace::GetTolerance`'s [`SolidError::Unported`], as upstream asks that face).
/// through its owner, so a face-owned B-spline-kind base's box is expanded by the
/// face tolerance passed down to it, [`Surface::owner_zone_tol_3d`], as upstream asks
/// that face; without it, `SmFace::GetTolerance`'s [`SolidError::Unported`]).
pub fn calculate_bounding_box(
&self,
k: &Kernel,
+69 -37
View File
@@ -29,8 +29,9 @@
//! tolerance of the plane's face ([`Surface::face`], `SmSurface::GetFace`), else
//! `SM_ZONE_TOL_3D`. A bare [`Plane`] has no owner (the owner lives on [`Surface`]), so
//! it uses `SM_ZONE_TOL_3D`; through [`Surface::global_surface_intersect`] a plane with
//! a face returns [`SolidError::Unported`] there (`SmFace::GetTolerance`, unit
//! `topology.face_p2`).
//! a face uses the face tolerance its B-rep cached on the surface
//! ([`Surface::owner_zone_tol_3d`]), and returns [`SolidError::Unported`] there
//! without it (`SmFace::GetTolerance`, unit `topology.face_p2`).
//! - **NURB.** `IntersectWithPlane`'s parallel case tests whether both planes hold a
//! NURB (`m_pNurb`), as upstream; the boxes are computed on a NURB made on a copy
//! when the plane has none (upstream makes it in place, a `const_cast`). Because the
@@ -112,18 +113,45 @@ impl SolutionObject for CurveHandle {
}
}
/// The tolerance of a plane's face (`GetFace()->GetTolerance()`, when `owned`: the
/// plane has a face), else `SM_ZONE_TOL_3D` (the `bExpandPosBoxesByZoneTol3d`
/// expansion of `CalculateBoundingBox`).
fn zone_tolerance(owned: bool) -> Result<f64> {
if owned {
// UNPORTED(topology.face_p2): SmFace::GetTolerance
return Err(SolidError::unported(
/// Whether a plane has a face (`SmSurface::GetFace`), and that face's tolerance as its
/// B-rep cached it on the [`Surface`] ([`Surface::owner_zone_tol_3d`]).
#[derive(Debug, Clone, Copy, PartialEq)]
pub(crate) enum PlaneOwner {
/// No face: the boxes expand by `SM_ZONE_TOL_3D`.
NoFace,
/// A face, with its cached tolerance (`None`: a bare face handle).
Face(Option<f64>),
}
impl PlaneOwner {
/// The owner state of a plane held by `surface`.
///
/// # Errors
///
/// Those of [`Surface::face`].
pub(crate) fn of(surface: &Surface) -> Result<Self> {
Ok(if surface.face()?.is_some() {
Self::Face(surface.owner_zone_tol_3d())
} else {
Self::NoFace
})
}
}
/// The tolerance of a plane's face (`GetFace()->GetTolerance()`, when the plane has a
/// face), else `SM_ZONE_TOL_3D` (the `bExpandPosBoxesByZoneTol3d` expansion of
/// `CalculateBoundingBox`).
fn zone_tolerance(owner: PlaneOwner) -> Result<f64> {
match owner {
PlaneOwner::NoFace => Ok(ZONE_TOL_3D),
PlaneOwner::Face(Some(tol)) => Ok(tol),
// UNPORTED(topology.face_p2): SmFace::GetTolerance (a bare face handle without
// the tolerance its B-rep caches on the surface)
PlaneOwner::Face(None) => Err(SolidError::unported(
"SmFace::GetTolerance",
"topology.face_p2",
));
)),
}
Ok(ZONE_TOL_3D)
}
impl Plane {
@@ -480,7 +508,7 @@ impl Plane {
&self,
k: &Kernel,
uv_domain: &Extent2d,
owned: bool,
owner: PlaneOwner,
) -> Result<(Extent3d, PseudoBox)> {
let req = BoundingBoxRequest {
normal: true,
@@ -494,8 +522,8 @@ impl Plane {
let mut bbox = b.normal.ok_or(SolidError::null_pointer(OP_PP))?;
let mut pbox = b.pseudo.ok_or(SolidError::null_pointer(OP_PP))?;
// When asked, expand the normal and pseudo boxes by the zone tolerance
bbox.expand_absolute(zone_tolerance(owned)?);
pbox.expand_absolute(zone_tolerance(owned)?);
bbox.expand_absolute(zone_tolerance(owner)?);
pbox.expand_absolute(zone_tolerance(owner)?);
Ok((bbox, pbox))
}
@@ -528,11 +556,11 @@ impl Plane {
other,
other_uv_domain,
approx_tol_3d,
[false, false],
[PlaneOwner::NoFace, PlaneOwner::NoFace],
)
}
/// [`Plane::intersect_with_plane`] with the planes' ownership (for the zone
/// [`Plane::intersect_with_plane`] with the planes' owners (for the zone
/// tolerance).
#[allow(clippy::too_many_lines)] // one upstream function
pub(crate) fn intersect_with_plane_owned(
@@ -542,7 +570,7 @@ impl Plane {
other: &Self,
other_uv_domain: &Extent2d,
approx_tol_3d: Option<f64>,
owned: [bool; 2],
owners: [PlaneOwner; 2],
) -> Result<(bool, SurfaceIntersection)> {
// init output
let mut out = SurfaceIntersection::default();
@@ -582,8 +610,8 @@ impl Plane {
}
// get plane1 and plane2 bounding and pseudo boxes
let (bbox1, pbox1) = self.bounding_boxes(k, uv_domain, owned[0])?;
let (bbox2, pbox2) = other.bounding_boxes(k, other_uv_domain, owned[1])?;
let (bbox1, pbox1) = self.bounding_boxes(k, uv_domain, owners[0])?;
let (bbox2, pbox2) = other.bounding_boxes(k, other_uv_domain, owners[1])?;
// no work - when bounding or pseudo boxes are disjoint
if bbox1.are_disjoint(&bbox2, 0.0) || pbox1.are_disjoint(&pbox2, None) {
@@ -667,7 +695,7 @@ impl Plane {
// get size of bounded ThisPlane
if this_bounded {
(bbox1, pbox1) = self.bounding_boxes(k, uv_domain, owned[0])?;
(bbox1, pbox1) = self.bounding_boxes(k, uv_domain, owners[0])?;
let radius1 = bbox1.sphere_bound().radius;
bbox1.expand_absolute(tol / 2.0);
pbox1.expand_absolute(tol / 2.0);
@@ -676,7 +704,7 @@ impl Plane {
// get size of bounded OtherPlane
if other_bounded {
(bbox2, pbox2) = other.bounding_boxes(k, other_uv_domain, owned[1])?;
(bbox2, pbox2) = other.bounding_boxes(k, other_uv_domain, owners[1])?;
let radius2 = bbox2.sphere_bound().radius;
bbox2.expand_absolute(tol / 2.0);
pbox2.expand_absolute(tol / 2.0);
@@ -1374,28 +1402,30 @@ pub(crate) fn global_surface_intersect(
match other.kind() {
// plane/plane special case intersection
SurfaceKind::Plane(other_plane) => {
// (whether each plane has a face: SmSurface::GetFace)
let owned = [this.face()?.is_some(), other.face()?.is_some()];
// (whether each plane has a face: SmSurface::GetFace, and its tolerance)
let owners = [PlaneOwner::of(this)?, PlaneOwner::of(other)?];
(need_nurb_intersection, out) = plane.intersect_with_plane_owned(
k,
uv_domain,
other_plane,
other_uv_domain,
approx_tol_3d,
owned,
owners,
)?;
}
// cone/plane special case intersection (SmCone_TYPE and SmCylinder_TYPE):
// SmCone::IntersectWithPlane, which hides the surface of revolution's; the
// orders and the UV curves are swapped
SurfaceKind::Cone(cone) => {
// the plane's boxes take its face's tolerance (taken as without owner
// there; see the module header)
if this.face()?.is_some() {
zone_tolerance(true)?;
}
let (need, mut x) =
cone.intersect_with_plane(k, other_uv_domain, plane, uv_domain, approx_tol_3d)?;
// the plane's boxes take its face's tolerance
let (need, mut x) = cone.intersect_with_plane_owned(
k,
other_uv_domain,
plane,
PlaneOwner::of(this)?,
uv_domain,
approx_tol_3d,
)?;
core::mem::swap(&mut x.surface1_uv_curves, &mut x.surface2_uv_curves);
(need_nurb_intersection, out) = (need, x);
}
@@ -1403,12 +1433,14 @@ pub(crate) fn global_surface_intersect(
// curves are swapped (the surface of revolution's edge flags and angle
// tolerance are not used by it)
SurfaceKind::SurfOfRevolution(rev) => {
// the plane's boxes take its face's tolerance (taken as without owner
// there; see the module header)
if this.face()?.is_some() {
zone_tolerance(true)?;
}
let (need, mut x) = rev.intersect_with_plane(k, plane, uv_domain, approx_tol_3d)?;
// the plane's boxes take its face's tolerance
let (need, mut x) = rev.intersect_with_plane_owned(
k,
plane,
PlaneOwner::of(this)?,
uv_domain,
approx_tol_3d,
)?;
core::mem::swap(&mut x.surface1_uv_curves, &mut x.surface2_uv_curves);
(need_nurb_intersection, out) = (need, x);
}
+5 -1
View File
@@ -952,7 +952,11 @@ impl Sphere {
// Do a little bounding box computation to see if things really intersect.
if plane.is_bounded() {
// get min distance from sphereOrigin to planeBoundingBox
let (bbox, _) = plane.bounding_boxes(k, other_uv_domain, false)?;
let (bbox, _) = plane.bounding_boxes(
k,
other_uv_domain,
crate::surface::plane::p2::PlaneOwner::NoFace,
)?;
let sph_point = Extent3d::from_points(sph_origin, sph_origin);
let dist = bbox.min_distance(&sph_point);
@@ -78,8 +78,12 @@
//! - **`IntersectWithPlane`** (its body below the plane box ported by
//! `surface.plane_p2`) takes a bare [`Plane`], which has no owner: its pseudo box is
//! expanded by `SM_ZONE_TOL_3D` (upstream: the zone tolerance of the plane's face or
//! B-rep, `SmSurface::GetFace`, `NULL` for a plane without one). It takes a
//! [`Kernel`] for the curve operations.
//! B-rep, `SmSurface::GetFace`, `NULL` for a plane without one). Through
//! `Surface::global_surface_intersect` the plane's owner is passed
//! (`intersect_with_plane_owned`): a face-owned plane expands by the face tolerance
//! its B-rep cached on the surface, and returns [`SolidError::Unported`]
//! (`SmFace::GetTolerance`) without it. It takes a [`Kernel`] for the curve
//! operations.
//! - **`sm_TestForIsoCircles`** returns its outputs in [`IsoCircles`]; the ones
//! upstream leaves unwritten (no non-degenerate iso curve, no second plane) are
//! `None`. With parallel iso planes `smgu_IntersectTwoPlanes` writes no line, so the
@@ -108,6 +112,7 @@ use crate::nurbs::b_spline_curve::{BSplineCurve, BoundingBoxRequest as CurveBoxR
use crate::nurbs::b_spline_surface::{
BSplineSurface, BSplineSurfaceForm, IsoCurveOptions, SurfParamType,
};
use crate::surface::plane::p2::PlaneOwner;
use crate::surface::plane::Plane;
use crate::surface::surface::p2::{
scale_step_angular_derivatives, SurfaceIntersection, TsectCurveType, SURF_OF_REVOLUTION_TYPE,
@@ -1430,13 +1435,37 @@ impl SurfOfRevolution {
/// Those of the angle measures, the generator transform, property analysis and
/// evaluation and of the iso curves (upstream `SER`); `SM_ERR_NULL_POINTER` without
/// generator.
#[allow(clippy::too_many_lines)] // one upstream function
pub fn intersect_with_plane(
&self,
k: &Kernel,
plane: &Plane,
other_uv_domain: &Extent2d,
approx_tol_3d: Option<f64>,
) -> Result<(bool, SurfaceIntersection)> {
self.intersect_with_plane_owned(
k,
plane,
PlaneOwner::NoFace,
other_uv_domain,
approx_tol_3d,
)
}
/// [`SurfOfRevolution::intersect_with_plane`] with the plane's owner: its box is
/// expanded by the tolerance of the plane's face (`GetFace()->GetTolerance()`).
///
/// # Errors
///
/// Those of [`SurfOfRevolution::intersect_with_plane`]; [`SolidError::Unported`]
/// (`SmFace::GetTolerance`) for a plane with a face whose tolerance is not cached.
#[allow(clippy::too_many_lines)] // one upstream function
pub(crate) fn intersect_with_plane_owned(
&self,
k: &Kernel,
plane: &Plane,
plane_owner: PlaneOwner,
other_uv_domain: &Extent2d,
approx_tol_3d: Option<f64>,
) -> Result<(bool, SurfaceIntersection)> {
let mut out = SurfaceIntersection::default();
@@ -1460,9 +1489,10 @@ impl SurfOfRevolution {
}
// get plane bounding box increased by tolerance (status ignored)
let mut plane_pbox = ignored(plane.bounding_boxes(k, &plane.natural_uv_domain(), false))?
.map(|(_, p)| p)
.unwrap_or_default();
let mut plane_pbox =
ignored(plane.bounding_boxes(k, &plane.natural_uv_domain(), plane_owner))?
.map(|(_, p)| p)
.unwrap_or_default();
plane_pbox.expand_absolute(tol);
let mut types: Vec<TsectCurveType> = Vec::new();
+32 -24
View File
@@ -91,8 +91,10 @@
//! `Unitize` returns `TRUE`.
//! - **Unported callees.** `ApproximateSize` of kinds other than B-splines needs
//! `SmIsoCurve` over any surface (the ported iso curve holds a B-spline), the zone
//! tolerance of a surface with a face needs `SmFace::GetTolerance`
//! (`topology.face_p2`): those calls return [`SolidError::Unported`]. Every tree build
//! tolerance of a surface with a face is the one its B-rep cached on it
//! ([`Surface::owner_zone_tol_3d`]) and needs `SmFace::GetTolerance`
//! (`topology.face_p2`) for a bare face handle without it: those calls return
//! [`SolidError::Unported`]. Every tree build
//! needs `SmSurface::CalculateContinuities` (`surface.surface_p6`), whose iso curves
//! exist for the B-spline, plane and revolution kinds.
//! [`map_to_2d_on_curve`] ports the UV-curve and the general 3D branch of
@@ -608,19 +610,17 @@ impl StepSurface {
// ---- tolerances of surfaces (SmTol co-ports) ----------------------------------------------
/// `SmTol::GetZoneTol3d(const SmObject*)` of a surface: its face's tolerance when it
/// has a face, else the system zone tolerance.
/// has a face (the tolerance the B-rep cached on the surface,
/// [`Surface::owner_zone_tol_3d`]), else the system zone tolerance.
///
/// # Errors
///
/// Those of [`Surface::face`]; [`SolidError::Unported`]: `SmFace::GetTolerance`
/// (`topology.face_p2`) for a surface with a face.
/// Those of [`Surface::face_zone_tol_3d`]: [`SolidError::Unported`]
/// (`SmFace::GetTolerance`, `topology.face_p2`) for a surface with a face whose
/// tolerance was not cached on it.
pub fn zone_tol_3d(k: &Kernel, surface: &Surface) -> Result<f64> {
match surface.face()? {
// UNPORTED(topology.face_p2): SmFace::GetTolerance
Some(_) => Err(SolidError::unported(
"SmFace::GetTolerance",
"topology.face_p2",
)),
match surface.face_zone_tol_3d()? {
Some(tol) => Ok(tol),
None => Ok(kernel_zone_tol_3d(k, SmallTopoType::NormalSize)),
}
}
@@ -1048,12 +1048,19 @@ impl Surface {
}
}
/// Sets the owner and returns the previous one (`SetOwner`).
/// Sets the owner and returns the previous one (`SetOwner`). A different owner
/// drops the cached face tolerance ([`Surface::owner_zone_tol_3d`]): the B-rep
/// records the new face's ([`Surface::set_owner_zone_tol_3d`]).
pub fn set_owner(&mut self, new_owner: Option<ObjectRef>) -> Option<ObjectRef> {
// (notify when pNewOwner is NULL or a Face: the object layer's notify)
let old = core::mem::replace(self.owner_mut(), new_owner);
// the bases this surface owns reach the face through it
self.update_owned_bases();
if old == new_owner {
// the bases this surface owns reach the face through it
self.update_owned_bases();
} else {
// (also passes the face down to the bases this surface owns)
self.set_owner_zone_tol_3d(None);
}
old
}
@@ -1541,7 +1548,8 @@ impl Surface {
///
/// Those of the surface cache and of the polar box; [`SolidError::Unported`]:
/// `SmFace::GetTolerance` (`topology.face_p2`) when a B-spline or plane with a
/// face expands its boxes.
/// face expands its boxes and the face's tolerance is not cached on the surface
/// ([`Surface::owner_zone_tol_3d`]).
pub fn calculate_bounding_box(
&self,
k: &Kernel,
@@ -1556,15 +1564,14 @@ impl Surface {
| SurfaceKind::Plane(_)
| SurfaceKind::SurfOfRevolution(_) => {
// the B-spline override expands by its face's tolerance (GetFace()):
// the owner is held here, not by the B-spline
if expand_pos_boxes_by_zone_tol_3d && (want[0] || want[1]) && self.face()?.is_some()
{
// UNPORTED(topology.face_p2): SmFace::GetTolerance
return Err(SolidError::unported(
"SmFace::GetTolerance",
"topology.face_p2",
));
}
// the owner is held here, not by the B-spline, so the face's cached
// tolerance is passed down (the GetBrep() arm is reached only without
// a face, where a surface's GetBrep is null: SM_ZONE_TOL_3D)
let expand_tolerance = if expand_pos_boxes_by_zone_tol_3d && (want[0] || want[1]) {
self.face_zone_tol_3d()?
} else {
None
};
let req = crate::nurbs::b_spline_surface::BoundingBoxRequest {
normal: want[0],
pseudo: want[1],
@@ -1572,6 +1579,7 @@ impl Surface {
pseudo_guess: None,
polar_guess: None,
expand_by_zone_tol: expand_pos_boxes_by_zone_tol_3d,
expand_tolerance,
};
let r = match self.kind() {
SurfaceKind::BSpline(s) => s.calculate_bounding_box(k, uv_domain, &req)?,
+251 -1
View File
@@ -63,6 +63,12 @@
//! | [`IsoCurveLengthIntegrand`] | `SmIsoCurveLengthIFEO` (constructor) |
//!
//! Deviations:
//! - **Owner tolerance.** A surface holds only an owner handle, never its B-rep, so the
//! face tolerance upstream reads through `GetFace()->GetTolerance()` is cached on the
//! surface by the B-rep ([`Surface::owner_zone_tol_3d`], kept in step where a face
//! record's surface or tolerance changes) together with the face it belongs to; an
//! owner change drops it, the copy constructor resets it and a bare face handle
//! without it returns [`SolidError::Unported`] (`SmFace::GetTolerance`).
//! - Evaluation dispatch and copies check all owned surface, curve and volume branches against a
//! 64-level depth bound before invoking recursive copies. The surface evaluator
//! also bounds its wrapper traversal to 64 levels and retains B-spline output
@@ -292,6 +298,12 @@ pub struct Surface {
/// surface's own owner chain. The owning surface holds this surface by value, so it
/// cannot walk up; the owner keeps this in step ([`Surface::set_owner`]).
owner_chain_face: Option<ObjectRef>,
/// The stored zone tolerance (`SmFace::m_sZoneTol3d`, [`crate::topology::Face`]'s
/// `tolerance`) of the face this surface reaches ([`Surface::reached_face`]), with
/// that face: the B-rep keeps it in step when it attaches a surface to a face or sets
/// a face tolerance. Valid only while the recorded face is still the one reached, so
/// an owner change can never leave another face's tolerance behind.
owner_zone_tol_3d: Option<(ObjectRef, f64)>,
}
/// The copy constructor: copies the geometry, resets the owner (an owning offset in it
@@ -302,6 +314,7 @@ impl Clone for Surface {
kind: self.kind.clone(),
owner: None,
owner_chain_face: None,
owner_zone_tol_3d: None,
};
s.update_owned_bases();
s
@@ -433,6 +446,7 @@ impl Surface {
kind,
owner: self.owner,
owner_chain_face: self.owner_chain_face,
owner_zone_tol_3d: self.owner_zone_tol_3d,
})
}
}
@@ -545,6 +559,7 @@ impl Surface {
kind,
owner: None,
owner_chain_face: None,
owner_zone_tol_3d: None,
}
}
@@ -588,6 +603,8 @@ impl Surface {
pub(crate) fn set_surface_owner(&mut self, owner: ObjectRef, chain_face: Option<ObjectRef>) {
self.owner = Some(owner);
self.owner_chain_face = chain_face;
// a new owner chain: the cached face tolerance belonged to the old one
self.owner_zone_tol_3d = None;
self.update_owned_bases();
}
@@ -597,6 +614,7 @@ impl Surface {
pub(crate) fn restore_owner_state(&mut self, from: &Self) {
self.owner = from.owner;
self.owner_chain_face = from.owner_chain_face;
self.owner_zone_tol_3d = from.owner_zone_tol_3d;
self.update_owned_bases();
}
@@ -614,6 +632,8 @@ impl Surface {
/// `MAX_SURFACE_NESTING` at construction but is walked without recursion.
pub(crate) fn update_owned_bases(&mut self) {
let face = self.reached_face();
// the bases reach the same face, so they carry its cached tolerance too
let tol = face.zip(self.owner_zone_tol_3d());
let mut cur = self;
while let SurfaceKind::OffsetSurface(off) = &mut cur.kind {
let Some(base) = off.owned_base_mut() else {
@@ -621,10 +641,56 @@ impl Surface {
};
base.owner = Some(crate::surface::offset_surface::BASE_OWNER);
base.owner_chain_face = face;
base.owner_zone_tol_3d = tol;
cur = base;
}
}
/// The zone tolerance of the owning face (`GetFace()->GetTolerance()`,
/// `SmFace::m_sZoneTol3d`), when the B-rep has recorded it on this surface
/// ([`Surface::set_owner_zone_tol_3d`]); `None` for a surface without face, or for a
/// bare owner handle whose B-rep never recorded the face's tolerance.
#[must_use]
pub fn owner_zone_tol_3d(&self) -> Option<f64> {
match (self.reached_face(), self.owner_zone_tol_3d) {
(Some(face), Some((cached, tol))) if face == cached => Some(tol),
_ => None,
}
}
/// Records the zone tolerance of the face this surface reaches (`None` clears it),
/// and passes it down the bases this surface owns. Called by the B-rep wherever a
/// face record's surface or tolerance changes; a surface reaching no face records
/// nothing.
pub fn set_owner_zone_tol_3d(&mut self, tol: Option<f64>) {
self.owner_zone_tol_3d = tol.and_then(|t| self.reached_face().map(|f| (f, t)));
self.update_owned_bases();
}
/// `GetFace() ? GetFace()->GetTolerance() : none`: `Ok(None)` for a surface without
/// face, the cached face tolerance ([`Surface::owner_zone_tol_3d`]) for one with a
/// face.
///
/// # Errors
///
/// Those of [`Surface::face`]; [`SolidError::Unported`] (`SmFace::GetTolerance`,
/// `topology.face_p2`) for a surface with a face whose B-rep has not recorded the
/// face's tolerance on it (a bare owner handle: the surface cannot reach the B-rep).
pub fn face_zone_tol_3d(&self) -> Result<Option<f64>> {
if self.face()?.is_none() {
return Ok(None);
}
match self.owner_zone_tol_3d() {
Some(tol) => Ok(Some(tol)),
// UNPORTED(topology.face_p2): SmFace::GetTolerance (a bare face handle
// without the tolerance its B-rep records here)
None => Err(SolidError::unported(
"SmFace::GetTolerance",
"topology.face_p2",
)),
}
}
/// `GetFace()`'s result: the owner when it is a face, the face reached through a
/// surface owner, else none.
pub(crate) fn reached_face(&self) -> Option<ObjectRef> {
@@ -1184,7 +1250,10 @@ impl Surface {
plane,
other_uv_domain,
approx_tol_3d,
[self.face()?.is_some(), false],
[
crate::surface::plane::p2::PlaneOwner::of(self)?,
crate::surface::plane::p2::PlaneOwner::NoFace,
],
),
SurfaceKind::Cone(s) => {
s.intersect_with_plane(k, uv_domain, plane, other_uv_domain, approx_tol_3d)
@@ -5258,6 +5327,187 @@ mod curve_on_classify_tests {
}
}
#[cfg(test)]
mod owner_zone_tol_tests {
use super::*;
use crate::geom::assert_array::labels::FACE_TYPE;
use crate::geom::attribute::ObjectKey;
use crate::surface::offset_surface::OffsetSurface;
use crate::topology::{Brep, Face, FaceId};
fn face_ref(key: u64) -> ObjectRef {
ObjectRef {
type_code: FACE_TYPE,
key: ObjectKey(key),
}
}
fn plane() -> Surface {
Surface::from(Plane::from_normal(Point3::ZERO, Vec3::Z))
}
/// A B-rep with one face of tolerance `tol` holding `surface`.
fn brep_with(surface: Surface, tol: f64) -> (Brep, FaceId) {
let mut b = Brep::new();
let shell = b.add_shell().unwrap();
let f = b
.add_face_record(Face {
surface: Some(surface),
tolerance: tol,
..Face::new(shell)
})
.unwrap();
(b, f)
}
fn surface_of(b: &Brep, f: FaceId) -> &Surface {
b.face(f).unwrap().surface.as_ref().unwrap()
}
#[test]
fn add_face_record_caches_the_face_tolerance() {
let mut s = plane();
s.set_owner(Some(face_ref(1)));
assert!(s.owner_zone_tol_3d().is_none());
assert!(s.face_zone_tol_3d().unwrap_err().is_unported());
let (b, f) = brep_with(s, 0.25);
let s = surface_of(&b, f);
assert_eq!(s.owner_zone_tol_3d(), Some(0.25));
assert_eq!(s.face_zone_tol_3d().unwrap(), Some(0.25));
let k = Kernel::default();
assert_eq!(
crate::surface::surface::p1::zone_tol_3d(&k, s).unwrap(),
0.25
);
}
#[test]
fn unowned_surface_records_nothing() {
let (b, f) = brep_with(plane(), 0.25);
let s = surface_of(&b, f);
assert_eq!(s.owner_zone_tol_3d(), None);
assert_eq!(s.face_zone_tol_3d().unwrap(), None);
}
#[test]
fn owner_changes_drop_the_cache() {
let mut s = plane();
s.set_owner(Some(face_ref(1)));
let (mut b, f) = brep_with(s, 0.25);
let s = b.face_mut(f).unwrap().surface.as_mut().unwrap();
// the same owner keeps it
s.set_owner(Some(face_ref(1)));
assert_eq!(s.owner_zone_tol_3d(), Some(0.25));
// another face drops it
s.set_owner(Some(face_ref(2)));
assert_eq!(s.owner_zone_tol_3d(), None);
assert!(s.face_zone_tol_3d().unwrap_err().is_unported());
// and so does no owner, also when the face comes back
b.sync_face_surface_tolerance(f).unwrap();
let s = b.face_mut(f).unwrap().surface.as_mut().unwrap();
assert_eq!(s.owner_zone_tol_3d(), Some(0.25));
s.set_owner(None);
assert_eq!(s.owner_zone_tol_3d(), None);
s.set_owner(Some(face_ref(2)));
assert_eq!(s.owner_zone_tol_3d(), None);
}
#[test]
fn direct_owner_writes_cannot_leak_the_cache() {
let mut s = plane();
s.set_owner(Some(face_ref(1)));
s.set_owner_zone_tol_3d(Some(0.5));
*s.owner_mut() = Some(face_ref(2));
assert_eq!(s.owner_zone_tol_3d(), None);
*s.owner_mut() = None;
assert_eq!(s.owner_zone_tol_3d(), None);
}
#[test]
fn evaluation_copy_keeps_and_clone_resets() {
let mut s = plane();
s.set_owner(Some(face_ref(1)));
s.set_owner_zone_tol_3d(Some(0.5));
let e = s.clone_for_evaluation().unwrap();
assert_eq!(e.owner_zone_tol_3d(), Some(0.5));
let c = s.clone();
assert_eq!(c.owner(), None);
assert_eq!(c.owner_zone_tol_3d(), None);
let kept = s.clone_keeping_owner();
assert_eq!(kept.owner_zone_tol_3d(), Some(0.5));
}
#[test]
fn owned_offset_base_reaches_the_cache() {
let k = Kernel::default();
let mut off = Surface::from(OffsetSurface::new(&k, 1.0, plane(), true, 0).unwrap());
off.set_owner(Some(face_ref(1)));
let base = |s: &Surface| match s.kind() {
SurfaceKind::OffsetSurface(o) => o.base_surface().owner_zone_tol_3d(),
_ => panic!("not an offset"),
};
assert_eq!(base(&off), None);
off.set_owner_zone_tol_3d(Some(0.125));
assert_eq!(off.owner_zone_tol_3d(), Some(0.125));
assert_eq!(base(&off), Some(0.125));
off.set_owner(None);
assert_eq!(base(&off), None);
}
/// The offset paths #307 rewires through the exact snapshot helpers: an owned base
/// keeps the cached face tolerance in an evaluation copy, and a shared base (the same
/// object upstream) keeps its own face's tolerance in `OffsetSurface::copy`.
#[test]
fn offset_snapshots_keep_the_cache() {
let k = Kernel::default();
let base = |s: &Surface| match s.kind() {
SurfaceKind::OffsetSurface(o) => o.base_surface().owner_zone_tol_3d(),
_ => panic!("not an offset"),
};
let mut owned = Surface::from(OffsetSurface::new(&k, 1.0, plane(), true, 0).unwrap());
owned.set_owner(Some(face_ref(1)));
owned.set_owner_zone_tol_3d(Some(0.125));
let e = owned.clone_for_evaluation().unwrap();
assert_eq!(e.owner_zone_tol_3d(), Some(0.125));
assert_eq!(base(&e), Some(0.125));
let mut shared_base = plane();
shared_base.set_owner(Some(face_ref(2)));
shared_base.set_owner_zone_tol_3d(Some(0.75));
let shared = OffsetSurface::new(&k, 1.0, shared_base, false, 0).unwrap();
let c = shared.copy(&k).unwrap();
assert_eq!(c.base_surface().owner_zone_tol_3d(), Some(0.75));
let e = Surface::from(shared).clone_for_evaluation().unwrap();
assert_eq!(base(&e), Some(0.75));
}
#[test]
fn face_set_tolerance_updates_the_cache() {
let mut s = plane();
s.set_owner(Some(face_ref(1)));
let (mut b, f) = brep_with(s, 0.25);
crate::topology::face::p3::set_tolerance(&mut b, f, 0.5, true, false).unwrap();
assert_eq!(surface_of(&b, f).owner_zone_tol_3d(), Some(0.5));
// only if larger: unchanged
crate::topology::face::p3::set_tolerance(&mut b, f, 0.1, true, false).unwrap();
assert_eq!(surface_of(&b, f).owner_zone_tol_3d(), Some(0.5));
crate::topology::face::p3::set_tolerance(&mut b, f, 0.1, false, false).unwrap();
assert_eq!(surface_of(&b, f).owner_zone_tol_3d(), Some(0.1));
}
#[test]
fn rescue_surface_owner_restores_the_cache() {
let mut s = plane();
s.set_owner(Some(face_ref(1)));
s.set_owner_zone_tol_3d(Some(0.5));
let rescue = crate::topology::face::p2::RescueSurfaceOwner::new(&s);
s.set_owner(None);
assert_eq!(s.owner_zone_tol_3d(), None);
rescue.restore(&mut s);
assert_eq!(s.owner_zone_tol_3d(), Some(0.5));
}
}
#[cfg(test)]
mod kernel_dispatch_tests {
use super::*;
+14 -13
View File
@@ -34,10 +34,11 @@
//! outputs keep their previous values (initially undefined); the port does the same
//! and still propagates [`SolidError::Unported`].
//! - **Tolerance of a surface.** `SmTol::GetApproxTol3d(this)` is the system value for a
//! surface without an owner; for an owned surface it needs the face tolerance
//! (`topology.face_p2`) and returns [`SolidError::Unported`], unless the caller that
//! has the face passes it ([`Surface::get_singularities_of_face`], used by the face
//! props).
//! surface without an owner; for an owned surface it is half the face tolerance the
//! caller that has the face passes ([`Surface::get_singularities_of_face`], used by
//! the face props), else the one the B-rep cached on the surface
//! ([`Surface::owner_zone_tol_3d`]); a bare face handle without it returns
//! [`SolidError::Unported`] (`topology.face_p2`).
//! - **Unported callees** (return [`SolidError::Unported`]): `SmFace::RemoveUVTrimCurves`
//! (`topology.face_p1`) when the surface is owned by a face.
@@ -99,7 +100,9 @@ const fn side(from_left: bool) -> Side {
/// A [`Surface`] holds only an owner handle, not the B-rep, so the face's tolerance
/// (`SmFace::GetTolerance`, `topology.face_p2`) is passed by a caller that has the face:
/// `face_tolerance` is `Some` for a surface known to be that face's own surface, and the
/// zone tolerance of the face is then used whether or not the handle is set.
/// zone tolerance of the face is then used whether or not the handle is set. Otherwise
/// a surface with a face uses the tolerance its B-rep cached on it
/// ([`Surface::owner_zone_tol_3d`]).
fn surface_approx_tol_3d(
k: &Kernel,
surface: &Surface,
@@ -111,14 +114,12 @@ fn surface_approx_tol_3d(
}
// SmTol::GetApproxTol3d(this) = .5 * GetZoneTol3d(this): GetFace() ? its tolerance
// : the system's (a surface owned by an offset with no face uses the latter)
if surface.face()?.is_some() {
// UNPORTED(topology.face_p2): SmFace::GetTolerance of the owner, for the callers
// that cannot pass it (a surface does not reach its B-rep; justified: plan/findings.md,
// heal.face_props, "Why UNPORTED(topology.face_p2) stays"); the face props pass it through `get_singularities_of_face`
return Err(SolidError::unported(
"SmFace::GetTolerance",
"topology.face_p2",
));
// the face's tolerance cached on the surface by its B-rep; a bare face handle
// without it stays UNPORTED(topology.face_p2): SmFace::GetTolerance
// (`Surface::face_zone_tol_3d`); the face props pass it through
// `get_singularities_of_face`
if let Some(zone) = surface.face_zone_tol_3d()? {
return Ok(approx_tol3d(k, 0.5 * zone));
}
Ok(approx_tol_3d(k, SmallTopoType::NormalSize))
}
+8 -7
View File
@@ -61,7 +61,8 @@
//! - **Kernel.** `is_on_seam` and `global_point_solve` (and `global_point_solve_starts`)
//! take the [`Kernel`] that the tolerance, drop and cache callees now need.
//! - **Unported callees** (return [`SolidError::Unported`]): the zone tolerance of a face's
//! surface (`SmFace::GetTolerance`, `topology.face_p2`), `GlobalPointSolve_1`
//! surface whose B-rep has not cached it on the surface ([`Surface::owner_zone_tol_3d`];
//! `SmFace::GetTolerance`, `topology.face_p2`), `GlobalPointSolve_1`
//! (`surface.surface_point_solve_p3`), the trim containment of a face's surface
//! (`SmFace::PointClassify`, `query.face_p2`) and the edge and face tolerances of owned
//! curves and surfaces (`topology.edge`, `topology.face_p2`).
@@ -1741,12 +1742,12 @@ pub fn classify_curve_surface_xsect_point(
curve_tol = curve_radius / 1000.0;
}
if surface.owner().is_some_and(|o| o.type_code == FACE_TYPE) {
// UNPORTED(topology.face_p2): SmFace::GetTolerance
let _ = surface_tol;
return Err(SolidError::unported(
"SmFace::GetTolerance",
"topology.face_p2",
));
// pSurfaceOwner->GetTolerance(): the direct owner is the face, so the face the
// surface reaches; its tolerance as cached by the B-rep
surface_tol = surface.owner_zone_tol_3d().ok_or(
// UNPORTED(topology.face_p2): SmFace::GetTolerance (a bare face handle)
SolidError::unported("SmFace::GetTolerance", "topology.face_p2"),
)?;
} else if !surface_line {
surface_tol = surface_radius / 1000.0;
}
+12 -23
View File
@@ -51,7 +51,8 @@
//! `CoverCoincidentSurface` leaves `rdMaxDist` at `SM_BIG_DOUBLE` (its first
//! statement).
//! - **Unported callees** (return [`SolidError::Unported`]): `SmSurface::GetFace`,
//! `SmFace::GetTolerance`, `LocalPointSolve_1`, `sm_GetSurfaceToEvaluate`, the STEP
//! `SmFace::GetTolerance` (for a surface whose B-rep has not cached its face's
//! tolerance on it, [`Surface::owner_zone_tol_3d`]), `LocalPointSolve_1`, `sm_GetSurfaceToEvaluate`, the STEP
//! domain conversions and the surface cache.
use crate::curve::curve::p1::ApproximateCurveOptions;
@@ -1000,7 +1001,8 @@ impl Surface {
/// # Errors
///
/// Those of the global solve; [`SolidError::Unported`]: `GetFace` and
/// `SmFace::GetTolerance` for an owned surface, `LocalPointSolve_1`.
/// `SmFace::GetTolerance` for an owned surface without the face tolerance cached
/// ([`Surface::owner_zone_tol_3d`]), `LocalPointSolve_1`.
#[allow(clippy::too_many_lines)] // one upstream routine
pub fn drop_point<O: SolutionObject>(
&self,
@@ -1024,15 +1026,9 @@ impl Surface {
let mut answer_in_array = false;
// We need a tolerance value.
let dist_tol = if self.face()?.is_some() {
// UNPORTED(topology.face_p2): SmFace::GetTolerance
return Err(SolidError::unported(
"SmFace::GetTolerance",
"topology.face_p2",
));
} else {
XSECT_TOL_3D
};
// pFace ? pFace->GetTolerance() : SM_XSECT_TOL_3D (the face's tolerance cached
// on the surface; UNPORTED(topology.face_p2) for a bare face handle)
let dist_tol = self.face_zone_tol_3d()?.unwrap_or(XSECT_TOL_3D);
// first try DropPointFast(), to catch special cases.
if let Some(fast) = ignored(self.drop_point_fast::<O>(
@@ -1250,7 +1246,8 @@ impl Surface {
/// # Errors
///
/// [`SolidError::Unported`]: `GetFace`/`SmFace::GetTolerance` for an owned surface
/// and the surface caches (`smsurf_GetSurfaceCache`). The status of the UV-guess
/// without the face tolerance cached ([`Surface::owner_zone_tol_3d`]) and the
/// surface caches (`smsurf_GetSurfaceCache`). The status of the UV-guess
/// `LocalSurfaceSurfaceIntersect` is ignored, as upstream (no answer).
#[allow(clippy::too_many_arguments)] // upstream's argument list
pub fn local_surface_surface_intersect_xyz<O: SolutionObject>(
@@ -1265,17 +1262,9 @@ impl Surface {
opt_xyz_guess2: Option<Point3>,
) -> Result<(bool, Solution<O>)> {
// GWC:TODO - upstream's magic numbers for the tolerance
let face_tol = |s: &Self| -> Result<f64> {
if s.face()?.is_some() {
// UNPORTED(topology.face_p2): SmFace::GetTolerance
Err(SolidError::unported(
"SmFace::GetTolerance",
"topology.face_p2",
))
} else {
Ok(1e-05)
}
};
// GetFace() ? its tolerance (cached on the surface; UNPORTED(topology.face_p2)
// for a bare face handle) : 1e-05
let face_tol = |s: &Self| -> Result<f64> { Ok(s.face_zone_tol_3d()?.unwrap_or(1e-05)) };
let tol1 = face_tol(self)?;
let tol2 = face_tol(surface2)?;
let tol3 = face_tol(surface3)?;
+29 -15
View File
@@ -37,6 +37,10 @@
//! | [`good_drop_result`] | `sm_GoodDropResult` (static) |
//!
//! Deviations:
//! - **Face tolerance of `IsPlanar`.** The B-spline, revolution and cone boxes are
//! expanded by the face tolerance the B-rep cached on the surface
//! ([`Surface::owner_zone_tol_3d`]). A face-owned surface without it returns
//! [`SolidError::Unported`] (`SmFace::GetTolerance`).
//! - **Generic bodies.** The `SmSurface` bodies that only call the evaluation virtuals
//! (`Evaluate`, `EvaluatePoint`, `GetNaturalUVDomain`) are generic over
//! [`SurfaceEvaluate`], so a caller holding a bare [`BSplineSurface`] (which does not
@@ -839,22 +843,25 @@ impl Surface {
})
}
SurfaceKind::BSpline(s) => {
// the box expansion uses the owning face's tolerance
if self.face()?.is_some() {
// UNPORTED(topology.face_p2): SmFace::GetTolerance
return Err(SolidError::unported(
"SmFace::GetTolerance",
"topology.face_p2",
));
}
Ok(planar_of(k, s, &self.natural_uv_domain())?.is_planar(tol_3d))
// the box expansion uses the owning face's tolerance, as cached on the
// surface by its B-rep (UNPORTED(topology.face_p2): SmFace::GetTolerance
// for a bare face handle without it)
let face_tol = self.face_zone_tol_3d()?;
Ok(planar_of(k, s, &self.natural_uv_domain(), face_tol)?.is_planar(tol_3d))
}
// SmSurfOfRevolution inherits SmBSplineSurface::CalculateBoundingBox
// SmSurfOfRevolution (and SmCone) inherit SmBSplineSurface::CalculateBoundingBox:
// the face's cached tolerance, as for the B-spline (UNPORTED(topology.face_p2):
// SmFace::GetTolerance for a bare face handle without it)
SurfaceKind::Cone(s) => {
Ok(planar_of(k, s.rev().base(), &self.natural_uv_domain())?.is_planar(tol_3d))
let face_tol = self.face_zone_tol_3d()?;
Ok(
planar_of(k, s.rev().base(), &self.natural_uv_domain(), face_tol)?
.is_planar(tol_3d),
)
}
SurfaceKind::SurfOfRevolution(s) => {
Ok(planar_of(k, s.base(), &self.natural_uv_domain())?.is_planar(tol_3d))
let face_tol = self.face_zone_tol_3d()?;
Ok(planar_of(k, s.base(), &self.natural_uv_domain(), face_tol)?.is_planar(tol_3d))
}
// SmSurface body: use the virtual box and ignore ordinary failures,
// which leave the default pseudo box. The kernel is available here.
@@ -1525,12 +1532,18 @@ impl Surface {
///
/// [`SolidError::Unported`] from the bounding box.
pub fn b_spline_is_planar(k: &Kernel, s: &BSplineSurface, tol_3d: f64) -> Result<Planar> {
Ok(planar_of(k, s, &s.natural_uv_domain())?.is_planar(tol_3d))
Ok(planar_of(k, s, &s.natural_uv_domain(), None)?.is_planar(tol_3d))
}
/// The pseudo box of a B-spline surface over `uv_domain`; a failed box is the default
/// The pseudo box of a B-spline surface over `uv_domain`, expanded by `face_tol` (the
/// owning face's tolerance; `None` for `SM_ZONE_TOL_3D`); a failed box is the default
/// box, as upstream ignores the status.
fn planar_of(k: &Kernel, s: &BSplineSurface, uv_domain: &Extent2d) -> Result<PseudoBox> {
fn planar_of(
k: &Kernel,
s: &BSplineSurface,
uv_domain: &Extent2d,
face_tol: Option<f64>,
) -> Result<PseudoBox> {
let req = BoundingBoxRequest {
normal: false,
pseudo: true,
@@ -1538,6 +1551,7 @@ fn planar_of(k: &Kernel, s: &BSplineSurface, uv_domain: &Extent2d) -> Result<Pse
pseudo_guess: None,
polar_guess: None,
expand_by_zone_tol: true,
expand_tolerance: face_tol,
};
Ok(ignored(s.calculate_bounding_box(k, uv_domain, &req))?
.and_then(|b| b.pseudo)
@@ -2190,6 +2190,7 @@ impl<O: Copy + PartialEq> SurfaceCache<O> {
pseudo_guess: None,
polar_guess: guess,
expand_by_zone_tol: true,
expand_tolerance: None,
};
let boxes = ignored(calculate_bounding_box(k, surface, &domain, &req))?;
Ok(boxes.and_then(|b| b.polar))
@@ -54,7 +54,6 @@ use crate::error::{Result, SolidError};
use crate::geom::extent2d::Extent2d;
use crate::geom::extent3d::Extent3d;
use crate::geom::pseudo_box::PseudoBox;
use crate::geom::tol::{zone_tol_3d, SmallTopoType};
use crate::geom::tree::{
AuxDataType, NodeClass, NodeData, NodeGeomType, NodeId, SplitDir, SurfaceAux, TreeNode,
};
@@ -433,7 +432,8 @@ impl<O: Copy + PartialEq> SurfaceCache<O> {
/// those of `CalculateBoundingBox`, `sm_ComputeNetConstants`,
/// `sm_ComputeSurfConstants`, `GetCorners` and `ComputeSizeTolerances`;
/// `InvalidInput` where upstream reads through null or mistyped data;
/// [`SolidError::Unported`] from `SmTol::GetZoneTol3d` of an owned surface and the
/// [`SolidError::Unported`] from `SmTol::GetZoneTol3d` of a face-owned surface whose
/// face tolerance is not cached on it ([`Surface::owner_zone_tol_3d`]) and from the
/// surface calls.
#[allow(clippy::too_many_lines)] // one upstream routine
pub fn test_against_tolerances(&mut self, k: &Kernel, node: NodeId) -> Result<ToleranceTest> {
@@ -469,18 +469,9 @@ impl<O: Copy + PartialEq> SurfaceCache<O> {
let chord_height_squared = chord_tol * chord_tol;
let ang_tol_deg = opts.ang_tol_rad * 180.0 / PI;
// SmTol::GetZoneTol3d(m_cpSurface): GetFace() ? its tolerance : the system's
let zone_tol = if self.surface().face()?.is_some() {
// UNPORTED(geom.tol): SmTol::GetZoneTol3d(const SmObject*) on an opaque handle. Every
// arm it dispatches to is ported (topology::{vertex, edge, face::p2, edgeuse::p1}::tolerance,
// Brep::tolerance) but each takes `&Brep` and none is in scope here; wire once this code
// receives the owning B-rep
return Err(SolidError::unported(
"SmTol::GetZoneTol3d(const SmObject*)",
"geom.tol",
));
} else {
zone_tol_3d(k, SmallTopoType::NormalSize)
};
// (the face's tolerance as its B-rep cached it on the surface;
// UNPORTED(topology.face_p2): SmFace::GetTolerance for a bare face handle)
let zone_tol = crate::surface::surface::p1::zone_tol_3d(k, self.surface())?;
// local tolerance state - a zero ChordHeight or Angle Tol value means to ignore the test
{
@@ -524,6 +515,7 @@ impl<O: Copy + PartialEq> SurfaceCache<O> {
pseudo_guess: None,
polar_guess: None,
expand_by_zone_tol: true,
expand_tolerance: None,
};
let boxes = calculate_bounding_box(k, node_surface, &node_domain, &req)?;
let bbox = boxes
@@ -955,6 +947,7 @@ impl<O: Copy + PartialEq> SurfaceCache<O> {
pseudo_guess: None,
polar_guess: None,
expand_by_zone_tol: true,
expand_tolerance: None,
};
if let Some(boxes) = ignore(patch.calculate_bounding_box(k, &patch_domain, &req))? {
if let Some(b) = boxes.normal {
@@ -169,6 +169,7 @@ fn patch_boxes(
pseudo_guess,
polar_guess: None,
expand_by_zone_tol: false,
expand_tolerance: None,
};
let boxes = bss.calculate_bounding_box(k, &bss.natural_uv_domain(), &req)?;
let mut bbox = boxes.normal.ok_or_else(|| invalid(op, "no bounding box"))?;
+21 -1
View File
@@ -937,13 +937,33 @@ impl Brep {
}
/// Appends a face record as is (no validation; the shell's face list is not
/// touched); the face joins the end of the B-rep's face list.
/// touched); the face joins the end of the B-rep's face list, and its surface
/// records the face's tolerance ([`Brep::sync_face_surface_tolerance`]).
pub fn add_face_record(&mut self, face: Face) -> Result<FaceId> {
let id = self.faces.insert(face)?;
self.face_list.push(id);
self.sync_face_surface_tolerance(id)?;
Ok(id)
}
/// Records the face's tolerance on its surface
/// ([`Surface::set_owner_zone_tol_3d`](crate::surface::surface::Surface::set_owner_zone_tol_3d)),
/// so the surface's `GetFace()->GetTolerance()` reads it: the B-rep invariant that a
/// face record's surface carries that record's `tolerance`. A surface reaching no
/// face records nothing. Called wherever a face's surface or tolerance changes.
///
/// # Errors
///
/// [`SolidError::NotFound`] for a dangling id.
pub fn sync_face_surface_tolerance(&mut self, f: FaceId) -> Result<()> {
let face = self.face_mut(f)?;
let tol = face.tolerance;
if let Some(surface) = face.surface.as_mut() {
surface.set_owner_zone_tol_3d(Some(tol));
}
Ok(())
}
/// Appends a loop record as is (no validation; the face's loop list is not
/// touched).
pub fn add_loop_record(&mut self, loop_: Loop) -> Result<LoopId> {
@@ -734,6 +734,9 @@ fn build_faces(
// Connect up face and faceuses and set FU fields
rec.faceuse = Some(fu1); // FU1 is primary faceuse
// the surface reads the face's tolerance through GetFace()
b.sync_face_surface_tolerance(f)?;
*b.faceuse_mut(fu1)? = Faceuse {
face: Some(f),
mate: Some(fu2),
+2 -1
View File
@@ -261,7 +261,8 @@ fn set_surface_owner(
if let Some(surface) = brep.face_mut(face)?.surface.as_mut() {
surface.set_owner(owner);
}
Ok(())
// the surface reads the face's tolerance through GetFace() once it is owned again
brep.sync_face_surface_tolerance(face)
}
// `delete pShell` of an emptied shell: `~SmShell` notifies `SM_NO_DESTRUCTION`
+1
View File
@@ -695,6 +695,7 @@ fn make_face_with_state(
// make the face->surface connections
surface.set_owner(Some(this_face(new_face)));
b.face_mut(new_face)?.surface = Some(surface);
b.sync_face_surface_tolerance(new_face)?;
Ok(NewFace {
region: new_region,
+5
View File
@@ -915,6 +915,8 @@ pub fn set_surface(
face.uv_domain = surface.natural_uv_domain();
surface.set_owner(Some(this));
face.surface = Some(surface);
// the surface reads the face's tolerance through GetFace()
b.sync_face_surface_tolerance(f)?;
Ok(old)
}
@@ -1393,6 +1395,9 @@ pub fn move_seam<O: LoopObject>(
let zone_tol = crate::surface::surface::p1::zone_tol_3d(k, surface0)?;
let mut surface = surface0.clone();
*surface.owner_mut() = surface0.owner();
// the copy reaches the same face, so it carries the face tolerance cached on the
// original (a B-spline kind: no owned bases)
surface.set_owner_zone_tol_3d(surface0.owner_zone_tol_3d());
let crosses_u = match props {
Some(p) => names(p.bad_crossed_seam_dir, Sp::U),
+10 -2
View File
@@ -2491,17 +2491,22 @@ pub fn find_best_uv_curve(
/// Saves a surface's owner and puts it back (`SmRescueSurfaceOwner`: the constructor
/// saves, the destructor restores).
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct RescueSurfaceOwner {
owner: Option<ObjectRef>,
/// The face tolerance cached on the surface ([`Surface::owner_zone_tol_3d`]), put
/// back with the owner (a caller that may change the face's tolerance meanwhile
/// re-syncs it from the B-rep).
zone_tol_3d: Option<f64>,
}
impl RescueSurfaceOwner {
/// Saves `surface`'s owner.
#[must_use]
pub const fn new(surface: &Surface) -> Self {
pub fn new(surface: &Surface) -> Self {
Self {
owner: surface.owner(),
zone_tol_3d: surface.owner_zone_tol_3d(),
}
}
@@ -2514,6 +2519,9 @@ impl RescueSurfaceOwner {
/// Restores the saved owner on `surface` (the destructor).
pub fn restore(self, surface: &mut Surface) {
surface.set_owner(self.owner);
if self.zone_tol_3d.is_some() {
surface.set_owner_zone_tol_3d(self.zone_tol_3d);
}
}
}
+4
View File
@@ -339,6 +339,8 @@ pub fn set_tolerance(
if !update_only_if_larger || new_zone_tol_3d > face.tolerance {
face.tolerance = new_zone_tol_3d;
}
// the face's surface reads it through GetFace()
b.sync_face_surface_tolerance(f)?;
// when asked - make sure Edge->VertexTols at least as big as thie EdgeTol
if cascade_to_boundaries {
@@ -791,6 +793,8 @@ pub fn create_uv_trim_curves(
if let Some(s) = b.face_mut(f)?.surface.as_mut() {
rescue.restore(s);
}
// the face's tolerance may have changed while the surface had no owner
b.sync_face_surface_tolerance(f)?;
result
}
+37 -32
View File
@@ -845,6 +845,20 @@ bool tt_ok_loop_extremes(SmLoop* l)
return true;
}
// Whether the loop walks of FixTrimLoopOrientation / FixTrimLoopOrder dereference
// nothing null: every loop has its loop use, and a face with loops has a surface and UV
// trim curves on every edge use (SmFace::ComputeLoopOrientation and the UV boxes of
// FixTrimLoopOrder read them).
bool tt_ok_face_loops(SmFace* f)
{
SmTArray<SmLoop*> ls;
f->GetLoops(ls);
for (ULONG i = 0; i < ls.GetSize(); i++)
if (!tt_ok_loop(ls[i]))
return false;
return ls.GetSize() == 0 || (f->GetSurface() != nullptr && SmTrimmingTools::AreUVCurvesPresent(f));
}
// The pre-step of the repair and check ops: `k side` (k = -1: none) mirrors the UV trim
// curve of the k-th edge use (modulo their count) of `l`'s first loop use across its face
// surface's natural domain with SmTrimmingTools::MirrorCurve (only a plain B-spline curve;
@@ -999,30 +1013,25 @@ void tt_brep_op(int32_t op, Rd& rd, const char* path, std::vector<double>& o)
o.push_back(TT_NULL_DEREF);
break;
}
// with UV curves on every loop, the Rust side reaches ComputeLoopOrientation
// (unported) unless CheckLoop fails first: run only CheckLoop's part then
// With UV curves on every loop CheckFace reaches CheckLoop of every loop (which
// reads each loop's UV extremes) and SmFace::ComputeLoopOrientation: guarded
// (TT_NULL_DEREF) where upstream would dereference a missing surface or extreme.
bool all_uv = ls.GetSize() > 0 && SmTrimmingTools::AreUVCurvesPresent(f);
SmAssertArray a;
if (ls.GetSize() == 0 || !all_uv)
if (all_uv)
{
o.push_back(st(SmTrimmingTools::CheckFace(f, tol, want_list ? &a : NULL, SM_LEVEL_0, NULL,
skip ? TRUE : FALSE)));
tt_put_reports(o, g, a);
break;
if (f->GetSurface() == nullptr)
ok = false;
for (ULONG i = 0; ok && !skip && i < ls.GetSize(); i++)
ok = tt_ok_loop_extremes(ls[i]);
if (!ok)
{
o.push_back(TT_NULL_DEREF);
break;
}
}
if (skip || f->GetSurface() == nullptr || !tt_ok_loop_extremes(ls[0]))
{
o.push_back(TT_NOT_RUN);
break;
}
ULONG closure = 99;
SmStatus r = SmTrimmingTools::CheckLoop(f->GetSurface(), ls[0], tol, closure, want_list ? &a : NULL);
if (r == SM_SUCCESS)
{
o.push_back(TT_NOT_RUN);
break;
}
o.push_back(st(r));
o.push_back(st(SmTrimmingTools::CheckFace(f, tol, want_list ? &a : NULL, SM_LEVEL_0, NULL,
skip ? TRUE : FALSE)));
tt_put_reports(o, g, a);
break;
}
@@ -1154,14 +1163,12 @@ void tt_brep_op(int32_t op, Rd& rd, const char* path, std::vector<double>& o)
}
case OP_B_ORIENT:
{
// FixTrimLoopOrientation of the face: SmFace::ComputeLoopOrientation is
// unported, so only a face without loops is run
// FixTrimLoopOrientation of the face (SmFace::ComputeLoopOrientation of every
// loop): guarded like CheckFace's ComputeLoopOrientation
SmFace* f = g.faces.at((size_t)rd.idx());
SmTArray<SmLoop*> ls;
f->GetLoops(ls);
if (ls.GetSize() != 0)
if (!tt_ok_face_loops(f))
{
o.push_back(TT_NOT_RUN);
o.push_back(TT_NULL_DEREF);
break;
}
ULONG n = 99;
@@ -1172,14 +1179,12 @@ void tt_brep_op(int32_t op, Rd& rd, const char* path, std::vector<double>& o)
}
case OP_B_ORDER:
{
// FixTrimLoopOrder: only its error for a face without loops is reached before
// the unported SmFace::ComputeLoopOrientation
// FixTrimLoopOrder (UV boxes of every loop's trim curves, then
// SmFace::ComputeLoopOrientation): guarded like FixTrimLoopOrientation
SmFace* f = g.faces.at((size_t)rd.idx());
SmTArray<SmLoop*> ls;
f->GetLoops(ls);
if (ls.GetSize() != 0)
if (!tt_ok_face_loops(f))
{
o.push_back(TT_NOT_RUN);
o.push_back(TT_NULL_DEREF);
break;
}
SmBoolean made = UNSURE;
+2
View File
@@ -22,6 +22,8 @@ Latest port: `sweep.topology_sweep` ([PR #222](https://github.com/tangency-labs/
Review follow-up merges canonical main `bb137d7d`, preserving both findings sections and main's full part 7 notes plus the sweep API extension. The merge p3/p4 integration boundary remains coordinated with the unavailable `merge_p2` constructor; the two `SM_DEG2RAD` sites now match upstream grouping.
Latest cross-unit change: owner zone-tolerance cache on `Surface` (branch `surface/owner-zone-tol`, PR #301): `topology.face_p2` deferrals 3495 -> 766, `surface.surface_cache_p2` 223 -> 0, +1751 pass over 15 units, 0 FAIL; the 76 cases it exposed (`query.face_p3` 75: missing vertex/face gaps in `CurveOnClassify`; `query.face_p1` 1: `Point3DClassify` skipped the trimmed surface cache) are fixed and now defer on unported callees (see `plan/findings.md`).
Latest harness: PR #295 (B-rep records for the classification shims' bare topology stand-ins, on top of main's real one-face B-rep adapter #347): curve_class_p1 2054->2070, p2 1495->1627, p7 1327->1474, point_class 2411->2466 passes, 0 failed.
Latest unit: `topology.face_p4` partial (port: topology.face_p4, taking over the #134 claim): 5506 cases, 3957 bit-identical passes, 0 failed, 1549 deferred (mostly the tolerance of face-owned surfaces: `SmTol::GetZoneTol3d` in the surface cache, tagged `geom.tol`, and `SmFace::GetTolerance`, `topology.face_p2`); 26 of its 44 back-edge stubs wired, including those of `heal.stitch_p1`, `topology.brep_p5`/`p7`/`p9`/`p10` and `topology.face_p3` (169 more `face_p3` passes); the rest take generic handles without a B-rep, or (one in `brep_p5`) no kernel; its own calls into `query.face_p3` (`sm_FaceClassifyUVLine`, `SectorClassifyCurveOn`) are wired since #132; `HasSeamProblem` returns `SM_SUCCESS` as TRUE upstream (`plan/upstream-issues.md` WR-176); 238 units (main after #229), 116 green and 122 partial.
+94
View File
@@ -12671,6 +12671,100 @@ boundary. No Rust/C++ value mismatch was observed in the completed fuzz cases.
The ordinary unit run remains 2686 cases, 2250 passed, 436 deferred, 0 failed,
with maximum relative error 0.
## surface: owning face's zone tolerance cached on `Surface` (branch `surface/owner-zone-tol`, 2026-10-20)
Upstream reads `GetFace()->GetTolerance()` from a surface in ten places (`SmTol::GetZoneTol3d(SmObject*)`
SmTol.cpp:775, `SmBSplineSurface::CalculateBoundingBox` SmBSplineSurface.cpp:797-806, `SmSurface::DropPoint`
SmSurface.cpp:10432, `LocalSurfaceSurfaceIntersectXYZ` SmSurface.cpp:29051, `ClassifyCurveSurfaceXsectPoint`
SmSurface.cpp:13373, `SmPlane` zone tolerance, `IsPlanar`, approx tol, point_class, surface_cache_p2). The port's
surface owner is an opaque handle, so every site returned `Unported(topology.face_p2)`. `Surface` now caches the
owning face record's `tolerance`, keyed by the reached face handle (a different or cleared owner never reads it);
`Brep::sync_face_surface_tolerance` keeps it current at every place a face record's surface or tolerance changes.
A face owner without cache still returns `Unported`. `surface.surface_cache_p1` `mark_face_containment` (an opaque
node face handle) is not covered. On main 862746f4 (`--green`, all units): `topology.face_p2` deferral label 3495 ->
766, `surface.surface_cache_p2` 223 -> 0, total deferred 24839 -> 22724, +2039 pass over 15 units, +76 FAIL in
`query.face_p3` (75) and `query.face_p1` (1), both below (exposed, not caused: each case read the face tolerance
correctly; the next divergent step is elsewhere). After both fixes below: 0 FAIL, +1751 pass over 15 units, total
deferred 24839 -> 23088 (`query.face_p3` 75 and `query.face_p1` 289 now defer on unported callees).
### topology.trimming_tools: stale `TT_NOT_RUN` shim gate
`harness/cpp/shim/topology_trimming_tools.cpp` returned `-3` (`TT_NOT_RUN`) for `b_check_face`, `b_orient` and
`b_order` on every face with loops, written while `SmFace::ComputeLoopOrientation` was unported. `topology.face_p3`
ported it; the Rust side kept deferring only through `SmFace::GetTolerance`. With the cache the Rust side
completes, so 305 cases (104 check_face, 102 orient, 99 order) compared a real result against `-3`. The shim now
runs `CheckFace` / `FixTrimLoopOrientation` / `FixTrimLoopOrder` in full, guarded with `-2` (mirrored in the
runner) where a loop lacks its loop use, a face with loops lacks surface or UV trim curves, or `CheckLoop` would
dereference a null UV extreme (17 cases). The fixtures never reorient a loop (orient always 0, order always
`false`): those two ops are compared on the no-change path only. Follow-up: misordered / misoriented loop fixtures.
### topology.brep_p1 `edge_edge_blend` on analytic face surfaces: harness input mismatch, not a port bug
Inputs: `surf_rev.smb` (`crates/difftest/fixtures/topology.brep_p1/upstream_files.json#1518` flag=1 eu1=0 eu2=1
dir=0, `#1520` flag=3 eu1=1 eu2=2 dir=1). C++ `out[979]` = 3.4935082719274374e-1 vs Rust 3.4935082670870377e-1
(1.4e-9), growing to 7.3e-4 (`3_1_2_1`: 5.3e-4). Previously deferred on `SmFace::GetTolerance`. Cause: the
shared `topology.edgeuse_p1` export hands Rust the faces' `SmSurfOfRevolution` as its B-spline part. In
`GetSampleValues` -> `DropPoint`, C++ succeeds in `SmSurfOfRevolution::DropPointFast` (SmSurfOfRevolution.cpp:2356),
while Rust's B-spline `drop_point_fast` is the base `SM_ERR` and it uses `LocalPointSolve` (bit-identical to C++
`LocalPointSolve`). First drop difference: u = 0x3fcdfd6b2cbee1af vs 0x3fcdfd6b2cbee37e (5.5e-14), amplified by
the G2 blend fit. With the C++ faces flattened to the same B-spline part (temporary shim switch), all 159 compared
blend cases match at 0. surf_extrude (`SmSurfOfExtrusion::DropPointFast`, up to 9.4e-10) and surf_rev 2_0_2_0
(8.9e-11) show the same drift below 1e-9. Resolution: the runner defers blends (flag != 0) whose faces are
non-exact surfaces (`harness:analytic-geometry-export`, +27 cases: 2 FAIL, 25 pass). Exporting revolution /
extrusion surfaces exactly in `sc_edgeuse_graph.h` would let them be compared.
### query.face_p3 `bisector`: `LoopObjectCurves` has no `vertex_face_gap` (75 FAIL, previously deferred on `SmFace::GetTolerance`)
`sms_FindAndClassifyLoopBisector` calls `SmFace::CurveOnClassify(TRUE, cc, TRUE /* bHasBigGaps */, TRUE, ..)`
(SmFace.cpp:2884-2892). With big gaps and a face, `IntersectVertices` reads
`pVertex->GetVertexuseOfFace(pFace)->GetVertexFaceGap()` (SmCurveClass.cpp:14716-14744). The port's
`vertex_big_gap_tolerance` (`crates/solidcore/src/intersect/curve_class/p5.rs:163`) asks
`ClassGeometry::vertex_face_gap`, which `query::face::p3::LoopObjectCurves` (`crates/solidcore/src/query/face/p3.rs:549`)
does not implement (trait default `None`), so every call returns `InvalidInput("unresolved classification
vertex/face gap")`. The bisector ignores that status as upstream does (`ignored(curve_on_classify(..))`), so the Rust
side records no intervals: e.g. `bisector_Mouse_f2_t0` `values.interval_bounds.len` C++ 6 vs Rust 2,
`bisector_holed_box_top_flat` `ints.interval_classes[0]` C++ 103 vs Rust 100. A temporary probe showed this error on
all 75 classification calls of the failing cases and on no other path. Fix: implement `vertex_face_gap` on
`LoopObjectCurves` (vertex use of the face, `has_vertex_face_gap`, cached or computed `SmVertexuse::GetVertexFaceGap`
length, 0 when absent); it needs a kernel and a non-caching gap computation, since the adapter holds `&Brep`.
More generally, an adapter gap reported as `InvalidInput` is indistinguishable from an upstream status under
`ignored`: no `ClassGeometry` implementation provides `vertex_face_gap` today.
Resolved: the gap is a B-rep property, so `query::face::p2::curve_on_classify` (which has the B-rep and kernel)
now computes it for every caller, not only `LoopObjectCurves`: with `has_big_gaps` it reads
`vertex::vertexuse_of_face` -> `vertexuse::vertex_face_gap(.., false)` length (0 without a gap) of each face
vertex on one private B-rep snapshot per call (it keeps the gap caches across both passes, as upstream's
`GetVertexFaceGap` caches into the B-rep), and answers `ClassGeometry::vertex_face_gap` for those vertex handles
through a wrapper around the caller's geometry. With the gap tolerance in place, all 75 cases reach
`SmCrvGeometry::GlobalPointSolve` on the bisector's `SmCrvOnSurf`, whose `Curve::knots` stops at the known
`UNPORTED(intersect.curve_class_p2): SmCurveClassification::ReSet` (`crates/solidcore/src/curve/crv_on_surf.rs:218`,
no `Kernel` under `Curve::knots`): 75 FAIL -> 75 deferred. `query.face_p3`: 543 pass / 0 fail / 656 deferred.
### query.face_p1 `gen0160` (1 FAIL, previously deferred on `SmFace::GetTolerance`)
Generated `Point3DClassify` on a 1e-3 x 3e-3 bilinear-in-u B-spline sliver whose u=0 edge collapses onto the z axis
(`generated:seed=4634842130399439208`), point offset ~5e-4, `src_tol` 0.01, `pc_tol` 1e-8, face tolerance 1e-5.
`values.pc[0]` C++ 102 (FACE, uv 0.720517876766358, 0.823164791473039) vs Rust 104 (VERTEX, no uv). The global point
solve's UV is bit-identical on both sides (probe), and the three face-tolerance reads (`is_on_boundary`,
`local_point_solve_1`) all return 1e-5 as in C++; the divergence is inside `query::face::p2::point_classify`, which
reads no surface face tolerance. Not localised further.
Resolved (C++ probe, hunks in the worktree's `GEN0160-PROBES.diff`, reverted): after `Point3DClassify` the face
surface has an `SmTrimSrfCache` with `m_bHaveTSurfaceCache` 1, `m_bFaceContainmentDone` 1, `m_bFaceWasModified` 0,
`GetSurface()->GetFace() == this`; the one leaf node at the UV is `SM_NC_INSIDE`. The face's 4 vertices (tolerance
1e-5) are 1.083e-3 from the surface point, inside the vertex test's `max(1e-5, 1e-5, GetTolerance()=src 0.01)`.
C++ `PointClassify` at the same UV with the cache dropped returns VERTEX (104), as Rust. Cause: upstream
`Point3DClassify` calls `smsurf_GetSurfaceCache(pSurface)` first (SmFace.cpp:12792), which builds the trimmed
surface cache with its face containment; `PointClassify` then classifies through the inside leaf and returns FACE
before the vertex test. The port skipped that call (its header claimed a fresh cache is never
face-containment-complete, which is wrong for a face with loops: SmTrimSrfCache.cpp:330-347). Fix:
`point_3d_classify` now builds it (`make_trim_srf_cache`, else `make_surface_cache`) and passes it to
`point_classify`. The trimmed cache's face walk is unported (`Unported("SmFace handle of a surface's face",
topology.face_p2)`), so every `Point3DClassify` case on a face-owned surface now defers there: the 288 point cases
that passed with the skipped call (the cache path and the vertex/loop path agree outside such tolerance edges)
plus `gen0160`. `query.face_p1`: 1580 pass / 0 fail / 644 deferred (main 862746f4: 1570 / 0 / 654). They become
comparable with `surface.surface_cache_p1` `mark_face_containment` and the `TrimSrfCache` face walk.
## Kernel-aware Surface integration: PR #133 review follow-up (2026-10-16)
+20 -20
View File
File diff suppressed because one or more lines are too long
@@ -1932,8 +1932,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmFilletExecutive::LoadFilletSolver",
"unit": "blend.fillet_executive_p1"
},
"max_rel_err": 0.0,
"name": "set_params_per_edge_r1",
@@ -2311,9 +2311,8 @@
"cases_passed": 250,
"cases_total": 275,
"deferred_by_unit": {
"blend.fillet_executive_p1": 22,
"blend.fillet_standard_solver_p2": 2,
"topology.face_p2": 1
"blend.fillet_executive_p1": 23,
"blend.fillet_standard_solver_p2": 2
},
"max_rel_err": 0.0,
"pass": true,
@@ -26900,9 +26900,9 @@
},
"rail2": {
"cpts": [
[0.0, 2.0237695437919667, 0.8932986153732345, -1.7976931348623157e+308],
[2.0771661391365335, 1.453866731728155, 2.0815918299099407, -1.7976931348623157e+308],
[4.154332278273067, 0.9958365506887121, 1.5635688821818794, -1.7976931348623157e+308],
[0.0, 2.0237695437919667, 0.8932986153732343, -1.7976931348623157e+308],
[2.0771661391365335, 1.453866731728155, 2.0815918299099403, -1.7976931348623157e+308],
[4.154332278273067, 0.9958365506887121, 1.5635688821818792, -1.7976931348623157e+308],
[6.231498417409601, 1.6552784197992152, 2.239427966301154, -1.7976931348623157e+308]
],
"p": 3,
+21 -46
View File
@@ -522,16 +522,12 @@
"values_compared": 49
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "cleanup_plane_0_1",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/boolean.merge_p1/helpers.json#65 (upstream tests/prog_test/src/smTopoTest.cpp:4665)",
"values_compared": 0
"values_compared": 49
},
{
"max_rel_err": 0.0,
@@ -550,28 +546,20 @@
"values_compared": 49
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "cleanup_plane_1_1",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/boolean.merge_p1/helpers.json#68 (upstream tests/prog_test/src/smTopoTest.cpp:4665)",
"values_compared": 0
"values_compared": 49
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "cleanup_plane_1_2",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/boolean.merge_p1/helpers.json#69 (upstream tests/prog_test/src/smTopoTest.cpp:4665)",
"values_compared": 0
"values_compared": 49
},
{
"max_rel_err": 0.0,
@@ -1538,16 +1526,12 @@
"values_compared": 58
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0027",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=5645105664643314536",
"values_compared": 0
"values_compared": 49
},
{
"max_rel_err": 0.0,
@@ -1630,16 +1614,12 @@
"values_compared": 23
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0038",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=5645105664643314547",
"values_compared": 0
"values_compared": 49
},
{
"max_rel_err": 0.0,
@@ -2010,16 +1990,12 @@
"values_compared": 20
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0084",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=5645105664643314593",
"values_compared": 0
"values_compared": 49
},
{
"max_rel_err": 0.0,
@@ -2111,16 +2087,15 @@
}
],
"cases_both_errored": 0,
"cases_deferred": 31,
"cases_deferred": 25,
"cases_failed": 0,
"cases_passed": 217,
"cases_passed": 223,
"cases_total": 248,
"deferred_by_unit": {
"boolean.topology_intersector_p3": 4,
"harness:analytic-geometry-export": 1,
"intersect.surface_drop_lib_p3": 18,
"topology.brep_p5": 2,
"topology.face_p2": 6
"topology.brep_p5": 2
},
"max_rel_err": 0.0,
"pass": true,
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -2799,7 +2799,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13034075822364237156",
"values_compared": 1044
"values_compared": 1135
},
{
"max_rel_err": 0.0,
+1 -1
View File
@@ -11791,7 +11791,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=7577092825472747628",
"values_compared": 2333
"values_compared": 2515
},
{
"max_rel_err": 0.0,
+16 -16
View File
@@ -2599,7 +2599,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230430257",
"values_compared": 363
"values_compared": 364
},
{
"max_rel_err": 0.0,
@@ -2695,7 +2695,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230430269",
"values_compared": 61
"values_compared": 56
},
{
"max_rel_err": 0.0,
@@ -2767,7 +2767,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230430278",
"values_compared": 53
"values_compared": 54
},
{
"max_rel_err": 0.0,
@@ -3887,7 +3887,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230430418",
"values_compared": 67
"values_compared": 64
},
{
"max_rel_err": 0.0,
@@ -4919,7 +4919,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230430547",
"values_compared": 56
"values_compared": 55
},
{
"max_rel_err": 0.0,
@@ -9791,7 +9791,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230431156",
"values_compared": 58
"values_compared": 57
},
{
"max_rel_err": 0.0,
@@ -12655,7 +12655,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230431514",
"values_compared": 55
"values_compared": 56
},
{
"max_rel_err": 0.0,
@@ -14215,7 +14215,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230431709",
"values_compared": 50
"values_compared": 49
},
{
"max_rel_err": 0.0,
@@ -14975,7 +14975,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230431804",
"values_compared": 122
"values_compared": 120
},
{
"max_rel_err": 0.0,
@@ -16359,7 +16359,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230431977",
"values_compared": 27
"values_compared": 23
},
{
"max_rel_err": 0.0,
@@ -17871,7 +17871,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230432166",
"values_compared": 50
"values_compared": 49
},
{
"max_rel_err": 0.0,
@@ -19135,7 +19135,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230432324",
"values_compared": 49
"values_compared": 50
},
{
"max_rel_err": 0.0,
@@ -19271,7 +19271,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230432341",
"values_compared": 49
"values_compared": 48
},
{
"max_rel_err": 0.0,
@@ -19999,7 +19999,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230432432",
"values_compared": 50
"values_compared": 49
},
{
"max_rel_err": 0.0,
@@ -23015,7 +23015,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230432809",
"values_compared": 47
"values_compared": 46
},
{
"max_rel_err": 0.0,
@@ -24319,7 +24319,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=1894831246230432972",
"values_compared": 55
"values_compared": 54
},
{
"max_rel_err": 0.0,
+7 -7
View File
@@ -8554,7 +8554,7 @@
"values_compared": 109
},
{
"max_rel_err": 2.198216228664531e-16,
"max_rel_err": 0.0,
"name": "gen1036",
"outcome": "pass",
"pass": true,
@@ -10202,7 +10202,7 @@
"values_compared": 100
},
{
"max_rel_err": 1.3354105449223296e-15,
"max_rel_err": 0.0,
"name": "gen1242",
"outcome": "pass",
"pass": true,
@@ -10954,7 +10954,7 @@
"values_compared": 26
},
{
"max_rel_err": 2.979074458350211e-16,
"max_rel_err": 0.0,
"name": "gen1336",
"outcome": "pass",
"pass": true,
@@ -16914,7 +16914,7 @@
"values_compared": 55
},
{
"max_rel_err": 1.7025919370142879e-15,
"max_rel_err": 0.0,
"name": "gen2081",
"outcome": "pass",
"pass": true,
@@ -17930,7 +17930,7 @@
"values_compared": 85
},
{
"max_rel_err": 3.18989893668177e-15,
"max_rel_err": 0.0,
"name": "gen2208",
"outcome": "pass",
"pass": true,
@@ -20714,7 +20714,7 @@
"values_compared": 93
},
{
"max_rel_err": 1.6658808949288423e-16,
"max_rel_err": 0.0,
"name": "gen2556",
"outcome": "pass",
"pass": true,
@@ -24272,7 +24272,7 @@
"cases_passed": 3033,
"cases_total": 3033,
"deferred_by_unit": {},
"max_rel_err": 3.18989893668177e-15,
"max_rel_err": 0.0,
"pass": true,
"rel_tol": 1e-9,
"seeds": 16,
+2 -2
View File
@@ -15319,7 +15319,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=12755644330057303547",
"values_compared": 2
"values_compared": 0
},
{
"max_rel_err": 0.0,
@@ -40479,7 +40479,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=12755644330057306692",
"values_compared": 2
"values_compared": 1
},
{
"max_rel_err": 0.0,
+46 -46
View File
@@ -1495,8 +1495,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "face_box_with_large_fillet_p0",
@@ -1519,8 +1519,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
},
"max_rel_err": 0.0,
"name": "face_box_with_large_fillet_p1",
@@ -1543,8 +1543,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
},
"max_rel_err": 0.0,
"name": "face_box_with_large_fillet_p2",
@@ -1567,8 +1567,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "face_box_with_large_fillet_p3",
@@ -1679,8 +1679,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "face_plane_circ_p1",
@@ -1703,8 +1703,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "face_plane_circ_p2",
@@ -1727,8 +1727,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "face_plane_circ_p3",
@@ -2143,8 +2143,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
},
"max_rel_err": 0.0,
"name": "face_cone_p1",
@@ -2167,8 +2167,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
},
"max_rel_err": 0.0,
"name": "face_cone_p2",
@@ -2303,8 +2303,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
},
"max_rel_err": 0.0,
"name": "face_sphere_p1",
@@ -2327,8 +2327,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
},
"max_rel_err": 0.0,
"name": "face_sphere_p2",
@@ -2351,8 +2351,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
},
"max_rel_err": 0.0,
"name": "face_sphere_p3",
@@ -2487,8 +2487,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "face_disk_p0",
@@ -2511,8 +2511,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "face_disk_p1",
@@ -2535,8 +2535,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "face_disk_p2",
@@ -2559,8 +2559,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "face_disk_p3",
@@ -2743,8 +2743,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "face_plane_square_p0",
@@ -2767,8 +2767,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "face_plane_square_p1",
@@ -2791,8 +2791,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "face_plane_square_p2",
@@ -2815,8 +2815,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "face_plane_square_p3",
@@ -2975,8 +2975,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
},
"max_rel_err": 0.0,
"name": "face_torus_p1",
@@ -2999,8 +2999,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
},
"max_rel_err": 0.0,
"name": "face_torus_p2",
@@ -7858,9 +7858,9 @@
"deferred_by_unit": {
"curve.curve_p2": 72,
"curve.curve_p6": 32,
"geom.tol": 13,
"geom.tol": 9,
"topology.edge": 6,
"topology.face_p2": 9
"topology.face_p2": 13
},
"max_rel_err": 0.0,
"pass": true,
+3 -3
View File
@@ -5896,8 +5896,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface (non-B-spline) in SmCrvOnSurf",
"unit": "curve.crv_on_surf"
},
"max_rel_err": 0.0,
"name": "gen0662",
@@ -13085,7 +13085,7 @@
"cases_passed": 1317,
"cases_total": 1528,
"deferred_by_unit": {
"topology.face_p2": 1,
"curve.crv_on_surf": 1,
"topology.face_p4": 210
},
"max_rel_err": 0.0,
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+150 -347
View File
@@ -150,16 +150,12 @@
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "box_select_edges",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#17",
"values_compared": 0
"values_compared": 3
},
{
"max_rel_err": 0.0,
@@ -378,196 +374,132 @@
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e0_e4",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#44",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e0_e5",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#45",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e0_e6",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#46",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e0_e7",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#47",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e1_e4",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#48",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e1_e5",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#49",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e1_e6",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#50",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e1_e7",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#51",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e2_e4",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#52",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e2_e5",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#53",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e2_e6",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#54",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e2_e7",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#55",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e3_e4",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#56",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e3_e5",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#57",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e3_e6",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#58",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap0_select_e3_e7",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#59",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
@@ -742,196 +674,132 @@
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e0_e4",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#80",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e0_e5",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#81",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e0_e6",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#82",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e0_e7",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#83",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e1_e4",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#84",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e1_e5",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#85",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e1_e6",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#86",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e1_e7",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#87",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e2_e4",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#88",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e2_e5",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#89",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e2_e6",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#90",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e2_e7",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#91",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e3_e4",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#92",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e3_e5",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#93",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e3_e6",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#94",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap1e-4_select_e3_e7",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#95",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
@@ -1102,196 +970,132 @@
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e0_e4",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#116",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e0_e5",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#117",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e0_e6",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#118",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e0_e7",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#119",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e1_e4",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#120",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e1_e5",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#121",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e1_e6",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#122",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e1_e7",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#123",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e2_e4",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#124",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e2_e5",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#125",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e2_e6",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#126",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e2_e7",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#127",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e3_e4",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#128",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e3_e5",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#129",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e3_e6",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#130",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "two_squares_gap5e-3_select_e3_e7",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/heal.stitch_p1/constructed.json#131",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
@@ -2656,17 +2460,16 @@
}
],
"cases_both_errored": 1,
"cases_deferred": 63,
"cases_deferred": 14,
"cases_failed": 0,
"cases_passed": 237,
"cases_passed": 286,
"cases_total": 300,
"deferred_by_unit": {
"harness:analytic-geometry-export": 1,
"intersect.surface_drop_lib_p3": 5,
"topology.brep_p1": 5,
"topology.brep_p4": 1,
"topology.brep_p9": 2,
"topology.face_p2": 49
"topology.brep_p9": 2
},
"max_rel_err": 0.0,
"pass": true,
+84 -192
View File
@@ -1422,16 +1422,12 @@
"values_compared": 880
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0013",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632178184",
"values_compared": 0
"values_compared": 874
},
{
"max_rel_err": 0.0,
@@ -1690,16 +1686,12 @@
"values_compared": 154
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0045",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632178216",
"values_compared": 0
"values_compared": 553
},
{
"max_rel_err": 0.0,
@@ -2166,16 +2158,12 @@
"values_compared": 302
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0104",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632178275",
"values_compared": 0
"values_compared": 1142
},
{
"max_rel_err": 0.0,
@@ -2810,16 +2798,12 @@
"values_compared": 585
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0184",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632178355",
"values_compared": 0
"values_compared": 382
},
{
"max_rel_err": 0.0,
@@ -3070,16 +3054,12 @@
"values_compared": 476
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0215",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632178386",
"values_compared": 0
"values_compared": 578
},
{
"max_rel_err": 0.0,
@@ -3546,16 +3526,12 @@
"values_compared": 286
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0274",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632178445",
"values_compared": 0
"values_compared": 424
},
{
"max_rel_err": 0.0,
@@ -3870,16 +3846,12 @@
"values_compared": 817
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0314",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632178485",
"values_compared": 0
"values_compared": 766
},
{
"max_rel_err": 0.0,
@@ -4954,16 +4926,12 @@
"values_compared": 787
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0449",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632178620",
"values_compared": 0
"values_compared": 698
},
{
"max_rel_err": 0.0,
@@ -5586,16 +5554,12 @@
"values_compared": 130
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0527",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632178698",
"values_compared": 0
"values_compared": 661
},
{
"max_rel_err": 0.0,
@@ -5798,16 +5762,12 @@
"values_compared": 211
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0553",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632178724",
"values_compared": 0
"values_compared": 552
},
{
"max_rel_err": 0.0,
@@ -6538,16 +6498,12 @@
"values_compared": 1302
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0645",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632178816",
"values_compared": 0
"values_compared": 159
},
{
"max_rel_err": 0.0,
@@ -7014,16 +6970,12 @@
"values_compared": 520
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0703",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632178874",
"values_compared": 0
"values_compared": 266
},
{
"max_rel_err": 0.0,
@@ -7318,16 +7270,12 @@
"values_compared": 91
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0740",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632178911",
"values_compared": 0
"values_compared": 973
},
{
"max_rel_err": 0.0,
@@ -7870,16 +7818,12 @@
"values_compared": 237
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0808",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632178979",
"values_compared": 0
"values_compared": 244
},
{
"max_rel_err": 0.0,
@@ -7906,16 +7850,12 @@
"values_compared": 366
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0812",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632178983",
"values_compared": 0
"values_compared": 405
},
{
"max_rel_err": 0.0,
@@ -9674,16 +9614,12 @@
"values_compared": 534
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen1030",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632179201",
"values_compared": 0
"values_compared": 717
},
{
"max_rel_err": 0.0,
@@ -10382,16 +10318,12 @@
"values_compared": 548
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen1118",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632179289",
"values_compared": 0
"values_compared": 820
},
{
"max_rel_err": 0.0,
@@ -10426,16 +10358,12 @@
"values_compared": 817
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen1123",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632179294",
"values_compared": 0
"values_compared": 768
},
{
"max_rel_err": 0.0,
@@ -10470,16 +10398,12 @@
"values_compared": 210
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen1128",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632179299",
"values_compared": 0
"values_compared": 674
},
{
"max_rel_err": 0.0,
@@ -10530,16 +10454,12 @@
"values_compared": 715
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen1135",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632179306",
"values_compared": 0
"values_compared": 643
},
{
"max_rel_err": 0.0,
@@ -10846,16 +10766,12 @@
"values_compared": 739
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen1174",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632179345",
"values_compared": 0
"values_compared": 536
},
{
"max_rel_err": 0.0,
@@ -11098,16 +11014,12 @@
"values_compared": 184
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen1205",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632179376",
"values_compared": 0
"values_compared": 450
},
{
"max_rel_err": 0.0,
@@ -11134,16 +11046,12 @@
"values_compared": 154
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen1209",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632179380",
"values_compared": 0
"values_compared": 797
},
{
"max_rel_err": 0.0,
@@ -11570,16 +11478,12 @@
"values_compared": 956
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen1263",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632179434",
"values_compared": 0
"values_compared": 418
},
{
"max_rel_err": 0.0,
@@ -12046,16 +11950,12 @@
"values_compared": 289
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen1322",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632179493",
"values_compared": 0
"values_compared": 79
},
{
"max_rel_err": 0.0,
@@ -12662,16 +12562,12 @@
"values_compared": 532
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen1398",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632179569",
"values_compared": 0
"values_compared": 1130
},
{
"max_rel_err": 0.0,
@@ -12990,16 +12886,12 @@
"values_compared": 185
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen1438",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12816350387632179609",
"values_compared": 0
"values_compared": 238
},
{
"max_rel_err": 0.0,
@@ -13547,12 +13439,12 @@
}
],
"cases_both_errored": 0,
"cases_deferred": 44,
"cases_deferred": 17,
"cases_failed": 0,
"cases_passed": 1627,
"cases_passed": 1654,
"cases_total": 1671,
"deferred_by_unit": {
"topology.face_p2": 44
"topology.face_p2": 17
},
"max_rel_err": 0.0,
"pass": true,
File diff suppressed because it is too large Load Diff
+16 -16
View File
@@ -783,7 +783,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977489261",
"values_compared": 425
"values_compared": 435
},
{
"max_rel_err": 0.0,
@@ -1031,7 +1031,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977489292",
"values_compared": 78
"values_compared": 73
},
{
"max_rel_err": 0.0,
@@ -1279,7 +1279,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977489323",
"values_compared": 791
"values_compared": 806
},
{
"max_rel_err": 0.0,
@@ -2335,7 +2335,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977489455",
"values_compared": 876
"values_compared": 846
},
{
"max_rel_err": 0.0,
@@ -3519,7 +3519,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977489603",
"values_compared": 303
"values_compared": 298
},
{
"max_rel_err": 0.0,
@@ -4919,7 +4919,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977489778",
"values_compared": 255
"values_compared": 250
},
{
"max_rel_err": 0.0,
@@ -5431,7 +5431,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977489842",
"values_compared": 753
"values_compared": 758
},
{
"max_rel_err": 0.0,
@@ -5951,7 +5951,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977489907",
"values_compared": 601
"values_compared": 611
},
{
"max_rel_err": 0.0,
@@ -6951,7 +6951,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977490032",
"values_compared": 285
"values_compared": 280
},
{
"max_rel_err": 0.0,
@@ -7839,7 +7839,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977490143",
"values_compared": 655
"values_compared": 650
},
{
"max_rel_err": 0.0,
@@ -8455,7 +8455,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977490220",
"values_compared": 650
"values_compared": 655
},
{
"max_rel_err": 0.0,
@@ -8639,7 +8639,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977490243",
"values_compared": 108
"values_compared": 113
},
{
"max_rel_err": 0.0,
@@ -9319,7 +9319,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977490328",
"values_compared": 935
"values_compared": 945
},
{
"max_rel_err": 0.0,
@@ -9759,7 +9759,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977490383",
"values_compared": 147
"values_compared": 152
},
{
"max_rel_err": 0.0,
@@ -9839,7 +9839,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977490393",
"values_compared": 456
"values_compared": 441
},
{
"max_rel_err": 0.0,
@@ -10935,7 +10935,7 @@
"outcome": "pass",
"pass": true,
"source": "generated:seed=13982542374977490530",
"values_compared": 760
"values_compared": 750
},
{
"max_rel_err": 0.0,
@@ -19,7 +19,7 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
@@ -31,7 +31,7 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
@@ -227,8 +227,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0019",
@@ -275,8 +275,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0024",
@@ -307,8 +307,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0027",
@@ -399,8 +399,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0037",
@@ -423,8 +423,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0039",
@@ -435,8 +435,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0040",
@@ -514,16 +514,12 @@
"values_compared": 37
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0049",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9515163603058762805",
"values_compared": 0
"values_compared": 364
},
{
"deferred": {
@@ -739,8 +735,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0074",
@@ -947,8 +943,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0095",
@@ -959,8 +955,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0096",
@@ -1007,8 +1003,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0101",
@@ -1047,8 +1043,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0105",
@@ -1123,8 +1119,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0114",
@@ -1183,8 +1179,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0120",
@@ -1267,8 +1263,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0128",
@@ -1291,8 +1287,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0130",
@@ -1483,8 +1479,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0152",
@@ -1495,8 +1491,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0153",
@@ -1519,8 +1515,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0155",
@@ -1555,8 +1551,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0159",
@@ -1591,8 +1587,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0163",
@@ -1687,8 +1683,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0173",
@@ -1771,8 +1767,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0182",
@@ -2043,8 +2039,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0213",
@@ -2087,7 +2083,7 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
@@ -2195,8 +2191,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0230",
@@ -2467,8 +2463,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0258",
@@ -2535,8 +2531,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0266",
@@ -2623,8 +2619,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0275",
@@ -2779,8 +2775,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0293",
@@ -2859,8 +2855,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0302",
@@ -2879,8 +2875,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0304",
@@ -2947,8 +2943,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0311",
@@ -2967,8 +2963,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0313",
@@ -3051,8 +3047,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0323",
@@ -3199,8 +3195,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0339",
@@ -3255,8 +3251,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0345",
@@ -3287,8 +3283,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0348",
@@ -3375,8 +3371,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0357",
@@ -3479,8 +3475,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0368",
@@ -3615,8 +3611,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0383",
@@ -3643,8 +3639,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0386",
@@ -3751,8 +3747,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0397",
@@ -3783,8 +3779,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0400",
@@ -3875,8 +3871,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0410",
@@ -3903,8 +3899,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0413",
@@ -3931,8 +3927,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0416",
@@ -4123,8 +4119,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0438",
@@ -4243,8 +4239,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0451",
@@ -4271,8 +4267,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0454",
@@ -4295,8 +4291,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0456",
@@ -4307,8 +4303,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0457",
@@ -4335,8 +4331,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0460",
@@ -4355,8 +4351,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0462",
@@ -4471,8 +4467,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0475",
@@ -4590,16 +4586,12 @@
"values_compared": 579
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0488",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9515163603058763244",
"values_compared": 0
"values_compared": 484
},
{
"max_rel_err": 0.0,
@@ -4651,8 +4643,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0494",
@@ -4735,8 +4727,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0503",
@@ -4755,8 +4747,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0505",
@@ -5123,8 +5115,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0545",
@@ -5167,8 +5159,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0550",
@@ -5259,8 +5251,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0560",
@@ -5419,8 +5411,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0577",
@@ -5475,8 +5467,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0583",
@@ -5883,8 +5875,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0628",
@@ -5895,8 +5887,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0629",
@@ -6027,8 +6019,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0642",
@@ -6162,16 +6154,12 @@
"values_compared": 289
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0658",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9515163603058763414",
"values_compared": 0
"values_compared": 571
},
{
"deferred": {
@@ -6259,8 +6247,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0668",
@@ -6387,8 +6375,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0681",
@@ -6399,8 +6387,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0682",
@@ -6511,8 +6499,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0694",
@@ -6611,8 +6599,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0705",
@@ -6643,8 +6631,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0708",
@@ -6803,8 +6791,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0726",
@@ -6875,8 +6863,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0733",
@@ -6938,16 +6926,12 @@
"values_compared": 0
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0739",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9515163603058763495",
"values_compared": 0
"values_compared": 330
},
{
"deferred": {
@@ -6971,8 +6955,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0742",
@@ -7015,8 +6999,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0747",
@@ -7091,8 +7075,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0755",
@@ -7131,8 +7115,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0759",
@@ -7143,8 +7127,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0760",
@@ -7307,8 +7291,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0779",
@@ -7359,8 +7343,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0785",
@@ -7479,8 +7463,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0799",
@@ -7791,8 +7775,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "mouse_edgeuse_offset_extend",
@@ -7959,8 +7943,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "cone_mate_extend_local",
@@ -8111,18 +8095,17 @@
}
],
"cases_both_errored": 0,
"cases_deferred": 279,
"cases_deferred": 275,
"cases_failed": 0,
"cases_passed": 595,
"cases_passed": 599,
"cases_total": 874,
"deferred_by_unit": {
"curve.crv_on_surf": 29,
"geom.tol": 82,
"harness:analytic-geometry-export": 123,
"intersect.surface_drop_curve": 18,
"intersect.surface_drop_lib_p3": 13,
"surface.surface_p2": 1,
"topology.face_p2": 13
"topology.face_p2": 91
},
"max_rel_err": 0.0,
"pass": true,
File diff suppressed because it is too large Load Diff
+154 -237
View File
@@ -339,8 +339,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "endcap_tight_edges_faces",
@@ -351,8 +351,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "endcap_tight_box",
@@ -363,8 +363,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "endcap_lock_then_query",
@@ -375,8 +375,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "endcap_lock_tight_relock",
@@ -411,8 +411,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "endcap_rebuilt_tight_edges_faces",
@@ -423,8 +423,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "endcap_rebuilt_tight_box",
@@ -435,8 +435,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "endcap_rebuilt_lock_then_query",
@@ -447,8 +447,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "endcap_rebuilt_lock_tight_relock",
@@ -930,52 +930,36 @@
"values_compared": 14
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "ellips_ts2_tight_edges_faces",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/query.brep/box.json#59 (upstream source/SMLib/src/SmBrep.cpp:1009)",
"values_compared": 0
"values_compared": 14
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "ellips_ts2_tight_box",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/query.brep/box.json#60 (upstream source/SMLib/src/SmBrep.cpp:1009)",
"values_compared": 0
"values_compared": 7
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "ellips_ts2_lock_then_query",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/query.brep/box.json#61 (upstream source/SMLib/inc/SmBrep.h:1640)",
"values_compared": 0
"values_compared": 30
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "ellips_ts2_lock_tight_relock",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/query.brep/box.json#62 (upstream source/SMLib/src/SmBrep.cpp:1009)",
"values_compared": 0
"values_compared": 25
},
{
"max_rel_err": 0.0,
@@ -1002,52 +986,36 @@
"values_compared": 14
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "ellips_ts2_rebuilt_tight_edges_faces",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/query.brep/box.json#66 (upstream source/SMLib/src/SmBrep.cpp:1009)",
"values_compared": 0
"values_compared": 14
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "ellips_ts2_rebuilt_tight_box",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/query.brep/box.json#67 (upstream source/SMLib/src/SmBrep.cpp:1009)",
"values_compared": 0
"values_compared": 7
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "ellips_ts2_rebuilt_lock_then_query",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/query.brep/box.json#68 (upstream source/SMLib/inc/SmBrep.h:1640)",
"values_compared": 0
"values_compared": 30
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "ellips_ts2_rebuilt_lock_tight_relock",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/query.brep/box.json#69 (upstream source/SMLib/src/SmBrep.cpp:1009)",
"values_compared": 0
"values_compared": 25
},
{
"max_rel_err": 0.0,
@@ -1835,8 +1803,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
},
"max_rel_err": 0.0,
"name": "endcap_face_mid_bnd",
@@ -1854,16 +1822,12 @@
"values_compared": 13
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "endcap_face_mid_off_bnd",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/query.brep/classify.json#6 (upstream source/SMLib/src/SmBrep.cpp:24687)",
"values_compared": 0
"values_compared": 13
},
{
"max_rel_err": 0.0,
@@ -1875,8 +1839,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
},
"max_rel_err": 0.0,
"name": "endcap_face_corner_bnd",
@@ -1910,16 +1874,12 @@
"values_compared": 13
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "endcap_origin_bnd",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/query.brep/classify.json#12 (upstream source/SMLib/src/SmBrep.cpp:24687)",
"values_compared": 0
"values_compared": 13
},
{
"max_rel_err": 0.0,
@@ -2299,8 +2259,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "disk_face_mid_bnd",
@@ -2415,8 +2375,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
},
"max_rel_err": 0.0,
"name": "ellips_ts2_face_mid_bnd",
@@ -2434,16 +2394,12 @@
"values_compared": 13
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "ellips_ts2_face_mid_off_bnd",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/query.brep/classify.json#62 (upstream source/SMLib/src/SmBrep.cpp:24687)",
"values_compared": 0
"values_compared": 13
},
{
"max_rel_err": 0.0,
@@ -2455,8 +2411,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
},
"max_rel_err": 0.0,
"name": "ellips_ts2_face_corner_bnd",
@@ -2490,16 +2446,12 @@
"values_compared": 13
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "ellips_ts2_origin_bnd",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/query.brep/classify.json#68 (upstream source/SMLib/src/SmBrep.cpp:24687)",
"values_compared": 0
"values_compared": 13
},
{
"max_rel_err": 0.0,
@@ -2543,8 +2495,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "plane_circ_face_mid_bnd",
@@ -2579,8 +2531,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "plane_circ_face_corner_bnd",
@@ -2615,8 +2567,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "plane_circ_origin_bnd",
@@ -2667,8 +2619,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "plane_square_face_mid_bnd",
@@ -2735,8 +2687,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "plane_square_origin_bnd",
@@ -3594,28 +3546,20 @@
"values_compared": 13
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "plane_square_vertex_off_tol0.0",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/query.brep/classify.json#182 (upstream source/SMLib/src/SmBrep.cpp:24687)",
"values_compared": 0
"values_compared": 13
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "plane_square_vertex_off_tol1e-10",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/query.brep/classify.json#183 (upstream source/SMLib/src/SmBrep.cpp:24687)",
"values_compared": 0
"values_compared": 13
},
{
"max_rel_err": 0.0,
@@ -3723,8 +3667,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "box_unit_on_face_bnd",
@@ -3811,8 +3755,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "box_unit_face_point_bnd",
@@ -3923,8 +3867,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "box_moved_on_face_bnd",
@@ -4011,8 +3955,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "box_moved_face_point_bnd",
@@ -4123,8 +4067,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "box_tiny_on_face_bnd",
@@ -4147,8 +4091,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "box_tiny_near_face_in_bnd",
@@ -4211,8 +4155,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "box_tiny_face_point_bnd",
@@ -4323,8 +4267,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "box_large_on_face_bnd",
@@ -4411,8 +4355,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "box_large_face_point_bnd",
@@ -4595,8 +4539,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "plane_square_point_tiny_bnd",
@@ -5434,16 +5378,12 @@
"values_compared": 10
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0011",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=7989681234904880589",
"values_compared": 0
"values_compared": 15
},
{
"max_rel_err": 0.0,
@@ -5495,8 +5435,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "gen0018",
@@ -6163,8 +6103,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "gen0098",
@@ -6419,8 +6359,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "gen0128",
@@ -6631,8 +6571,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0154",
@@ -6906,16 +6846,12 @@
"values_compared": 10
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0186",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=7989681234904880764",
"values_compared": 0
"values_compared": 13
},
{
"deferred": {
@@ -7327,8 +7263,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "gen0237",
@@ -7543,8 +7479,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "gen0263",
@@ -7595,8 +7531,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "gen0269",
@@ -7819,8 +7755,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
},
"max_rel_err": 0.0,
"name": "gen0295",
@@ -8083,8 +8019,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0327",
@@ -8183,8 +8119,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
},
"max_rel_err": 0.0,
"name": "gen0339",
@@ -8210,16 +8146,12 @@
"values_compared": 38
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0342",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=7989681234904880920",
"values_compared": 0
"values_compared": 13
},
{
"max_rel_err": 0.0,
@@ -8567,8 +8499,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "gen0385",
@@ -8670,16 +8602,12 @@
"values_compared": 15
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0397",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=7989681234904880975",
"values_compared": 0
"values_compared": 37
},
{
"max_rel_err": 0.0,
@@ -8755,8 +8683,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "gen0407",
@@ -9586,16 +9514,12 @@
"values_compared": 10
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0508",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=7989681234904881086",
"values_compared": 0
"values_compared": 8
},
{
"max_rel_err": 0.0,
@@ -9738,16 +9662,12 @@
"values_compared": 10
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0526",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=7989681234904881104",
"values_compared": 0
"values_compared": 42
},
{
"max_rel_err": 0.0,
@@ -9935,8 +9855,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "gen0549",
@@ -10115,8 +10035,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "gen0571",
@@ -10291,8 +10211,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace handle of a surface's face",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0592",
@@ -10342,16 +10262,12 @@
"values_compared": 34
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0598",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=7989681234904881176",
"values_compared": 0
"values_compared": 44
},
{
"deferred": {
@@ -10367,17 +10283,18 @@
}
],
"cases_both_errored": 0,
"cases_deferred": 247,
"cases_deferred": 226,
"cases_failed": 0,
"cases_passed": 925,
"cases_passed": 946,
"cases_total": 1172,
"deferred_by_unit": {
"geom.tol": 74,
"geom.tol": 61,
"harness:analytic-geometry-export": 20,
"intersect.surface_drop_lib_p3": 18,
"surface.cone_p1": 49,
"surface.sphere": 18,
"surface.surf_of_extrusion_p2": 41,
"topology.face_p2": 45
"topology.face_p2": 19
},
"max_rel_err": 0.0,
"pass": true,
File diff suppressed because it is too large Load Diff
+5 -6
View File
@@ -4251,8 +4251,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmEdge::GetCurve",
"unit": "topology.edge"
},
"max_rel_err": 0.0,
"name": "curve_ellips_ts2_2d",
@@ -9858,8 +9858,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmEdge::GetCurve",
"unit": "topology.edge"
},
"max_rel_err": 0.0,
"name": "gen0174",
@@ -10922,8 +10922,7 @@
"curve.crv_on_surf": 5,
"intersect.surface_drop_lib_p3": 17,
"query.face_p1": 4,
"topology.edge": 5,
"topology.face_p2": 2
"topology.edge": 7
},
"max_rel_err": 0.0,
"pass": true,
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -2615,7 +2615,7 @@
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/surface.cone_p1/review.json#66 (upstream review adversarial)",
"values_compared": 2
"values_compared": 58
},
{
"max_rel_err": 0.0,
@@ -3055,7 +3055,7 @@
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/surface.cone_p1/review.json#121 (upstream review adversarial)",
"values_compared": 2
"values_compared": 58
},
{
"max_rel_err": 0.0,
@@ -3495,7 +3495,7 @@
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/surface.cone_p1/review.json#176 (upstream review adversarial)",
"values_compared": 2
"values_compared": 58
},
{
"max_rel_err": 0.0,
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+129 -205
View File
@@ -2127,8 +2127,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_Mouse",
@@ -2219,8 +2219,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_Endcap",
@@ -2231,8 +2231,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_Endcap_lim",
@@ -2327,8 +2327,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_box_with_large_fillet_lim",
@@ -2411,8 +2411,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_cone",
@@ -2423,8 +2423,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_cone_lim",
@@ -2599,8 +2599,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_ellips_ts2",
@@ -2875,8 +2875,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_sphere",
@@ -2887,8 +2887,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_sphere_lim",
@@ -2971,8 +2971,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_surf_extrude",
@@ -2983,8 +2983,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_surf_extrude_lim",
@@ -3067,8 +3067,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_surf_rev",
@@ -3079,8 +3079,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_surf_rev_lim",
@@ -3163,8 +3163,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_surf_sphere150",
@@ -3175,8 +3175,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_surf_sphere150_lim",
@@ -3259,8 +3259,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_torus",
@@ -3271,8 +3271,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_torus_lim",
@@ -3355,8 +3355,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_toruswvy",
@@ -3367,8 +3367,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_toruswvy_lim",
@@ -3451,8 +3451,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_vase_rev",
@@ -3463,8 +3463,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "rayfire_vase_rev_lim",
@@ -5282,28 +5282,20 @@
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_Mouse_102_1_1",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#44 (upstream upstream/TestFiles/pt_TestFiles/Mouse.smb)",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_Mouse_102_1_2",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#45 (upstream upstream/TestFiles/pt_TestFiles/Mouse.smb)",
"values_compared": 0
"values_compared": 3
},
{
"max_rel_err": 0.0,
@@ -5642,28 +5634,20 @@
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_box_with_large_fillet_102_2_1",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#82 (upstream upstream/TestFiles/pt_TestFiles/box_with_large_fillet.smb)",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_box_with_large_fillet_102_2_2",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#83 (upstream upstream/TestFiles/pt_TestFiles/box_with_large_fillet.smb)",
"values_compared": 0
"values_compared": 3
},
{
"max_rel_err": 0.0,
@@ -6626,76 +6610,52 @@
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_surf_extrude_102_0_1",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#204 (upstream upstream/TestFiles/pt_TestFiles/surf_extrude.smb)",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_surf_extrude_102_0_2",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#205 (upstream upstream/TestFiles/pt_TestFiles/surf_extrude.smb)",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_surf_extrude_102_1_1",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#206 (upstream upstream/TestFiles/pt_TestFiles/surf_extrude.smb)",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_surf_extrude_102_1_2",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#207 (upstream upstream/TestFiles/pt_TestFiles/surf_extrude.smb)",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_surf_extrude_102_2_1",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#208 (upstream upstream/TestFiles/pt_TestFiles/surf_extrude.smb)",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_surf_extrude_102_2_2",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#209 (upstream upstream/TestFiles/pt_TestFiles/surf_extrude.smb)",
"values_compared": 0
"values_compared": 3
},
{
"max_rel_err": 0.0,
@@ -7034,16 +6994,12 @@
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_surf_sphere150_104_0_1",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#252 (upstream upstream/TestFiles/pt_TestFiles/surf_sphere150.smb)",
"values_compared": 0
"values_compared": 3
},
{
"max_rel_err": 0.0,
@@ -7054,16 +7010,12 @@
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_surf_sphere150_104_1_1",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#254 (upstream upstream/TestFiles/pt_TestFiles/surf_sphere150.smb)",
"values_compared": 0
"values_compared": 3
},
{
"max_rel_err": 0.0,
@@ -7074,16 +7026,12 @@
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_surf_sphere150_104_2_1",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#256 (upstream upstream/TestFiles/pt_TestFiles/surf_sphere150.smb)",
"values_compared": 0
"values_compared": 3
},
{
"max_rel_err": 0.0,
@@ -7494,28 +7442,20 @@
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_vase_rev_104_1_1",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#308 (upstream upstream/TestFiles/pt_TestFiles/vase_rev.smb)",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_vase_rev_104_1_2",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#309 (upstream upstream/TestFiles/pt_TestFiles/vase_rev.smb)",
"values_compared": 0
"values_compared": 3
},
{
"max_rel_err": 0.0,
@@ -8526,28 +8466,20 @@
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_surf_extrude_102_unknown_orient",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#432 (upstream upstream/TestFiles/pt_TestFiles/surf_extrude.smb)",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_surf_extrude_102_extrapolated",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#433 (upstream upstream/TestFiles/pt_TestFiles/surf_extrude.smb)",
"values_compared": 0
"values_compared": 3
},
{
"max_rel_err": 0.0,
@@ -8726,28 +8658,20 @@
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_surf_sphere150_104_unknown_orient",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#456 (upstream upstream/TestFiles/pt_TestFiles/surf_sphere150.smb)",
"values_compared": 0
"values_compared": 3
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "sector_surf_sphere150_104_extrapolated",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/sector.json#457 (upstream upstream/TestFiles/pt_TestFiles/surf_sphere150.smb)",
"values_compared": 0
"values_compared": 3
},
{
"max_rel_err": 0.0,
@@ -11471,8 +11395,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0054",
@@ -11863,8 +11787,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0100",
@@ -11883,8 +11807,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0102",
@@ -11991,8 +11915,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0114",
@@ -12231,8 +12155,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0142",
@@ -12963,8 +12887,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0232",
@@ -13151,8 +13075,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0254",
@@ -13695,8 +13619,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0320",
@@ -13767,8 +13691,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0328",
@@ -13871,8 +13795,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0339",
@@ -13891,8 +13815,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0341",
@@ -14091,8 +14015,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0365",
@@ -14355,8 +14279,8 @@
},
{
"deferred": {
"symbol": "SmTol::GetZoneTol3d(const SmObject*)",
"unit": "geom.tol"
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
},
"max_rel_err": 0.0,
"name": "gen0396",
@@ -14391,16 +14315,16 @@
}
],
"cases_both_errored": 0,
"cases_deferred": 179,
"cases_deferred": 160,
"cases_failed": 0,
"cases_passed": 1530,
"cases_passed": 1549,
"cases_total": 1709,
"deferred_by_unit": {
"geom.tol": 38,
"geom.tol": 4,
"intersect.surface_drop_lib_p3": 85,
"surface.surface_cache_p1": 20,
"topology.brep_p2": 1,
"topology.face_p2": 19,
"topology.face_p2": 34,
"topology.face_p3": 16
},
"max_rel_err": 0.0,
+49 -47
View File
@@ -295,8 +295,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmCurveClassification::ReSet",
"unit": "intersect.curve_class_p2"
},
"max_rel_err": 0.0,
"name": "read_Endcap.smb_0",
@@ -307,8 +307,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmCurveClassification::ReSet",
"unit": "intersect.curve_class_p2"
},
"max_rel_err": 0.0,
"name": "read_Endcap.smb_1",
@@ -431,8 +431,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SurfaceKind::Cone::DropPointFast callbacks",
"unit": "surface.surface_p2"
},
"max_rel_err": 0.0,
"name": "read_box_with_large_fillet.smb_0",
@@ -443,8 +443,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SurfaceKind::Cone::DropPointFast callbacks",
"unit": "surface.surface_p2"
},
"max_rel_err": 0.0,
"name": "read_box_with_large_fillet.smb_1",
@@ -567,8 +567,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SurfaceKind::Cone::DropPointFast callbacks",
"unit": "surface.surface_p2"
},
"max_rel_err": 0.0,
"name": "read_cone.smb_0",
@@ -579,8 +579,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SurfaceKind::Cone::DropPointFast callbacks",
"unit": "surface.surface_p2"
},
"max_rel_err": 0.0,
"name": "read_cone.smb_1",
@@ -703,8 +703,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmEdge::GetTolerance",
"unit": "topology.edge"
},
"max_rel_err": 0.0,
"name": "read_disk.smb_0",
@@ -715,8 +715,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmEdge::GetTolerance",
"unit": "topology.edge"
},
"max_rel_err": 0.0,
"name": "read_disk.smb_1",
@@ -843,8 +843,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmCurveClassification::ReSet",
"unit": "intersect.curve_class_p2"
},
"max_rel_err": 0.0,
"name": "read_ellips_ts2.smb_0",
@@ -855,8 +855,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmCurveClassification::ReSet",
"unit": "intersect.curve_class_p2"
},
"max_rel_err": 0.0,
"name": "read_ellips_ts2.smb_1",
@@ -979,8 +979,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface (non-B-spline) in SmCrvOnSurf",
"unit": "curve.crv_on_surf"
},
"max_rel_err": 0.0,
"name": "read_plane_circ.smb_0",
@@ -991,8 +991,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface (non-B-spline) in SmCrvOnSurf",
"unit": "curve.crv_on_surf"
},
"max_rel_err": 0.0,
"name": "read_plane_circ.smb_1",
@@ -1115,8 +1115,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface (non-B-spline) in SmCrvOnSurf",
"unit": "curve.crv_on_surf"
},
"max_rel_err": 0.0,
"name": "read_plane_square.smb_0",
@@ -1127,8 +1127,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface (non-B-spline) in SmCrvOnSurf",
"unit": "curve.crv_on_surf"
},
"max_rel_err": 0.0,
"name": "read_plane_square.smb_1",
@@ -1523,8 +1523,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface (non-B-spline) in SmCrvOnSurf",
"unit": "curve.crv_on_surf"
},
"max_rel_err": 0.0,
"name": "read_surf_rev.smb_0",
@@ -1535,8 +1535,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmSurface (non-B-spline) in SmCrvOnSurf",
"unit": "curve.crv_on_surf"
},
"max_rel_err": 0.0,
"name": "read_surf_rev.smb_1",
@@ -1799,8 +1799,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmFace::HasSeamProblem",
"unit": "topology.face_p4"
},
"max_rel_err": 0.0,
"name": "read_torus.smb_0",
@@ -1811,8 +1811,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmFace::HasSeamProblem",
"unit": "topology.face_p4"
},
"max_rel_err": 0.0,
"name": "read_torus.smb_1",
@@ -1939,8 +1939,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmFace::HasSeamProblem",
"unit": "topology.face_p4"
},
"max_rel_err": 0.0,
"name": "read_toruswvy.smb_0",
@@ -1951,8 +1951,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmFace::HasSeamProblem",
"unit": "topology.face_p4"
},
"max_rel_err": 0.0,
"name": "read_toruswvy.smb_1",
@@ -2079,8 +2079,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmFace::HasSeamProblem",
"unit": "topology.face_p4"
},
"max_rel_err": 0.0,
"name": "read_vase_rev.smb_0",
@@ -2091,8 +2091,8 @@
},
{
"deferred": {
"symbol": "SmFace::GetTolerance",
"unit": "topology.face_p2"
"symbol": "SmFace::HasSeamProblem",
"unit": "topology.face_p4"
},
"max_rel_err": 0.0,
"name": "read_vase_rev.smb_1",
@@ -2849,14 +2849,16 @@
"cases_total": 316,
"deferred_by_unit": {
"cpp-guard:ub-165": 3,
"curve.crv_on_surf": 2,
"curve.crv_on_surf": 8,
"curve.curve_p6": 2,
"surface.surface_p2": 8,
"intersect.curve_class_p2": 4,
"surface.surface_p2": 12,
"topology.brep_p3": 36,
"topology.brep_p4": 1,
"topology.brep_p6": 2,
"topology.brep_p9": 2,
"topology.face_p2": 22
"topology.edge": 2,
"topology.face_p4": 6
},
"max_rel_err": 0.0,
"pass": true,
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff