Skip to content

补齐草图等长、等半径、相切与点在曲线上的持久约束 #247

Description

@vilicvane

补齐草图持久几何约束,并统一绘制吸附、拖动、GUI 约束编辑和普通源码求值的关系语义。

当前实现:

  • ['equalLength', [lineA, lineB]]、['equalRadius', [circleOrArcA, circleOrArcB]]。
  • ['pointOn', [pointRef, localCurveId]]:遵守有限线段及有向圆弧范围;上游点可引用但只读。
  • ['tangent', [curveA, curveB], mode?]:线与圆/弧不接受 mode;圆/弧对默认 external、可显式 internal;线线不接受。切点须在两条有限曲线上,诊断回溯作者约束。
  • GUI 选择、内外切工具、标记、增删、修剪和撤销重做均接通。等长在修剪后移除,等半径随存活弧复制,pointOn/tangent 只保留在包含对应点/切点的片段。

用户确认的统一语义:

  • 共用点身份表达连接。接受可见几何吸附时,在同一源码事务内保存关系和坐标:曲线上与交点写 pointOn,线中点写 midpoint,线方向写 horizontal/vertical,线与圆/有限弧的相切写 tangent。圆的半径定位接受几何参考时保留接触点。原点和网格只定位。
  • 圆弧中点和圆象限作为 On curve 的定位候选,不声称固定中点或象限参数。上游只提供可引用真实点及线中点,其它上游曲线关系仍受 localCurveId 限制。
  • 不凭几何初值巧合创建关系。删除拖动开始的 incidence 扫描及 GUI 约束编辑后专用连接修复链,保留普通求值、安全坐标同步、源码版本保护和同组撤销重做。删除关系后不再隐式绑定;松手后修饰键变化不改变已接受的候选;重复吸附按 canonical 点身份去重。
  • 若相切曲线已有结构共享端点、显式 pointOn 或 coincident 表达的共同点,复用该作者点作为切点;线与圆/弧、圆/弧对共用接触分析并保留内外切分支。线与圆/弧在已知切点使用径向垂直条件,消除弱距离方程造成的切向漂移。未知接触仍用求解期辅助点,不扫描坐标,不放宽精度。

整体重构(已验收并本地合并):

用户已同意审查建议并要求实现;公开 API、原有 UI 和已确认的关系语义保持不变。沿用同一工作区及 owner w1:p1V,不新增包。

  • Core 通过 sketch-solve-model / sketch-solve-analysis 统一作者关系、接触归属和参数来源;删除 pointOn 支撑方程与 bound 的双轨表示,以及曲线 points 镜像。共享切点支持 coincident 和圆/弧对。
  • 有限曲线活动边界可释放、换端点,修复已复现的顺序相关反例;候选惰性产生并限制整体工作量,失败报告未收敛。作者约束不参与边界分支删除,原生方程统一回溯作者来源,保留作者系统的自由度。
  • App SketchMoveSession 统一 computed 候选、手势开始时场景、冻结的松手决策、最新有效异步结果发布和销毁生命周期;处理微任务失唤醒及无移动点击门槛。候选裁决共用规则并保留既有优先级。
  • 同步调用方、回归测试、内部架构和公开说明,更新 10 页 API 文档的 sourceReview。结构调整服务于统一状态和关系所有权,没有扩展公开 API。

本轮重构验证:

  • Core 全量草图 191 项通过,追加聚焦 21 项通过,共覆盖 192 项;最终构建、类型检查通过。日志:/tmp/code3d-247-core-refactor-*.log。
  • App 全量 275 项中 274 项通过;一项新增测试使用浮点精确比较,已改为符合精度契约的容差断言。修正后聚焦 20 项全部通过,并覆盖新增的无移动点击边界,共覆盖 276 项;最终类型检查、生产构建通过。
  • 浏览器初组 26 项通过;一项 URL 双斜杠 fixture 失败和因 300 秒总时限未完成的两项,在修正 URL 构造后全部通过,共覆盖 29 项。浏览器使用现有 host Chrome,3 GiB / 禁止 swap 的限制覆盖测试驱动及其子进程,不包含已运行的 host Chrome。
  • 网站构建 180 页、95 项源码文档检查及 327 个 HTML/Markdown 页面的链接、资源和锚点检查通过。所有改动的 Prettier 和 diff 检查通过。
  • 无未解决失败。App / 浏览器 / 构建日志:/tmp/code3d-247-refactor-app-sketch.log、/tmp/code3d-247-refactor-app-focused.log、/tmp/code3d-247-refactor-browser.log、/tmp/code3d-247-refactor-browser-final.log、/tmp/code3d-247-refactor-build-final.log。
  • 用户已验收并授权提交合并;本轮重构已提交并合并到本地主分支,待推送,未发布。

已提交功能批次验证:

  • Core 完整草图回归 187 项通过,含新增约束聚焦集 16 项;Core 构建及类型检查通过。
  • App 草图回归 231 项通过,后续边界修正的聚焦集 28 项通过;类型检查及生产构建通过。
  • 浏览器既有绘制历史 8 场景、新吸附 6 场景和迁移后的约束编辑 3 场景通过,覆盖参数回放、拖动写回、删除后自由移动、取消、Alt 松手竞态、相切精度和撤销重做。浏览器使用 host Chrome,测试驱动按 3 GiB / 禁止 swap 串行运行。较早测试中的选线遮挡、SVG 取文案与越界坐标已纠正;真实 Alt 竞态及相切端点精度问题已修复后复验。
  • 本轮前已完成的 7 个持久约束浏览器场景、示例实体体积与目录校验仍保留;示例使用显式约束,配图与几何一致。
  • 用户、agent、Core API 和内部架构文档同步;网站文档测试、构建及 HTML/Markdown 链接、资源和锚点检查通过。格式和 diff 检查通过。

从 #73 草图扩展总览拆出本次范围。稳定区域 ID、外部几何投影及其它草图工具仍由原 issue 跟踪。

由 w1:p1V 在分支 issue-247-sketch-constraints-p1v-0926 完成,用户已验收并授权提交合并。本地交付记录:

  • 功能提交:42b6cba5ec1ea173ce1f4eadc331e5d760b809c5(sketch: persist constraints and author accepted snap relationships)。
  • 重构提交:b3b05c5d10bf199cb5edd5880ee01264046f3db4(sketch: unify contact solving and reactive drag sessions)。
  • 最终合并:ab63fe517f5486c9deaaac25be5481d3adc607f7(sketch: merge persistent constraints and unified drag sessions),正文含 Closes #247。
  • 无冲突合并;合并树与完整验证的开发提交一致。主区额外通过 41 项聚焦回归、95 项 sourceReview 和 diff 检查;主区与开发工作区均 clean。日志:/tmp/code3d-247-merge-focused.log、/tmp/code3d-247-merge-doc-sources.log。
  • 待推送:2026-09-26 实时核验 GitHub 默认分支 main 仍为 3ad3e54b5eed1c8a56bdaa90931d597b79832332,不含本次交付;本次授权仅限本地提交和合并,未推送、未发布。Issue 保持打开及 status:review;合并提交进入远端默认分支后自动关闭,后续交付时核验并清理工作状态标签。

验收示例:packages/app/examples/sketches/persistent-constraints.ts。已验证修改 holeRadius,以及在草图中绘制/拖动并接受 On curve、Midpoint、Tangent 等提示时的源码关系、参数重算及删除关系后的移动。合并后任务开发服务器按隔离开发流程回收;源码、示例、文档和验收记录均已保留。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requeststatus:reviewAwaiting acceptance, integration, or authorized push

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions