@faicad/faijs 0.32.2 → 0.33.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/dist/api/api-namespace.js +3 -3
  2. package/dist/api/api-namespace.js.map +1 -1
  3. package/dist/api/assembly/index.d.ts +1 -0
  4. package/dist/api/assembly/index.d.ts.map +1 -1
  5. package/dist/api/assembly/index.js +1 -0
  6. package/dist/api/assembly/index.js.map +1 -1
  7. package/dist/api/assembly/lower.d.ts.map +1 -1
  8. package/dist/api/assembly/lower.js +7 -0
  9. package/dist/api/assembly/lower.js.map +1 -1
  10. package/dist/api/assembly/normalize.d.ts.map +1 -1
  11. package/dist/api/assembly/normalize.js +2 -1
  12. package/dist/api/assembly/normalize.js.map +1 -1
  13. package/dist/api/assembly/solve-tree.d.ts +46 -0
  14. package/dist/api/assembly/solve-tree.d.ts.map +1 -0
  15. package/dist/api/assembly/solve-tree.js +135 -0
  16. package/dist/api/assembly/solve-tree.js.map +1 -0
  17. package/dist/api/assembly/solve.d.ts +7 -0
  18. package/dist/api/assembly/solve.d.ts.map +1 -1
  19. package/dist/api/assembly/solve.js.map +1 -1
  20. package/dist/api/assembly/solvers/assembly-tree.d.ts +4 -0
  21. package/dist/api/assembly/solvers/assembly-tree.d.ts.map +1 -1
  22. package/dist/api/assembly/solvers/assembly-tree.js +1 -0
  23. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
  24. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  25. package/dist/api/assembly/solvers/global-solver.js +210 -3
  26. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  27. package/dist/api/assembly/solvers/types.d.ts +8 -0
  28. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  29. package/dist/api/assembly/solvers/types.js.map +1 -1
  30. package/dist/api/assembly/types.d.ts +32 -1
  31. package/dist/api/assembly/types.d.ts.map +1 -1
  32. package/dist/api/assembly/types.js.map +1 -1
  33. package/dist/api/assembly/validate.d.ts +2 -2
  34. package/dist/api/assembly/validate.d.ts.map +1 -1
  35. package/dist/api/assembly/validate.js +24 -2
  36. package/dist/api/assembly/validate.js.map +1 -1
  37. package/dist/api/cadquery-selectors/edge.js +1 -1
  38. package/dist/api/cadquery-selectors/edge.js.map +1 -1
  39. package/dist/api/cadquery-selectors/entity.d.ts +29 -20
  40. package/dist/api/cadquery-selectors/entity.d.ts.map +1 -1
  41. package/dist/api/cadquery-selectors/entity.js +26 -20
  42. package/dist/api/cadquery-selectors/entity.js.map +1 -1
  43. package/dist/api/cadquery-selectors/face.d.ts +4 -2
  44. package/dist/api/cadquery-selectors/face.d.ts.map +1 -1
  45. package/dist/api/cadquery-selectors/face.js +8 -7
  46. package/dist/api/cadquery-selectors/face.js.map +1 -1
  47. package/dist/api/cadquery-selectors/resolve.d.ts +7 -6
  48. package/dist/api/cadquery-selectors/resolve.d.ts.map +1 -1
  49. package/dist/api/cadquery-selectors/resolve.js +13 -11
  50. package/dist/api/cadquery-selectors/resolve.js.map +1 -1
  51. package/dist/api/chamfer.js +1 -1
  52. package/dist/api/chamfer.js.map +1 -1
  53. package/dist/api/draft.js +1 -1
  54. package/dist/api/draft.js.map +1 -1
  55. package/dist/api/edge-ref.js +2 -2
  56. package/dist/api/edge-ref.js.map +1 -1
  57. package/dist/api/engrave.js +1 -1
  58. package/dist/api/engrave.js.map +1 -1
  59. package/dist/api/export-3mf.js +1 -1
  60. package/dist/api/export-3mf.js.map +1 -1
  61. package/dist/api/export-brep.js +1 -1
  62. package/dist/api/export-brep.js.map +1 -1
  63. package/dist/api/export-step.d.ts +12 -13
  64. package/dist/api/export-step.d.ts.map +1 -1
  65. package/dist/api/export-step.js +19 -17
  66. package/dist/api/export-step.js.map +1 -1
  67. package/dist/api/extrude.js +3 -3
  68. package/dist/api/extrude.js.map +1 -1
  69. package/dist/api/face-ref.js +2 -2
  70. package/dist/api/face-ref.js.map +1 -1
  71. package/dist/api/feature-repair.js +2 -2
  72. package/dist/api/feature-repair.js.map +1 -1
  73. package/dist/api/fillet-variable.js +1 -1
  74. package/dist/api/fillet-variable.js.map +1 -1
  75. package/dist/api/fillet.js +1 -1
  76. package/dist/api/fillet.js.map +1 -1
  77. package/dist/api/geom.js +1 -1
  78. package/dist/api/geom.js.map +1 -1
  79. package/dist/api/import-step.d.ts.map +1 -1
  80. package/dist/api/import-step.js +4 -2
  81. package/dist/api/import-step.js.map +1 -1
  82. package/dist/api/pattern.js +1 -1
  83. package/dist/api/pattern.js.map +1 -1
  84. package/dist/api/place.js +1 -1
  85. package/dist/api/place.js.map +1 -1
  86. package/dist/api/punch-hole.js +1 -1
  87. package/dist/api/punch-hole.js.map +1 -1
  88. package/dist/api/replicate.js +1 -1
  89. package/dist/api/replicate.js.map +1 -1
  90. package/dist/api/revolve.js +1 -1
  91. package/dist/api/revolve.js.map +1 -1
  92. package/dist/api/section-by-plane.js +1 -1
  93. package/dist/api/section-by-plane.js.map +1 -1
  94. package/dist/api/shell.js +1 -1
  95. package/dist/api/shell.js.map +1 -1
  96. package/dist/api/sketch-on-face.js +1 -1
  97. package/dist/api/sketch-on-face.js.map +1 -1
  98. package/dist/api/split-by-plane.js +1 -1
  99. package/dist/api/split-by-plane.js.map +1 -1
  100. package/dist/api/split.js +1 -1
  101. package/dist/api/split.js.map +1 -1
  102. package/dist/api/thicken.js +1 -1
  103. package/dist/api/thicken.js.map +1 -1
  104. package/dist/api/topo-resolve.js +4 -4
  105. package/dist/api/topo-resolve.js.map +1 -1
  106. package/dist/api/transform.js +1 -1
  107. package/dist/api/transform.js.map +1 -1
  108. package/dist/api/view/view-projection.d.ts +8 -0
  109. package/dist/api/view/view-projection.d.ts.map +1 -1
  110. package/dist/api/view/view-projection.js +73 -2
  111. package/dist/api/view/view-projection.js.map +1 -1
  112. package/dist/boolean/cross-section.d.ts.map +1 -1
  113. package/dist/boolean/cross-section.js +3 -1
  114. package/dist/boolean/cross-section.js.map +1 -1
  115. package/dist/brep/brep-ops.d.ts +26 -0
  116. package/dist/brep/brep-ops.d.ts.map +1 -1
  117. package/dist/brep/brep-ops.js +45 -0
  118. package/dist/brep/brep-ops.js.map +1 -1
  119. package/dist/brep/brep-topology.js +1 -1
  120. package/dist/brep/brep-topology.js.map +1 -1
  121. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  122. package/dist/brep/engine/adapters/brep-mock.js +2 -0
  123. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  124. package/dist/brep/engine/primitives.d.ts +17 -0
  125. package/dist/brep/engine/primitives.d.ts.map +1 -1
  126. package/dist/brep/engine/primitives.js.map +1 -1
  127. package/dist/brep/export/export-model.d.ts.map +1 -1
  128. package/dist/brep/export/export-model.js +36 -11
  129. package/dist/brep/export/export-model.js.map +1 -1
  130. package/dist/brep/export/step-flat.d.ts +35 -0
  131. package/dist/brep/export/step-flat.d.ts.map +1 -0
  132. package/dist/brep/export/step-flat.js +94 -0
  133. package/dist/brep/export/step-flat.js.map +1 -0
  134. package/dist/brep/export/step.d.ts.map +1 -1
  135. package/dist/brep/export/step.js +42 -21
  136. package/dist/brep/export/step.js.map +1 -1
  137. package/dist/brep/handle-bridge.d.ts +4 -4
  138. package/dist/brep/handle-bridge.js +4 -4
  139. package/dist/brep/handle-bridge.js.map +1 -1
  140. package/dist/brep/svg/svg-to-solid.d.ts +3 -17
  141. package/dist/brep/svg/svg-to-solid.d.ts.map +1 -1
  142. package/dist/brep/svg/svg-to-solid.js +16 -317
  143. package/dist/brep/svg/svg-to-solid.js.map +1 -1
  144. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  145. package/dist/brepkit-kernel/brepkitKernel.js +10 -0
  146. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  147. package/dist/brepkit-kernel/brepkitWasm.d.ts +1 -1
  148. package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
  149. package/dist/brepkit-kernel/brepkitWasm.js +7 -6
  150. package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
  151. package/dist/brepkit-kernel/multi-version-test.d.ts +7 -7
  152. package/dist/brepkit-kernel/multi-version-test.d.ts.map +1 -1
  153. package/dist/brepkit-kernel/multi-version-test.js +10 -10
  154. package/dist/brepkit-kernel/multi-version-test.js.map +1 -1
  155. package/dist/cad-runtime/direct-executor.js +2 -2
  156. package/dist/cad-runtime/direct-executor.js.map +1 -1
  157. package/dist/cad-runtime/runtime.js +5 -5
  158. package/dist/cad-runtime/runtime.js.map +1 -1
  159. package/dist/geometry2d/curve2d.js +42 -1
  160. package/dist/geometry2d/curve2d.js.map +1 -1
  161. package/dist/math3d/Box3.js.map +1 -1
  162. package/dist/math3d/Euler.js.map +1 -1
  163. package/dist/math3d/Mat4.js.map +1 -1
  164. package/dist/math3d/Plane.js.map +1 -1
  165. package/dist/math3d/Quat.js.map +1 -1
  166. package/dist/math3d/Vec2.js.map +1 -1
  167. package/dist/math3d/Vec3.js.map +1 -1
  168. package/dist/math3d/index.js.map +1 -1
  169. package/dist/mesh/meshdata/contour.d.ts +34 -0
  170. package/dist/mesh/meshdata/contour.d.ts.map +1 -0
  171. package/dist/mesh/meshdata/contour.js +39 -0
  172. package/dist/mesh/meshdata/contour.js.map +1 -0
  173. package/dist/mesh/meshdata/extrude.d.ts +25 -0
  174. package/dist/mesh/meshdata/extrude.d.ts.map +1 -0
  175. package/dist/mesh/meshdata/extrude.js +198 -0
  176. package/dist/mesh/meshdata/extrude.js.map +1 -0
  177. package/dist/mesh/meshdata/index.js.map +1 -1
  178. package/dist/mesh/meshdata/ops.js.map +1 -1
  179. package/dist/mesh/meshdata/parametric.js.map +1 -1
  180. package/dist/mesh/meshdata/weld.js.map +1 -1
  181. package/dist/node-host/cli.d.ts.map +1 -1
  182. package/dist/node-host/cli.js +3 -2
  183. package/dist/node-host/cli.js.map +1 -1
  184. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  185. package/dist/occt-kernel/occt-primitives.js +2 -0
  186. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  187. package/dist/primitives/svg/svg-path.d.ts +192 -0
  188. package/dist/primitives/svg/svg-path.d.ts.map +1 -0
  189. package/dist/primitives/svg/svg-path.js +776 -0
  190. package/dist/primitives/svg/svg-path.js.map +1 -0
  191. package/dist/third-party/earcut.d.ts +19 -0
  192. package/dist/third-party/earcut.d.ts.map +1 -0
  193. package/dist/third-party/earcut.js +575 -0
  194. package/dist/third-party/earcut.js.map +1 -0
  195. package/package.json +22 -3
@@ -1 +1 @@
1
- {"version":3,"file":"svg-to-solid.js","sourceRoot":"","sources":["../../../src/brep/svg/svg-to-solid.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SVG → OCCT wire/face/solid 转换\n *\n * 适配自 brepjs `src/io/svgImportFns.ts`,保留核心算法和命名。\n * 与 brepjs 的差异:\n * - brepjs 用 Curve2D / Blueprint / sketchOnPlane → 本项目直接用 3D edge / makeWire / makeFace\n * - brepjs 不处理孔洞 → 本项目用 kernel.addHolesInFace 处理外轮廓+内孔\n * - brepjs 仅解析 <path> → 本项目额外转换 <rect>/<circle>/<ellipse>/<line>/<polyline>/<polygon>\n *\n * 与 text-to-solid.ts 的差异:\n * - text 的 glyph 互不嵌套,各自 makeFace→extrude→fuse\n * - SVG 路径常有外轮廓+内孔,需 addHolesInFace 挖孔后再 extrude\n *\n * SVG path 命令 → OCCT edge 映射:\n * - M (moveTo) → 开始新子路径\n * - L (lineTo) → kernel.makeLineEdge\n * - H/V → 转 makeLineEdge\n * - C (cubicBezier) → kernel.makeBezierEdge\n * - S (smoothCubicBezier) → 反射控制点 → makeBezierEdge\n * - Q (quadraticBezier) → 转三次贝塞尔 → makeBezierEdge\n * - T (smoothQuadraticBezier) → 反射控制点 → 转三次 → makeBezierEdge\n * - A (arc) → 计算 sagitta 中点 → kernel.makeArcEdge(start, mid, end)\n * - Z (closePath) → 闭合 wire\n */\n\nimport type { BrepHandle } from '../engine/types'\nimport type { BrepEngineApi } from '../engine/primitives'\nimport { getSolidBoundingBox } from '../brep-utils'\nimport { parseSvgNaturalSize } from '../../primitives/parse-svg-size'\n\nexport { parseSvgNaturalSize }\n\n// ─── 类型定义 ───\n\n/** 3D 点(OCCT Vec3 格式) */\ninterface Pt { x: number; y: number; z: number }\n\n/** SVG path token */\ninterface PathToken {\n command: string\n args: number[]\n}\n\n/** 闭合子路径信息(用于孔洞检测) */\ninterface ClosedSubpath {\n /** 顶点列表(XY 平面,Z=0) */\n points: Pt[]\n /** 包围盒 */\n bbox: { minX: number; minY: number; maxX: number; maxY: number }\n /** 有符号面积(Shoelace,正=CCW,负=CW) */\n signedArea: number\n /** 对应的 OCCT wire */\n wire: BrepHandle\n}\n\n// ─── SVG 元素提取(将 <rect>/<circle>/… 转为 <path d>) ───\n\n/**\n * 从 SVG 字符串中提取所有图形元素的 path `d` 属性。\n *\n * 支持:<path>, <rect>, <circle>, <ellipse>, <line>, <polyline>, <polygon>。\n * 使用正则提取,无 DOMParser 依赖(可在 Web Worker / Node 中运行)。\n *\n * @param svgString - the raw SVG markup to extract paths from.\n * @returns an array of path `d` strings.\n */\nexport function extractSvgPaths(svgString: string): string[] {\n const paths: string[] = []\n\n // <path d=\"...\">\n extractPathDAttributes(svgString, paths)\n\n // <rect>\n extractRectPaths(svgString, paths)\n\n // <circle>\n extractCirclePaths(svgString, paths)\n\n // <ellipse>\n extractEllipsePaths(svgString, paths)\n\n // <line>\n extractLinePaths(svgString, paths)\n\n // <polyline>\n extractPolylinePaths(svgString, paths, false)\n\n // <polygon>\n extractPolylinePaths(svgString, paths, true)\n\n return paths\n}\n\nfunction extractPathDAttributes(svg: string, out: string[]): void {\n const re = /<path\\b[^>]*\\bd\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')[^>]*>/gi\n let m: RegExpExecArray | null\n while ((m = re.exec(svg)) !== null) {\n const d = m[1] ?? m[2]\n if (d) out.push(d)\n }\n}\n\nfunction extractRectPaths(svg: string, out: string[]): void {\n const re = /<rect\\b([^>]*)\\/?>/gi\n let m: RegExpExecArray | null\n while ((m = re.exec(svg)) !== null) {\n const attrs = parseAttrs(m[1] ?? '')\n const x = parseFloat(attrs.x ?? '0')\n const y = parseFloat(attrs.y ?? '0')\n const w = parseFloat(attrs.width ?? '0')\n const h = parseFloat(attrs.height ?? '0')\n const rx = parseFloat(attrs.rx ?? '0')\n const ry = parseFloat(attrs.ry ?? '0')\n if (w <= 0 || h <= 0) continue\n\n // 如果 rect 有 transform 属性,将变换应用到四个角点后输出为 path d\n const rectTransform = attrs.transform ? parseSvgTransform(attrs.transform) : undefined\n if (rectTransform) {\n const corners: [number, number][] = [\n [x, y], [x + w, y], [x + w, y + h], [x, y + h],\n ]\n const tc = corners.map(([cx, cy]) => [\n rectTransform[0] * cx + rectTransform[2] * cy + rectTransform[4],\n rectTransform[1] * cx + rectTransform[3] * cy + rectTransform[5],\n ])\n let d = `M ${tc[0][0]},${tc[0][1]}`\n for (let i = 1; i < tc.length; i++) d += ` L ${tc[i][0]},${tc[i][1]}`\n out.push(d + ' Z')\n } else if (rx > 0 || ry > 0) {\n const r = Math.min(rx || ry, w / 2, h / 2)\n out.push(rectToPathRounded(x, y, w, h, r))\n } else {\n out.push(`M ${x},${y} h ${w} v ${h} h ${-w} Z`)\n }\n }\n}\n\nfunction rectToPathRounded(x: number, y: number, w: number, h: number, r: number): string {\n return [\n `M ${x + r},${y}`,\n `h ${w - 2 * r}`,\n `A ${r},${r} 0 0 1 ${x + w},${y + r}`,\n `v ${h - 2 * r}`,\n `A ${r},${r} 0 0 1 ${x + w - r},${y + h}`,\n `h ${-(w - 2 * r)}`,\n `A ${r},${r} 0 0 1 ${x},${y + h - r}`,\n `v ${-(h - 2 * r)}`,\n `A ${r},${r} 0 0 1 ${x + r},${y}`,\n 'Z',\n ].join(' ')\n}\n\nfunction extractCirclePaths(svg: string, out: string[]): void {\n const re = /<circle\\b([^>]*)\\/?>/gi\n let m: RegExpExecArray | null\n while ((m = re.exec(svg)) !== null) {\n const attrs = parseAttrs(m[1] ?? '')\n const cx = parseFloat(attrs.cx ?? '0')\n const cy = parseFloat(attrs.cy ?? '0')\n const r = parseFloat(attrs.r ?? '0')\n if (r <= 0) continue\n // 两个半圆弧组成完整圆\n out.push(`M ${cx - r},${cy} A ${r},${r} 0 1 0 ${cx + r},${cy} A ${r},${r} 0 1 0 ${cx - r},${cy} Z`)\n }\n}\n\nfunction extractEllipsePaths(svg: string, out: string[]): void {\n const re = /<ellipse\\b([^>]*)\\/?>/gi\n let m: RegExpExecArray | null\n while ((m = re.exec(svg)) !== null) {\n const attrs = parseAttrs(m[1] ?? '')\n const cx = parseFloat(attrs.cx ?? '0')\n const cy = parseFloat(attrs.cy ?? '0')\n const rx = parseFloat(attrs.rx ?? '0')\n const ry = parseFloat(attrs.ry ?? '0')\n if (rx <= 0 || ry <= 0) continue\n out.push(`M ${cx - rx},${cy} A ${rx},${ry} 0 1 0 ${cx + rx},${cy} A ${rx},${ry} 0 1 0 ${cx - rx},${cy} Z`)\n }\n}\n\nfunction extractLinePaths(svg: string, out: string[]): void {\n const re = /<line\\b([^>]*)\\/?>/gi\n let m: RegExpExecArray | null\n while ((m = re.exec(svg)) !== null) {\n const attrs = parseAttrs(m[1] ?? '')\n const x1 = parseFloat(attrs.x1 ?? '0')\n const y1 = parseFloat(attrs.y1 ?? '0')\n const x2 = parseFloat(attrs.x2 ?? '0')\n const y2 = parseFloat(attrs.y2 ?? '0')\n out.push(`M ${x1},${y1} L ${x2},${y2}`)\n }\n}\n\nfunction extractPolylinePaths(svg: string, out: string[], closed: boolean): void {\n const tag = closed ? 'polygon' : 'polyline'\n const re = new RegExp(`<${tag}\\\\b([^>]*)\\\\/??>`, 'gi')\n let m: RegExpExecArray | null\n while ((m = re.exec(svg)) !== null) {\n const attrs = parseAttrs(m[1] ?? '')\n const pointsStr = attrs.points ?? ''\n const nums = pointsStr.split(/[\\s,]+/).filter(s => s.length > 0).map(Number)\n if (nums.length < 4) continue\n let d = `M ${nums[0]},${nums[1]}`\n for (let i = 2; i + 1 < nums.length; i += 2) {\n d += ` L ${nums[i]},${nums[i + 1]}`\n }\n if (closed) d += ' Z'\n out.push(d)\n }\n}\n\nfunction parseAttrs(attrStr: string): Record<string, string> {\n const attrs: Record<string, string> = {}\n const re = /(\\w[\\w-]*)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/g\n let m: RegExpExecArray | null\n while ((m = re.exec(attrStr)) !== null) {\n attrs[m[1].toLowerCase()] = m[2] ?? m[3] ?? ''\n }\n return attrs\n}\n\n// ─── SVG transform 处理 ───\n\n/** SVG 2D 仿射变换矩阵 [a, b, c, d, e, f](matrix(a,b,c,d,e,f)) */\ntype SvgTransform = [number, number, number, number, number, number]\n\n/** 解析 SVG transform 字符串(仅支持 matrix 形式) */\nfunction parseSvgTransform(transformStr: string): SvgTransform | undefined {\n const m = transformStr.match(/matrix\\s*\\(\\s*([-\\d.eE+]+)\\s*,\\s*([-\\d.eE+]+)\\s*,\\s*([-\\d.eE+]+)\\s*,\\s*([-\\d.eE+]+)\\s*,\\s*([-\\d.eE+]+)\\s*,\\s*([-\\d.eE+]+)\\s*\\)/)\n if (m) {\n return [parseFloat(m[1]), parseFloat(m[2]), parseFloat(m[3]), parseFloat(m[4]), parseFloat(m[5]), parseFloat(m[6])]\n }\n return undefined\n}\n\n/** 从 SVG 字符串中提取 <g transform=\"matrix(...)\"> 的变换矩阵 */\nfunction extractGroupTransform(svgString: string): SvgTransform | undefined {\n const m = svgString.match(/<g\\b[^>]*\\btransform\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')[^>]*>/i)\n if (m) {\n return parseSvgTransform(m[1] ?? m[2] ?? '')\n }\n return undefined\n}\n\n/** 将 SVG 2D 变换转为 OCCT 3x4 row-major 仿射矩阵(考虑 Y 翻转) */\nfunction svgTransformToOcctMatrix(gt: SvgTransform): number[] {\n // SVG: x' = a*x + c*y + e, y' = b*x + d*y + f\n // OCCT 点的 Y 已翻转 (y_occt = -y_svg),所以:\n // x'_occt = a*x_occt - c*y_occt + e\n // y'_occt = -b*x_occt + d*y_occt - f\n // OCCT transform 数组格式: [r00,r01,r02,tx, r10,r11,r12,ty, r20,r21,r22,tz]\n return [\n gt[0], -gt[2], 0, gt[4],\n -gt[1], gt[3], 0, -gt[5],\n 0, 0, 1, 0,\n ]\n}\n\n/** 对 OCCT 空间点应用 SVG 2D 变换 */\nfunction applySvgTransformToOcctPoint(p: Pt, gt: SvgTransform): Pt {\n // p 在 OCCT 空间 (Y-up),先转回 SVG 空间 (Y-down)\n const svgX = p.x\n const svgY = -p.y\n const tx = gt[0] * svgX + gt[2] * svgY + gt[4]\n const ty = gt[1] * svgX + gt[3] * svgY + gt[5]\n return { x: tx, y: -ty, z: 0 }\n}\n\n// ─── SVG path tokenizer ───\n\nfunction tokenizeSVGPath(d: string): PathToken[] {\n const tokens: PathToken[] = []\n const re = /([MmLlHhVvCcSsQqTtAaZz])([^MmLlHhVvCcSsQqTtAaZz]*)/g\n let match: RegExpExecArray | null\n while ((match = re.exec(d)) !== null) {\n const command = match[1] ?? ''\n const argStr = (match[2] ?? '').trim()\n const args: number[] = []\n if (argStr) {\n const numRe = /[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?/g\n let numMatch: RegExpExecArray | null\n while ((numMatch = numRe.exec(argStr)) !== null) {\n args.push(parseFloat(numMatch[0]))\n }\n }\n tokens.push({ command, args })\n }\n return tokens\n}\n\n// ─── SVG path → OCCT edges ───\n\n/** Y 轴翻转:SVG Y-down → OCCT Y-up */\nfunction flipY(x: number, y: number): Pt {\n return { x, y: -y, z: 0 }\n}\n\n/** 将二次贝塞尔转为三次贝塞尔的控制点 */\nfunction quadToCubic(p0: Pt, cp: Pt, p2: Pt): [Pt, Pt] {\n return [\n { x: (2 * cp.x + p0.x) / 3, y: (2 * cp.y + p0.y) / 3, z: 0 },\n { x: (2 * cp.x + p2.x) / 3, y: (2 * cp.y + p2.y) / 3, z: 0 },\n ]\n}\n\n/** cursor 状态 */\ninterface PathCursor {\n cx: number; cy: number\n sx: number; sy: number\n prevControlX: number; prevControlY: number\n lastCmd: string\n}\n\n/**\n * SVG arc 参数 → sagitta 中点 → 三点圆弧。\n *\n * 算法与 brepjs createStandardArc(`:296`)一致:\n * 1. 弦中点 = (from + to) / 2\n * 2. 弦长 = dist(from, to)\n * 3. sagitta = r - sqrt(r² - (chord/2)²)\n * 4. 中点 = 弦中点 + sagitta * 法线方向\n */\nfunction arcMidPoint(\n fromX: number, fromY: number,\n toX: number, toY: number,\n rx: number, ry: number,\n largeArc: boolean, sweepFlag: boolean,\n): Pt {\n const r = Math.max(rx, ry)\n const dx = toX - fromX\n const dy = toY - fromY\n const dist = Math.sqrt(dx * dx + dy * dy)\n const halfChord = dist / 2\n const sagitta = halfChord < r ? r - Math.sqrt(r * r - halfChord * halfChord) : r\n\n const sign = (largeArc !== sweepFlag ? 1 : -1) * (sweepFlag ? 1 : -1)\n const nx = -dy / dist\n const ny = dx / dist\n const midX = (fromX + toX) / 2 + sign * sagitta * nx\n const midY = (fromY + toY) / 2 + sign * sagitta * ny\n\n return flipY(midX, midY)\n}\n\n/**\n * 解析 SVG path `d` 字符串,构建 OCCT wire 列表。\n *\n * 每个 M...Z 闭合段(或 M...M 隐式闭合段)对应一个 wire。\n * 未闭合的段(无 Z,后接 M 或结束)也会生成 wire(但标记为未闭合)。\n *\n * @param kernel OCCT 内核\n * @param pathD SVG path `d` 属性字符串\n * @returns 闭合子路径列表(含 wire + 几何信息)\n */\nexport function parseSVGPathToWires(\n kernel: BrepEngineApi,\n pathD: string,\n): ClosedSubpath[] {\n const tokens = tokenizeSVGPath(pathD)\n const subpaths: ClosedSubpath[] = []\n\n const cursor: PathCursor = {\n cx: 0, cy: 0, sx: 0, sy: 0,\n prevControlX: 0, prevControlY: 0, lastCmd: '',\n }\n\n let currentEdges: BrepHandle[] = []\n let currentPoints: Pt[] = []\n let lastPt: Pt | null = null\n let subpathStart: Pt | null = null\n\n function flushWire(closed: boolean): void {\n if (currentEdges.length === 0) {\n currentPoints = []\n return\n }\n // 如果闭合且终点≠起点,补一条闭合边\n if (closed && subpathStart && lastPt &&\n (Math.abs(subpathStart.x - lastPt.x) > 1e-9 ||\n Math.abs(subpathStart.y - lastPt.y) > 1e-9)) {\n const edge = kernel.makeLineEdge(lastPt, subpathStart)\n currentEdges.push(edge)\n currentPoints.push(subpathStart)\n }\n\n try {\n const wire = kernel.makeWire(currentEdges)\n // 释放 edges(wire 已共享 TShape)\n for (const e of currentEdges) kernel.release(e)\n\n const pts = closed ? currentPoints : [...currentPoints]\n // 如果未闭合但有点,尝试闭合以计算 bbox/area\n if (!closed && pts.length >= 2) {\n pts.push(pts[0])\n }\n\n if (pts.length >= 3) {\n const bbox = computeBBox(pts)\n const signedArea = computeSignedArea(pts)\n subpaths.push({ points: currentPoints, bbox, signedArea, wire })\n } else {\n subpaths.push({\n points: currentPoints,\n bbox: { minX: 0, minY: 0, maxX: 0, maxY: 0 },\n signedArea: 0,\n wire,\n })\n }\n } catch {\n // makeWire 失败 → 释放 edges\n for (const e of currentEdges) kernel.release(e)\n }\n\n currentEdges = []\n currentPoints = []\n }\n\n for (const { command, args } of tokens) {\n const isRelative = command === command.toLowerCase()\n const cmd = command.toUpperCase()\n\n switch (cmd) {\n case 'M': {\n // 如果有当前 edges,先 flush(隐式闭合不补线)\n if (currentEdges.length > 0) flushWire(false)\n\n let i = 0\n while (i + 1 < args.length) {\n const x = (isRelative ? cursor.cx : 0) + (args[i] ?? 0)\n const y = (isRelative ? cursor.cy : 0) + (args[i + 1] ?? 0)\n if (i === 0) {\n cursor.sx = x\n cursor.sy = y\n lastPt = flipY(x, y)\n subpathStart = lastPt\n currentPoints.push(lastPt)\n } else {\n // 隐式 L\n const curr = flipY(x, y)\n if (lastPt && (Math.abs(curr.x - lastPt.x) > 1e-9 || Math.abs(curr.y - lastPt.y) > 1e-9)) {\n const edge = kernel.makeLineEdge(lastPt, curr)\n currentEdges.push(edge)\n currentPoints.push(curr)\n }\n lastPt = curr\n }\n cursor.cx = x\n cursor.cy = y\n i += 2\n }\n break\n }\n case 'L': {\n let i = 0\n while (i + 1 < args.length) {\n const x = (isRelative ? cursor.cx : 0) + (args[i] ?? 0)\n const y = (isRelative ? cursor.cy : 0) + (args[i + 1] ?? 0)\n const curr = flipY(x, y)\n if (lastPt && (Math.abs(curr.x - lastPt.x) > 1e-9 || Math.abs(curr.y - lastPt.y) > 1e-9)) {\n const edge = kernel.makeLineEdge(lastPt, curr)\n currentEdges.push(edge)\n currentPoints.push(curr)\n }\n lastPt = curr\n cursor.cx = x\n cursor.cy = y\n i += 2\n }\n break\n }\n case 'H': {\n for (const arg of args) {\n const x = isRelative ? cursor.cx + arg : arg\n const curr = flipY(x, cursor.cy)\n if (lastPt && (Math.abs(curr.x - lastPt.x) > 1e-9 || Math.abs(curr.y - lastPt.y) > 1e-9)) {\n const edge = kernel.makeLineEdge(lastPt, curr)\n currentEdges.push(edge)\n currentPoints.push(curr)\n }\n lastPt = curr\n cursor.cx = x\n }\n break\n }\n case 'V': {\n for (const arg of args) {\n const y = isRelative ? cursor.cy + arg : arg\n const curr = flipY(cursor.cx, y)\n if (lastPt && (Math.abs(curr.x - lastPt.x) > 1e-9 || Math.abs(curr.y - lastPt.y) > 1e-9)) {\n const edge = kernel.makeLineEdge(lastPt, curr)\n currentEdges.push(edge)\n currentPoints.push(curr)\n }\n lastPt = curr\n cursor.cy = y\n }\n break\n }\n case 'C': {\n let i = 0\n while (i + 5 < args.length) {\n const ox = isRelative ? cursor.cx : 0\n const oy = isRelative ? cursor.cy : 0\n const cp1 = flipY(ox + (args[i] ?? 0), oy + (args[i + 1] ?? 0))\n const cp2 = flipY(ox + (args[i + 2] ?? 0), oy + (args[i + 3] ?? 0))\n const endPt = flipY(ox + (args[i + 4] ?? 0), oy + (args[i + 5] ?? 0))\n if (lastPt) {\n const edge = kernel.makeBezierEdge([lastPt, cp1, cp2, endPt])\n currentEdges.push(edge)\n currentPoints.push(endPt)\n }\n cursor.prevControlX = ox + (args[i + 2] ?? 0)\n cursor.prevControlY = oy + (args[i + 3] ?? 0)\n lastPt = endPt\n cursor.cx = ox + (args[i + 4] ?? 0)\n cursor.cy = oy + (args[i + 5] ?? 0)\n i += 6\n }\n break\n }\n case 'S': {\n let i = 0\n while (i + 3 < args.length) {\n const ox = isRelative ? cursor.cx : 0\n const oy = isRelative ? cursor.cy : 0\n const prev = cursor.lastCmd\n const cp1x = prev === 'C' || prev === 'S' ? 2 * cursor.cx - cursor.prevControlX : cursor.cx\n const cp1y = prev === 'C' || prev === 'S' ? 2 * cursor.cy - cursor.prevControlY : cursor.cy\n const cp2 = flipY(ox + (args[i] ?? 0), oy + (args[i + 1] ?? 0))\n const endPt = flipY(ox + (args[i + 2] ?? 0), oy + (args[i + 3] ?? 0))\n if (lastPt) {\n const cp1 = flipY(cp1x, cp1y)\n const edge = kernel.makeBezierEdge([lastPt, cp1, cp2, endPt])\n currentEdges.push(edge)\n currentPoints.push(endPt)\n }\n cursor.prevControlX = ox + (args[i] ?? 0)\n cursor.prevControlY = oy + (args[i + 1] ?? 0)\n lastPt = endPt\n cursor.cx = ox + (args[i + 2] ?? 0)\n cursor.cy = oy + (args[i + 3] ?? 0)\n cursor.lastCmd = 'S'\n i += 4\n }\n break\n }\n case 'Q': {\n let i = 0\n while (i + 3 < args.length) {\n const ox = isRelative ? cursor.cx : 0\n const oy = isRelative ? cursor.cy : 0\n const cp = flipY(ox + (args[i] ?? 0), oy + (args[i + 1] ?? 0))\n const endPt = flipY(ox + (args[i + 2] ?? 0), oy + (args[i + 3] ?? 0))\n if (lastPt) {\n const [c1, c2] = quadToCubic(lastPt, cp, endPt)\n const edge = kernel.makeBezierEdge([lastPt, c1, c2, endPt])\n currentEdges.push(edge)\n currentPoints.push(endPt)\n }\n cursor.prevControlX = ox + (args[i] ?? 0)\n cursor.prevControlY = oy + (args[i + 1] ?? 0)\n lastPt = endPt\n cursor.cx = ox + (args[i + 2] ?? 0)\n cursor.cy = oy + (args[i + 3] ?? 0)\n i += 4\n }\n break\n }\n case 'T': {\n let i = 0\n while (i + 1 < args.length) {\n const ox = isRelative ? cursor.cx : 0\n const oy = isRelative ? cursor.cy : 0\n const prev = cursor.lastCmd\n const cpx = prev === 'Q' || prev === 'T' ? 2 * cursor.cx - cursor.prevControlX : cursor.cx\n const cpy = prev === 'Q' || prev === 'T' ? 2 * cursor.cy - cursor.prevControlY : cursor.cy\n const endPt = flipY(ox + (args[i] ?? 0), oy + (args[i + 1] ?? 0))\n if (lastPt) {\n const cp = flipY(cpx, cpy)\n const [c1, c2] = quadToCubic(lastPt, cp, endPt)\n const edge = kernel.makeBezierEdge([lastPt, c1, c2, endPt])\n currentEdges.push(edge)\n currentPoints.push(endPt)\n }\n cursor.prevControlX = cpx\n cursor.prevControlY = cpy\n lastPt = endPt\n cursor.cx = ox + (args[i] ?? 0)\n cursor.cy = oy + (args[i + 1] ?? 0)\n cursor.lastCmd = 'T'\n i += 2\n }\n break\n }\n case 'A': {\n let i = 0\n while (i + 6 < args.length) {\n const rx = Math.abs(args[i] ?? 0)\n const ry = Math.abs(args[i + 1] ?? 0)\n const largeArc = (args[i + 3] ?? 0) !== 0\n const sweepFlag = (args[i + 4] ?? 0) !== 0\n const x = (isRelative ? cursor.cx : 0) + (args[i + 5] ?? 0)\n const y = (isRelative ? cursor.cy : 0) + (args[i + 6] ?? 0)\n\n if (rx === 0 || ry === 0) {\n // 退化为直线\n const curr = flipY(x, y)\n if (lastPt) {\n const edge = kernel.makeLineEdge(lastPt, curr)\n currentEdges.push(edge)\n currentPoints.push(curr)\n }\n lastPt = curr\n } else {\n const dx = x - cursor.cx\n const dy = y - cursor.cy\n const dist = Math.sqrt(dx * dx + dy * dy)\n if (dist < 1e-10) {\n // 完整圆 → 两段半圆\n const r = Math.max(rx, ry)\n const sweep = sweepFlag ? 1 : -1\n const mid1 = flipY(cursor.cx - sweep * r, cursor.cy + sweep * r)\n const opposite = flipY(cursor.cx, cursor.cy + 2 * sweep * r)\n const mid2 = flipY(cursor.cx + sweep * r, cursor.cy + sweep * r)\n if (lastPt) {\n const e1 = kernel.makeArcEdge(lastPt, mid1, opposite)\n const e2 = kernel.makeArcEdge(opposite, mid2, lastPt)\n currentEdges.push(e1, e2)\n currentPoints.push(opposite, lastPt)\n }\n } else {\n // 标准圆弧 → sagitta 中点\n const mid = arcMidPoint(cursor.cx, cursor.cy, x, y, rx, ry, largeArc, sweepFlag)\n const endPt = flipY(x, y)\n if (lastPt) {\n const edge = kernel.makeArcEdge(lastPt, mid, endPt)\n currentEdges.push(edge)\n currentPoints.push(endPt)\n }\n lastPt = endPt\n }\n }\n cursor.cx = x\n cursor.cy = y\n i += 7\n }\n break\n }\n case 'Z': {\n // 闭合\n if (subpathStart && lastPt &&\n (Math.abs(subpathStart.x - lastPt.x) > 1e-9 ||\n Math.abs(subpathStart.y - lastPt.y) > 1e-9)) {\n const edge = kernel.makeLineEdge(lastPt, subpathStart)\n currentEdges.push(edge)\n currentPoints.push(subpathStart)\n }\n flushWire(true)\n lastPt = subpathStart\n cursor.cx = cursor.sx\n cursor.cy = cursor.sy\n break\n }\n }\n\n if (cmd !== 'S' && cmd !== 'T') {\n cursor.lastCmd = cmd\n }\n }\n\n // 处理最后一个未闭合的子路径\n if (currentEdges.length > 0) {\n flushWire(false)\n }\n\n return subpaths\n}\n\n// ─── 几何工具 ───\n\nfunction computeBBox(points: Pt[]): { minX: number; minY: number; maxX: number; maxY: number } {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity\n for (const p of points) {\n if (p.x < minX) minX = p.x\n if (p.y < minY) minY = p.y\n if (p.x > maxX) maxX = p.x\n if (p.y > maxY) maxY = p.y\n }\n return { minX, minY, maxX, maxY }\n}\n\n/** Shoelace 公式计算有符号面积(正=CCW,负=CW) */\nfunction computeSignedArea(points: Pt[]): number {\n let area = 0\n const n = points.length\n if (n < 3) return 0\n for (let i = 0; i < n; i++) {\n const j = (i + 1) % n\n area += points[i].x * points[j].y\n area -= points[j].x * points[i].y\n }\n return area / 2\n}\n\n/** 点在多边形内(ray casting) */\nfunction pointInPolygon(pt: Pt, polygon: Pt[]): boolean {\n const n = polygon.length\n if (n < 3) return false\n let inside = false\n for (let i = 0, j = n - 1; i < n; j = i++) {\n const xi = polygon[i].x, yi = polygon[i].y\n const xj = polygon[j].x, yj = polygon[j].y\n const intersect = ((yi > pt.y) !== (yj > pt.y)) &&\n (pt.x < (xj - xi) * (pt.y - yi) / (yj - yi + 1e-12) + xi)\n if (intersect) inside = !inside\n }\n return inside\n}\n\n/** 计算多边形质心 */\nfunction polygonCentroid(points: Pt[]): Pt {\n let cx = 0, cy = 0\n for (const p of points) {\n cx += p.x\n cy += p.y\n }\n return { x: cx / points.length, y: cy / points.length, z: 0 }\n}\n\nfunction bboxContains(outer: { minX: number; minY: number; maxX: number; maxY: number },\n inner: { minX: number; minY: number; maxX: number; maxY: number }): boolean {\n return inner.minX >= outer.minX && inner.maxX <= outer.maxX &&\n inner.minY >= outer.minY && inner.maxY <= outer.maxY\n}\n\n// ─── 孔洞分类 ───\n\ninterface ContourGroup {\n /** 外轮廓 wire */\n outer: BrepHandle\n /** 孔洞 wire 列表 */\n holes: BrepHandle[]\n}\n\n/**\n * 将闭合子路径分类为外轮廓 + 孔洞的分组。\n *\n * 算法:\n * 1. 按有符号面积绝对值降序排(大轮廓优先)\n * 2. 对每条子路径 A,找到直接包含它的最小外轮廓 B\n * 3. A 是 B 的孔洞\n * 4. 没有外轮廓的子路径是独立外轮廓\n *\n * @param subpaths - the closed subpaths to classify.\n * @returns the contour groups of outer wires and their hole wires.\n */\nexport function classifyHoles(subpaths: ClosedSubpath[]): ContourGroup[] {\n // 按面积绝对值降序排\n const sorted = [...subpaths].sort((a, b) => Math.abs(b.signedArea) - Math.abs(a.signedArea))\n\n // 为每条子路径找直接外轮廓\n const parentOf = new Array(sorted.length).fill(-1)\n for (let i = 0; i < sorted.length; i++) {\n let bestParent = -1\n let bestParentArea = Infinity\n const centroid = polygonCentroid(sorted[i].points)\n for (let j = 0; j < sorted.length; j++) {\n if (i === j) continue\n // j 的面积必须大于 i\n if (Math.abs(sorted[j].signedArea) <= Math.abs(sorted[i].signedArea)) continue\n // j 的 bbox 必须包含 i 的 bbox\n if (!bboxContains(sorted[j].bbox, sorted[i].bbox)) continue\n // i 的质心必须在 j 的多边形内\n if (!pointInPolygon(centroid, sorted[j].points)) continue\n // 选面积最小的外轮廓(直接包含者)\n if (Math.abs(sorted[j].signedArea) < bestParentArea) {\n bestParentArea = Math.abs(sorted[j].signedArea)\n bestParent = j\n }\n }\n parentOf[i] = bestParent\n }\n\n // 构建分组\n const groups: ContourGroup[] = []\n for (let i = 0; i < sorted.length; i++) {\n if (parentOf[i] === -1) {\n // 外轮廓\n groups.push({ outer: sorted[i].wire, holes: [] })\n }\n }\n\n // 为每个孔洞找到对应的外轮廓\n for (let i = 0; i < sorted.length; i++) {\n if (parentOf[i] !== -1) {\n // 找到 groups 中对应的外轮廓\n const parentIdx = parentOf[i]\n // parentIdx 是 sorted 中的索引,需要找到对应的 group\n // 外轮廓在 sorted 中的索引 → groups 中的索引\n let groupIdx = -1\n let outerCount = 0\n for (let k = 0; k < sorted.length; k++) {\n if (parentOf[k] === -1) {\n if (k === parentIdx) {\n groupIdx = outerCount\n break\n }\n outerCount++\n }\n }\n if (groupIdx >= 0 && groupIdx < groups.length) {\n groups[groupIdx].holes.push(sorted[i].wire)\n }\n }\n }\n\n return groups\n}\n\n// ─── SVG → Solid ───\n\n/**\n * 将 SVG 字符串转换为 OCCT 3D solid(face → extrude → fuse)。\n *\n * 流程:\n * 1. 提取所有 SVG 元素的 path `d`\n * 2. 解析每条 path → wires\n * 3. 分类外轮廓/孔洞\n * 4. makeFace(outer) → addHolesInFace(holes) → extrude\n * 5. fuse 所有 solid\n * 6. 缩放 + 居中\n *\n * @param kernel OCCT 内核\n * @param svgString SVG 字符串\n * @param options 配置选项\n * @returns BrepHandle(合并后的 solid)\n */\nexport function svgToSolid(\n kernel: BrepEngineApi,\n svgString: string,\n options: {\n depth: number\n targetLongSide?: number\n },\n): BrepHandle {\n const { depth, targetLongSide = 20 } = options\n\n // 1. 提取所有 path d\n const pathDs = extractSvgPaths(svgString)\n if (pathDs.length === 0) {\n throw new Error('[svgToSolid] No path elements found in SVG')\n }\n\n // 2. 解析每条 path → wires\n const allSubpaths: ClosedSubpath[] = []\n for (const d of pathDs) {\n const subpaths = parseSVGPathToWires(kernel, d)\n allSubpaths.push(...subpaths)\n }\n\n if (allSubpaths.length === 0) {\n throw new Error('[svgToSolid] No closed subpaths generated from SVG paths')\n }\n\n // 2.5. 应用 <g transform> 变换(如果有)\n const groupTransform = extractGroupTransform(svgString)\n if (groupTransform) {\n const matrix = svgTransformToOcctMatrix(groupTransform)\n for (const sp of allSubpaths) {\n // 变换 wire — use generalTransform because group transform may have non-uniform scale (e.g. d=-0.1 vs a=0.1)\n // kernel.transform only supports uniform scale (gp_Trsf), generalTransform supports non-uniform (gp_GTrsf)\n const newWire = kernel.generalTransform(sp.wire, matrix)\n kernel.release(sp.wire)\n sp.wire = newWire\n // 变换 points(用于 bbox/area 计算)\n sp.points = sp.points.map(p => applySvgTransformToOcctPoint(p, groupTransform))\n sp.bbox = computeBBox(sp.points)\n sp.signedArea = computeSignedArea(sp.points)\n }\n }\n\n // 3. 分类外轮廓/孔洞\n const groups = classifyHoles(allSubpaths)\n\n // 4. 计算缩放比例(与 mesh 路径 geo.scale(scale, scale, 1) 语义一致:XY 缩放,Z 不变)\n const { naturalWidth, naturalHeight } = parseSvgNaturalSize(svgString)\n let scale = 1\n if (naturalWidth > 0 && naturalHeight > 0) {\n const longSide = Math.max(naturalWidth, naturalHeight)\n scale = longSide > 0 ? targetLongSide / longSide : 1\n }\n\n // 5. 对每个分组:makeFace → addHolesInFace → 缩放 face → extrude\n // 缩放在 extrude 之前应用(仅 XY),确保 depth 不被缩放\n const solids: BrepHandle[] = []\n for (const group of groups) {\n try {\n let face = kernel.makeFace(group.outer)\n if (group.holes.length > 0) {\n const newFace = kernel.addHolesInFace(face, group.holes)\n kernel.release(face)\n face = newFace\n }\n // 缩放 face(XY 平面),depth 不受影响\n // face 在 Z=0 平面,kernel.scale 是均匀缩放但 Z=0*scale=0 不变\n if (scale !== 1) {\n const scaledFace = kernel.scale(face, { x: 0, y: 0, z: 0 }, scale)\n kernel.release(face)\n face = scaledFace\n }\n const solid = kernel.extrude(face, 0, 0, depth)\n kernel.release(face)\n solids.push(solid)\n } catch {\n // makeFace/extrude 失败 → 跳过此轮廓\n }\n }\n\n // 释放所有 wire(face/solid 已共享 TShape)\n for (const sp of allSubpaths) {\n try { kernel.release(sp.wire) } catch { /* 已释放 */ }\n }\n\n if (solids.length === 0) {\n throw new Error('[svgToSolid] No solids generated from SVG')\n }\n\n // 6. Fuse 所有 solid\n let result = solids[0]\n for (let i = 1; i < solids.length; i++) {\n const prev = result\n result = kernel.fuse(prev, solids[i])\n kernel.release(prev)\n kernel.release(solids[i])\n }\n\n // 7. 居中:XY 居中到原点,Z 底部对齐到 0\n const bb = getSolidBoundingBox(kernel, result)\n const cx = (bb.min[0] + bb.max[0]) / 2\n const cy = (bb.min[1] + bb.max[1]) / 2\n const cz = bb.min[2]\n const centered = kernel.translate(result, -cx, -cy, -cz)\n kernel.release(result)\n\n return centered\n}\n"]}
1
+ {"version":3,"file":"svg-to-solid.js","sourceRoot":"","sources":["../../../src/brep/svg/svg-to-solid.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SVG → OCCT wire/face/solid 转换\n *\n * 适配自 brepjs `src/io/svgImportFns.ts`,保留核心算法和命名。\n * 与 brepjs 的差异:\n * - brepjs 用 Curve2D / Blueprint / sketchOnPlane → 本项目直接用 3D edge / makeWire / makeFace\n * - brepjs 不处理孔洞 → 本项目用 kernel.addHolesInFace 处理外轮廓+内孔\n * - brepjs 仅解析 <path> → 本项目额外转换 <rect>/<circle>/<ellipse>/<line>/<polyline>/<polygon>\n *\n * 与 text-to-solid.ts 的差异:\n * - text 的 glyph 互不嵌套,各自 makeFace→extrude→fuse\n * - SVG 路径常有外轮廓+内孔,需 addHolesInFace 挖孔后再 extrude\n *\n * SVG path 命令 → OCCT edge 映射:\n * - M (moveTo) → 开始新子路径\n * - L (lineTo) → kernel.makeLineEdge\n * - H/V → 转 makeLineEdge\n * - C (cubicBezier) → kernel.makeBezierEdge\n * - S (smoothCubicBezier) → 反射控制点 → makeBezierEdge\n * - Q (quadraticBezier) → 转三次贝塞尔 → makeBezierEdge\n * - T (smoothQuadraticBezier) → 反射控制点 → 转三次 → makeBezierEdge\n * - A (arc) → 计算 sagitta 中点 → kernel.makeArcEdge(start, mid, end)\n * - Z (closePath) → 闭合 wire\n */\n\nimport type { BrepHandle } from '../engine/types'\nimport type { BrepEngineApi } from '../engine/primitives'\nimport { getSolidBoundingBox } from '../brep-utils'\nimport { parseSvgNaturalSize } from '../../primitives/parse-svg-size'\nimport {\n extractSvgPaths,\n tokenizeSvgPath,\n extractGroupTransform,\n classifyNested,\n computeBBox,\n computeSignedArea,\n} from '../../primitives/svg/svg-path'\nimport type { SvgTransform } from '../../primitives/svg/svg-path'\n\nexport { parseSvgNaturalSize }\n\n// 兼容导出:语法层共享实现(extractSvgPaths 等的历史入口仍在 brep 面可用)\nexport { extractSvgPaths }\n\n// ─── 类型定义 ───\n\n/** 3D 点(OCCT Vec3 格式) */\ninterface Pt { x: number; y: number; z: number }\n\n/** 闭合子路径信息(用于孔洞检测) */\ninterface ClosedSubpath {\n /** 顶点列表(XY 平面,Z=0) */\n points: Pt[]\n /** 包围盒 */\n bbox: { minX: number; minY: number; maxX: number; maxY: number }\n /** 有符号面积(Shoelace,正=CCW,负=CW) */\n signedArea: number\n /** 对应的 OCCT wire */\n wire: BrepHandle\n}\n\n// ─── SVG 元素提取 / transform / tokenizer ───\n// 与 mesh 链共享同一实现(primitives/svg/svg-path.ts):\n// extractSvgPaths / parseSvgTransform / extractGroupTransform / tokenizeSvgPath。\n// brep 链保留精确几何语义(Bezier→OCCT 曲线、Arc→三点圆弧),\n// 语法层(元素提取、矩阵解析、tokenizer)不重复实现。\n\n// ─── SVG transform 处理(OCCT 矩阵适配,brep 链特有) ───\nfunction svgTransformToOcctMatrix(gt: SvgTransform): number[] {\n // SVG: x' = a*x + c*y + e, y' = b*x + d*y + f\n // OCCT 点的 Y 已翻转 (y_occt = -y_svg),所以:\n // x'_occt = a*x_occt - c*y_occt + e\n // y'_occt = -b*x_occt + d*y_occt - f\n // OCCT transform 数组格式: [r00,r01,r02,tx, r10,r11,r12,ty, r20,r21,r22,tz]\n return [\n gt[0], -gt[2], 0, gt[4],\n -gt[1], gt[3], 0, -gt[5],\n 0, 0, 1, 0,\n ]\n}\n\n/** 对 OCCT 空间点应用 SVG 2D 变换 */\nfunction applySvgTransformToOcctPoint(p: Pt, gt: SvgTransform): Pt {\n // p 在 OCCT 空间 (Y-up),先转回 SVG 空间 (Y-down)\n const svgX = p.x\n const svgY = -p.y\n const tx = gt[0] * svgX + gt[2] * svgY + gt[4]\n const ty = gt[1] * svgX + gt[3] * svgY + gt[5]\n return { x: tx, y: -ty, z: 0 }\n}\n\n// ─── SVG path tokenizer ───\n\n// ─── SVG path → OCCT edges ───\n\n/** Y 轴翻转:SVG Y-down → OCCT Y-up */\nfunction flipY(x: number, y: number): Pt {\n return { x, y: -y, z: 0 }\n}\n\n/** 将二次贝塞尔转为三次贝塞尔的控制点 */\nfunction quadToCubic(p0: Pt, cp: Pt, p2: Pt): [Pt, Pt] {\n return [\n { x: (2 * cp.x + p0.x) / 3, y: (2 * cp.y + p0.y) / 3, z: 0 },\n { x: (2 * cp.x + p2.x) / 3, y: (2 * cp.y + p2.y) / 3, z: 0 },\n ]\n}\n\n/** cursor 状态 */\ninterface PathCursor {\n cx: number; cy: number\n sx: number; sy: number\n prevControlX: number; prevControlY: number\n lastCmd: string\n}\n\n/**\n * SVG arc 参数 → sagitta 中点 → 三点圆弧。\n *\n * 算法与 brepjs createStandardArc(`:296`)一致:\n * 1. 弦中点 = (from + to) / 2\n * 2. 弦长 = dist(from, to)\n * 3. sagitta = r - sqrt(r² - (chord/2)²)\n * 4. 中点 = 弦中点 + sagitta * 法线方向\n */\nfunction arcMidPoint(\n fromX: number, fromY: number,\n toX: number, toY: number,\n rx: number, ry: number,\n largeArc: boolean, sweepFlag: boolean,\n): Pt {\n const r = Math.max(rx, ry)\n const dx = toX - fromX\n const dy = toY - fromY\n const dist = Math.sqrt(dx * dx + dy * dy)\n const halfChord = dist / 2\n const sagitta = halfChord < r ? r - Math.sqrt(r * r - halfChord * halfChord) : r\n\n const sign = (largeArc !== sweepFlag ? 1 : -1) * (sweepFlag ? 1 : -1)\n const nx = -dy / dist\n const ny = dx / dist\n const midX = (fromX + toX) / 2 + sign * sagitta * nx\n const midY = (fromY + toY) / 2 + sign * sagitta * ny\n\n return flipY(midX, midY)\n}\n\n/**\n * 解析 SVG path `d` 字符串,构建 OCCT wire 列表。\n *\n * 每个 M...Z 闭合段(或 M...M 隐式闭合段)对应一个 wire。\n * 未闭合的段(无 Z,后接 M 或结束)也会生成 wire(但标记为未闭合)。\n *\n * @param kernel OCCT 内核\n * @param pathD SVG path `d` 属性字符串\n * @returns 闭合子路径列表(含 wire + 几何信息)\n */\nexport function parseSVGPathToWires(\n kernel: BrepEngineApi,\n pathD: string,\n): ClosedSubpath[] {\n const tokens = tokenizeSvgPath(pathD)\n const subpaths: ClosedSubpath[] = []\n\n const cursor: PathCursor = {\n cx: 0, cy: 0, sx: 0, sy: 0,\n prevControlX: 0, prevControlY: 0, lastCmd: '',\n }\n\n let currentEdges: BrepHandle[] = []\n let currentPoints: Pt[] = []\n let lastPt: Pt | null = null\n let subpathStart: Pt | null = null\n\n function flushWire(closed: boolean): void {\n if (currentEdges.length === 0) {\n currentPoints = []\n return\n }\n // 如果闭合且终点≠起点,补一条闭合边\n if (closed && subpathStart && lastPt &&\n (Math.abs(subpathStart.x - lastPt.x) > 1e-9 ||\n Math.abs(subpathStart.y - lastPt.y) > 1e-9)) {\n const edge = kernel.makeLineEdge(lastPt, subpathStart)\n currentEdges.push(edge)\n currentPoints.push(subpathStart)\n }\n\n try {\n const wire = kernel.makeWire(currentEdges)\n // 释放 edges(wire 已共享 TShape)\n for (const e of currentEdges) kernel.release(e)\n\n const pts = closed ? currentPoints : [...currentPoints]\n // 如果未闭合但有点,尝试闭合以计算 bbox/area\n if (!closed && pts.length >= 2) {\n pts.push(pts[0])\n }\n\n if (pts.length >= 3) {\n const bbox = computeBBox(pts)\n const signedArea = computeSignedArea(pts)\n subpaths.push({ points: currentPoints, bbox, signedArea, wire })\n } else {\n subpaths.push({\n points: currentPoints,\n bbox: { minX: 0, minY: 0, maxX: 0, maxY: 0 },\n signedArea: 0,\n wire,\n })\n }\n } catch {\n // makeWire 失败 → 释放 edges\n for (const e of currentEdges) kernel.release(e)\n }\n\n currentEdges = []\n currentPoints = []\n }\n\n for (const { command, args } of tokens) {\n const isRelative = command === command.toLowerCase()\n const cmd = command.toUpperCase()\n\n switch (cmd) {\n case 'M': {\n // 如果有当前 edges,先 flush(隐式闭合不补线)\n if (currentEdges.length > 0) flushWire(false)\n\n let i = 0\n while (i + 1 < args.length) {\n const x = (isRelative ? cursor.cx : 0) + (args[i] ?? 0)\n const y = (isRelative ? cursor.cy : 0) + (args[i + 1] ?? 0)\n if (i === 0) {\n cursor.sx = x\n cursor.sy = y\n lastPt = flipY(x, y)\n subpathStart = lastPt\n currentPoints.push(lastPt)\n } else {\n // 隐式 L\n const curr = flipY(x, y)\n if (lastPt && (Math.abs(curr.x - lastPt.x) > 1e-9 || Math.abs(curr.y - lastPt.y) > 1e-9)) {\n const edge = kernel.makeLineEdge(lastPt, curr)\n currentEdges.push(edge)\n currentPoints.push(curr)\n }\n lastPt = curr\n }\n cursor.cx = x\n cursor.cy = y\n i += 2\n }\n break\n }\n case 'L': {\n let i = 0\n while (i + 1 < args.length) {\n const x = (isRelative ? cursor.cx : 0) + (args[i] ?? 0)\n const y = (isRelative ? cursor.cy : 0) + (args[i + 1] ?? 0)\n const curr = flipY(x, y)\n if (lastPt && (Math.abs(curr.x - lastPt.x) > 1e-9 || Math.abs(curr.y - lastPt.y) > 1e-9)) {\n const edge = kernel.makeLineEdge(lastPt, curr)\n currentEdges.push(edge)\n currentPoints.push(curr)\n }\n lastPt = curr\n cursor.cx = x\n cursor.cy = y\n i += 2\n }\n break\n }\n case 'H': {\n for (const arg of args) {\n const x = isRelative ? cursor.cx + arg : arg\n const curr = flipY(x, cursor.cy)\n if (lastPt && (Math.abs(curr.x - lastPt.x) > 1e-9 || Math.abs(curr.y - lastPt.y) > 1e-9)) {\n const edge = kernel.makeLineEdge(lastPt, curr)\n currentEdges.push(edge)\n currentPoints.push(curr)\n }\n lastPt = curr\n cursor.cx = x\n }\n break\n }\n case 'V': {\n for (const arg of args) {\n const y = isRelative ? cursor.cy + arg : arg\n const curr = flipY(cursor.cx, y)\n if (lastPt && (Math.abs(curr.x - lastPt.x) > 1e-9 || Math.abs(curr.y - lastPt.y) > 1e-9)) {\n const edge = kernel.makeLineEdge(lastPt, curr)\n currentEdges.push(edge)\n currentPoints.push(curr)\n }\n lastPt = curr\n cursor.cy = y\n }\n break\n }\n case 'C': {\n let i = 0\n while (i + 5 < args.length) {\n const ox = isRelative ? cursor.cx : 0\n const oy = isRelative ? cursor.cy : 0\n const cp1 = flipY(ox + (args[i] ?? 0), oy + (args[i + 1] ?? 0))\n const cp2 = flipY(ox + (args[i + 2] ?? 0), oy + (args[i + 3] ?? 0))\n const endPt = flipY(ox + (args[i + 4] ?? 0), oy + (args[i + 5] ?? 0))\n if (lastPt) {\n const edge = kernel.makeBezierEdge([lastPt, cp1, cp2, endPt])\n currentEdges.push(edge)\n currentPoints.push(endPt)\n }\n cursor.prevControlX = ox + (args[i + 2] ?? 0)\n cursor.prevControlY = oy + (args[i + 3] ?? 0)\n lastPt = endPt\n cursor.cx = ox + (args[i + 4] ?? 0)\n cursor.cy = oy + (args[i + 5] ?? 0)\n i += 6\n }\n break\n }\n case 'S': {\n let i = 0\n while (i + 3 < args.length) {\n const ox = isRelative ? cursor.cx : 0\n const oy = isRelative ? cursor.cy : 0\n const prev = cursor.lastCmd\n const cp1x = prev === 'C' || prev === 'S' ? 2 * cursor.cx - cursor.prevControlX : cursor.cx\n const cp1y = prev === 'C' || prev === 'S' ? 2 * cursor.cy - cursor.prevControlY : cursor.cy\n const cp2 = flipY(ox + (args[i] ?? 0), oy + (args[i + 1] ?? 0))\n const endPt = flipY(ox + (args[i + 2] ?? 0), oy + (args[i + 3] ?? 0))\n if (lastPt) {\n const cp1 = flipY(cp1x, cp1y)\n const edge = kernel.makeBezierEdge([lastPt, cp1, cp2, endPt])\n currentEdges.push(edge)\n currentPoints.push(endPt)\n }\n cursor.prevControlX = ox + (args[i] ?? 0)\n cursor.prevControlY = oy + (args[i + 1] ?? 0)\n lastPt = endPt\n cursor.cx = ox + (args[i + 2] ?? 0)\n cursor.cy = oy + (args[i + 3] ?? 0)\n cursor.lastCmd = 'S'\n i += 4\n }\n break\n }\n case 'Q': {\n let i = 0\n while (i + 3 < args.length) {\n const ox = isRelative ? cursor.cx : 0\n const oy = isRelative ? cursor.cy : 0\n const cp = flipY(ox + (args[i] ?? 0), oy + (args[i + 1] ?? 0))\n const endPt = flipY(ox + (args[i + 2] ?? 0), oy + (args[i + 3] ?? 0))\n if (lastPt) {\n const [c1, c2] = quadToCubic(lastPt, cp, endPt)\n const edge = kernel.makeBezierEdge([lastPt, c1, c2, endPt])\n currentEdges.push(edge)\n currentPoints.push(endPt)\n }\n cursor.prevControlX = ox + (args[i] ?? 0)\n cursor.prevControlY = oy + (args[i + 1] ?? 0)\n lastPt = endPt\n cursor.cx = ox + (args[i + 2] ?? 0)\n cursor.cy = oy + (args[i + 3] ?? 0)\n i += 4\n }\n break\n }\n case 'T': {\n let i = 0\n while (i + 1 < args.length) {\n const ox = isRelative ? cursor.cx : 0\n const oy = isRelative ? cursor.cy : 0\n const prev = cursor.lastCmd\n const cpx = prev === 'Q' || prev === 'T' ? 2 * cursor.cx - cursor.prevControlX : cursor.cx\n const cpy = prev === 'Q' || prev === 'T' ? 2 * cursor.cy - cursor.prevControlY : cursor.cy\n const endPt = flipY(ox + (args[i] ?? 0), oy + (args[i + 1] ?? 0))\n if (lastPt) {\n const cp = flipY(cpx, cpy)\n const [c1, c2] = quadToCubic(lastPt, cp, endPt)\n const edge = kernel.makeBezierEdge([lastPt, c1, c2, endPt])\n currentEdges.push(edge)\n currentPoints.push(endPt)\n }\n cursor.prevControlX = cpx\n cursor.prevControlY = cpy\n lastPt = endPt\n cursor.cx = ox + (args[i] ?? 0)\n cursor.cy = oy + (args[i + 1] ?? 0)\n cursor.lastCmd = 'T'\n i += 2\n }\n break\n }\n case 'A': {\n let i = 0\n while (i + 6 < args.length) {\n const rx = Math.abs(args[i] ?? 0)\n const ry = Math.abs(args[i + 1] ?? 0)\n const largeArc = (args[i + 3] ?? 0) !== 0\n const sweepFlag = (args[i + 4] ?? 0) !== 0\n const x = (isRelative ? cursor.cx : 0) + (args[i + 5] ?? 0)\n const y = (isRelative ? cursor.cy : 0) + (args[i + 6] ?? 0)\n\n if (rx === 0 || ry === 0) {\n // 退化为直线\n const curr = flipY(x, y)\n if (lastPt) {\n const edge = kernel.makeLineEdge(lastPt, curr)\n currentEdges.push(edge)\n currentPoints.push(curr)\n }\n lastPt = curr\n } else {\n const dx = x - cursor.cx\n const dy = y - cursor.cy\n const dist = Math.sqrt(dx * dx + dy * dy)\n if (dist < 1e-10) {\n // 完整圆 → 两段半圆\n const r = Math.max(rx, ry)\n const sweep = sweepFlag ? 1 : -1\n const mid1 = flipY(cursor.cx - sweep * r, cursor.cy + sweep * r)\n const opposite = flipY(cursor.cx, cursor.cy + 2 * sweep * r)\n const mid2 = flipY(cursor.cx + sweep * r, cursor.cy + sweep * r)\n if (lastPt) {\n const e1 = kernel.makeArcEdge(lastPt, mid1, opposite)\n const e2 = kernel.makeArcEdge(opposite, mid2, lastPt)\n currentEdges.push(e1, e2)\n currentPoints.push(opposite, lastPt)\n }\n } else {\n // 标准圆弧 → sagitta 中点\n const mid = arcMidPoint(cursor.cx, cursor.cy, x, y, rx, ry, largeArc, sweepFlag)\n const endPt = flipY(x, y)\n if (lastPt) {\n const edge = kernel.makeArcEdge(lastPt, mid, endPt)\n currentEdges.push(edge)\n currentPoints.push(endPt)\n }\n lastPt = endPt\n }\n }\n cursor.cx = x\n cursor.cy = y\n i += 7\n }\n break\n }\n case 'Z': {\n // 闭合\n if (subpathStart && lastPt &&\n (Math.abs(subpathStart.x - lastPt.x) > 1e-9 ||\n Math.abs(subpathStart.y - lastPt.y) > 1e-9)) {\n const edge = kernel.makeLineEdge(lastPt, subpathStart)\n currentEdges.push(edge)\n currentPoints.push(subpathStart)\n }\n flushWire(true)\n lastPt = subpathStart\n cursor.cx = cursor.sx\n cursor.cy = cursor.sy\n break\n }\n }\n\n if (cmd !== 'S' && cmd !== 'T') {\n cursor.lastCmd = cmd\n }\n }\n\n // 处理最后一个未闭合的子路径\n if (currentEdges.length > 0) {\n flushWire(false)\n }\n\n return subpaths\n}\n\n// ─── 孔洞分类 ───\n// 几何工具(computeBBox/computeSignedArea/pointInPolygon/polygonCentroid/bboxContains)\n// 与嵌套分组算法共享 primitives/svg/svg-path.ts 的 classifyNested 实现,\n// 本文件仅组装 wire 句柄(岛/孔中孔的多层嵌套语义已内置于 classifyNested)。\n\ninterface ContourGroup {\n /** 外轮廓 wire */\n outer: BrepHandle\n /** 孔洞 wire 列表 */\n holes: BrepHandle[]\n}\n\n/**\n * 将闭合子路径分类为外轮廓 + 孔洞的分组(复用共享 classifyNested,支持多层嵌套岛)。\n *\n * @param subpaths - the closed subpaths to classify.\n * @returns the contour groups of outer wires and their hole wires.\n */\nexport function classifyHoles(subpaths: ClosedSubpath[]): ContourGroup[] {\n const groups = classifyNested(subpaths)\n return groups.map((g) => ({\n outer: subpaths[g.outerIdx].wire,\n holes: g.holes.map((h) => subpaths[h].wire),\n }))\n}\n\n// ─── SVG → Solid ───\n\n/**\n * 将 SVG 字符串转换为 OCCT 3D solid(face → extrude → fuse)。\n *\n * 流程:\n * 1. 提取所有 SVG 元素的 path `d`\n * 2. 解析每条 path → wires\n * 3. 分类外轮廓/孔洞\n * 4. makeFace(outer) → addHolesInFace(holes) → extrude\n * 5. fuse 所有 solid\n * 6. 缩放 + 居中\n *\n * @param kernel OCCT 内核\n * @param svgString SVG 字符串\n * @param options 配置选项\n * @returns BrepHandle(合并后的 solid)\n */\nexport function svgToSolid(\n kernel: BrepEngineApi,\n svgString: string,\n options: {\n depth: number\n targetLongSide?: number\n },\n): BrepHandle {\n const { depth, targetLongSide = 20 } = options\n\n // 1. 提取所有 path d\n const pathDs = extractSvgPaths(svgString)\n if (pathDs.length === 0) {\n throw new Error('[svgToSolid] No path elements found in SVG')\n }\n\n // 2. 解析每条 path → wires\n const allSubpaths: ClosedSubpath[] = []\n for (const d of pathDs) {\n const subpaths = parseSVGPathToWires(kernel, d)\n allSubpaths.push(...subpaths)\n }\n\n if (allSubpaths.length === 0) {\n throw new Error('[svgToSolid] No closed subpaths generated from SVG paths')\n }\n\n // 2.5. 应用 <g transform> 变换(如果有)\n const groupTransform = extractGroupTransform(svgString)\n if (groupTransform) {\n const matrix = svgTransformToOcctMatrix(groupTransform)\n for (const sp of allSubpaths) {\n // 变换 wire — use generalTransform because group transform may have non-uniform scale (e.g. d=-0.1 vs a=0.1)\n // kernel.transform only supports uniform scale (gp_Trsf), generalTransform supports non-uniform (gp_GTrsf)\n const newWire = kernel.generalTransform(sp.wire, matrix)\n kernel.release(sp.wire)\n sp.wire = newWire\n // 变换 points(用于 bbox/area 计算)\n sp.points = sp.points.map(p => applySvgTransformToOcctPoint(p, groupTransform))\n sp.bbox = computeBBox(sp.points)\n sp.signedArea = computeSignedArea(sp.points)\n }\n }\n\n // 3. 分类外轮廓/孔洞\n const groups = classifyHoles(allSubpaths)\n\n // 4. 计算缩放比例(与 mesh 路径 geo.scale(scale, scale, 1) 语义一致:XY 缩放,Z 不变)\n const { naturalWidth, naturalHeight } = parseSvgNaturalSize(svgString)\n let scale = 1\n if (naturalWidth > 0 && naturalHeight > 0) {\n const longSide = Math.max(naturalWidth, naturalHeight)\n scale = longSide > 0 ? targetLongSide / longSide : 1\n }\n\n // 5. 对每个分组:makeFace → addHolesInFace → 缩放 face → extrude\n // 缩放在 extrude 之前应用(仅 XY),确保 depth 不被缩放\n const solids: BrepHandle[] = []\n for (const group of groups) {\n try {\n let face = kernel.makeFace(group.outer)\n if (group.holes.length > 0) {\n const newFace = kernel.addHolesInFace(face, group.holes)\n kernel.release(face)\n face = newFace\n }\n // 缩放 face(XY 平面),depth 不受影响\n // face 在 Z=0 平面,kernel.scale 是均匀缩放但 Z=0*scale=0 不变\n if (scale !== 1) {\n const scaledFace = kernel.scale(face, { x: 0, y: 0, z: 0 }, scale)\n kernel.release(face)\n face = scaledFace\n }\n const solid = kernel.extrude(face, 0, 0, depth)\n kernel.release(face)\n solids.push(solid)\n } catch {\n // makeFace/extrude 失败 → 跳过此轮廓\n }\n }\n\n // 释放所有 wire(face/solid 已共享 TShape)\n for (const sp of allSubpaths) {\n try { kernel.release(sp.wire) } catch { /* 已释放 */ }\n }\n\n if (solids.length === 0) {\n throw new Error('[svgToSolid] No solids generated from SVG')\n }\n\n // 6. Fuse 所有 solid\n let result = solids[0]\n for (let i = 1; i < solids.length; i++) {\n const prev = result\n result = kernel.fuse(prev, solids[i])\n kernel.release(prev)\n kernel.release(solids[i])\n }\n\n // 7. 居中:XY 居中到原点,Z 底部对齐到 0\n const bb = getSolidBoundingBox(kernel, result)\n const cx = (bb.min[0] + bb.max[0]) / 2\n const cy = (bb.min[1] + bb.max[1]) / 2\n const cz = bb.min[2]\n const centered = kernel.translate(result, -cx, -cy, -cz)\n kernel.release(result)\n\n return centered\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"brepkitKernel.d.ts","sourceRoot":"","sources":["../../src/brepkit-kernel/brepkitKernel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAqC,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAGrF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAoO9D,6DAA6D;AAC7D,KAAK,mBAAmB,GAAG,aAAa,GAAG;IACzC,oBAAoB,IAAI,MAAM,CAAA;IAC9B;;;;;;;OAOG;IACH,SAAS,EAAE,OAAO,oBAAoB,EAAE,kBAAkB,CAAA;CAC3D,CAAA;AAkDD;;;;;GAKG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAgwC5E;AAwDD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAKhD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAQrC;AAED,2EAA2E;AAC3E,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"brepkitKernel.d.ts","sourceRoot":"","sources":["../../src/brepkit-kernel/brepkitKernel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAqC,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAGrF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAoO9D,6DAA6D;AAC7D,KAAK,mBAAmB,GAAG,aAAa,GAAG;IACzC,oBAAoB,IAAI,MAAM,CAAA;IAC9B;;;;;;;OAOG;IACH,SAAS,EAAE,OAAO,oBAAoB,EAAE,kBAAkB,CAAA;CAC3D,CAAA;AAkDD;;;;;GAKG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CA0wC5E;AAwDD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAKhD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAQrC;AAED,2EAA2E;AAC3E,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAA"}
@@ -1357,6 +1357,16 @@ export async function createBrepkitPrimitives() {
1357
1357
  return { uMin: d[0] ?? 0, uMax: d[1] ?? 1, vMin: d[2] ?? 0, vMax: d[3] ?? 1 };
1358
1358
  },
1359
1359
  surfaceCenterOfMass: faceCenterOfMass,
1360
+ vertexPosition(vertex) {
1361
+ // getVertexPosition 返回 Float64Array [x,y,z](brepkit_wasm.d.ts 实测)
1362
+ const p = toNumArray(kernel.getVertexPosition(asNum(vertex)));
1363
+ return { x: p[0] ?? 0, y: p[1] ?? 0, z: p[2] ?? 0 };
1364
+ },
1365
+ containsPoint(shape, point, tolerance) {
1366
+ // classifyPoint 返回 "inside" | "outside" | "boundary"(d.ts 实测);
1367
+ // 边界视为包含(与 occt containsPoint 的口径对齐:探针点在面上不翻转法线)。
1368
+ return kernel.classifyPoint(asNum(shape), point.x, point.y, point.z, tolerance) !== 'outside';
1369
+ },
1360
1370
  getFaceCylinderData(face) {
1361
1371
  try {
1362
1372
  const p = JSON.parse(kernel.getAnalyticSurfaceParams(asNum(face)));