From 2a434d59c3737a7b446ed0f4767520bda7de6716 Mon Sep 17 00:00:00 2001 From: bherbruck Date: Tue, 13 Oct 2026 04:12:24 -0400 Subject: [PATCH] Picks on a moved or pasted component build where it is shown (#558) (#610) Construction axes, points and planes resolve their picks against the model as their component sees it (in the root, every placement, pasted instances too), and a Hole picked on another component's body cuts that body. components-arm 355 -> 502/594 and joints-hinge 304/390 -> 371/408 in the action matrix. Co-Authored-By: Claude Opus 5.5 --- apps/solidcraft-cli/tests/action_matrix.rs | 4 +- crates/doc/src/eval.rs | 19 +- crates/engine/src/cmd/features.rs | 28 ++- crates/engine/src/frames_tests.rs | 34 +++ tests/action_matrix/baseline.json | 256 ++++++++++----------- 5 files changed, 208 insertions(+), 133 deletions(-) diff --git a/apps/solidcraft-cli/tests/action_matrix.rs b/apps/solidcraft-cli/tests/action_matrix.rs index ba359bc2..5b47da80 100644 --- a/apps/solidcraft-cli/tests/action_matrix.rs +++ b/apps/solidcraft-cli/tests/action_matrix.rs @@ -1012,7 +1012,6 @@ fn a_sketch_on_a_patterned_boss_top() { } #[test] -#[ignore = "fails until #558 is fixed"] fn construction_geometry_and_holes_on_a_moved_component() { let moved = || { vec![ @@ -1026,6 +1025,9 @@ fn construction_geometry_and_holes_on_a_moved_component() { json!({"command": "construct.axis.edge", "params": {"edge": {"edge": [25, 50, 0]}}}), json!({"command": "construct.plane.three_points", "params": {"a": {"vertex": [20, 50, 0]}, "b": {"vertex": [30, 50, 0]}, "c": {"vertex": [20, 54, 0]}}}), json!({"command": "solid.hole", "params": {"position": [25, 52, 4], "diameter": 1}}), + json!({"command": "solid.press_pull", "params": {"face": [25, 52, 4], "distance": 1}}), + json!({"command": "solid.extrude", "params": {"face": [25, 52, 4], "distance": 1, "operation": "join"}}), + json!({"command": "construct.plane.along_path", "params": {"path": {"edge": [25, 50, 0]}, "t": 0.5}}), ] { let mut c = moved(); c.push(step); diff --git a/crates/doc/src/eval.rs b/crates/doc/src/eval.rs index 4457d01c..5c7d8d42 100644 --- a/crates/doc/src/eval.rs +++ b/crates/doc/src/eval.rs @@ -3453,13 +3453,15 @@ fn eval_feature(doc: &Document, vals: &BTreeMap, f: &Feature, st: let fst = crate::state_in_face_anchor_frame(doc, st, anchor, f.component)?; doc.resolve_attached_plane(vals, plane, f.component, st, &fst)? } - None => doc.resolve_plane_in(vals, plane, 0, Some(st))?, + // Picks on bodies of other (moved) components are where those bodies are shown. + None => doc.resolve_plane_in(vals, plane, 0, Some(&construction_state(doc, st, f.component)))?, }; st.construct.push(crate::construct::Construct { feature: f.id, name: f.name.clone(), geom: crate::construct::ConstructGeom::Plane(pl) }); Ok(()) } FeatureKind::ConstructionAxis { def } => { - let (origin, dir) = crate::construct::resolve_axis(&crate::construct::Ctx { doc, vals, st, depth: 0 }, def)?; + let (origin, dir) = + crate::construct::resolve_axis(&crate::construct::Ctx { doc, vals, st: &construction_state(doc, st, f.component), depth: 0 }, def)?; st.construct.push(crate::construct::Construct { feature: f.id, name: f.name.clone(), @@ -3468,7 +3470,8 @@ fn eval_feature(doc: &Document, vals: &BTreeMap, f: &Feature, st: Ok(()) } FeatureKind::ConstructionPoint { def } => { - let p = crate::construct::resolve_point(&crate::construct::Ctx { doc, vals, st, depth: 0 }, def)?; + let p = + crate::construct::resolve_point(&crate::construct::Ctx { doc, vals, st: &construction_state(doc, st, f.component), depth: 0 }, def)?; st.construct.push(crate::construct::Construct { feature: f.id, name: f.name.clone(), geom: crate::construct::ConstructGeom::Point(p) }); Ok(()) } @@ -3925,6 +3928,16 @@ fn unique_body_name(st: &ModelState, base: &str) -> String { /// it are moved into its frame (through both placements), so a sketch on another component's /// face finds the face where it is shown and projects its edges there. The model itself when /// every placement agrees (the usual case). +/// What construction geometry of component `comp` is built on: the model as that component sees +/// it, other components' bodies where they are placed. In the root, every placement of a +/// component (its pasted instances too) is there, as the viewport shows it. +fn construction_state<'a>(doc: &Document, st: &'a ModelState, comp: u64) -> std::borrow::Cow<'a, ModelState> { + if comp == 0 && !doc.occurrences.is_empty() { + return std::borrow::Cow::Owned(world_state(doc, st)); + } + state_in_frame(doc, st, comp) +} + pub fn state_in_frame<'a>(doc: &Document, st: &'a ModelState, comp: u64) -> std::borrow::Cow<'a, ModelState> { state_in_frame_at(doc, st, comp, doc.component_transform(comp)) } diff --git a/crates/engine/src/cmd/features.rs b/crates/engine/src/cmd/features.rs index 1f23f5d6..8bd74271 100644 --- a/crates/engine/src/cmd/features.rs +++ b/crates/engine/src/cmd/features.rs @@ -1310,7 +1310,33 @@ fn hole(s: &mut Session, p: &Value) -> Result { Some(v) => Some(vec3(v).ok_or_else(|| bad(cmd, "`to` must be a point [x, y, z] on the face to drill to"))?), None => None, }; - add_feature(s, p, FeatureKind::Hole { position, direction, diameter, depth, hole: kind, points: points.map(|x| x.0), thread, to }) + // A hole picked on a body of another component (a moved one, shown where it is placed) cuts + // that body: the pick is already in that body's frame, and the component's own bodies alone + // would leave nothing to cut. + let mut p = p.clone(); + if points.is_none() + && p.get("participants").is_none() + && let Some(body) = body_of_other_component_at(s, position) + { + p["participants"] = json!([body]); + } + add_feature(s, &p, FeatureKind::Hole { position, direction, diameter, depth, hole: kind, points: points.map(|x| x.0), thread, to }) +} + +/// The body whose face is nearest `p` (within its pick tolerance), when it belongs to another +/// component than the active one. +fn body_of_other_component_at(s: &Session, p: Vec3) -> Option { + let st = s.model.state(); + let (_, body) = st + .bodies + .iter() + .filter(|b| !b.body.is_mesh()) + .filter_map(|b| { + let (d, _) = solidcraft_doc::appearance::nearest_face(b, p)?; + (d <= solidcraft_doc::appearance::pick_tolerance(b)).then_some((d, b)) + }) + .min_by(|a, b| a.0.total_cmp(&b.0))?; + (s.doc.model_body_component(body) != s.active_component).then(|| body.name.clone()) } /// The points of a sketch a hole drills at when only the sketch is given. diff --git a/crates/engine/src/frames_tests.rs b/crates/engine/src/frames_tests.rs index 16a2d8f3..46dc008c 100644 --- a/crates/engine/src/frames_tests.rs +++ b/crates/engine/src/frames_tests.rs @@ -252,3 +252,37 @@ fn root_sketch_on_a_moved_components_face() { let pts = sketch_world_points(&mut s, "Top"); assert!(pts.iter().any(|p| near(*p, Vec3::new(-30.0, 40.0, 25.0))), "{pts:?}"); } + +/// (#558) With the root active, construction geometry, a hole and Press Pull picked on a moved +/// component land on it where it is shown, and so do picks on a pasted instance. +#[test] +fn root_picks_on_a_moved_component_build_where_it_is_shown() { + let mut s = moved_part(); + run(&mut s, "component.activate", json!({"component": "root"})); + // The block spans world x 50…80, y 0…20, z 0…10. + run(&mut s, "construct.axis.edge", json!({"edge": {"edge": [65, 0, 0]}, "name": "FrontEdge"})); + run( + &mut s, + "construct.plane.three_points", + json!({"a": {"vertex": [50, 0, 10]}, "b": {"vertex": [80, 0, 10]}, "c": {"vertex": [50, 20, 10]}, "name": "Lid"}), + ); + let lid = crate::view::construction_planes(&s).into_iter().find(|(_, n, _)| n == "Lid").unwrap().2; + assert!((lid.origin.z - 10.0).abs() < 1e-6 && lid.normal().z.abs() > 1.0 - 1e-9, "{lid:?}"); + let st = s.model.state(); + let axis = st.construct.iter().find(|c| c.name == "FrontEdge").map(|c| c.geom.clone()).unwrap(); + let solidcraft_doc::construct::ConstructGeom::Axis { origin, dir } = axis else { panic!("{axis:?}") }; + assert!(origin.y.abs() < 1e-6 && origin.z.abs() < 1e-6 && dir.x.abs() > 1.0 - 1e-9, "{origin:?} {dir:?}"); + let v0 = volume(&mut s); + run(&mut s, "solid.hole", json!({"position": [60, 10, 10], "diameter": 4, "depth": 5})); + let v1 = volume(&mut s); + assert!(v1 < v0 - 1.0, "the hole cut the moved block: {v0} {v1}"); + run(&mut s, "solid.press_pull", json!({"face": [80, 10, 5], "distance": 2})); + assert!(volume(&mut s) > v1 + 1.0, "press pull grew the moved block"); + assert!(s.model.results.iter().all(|r| r.error.is_none()), "{:?}", s.model.results); + + // A pasted instance 40 mm further along y. + run(&mut s, "occurrence.copy", json!({"component": "Part", "translate": [0, 40, 0]})); + run(&mut s, "construct.plane.along_path", json!({"path": {"edge": [65, 40, 0]}, "t": 0.5, "name": "Across"})); + let across = crate::view::construction_planes(&s).into_iter().find(|(_, n, _)| n == "Across").unwrap().2; + assert!((across.origin.y - 40.0).abs() < 1e-6, "{across:?}"); +} diff --git a/tests/action_matrix/baseline.json b/tests/action_matrix/baseline.json index 006e7985..25f51a8a 100644 --- a/tests/action_matrix/baseline.json +++ b/tests/action_matrix/baseline.json @@ -2,72 +2,72 @@ "about": "The action matrix's ratchet: design, entity, the actions tried on it (failing ones marked !). apps/solidcraft-cli/tests/action_matrix.rs, docs/action-matrix.md. Update with cargo xtask action-matrix --bless.", "designs": { "corpus/components-arm": { - "ArmBody (Arm:2)/F4:+x": "!face.angle_plane !face.draft_neutral !face.extrude face.hole !face.midplane face.offset_plane !face.press_pull face.shell face.sketch", - "ArmBody (Arm:2)/F4:+x|F4:+y": "!edge.axis !edge.chamfer edge.fillet !edge.normal_plane !edge.project", - "ArmBody (Arm:2)/F4:+x|F4:+z": "!edge.axis !edge.chamfer edge.fillet !edge.normal_plane !edge.project", - "ArmBody (Arm:2)/F4:+x|F4:-y": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane !edge.project", - "ArmBody (Arm:2)/F4:+x|F4:-z": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane !edge.project", - "ArmBody (Arm:2)/F4:+x|F5:blend:F4:+y|F4:+z": "!edge.chamfer edge.fillet !edge.normal_plane !edge.project", - "ArmBody (Arm:2)/F4:+y": "!face.angle_plane !face.draft_neutral !face.extrude face.hole !face.midplane face.offset_plane !face.press_pull face.shell face.sketch", - "ArmBody (Arm:2)/F4:+y|F4:-x": "!edge.axis !edge.chamfer edge.fillet !edge.normal_plane !edge.project", - "ArmBody (Arm:2)/F4:+y|F4:-z": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane !edge.project", - "ArmBody (Arm:2)/F4:+y|F5:blend:F4:+y|F4:+z": "!edge.axis !edge.normal_plane !edge.project", - "ArmBody (Arm:2)/F4:+z": "!face.angle_plane !face.draft_neutral !face.extrude face.hole !face.midplane face.offset_plane !face.press_pull face.shell face.sketch", - "ArmBody (Arm:2)/F4:+z|F4:-x": "!edge.axis !edge.chamfer edge.fillet !edge.normal_plane !edge.project", - "ArmBody (Arm:2)/F4:+z|F4:-y": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane !edge.project", - "ArmBody (Arm:2)/F4:+z|F5:blend:F4:+y|F4:+z": "!edge.axis !edge.normal_plane !edge.project", - "ArmBody (Arm:2)/F4:-x": "!face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", - "ArmBody (Arm:2)/F4:-x|F4:-y": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane !edge.project", - "ArmBody (Arm:2)/F4:-x|F4:-z": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane !edge.project", - "ArmBody (Arm:2)/F4:-x|F5:blend:F4:+y|F4:+z": "!edge.chamfer edge.fillet !edge.normal_plane !edge.project", - "ArmBody (Arm:2)/F4:-y": "!face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", - "ArmBody (Arm:2)/F4:-y|F4:-z": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane !edge.project", - "ArmBody (Arm:2)/F4:-z": "!face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", - "ArmBody (Arm:2)/F5:blend:F4:+y|F4:+z": "!curved.axis !curved.tangent_plane", + "ArmBody (Arm:2)/F4:+x": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.midplane face.offset_plane !face.press_pull face.shell face.sketch", + "ArmBody (Arm:2)/F4:+x|F4:+y": "edge.axis !edge.chamfer edge.fillet edge.normal_plane !edge.project", + "ArmBody (Arm:2)/F4:+x|F4:+z": "edge.axis !edge.chamfer edge.fillet edge.normal_plane !edge.project", + "ArmBody (Arm:2)/F4:+x|F4:-y": "edge.axis edge.chamfer edge.fillet edge.normal_plane !edge.project", + "ArmBody (Arm:2)/F4:+x|F4:-z": "edge.axis edge.chamfer edge.fillet edge.normal_plane !edge.project", + "ArmBody (Arm:2)/F4:+x|F5:blend:F4:+y|F4:+z": "!edge.chamfer edge.fillet edge.normal_plane !edge.project", + "ArmBody (Arm:2)/F4:+y": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.midplane face.offset_plane !face.press_pull face.shell face.sketch", + "ArmBody (Arm:2)/F4:+y|F4:-x": "edge.axis !edge.chamfer edge.fillet edge.normal_plane !edge.project", + "ArmBody (Arm:2)/F4:+y|F4:-z": "edge.axis edge.chamfer edge.fillet edge.normal_plane !edge.project", + "ArmBody (Arm:2)/F4:+y|F5:blend:F4:+y|F4:+z": "edge.axis edge.normal_plane !edge.project", + "ArmBody (Arm:2)/F4:+z": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.midplane face.offset_plane !face.press_pull face.shell face.sketch", + "ArmBody (Arm:2)/F4:+z|F4:-x": "edge.axis !edge.chamfer edge.fillet edge.normal_plane !edge.project", + "ArmBody (Arm:2)/F4:+z|F4:-y": "edge.axis edge.chamfer edge.fillet edge.normal_plane !edge.project", + "ArmBody (Arm:2)/F4:+z|F5:blend:F4:+y|F4:+z": "edge.axis edge.normal_plane !edge.project", + "ArmBody (Arm:2)/F4:-x": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", + "ArmBody (Arm:2)/F4:-x|F4:-y": "edge.axis edge.chamfer edge.fillet edge.normal_plane !edge.project", + "ArmBody (Arm:2)/F4:-x|F4:-z": "edge.axis edge.chamfer edge.fillet edge.normal_plane !edge.project", + "ArmBody (Arm:2)/F4:-x|F5:blend:F4:+y|F4:+z": "!edge.chamfer edge.fillet edge.normal_plane !edge.project", + "ArmBody (Arm:2)/F4:-y": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", + "ArmBody (Arm:2)/F4:-y|F4:-z": "edge.axis edge.chamfer edge.fillet edge.normal_plane !edge.project", + "ArmBody (Arm:2)/F4:-z": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", + "ArmBody (Arm:2)/F5:blend:F4:+y|F4:+z": "curved.axis curved.tangent_plane", "ArmBody (Arm:2)/body": "body.copy body.mirror body.move !body.pattern", - "ArmBody (Arm:2)/v[F4:+x & F4:+y & F4:-z]": "!vertex.plane_three_points vertex.point", - "ArmBody (Arm:2)/v[F4:+x & F4:+y & F5:blend:F4:+y|F4:+z]": "!vertex.plane_three_points vertex.point", - "ArmBody (Arm:2)/v[F4:+x & F4:+z & F4:-y]": "!vertex.plane_three_points vertex.point", - "ArmBody (Arm:2)/v[F4:+x & F4:+z & F5:blend:F4:+y|F4:+z]": "!vertex.plane_three_points vertex.point", - "ArmBody (Arm:2)/v[F4:+x & F4:-y & F4:-z]": "!vertex.plane_three_points vertex.point", - "ArmBody (Arm:2)/v[F4:+y & F4:-x & F4:-z]": "!vertex.plane_three_points vertex.point", - "ArmBody (Arm:2)/v[F4:+y & F4:-x & F5:blend:F4:+y|F4:+z]": "!vertex.plane_three_points vertex.point", - "ArmBody (Arm:2)/v[F4:+z & F4:-x & F4:-y]": "!vertex.plane_three_points vertex.point", - "ArmBody (Arm:2)/v[F4:+z & F4:-x & F5:blend:F4:+y|F4:+z]": "!vertex.plane_three_points vertex.point", - "ArmBody (Arm:2)/v[F4:-x & F4:-y & F4:-z]": "!vertex.plane_three_points vertex.point", - "ArmBody/F4:+x": "!face.angle_plane !face.draft_neutral !face.extrude face.hole !face.midplane face.offset_plane !face.press_pull face.shell face.sketch", - "ArmBody/F4:+x|F4:+y": "!edge.axis !edge.chamfer edge.fillet !edge.normal_plane edge.project", - "ArmBody/F4:+x|F4:+z": "!edge.axis !edge.chamfer edge.fillet !edge.normal_plane edge.project", - "ArmBody/F4:+x|F4:-y": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "ArmBody/F4:+x|F4:-z": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "ArmBody/F4:+x|F5:blend:F4:+y|F4:+z": "!edge.chamfer edge.fillet !edge.normal_plane edge.project", - "ArmBody/F4:+y": "!face.angle_plane !face.draft_neutral !face.extrude face.hole !face.midplane face.offset_plane !face.press_pull face.shell face.sketch", - "ArmBody/F4:+y|F4:-x": "!edge.axis !edge.chamfer edge.fillet !edge.normal_plane edge.project", - "ArmBody/F4:+y|F4:-z": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "ArmBody/F4:+y|F5:blend:F4:+y|F4:+z": "!edge.axis !edge.normal_plane edge.project", - "ArmBody/F4:+z": "!face.angle_plane !face.draft_neutral !face.extrude face.hole !face.midplane face.offset_plane !face.press_pull face.shell face.sketch", - "ArmBody/F4:+z|F4:-x": "!edge.axis !edge.chamfer edge.fillet !edge.normal_plane edge.project", - "ArmBody/F4:+z|F4:-y": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "ArmBody/F4:+z|F5:blend:F4:+y|F4:+z": "!edge.axis !edge.normal_plane edge.project", - "ArmBody/F4:-x": "!face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", - "ArmBody/F4:-x|F4:-y": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "ArmBody/F4:-x|F4:-z": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "ArmBody/F4:-x|F5:blend:F4:+y|F4:+z": "!edge.chamfer edge.fillet !edge.normal_plane edge.project", - "ArmBody/F4:-y": "!face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", - "ArmBody/F4:-y|F4:-z": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "ArmBody/F4:-z": "!face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", - "ArmBody/F5:blend:F4:+y|F4:+z": "!curved.axis !curved.tangent_plane", + "ArmBody (Arm:2)/v[F4:+x & F4:+y & F4:-z]": "vertex.plane_three_points vertex.point", + "ArmBody (Arm:2)/v[F4:+x & F4:+y & F5:blend:F4:+y|F4:+z]": "vertex.plane_three_points vertex.point", + "ArmBody (Arm:2)/v[F4:+x & F4:+z & F4:-y]": "vertex.plane_three_points vertex.point", + "ArmBody (Arm:2)/v[F4:+x & F4:+z & F5:blend:F4:+y|F4:+z]": "vertex.plane_three_points vertex.point", + "ArmBody (Arm:2)/v[F4:+x & F4:-y & F4:-z]": "vertex.plane_three_points vertex.point", + "ArmBody (Arm:2)/v[F4:+y & F4:-x & F4:-z]": "vertex.plane_three_points vertex.point", + "ArmBody (Arm:2)/v[F4:+y & F4:-x & F5:blend:F4:+y|F4:+z]": "vertex.plane_three_points vertex.point", + "ArmBody (Arm:2)/v[F4:+z & F4:-x & F4:-y]": "vertex.plane_three_points vertex.point", + "ArmBody (Arm:2)/v[F4:+z & F4:-x & F5:blend:F4:+y|F4:+z]": "vertex.plane_three_points vertex.point", + "ArmBody (Arm:2)/v[F4:-x & F4:-y & F4:-z]": "vertex.plane_three_points vertex.point", + "ArmBody/F4:+x": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.midplane face.offset_plane !face.press_pull face.shell face.sketch", + "ArmBody/F4:+x|F4:+y": "edge.axis !edge.chamfer edge.fillet edge.normal_plane edge.project", + "ArmBody/F4:+x|F4:+z": "edge.axis !edge.chamfer edge.fillet edge.normal_plane edge.project", + "ArmBody/F4:+x|F4:-y": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "ArmBody/F4:+x|F4:-z": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "ArmBody/F4:+x|F5:blend:F4:+y|F4:+z": "!edge.chamfer edge.fillet edge.normal_plane edge.project", + "ArmBody/F4:+y": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.midplane face.offset_plane !face.press_pull face.shell face.sketch", + "ArmBody/F4:+y|F4:-x": "edge.axis !edge.chamfer edge.fillet edge.normal_plane edge.project", + "ArmBody/F4:+y|F4:-z": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "ArmBody/F4:+y|F5:blend:F4:+y|F4:+z": "edge.axis edge.normal_plane edge.project", + "ArmBody/F4:+z": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.midplane face.offset_plane !face.press_pull face.shell face.sketch", + "ArmBody/F4:+z|F4:-x": "edge.axis !edge.chamfer edge.fillet edge.normal_plane edge.project", + "ArmBody/F4:+z|F4:-y": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "ArmBody/F4:+z|F5:blend:F4:+y|F4:+z": "edge.axis edge.normal_plane edge.project", + "ArmBody/F4:-x": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", + "ArmBody/F4:-x|F4:-y": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "ArmBody/F4:-x|F4:-z": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "ArmBody/F4:-x|F5:blend:F4:+y|F4:+z": "!edge.chamfer edge.fillet edge.normal_plane edge.project", + "ArmBody/F4:-y": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", + "ArmBody/F4:-y|F4:-z": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "ArmBody/F4:-z": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", + "ArmBody/F5:blend:F4:+y|F4:+z": "curved.axis curved.tangent_plane", "ArmBody/body": "body.copy body.mirror body.move body.pattern", - "ArmBody/v[F4:+x & F4:+y & F4:-z]": "!vertex.plane_three_points vertex.point", - "ArmBody/v[F4:+x & F4:+y & F5:blend:F4:+y|F4:+z]": "!vertex.plane_three_points vertex.point", - "ArmBody/v[F4:+x & F4:+z & F4:-y]": "!vertex.plane_three_points vertex.point", - "ArmBody/v[F4:+x & F4:+z & F5:blend:F4:+y|F4:+z]": "!vertex.plane_three_points vertex.point", - "ArmBody/v[F4:+x & F4:-y & F4:-z]": "!vertex.plane_three_points vertex.point", - "ArmBody/v[F4:+y & F4:-x & F4:-z]": "!vertex.plane_three_points vertex.point", - "ArmBody/v[F4:+y & F4:-x & F5:blend:F4:+y|F4:+z]": "!vertex.plane_three_points vertex.point", - "ArmBody/v[F4:+z & F4:-x & F4:-y]": "!vertex.plane_three_points vertex.point", - "ArmBody/v[F4:+z & F4:-x & F5:blend:F4:+y|F4:+z]": "!vertex.plane_three_points vertex.point", - "ArmBody/v[F4:-x & F4:-y & F4:-z]": "!vertex.plane_three_points vertex.point", + "ArmBody/v[F4:+x & F4:+y & F4:-z]": "vertex.plane_three_points vertex.point", + "ArmBody/v[F4:+x & F4:+y & F5:blend:F4:+y|F4:+z]": "vertex.plane_three_points vertex.point", + "ArmBody/v[F4:+x & F4:+z & F4:-y]": "vertex.plane_three_points vertex.point", + "ArmBody/v[F4:+x & F4:+z & F5:blend:F4:+y|F4:+z]": "vertex.plane_three_points vertex.point", + "ArmBody/v[F4:+x & F4:-y & F4:-z]": "vertex.plane_three_points vertex.point", + "ArmBody/v[F4:+y & F4:-x & F4:-z]": "vertex.plane_three_points vertex.point", + "ArmBody/v[F4:+y & F4:-x & F5:blend:F4:+y|F4:+z]": "vertex.plane_three_points vertex.point", + "ArmBody/v[F4:+z & F4:-x & F4:-y]": "vertex.plane_three_points vertex.point", + "ArmBody/v[F4:+z & F4:-x & F5:blend:F4:+y|F4:+z]": "vertex.plane_three_points vertex.point", + "ArmBody/v[F4:-x & F4:-y & F4:-z]": "vertex.plane_three_points vertex.point", "Base/F12:side:c1#1": "curved.axis curved.tangent_plane", "Base/F12:side:c1#1|F1:+z": "edge.chamfer edge.fillet edge.normal_plane edge.project", "Base/F12:side:c1#1|F1:-z": "edge.chamfer edge.fillet edge.normal_plane edge.project", @@ -105,39 +105,39 @@ "Base/v[F1:+y & F1:-x & F1:-z]": "vertex.plane_three_points vertex.point", "Base/v[F1:+z & F1:-x & F1:-y]": "vertex.plane_three_points vertex.point", "Base/v[F1:-x & F1:-y & F1:-z]": "vertex.plane_three_points vertex.point", - "Body1/F10:blend:F9:+y|F9:+z": "!curved.axis !curved.tangent_plane", - "Body1/F10:blend:F9:+y|F9:+z|F9:+x": "!edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body1/F10:blend:F9:+y|F9:+z|F9:+y": "!edge.axis !edge.normal_plane edge.project", - "Body1/F10:blend:F9:+y|F9:+z|F9:+z": "!edge.axis !edge.normal_plane edge.project", - "Body1/F10:blend:F9:+y|F9:+z|F9:-x": "!edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body1/F9:+x": "!face.angle_plane !face.draft_neutral !face.extrude face.hole !face.midplane face.offset_plane !face.press_pull face.shell face.sketch", - "Body1/F9:+x|F9:+y": "!edge.axis !edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body1/F9:+x|F9:+z": "!edge.axis !edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body1/F9:+x|F9:-y": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body1/F9:+x|F9:-z": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body1/F9:+y": "!face.angle_plane !face.draft_neutral !face.extrude face.hole !face.midplane face.offset_plane !face.press_pull face.shell face.sketch", - "Body1/F9:+y|F9:-x": "!edge.axis !edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body1/F9:+y|F9:-z": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body1/F9:+z": "!face.angle_plane !face.draft_neutral !face.extrude face.hole !face.midplane face.offset_plane !face.press_pull face.shell face.sketch", - "Body1/F9:+z|F9:-x": "!edge.axis !edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body1/F9:+z|F9:-y": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body1/F9:-x": "!face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", - "Body1/F9:-x|F9:-y": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body1/F9:-x|F9:-z": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body1/F9:-y": "!face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", - "Body1/F9:-y|F9:-z": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body1/F9:-z": "!face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", + "Body1/F10:blend:F9:+y|F9:+z": "curved.axis curved.tangent_plane", + "Body1/F10:blend:F9:+y|F9:+z|F9:+x": "!edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body1/F10:blend:F9:+y|F9:+z|F9:+y": "edge.axis edge.normal_plane edge.project", + "Body1/F10:blend:F9:+y|F9:+z|F9:+z": "edge.axis edge.normal_plane edge.project", + "Body1/F10:blend:F9:+y|F9:+z|F9:-x": "!edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body1/F9:+x": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.midplane face.offset_plane !face.press_pull face.shell face.sketch", + "Body1/F9:+x|F9:+y": "edge.axis !edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body1/F9:+x|F9:+z": "edge.axis !edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body1/F9:+x|F9:-y": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body1/F9:+x|F9:-z": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body1/F9:+y": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.midplane face.offset_plane !face.press_pull face.shell face.sketch", + "Body1/F9:+y|F9:-x": "edge.axis !edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body1/F9:+y|F9:-z": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body1/F9:+z": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.midplane face.offset_plane !face.press_pull face.shell face.sketch", + "Body1/F9:+z|F9:-x": "edge.axis !edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body1/F9:+z|F9:-y": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body1/F9:-x": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", + "Body1/F9:-x|F9:-y": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body1/F9:-x|F9:-z": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body1/F9:-y": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", + "Body1/F9:-y|F9:-z": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body1/F9:-z": "face.angle_plane !face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", "Body1/body": "body.copy body.mirror body.move body.pattern", - "Body1/v[F10:blend:F9:+y|F9:+z & F9:+x & F9:+y]": "!vertex.plane_three_points vertex.point", - "Body1/v[F10:blend:F9:+y|F9:+z & F9:+x & F9:+z]": "!vertex.plane_three_points vertex.point", - "Body1/v[F10:blend:F9:+y|F9:+z & F9:+y & F9:-x]": "!vertex.plane_three_points vertex.point", - "Body1/v[F10:blend:F9:+y|F9:+z & F9:+z & F9:-x]": "!vertex.plane_three_points vertex.point", - "Body1/v[F9:+x & F9:+y & F9:-z]": "!vertex.plane_three_points vertex.point", - "Body1/v[F9:+x & F9:+z & F9:-y]": "!vertex.plane_three_points vertex.point", - "Body1/v[F9:+x & F9:-y & F9:-z]": "!vertex.plane_three_points vertex.point", - "Body1/v[F9:+y & F9:-x & F9:-z]": "!vertex.plane_three_points vertex.point", - "Body1/v[F9:+z & F9:-x & F9:-y]": "!vertex.plane_three_points vertex.point", - "Body1/v[F9:-x & F9:-y & F9:-z]": "!vertex.plane_three_points vertex.point", + "Body1/v[F10:blend:F9:+y|F9:+z & F9:+x & F9:+y]": "vertex.plane_three_points vertex.point", + "Body1/v[F10:blend:F9:+y|F9:+z & F9:+x & F9:+z]": "vertex.plane_three_points vertex.point", + "Body1/v[F10:blend:F9:+y|F9:+z & F9:+y & F9:-x]": "vertex.plane_three_points vertex.point", + "Body1/v[F10:blend:F9:+y|F9:+z & F9:+z & F9:-x]": "vertex.plane_three_points vertex.point", + "Body1/v[F9:+x & F9:+y & F9:-z]": "vertex.plane_three_points vertex.point", + "Body1/v[F9:+x & F9:+z & F9:-y]": "vertex.plane_three_points vertex.point", + "Body1/v[F9:+x & F9:-y & F9:-z]": "vertex.plane_three_points vertex.point", + "Body1/v[F9:+y & F9:-x & F9:-z]": "vertex.plane_three_points vertex.point", + "Body1/v[F9:+z & F9:-x & F9:-y]": "vertex.plane_three_points vertex.point", + "Body1/v[F9:-x & F9:-y & F9:-z]": "vertex.plane_three_points vertex.point", "design": "load" }, "corpus/issue-489-stacked-join": { @@ -195,7 +195,7 @@ "design": "load" }, "corpus/joints-hinge": { - "Body1/F3:+x": "face.angle_plane face.angle_plane+edit face.draft_neutral !face.extrude !face.hole face.midplane face.offset_plane face.offset_plane+edit !face.press_pull face.shell face.sketch", + "Body1/F3:+x": "face.angle_plane face.angle_plane+edit face.draft_neutral !face.extrude face.hole face.hole+edit face.midplane face.offset_plane face.offset_plane+edit !face.press_pull face.shell face.sketch", "Body1/F3:+x|F3:+y": "edge.axis edge.axis+edit edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit", "Body1/F3:+x|F3:+z": "edge.axis edge.chamfer edge.fillet edge.fillet+edit edge.normal_plane edge.normal_plane+edit edge.project", "Body1/F3:+x|F3:-y": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit", @@ -204,15 +204,15 @@ "Body1/F3:+y|F3:+z": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit", "Body1/F3:+y|F3:-x": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", "Body1/F3:+y|F3:-z": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", - "Body1/F3:+z": "face.angle_plane face.draft_neutral !face.extrude !face.hole face.midplane face.offset_plane !face.press_pull face.shell face.sketch", + "Body1/F3:+z": "face.angle_plane face.draft_neutral !face.extrude face.hole face.hole+edit face.midplane face.offset_plane !face.press_pull face.shell face.sketch", "Body1/F3:+z|F3:-x": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", "Body1/F3:+z|F3:-y": "edge.axis edge.axis+edit edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit", - "Body1/F3:-x": "face.angle_plane face.draft_neutral !face.extrude !face.hole face.offset_plane !face.press_pull face.shell face.sketch face.sketch+edit", + "Body1/F3:-x": "face.angle_plane face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch face.sketch+edit", "Body1/F3:-x|F3:-y": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", "Body1/F3:-x|F3:-z": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", - "Body1/F3:-y": "face.angle_plane face.draft_neutral !face.extrude !face.hole face.offset_plane !face.press_pull face.shell face.sketch", + "Body1/F3:-y": "face.angle_plane face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", "Body1/F3:-y|F3:-z": "edge.axis edge.axis+edit edge.chamfer edge.fillet edge.normal_plane edge.project", - "Body1/F3:-z": "face.angle_plane face.draft_neutral !face.extrude !face.hole face.offset_plane face.offset_plane+edit !face.press_pull face.shell face.shell+edit face.sketch", + "Body1/F3:-z": "face.angle_plane face.draft_neutral !face.extrude face.hole face.hole+edit face.offset_plane face.offset_plane+edit !face.press_pull face.shell face.shell+edit face.sketch", "Body1/body": "body.copy body.mirror body.move body.pattern", "Body1/v[F3:+x & F3:+y & F3:+z]": "vertex.plane_three_points vertex.point", "Body1/v[F3:+x & F3:+y & F3:-z]": "vertex.plane_three_points vertex.point vertex.point+edit", @@ -222,54 +222,54 @@ "Body1/v[F3:+y & F3:-x & F3:-z]": "vertex.plane_three_points vertex.point", "Body1/v[F3:+z & F3:-x & F3:-y]": "vertex.plane_three_points vertex.point", "Body1/v[F3:-x & F3:-y & F3:-z]": "vertex.plane_three_points vertex.point", - "Body2/F4:bottom": "!face.extrude !face.hole face.midplane face.offset_plane !face.press_pull face.shell face.shell+edit face.sketch", + "Body2/F4:bottom": "!face.extrude face.hole face.hole+edit face.midplane face.offset_plane !face.press_pull face.shell face.shell+edit face.sketch", "Body2/F4:bottom|F4:side#1": "edge.chamfer edge.fillet edge.normal_plane edge.project", "Body2/F4:bottom|F4:side#2": "edge.chamfer edge.fillet edge.normal_plane edge.project", "Body2/F4:side#1": "curved.axis curved.axis+edit curved.tangent_plane", "Body2/F4:side#1|F4:top": "edge.chamfer edge.fillet edge.fillet+edit edge.normal_plane edge.project", "Body2/F4:side#2": "!curved.axis curved.tangent_plane", "Body2/F4:side#2|F4:top": "edge.chamfer edge.fillet edge.fillet+edit edge.normal_plane edge.project", - "Body2/F4:top": "!face.extrude !face.hole face.offset_plane !face.press_pull face.shell face.sketch", + "Body2/F4:top": "!face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", "Body2/body": "body.copy body.mirror body.move body.pattern body.pattern+edit", "Body2/v[F4:bottom & F4:side#1 & F4:side#2]": "vertex.point", "Body2/v[F4:bottom & F4:side#1 & F4:side#2] (2)": "vertex.point vertex.point+edit", "Body2/v[F4:side#1 & F4:side#2 & F4:top]": "vertex.point", "Body2/v[F4:side#1 & F4:side#2 & F4:top] (2)": "vertex.point", - "Body3/F7:+x": "!face.angle_plane face.draft_neutral !face.extrude !face.hole !face.midplane face.offset_plane !face.press_pull face.shell face.sketch", - "Body3/F7:+x|F7:+y": "!edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit", - "Body3/F7:+x|F7:+z": "!edge.axis edge.chamfer edge.fillet edge.fillet+edit !edge.normal_plane edge.project", - "Body3/F7:+x|F7:-y": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body3/F7:+x|F7:-z": "!edge.axis edge.chamfer edge.chamfer+edit edge.fillet edge.fillet+edit !edge.normal_plane edge.project", + "Body3/F7:+x": "face.angle_plane face.angle_plane+edit face.draft_neutral !face.extrude face.hole face.midplane face.midplane+edit face.offset_plane !face.press_pull face.shell face.sketch", + "Body3/F7:+x|F7:+y": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit", + "Body3/F7:+x|F7:+z": "edge.axis edge.chamfer edge.fillet edge.fillet+edit edge.normal_plane edge.normal_plane+edit edge.project", + "Body3/F7:+x|F7:-y": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body3/F7:+x|F7:-z": "edge.axis edge.chamfer edge.chamfer+edit edge.fillet edge.fillet+edit edge.normal_plane edge.project", "Body3/F7:+y": "!face.angle_plane face.draft_neutral !face.extrude !face.hole !face.midplane face.offset_plane !face.press_pull face.shell face.sketch", - "Body3/F7:+y|F7:+z": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body3/F7:+y|F7:-x": "!edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit", - "Body3/F7:+y|F7:-z": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project edge.project+edit", - "Body3/F7:+z": "!face.angle_plane face.draft_neutral !face.extrude !face.hole !face.midplane face.offset_plane !face.press_pull face.shell face.shell+edit face.sketch face.sketch+edit", - "Body3/F7:+z|F7:-x": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body3/F7:+z|F7:-y": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project edge.project+edit", - "Body3/F7:-x": "!face.angle_plane face.draft_neutral !face.extrude !face.hole face.offset_plane !face.press_pull face.shell face.shell+edit face.sketch", - "Body3/F7:-x|F7:-y": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body3/F7:-x|F7:-z": "!edge.axis edge.chamfer edge.fillet edge.fillet+edit !edge.normal_plane edge.project", - "Body3/F7:-y": "!face.angle_plane face.draft_neutral !face.extrude !face.hole face.offset_plane !face.press_pull face.shell face.sketch", - "Body3/F7:-y|F7:-z": "!edge.axis edge.chamfer edge.fillet !edge.normal_plane edge.project", - "Body3/F7:-z": "!face.angle_plane face.draft_neutral !face.extrude !face.hole face.offset_plane !face.press_pull face.shell face.shell+edit face.sketch", + "Body3/F7:+y|F7:+z": "edge.axis edge.axis+edit edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body3/F7:+y|F7:-x": "edge.axis edge.axis+edit edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit", + "Body3/F7:+y|F7:-z": "edge.axis edge.axis+edit edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit", + "Body3/F7:+z": "face.angle_plane face.angle_plane+edit face.draft_neutral !face.extrude face.hole face.midplane face.midplane+edit face.offset_plane !face.press_pull face.shell face.shell+edit face.sketch face.sketch+edit", + "Body3/F7:+z|F7:-x": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body3/F7:+z|F7:-y": "edge.axis edge.axis+edit edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit", + "Body3/F7:-x": "face.angle_plane face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.shell+edit face.sketch", + "Body3/F7:-x|F7:-y": "edge.axis edge.axis+edit edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body3/F7:-x|F7:-z": "edge.axis edge.chamfer edge.fillet edge.fillet+edit edge.normal_plane edge.project", + "Body3/F7:-y": "face.angle_plane face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.sketch", + "Body3/F7:-y|F7:-z": "edge.axis edge.axis+edit edge.chamfer edge.fillet edge.normal_plane edge.project", + "Body3/F7:-z": "face.angle_plane face.angle_plane+edit face.draft_neutral !face.extrude face.hole face.offset_plane !face.press_pull face.shell face.shell+edit face.sketch", "Body3/body": "body.copy body.copy+edit body.mirror body.move body.pattern", - "Body3/v[F7:+x & F7:+y & F7:+z]": "!vertex.plane_three_points vertex.point", - "Body3/v[F7:+x & F7:+y & F7:-z]": "!vertex.plane_three_points vertex.point", - "Body3/v[F7:+x & F7:+z & F7:-y]": "!vertex.plane_three_points vertex.point", - "Body3/v[F7:+x & F7:-y & F7:-z]": "!vertex.plane_three_points vertex.point", + "Body3/v[F7:+x & F7:+y & F7:+z]": "vertex.plane_three_points vertex.point", + "Body3/v[F7:+x & F7:+y & F7:-z]": "vertex.plane_three_points vertex.point", + "Body3/v[F7:+x & F7:+z & F7:-y]": "vertex.plane_three_points vertex.point", + "Body3/v[F7:+x & F7:-y & F7:-z]": "vertex.plane_three_points vertex.point", "Body3/v[F7:+y & F7:+z & F7:-x]": "vertex.plane_three_points vertex.point", "Body3/v[F7:+y & F7:-x & F7:-z]": "vertex.plane_three_points vertex.point vertex.point+edit", - "Body3/v[F7:+z & F7:-x & F7:-y]": "!vertex.plane_three_points vertex.point", - "Body3/v[F7:-x & F7:-y & F7:-z]": "!vertex.plane_three_points vertex.point vertex.point+edit", - "Body4/F8:bottom": "!face.extrude !face.hole face.midplane face.offset_plane !face.press_pull face.shell face.sketch", + "Body3/v[F7:+z & F7:-x & F7:-y]": "vertex.plane_three_points vertex.point", + "Body3/v[F7:-x & F7:-y & F7:-z]": "vertex.plane_three_points vertex.point vertex.point+edit", + "Body4/F8:bottom": "!face.extrude face.hole face.hole+edit face.midplane face.offset_plane !face.press_pull face.shell face.sketch", "Body4/F8:bottom|F8:side#1": "edge.chamfer edge.chamfer+edit edge.fillet edge.normal_plane edge.project", "Body4/F8:bottom|F8:side#2": "edge.chamfer edge.chamfer+edit edge.fillet edge.normal_plane edge.project", "Body4/F8:side#1": "curved.axis curved.tangent_plane", "Body4/F8:side#1|F8:top": "edge.chamfer edge.fillet edge.fillet+edit edge.normal_plane edge.project", "Body4/F8:side#2": "curved.axis curved.tangent_plane", "Body4/F8:side#2|F8:top": "edge.chamfer edge.fillet edge.fillet+edit edge.normal_plane edge.project", - "Body4/F8:top": "!face.extrude !face.hole face.offset_plane !face.press_pull face.shell face.shell+edit face.sketch", + "Body4/F8:top": "!face.extrude face.hole face.hole+edit face.offset_plane !face.press_pull face.shell face.shell+edit face.sketch", "Body4/body": "body.copy body.mirror body.move body.pattern", "Body4/v[F8:bottom & F8:side#1 & F8:side#2]": "vertex.point", "Body4/v[F8:bottom & F8:side#1 & F8:side#2] (2)": "vertex.point",