# FreeCAD planegcs WASM This directory builds the planegcs core from the locked FreeCAD 1.1.1 commit `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d`. The source graph contains `Geo.cpp`, `Constraints.cpp`, `SubSystem.cpp`, `qp_eq.cpp`, and `GCS.cpp`. The browser-only stubs provide the FreeCAD console, elapsed-time, and export macros needed by that graph; the upstream solver sources are not modified. The build enables a two-thread pthread pool because upstream planegcs uses `std::async`. Browser execution therefore requires COOP/COEP isolation and `SharedArrayBuffer`. The checked-in artifact hashes and Chrome-only dedicated Worker evidence are validated by the repository gates. The current Embind functions are intentionally bounded artifact and solver lifecycle surfaces. They prove that the real FreeCAD planegcs `System::solve()` and `applySolution()` execute in WASM, while the Facade owns snapshot validation, capability reporting, cancellation, stale-result handling, and crash recovery. They are not a general arbitrary-constraint graph adapter; that broader mapping remains in SK-06/SK-07. `solveAngle` fixes the first endpoint and combines native `addConstraintP2PDistance` and `addConstraintP2PAngle`. Its angle input is in radians and its length must be positive. Arbitrary endpoint combinations, multi-line angle constraints, and complete dimensional graphs remain outside this smoke subset. `solveCircleRadius` and `solveCircleDiameter` fix the circle center and use the matching native `addConstraintCircleRadius` and `addConstraintCircleDiameter` APIs for one positive dimension. `solveEqualLines` uses the native `addConstraintEqualLength` contract for two lines, fixing the first line and the second start point so the second length is deterministic while its direction remains free. `solveEqualCircles` uses the native `addConstraintEqualRadius` contract for two circles, fixing both centers and the first radius. Mixed geometry, arcs, ellipses, arbitrary constraint graphs, and reference dimensions remain outside this bounded subset. `solveTangentCircles` uses native `addConstraintTangent(Circle, Circle)` for two externally tangent circles with fixed centers and first radius. The adapter does not claim line-circle, arc, internal-tangent, or multi-constraint support from this function. `solvePointSymmetry` uses native `addConstraintP2PSymmetric(Point, Point, Point)` for three distinct point geometries. The first point and center are fixed, so the second point is deterministic and the returned residual is the midpoint-to-center distance. Line-axis symmetry, endpoint references and multi-constraint graphs remain outside this bounded subset. `solvePointOnLine` uses native `addConstraintPointOnLine(Point, Line)` for a single horizontal or vertical line. The point coordinate along the line is fixed and the orthogonal coordinate is solved; oblique lines, curve targets, endpoint references and multi-constraint graphs remain outside this subset. `solvePointOnCircle`, `solvePointOnArc`, and `solvePointOnEllipse` use the matching native PointOnObject relation for one fixed target curve. The point X coordinate is fixed and Y is solved. Arc results are accepted only when the point lies in the declared counter-clockwise sweep. Ellipse support preserves the center, focus-derived major radius, minor radius, and rotation. `solvePointOnCubicBspline` uses native `addConstraintPointOnBSpline` for one non-periodic, unit-weight, clamped cubic B-spline with four strictly X-monotonic poles. It solves the curve parameter and point Y while fixing point X. Other degrees, pole counts, weights, knot vectors, periodic curves, and arbitrary B-spline graphs remain outside this bounded contract. FreeCAD `Block` is implemented at the Facade pre-solve boundary, matching the desktop Sketch behavior: all parameters of the single referenced geometry are frozen and no synthetic GCS constraint is claimed. `solveCoincidentLinePoints` directly uses native `addConstraintP2PCoincident` and accepts all four start/end combinations for two distinct non-degenerate lines. The first line is fixed and the second line keeps its original length. `solveCoincidentLines` remains as the compatible first-end to second-start wrapper. `solveSnellsLawLines` maps FreeCAD's three-Line SnellsLaw graph. The selected ray endpoints must already coincide on the boundary, matching the Coincident and PointOnObject prerequisites created by the desktop Sketcher command. The native binding preserves the first ray, boundary, and second-ray length, uses FreeCAD's stored `n2/n1` ratio split and endpoint-dependent normal flips, then solves `addConstraintSnellsLaw`. The Facade accepts this operation only when the three prerequisite constraints form the exact compound graph. ```bash ./npmw run build:planegcs ./npmw run check:planegcs-artifact ./npmw run test:planegcs ./npmw run test:chrome-planegcs ``` FreeCAD planegcs source files retain their upstream LGPL licensing notices.