forked from 1b-agent/fieldcraft-upstream
Docs: the crank's one-datum workflow, its gallery images and the Decompose status
examples.md and mcp.md tell the one-datum workflow and its numbers; the crank gallery captures and Start card thumbnails are taken again on this build; ROADMAP marks the automatic blocks of extruded cross-sections done, and features.md's Decompose entry says what is left (3D parts). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UhhZMBTviDQxZvwnyP89fo
This commit is contained in:
1 parent
8e45f2c275
commit
43e2144090
9 files changed
+29
-21
No files matched your search
+14
-16
@@ -121,7 +121,7 @@ links made with it still open): seen from below, where the pocket is. How the ha
|
||||
meshed and mirrored is told under `crank-arm`.
|
||||
|
||||
**Look at:** the pocket from below: straight mapped rows along its sides and floor, and at each
|
||||
end its corner fillets cut off by the diagonal partitions into three-sided triangle primitives;
|
||||
end its corner fillets as three-sided triangle primitives, cut off by the mesher's own blocks;
|
||||
the two halves, mirror images across the arm's middle.
|
||||
|
||||
**Check:** as `crank-arm`.
|
||||
@@ -140,27 +140,25 @@ arm's top face, where any hex is degenerate). 6061-T6 (E = 68 900 MPa, ν = 0.33
|
||||
bore's faces fixed, 1500 N on the pedal hole in the crank's plane, across the arm (−y). Linear
|
||||
static: about 5 s to open and 7 s to solve.
|
||||
|
||||
The mesh is built as an analyst builds a structured one. A datum plane on the symmetry plane
|
||||
(`Sym`, y = 0) partitions the crank (`Half`); the half `CrankArm/a` is cut into seven cells:
|
||||
across the arm at x = 30 (the root, beyond the spindle boss), 60 and 110 (the pocket's straight
|
||||
middle) and 148 (before the pedal boss), and on two diagonals (`D1`, `D2`) through the centres
|
||||
of the pocket's corner fillets, radial to them so they meet the pocket wall square. Every
|
||||
cell's cross-section then splits into regions that map: the half ring round each bore (an
|
||||
O-grid), four-sided blocks (transfinite), and the pocket's four corners, three-sided, as
|
||||
triangle primitives. Exact edge seeds (`mesh.seed.edge`) give every cut the same divisions on
|
||||
its two sides, so `mesh.cells` sweeps each cell (`extrude`, hex20 of 3 mm) and merges all six
|
||||
cuts node for node, and `mesh.mirror` reflects the half onto `CrankArm/b`: 7 710 hex20
|
||||
elements, 37 938 nodes, all valid, scaled Jacobian min 0.37, mean 0.92, edge ratio at most 7.0
|
||||
(the swept crank before: min 0.17, its free-paved middle at the pocket the worst).
|
||||
The mesh needs one datum. A datum plane on the symmetry plane (`Sym`, y = 0) partitions the
|
||||
crank (`Half`); `mesh.hex.generate` extrudes the half `CrankArm/a` (hex20 of 3 mm) and cuts its
|
||||
cross-section into mappable blocks itself, inside the mesher (nothing is added to the model):
|
||||
the half ring round each bore as four-sided blocks, the pocket's R5 corners as three-sided
|
||||
triangle primitives, and four-sided blocks along the arm, split where the pocket's fillets meet
|
||||
it. Interval assignment gives every block's sides matching counts, with no seeds.
|
||||
`mesh.mirror` reflects the half onto `CrankArm/b`: 8 664 hex20 elements, all valid, scaled
|
||||
Jacobian min 0.37 (at the corners where the root arcs meet the bosses 20° off tangent), mean
|
||||
0.91. Before the mesher cut blocks itself the same crank took seven partitions and eleven exact
|
||||
seeds for 0.37 (and the swept half without them: min 0.009, its middle free-paved).
|
||||
|
||||
**Look at:** the mesh (Prepare ▸ Mesh): rows running straight along the arm, the O-grids round
|
||||
the bores, eight layers through the arm, and the von Mises contours: the bending stress grows
|
||||
along the arm toward the root; the peak, 145 MPa, sits at a square-bore corner where the rigid
|
||||
along the arm toward the root; the peak, 117 MPa, sits at a square-bore corner where the rigid
|
||||
clamp meets the free face, a support singularity.
|
||||
|
||||
**Check:** σxx on the arm's sides at x = 29 mm is −62.43 and +62.43 MPa, equal and opposite as
|
||||
**Check:** σxx on the arm's sides at x = 29 mm is −62.44 and +62.44 MPa, equal and opposite as
|
||||
the mirror-image halves are, against the beam formula
|
||||
M/Z = 1500 · 141 / (16 · 35.6² / 6) = 62.6 MPa (0.3 %); a 41 815-element tet10 solution of the
|
||||
M/Z = 1500 · 141 / (16 · 35.6² / 6) = 62.6 MPa (0.25 %); a 41 815-element tet10 solution of the
|
||||
full part gives 62.3 MPa. The pedal bore moves 0.75 mm down (tet10: 0.70–0.75 mm; Euler–Bernoulli
|
||||
with a rigid clamp: 0.58 mm, without shear or the boss's compliance), and the spindle carries the
|
||||
whole 1500 N and 255 N·m.
|
||||
+1
-1
@@ -37,7 +37,7 @@ the control channel and AI agents over MCP (docs/mcp.md) run the same commands.
|
||||
| Structured Hex | Quad Faces — All-quad meshes of faces on shared edge nodes | coming soon (M5) | |
|
||||
| Structured Hex | Hex Mesh — Structured hex mesh of a body: automatic, or extruded, swept, revolved or mapped (the Method drop-down) | ready | `mesh.hex.generate`, (`mesh.hex.sweep`), (`mesh.hex.mapped`) |
|
||||
| Structured Hex | Partitioned Mesh — One mesh of a partitioned part, a method per cell (hex, tet, or all hex as conforming blocks); cells joined across partitions | ready | `mesh.cells`, (`mesh.hex.blocks`) |
|
||||
| Structured Hex | Decompose — Find sweepable and mappable regions and propose the splits | coming soon (M5) | |
|
||||
| Structured Hex | Decompose — Find sweepable and mappable regions of 3D parts (extruded cross-sections are already cut into blocks by Hex Mesh) | coming soon (M5) | |
|
||||
| Structured Hex | Transition — Conforming tet–hex interfaces with pyramids | coming soon (M5) | |
|
||||
| Automatic Hex | Octree Hex — Unstructured all-hex mesh of any part: adaptive grid, boundary layers on every sharp edge, untangled and proven valid | ready | `mesh.hex.octree` |
|
||||
| Automatic Hex | Hex-Dominant — Hex-dominant mesh by recombining tets | coming soon (M6) | |
|
||||
|
||||
+5
-2
@@ -128,7 +128,9 @@ and `mesh` (each one's parameters: `list_commands`):
|
||||
`partition:<name>:a` and `partition:<name>:b`; every other face keeps the name of the face it
|
||||
is a piece of. The partition is part of the model: saving and opening it, or opening the
|
||||
design again after an edit, cuts the design again. `inspect_model` lists the cells.
|
||||
3. `mesh` with method `hex`, `hex_sweep`, `hex_mapped` or `tet` on one cell (`{"body":
|
||||
3. `mesh` with method `hex` on an extruded cell needs no further cuts: its cross-section is cut
|
||||
into mappable blocks inside the mesher (O-grids round holes, triangle primitives at fillets,
|
||||
four-sided blocks), so a symmetric part takes one datum. Or `mesh` with method `hex`, `hex_sweep`, `hex_mapped` or `tet` on one cell (`{"body":
|
||||
"Part/b"}`), or method `cells` for all cells with a method each (`{"methods": {"Part/a":
|
||||
"tet"}, "default": "auto"}`): cells whose faces match on a partition are merged, others are
|
||||
tied (the reply lists each interface).
|
||||
@@ -138,7 +140,8 @@ and `mesh` (each one's parameters: `list_commands`):
|
||||
5. Or keep the half: `model.boundary_condition.symmetry {name, datum}` holds it on the plane
|
||||
(zero normal displacement), with half the load.
|
||||
|
||||
`file.sample {"name": "crank-mirror"}` opens the crank arm built this way (docs/examples.md).
|
||||
`file.sample {"name": "crank-mirror"}` opens the crank arm built this way: one datum (`Sym`), its
|
||||
partition, `hex` on the half and `mirror` (docs/examples.md).
|
||||
|
||||
## Edge seeds
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 268 KiB After Width: | Height: | Size: 271 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 239 KiB After Width: | Height: | Size: 252 KiB |
Reference in new issue
Block a user