Files
FreeCADWasmDev/docs/current/PART_CYLINDER_SKEW_PROGRESS.md

4.4 KiB

Cylinder Skew Progress

Updated 2026-09-17. Part:desktop:Part_Primitives remains incomplete. This increment implements its missing two-axis cylinder skew. Prior primitive type, placement, container, projection and IFC suites were not rerun.

Implementation

  • The existing native Cylinder route and mounted task now expose FirstAngle and SecondAngle as X/Y skew in degrees. Geometry uses FreeCAD's actual Part::Cylinder and PrismExtension::makePrism: the top face displacement is (Height*tan(FirstAngle), Height*tan(SecondAngle), Height). It supports full and sector cylinders, signed angles and both skew directions together.
  • Facade and native validation enforce the desktop extension's inclusive [-89.99999, 89.99999] angle range and reject malformed values. Required Radius/Height/Angle and unknown-field rejection remain enforced.
  • Older three-parameter callers remain supported. New objects default omitted skew to zero; editing preserves omitted angles. Sending only one skew angle updates that angle while preserving the other. Snapshots include both native extension values so reopening or selecting a cylinder restores the controls.
  • Requested skew is checked after recompute and before transaction commit. If an expression overrides a supplied angle, both dimension and skew changes abort. Existing expressions, geometry and undo/redo history are preserved.
  • Existing unique naming, placement, container, save/open, undo/redo and renderer paths are reused. No replacement geometry or UI-only transform was added. No pass tag or covered-ID entry was added.

Local desktop anchors: PrimitiveFeature.cpp::Cylinder::execute, PrismExtension.cpp::makePrism and its angle constraints, DlgPrimitives.cpp::CylinderPrimitive::create/change.

Focused Evidence

tools/part-cylinder-skew-business-cases.mjs is the active primitive increment. The previously completed helpers remain preserved and deferred. One native runtime and one browser are shared across the new cases.

python3 tools/run_business_acceptance.py --module Part --ids Part:desktop:Part_Primitives --reuse

Report: docs/current/business-evidence/13fb362e5bcf598a7f1f90a6-20260917T110758963286.json. The first focused execution completed all nine new scenario groups without an assertion error in 14.156 seconds. The helper returns not_implemented for preserved remaining scope; the runner reports acceptance_incomplete, passed=0. Nine scenario groups are not nine accepted requirements.

Assertions cover analytic volume and cap area/centroids, signed X/Y offsets, sector sweeps, rendered vertices inside the corresponding oblique cylinder, atomic history, three-parameter compatibility, one-axis updates, native/facade invalid-input rollback, document isolation, FCStd reopen and further skew editing, expression-conflict rollback, mounted browser controls, invalid-angle cancel, OPFS reload, native angle restoration, orbit interaction, nonblank canvas pixels and 1440x900/390x844 layouts. Desktop and mobile screenshots were visually inspected.

Detailed result and screenshots: docs/current/part-cylinder-skew-business/2026-09-17T11-07-45-117Z/.

DocumentProbe native build, asset synchronization, TypeScript checking, production Vite build and scoped native whitespace checks completed. Existing server: http://127.0.0.1:5180/workbench.html?module=Part&command=Part_Primitives.

Next Gaps

Sixteen primitive types and manual placement are already implemented. The existing unattended service subsequently completed active-container membership and transformed nested-container display; its evidence is recorded in the 10:51 UTC section of PART_PRIMITIVES_PROJECTION_PROGRESS.md. Do not restart from older notes listing those as missing, or replay their completed suites.

Continue implementing new behavior before running another primitive increment:

  1. Circle from three points, including actual desktop picking semantics and invalid/collinear input handling. Start with CircleFromThreePoints and DlgPrimitives::buttonCircleFromThreePoints in DlgPrimitives.cpp.
  2. Desktop location picking and expression binding/editing UI.
  3. Live task preview and accept/reject transaction lifecycle parity.

Projection separately retains preview-lifecycle and subelement-selection gaps. The full 1507 original requirements plus the supplemental IFC requirement are preserved. No full-command acceptance or aggregate coverage increase is claimed.