intersect.surface_drop_lib_p1: second review fixes

- Generator back to main's buckets (88..=98 iso, 99 plane line) so every
  generated case keeps its inputs; the wider trim generator runs as 400
  fixed-seed cases trim0000..trim0399 appended after the 1500.
- Wire the surface cache iso curves of planes and surfaces of revolution
  (SmPlane / SmSurfOfRevolution::CreateIsoParametricCurve), taking PR #270's
  surface_cache/p1.rs and caller changes unchanged, plus the plane branch of
  GetIsoBoundaryCurves (gen0072 of surface_intersector_p5 passes here thanks
  to the ComputeSingularityPoint dispatch fix).
- Trim record carries each UV curve's GetType(); the shim writes a
  NULL_CURVE sentinel for a NULL entry.
- surface.plane_p2 and surface.surface_cache_p3 promoted to green; notes,
  findings and reports updated.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pfe7dodPG5rpuN9B8QcnuX
This commit is contained in:
bherbruck
2026-10-21 03:45:16 -04:00
parent 291637cc56
commit c70653a63b
29 changed files with 8237 additions and 7043 deletions
@@ -16,12 +16,13 @@
//!
//! Deferred cases: `TestSpanAccuracy` spans that reach `smsurf_IsPointOnNormal`
//! (`surface.surface_p3`), `DropAndTrimCurve`s whose trace reaches unported code
//! (the plane and surface-of-revolution iso curves of the surface cache tree,
//! `surface.surface_cache_p1`; non-plane `SmSurface::DropCurve`,
//! `intersect.surface_drop_lib_p3`), and surface evaluations of kinds whose evaluators
//! are not ported yet.
//! (an `SmCrvOnSurf` over a plane or surface of revolution, `curve.crv_on_surf`;
//! non-plane `SmSurface::DropCurve`, `intersect.surface_drop_lib_p3`; the classification
//! `ReSet` / `ConnectIntervals` stubs, `intersect.curve_class_p2`), and surface
//! evaluations of kinds whose evaluators are not ported yet.
//!
//! At least [`MIN_GENERATED`] generated cases run.
//! At least [`MIN_GENERATED`] generated cases run, then [`TRIM_CASES`] fixed-seed
//! `DropAndTrimCurve` cases (`trim0000` ..).
use serde::{Deserialize, Serialize};
use serde_json::Value;
@@ -53,13 +54,19 @@ use solidcore::topology::ObjectHandle;
use solidcore::SolidError;
use solidcore_ffi::units::intersect_surface_drop_lib_p1 as ffi;
use crate::case::CaseContext;
use crate::case::{CaseContext, CaseSource};
use crate::runner::default_cases;
use crate::{Case, HarnessError, Output, Rng, UnitDiff};
/// Generated cases per run, whatever `--seeds` says (it can only raise this).
pub const MIN_GENERATED: usize = 1500;
/// `DropAndTrimCurve` cases appended after the generated ones ([`trim_cases`]).
pub const TRIM_CASES: u64 = 400;
/// First seed of the [`trim_cases`] (seed `TRIM_SEED + i` for case `trim{i:04}`).
const TRIM_SEED: u64 = 0x5d1b_7a1c_0000_0000;
/// `intersect.surface_drop_lib_p1` runner.
pub struct Runner;
@@ -931,6 +938,8 @@ fn run_op(k: &Kernel, i: &Inputs, o: &mut Vec<f64>) -> Result<(), Fail> {
r.uv_curves.len() as f64,
]);
for cv in &r.uv_curves {
// the curve's GetType() (an SmLine or an SmBSplineCurve), then its data
o.push(cv.type_code() as f64);
let put = put_uv_curve(o, cv).ok_or_else(|| harness("trim curve kind"))?;
st(put)?.map_err(|_| harness("trim curve data"))?;
}
@@ -1744,6 +1753,31 @@ fn gen_trim_plane_line(rng: &mut Rng, k: &Kernel) -> Option<Inputs> {
})
}
/// The fixed-seed `DropAndTrimCurve` cases ([`gen_trim`]), appended after the generated
/// cases so that adding them leaves every generated case's inputs unchanged. Case `i`
/// takes the first trim input of seed `TRIM_SEED + i` that the shim accepts.
fn trim_cases(unit: &str) -> Vec<Case> {
let k = Kernel::default();
let mut out = Vec::new();
for i in 0..TRIM_CASES {
let seed = TRIM_SEED + i;
let mut rng = Rng::new(seed);
let got = (0..64).find_map(|_| {
gen_trim(&mut rng, &k).filter(|t| ffi::encode(&ffi_op(t)).is_ok())
});
let Some(inputs) = got.and_then(|t| serde_json::to_value(t).ok()) else {
continue;
};
out.push(Case {
unit: unit.to_string(),
name: format!("trim{i:04}"),
source: CaseSource::Generated { seed },
inputs,
});
}
out
}
fn gen_inputs(rng: &mut Rng) -> Inputs {
let k = Kernel::default();
loop {
@@ -1778,8 +1812,8 @@ fn gen_inputs(rng: &mut Rng) -> Inputs {
75..=78 => Some(gen_stack(rng)),
79..=83 => Some(gen_fix_curves(rng)),
84..=87 => Some(gen_dups(rng)),
88..=94 => gen_iso(rng, &k),
_ => gen_trim(rng, &k),
88..=98 => gen_iso(rng, &k),
_ => gen_trim_plane_line(rng, &k),
};
if let Some(i) = got {
if ffi::encode(&ffi_op(&i)).is_ok() {
@@ -1799,7 +1833,9 @@ impl UnitDiff for Runner {
seeds: ctx.seeds.max(MIN_GENERATED),
..ctx.clone()
};
default_cases(self, &ctx)
let mut cases = default_cases(self, &ctx)?;
cases.extend(trim_cases(self.id()));
Ok(cases)
}
fn run_cpp(&self, case: &Case) -> Result<Output, HarnessError> {
@@ -341,8 +341,13 @@ fn rust_cache(surface: Surface, t: &[NodeIn], handle: H) -> Result<SurfaceCache<
/// `type dim knot_type form has [n p m cpts(x y z w) knots] ivl[2]`.
fn put_bspline(o: &mut Vec<f64>, c: &Curve) -> Result<(), HarnessError> {
o.extend([c.type_code() as f64, c.dim() as f64]);
let CurveKind::BSpline(bs) = c.kind() else {
return Err(harness("output curve is not a B-spline"));
// the shim casts to `SmBSplineCurve`: the B-spline part of the line of a plane's iso
// curve or of the circle of a sweep's
let bs = match c.kind() {
CurveKind::BSpline(bs) => bs,
CurveKind::Line(l) => l.base(),
CurveKind::Ellipse(e) => e.base(),
_ => return Err(harness("output curve is not a B-spline kind")),
};
o.extend([
f64::from(bs.knot_type() as i32),
@@ -22,6 +22,7 @@
use serde::{Deserialize, Serialize};
use serde_json::Value;
use solidcore::curve::curve::Curve;
use solidcore::geom::extent1d::Extent1d;
use solidcore::geom::extent2d::Extent2d;
use solidcore::geom::global_solver::{Branch, GlobalSolver};
@@ -392,7 +393,9 @@ fn put_point(o: &mut Vec<f64>, p: &TracePoint) {
put_uv(o, p.curve_uv[0]);
put_uv(o, p.curve_uv[1]);
let s = &p.surface;
for v in [s[0][0], s[1][0], s[0][1], s[1][1], s[2][0], s[0][2], s[2][2]] {
for v in [
s[0][0], s[1][0], s[0][1], s[1][1], s[2][0], s[0][2], s[2][2],
] {
put_vec(o, v);
}
}
@@ -544,7 +547,7 @@ fn run_op(
OpIn::Boundary { curve, interval } => {
let c = rust_curve(curve)?;
let ivl = Extent1d::from_min_max(interval[0], interval[1]);
match st(sil.find_solutions_on_boundary_curve(k, &c, &ivl))? {
match st(sil.find_solutions_on_boundary_curve(k, &Curve::from(c), &ivl))? {
Ok(sols) => {
o.push(0.0);
o.push(sols.as_slice().len() as f64);
@@ -588,8 +591,7 @@ fn op_code(op: &OpIn) -> f64 {
fn rust(i: &Inputs) -> Result<Output, HarnessError> {
let k = Kernel::default();
let surface = rust_surface(&i.surface)?;
let mut sil = match SurfaceSilhouette::new(&surface, &ext(i.domain), i.perspective, v3(i.eye))
{
let mut sil = match SurfaceSilhouette::new(&surface, &ext(i.domain), i.perspective, v3(i.eye)) {
Ok(s) => s,
Err(e) => {
return Output::unported(&e)
@@ -687,7 +689,14 @@ fn gen_random_bspline(rng: &mut Rng, scale: f64) -> SurfData {
/// A surface given by a height function `z(x, y)` sampled on a `n1 x m1` net of degree
/// `p x q` over `[-1, 1]^2`, times `scale`.
fn height_surface(n1: usize, m1: usize, p: usize, q: usize, scale: f64, z: impl Fn(f64, f64) -> f64) -> SurfData {
fn height_surface(
n1: usize,
m1: usize,
p: usize,
q: usize,
scale: f64,
z: impl Fn(f64, f64) -> f64,
) -> SurfData {
let net = (0..n1)
.map(|i| {
(0..m1)
@@ -744,7 +753,9 @@ fn gen_bspline(rng: &mut Rng, scale: f64) -> SurfData {
// parabolic cylinder: zero Gaussian curvature
2 => height_surface(4, 3, 2, 2, scale, |x, _| 0.5 * x * x),
// monkey-saddle-like wave: curvature sign changes
3 => height_surface(6, 6, 3, 3, scale, |x, y| 0.3 * (x * x * x - 3.0 * x * y * y)),
3 => height_surface(6, 6, 3, 3, scale, |x, y| {
0.3 * (x * x * x - 3.0 * x * y * y)
}),
4 => quarter_cylinder(scale),
_ => gen_random_bspline(rng, scale),
}
@@ -26,7 +26,9 @@ use solidcore::curve::curve::{Curve, CurveKind};
use solidcore::curve::line::Line;
use solidcore::geom::extent1d::Extent1d;
use solidcore::geom::extent2d::Extent2d;
use solidcore::geom::solution_array::{ObjectKind, Solution, SolutionArray, SolutionObject, SolutionType};
use solidcore::geom::solution_array::{
ObjectKind, Solution, SolutionArray, SolutionObject, SolutionType,
};
use solidcore::geom::vector2d::{Point2, Vec2};
use solidcore::geom::vector3d::{Point3, Vec3};
use solidcore::intersect::surface_tracer::{
@@ -324,8 +326,15 @@ fn rust_curve(c: &CurveIn) -> Result<Curve, HarnessError> {
.map_err(|e| harness(format!("segment: {e}"))),
CurveIn::Bspline(d) => {
let pw: Vec<CPoint> = d.cpts.iter().map(cpoint).collect();
let n = pw.len().checked_sub(1).ok_or_else(|| harness("empty curve"))?;
let m = d.knots.len().checked_sub(1).ok_or_else(|| harness("no knots"))?;
let n = pw
.len()
.checked_sub(1)
.ok_or_else(|| harness("empty curve"))?;
let m = d
.knots
.len()
.checked_sub(1)
.ok_or_else(|| harness("no knots"))?;
BSplineCurve::from_data(3, n, m, d.p, &pw, &d.knots)
.map(Curve::from)
.map_err(|e| harness(format!("B-spline: {e}")))
@@ -471,7 +480,7 @@ impl<'s> SurfaceTrace<'s> for SectionTracer<'s> {
fn find_solutions_on_boundary_curve(
&self,
_k: &Kernel,
boundary: &BSplineCurve,
boundary: &Curve,
interval: &Extent1d,
_side: usize,
_param: SurfParamType,
@@ -182,8 +182,13 @@ fn no_face() -> i64 {
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "p", rename_all = "snake_case")]
enum ProgIn {
Find { class: u8, stack: Vec<usize> },
Region { node: usize },
Find {
class: u8,
stack: Vec<usize>,
},
Region {
node: usize,
},
Mark,
Set {
node: usize,
@@ -192,7 +197,9 @@ enum ProgIn {
face: i64,
},
Dump,
FirstPatch { node: usize },
FirstPatch {
node: usize,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -297,7 +304,10 @@ struct Inputs {
fn numbers(path: &str) -> Result<Vec<f64>, HarnessError> {
let text = std::fs::read_to_string(path).map_err(|e| harness(format!("{path}: {e}")))?;
text.split_whitespace()
.map(|t| t.parse::<f64>().map_err(|e| harness(format!("{path}: {e}"))))
.map(|t| {
t.parse::<f64>()
.map_err(|e| harness(format!("{path}: {e}")))
})
.collect()
}
@@ -314,7 +324,10 @@ fn int(path: &str, v: f64) -> Result<usize, HarnessError> {
pub(crate) fn read_sms(path: &str) -> Result<InlineSrf, HarnessError> {
let v = numbers(path)?;
let mut it = v.into_iter();
let mut num = || it.next().ok_or_else(|| harness(format!("{path}: truncated")));
let mut num = || {
it.next()
.ok_or_else(|| harness(format!("{path}: truncated")))
};
let n = int(path, num()?)?;
let m = int(path, num()?)?;
let p = int(path, num()?)?;
@@ -330,8 +343,12 @@ pub(crate) fn read_sms(path: &str) -> Result<InlineSrf, HarnessError> {
}
net.push(row);
}
let u = (0..n + p + 2).map(|_| num()).collect::<Result<Vec<_>, _>>()?;
let v = (0..m + q + 2).map(|_| num()).collect::<Result<Vec<_>, _>>()?;
let u = (0..n + p + 2)
.map(|_| num())
.collect::<Result<Vec<_>, _>>()?;
let v = (0..m + q + 2)
.map(|_| num())
.collect::<Result<Vec<_>, _>>()?;
Ok(InlineSrf { net, p, q, u, v })
}
@@ -343,9 +360,15 @@ pub(crate) fn srf(s: &SrfIn) -> Result<InlineSrf, HarnessError> {
}
pub(crate) fn shape(s: &InlineSrf) -> Result<(usize, usize), HarnessError> {
let n = s.net.len().checked_sub(1).ok_or_else(|| harness("empty net"))?;
let n = s
.net
.len()
.checked_sub(1)
.ok_or_else(|| harness("empty net"))?;
let cols = s.net.first().map_or(0, Vec::len);
let m = cols.checked_sub(1).ok_or_else(|| harness("empty net row"))?;
let m = cols
.checked_sub(1)
.ok_or_else(|| harness("empty net row"))?;
if s.net.iter().any(|r| r.len() != cols) {
return Err(harness("net rows differ in length"));
}
@@ -361,8 +384,15 @@ pub(crate) fn flag(b: bool) -> f64 {
pub(crate) fn push_srf(o: &mut Vec<f64>, s: &InlineSrf) -> Result<(), HarnessError> {
let (n, m) = shape(s)?;
o.extend(
[n, m, s.p, s.q, s.u.len().saturating_sub(1), s.v.len().saturating_sub(1)]
.map(|x| x as f64),
[
n,
m,
s.p,
s.q,
s.u.len().saturating_sub(1),
s.v.len().saturating_sub(1),
]
.map(|x| x as f64),
);
for row in &s.net {
for p in row {
@@ -559,8 +589,12 @@ fn cpp_input(i: &Inputs) -> Result<(Op, Vec<f64>), HarnessError> {
}
fn to_output(flat: &[f64]) -> Output {
let (status, rest) = flat.split_first().map_or((f64::NAN, &[][..]), |(s, r)| (*s, r));
Output::new().values("status", vec![status]).values("out", rest.to_vec())
let (status, rest) = flat
.split_first()
.map_or((f64::NAN, &[][..]), |(s, r)| (*s, r));
Output::new()
.values("status", vec![status])
.values("out", rest.to_vec())
}
fn cpp(i: &Inputs) -> Result<Output, HarnessError> {
@@ -575,7 +609,11 @@ pub(crate) fn surface_of(s: &InlineSrf) -> Result<NlSurface, HarnessError> {
let net = s
.net
.iter()
.map(|r| r.iter().map(|&[x, y, z, w]| CPoint::new(x, y, z, w)).collect())
.map(|r| {
r.iter()
.map(|&[x, y, z, w]| CPoint::new(x, y, z, w))
.collect()
})
.collect();
NlSurface::new(net, s.p, s.q, s.u.clone(), s.v.clone())
.map_err(|e| harness(format!("surface input: {e}")))
@@ -708,6 +746,18 @@ fn dump_curve(o: &mut Vec<f64>, c: &BSplineCurve) {
}
}
/// An iso curve as the shim dumps it: the NURB of its `SmBSplineCurve` part (the base of
/// the `SmLine` of a plane or of the `SmCircle` of a sweep).
fn dump_iso_curve(o: &mut Vec<f64>, c: &SmCurve) -> Result<(), HarnessError> {
match c.kind() {
CurveKind::BSpline(b) => dump_curve(o, b),
CurveKind::Line(l) => dump_curve(o, l.base()),
CurveKind::Ellipse(e) => dump_curve(o, e.base()),
_ => return Err(harness("iso curve is not a B-spline kind")),
}
Ok(())
}
fn dump_curve_list(o: &mut Vec<f64>, l: Option<&Vec<SmCurve>>) -> Result<(), HarnessError> {
let Some(l) = l else {
o.push(0.0);
@@ -870,7 +920,7 @@ fn rust_op(i: &Inputs) -> Result<Run, HarnessError> {
match bp.create_boundary_curve_for_index(&k, &surface, *index) {
Ok(c) => {
o.push(0.0);
dump_curve(&mut o, &c);
dump_iso_curve(&mut o, &c)?;
}
Err(e) if e.is_unported() => return Ok(Err(e)),
Err(e) => o.push(status(&e)),
@@ -984,7 +1034,8 @@ fn rust_op(i: &Inputs) -> Result<Run, HarnessError> {
o.push(copies.curves_3d.as_ref().map_or(0.0, |v| v.len() as f64));
o.push(copies.curves_uv.as_ref().map_or(0.0, |v| v.len() as f64));
}
match cache.has_cached_curves(alt_type(q.ty), q.approx, q.angle, &key, q.w3, q.wuv) {
match cache.has_cached_curves(alt_type(q.ty), q.approx, q.angle, &key, q.w3, q.wuv)
{
Ok(Some(c)) => {
o.push(1.0);
dump_curve_list(&mut o, c.curves_3d.as_ref())?;
@@ -1102,7 +1153,9 @@ fn rust_op(i: &Inputs) -> Result<Run, HarnessError> {
face,
} => {
let t = cache.tree_mut().ok_or_else(|| harness("no tree"))?;
let n = t.node_mut(NodeId(*node)).map_err(|e| harness(e.to_string()))?;
let n = t
.node_mut(NodeId(*node))
.map_err(|e| harness(e.to_string()))?;
if let NodeData::Surface(a) = &mut n.data {
a.is_marked = *marked;
a.node_class = class_of(*class)?;
@@ -1122,7 +1175,11 @@ fn rust_op(i: &Inputs) -> Result<Run, HarnessError> {
match cache.first_bezier_patch(NodeId(*node)) {
Ok(None) => o.push(0.0),
Ok(Some(p)) => {
o.push(if own.is_some_and(|q| std::ptr::eq(p, q)) { 1.0 } else { 2.0 });
o.push(if own.is_some_and(|q| std::ptr::eq(p, q)) {
1.0
} else {
2.0
});
}
Err(e) => return Err(harness(format!("first patch: {e}"))),
}
@@ -1144,8 +1201,14 @@ fn rust_op(i: &Inputs) -> Result<Run, HarnessError> {
}
OpIn::Cont { u, v, dom } => {
let mut cache = cache_of(need()?, None);
let uc = u.iter().map(|&c| continuity_of(c)).collect::<Result<Vec<_>, _>>()?;
let vc = v.iter().map(|&c| continuity_of(c)).collect::<Result<Vec<_>, _>>()?;
let uc = u
.iter()
.map(|&c| continuity_of(c))
.collect::<Result<Vec<_>, _>>()?;
let vc = v
.iter()
.map(|&c| continuity_of(c))
.collect::<Result<Vec<_>, _>>()?;
cache.set_continuities(uc, vc);
cache.surface_continuity(&dom_of(*dom)).map(|c| {
o.push(f64::from(c as i32));
@@ -1160,7 +1223,7 @@ fn rust_op(i: &Inputs) -> Result<Run, HarnessError> {
o.push(0.0);
o.push(flag(r.cached));
for c in &r.curves {
dump_curve(&mut o, c);
dump_iso_curve(&mut o, c)?;
}
}
Err(e) if e.is_unported() => return Ok(Err(e)),
@@ -1204,7 +1267,9 @@ fn rust_op(i: &Inputs) -> Result<Run, HarnessError> {
o.push(st(cache.implant_poly_edge(0, NodeId(0))));
push_dom(&mut o, &cache.uv_domain());
o.push(1.0);
o.push(flag(cache.patch_boundary_bounding_planes().are_planes_computed()));
o.push(flag(
cache.patch_boundary_bounding_planes().are_planes_computed(),
));
Ok(o)
}
OpIn::Face => {
@@ -1222,9 +1287,7 @@ fn rust(i: &Inputs) -> Result<Output, HarnessError> {
let run = rust_op(i)?;
let is_subdiv = matches!(i.op, OpIn::Subdiv { .. });
Ok(match run {
Ok(o) if is_subdiv => Output::new()
.values("status", vec![0.0])
.values("out", o),
Ok(o) if is_subdiv => Output::new().values("status", vec![0.0]).values("out", o),
Ok(o) => to_output(&o),
Err(e) => Output::unported(&e).unwrap_or_else(|| to_output(&[status(&e)])),
})
@@ -1275,7 +1338,11 @@ pub(crate) fn gen_srf(rng: &mut Rng, max_deg: usize) -> InlineSrf {
let n = p + rng.below(3) as usize;
let m = q + rng.below(3) as usize;
let kind = rng.below(5);
let amp = if kind == 1 { 0.0 } else { rng.uniform(0.0, 1.0) };
let amp = if kind == 1 {
0.0
} else {
rng.uniform(0.0, 1.0)
};
let rational = rng.chance(0.15);
let net = (0..=n)
.map(|i| {
@@ -1326,7 +1393,11 @@ pub(crate) fn gen_srf(rng: &mut Rng, max_deg: usize) -> InlineSrf {
pub(crate) fn gen_bss(rng: &mut Rng, s: InlineSrf) -> BssIn {
BssIn {
oob: rng.chance(0.1),
form: if rng.chance(0.85) { 11 } else { rng.below(10) as u8 },
form: if rng.chance(0.85) {
11
} else {
rng.below(10) as u8
},
srf: SrfIn::Inline(s),
}
}
@@ -1335,7 +1406,14 @@ pub(crate) fn gen_curve(rng: &mut Rng) -> CrvIn {
let p = 1 + rng.below(3) as usize;
let n = p + rng.below(3) as usize;
let cpts = (0..=n)
.map(|i| [i as f64, rng.uniform(-1.0, 1.0), rng.uniform(-1.0, 1.0), NOW])
.map(|i| {
[
i as f64,
rng.uniform(-1.0, 1.0),
rng.uniform(-1.0, 1.0),
NOW,
]
})
.collect();
CrvIn {
dim: 3,
@@ -1369,11 +1447,7 @@ pub(crate) fn gen_sub_dom(rng: &mut Rng, d: [f64; 4]) -> [f64; 4] {
}
pub(crate) fn gvec(rng: &mut Rng, s: f64) -> [f64; 3] {
[
rng.uniform(-s, s),
rng.uniform(-s, s),
rng.uniform(-s, s),
]
[rng.uniform(-s, s), rng.uniform(-s, s), rng.uniform(-s, s)]
}
pub(crate) fn gen_key(rng: &mut Rng) -> KeyIn {
@@ -1390,7 +1464,11 @@ pub(crate) fn gen_key(rng: &mut Rng) -> KeyIn {
pub(crate) fn perturb_key(rng: &mut Rng, k: &KeyIn) -> KeyIn {
let mut q = k.clone();
match rng.below(6) {
0 => q.vec = q.vec.map(|v| [v[0] + rng.uniform(-1e-12, 1e-12), v[1], v[2]]),
0 => {
q.vec = q
.vec
.map(|v| [v[0] + rng.uniform(-1e-12, 1e-12), v[1], v[2]]);
}
1 => q.b = None,
2 => q.l = q.l.map(|l| l + 1),
3 => q.d = q.d.map(|d| d + rng.uniform(-2e-12, 2e-12)),
@@ -1435,7 +1513,11 @@ fn gen_tree(rng: &mut Rng, dom: [f64; 4], polar: bool) -> Vec<NodeIn> {
node.c2 = n + 1;
node.split = split;
node.aux = aux;
let f = if rng.chance(0.7) { 0.5 } else { rng.uniform(0.2, 0.8) };
let f = if rng.chance(0.7) {
0.5
} else {
rng.uniform(0.2, 0.8)
};
let (d1, d2) = if split == 0 {
let m = d[0] + f * (d[2] - d[0]);
([d[0], d[1], m, d[3]], [m, d[1], d[2], d[3]])
@@ -1489,7 +1571,9 @@ fn gen_prog(rng: &mut Rng, t: &[NodeIn]) -> Vec<ProgIn> {
stack: if rng.chance(0.6) {
vec![0]
} else {
(0..=rng.below(3)).map(|_| rng.below(n as u64) as usize).collect()
(0..=rng.below(3))
.map(|_| rng.below(n as u64) as usize)
.collect()
},
},
1 | 2 => ProgIn::Region {
@@ -1598,7 +1682,12 @@ fn gen_case(rng: &mut Rng) -> Inputs {
c: if rng.chance(0.15) {
[[1.0, 1.0, 1.0]; 4]
} else {
[gvec(rng, 3.0), gvec(rng, 3.0), gvec(rng, 3.0), gvec(rng, 3.0)]
[
gvec(rng, 3.0),
gvec(rng, 3.0),
gvec(rng, 3.0),
gvec(rng, 3.0),
]
},
},
7 => OpIn::SizeSurf {
@@ -1671,7 +1760,11 @@ fn gen_case(rng: &mut Rng) -> Inputs {
let cache = gen_sub_dom(rng, d);
let calls = (0..=rng.below(4))
.map(|_| {
let dd = if rng.chance(0.6) { cache } else { gen_sub_dom(rng, d) };
let dd = if rng.chance(0.6) {
cache
} else {
gen_sub_dom(rng, d)
};
(dd, *rng.choose(&[0.001, 0.01, 0.0005]).unwrap_or(&0.001))
})
.collect();
@@ -1681,7 +1774,9 @@ fn gen_case(rng: &mut Rng) -> Inputs {
let sub = gen_sub_dom(rng, d);
let tree = gen_tree(rng, sub, true);
let n = tree.len();
let nodes = (0..=rng.below(4)).map(|_| rng.below(n as u64) as usize).collect();
let nodes = (0..=rng.below(4))
.map(|_| rng.below(n as u64) as usize)
.collect();
OpIn::Polar { tree, nodes }
}
_ => match rng.below(3) {
@@ -1692,7 +1787,10 @@ fn gen_case(rng: &mut Rng) -> Inputs {
_ => OpIn::Misc {
dom: gen_sub_dom(rng, d),
test: rng.chance(0.5),
uv: [rng.uniform(d[0] - 0.5, d[2] + 0.5), rng.uniform(d[1] - 0.5, d[3] + 0.5)],
uv: [
rng.uniform(d[0] - 0.5, d[2] + 0.5),
rng.uniform(d[1] - 0.5, d[3] + 0.5),
],
},
},
};
@@ -1768,8 +1866,19 @@ mod tests {
println!("{k:?}: {v}");
}
for op in [
"Plane3", "Halfspace", "BPlanes", "SizeCorners", "SizeSurf", "Corners", "Alt",
"TreeTop", "Subdiv", "Cont", "Iso", "Misc", "Cull",
"Plane3",
"Halfspace",
"BPlanes",
"SizeCorners",
"SizeSurf",
"Corners",
"Alt",
"TreeTop",
"Subdiv",
"Cont",
"Iso",
"Misc",
"Cull",
] {
assert!(
tally.keys().any(|(n, k)| n == op && k == "status:0"),
@@ -27,7 +27,10 @@
//! | `FixCurves` | `sm_FixBoundaryCurves(poly, dom, tx, ty, change = FALSE)` | `change poly` |
//! | `Dups` | `sm_RemoveDuplicateDropPointSolutions` (`m_vStart = (u, v)`, value = index) | `count (index u v)*` |
//! | `Iso` | `DropIsoCurve` | `status [ok max_drop max_dev has [curve]]` |
//! | `Trim` | `DropAndTrimCurve(.., keep, on_surface, NULL)` | `status [max_drop max_dev n curves]` |
//! | `Trim` | `DropAndTrimCurve(.., keep, on_surface, NULL)` | `status [max_drop max_dev n (type curve)*]` |
//!
//! In `Trim`, each curve is its `GetType()` followed by its data, or the single value
//! [`NULL_CURVE`] for a `NULL` entry.
//!
//! A surface of revolution whose `CreateCanonical` fails makes the record
//! [[`NO_SURFACE`]]. [`run`] accepts only finite inputs of magnitude at most
@@ -65,6 +68,8 @@ pub const NOW: f64 = -f64::MAX;
pub const REJECTED: f64 = -2.0;
/// The record of an op whose surface of revolution could not be made.
pub const NO_SURFACE: f64 = -3.0;
/// The `Trim` entry of a `NULL` curve (in place of its type and data).
pub const NULL_CURVE: f64 = -4.0;
/// Values per drop point.
pub const PT_LEN: usize = 38;
@@ -985,7 +985,7 @@ impl<'s> SurfaceDropCurve<'s> {
// Add TargetSurface natural boundary curves to sIsoCurves array
let iso = cache.iso_boundary_curves(k, &uv_domain, cci_tol / 3.0)?;
let mut iso_curves: Vec<Curve> = iso.curves.iter().cloned().map(Curve::from).collect();
let mut iso_curves: Vec<Curve> = iso.curves.to_vec();
// add every Surface U internal continuity boundary to sIsoCurves array
let u_conts: Vec<ContinuityType> = cache.u_continuities().to_vec();
@@ -327,8 +327,8 @@ impl SurfaceIntersector<'_> {
// Intersect Curves
let ivl1 = bsc1.natural_interval();
let ivl2 = bsc2.natural_interval();
let crv1 = Curve::from(bsc1.clone());
let crv2 = Curve::from(bsc2);
let crv1 = bsc1.clone();
let crv2 = bsc2;
let opts = CurveIntersectOptions {
skip_global_coincidence_check: false,
handles: [
@@ -371,7 +371,9 @@ impl SurfaceIntersector<'_> {
if trim_ivl1.length() > EFF_ZERO {
// copy and trim the Surf1->NaturalBoundaryCurve (status
// ignored; may snap the interval to knots)
let mut bsc = bsc1.clone();
// (`new SmBSplineCurve(*pBSC1)`: a plain B-spline copy)
let mut bsc =
crate::surface::surface_cache::p1::copy_as_bspline(&bsc1)?;
ignored(bsc.trim(k, &mut trim_ivl1, TrimMode::Notify))?;
// get SurfacePoints for each interval endPoint
@@ -430,7 +432,7 @@ impl SurfaceIntersector<'_> {
};
// output the curve
out.curves_3d.push(Curve::from(bsc));
out.curves_3d.push(bsc);
out.curve_types.push(ty);
out.deviations
.push(max2(sol.start.solution_value, sol.end.solution_value));
@@ -1733,7 +1735,7 @@ mod tests {
}
#[test]
fn plane_boundary_test_needs_plane_iso_curves() {
fn plane_boundary_test_of_perpendicular_planes_is_unknown() {
let (a, b) = two_planes();
let d = Extent2d::from_bounds(0.0, 0.0, 1.0, 1.0);
let si = SurfaceIntersector::new(&a, &d, &b, &d, false).unwrap();
@@ -1743,6 +1745,8 @@ mod tests {
let mut out = TsectCurves::default();
let bbox = Extent3d::from_bounds(0.0, 0.0, 0.0, 1.0, 1.0, 1.0);
let r = si.do_boundary_plane_test(&k, &mut p1, &mut p2, 1e-3, &bbox, &mut out);
assert!(matches!(r, Err(e) if e.is_unported()));
// (the bounding planes of a plane go through `SmPlane::CreateIsoParametricCurve`,
// surface.plane_p1, ported): no pair of boundary planes has opposite normals
assert_eq!(r.unwrap(), BoundaryPlaneTestResult::Unknown);
}
}
@@ -368,19 +368,21 @@ impl SurfaceIntersector<'_> {
// BoundaryCurve BBox + Tol
let boxes = tgt.calculate_bounding_box(
k,
&bsc_ivl,
BoundingBoxRequest {
normal: true,
pseudo: false,
polar: false,
},
true,
)?;
let mut bbox = boxes.normal.unwrap_or_default();
bbox.expand_absolute(self.this_approx_tol_3d);
// when the intersection box meets the boundary curve box, intersect
// OtherSurface with ThisSurface->BoundaryCurve
let tgt_curve = Curve::from(tgt.clone());
let tgt_curve = tgt.clone();
let solutions = if bbox.are_disjoint(intersection_box, 0.0) {
Vec::new()
} else {
@@ -610,7 +612,7 @@ impl SurfaceIntersector<'_> {
fn use_boundary_point(
&mut self,
k: &Kernel,
tgt: &BSplineCurve,
tgt: &Curve,
sol: &Solution<()>,
uvs: [Point2; 2],
mut tsp: TsectPnt,
@@ -663,7 +665,7 @@ impl SurfaceIntersector<'_> {
&mut self,
k: &Kernel,
caches: &[SurfaceCache<O>],
tgt: &BSplineCurve,
tgt: &Curve,
sol: &Solution<()>,
l_side: usize,
out: &mut TsectCurves,
@@ -672,7 +674,8 @@ impl SurfaceIntersector<'_> {
let tol = self.this_approx_tol_3d;
// copy and trim the boundary curve (may snap the interval to knots)
let mut result = Curve::from(tgt.clone());
// (`new SmBSplineCurve(*pTgtBSC)`: a plain B-spline copy)
let mut result = crate::surface::surface_cache::p1::copy_as_bspline(tgt)?;
let mut trim_ivl = Extent1d::from_min_max(par(&sol.start, 0), par(&sol.end, 0));
result.trim(k, &mut trim_ivl, TrimMode::Notify)?;
out.curves_3d.push(result);
@@ -1353,10 +1353,13 @@ mod tests {
let b = plane([0.0, 0.5, -0.5], [1.0, 0.0, 0.0], [0.0, 0.0, 1.0]);
let mut si = SurfaceIntersector::new(&a, &unit(), &b, &unit(), false).unwrap();
assert!(matches!(
si.find_interior_curves(&k, &mut out),
Err(SolidError::Unported { .. })
));
// the node pairs of the global solve reach the local intersection (ported, with the
// plane iso curves): it succeeds, or stops at an unported callee; the curves it
// found are not those of the check below
let mut first = TsectCurves::default();
if let Err(e) = si.find_interior_curves(&k, &mut first) {
assert!(e.is_unported(), "{e}");
}
// a pair next to a curve already found is skipped
out.curves_3d.push(Curve::from(
crate::curve::line::Line::create_line_segment(
@@ -75,7 +75,6 @@ use crate::intersect::surface_tracer::{
};
use crate::kernel::Kernel;
use crate::math::{BIG_DOUBLE, EFF_ZERO, EFF_ZERO_SQ, EFF_ZERO_SQRT, PI};
use crate::nurbs::b_spline_curve::BSplineCurve;
use crate::nurbs::b_spline_surface::SurfParamType;
use crate::nurbs::b_spline_surface_n_lib::p2::EvaluateFlags;
use crate::nurbs::knots::Side;
@@ -303,7 +302,7 @@ impl<'s> SurfaceSilhouette<'s> {
pub fn find_solutions_on_boundary_curve(
&self,
k: &Kernel,
boundary: &BSplineCurve,
boundary: &Curve,
interval: &Extent1d,
) -> Result<SolutionArray<BoundaryCurve>> {
let curve_prop = if self.perspective {
@@ -318,7 +317,7 @@ impl<'s> SurfaceSilhouette<'s> {
want_comb: false,
handle: None,
};
let curve = Curve::from(boundary.clone());
let curve = boundary;
// the solutions name the curve (its cache tree's owner)
opts.handle = Some(BoundaryCurve {
natural_interval: Some(curve.natural_interval()),
@@ -1008,7 +1007,7 @@ impl<'s> SurfaceTrace<'s> for SurfaceSilhouette<'s> {
fn find_solutions_on_boundary_curve(
&self,
k: &Kernel,
boundary: &BSplineCurve,
boundary: &Curve,
interval: &Extent1d,
side: usize,
param: SurfParamType,
@@ -625,7 +625,7 @@ pub trait SurfaceTrace<'s> {
fn find_solutions_on_boundary_curve(
&self,
k: &Kernel,
boundary: &BSplineCurve,
boundary: &Curve,
interval: &Extent1d,
side: usize,
param: SurfParamType,
@@ -1731,7 +1731,8 @@ where
}
// Add a copy of this solution curve to r3DCurves.
let result = Curve::from(new_bsc.clone());
// (`new SmBSplineCurve(*pNewBSC)`: a plain B-spline copy)
let result = crate::surface::surface_cache::p1::copy_as_bspline(new_bsc)?;
let result_ivl = result.natural_interval();
out.curves_3d.push(result.clone());
@@ -86,11 +86,10 @@
//! those return [`SolidError::Unported`]. `EvaluateNormal` is
//! [`Surface::evaluate_normal`] (`surface::surface::p7`, with the plane and
//! curve-bounded overrides). An `SmPlane` is an
//! `SmBSplineSurface` upstream: the cast gives its B-spline part, and its
//! `CreateIsoParametricCurve` (an `SmLine`, which the cache cannot hold as a
//! [`BSplineCurve`] without losing the line's overrides) and the inherited
//! `CalculateBoundingBox` (which dispatches back to the plane) return
//! [`SolidError::Unported`] (`surface.plane_p1`). Where upstream
//! `SmBSplineSurface` upstream: the cast gives its B-spline part. The iso curves
//! (`CreateIsoParametricCurve`, virtual: an `SmLine` for a plane, an `SmCircle` in
//! the sweep direction of a surface of revolution) are held as [`Curve`], so the
//! derived classes' overrides stay in effect. Where upstream
//! casts with `SM_CAST_PTR(SmBSplineSurface, ...)` and `NER`s, a non-B-spline surface
//! gives `SM_ERR_NULL_POINTER`. `PointClassify` is the base class body (`SM_ERR`); the
//! trimmed surface cache overrides belong to `surface.trim_srf_cache`.
@@ -113,7 +112,7 @@
//! `GetBoundingPlane`, `GetBrep`, `GetMemoryUsed`, `AssertValid`, the `Dump` and
//! `Draw` functions (other units or debug output).
use crate::curve::curve::p2::{approximate_length, Curve, CurveKind};
use crate::curve::curve::p2::{Curve, CurveKind};
use crate::error::{ignored, Result, SolidError};
use crate::geom::extent1d::Extent1d;
use crate::geom::extent2d::Extent2d;
@@ -129,7 +128,7 @@ use crate::kernel::Kernel;
use crate::math::{Point2, Point3, Vec2, Vec3, EFF_ZERO, EFF_ZERO_SQ, EFF_ZERO_SQRT};
use crate::nurbs::b_spline_curve::BSplineCurve;
use crate::nurbs::b_spline_surface::{
BSplineSurface, BoundingBoxRequest, BoundingBoxes, IsoCurveOptions, SurfParamType,
BSplineSurface, BoundingBoxRequest, BoundingBoxes, SurfParamType,
};
use crate::nurbs::b_spline_surface_n_lib::p2::EvaluateFlags;
use crate::nurbs::math::NOW;
@@ -182,19 +181,6 @@ pub(super) fn invalid(operation: &'static str, reason: &'static str) -> SolidErr
SolidError::InvalidInput { operation, reason }
}
/// `SmPlane::CreateIsoParametricCurve` (virtual, reached through an `SmSurface` or
/// an `SmBSplineSurface` pointer): not wired into the cache.
const fn plane_iso_unported() -> SolidError {
// UNPORTED(surface.surface_cache_p1): SmPlane::CreateIsoParametricCurve. Ported as
// Plane::create_iso_parametric_curve (surface.plane_p1), but it makes an SmLine and
// this cache holds its iso curves as BSplineCurve, which would drop the SmLine
// overrides (evaluation, length); wiring it needs Curve storage here.
SolidError::unported(
"SmPlane::CreateIsoParametricCurve",
"surface.surface_cache_p1",
)
}
/// `SM_CAST_PTR(SmBSplineSurface, surface)` for callers that run only non-virtual
/// `SmBSplineSurface` members: an `SmPlane` gives its B-spline part. Callers that
/// reach a virtual member deal with planes first.
@@ -210,6 +196,23 @@ pub(super) const fn bspline_of(surface: &Surface) -> Option<&BSplineSurface> {
}
}
/// `new SmBSplineCurve(*pCurve)` for an `SmBSplineCurve*` that may point at an `SmLine` or
/// `SmCircle` (the iso curves of a plane or a sweep): the copy constructor of the base
/// class makes a plain B-spline curve, dropping the derived class.
///
/// # Errors
///
/// `SM_ERR_NULL_POINTER` for a curve that is not of a B-spline kind.
pub fn copy_as_bspline(curve: &Curve) -> Result<Curve> {
// (an SmLine makes its NURB when the copy constructor asks for it)
if let CurveKind::Line(l) = curve.kind() {
return Ok(Curve::from(l.base_with_nurb()?.into_owned()));
}
bspline_curve_of(curve)
.map(|b| Curve::from(b.clone()))
.ok_or(SolidError::null_pointer(OP_COPY))
}
/// `SM_CAST_PTR(SmBSplineCurve, curve)`: the B-spline (base) of the B-spline kinds.
const fn bspline_curve_of(curve: &Curve) -> Option<&BSplineCurve> {
match curve.kind() {
@@ -229,60 +232,36 @@ const fn bspline_curve_of(curve: &Curve) -> Option<&BSplineCurve> {
}
}
/// `SmSurface::CreateIsoParametricCurve(ctx, param, iso, tol, curve, domain)`: the
/// B-spline override (the 3D tolerance is not used by it); other kinds run the base
/// class body.
/// `SmSurface::CreateIsoParametricCurve(ctx, param, iso, tol, curve, domain)`, the
/// virtual: the B-spline, plane (an `SmLine`) and surface of revolution (an
/// `SmCircle` in the sweep direction) overrides, the base class body for the other
/// kinds. The curve is held as a [`Curve`] so the derived classes' overrides
/// (evaluation, length, degeneracy) stay in effect; the 3D tolerance is `0.0` as
/// upstream's callers pass (the overrides do not use it).
fn create_iso_parametric_curve(
k: &Kernel,
surface: &Surface,
param: SurfParamType,
iso: f64,
domain: Option<Extent2d>,
) -> Result<BSplineCurve> {
) -> Result<Curve> {
let r = surface.create_iso_parametric_curve(k, param, iso, 0.0, domain.as_ref(), false)?;
match surface.kind() {
SurfaceKind::BSpline(b) => bspline_iso_curve(k, b, param, iso, domain),
SurfaceKind::Plane(_) => Err(plane_iso_unported()),
// UNPORTED(surface.surface_cache_p1): SmSurfOfRevolution::CreateIsoParametricCurve.
// Ported as SurfOfRevolution::create_iso_parametric_curve
// (surface.surf_of_revolution_p1), but it makes an SmCircle in the sweep
// direction and this cache holds its iso curves as BSplineCurve, which would drop
// the SmEllipse overrides; wiring it needs Curve storage here.
SurfaceKind::SurfOfRevolution(_) => Err(SolidError::unported(
"SmSurfOfRevolution::CreateIsoParametricCurve",
"surface.surface_cache_p1",
)),
// the SmSurface body (surface.surface_p5); tolerance 0.0 as upstream's callers
// the SmSurface body (surface.surface_p5) makes a B-spline
SurfaceKind::CurveBounded(_)
| SurfaceKind::Step(_)
| SurfaceKind::OffsetSurface(_)
| SurfaceKind::SrfInVolume(_) => {
let r =
surface.create_iso_parametric_curve(k, param, iso, 0.0, domain.as_ref(), false)?;
match r.curve.into_kind() {
CurveKind::BSpline(b) => Ok(b),
_ => Err(SolidError::sm_err(
"surface::surface_cache::p1::create_iso_parametric_curve",
)),
}
| SurfaceKind::SrfInVolume(_)
if !matches!(r.curve.kind(), CurveKind::BSpline(_)) =>
{
Err(SolidError::sm_err(
"surface::surface_cache::p1::create_iso_parametric_curve",
))
}
_ => Ok(r.curve),
}
}
/// `SmBSplineSurface::CreateIsoParametricCurve` without UV curve.
fn bspline_iso_curve(
k: &Kernel,
bss: &BSplineSurface,
param: SurfParamType,
iso: f64,
domain: Option<Extent2d>,
) -> Result<BSplineCurve> {
let opts = IsoCurveOptions {
domain,
uv_iso_curve: false,
};
Ok(bss.create_iso_parametric_curve(k, param, iso, opts)?.curve)
}
/// `SmSurface::CalculateBoundingBox(domain, ...)`: the B-spline override; other kinds
/// run the base class body.
pub(super) fn calculate_bounding_box(
@@ -613,15 +592,13 @@ impl PatchBoundaryBoundingPlanes {
k: &Kernel,
surface: &Surface,
index: usize,
) -> Result<BSplineCurve> {
) -> Result<Curve> {
let (spt, param) = self.iso_of(index);
let bss = bspline_of(surface).ok_or(SolidError::null_pointer(OP_BOUNDARY))?;
if matches!(surface.kind(), SurfaceKind::Plane(_)) {
// the cast succeeds; the virtual call reaches the SmPlane override
return Err(plane_iso_unported());
}
// make the curve (3D Tol SM_BIG_DOUBLE: not used)
bspline_iso_curve(k, bss, spt, param, None)
// SM_CAST_PTR(SmBSplineSurface, ..) and NER: the B-spline kinds
bspline_of(surface).ok_or(SolidError::null_pointer(OP_BOUNDARY))?;
// make the curve through the virtual (the SmPlane and SmSurfOfRevolution
// overrides; 3D Tol SM_BIG_DOUBLE: not used by any of them)
create_iso_parametric_curve(k, surface, spt, param, None)
}
/// The UV end points of boundary `index` (`GetBoundaryUVEndPoints`).
@@ -655,6 +632,12 @@ impl PatchBoundaryBoundingPlanes {
// local
let bs = bspline_of(surface).ok_or(SolidError::null_pointer(OP_PLANES))?;
// (the canonical form asks for the NURB through the virtual GetOrCreateGwNurbPointer,
// which makes a plane's)
let bs = match surface.kind() {
SurfaceKind::Plane(p) => p.base_for_query(),
_ => std::borrow::Cow::Borrowed(bs),
};
// for every boundary
for ii in 0..4 {
@@ -714,7 +697,7 @@ impl PatchBoundaryBoundingPlanes {
}
// test: Is boundary curve control polygon on computed plane
let on_plane = bsp.is_on_plane(plane_base, plane_normal, tolerance, None)?;
let on_plane = bsp.is_on_plane(k, plane_base, plane_normal, tolerance, None)?;
// low work - this curve not planar - go to next boundary curve
if !on_plane.on_plane {
@@ -723,7 +706,7 @@ impl PatchBoundaryBoundingPlanes {
// test: does surface lie completely on one side of the bounding plane
let (is_separating, invert_normal) =
check_bounding_plane_separating_halfspace(bs, plane_base, plane_normal)?;
check_bounding_plane_separating_halfspace(&bs, plane_base, plane_normal)?;
// low work - surface xsects bounding plane
if !is_separating {
@@ -1368,7 +1351,7 @@ pub struct IsoBoundaryCurves {
/// `rbCurvesAreCached`: the curves are (now) held by the cache.
pub cached: bool,
/// `rIsoCurves`: minimum u, minimum v, maximum u, maximum v iso curves.
pub curves: [BSplineCurve; 4],
pub curves: [Curve; 4],
}
/// The Bezier decomposition of a surface (`SmSurfaceCache`). `O` is the caller's
@@ -1407,7 +1390,7 @@ pub struct SurfaceCache<O> {
/// `m_dTrimSubdivisionFactor`.
pub trim_subdivision_factor: f64,
/// `m_apIsoBoundaryCurves`: the cached natural boundary iso curves.
iso_boundary_curves: Option<[BSplineCurve; 4]>,
iso_boundary_curves: Option<[Curve; 4]>,
/// `m_sSubdivisionSurfaces`: construction surfaces with their handles.
subdivision_surfaces: Vec<(O, Surface)>,
/// Names the halves of a split subdivision surface (see
@@ -2422,7 +2405,7 @@ impl<O: Copy + PartialEq> SurfaceCache<O> {
// 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
// receives the owning B-rep (justified: findings.md "stubs naming green units")
return Err(SolidError::unported(
"SmTol::GetZoneTol3d(const SmObject*)",
"geom.tol",
@@ -2722,8 +2705,8 @@ impl<O: Copy + PartialEq> SurfaceCache<O> {
let top_v = create_iso_parametric_curve(k, surface, SurfParamType::V, uv_top.y, d)?;
// 3D Udir and Vdir IsoParamCurve lengths
let len = |c: &BSplineCurve, ivl: &Extent1d| -> Result<f64> {
Ok(approximate_length(c, ivl, 8, false)?.0)
let len = |c: &Curve, ivl: &Extent1d| -> Result<f64> {
Ok(c.approximate_length(ivl, 8, false)?.0)
};
let bot_v_size = len(&bot_u, &v_domain)?;
let bot_u_size = len(&bot_v, &u_domain)?;
@@ -2850,6 +2833,25 @@ mod tests {
use super::*;
use crate::geom::extent3d::Extent3d;
#[test]
fn plane_boundary_planes() {
use crate::surface::plane::Plane;
let k = Kernel::default();
let dom = Extent2d::from_bounds(0.0, 0.0, 10.0, 6.0);
let surface = Surface::from(Plane::new(
Vec3::new(-5.0, -3.0, 0.0),
Vec3::new(1.0, 0.0, 0.0),
Vec3::new(0.0, 1.0, 0.0),
Vec2::new(1.0, 1.0),
&dom,
));
let mut bp = PatchBoundaryBoundingPlanes::new(dom);
// the iso curve of a plane is its SmLine
let c = bp.create_boundary_curve_for_index(&k, &surface, 0).unwrap();
assert!(matches!(c.kind(), CurveKind::Line(_)));
bp.compute_bounding_planes(&k, &surface).unwrap();
}
#[test]
fn cull_keeps_first_and_last() {
let mut a = vec![0.0, 1.0, 2.0, 3.0, 4.0];
@@ -101,6 +101,8 @@ enum
const double REJECTED = -2.0;
// Record of an op whose surface of revolution could not be made.
const double NO_SURFACE = -3.0;
// Trim curve entry for a NULL curve (in place of `GetType()` and the curve data).
const double NULL_CURVE = -4.0;
struct Bad : std::runtime_error
{
@@ -771,8 +773,18 @@ void run(Rd& rd, std::vector<double>& o)
o.push_back(md);
o.push_back(mv);
o.push_back((double)uvs.GetSize());
// per curve: its GetType() then its data; a NULL entry (a failed SM_CAST_PTR
// upstream) is the sentinel NULL_CURVE
for (ULONG i = 0; i < uvs.GetSize(); i++)
{
if (uvs[i] == NULL)
{
o.push_back(NULL_CURVE);
continue;
}
o.push_back((double)uvs[i]->GetType());
put_curve(o, uvs[i]);
}
}
for (ULONG i = 0; i < uvs.GetSize(); i++)
delete uvs[i];
+30
View File
@@ -5293,6 +5293,36 @@ shell traversal; PR #88's cache-reset scans keep their existing behavior.
`SurfaceIntersector::adv_compute_singularity_point`, and `ComputePointValues` calls it
when the base's `advanced` flag (set by `AdvSurfaceIntersector::new`) is on. All 6
cases now pass bit-identical; p2/p3/p4/adv/p5 have 0 failures.
- **Second review (PR #140): iso curves of the surface cache wired.** The two
`UNPORTED(surface.surface_cache_p1)` stubs (`SmPlane::CreateIsoParametricCurve`,
`SmSurfOfRevolution::CreateIsoParametricCurve`) were tagged with a green unit while the
callees were ported (`surface.plane_p1`, `surface.surf_of_revolution_p1`). They are now
wired the way PR #270 does it (its `surface_cache/p1.rs`, the `Curve` storage of the iso
curves, `copy_as_bspline` for upstream's `new SmBSplineCurve(*p)` copies, and the
`&Curve` boundary signatures of the tracer, silhouette and surface intersector p2/p3,
taken over unchanged so the two PRs merge cleanly), **including the plane branch of
`GetIsoBoundaryCurves`** that #270 keeps stubbed because of
`intersect.surface_intersector_p5` `gen0072`. On this branch `gen0072` passes
bit-identical (157 values): its missing touching-point curves are the
`ComputeSingularityPoint` dispatch gap fixed above. `intersect.surface_intersector_p5`
goes from 1009 to 1471 passes with 0 failures (its runner now writes the B-spline part
of a `Line` / `Ellipse` output curve, as #270's does, after its type code).
The plane and revolution `DropAndTrimCurve` cases now trace past the iso curves and
stop at a real gap: `SmCrvOnSurf` over a non-B-spline surface
(`surface_drop_curve.rs`, the `curve.crv_on_surf` port holds only a `BSplineSurface`;
an `SmPlane`'s virtual evaluators differ from its B-spline part, so wrapping the
plane's B-spline would not be faithful). These defer on `curve.crv_on_surf`.
- **Second review (PR #140): curve_class_p2 stubs not wired.** The `ReSet` and
`ConnectIntervals` stubs in `intersect/curve_class/p4.rs` are deliberate: wiring them
breaks `topology.brep_p2`'s `merge_plane10_line` and 4 squeeze cases of
`intersect.curve_class_p4` (see that unit's section). The deferrals behind them are
counted as such in the unit's notes.
- **Second review (PR #140): coverage.** The generator is back to main's buckets
(`88..=98` iso, `99` plane line), so every generated case keeps its inputs; the wider
trim generator runs as 400 fixed-seed cases `trim0000..trim0399` appended after the
1500. The `Trim` record now carries each UV curve's `GetType()` (line vs B-spline is
compared), and the shim writes the sentinel `NULL_CURVE` for a `NULL` entry instead of
dereferencing it.
## topology.vertex (`SmVertex`, 2026-10-15; partial, no disagreements)
- **Vertex use lists.** `topology::Vertex` gained `vertexuses` (`m_pList`, upstream list
+6 -6
View File
File diff suppressed because one or more lines are too long
+142 -258
View File
@@ -130,28 +130,20 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "plane_plane_coincident",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/blend.fillet_geom_p2/cases.json#16 (upstream source/SMLib/src/SmFilletGeom.cpp)",
"values_compared": 0
"values_compared": 60
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "plane_plane_coincident_no_nurb",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/blend.fillet_geom_p2/cases.json#17 (upstream source/SMLib/src/SmFilletGeom.cpp)",
"values_compared": 0
"values_compared": 60
},
{
"max_rel_err": 0.0,
@@ -199,8 +191,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "cylinder_plane_lines_ref",
@@ -211,8 +203,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "cylinder_plane_ellipse",
@@ -294,16 +286,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "bspline_plane",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/blend.fillet_geom_p2/cases.json#32 (upstream source/SMLib/src/SmFilletGeom.cpp)",
"values_compared": 0
"values_compared": 96
},
{
"max_rel_err": 0.0,
@@ -471,8 +459,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::DoPointIntersection",
"unit": "intersect.surface_intersector_p4"
},
"max_rel_err": 0.0,
"name": "gen0003",
@@ -507,8 +495,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0007",
@@ -539,8 +527,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::ComputePointValues",
"unit": "intersect.surface_intersector_p2"
},
"max_rel_err": 0.0,
"name": "gen0010",
@@ -579,8 +567,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::ComputePointValues",
"unit": "intersect.surface_intersector_p2"
},
"max_rel_err": 0.0,
"name": "gen0014",
@@ -590,28 +578,20 @@
"values_compared": 0
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0015",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959609",
"values_compared": 0
"values_compared": 861
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0016",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959610",
"values_compared": 0
"values_compared": 60
},
{
"max_rel_err": 0.0,
@@ -698,16 +678,12 @@
"values_compared": 5
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0026",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959620",
"values_compared": 0
"values_compared": 60
},
{
"max_rel_err": 0.0,
@@ -778,16 +754,12 @@
"values_compared": 5
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0034",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959628",
"values_compared": 0
"values_compared": 60
},
{
"max_rel_err": 0.0,
@@ -823,8 +795,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::DoPointIntersection",
"unit": "intersect.surface_intersector_p4"
},
"max_rel_err": 0.0,
"name": "gen0038",
@@ -854,16 +826,12 @@
"values_compared": 456
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0041",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959635",
"values_compared": 0
"values_compared": 96
},
{
"max_rel_err": 0.0,
@@ -875,8 +843,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0043",
@@ -995,8 +963,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::DoPointIntersection",
"unit": "intersect.surface_intersector_p4"
},
"max_rel_err": 0.0,
"name": "gen0056",
@@ -1006,16 +974,12 @@
"values_compared": 0
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0057",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959651",
"values_compared": 0
"values_compared": 60
},
{
"max_rel_err": 0.0,
@@ -1098,16 +1062,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0067",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959661",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -1119,8 +1079,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0069",
@@ -1215,8 +1175,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0079",
@@ -1234,16 +1194,12 @@
"values_compared": 5
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0081",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959675",
"values_compared": 0
"values_compared": 7791
},
{
"max_rel_err": 0.0,
@@ -1282,16 +1238,12 @@
"values_compared": 5
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0086",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959680",
"values_compared": 0
"values_compared": 60
},
{
"deferred": {
@@ -1386,16 +1338,12 @@
"values_compared": 0
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0096",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959690",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -1406,28 +1354,20 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0098",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959692",
"values_compared": 0
"values_compared": 2796
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0099",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959693",
"values_compared": 0
"values_compared": 60
},
{
"deferred": {
@@ -1482,16 +1422,12 @@
"values_compared": 0
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0105",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959699",
"values_compared": 0
"values_compared": 60
},
{
"max_rel_err": 0.0,
@@ -1651,8 +1587,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::ComputePointValues",
"unit": "intersect.surface_intersector_p2"
},
"max_rel_err": 0.0,
"name": "gen0123",
@@ -1791,8 +1727,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::ComputePointValues",
"unit": "intersect.surface_intersector_p2"
},
"max_rel_err": 0.0,
"name": "gen0137",
@@ -1811,8 +1747,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::DoPointIntersection",
"unit": "intersect.surface_intersector_p4"
},
"max_rel_err": 0.0,
"name": "gen0139",
@@ -1839,8 +1775,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::DoPointIntersection",
"unit": "intersect.surface_intersector_p4"
},
"max_rel_err": 0.0,
"name": "gen0142",
@@ -1947,8 +1883,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::DoPointIntersection",
"unit": "intersect.surface_intersector_p4"
},
"max_rel_err": 0.0,
"name": "gen0154",
@@ -1998,28 +1934,20 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0160",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959754",
"values_compared": 0
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0161",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959755",
"values_compared": 0
"values_compared": 12
},
{
"deferred": {
@@ -2094,28 +2022,20 @@
"values_compared": 3
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0170",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959764",
"values_compared": 0
"values_compared": 231
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0171",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959765",
"values_compared": 0
"values_compared": 12
},
{
"deferred": {
@@ -2162,16 +2082,12 @@
"values_compared": 771
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0177",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959771",
"values_compared": 0
"values_compared": 861
},
{
"max_rel_err": 0.0,
@@ -2199,8 +2115,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::ComputePointValues",
"unit": "intersect.surface_intersector_p2"
},
"max_rel_err": 0.0,
"name": "gen0181",
@@ -2243,8 +2159,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::ComputePointValues",
"unit": "intersect.surface_intersector_p2"
},
"max_rel_err": 0.0,
"name": "gen0186",
@@ -2262,16 +2178,12 @@
"values_compared": 60
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0188",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959782",
"values_compared": 0
"values_compared": 231
},
{
"deferred": {
@@ -2478,16 +2390,12 @@
"values_compared": 60
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0212",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959806",
"values_compared": 0
"values_compared": 501
},
{
"max_rel_err": 0.0,
@@ -2534,16 +2442,12 @@
"values_compared": 5
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0218",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959812",
"values_compared": 0
"values_compared": 276
},
{
"max_rel_err": 0.0,
@@ -2591,8 +2495,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::ComputePointValues",
"unit": "intersect.surface_intersector_p2"
},
"max_rel_err": 0.0,
"name": "gen0224",
@@ -2610,28 +2514,20 @@
"values_compared": 5
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0226",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959820",
"values_compared": 0
"values_compared": 321
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0227",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959821",
"values_compared": 0
"values_compared": 1446
},
{
"max_rel_err": 0.0,
@@ -2719,8 +2615,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::DoPointIntersection",
"unit": "intersect.surface_intersector_p4"
},
"max_rel_err": 0.0,
"name": "gen0236",
@@ -2738,16 +2634,12 @@
"values_compared": 60
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0238",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959832",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -2771,8 +2663,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::DoPointIntersection",
"unit": "intersect.surface_intersector_p4"
},
"max_rel_err": 0.0,
"name": "gen0241",
@@ -2807,8 +2699,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::ComputePointValues",
"unit": "intersect.surface_intersector_p2"
},
"max_rel_err": 0.0,
"name": "gen0245",
@@ -2987,8 +2879,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::DoPointIntersection",
"unit": "intersect.surface_intersector_p4"
},
"max_rel_err": 0.0,
"name": "gen0265",
@@ -3107,8 +2999,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::DoPointIntersection",
"unit": "intersect.surface_intersector_p4"
},
"max_rel_err": 0.0,
"name": "gen0278",
@@ -3223,8 +3115,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::ComputePointValues",
"unit": "intersect.surface_intersector_p2"
},
"max_rel_err": 0.0,
"name": "gen0290",
@@ -3234,16 +3126,12 @@
"values_compared": 0
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0291",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959885",
"values_compared": 0
"values_compared": 60
},
{
"max_rel_err": 0.0,
@@ -3274,16 +3162,12 @@
"values_compared": 0
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0295",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9207378515203959889",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -3327,16 +3211,16 @@
}
],
"cases_both_errored": 0,
"cases_deferred": 131,
"cases_deferred": 102,
"cases_failed": 0,
"cases_passed": 219,
"cases_passed": 248,
"cases_total": 350,
"deferred_by_unit": {
"curve.crv_on_surf": 2,
"curve.iso_curve": 6,
"intersect.surface_drop_lib_p3": 33,
"intersect.surface_intersector_p2": 23,
"intersect.surface_intersector_p4": 19,
"surface.surface_cache_p1": 54
"intersect.surface_intersector_p2": 32,
"intersect.surface_intersector_p4": 29
},
"max_rel_err": 0.0,
"pass": true,
@@ -90,16 +90,12 @@
"values_compared": 32
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "boundary_degenerate_interval_on_surface",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/intersect.surface_drop_curve/cases.json#11 (upstream tests/SM_API_test/src/TestSmCurves.cpp:424 (TestSmCreateRectangle: 10 x 6 rectangle at the origin))",
"values_compared": 0
"values_compared": 30
},
{
"max_rel_err": 0.0,
@@ -1462,16 +1458,12 @@
"values_compared": 63
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0133",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9707850954747150882",
"values_compared": 0
"values_compared": 231
},
{
"max_rel_err": 0.0,
@@ -1706,16 +1698,12 @@
"values_compared": 121
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0163",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9707850954747150912",
"values_compared": 0
"values_compared": 95
},
{
"max_rel_err": 0.0,
@@ -1775,8 +1763,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurface (non-B-spline) in SmCrvOnSurf",
"unit": "curve.crv_on_surf"
},
"max_rel_err": 0.0,
"name": "gen0171",
@@ -2138,16 +2126,12 @@
"values_compared": 262
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0216",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9707850954747150965",
"values_compared": 0
"values_compared": 51
},
{
"max_rel_err": 0.0,
@@ -2670,16 +2654,12 @@
"values_compared": 178
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0282",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9707850954747151031",
"values_compared": 0
"values_compared": 200
},
{
"max_rel_err": 0.0,
@@ -3059,8 +3039,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurface (non-B-spline) in SmCrvOnSurf",
"unit": "curve.crv_on_surf"
},
"max_rel_err": 0.0,
"name": "gen0330",
@@ -3134,16 +3114,12 @@
"values_compared": 56
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0339",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9707850954747151088",
"values_compared": 0
"values_compared": 68
},
{
"max_rel_err": 0.0,
@@ -3759,8 +3735,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurface (non-B-spline) in SmCrvOnSurf",
"unit": "curve.crv_on_surf"
},
"max_rel_err": 0.0,
"name": "gen0416",
@@ -3870,16 +3846,12 @@
"values_compared": 180
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0429",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9707850954747151178",
"values_compared": 0
"values_compared": 223
},
{
"max_rel_err": 0.0,
@@ -4090,16 +4062,12 @@
"values_compared": 115
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0456",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=9707850954747151205",
"values_compared": 0
"values_compared": 95
},
{
"max_rel_err": 0.0,
@@ -4239,8 +4207,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurface (non-B-spline) in SmCrvOnSurf",
"unit": "curve.crv_on_surf"
},
"max_rel_err": 0.0,
"name": "gen0474",
@@ -4459,14 +4427,14 @@
}
],
"cases_both_errored": 0,
"cases_deferred": 20,
"cases_deferred": 12,
"cases_failed": 0,
"cases_passed": 527,
"cases_passed": 535,
"cases_total": 547,
"deferred_by_unit": {
"curve.crv_on_surf": 4,
"intersect.curve_class_p2": 5,
"intersect.surface_drop_lib_p3": 3,
"surface.surface_cache_p1": 12
"intersect.surface_drop_lib_p3": 3
},
"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
+18 -39
View File
@@ -210,16 +210,12 @@
"values_compared": 923
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "do_trace_plane",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/intersect.surface_tracer/edge_cases.json#26 (upstream source/SMLib/src/SmSurfaceTracer.cpp:1403)",
"values_compared": 0
"values_compared": 83
},
{
"max_rel_err": 0.0,
@@ -726,16 +722,12 @@
"values_compared": 243
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0063",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12567469113176183492",
"values_compared": 0
"values_compared": 178
},
{
"max_rel_err": 0.0,
@@ -918,16 +910,12 @@
"values_compared": 262
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0086",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12567469113176183515",
"values_compared": 0
"values_compared": 113
},
{
"max_rel_err": 0.0,
@@ -1138,16 +1126,12 @@
"values_compared": 151
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0113",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12567469113176183542",
"values_compared": 0
"values_compared": 373
},
{
"max_rel_err": 0.0,
@@ -2970,16 +2954,12 @@
"values_compared": 548
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0339",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12567469113176183768",
"values_compared": 0
"values_compared": 297
},
{
"max_rel_err": 0.0,
@@ -3463,13 +3443,12 @@
}
],
"cases_both_errored": 0,
"cases_deferred": 11,
"cases_deferred": 6,
"cases_failed": 0,
"cases_passed": 416,
"cases_passed": 421,
"cases_total": 427,
"deferred_by_unit": {
"intersect.surface_drop_lib_p3": 6,
"surface.surface_cache_p1": 5
"intersect.surface_drop_lib_p3": 6
},
"max_rel_err": 0.0,
"pass": true,
+6 -11
View File
@@ -11806,16 +11806,12 @@
"values_compared": 59
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0246",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12145710358005093856",
"values_compared": 0
"values_compared": 81
},
{
"max_rel_err": 0.0,
@@ -22163,13 +22159,12 @@
}
],
"cases_both_errored": 0,
"cases_deferred": 130,
"cases_deferred": 129,
"cases_failed": 0,
"cases_passed": 2575,
"cases_passed": 2576,
"cases_total": 2705,
"deferred_by_unit": {
"intersect.surface_drop_lib_p3": 129,
"surface.surface_cache_p1": 1
"intersect.surface_drop_lib_p3": 129
},
"max_rel_err": 0.0,
"pass": true,
+28 -62
View File
@@ -898,28 +898,20 @@
"values_compared": 6
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gsi_plane_coincident",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/surface.plane_p2/edge.json#21",
"values_compared": 0
"values_compared": 114
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gsi_bspline",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/surface.plane_p2/edge.json#22",
"values_compared": 0
"values_compared": 45
},
{
"max_rel_err": 0.0,
@@ -8706,16 +8698,12 @@
"values_compared": 7
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0869",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12145709258493466268",
"values_compared": 0
"values_compared": 114
},
{
"max_rel_err": 0.0,
@@ -8894,16 +8882,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0892",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12145709258493466291",
"values_compared": 0
"values_compared": 6
},
{
"max_rel_err": 0.0,
@@ -13602,16 +13586,12 @@
"values_compared": 6
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen1480",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12145709258493466879",
"values_compared": 0
"values_compared": 114
},
{
"max_rel_err": 0.0,
@@ -14254,16 +14234,12 @@
"values_compared": 54
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen1561",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12145709258493466960",
"values_compared": 0
"values_compared": 114
},
{
"max_rel_err": 0.0,
@@ -15546,16 +15522,12 @@
"values_compared": 3
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen1722",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12145709258493467121",
"values_compared": 0
"values_compared": 114
},
{
"max_rel_err": 0.0,
@@ -17166,16 +17138,12 @@
"values_compared": 6
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen1924",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=12145709258493467323",
"values_compared": 0
"values_compared": 114
},
{
"max_rel_err": 0.0,
@@ -17779,17 +17747,15 @@
}
],
"cases_both_errored": 0,
"cases_deferred": 8,
"cases_deferred": 0,
"cases_failed": 0,
"cases_passed": 2210,
"cases_passed": 2218,
"cases_total": 2218,
"deferred_by_unit": {
"surface.surface_cache_p1": 8
},
"deferred_by_unit": {},
"max_rel_err": 0.0,
"pass": true,
"rel_tol": 1e-9,
"seeds": 16,
"status": "partial",
"status": "green",
"unit": "surface.plane_p2"
}
@@ -2227,8 +2227,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0011",
@@ -2319,8 +2319,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0022",
@@ -2370,16 +2370,12 @@
"values_compared": 5
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0028",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=4440997136722950235",
"values_compared": 0
"values_compared": 11
},
{
"max_rel_err": 0.0,
@@ -2415,8 +2411,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0033",
@@ -2651,8 +2647,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0062",
@@ -3067,8 +3063,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0113",
@@ -3343,8 +3339,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0147",
@@ -3403,8 +3399,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0154",
@@ -3583,8 +3579,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0176",
@@ -3595,8 +3591,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurface::DropCurve",
"unit": "intersect.surface_drop_lib_p3"
},
"max_rel_err": 0.0,
"name": "gen0177",
@@ -4915,8 +4911,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0341",
@@ -5022,16 +5018,12 @@
"values_compared": 120
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0354",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=4440997136722950561",
"values_compared": 0
"values_compared": 11
},
{
"max_rel_err": 0.0,
@@ -5107,8 +5099,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0364",
@@ -5827,8 +5819,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0453",
@@ -5854,16 +5846,12 @@
"values_compared": 331
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0456",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=4440997136722950663",
"values_compared": 0
"values_compared": 11
},
{
"max_rel_err": 0.0,
@@ -5906,16 +5894,12 @@
"values_compared": 3149
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0462",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=4440997136722950669",
"values_compared": 0
"values_compared": 11
},
{
"max_rel_err": 0.0,
@@ -6215,8 +6199,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0500",
@@ -6275,8 +6259,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0507",
@@ -6431,8 +6415,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0526",
@@ -6963,8 +6947,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0592",
@@ -7303,8 +7287,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0634",
@@ -7451,8 +7435,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0652",
@@ -7871,8 +7855,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0704",
@@ -7939,8 +7923,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0712",
@@ -8143,8 +8127,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::ComputePointValues",
"unit": "intersect.surface_intersector_p2"
},
"max_rel_err": 0.0,
"name": "gen0737",
@@ -8619,8 +8603,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0796",
@@ -8790,16 +8774,12 @@
"values_compared": 5
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0817",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=4440997136722951024",
"values_compared": 0
"values_compared": 11
},
{
"max_rel_err": 0.0,
@@ -9035,8 +9015,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0847",
@@ -9255,8 +9235,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0874",
@@ -9307,8 +9287,8 @@
},
{
"deferred": {
"symbol": "SmSurfOfRevolution::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmIsoCurve::SmIsoCurve (non-B-spline surface)",
"unit": "curve.iso_curve"
},
"max_rel_err": 0.0,
"name": "gen0880",
@@ -9471,13 +9451,14 @@
}
],
"cases_both_errored": 0,
"cases_deferred": 33,
"cases_deferred": 28,
"cases_failed": 0,
"cases_passed": 1134,
"cases_passed": 1139,
"cases_total": 1167,
"deferred_by_unit": {
"intersect.surface_intersector_p2": 3,
"surface.surface_cache_p1": 30
"curve.iso_curve": 23,
"intersect.surface_drop_lib_p3": 1,
"intersect.surface_intersector_p2": 4
},
"max_rel_err": 0.0,
"pass": true,
+162 -375
View File
@@ -662,16 +662,12 @@
"values_compared": 96
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "plane_rect_nth",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/surface.surface_cache_p2/cases.json#82 (upstream SM_API_test TestSmCurves.cpp:424 (TestSmCreateRectangle: 10 x 6 rectangle at the origin, as a plane))",
"values_compared": 0
"values_compared": 26
},
{
"max_rel_err": 0.0,
@@ -722,16 +718,12 @@
"values_compared": 96
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "plane_hexagon_nth",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/surface.surface_cache_p2/cases.json#89 (upstream SM_API_test TestSmCurves.cpp:462 (TestSmCreateRegularPolygon: radius 5 hexagon plane))",
"values_compared": 0
"values_compared": 26
},
{
"max_rel_err": 0.0,
@@ -782,16 +774,12 @@
"values_compared": 96
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "plane_far_thin_nth",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/surface.surface_cache_p2/cases.json#96 (upstream SM_API_test TestSmCurves.cpp:424 (TestSmCreateRectangle: 10 x 6 rectangle at the origin, as a plane))",
"values_compared": 0
"values_compared": 26
},
{
"max_rel_err": 0.0,
@@ -1138,16 +1126,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0035",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453022",
"values_compared": 0
"values_compared": 19
},
{
"max_rel_err": 0.0,
@@ -1174,16 +1158,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0039",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453026",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -1202,16 +1182,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0042",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453029",
"values_compared": 0
"values_compared": 51
},
{
"max_rel_err": 0.0,
@@ -1238,16 +1214,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0046",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453033",
"values_compared": 0
"values_compared": 13
},
{
"max_rel_err": 0.0,
@@ -1458,16 +1430,12 @@
"values_compared": 7
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0073",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453060",
"values_compared": 0
"values_compared": 10
},
{
"max_rel_err": 0.0,
@@ -1678,16 +1646,12 @@
"values_compared": 44
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0100",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453087",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -1890,16 +1854,12 @@
"values_compared": 7
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0126",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453113",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -1950,16 +1910,12 @@
"values_compared": 33
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0133",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453120",
"values_compared": 0
"values_compared": 19
},
{
"max_rel_err": 0.0,
@@ -2050,16 +2006,12 @@
"values_compared": 270
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0145",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453132",
"values_compared": 0
"values_compared": 26
},
{
"max_rel_err": 0.0,
@@ -2118,16 +2070,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0153",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453140",
"values_compared": 0
"values_compared": 7
},
{
"max_rel_err": 0.0,
@@ -2378,16 +2326,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0185",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453172",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -2406,16 +2350,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0188",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453175",
"values_compared": 0
"values_compared": 4
},
{
"max_rel_err": 0.0,
@@ -2786,16 +2726,12 @@
"values_compared": 13
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0235",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453222",
"values_compared": 0
"values_compared": 10
},
{
"max_rel_err": 0.0,
@@ -2926,16 +2862,12 @@
"values_compared": 19
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0252",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453239",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -3010,16 +2942,12 @@
"values_compared": 10
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0262",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453249",
"values_compared": 0
"values_compared": 16
},
{
"max_rel_err": 0.0,
@@ -3070,16 +2998,12 @@
"values_compared": 90
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0269",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453256",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -3122,16 +3046,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0275",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453262",
"values_compared": 0
"values_compared": 16
},
{
"max_rel_err": 0.0,
@@ -3686,16 +3606,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0345",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453332",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -3794,16 +3710,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0358",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453345",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -3814,16 +3726,12 @@
"values_compared": 17
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0360",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453347",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -4186,16 +4094,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0406",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453393",
"values_compared": 0
"values_compared": 16
},
{
"max_rel_err": 0.0,
@@ -4614,28 +4518,20 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0459",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453446",
"values_compared": 0
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0460",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453447",
"values_compared": 0
"values_compared": 13
},
{
"max_rel_err": 0.0,
@@ -4998,16 +4894,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0506",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453493",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -5074,16 +4966,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0515",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453502",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -5126,16 +5014,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0521",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453508",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -5298,28 +5182,20 @@
"values_compared": 4
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0542",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453529",
"values_compared": 0
"values_compared": 19
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0543",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453530",
"values_compared": 0
"values_compared": 7
},
{
"max_rel_err": 0.0,
@@ -5378,16 +5254,12 @@
"values_compared": 4
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0551",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453538",
"values_compared": 0
"values_compared": 13
},
{
"max_rel_err": 0.0,
@@ -5470,16 +5342,12 @@
"values_compared": 19
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0562",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453549",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -5498,16 +5366,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0565",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453552",
"values_compared": 0
"values_compared": 19
},
{
"max_rel_err": 0.0,
@@ -5750,28 +5614,20 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0596",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453583",
"values_compared": 0
"values_compared": 13
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0597",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453584",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -5782,16 +5638,12 @@
"values_compared": 4
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0599",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453586",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -5906,16 +5758,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0614",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453601",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -5926,16 +5774,12 @@
"values_compared": 54
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0616",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453603",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -6034,16 +5878,12 @@
"values_compared": 34
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0629",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453616",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -6166,28 +6006,20 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0645",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453632",
"values_compared": 0
"values_compared": 13
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0646",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453633",
"values_compared": 0
"values_compared": 76
},
{
"max_rel_err": 0.0,
@@ -6310,16 +6142,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0662",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453649",
"values_compared": 0
"values_compared": 13
},
{
"max_rel_err": 0.0,
@@ -6410,16 +6238,12 @@
"values_compared": 4
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0674",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453661",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -6574,28 +6398,20 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0694",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453681",
"values_compared": 0
"values_compared": 7
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0695",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453682",
"values_compared": 0
"values_compared": 101
},
{
"max_rel_err": 0.0,
@@ -6622,16 +6438,12 @@
"values_compared": 183
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0699",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453686",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -6658,16 +6470,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0703",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453690",
"values_compared": 0
"values_compared": 19
},
{
"max_rel_err": 0.0,
@@ -6742,16 +6550,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0713",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453700",
"values_compared": 0
"values_compared": 7
},
{
"max_rel_err": 0.0,
@@ -6866,16 +6670,12 @@
"values_compared": 12
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0728",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453715",
"values_compared": 0
"values_compared": 13
},
{
"max_rel_err": 0.0,
@@ -7174,28 +6974,20 @@
"values_compared": 10
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0766",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453753",
"values_compared": 0
"values_compared": 4
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0767",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453754",
"values_compared": 0
"values_compared": 51
},
{
"max_rel_err": 0.0,
@@ -7382,16 +7174,12 @@
"values_compared": 220
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0791",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500106336313453778",
"values_compared": 0
"values_compared": 12
},
{
"max_rel_err": 0.0,
@@ -7459,13 +7247,12 @@
}
],
"cases_both_errored": 0,
"cases_deferred": 54,
"cases_deferred": 1,
"cases_failed": 0,
"cases_passed": 851,
"cases_passed": 904,
"cases_total": 905,
"deferred_by_unit": {
"intersect.curve_class_p2": 1,
"surface.surface_cache_p1": 53
"intersect.curve_class_p2": 1
},
"max_rel_err": 0.0,
"pass": true,
+28 -62
View File
@@ -298,16 +298,12 @@
"values_compared": 66
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0037",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500105236801824813",
"values_compared": 0
"values_compared": 1219
},
{
"max_rel_err": 0.0,
@@ -606,16 +602,12 @@
"values_compared": 384
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0075",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500105236801824851",
"values_compared": 0
"values_compared": 85
},
{
"max_rel_err": 0.0,
@@ -722,16 +714,12 @@
"values_compared": 719
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0089",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500105236801824865",
"values_compared": 0
"values_compared": 1639
},
{
"max_rel_err": 0.0,
@@ -2070,16 +2058,12 @@
"values_compared": 66
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0257",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500105236801825033",
"values_compared": 0
"values_compared": 854333
},
{
"max_rel_err": 0.0,
@@ -2162,16 +2146,12 @@
"values_compared": 28669
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0268",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500105236801825044",
"values_compared": 0
"values_compared": 131
},
{
"max_rel_err": 0.0,
@@ -2358,16 +2338,12 @@
"values_compared": 136
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0292",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500105236801825068",
"values_compared": 0
"values_compared": 111511
},
{
"max_rel_err": 0.0,
@@ -2898,16 +2874,12 @@
"values_compared": 246
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0359",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500105236801825135",
"values_compared": 0
"values_compared": 3383
},
{
"max_rel_err": 0.0,
@@ -4558,16 +4530,12 @@
"values_compared": 146
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "gen0566",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "generated:seed=17500105236801825342",
"values_compared": 0
"values_compared": 12069
},
{
"max_rel_err": 0.0,
@@ -4835,17 +4803,15 @@
}
],
"cases_both_errored": 0,
"cases_deferred": 8,
"cases_deferred": 0,
"cases_failed": 0,
"cases_passed": 592,
"cases_passed": 600,
"cases_total": 600,
"deferred_by_unit": {
"surface.surface_cache_p1": 8
},
"deferred_by_unit": {},
"max_rel_err": 0.0,
"pass": true,
"rel_tol": 1e-9,
"seeds": 16,
"status": "partial",
"status": "green",
"unit": "surface.surface_cache_p3"
}
File diff suppressed because it is too large Load Diff
+60 -124
View File
@@ -822,16 +822,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_cone_e1",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#46 (upstream upstream/TestFiles/pt_TestFiles/cone.smb)",
"values_compared": 0
"values_compared": 2
},
{
"max_rel_err": 0.0,
@@ -858,16 +854,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_cone_e3",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#50 (upstream upstream/TestFiles/pt_TestFiles/cone.smb)",
"values_compared": 0
"values_compared": 2
},
{
"deferred": {
@@ -966,16 +958,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_ellips_ts2_e0",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#62 (upstream upstream/TestFiles/pt_TestFiles/ellips_ts2.smb)",
"values_compared": 0
"values_compared": 2
},
{
"max_rel_err": 0.0,
@@ -987,8 +975,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmFace::Notify",
"unit": "topology.face_p3"
},
"max_rel_err": 0.0,
"name": "mate_ellips_ts2_e1",
@@ -1006,16 +994,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_ellips_ts2_e2",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#66 (upstream upstream/TestFiles/pt_TestFiles/ellips_ts2.smb)",
"values_compared": 0
"values_compared": 2
},
{
"max_rel_err": 0.0,
@@ -1026,16 +1010,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_ellips_ts2_e3",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#68 (upstream upstream/TestFiles/pt_TestFiles/ellips_ts2.smb)",
"values_compared": 0
"values_compared": 2
},
{
"deferred": {
@@ -1286,16 +1266,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_surf_extrude_e0",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#98 (upstream upstream/TestFiles/pt_TestFiles/surf_extrude.smb)",
"values_compared": 0
"values_compared": 2
},
{
"max_rel_err": 0.0,
@@ -1306,16 +1282,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_surf_extrude_e1",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#100 (upstream upstream/TestFiles/pt_TestFiles/surf_extrude.smb)",
"values_compared": 0
"values_compared": 2
},
{
"max_rel_err": 0.0,
@@ -1326,16 +1298,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_surf_extrude_e2",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#102 (upstream upstream/TestFiles/pt_TestFiles/surf_extrude.smb)",
"values_compared": 0
"values_compared": 2
},
{
"max_rel_err": 0.0,
@@ -1346,16 +1314,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_surf_extrude_e3",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#104 (upstream upstream/TestFiles/pt_TestFiles/surf_extrude.smb)",
"values_compared": 0
"values_compared": 2
},
{
"deferred": {
@@ -1378,16 +1342,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_surf_rev_e0",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#107 (upstream upstream/TestFiles/pt_TestFiles/surf_rev.smb)",
"values_compared": 0
"values_compared": 2
},
{
"max_rel_err": 0.0,
@@ -1399,8 +1359,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmFace::Notify",
"unit": "topology.face_p3"
},
"max_rel_err": 0.0,
"name": "mate_surf_rev_e1",
@@ -1418,16 +1378,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_surf_rev_e2",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#111 (upstream upstream/TestFiles/pt_TestFiles/surf_rev.smb)",
"values_compared": 0
"values_compared": 2
},
{
"max_rel_err": 0.0,
@@ -1438,16 +1394,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_surf_rev_e3",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#113 (upstream upstream/TestFiles/pt_TestFiles/surf_rev.smb)",
"values_compared": 0
"values_compared": 2
},
{
"deferred": {
@@ -1471,8 +1423,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::ComputePointValues",
"unit": "intersect.surface_intersector_p2"
},
"max_rel_err": 0.0,
"name": "mate_surf_sphere150_e0",
@@ -1490,16 +1442,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_surf_sphere150_e1",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#118 (upstream upstream/TestFiles/pt_TestFiles/surf_sphere150.smb)",
"values_compared": 0
"values_compared": 2
},
{
"max_rel_err": 0.0,
@@ -1511,8 +1459,8 @@
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
"symbol": "SmSurfaceIntersector::ComputePointValues",
"unit": "intersect.surface_intersector_p2"
},
"max_rel_err": 0.0,
"name": "mate_surf_sphere150_e2",
@@ -1530,16 +1478,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_surf_sphere150_e3",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#122 (upstream upstream/TestFiles/pt_TestFiles/surf_sphere150.smb)",
"values_compared": 0
"values_compared": 2
},
{
"deferred": {
@@ -1730,16 +1674,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_vase_rev_e1",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#145 (upstream upstream/TestFiles/pt_TestFiles/vase_rev.smb)",
"values_compared": 0
"values_compared": 2
},
{
"max_rel_err": 0.0,
@@ -1750,16 +1690,12 @@
"values_compared": 2
},
{
"deferred": {
"symbol": "SmPlane::CreateIsoParametricCurve",
"unit": "surface.surface_cache_p1"
},
"max_rel_err": 0.0,
"name": "mate_vase_rev_e2",
"outcome": "deferred",
"pass": false,
"outcome": "pass",
"pass": true,
"source": "fixture:fixtures/topology.brep_p2/ops.json#147 (upstream upstream/TestFiles/pt_TestFiles/vase_rev.smb)",
"values_compared": 0
"values_compared": 2
},
{
"max_rel_err": 0.0,
@@ -14763,17 +14699,17 @@
}
],
"cases_both_errored": 0,
"cases_deferred": 272,
"cases_deferred": 256,
"cases_failed": 0,
"cases_passed": 1437,
"cases_passed": 1453,
"cases_total": 1709,
"deferred_by_unit": {
"intersect.curve_class_p2": 1,
"intersect.surface_drop_lib_p3": 85,
"intersect.surface_intersector_p2": 2,
"query.brep": 93,
"surface.surface_cache_p1": 20,
"topology.face_p2": 19,
"topology.face_p3": 16,
"topology.face_p3": 18,
"topology.face_p4": 38
},
"max_rel_err": 0.0,