Sketch on every side wall of one sketch extruded up and down (#957)

* Name a side drawn on several sketch curves by all of them

An extrude named each side wall after the one sketch curve its profile
segment lies on. A wall along two coincident lines (squares drawn edge to
edge) or along collinear lines merged into one profile segment had no
single curve, so it was named from geometry and could not carry a sketch
attachment. One sketch extruded up and down and joined (the logo) refused
a sketch on every one of its side walls.

Such a side is now named by every curve it lies on, in sketch order: the
first is its name, the others aliases. The set is fixed by the sketch, so
the name is exact. The refusal message no longer blames merged faces.

Adds the reported logo design and a synthetic up-and-down join to the
action-matrix designs, and a regression test that sketches and extrudes on
every flat face, fresh and after save and reopen.

Fixes #954

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Action matrix: record the up-and-down join designs

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
This commit is contained in:
bherbruckandClaude Opus 5.5 authored and GitHub committed 2026-10-14 01:00:04 -04:00
1 parent 9f76cca8b4
commit ea23401710
9 files changed
+305 -13

No files matched your search

+130
View File
@@ -1662,6 +1662,71 @@
"Enclosure/v[F4:inner:F2:side:l3 & F4:inner:F3:blend:F2:side:l2|F2:side:l3] (2)": "vertex.point",
"design": "load"
},
"demo/logo-up-down-join": {
"Body2/F6:side:l1": "face.angle_plane face.draft_neutral face.extrude face.hole face.midplane face.offset_plane face.press_pull face.shell face.sketch face.sketch+edit",
"Body2/F6:side:l10": "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 face.sketch+edit",
"Body2/F6:side:l10|F6:side:l7": "edge.axis edge.chamfer edge.chamfer+edit edge.fillet edge.fillet+edit edge.normal_plane edge.project",
"Body2/F6:side:l10|F6:side:l9": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body2/F6:side:l10|F6:top": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body2/F6:side:l10|F7:bottom": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.normal_plane+edit edge.project",
"Body2/F6:side:l10|F7:start": "edge.axis edge.axis+edit edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit",
"Body2/F6:side:l1|F6:side:l10": "edge.axis edge.chamfer edge.chamfer+edit edge.fillet edge.fillet+edit edge.normal_plane edge.normal_plane+edit edge.project",
"Body2/F6:side:l1|F6:side:l4": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit",
"Body2/F6:side:l1|F6:top": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body2/F6:side:l1|F7:start": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body2/F6:side:l4": "face.angle_plane face.draft_neutral face.extrude face.extrude+edit face.hole face.midplane face.offset_plane face.press_pull face.press_pull+edit face.shell face.sketch",
"Body2/F6:side:l4|F6:side:l7": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit",
"Body2/F6:side:l4|F6:top": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body2/F6:side:l4|F7:start": "edge.axis edge.chamfer edge.chamfer+edit edge.fillet edge.normal_plane edge.normal_plane+edit edge.project",
"Body2/F6:side:l7": "face.angle_plane face.draft_neutral face.extrude face.hole face.midplane face.midplane+edit face.offset_plane face.press_pull !face.shell face.sketch face.sketch+edit",
"Body2/F6:side:l7|F6:side:l8": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit",
"Body2/F6:side:l7|F6:top": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body2/F6:side:l7|F7:bottom": "edge.axis edge.chamfer edge.chamfer+edit edge.fillet edge.normal_plane edge.normal_plane+edit edge.project",
"Body2/F6:side:l7|F7:start": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body2/F6:side:l8": "face.angle_plane face.draft_neutral face.draft_neutral+edit face.extrude face.extrude+edit face.hole face.offset_plane face.press_pull face.press_pull+edit !face.shell face.sketch",
"Body2/F6:side:l8|F6:side:l9": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit",
"Body2/F6:side:l8|F6:start": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit",
"Body2/F6:side:l8|F6:top": "edge.axis edge.chamfer edge.chamfer+edit edge.fillet edge.fillet+edit edge.normal_plane edge.project",
"Body2/F6:side:l8|F7:bottom": "edge.axis edge.axis+edit edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit",
"Body2/F6:side:l8|F7:side:l5": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body2/F6:side:l9": "face.angle_plane face.draft_neutral face.extrude face.hole face.offset_plane face.press_pull !face.shell face.sketch",
"Body2/F6:side:l9|F6:start": "edge.axis edge.chamfer edge.chamfer+edit edge.fillet edge.fillet+edit edge.normal_plane edge.project",
"Body2/F6:side:l9|F6:top": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit",
"Body2/F6:side:l9|F7:bottom": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body2/F6:side:l9|F7:side:l12": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body2/F6:start": "face.angle_plane face.angle_plane+edit face.draft_neutral face.extrude face.hole face.midplane face.offset_plane face.press_pull face.shell face.sketch",
"Body2/F6:start|F7:side:l12": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body2/F6:start|F7:side:l5": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body2/F6:top": "face.angle_plane face.draft_neutral face.draft_neutral+edit face.extrude face.hole face.offset_plane face.press_pull !face.shell face.sketch",
"Body2/F7:bottom": "face.angle_plane face.angle_plane+edit face.draft_neutral face.extrude face.hole face.midplane face.offset_plane face.press_pull !face.shell face.sketch",
"Body2/F7:bottom|F7:side:l12": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body2/F7:bottom|F7:side:l5": "edge.axis edge.axis+edit edge.chamfer edge.fillet edge.normal_plane edge.project edge.project+edit",
"Body2/F7:side:l12": "face.angle_plane face.draft_neutral face.draft_neutral+edit face.extrude face.hole face.offset_plane face.press_pull face.shell face.sketch",
"Body2/F7:side:l12|F7:side:l5": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body2/F7:side:l5": "face.angle_plane face.draft_neutral face.extrude face.hole face.offset_plane face.press_pull face.shell face.sketch",
"Body2/F7:start": "face.angle_plane face.draft_neutral face.draft_neutral+edit face.extrude face.hole face.offset_plane face.press_pull face.shell face.sketch",
"Body2/body": "body.copy body.mirror body.mirror+edit body.move body.move+edit body.pattern",
"Body2/v[F6:side:l1 & F6:side:l10 & F6:top]": "vertex.plane_three_points vertex.point vertex.point+edit",
"Body2/v[F6:side:l1 & F6:side:l10 & F7:start]": "vertex.plane_three_points vertex.point",
"Body2/v[F6:side:l1 & F6:side:l4 & F6:start & F7:side:l12 & F7:side:l5 & F7:start]": "vertex.plane_three_points vertex.point",
"Body2/v[F6:side:l1 & F6:side:l4 & F6:top]": "vertex.plane_three_points vertex.plane_three_points+edit vertex.point",
"Body2/v[F6:side:l10 & F6:side:l7 & F7:bottom]": "vertex.plane_three_points vertex.plane_three_points+edit vertex.point",
"Body2/v[F6:side:l10 & F6:side:l7 & F7:start]": "vertex.plane_three_points vertex.point",
"Body2/v[F6:side:l10 & F6:side:l9 & F6:top]": "vertex.plane_three_points vertex.point",
"Body2/v[F6:side:l10 & F6:side:l9 & F7:bottom]": "vertex.plane_three_points vertex.point",
"Body2/v[F6:side:l4 & F6:side:l7 & F6:top]": "vertex.plane_three_points vertex.plane_three_points+edit vertex.point",
"Body2/v[F6:side:l4 & F6:side:l7 & F7:start]": "vertex.plane_three_points vertex.point",
"Body2/v[F6:side:l7 & F6:side:l8 & F6:top]": "vertex.plane_three_points vertex.point",
"Body2/v[F6:side:l7 & F6:side:l8 & F7:bottom]": "vertex.plane_three_points vertex.point",
"Body2/v[F6:side:l8 & F6:side:l9 & F6:start]": "vertex.plane_three_points vertex.point",
"Body2/v[F6:side:l8 & F6:side:l9 & F6:top]": "vertex.plane_three_points vertex.plane_three_points+edit vertex.point",
"Body2/v[F6:side:l8 & F6:start & F7:side:l5]": "vertex.plane_three_points vertex.plane_three_points+edit vertex.point",
"Body2/v[F6:side:l8 & F7:bottom & F7:side:l5]": "vertex.plane_three_points vertex.point",
"Body2/v[F6:side:l9 & F6:start & F7:side:l12]": "vertex.plane_three_points vertex.point vertex.point+edit",
"Body2/v[F6:side:l9 & F7:bottom & F7:side:l12]": "vertex.plane_three_points vertex.point",
"Body2/v[F7:bottom & F7:side:l12 & F7:side:l5]": "vertex.plane_three_points vertex.plane_three_points+edit vertex.point",
"design": "load"
},
"demo/pi-case": {
"Body1/F11:side:l5": "face.angle_plane !face.draft_neutral face.extrude face.hole face.midplane face.offset_plane face.press_pull face.shell face.sketch face.sketch+edit",
"Body1/F11:side:l5|F11:side:l6": "edge.axis edge.axis+edit edge.chamfer edge.fillet edge.normal_plane edge.project",
@@ -11275,6 +11340,71 @@
"Body1/v[F3:side:l3#2 & F3:side:l3#[F3:end] & F3:side:l4#2 & F3:side:l4#[F3:end]]": "vertex.plane_three_points vertex.point",
"Body1/v[F3:side:l3#[F3:start] & F3:side:l4#[F3:start] & F3:start]": "vertex.plane_three_points vertex.point",
"design": "load"
},
"typical/up-down-join": {
"Body1/F2:side:l1": "face.angle_plane face.draft_neutral face.extrude face.hole face.midplane face.offset_plane face.press_pull face.shell face.sketch",
"Body1/F2:side:l10": "face.angle_plane face.draft_neutral face.extrude face.hole face.midplane face.offset_plane face.press_pull !face.shell face.sketch",
"Body1/F2:side:l10|F2:side:l7": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l10|F2:side:l9": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l10|F2:top": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l10|F3:bottom": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l10|F3:start": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l1|F2:side:l10": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l1|F2:side:l4": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l1|F2:top": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l1|F3:start": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l4": "face.angle_plane face.draft_neutral face.extrude face.hole face.midplane face.offset_plane face.press_pull face.shell face.sketch",
"Body1/F2:side:l4|F2:side:l7": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l4|F2:top": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l4|F3:start": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l7": "face.angle_plane face.draft_neutral face.extrude face.hole face.midplane face.offset_plane face.press_pull !face.shell face.sketch",
"Body1/F2:side:l7|F2:side:l8": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l7|F2:top": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l7|F3:bottom": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l7|F3:start": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l8": "face.angle_plane face.draft_neutral face.extrude face.hole face.offset_plane face.press_pull !face.shell face.sketch",
"Body1/F2:side:l8|F2:side:l9": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l8|F2:start": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l8|F2:top": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l8|F3:bottom": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l8|F3:side:l5": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l9": "face.angle_plane face.draft_neutral face.extrude face.hole face.offset_plane face.press_pull !face.shell face.sketch",
"Body1/F2:side:l9|F2:start": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l9|F2:top": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l9|F3:bottom": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:side:l9|F3:side:l12": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:start": "face.angle_plane face.draft_neutral face.extrude face.hole face.midplane face.offset_plane face.press_pull face.shell face.sketch",
"Body1/F2:start|F3:side:l12": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:start|F3:side:l5": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F2:top": "face.angle_plane face.draft_neutral face.extrude face.hole face.offset_plane face.press_pull !face.shell face.sketch",
"Body1/F3:bottom": "face.angle_plane face.draft_neutral face.extrude face.hole face.midplane face.offset_plane face.press_pull !face.shell face.sketch",
"Body1/F3:bottom|F3:side:l12": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F3:bottom|F3:side:l5": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F3:side:l12": "face.angle_plane face.draft_neutral face.extrude face.hole face.offset_plane face.press_pull face.shell face.sketch",
"Body1/F3:side:l12|F3:side:l5": "edge.axis edge.chamfer edge.fillet edge.normal_plane edge.project",
"Body1/F3:side:l5": "face.angle_plane face.draft_neutral face.extrude face.hole face.offset_plane face.press_pull face.shell face.sketch",
"Body1/F3:start": "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[F2:side:l1 & F2:side:l10 & F2:top]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l1 & F2:side:l10 & F3:start]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l1 & F2:side:l4 & F2:start & F3:side:l12 & F3:side:l5 & F3:start]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l1 & F2:side:l4 & F2:top]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l10 & F2:side:l7 & F3:bottom]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l10 & F2:side:l7 & F3:start]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l10 & F2:side:l9 & F2:top]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l10 & F2:side:l9 & F3:bottom]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l4 & F2:side:l7 & F2:top]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l4 & F2:side:l7 & F3:start]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l7 & F2:side:l8 & F2:top]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l7 & F2:side:l8 & F3:bottom]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l8 & F2:side:l9 & F2:start]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l8 & F2:side:l9 & F2:top]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l8 & F2:start & F3:side:l5]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l8 & F3:bottom & F3:side:l5]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l9 & F2:start & F3:side:l12]": "vertex.plane_three_points vertex.point",
"Body1/v[F2:side:l9 & F3:bottom & F3:side:l12]": "vertex.plane_three_points vertex.point",
"Body1/v[F3:bottom & F3:side:l12 & F3:side:l5]": "vertex.plane_three_points vertex.point",
"design": "load"
}
}
}
Binary file not shown.
@@ -0,0 +1,11 @@
{"description": "One sketch of four squares drawn edge to edge, three extruded up and three down from it and joined: every side wall spans both extrudes or runs along two coincident sketch lines.",
"commands": [
{"command": "sketch.create", "params": {"plane": "XY", "name": "Squares"}},
{"command": "sketch.rectangle.two_point", "params": {"p0": [0, 0], "p1": [10, 10]}},
{"command": "sketch.rectangle.two_point", "params": {"p0": [-10, 0], "p1": [0, 10]}},
{"command": "sketch.rectangle.two_point", "params": {"p0": [0, -10], "p1": [10, 0]}},
{"command": "sketch.rectangle.two_point", "params": {"p0": [-10, -10], "p1": [0, 0]}},
{"command": "sketch.finish", "params": {}},
{"command": "solid.extrude", "params": {"sketch": "Squares", "profiles": [{"point": [-5, 5]}, {"point": [-5, -5]}, {"point": [5, -5]}], "distance": 10}},
{"command": "solid.extrude", "params": {"sketch": "Squares", "profiles": [{"point": [5, 5]}, {"point": [5, -5]}, {"point": [-5, 5]}], "distance": 10, "direction": "negative", "operation": "join"}}
]}