pub fn rotate_faces(
solid: &BrepSolid,
face_ids: &[u64],
axis_point: Vec3,
axis_direction: Vec3,
angle_radians: f64,
) -> Result<BrepSolid, KernelRefusal>Expand description
ROTATE the faces face_ids of solid by angle_radians about the axis
through axis_point along axis_direction (right-handed), re-intersecting
the neighbours the rotation moves the selection relative to.
solid is never touched: every refusal below happens before a clone is even
made, or on the clone before it is returned, so a refused rotation leaves the
caller’s solid exactly as it was.
§Regimes
Rigid — every fixed carrier a boundary vertex touches is invariant under
the rotation (carrier_invariant_under). The corner rides by R, the
edges map by R exactly, and the fixed faces re-trim around them. This is
what makes a cylindrical wall spun about its own axis a no-op that BUILDS.
Re-intersection — otherwise the corner is the common point of the
carriers meeting there, with the moved ones ROTATED, and every affected edge
is rebuilt between the new corners — straight between planes, and as the
EXACT conic wherever a plane meets an oblique cylinder or cone, whichever of
the two the rotation turns, or neither, for a fixed edge whose corner rides
it. The TURNED side of such a pair is the tilted
bore: its mouth is re-intersected in the frame R leaves, and its seam
corner rides its own generatrix down to the fixed flat. A quadric meeting a
quadric, or a sphere, torus, general revolution or free-form neighbour,
refuses by name.