1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
//! Direct editing — Golovanov §6.12: "delete face and heal" and "move a face
//! group" (see [`move_faces`] for the sibling operation's algorithm and
//! honest v1 scope).
//!
//! Removes a transition face (a chamfer, a constant-radius fillet, or any
//! simple 4-sided face) that sits between two larger neighbour faces, and
//! heals the resulting hole by EXTENDING the neighbours' carrier surfaces and
//! RE-INTERSECTING them so the neighbours meet each other directly where the
//! deleted face used to be. The classic use is "undo a chamfer/fillet": the
//! two large planes that flanked the bevel extend and re-intersect at the
//! original sharp edge, the end-cap faces lose the bevel corner, and the
//! solid returns to its pre-blend shape.
//!
//! ## Algorithm (extend → re-intersect → re-trim → reconnect)
//!
//! For a 4-sided transition face `F` with neighbours `N0..N3` (one per
//! boundary edge, in loop order):
//!
//! 1. **Classify.** The two neighbours on OPPOSITE boundary edges whose
//! (planar) carriers re-intersect in a line passing through `F`'s region
//! are the *primary* pair (the faces to extend and rejoin). The other two
//! opposite neighbours are the *lateral* faces (the end caps). Exactly one
//! opposite pairing must qualify, otherwise the heal is refused.
//! 2. **Re-intersect (extend).** Because analytic planes are unbounded
//! carriers, the primary pair's intersection line `S` is computed in closed
//! form (no marching within a bounded patch). `S` clipped by each lateral
//! plane gives the two recovered corner points — the new sharp edge's
//! endpoints (`triple points`).
//! 3. **Re-trim.** Every side edge that met `F` at a transition corner is
//! relocated onto the recovered corner; the deleted face's two support
//! edges become the single new edge `S` in both primary faces; the two
//! lateral (cap) edges collapse to points. Each affected neighbour face's
//! carrier plane is rebuilt large enough to cover its new boundary and all
//! its pcurves are recomputed against it (analytic planes extend for free).
//! 4. **Reconnect.** `F` and its boundary edges/vertices are pruned, `S` and
//! its two vertices are inserted, the shell is reassembled, the genus is
//! preserved, and the result must `validate()` or the whole operation is
//! refused.
//!
//! ## Covered vs deferred (honest scope of this first slice)
//!
//! - COVERED: a 4-sided chamfer/fillet (or any simple 4-edge transition face)
//! between two PLANAR primary neighbours with two PLANAR lateral caps, convex
//! or concave. Chamfer (planar transition) and fillet (cylindrical
//! transition) both reduce to the same planar-neighbour heal. CURVED
//! ANALYTIC neighbours route to [`heal_open_transition_mixed`], which
//! handles both curved primaries (plane × cylinder/ruled revolution
//! re-intersection) and curved lateral caps (the re-intersection branch is
//! clipped by curve×surface intersection against the cap's carrier).
//! - COVERED: the WALL OF A THROUGH FEATURE — a drilled bore, or any closed
//! wall whose two rims are each the whole hole loop of the face it was
//! punched through. Those neighbours were never meant to meet, so there is
//! no re-intersection to make: the wall and both hole loops are dropped and
//! the neighbours close back over the opening, un-drilling the hole. Nothing
//! is refit (the surviving carriers and outer loops are untouched), and the
//! genus drops by the handle that goes with it. A mouth that is TANGENT to
//! the boundary of the face it opens through is covered by the same cap: the
//! tangency pinches that face and the arrangement splits it, so the rim
//! arrives as runs of several faces' loops instead of as a hole loop, and
//! dropping it rejoins the pieces into the face they were (see
//! `direct_edit/delete_faces.rs`).
//! - COVERED, as a SET: a BAND across a mirrored union — a fillet groove that
//! runs over a part and down its side, flanked on both sides by cosurface
//! TWINS of one plane or one fillet cylinder. Its free boundary stops on
//! setback and tangent lines the band interrupted rather than on a gap
//! between two carriers, so the rejoin BRIDGES each interrupted line across
//! the band and the twins close back into one face
//! (`direct_edit/delete_faces.rs`).
//! - COVERED, as a SET: a whole CORNER BLEND — a three-sided vertex blend and
//! the three four-sided strips that meet on it. One face at a time it is
//! ill-posed (a strip's walls re-intersect in the sharp edge, which passes
//! the corner sphere at `r·√2` and never meets it, so the strip has no cap to
//! clip against); taken together the walls close a cycle of three carriers
//! and each strip's corner end is where its own recovered edge meets the
//! third wall (`direct_edit/corner_heal.rs`).
//! - COVERED, as a SET: a CLOSED BAND — any ring of faces whose free boundary
//! is one closed run on each of exactly two survivors, such as a stepped nut
//! pocket sunk over a through bore. It is the closed transition strip with
//! many faces: the two survivors are extended, re-intersected in closed
//! form, and each run collapses onto the rim, so the bore runs on up to the
//! face the pocket opened through (`direct_edit/closed_band.rs`).
//! - COVERED, as a SET: a whole BLEND NETWORK over planar faces — the strips,
//! vertex blends and mitres a fillet left around a gusset's foot, with more
//! than one corner and strips that end on other strips. Each cluster of end
//! edges shrinks to the vertex its planes meet in, and each strip becomes the
//! sharp edge between its two clusters (`direct_edit/blend_network_heal.rs`).
//! A cylindrical strip the selection leaves standing is KEPT: where it mitred
//! into a deleted strip it now ends on the cap plane square to its axis, on
//! that plane's circular section; any other curved face left beside a network
//! is refused by name.
//! - COVERED, as a SET (see [`delete_faces_and_heal`] and
//! `direct_edit/delete_faces.rs`): a BLIND pocket, a blind bore, or a boss —
//! every face of the feature selected together. One face at a time these are
//! a multi-face gap with nothing to re-intersect; taken together they are a
//! PATCH whose free boundary is the whole hole loop of the face the feature
//! was sunk through, and the same cap that un-drills a bore un-cuts them.
//! - DEFERRED (returns a clear `Err`, never a bad solid): free-form
//! neighbours (need NURBS carrier extension + marched re-intersect),
//! transition faces that are not 4-sided (multi-face gaps) — the cap lane
//! reads any number of boundary edges, but a face that has to be healed by
//! RE-INTERSECTION still has to be four-sided — a neighbour that
//! borders the transition more than once (periodic/closed transition), a
//! BLIND pocket's wall on its own (the wall and its floor disc are a
//! two-face gap — select the floor as well and the cap lane takes it), a
//! wall whose removal would SEVER the body into two parts (a post joining
//! two otherwise separate plates wears a through wall's exact signature, so
//! the cap checks the shell is still connected before it hands anything
//! back), and configurations where the neighbours cannot re-intersect
//! cleanly (non-adjacent healing, or parallel planes that are not a through
//! wall).
use crate;
use crate;
use crate;
use crate;
use crate::;
use ;
pub use ;
use *;
use *;
use *;
use *;
use *;
use *;
use *;
use *;
use *;
use *;
use *;
use *;
use *;
/// The slugs of the direct-edit refusals the app explains to a user (its
/// face-transform help, `BREP_render::face_transform_help`), shared by each
/// mint and by [`face_transform_reason`].
use *;
/// Why a Transform Face refused, as far as the app explains it — read off the
/// refusal's CLASS and slug, never its text, so a reworded refusal keeps its
/// explanation and a refusal that merely mentions "parallel" does not borrow
/// one. `None` is every other refusal: the app shows the kernel's own words.
/// [`FaceTransformReason`] of a refusal, by class and slug.
pub use ;
pub use delete_faces_and_heal;
pub use ;
pub use move_faces;
pub use rotate_faces;
pub use rotate_faces_rigid;
// The ROUTING reading: which faces a moved selection would have to open a new
// hole in, measured before anything is built. Public so the matrix probe can
// print the partition over every cell without the road being wired to it.
pub use ;
// The RE-CUT road: the same edit performed from the original body and the
// motion, for a translation whose answer needs the topology to change.
pub use ;
pub use offset_ruled_face;
pub use offset_sphere_face;
pub use offset_torus_face;
pub use offset_revolution_face;
pub use offset_freeform_face;