forked from 1b-agent/opencadstudio-upstream
Port the PlanarEllipse tangent-geom variant and full OSNAP ellipse fix
Completes the OSNAP intersection port from 44deee2a: that commit
explicitly deferred ellipse support because this branch's TangentGeom
predates the PlanarEllipse variant added upstream (this branch was cut
from an older main snapshot, ~99 commits behind on unrelated work).
Ports just the variant and its minimal direct dependents, not the
other unrelated evolution in those 99 commits (a separate analytical
GPU fast-path for circle/arc/ellipse rendering, tessellation changes,
etc. — out of scope here).
- wire_model.rs: copied verbatim from main. Restores the
PlanarEllipse variant plus TangentGeom's translated/rotated/scaled/
mirrored methods (this branch was missing all four transform methods
entirely, not just ellipse support in them — a live-drag preview
wire's tangent_geoms weren't being updated at all during a
translate/rotate/scale/mirror preview).
- entities/ellipse.rs: restored building the PlanarEllipse tangent_geom
for a committed ellipse/elliptical-arc entity's RenderEntity — this
is what makes ellipses queryable by OSNAP at all (the resident wire
set is what Intersection/Tangent snap search).
- entities/dimension.rs, scene/cache/block_cache.rs: added back the
three PlanarEllipse match arms needed for exhaustiveness (OCS-to-WCS
remapping, prototype-wire translation, and instance-transform
application) — each a self-contained arm restoring exactly the
ellipse case, not touching the surrounding logic.
- snap.rs: replaced with the exact fix from the upstream PR (HakanSeven12/OpenCADStudio#1104)
branch, whose snap.rs was already verified to differ from main by
nothing but that fix. Upgrades the earlier circle/arc-only port to
the full exact_curve_intersections path: line-vs-circle/arc/ellipse
and ellipse-vs-circle/arc/ellipse, via cadkernel::geom2d::intersect
over a shared embedding plane, including the anti-parallel-normal
reflection fix for both Arc and PlanarEllipse.
7 additional tests now build and pass (line/ellipse intersection
cases, both anti-parallel-normal regressions) plus the wire-transform
test wire_model.rs already carried. Full workspace suite passes except
the one pre-existing, unrelated font-test failure also present on
main.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
1 parent
44deee2ac9
commit
4c264b8c69
5 files changed
+873
-32
No files matched your search
@@ -5408,6 +5408,21 @@ fn map_wire_ocs_to_wcs(wire: &mut WireModel, normal: Vector3) {
|
||||
*axis_x = map_vector(*axis_x);
|
||||
*axis_y = map_vector(*axis_y);
|
||||
}
|
||||
TangentGeom::PlanarEllipse {
|
||||
center,
|
||||
major_axis,
|
||||
normal,
|
||||
..
|
||||
} => {
|
||||
let mapped = map(center[0], center[1], center[2]);
|
||||
let map_vector = |axis: [f64; 3]| {
|
||||
let mapped = map(axis[0], axis[1], axis[2]);
|
||||
[mapped.0, mapped.1, mapped.2]
|
||||
};
|
||||
*center = [mapped.0, mapped.1, mapped.2];
|
||||
*major_axis = map_vector(*major_axis);
|
||||
*normal = map_vector(*normal);
|
||||
}
|
||||
}
|
||||
}
|
||||
wire.aabb = WireModel::UNBOUNDED_AABB;
|
||||
|
||||
+12
-2
@@ -15,6 +15,7 @@ use crate::entities::common::{
|
||||
use crate::entities::traits::RenderConvertible;
|
||||
use crate::scene::convert::acad_to_render::{RenderEntity, RenderObject};
|
||||
use crate::scene::model::object::{GripApply, GripDef, PropSection};
|
||||
use crate::scene::model::wire_model::TangentGeom;
|
||||
|
||||
fn to_render(ell: &Ellipse) -> RenderEntity {
|
||||
// ELLIPSE is one of the few WCS entities in DXF: `center` (code 10) and
|
||||
@@ -29,6 +30,15 @@ fn to_render(ell: &Ellipse) -> RenderEntity {
|
||||
.map(crate::entities::curve::snap_from)
|
||||
.unwrap_or_default();
|
||||
|
||||
let tangent = TangentGeom::PlanarEllipse {
|
||||
center: [ell.center.x, ell.center.y, ell.center.z],
|
||||
major_axis: [ell.major_axis.x, ell.major_axis.y, ell.major_axis.z],
|
||||
normal: [ell.normal.x, ell.normal.y, ell.normal.z],
|
||||
minor_axis_ratio: ell.minor_axis_ratio,
|
||||
start_param: ell.start_parameter,
|
||||
end_param: ell.end_parameter,
|
||||
};
|
||||
|
||||
// The points come from the entity's own kernel curve and angular policy.
|
||||
//
|
||||
// What does not change is the shape of the object. EXTRUDE, REVOLVE and
|
||||
@@ -39,7 +49,7 @@ fn to_render(ell: &Ellipse) -> RenderEntity {
|
||||
pick_tris: Vec::new(),
|
||||
object: RenderObject::Lines(Vec::new()),
|
||||
snap_pts: snap.snap_pts,
|
||||
tangent_geoms: vec![],
|
||||
tangent_geoms: vec![tangent.clone()],
|
||||
key_vertices: vec![],
|
||||
fill_tris: vec![],
|
||||
};
|
||||
@@ -57,7 +67,7 @@ fn to_render(ell: &Ellipse) -> RenderEntity {
|
||||
pick_tris: Vec::new(),
|
||||
object,
|
||||
snap_pts: snap.snap_pts,
|
||||
tangent_geoms: vec![],
|
||||
tangent_geoms: vec![tangent],
|
||||
key_vertices: vec![],
|
||||
fill_tris: vec![],
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user