@faicad/faijs-extra 0.16.0

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 (99) hide show
  1. package/LICENSE +29 -0
  2. package/NOTICE +29 -0
  3. package/dist/browser.d.ts +12 -0
  4. package/dist/browser.d.ts.map +1 -0
  5. package/dist/browser.js +12 -0
  6. package/dist/browser.js.map +1 -0
  7. package/dist/editor-ops.d.ts +50 -0
  8. package/dist/editor-ops.d.ts.map +1 -0
  9. package/dist/editor-ops.js +77 -0
  10. package/dist/editor-ops.js.map +1 -0
  11. package/dist/extras/svg-extrude.d.ts +43 -0
  12. package/dist/extras/svg-extrude.d.ts.map +1 -0
  13. package/dist/extras/svg-extrude.js +78 -0
  14. package/dist/extras/svg-extrude.js.map +1 -0
  15. package/dist/extras/text-cjk.d.ts +36 -0
  16. package/dist/extras/text-cjk.d.ts.map +1 -0
  17. package/dist/extras/text-cjk.js +146 -0
  18. package/dist/extras/text-cjk.js.map +1 -0
  19. package/dist/extras/text-geometry.d.ts +47 -0
  20. package/dist/extras/text-geometry.d.ts.map +1 -0
  21. package/dist/extras/text-geometry.js +127 -0
  22. package/dist/extras/text-geometry.js.map +1 -0
  23. package/dist/index.d.ts +47 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +47 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/mesh/drill-hole/DrillHoleCore.d.ts +90 -0
  28. package/dist/mesh/drill-hole/DrillHoleCore.d.ts.map +1 -0
  29. package/dist/mesh/drill-hole/DrillHoleCore.js +287 -0
  30. package/dist/mesh/drill-hole/DrillHoleCore.js.map +1 -0
  31. package/dist/mesh/drill-hole/drill-types.d.ts +34 -0
  32. package/dist/mesh/drill-hole/drill-types.d.ts.map +1 -0
  33. package/dist/mesh/drill-hole/drill-types.js +7 -0
  34. package/dist/mesh/drill-hole/drill-types.js.map +1 -0
  35. package/dist/mesh/engrave-decoration.d.ts +13 -0
  36. package/dist/mesh/engrave-decoration.d.ts.map +1 -0
  37. package/dist/mesh/engrave-decoration.js +39 -0
  38. package/dist/mesh/engrave-decoration.js.map +1 -0
  39. package/dist/mesh/fai_drill.d.ts +21 -0
  40. package/dist/mesh/fai_drill.d.ts.map +1 -0
  41. package/dist/mesh/fai_drill.js +92 -0
  42. package/dist/mesh/fai_drill.js.map +1 -0
  43. package/dist/mesh/fai_extrude.d.ts +24 -0
  44. package/dist/mesh/fai_extrude.d.ts.map +1 -0
  45. package/dist/mesh/fai_extrude.js +42 -0
  46. package/dist/mesh/fai_extrude.js.map +1 -0
  47. package/dist/mesh/fai_split.d.ts +164 -0
  48. package/dist/mesh/fai_split.d.ts.map +1 -0
  49. package/dist/mesh/fai_split.js +269 -0
  50. package/dist/mesh/fai_split.js.map +1 -0
  51. package/dist/mesh/index.d.ts +57 -0
  52. package/dist/mesh/index.d.ts.map +1 -0
  53. package/dist/mesh/index.js +34 -0
  54. package/dist/mesh/index.js.map +1 -0
  55. package/dist/mesh/primitives.d.ts +17 -0
  56. package/dist/mesh/primitives.d.ts.map +1 -0
  57. package/dist/mesh/primitives.js +53 -0
  58. package/dist/mesh/primitives.js.map +1 -0
  59. package/dist/namespace.d.ts +82 -0
  60. package/dist/namespace.d.ts.map +1 -0
  61. package/dist/namespace.js +109 -0
  62. package/dist/namespace.js.map +1 -0
  63. package/dist/op-names.d.ts +36 -0
  64. package/dist/op-names.d.ts.map +1 -0
  65. package/dist/op-names.js +45 -0
  66. package/dist/op-names.js.map +1 -0
  67. package/dist/ops/compound.d.ts +110 -0
  68. package/dist/ops/compound.d.ts.map +1 -0
  69. package/dist/ops/compound.js +164 -0
  70. package/dist/ops/compound.js.map +1 -0
  71. package/dist/ops/copy.d.ts +40 -0
  72. package/dist/ops/copy.d.ts.map +1 -0
  73. package/dist/ops/copy.js +83 -0
  74. package/dist/ops/copy.js.map +1 -0
  75. package/dist/ops/fai_drill.d.ts +46 -0
  76. package/dist/ops/fai_drill.d.ts.map +1 -0
  77. package/dist/ops/fai_drill.js +243 -0
  78. package/dist/ops/fai_drill.js.map +1 -0
  79. package/dist/ops/fai_extrude.d.ts +36 -0
  80. package/dist/ops/fai_extrude.d.ts.map +1 -0
  81. package/dist/ops/fai_extrude.js +79 -0
  82. package/dist/ops/fai_extrude.js.map +1 -0
  83. package/dist/ops/fai_split.d.ts +46 -0
  84. package/dist/ops/fai_split.d.ts.map +1 -0
  85. package/dist/ops/fai_split.js +255 -0
  86. package/dist/ops/fai_split.js.map +1 -0
  87. package/dist/ops/load.d.ts +41 -0
  88. package/dist/ops/load.d.ts.map +1 -0
  89. package/dist/ops/load.js +84 -0
  90. package/dist/ops/load.js.map +1 -0
  91. package/dist/ops/svg-extrude.d.ts +32 -0
  92. package/dist/ops/svg-extrude.d.ts.map +1 -0
  93. package/dist/ops/svg-extrude.js +74 -0
  94. package/dist/ops/svg-extrude.js.map +1 -0
  95. package/dist/ops/text.d.ts +34 -0
  96. package/dist/ops/text.d.ts.map +1 -0
  97. package/dist/ops/text.js +101 -0
  98. package/dist/ops/text.js.map +1 -0
  99. package/package.json +60 -0
@@ -0,0 +1,101 @@
1
+ /**
2
+ * stdlib text — 文字创建库函数(text)
3
+ *
4
+ *
5
+ * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。
6
+ */
7
+ import { text as meshText } from '../mesh/primitives.js';
8
+ import { solidToShape } from '@faicad/faijs/brep/brep-ops';
9
+ import { textToSolid } from '@faicad/faijs/brep/text/text-to-solid';
10
+ import { ensureDefaultFont } from '@faicad/faijs/brep/text/fontRegistry';
11
+ import { getSolidBoundingBox } from '@faicad/faijs/brep/brep-utils';
12
+ import { containsCjk, loadSystemCjkFont } from '@faicad/faijs/primitives/text/cjk-font';
13
+ import { getBackends } from '@faicad/faijs/runtime-state';
14
+ import { fromBrep } from '@faicad/faijs/shape';
15
+ import { defineOp } from '@faicad/faijs/sdk';
16
+ import { assertPositiveNumber } from '@faicad/faijs/api/assert';
17
+ /**
18
+ * Validate text parameters: `text` must be a non-empty string, and `size` and
19
+ * `depth` must be positive numbers.
20
+ * @param params - the raw text operation parameters.
21
+ */
22
+ export function assertTextParams(params) {
23
+ if (typeof params.text !== 'string' || params.text.trim() === '') {
24
+ throw new Error(`[stdlib/text] text must be a non-empty string, got ${JSON.stringify(params.text)}`);
25
+ }
26
+ assertPositiveNumber(params.size, 'text.size');
27
+ assertPositiveNumber(params.depth, 'text.depth');
28
+ }
29
+ /**
30
+ * BREP 路径:opentype.js → OCCT wire/face → extrude → center + fromBrep 登记。
31
+ *
32
+ * 与 mesh 路径一样,当文本包含 CJK 字符但没有 CJK 字体时,
33
+ * 将 CJK 字符替换为 '?' 以实现优雅降级。
34
+ */
35
+ async function textBrep(params) {
36
+ const kernel = getBackends().kernel.brep;
37
+ if (!kernel)
38
+ throw new Error('[stdlib/text] no OCCT kernel');
39
+ await ensureDefaultFont();
40
+ const text = params.text;
41
+ const size = params.size;
42
+ const depth = params.depth;
43
+ // 如果文本包含 CJK 字符,检查是否有 CJK 字体
44
+ let renderText = text;
45
+ if (containsCjk(text)) {
46
+ const cjkResult = await loadSystemCjkFont();
47
+ if (!cjkResult) {
48
+ // 无 CJK 字体:将 CJK 字符替换为 '?' 以实现优雅降级
49
+ renderText = text.replace(/[\u4E00-\u9FFF\u3400-\u4DBF\u2F800-\u2FA1F\u3000-\u303F\uFF00-\uFFEF]/g, '?');
50
+ }
51
+ }
52
+ // 将文字转换为 OCCT solid
53
+ const rawSolid = textToSolid(kernel, renderText, {
54
+ fontSize: size,
55
+ depth,
56
+ });
57
+ // Center the solid to match mesh path behavior:
58
+ // X/Z centered at origin, Y bottom aligned to 0
59
+ const bbox = getSolidBoundingBox(kernel, rawSolid);
60
+ const cx = (bbox.min[0] + bbox.max[0]) / 2;
61
+ const cz = (bbox.min[2] + bbox.max[2]) / 2;
62
+ const centeredSolid = kernel.translate(rawSolid, -cx, -bbox.min[1], -cz);
63
+ kernel.release(rawSolid);
64
+ return fromBrep(solidToShape(kernel, centeredSolid), { solid: centeredSolid });
65
+ }
66
+ /** 兼容两种调用形态:`cad.text({ text, size, depth })`(创建类)与
67
+ * `cad.text(part0, { text, size, depth })`(历史 fixture 带输入参数,输入被忽略)。 */
68
+ function textParamsOf(inputOrParams, maybeParams) {
69
+ return (maybeParams ?? inputOrParams ?? {});
70
+ }
71
+ /**
72
+ * 生成文字零件(文字轮廓挤出,X/Z 居中、Y 底部对齐原点)。
73
+ * @group 创建
74
+ * @inputs 0
75
+ * @async true
76
+ * @qual warn
77
+ * @name text
78
+ * @returns Shape 文字几何,生成独立零件。
79
+ * @param maybeParams - 兼容形态的补充参数(正常不传)。type:Record<string, unknown> required:false
80
+ * @param inputOrParams.text - 要生成的文字。type:string required:true
81
+ * @param inputOrParams.size - 字号(mm)。type:number required:true
82
+ * @param inputOrParams.depth - 挤出深度(mm)。type:number required:true
83
+ * @param inputOrParams.font - 字体。type:string 默认 默认字体
84
+ * @note font 语义未定(当前只有默认字体),⚠️ 暂不要传。兼容 `cad.text(part0, {...})` 带输入形态(输入被忽略),正常写 `cad.text({...})` 即可。
85
+ * @example
86
+ * const t = await cad.text({ text: 'Hello', size: 20, depth: 5 })
87
+ */
88
+ export const text = defineOp({
89
+ mesh: async (inputOrParams, maybeParams) => {
90
+ const params = textParamsOf(inputOrParams, maybeParams);
91
+ assertTextParams(params);
92
+ return meshText({ text: params.text, size: params.size, depth: params.depth });
93
+ },
94
+ brep: async (inputOrParams, maybeParams) => {
95
+ const params = textParamsOf(inputOrParams, maybeParams);
96
+ assertTextParams(params);
97
+ return textBrep(params);
98
+ },
99
+ naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } },
100
+ });
101
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/ops/text.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib text — 文字创建库函数(text)\n *\n *\n * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。\n */\n\nimport type { Shape } from '@faicad/faijs/mesh/types'\nimport { text as meshText } from '../mesh/primitives'\nimport { solidToShape } from '@faicad/faijs/brep/brep-ops'\nimport { textToSolid } from '@faicad/faijs/brep/text/text-to-solid'\nimport { ensureDefaultFont } from '@faicad/faijs/brep/text/fontRegistry'\nimport { getSolidBoundingBox } from '@faicad/faijs/brep/brep-utils'\nimport { containsCjk, loadSystemCjkFont } from '@faicad/faijs/primitives/text/cjk-font'\nimport { getBackends } from '@faicad/faijs/runtime-state'\nimport { fromBrep } from '@faicad/faijs/shape'\nimport { defineOp } from '@faicad/faijs/sdk'\nimport type { Provenance } from '@faicad/faijs/topology/naming/lineage'\nimport { assertPositiveNumber } from '@faicad/faijs/api/assert'\nimport type { BrepEngineApi } from '@faicad/faijs/brep/engine/primitives'\n\n/**\n * Validate text parameters: `text` must be a non-empty string, and `size` and\n * `depth` must be positive numbers.\n * @param params - the raw text operation parameters.\n */\nexport function assertTextParams(params: Record<string, unknown>): void {\n if (typeof params.text !== 'string' || params.text.trim() === '') {\n throw new Error(`[stdlib/text] text must be a non-empty string, got ${JSON.stringify(params.text)}`)\n }\n assertPositiveNumber(params.size, 'text.size')\n assertPositiveNumber(params.depth, 'text.depth')\n}\n\n/**\n * BREP 路径:opentype.js → OCCT wire/face → extrude → center + fromBrep 登记。\n *\n * 与 mesh 路径一样,当文本包含 CJK 字符但没有 CJK 字体时,\n * 将 CJK 字符替换为 '?' 以实现优雅降级。\n */\nasync function textBrep(params: Record<string, unknown>): Promise<Shape> {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/text] no OCCT kernel')\n\n await ensureDefaultFont()\n\n const text = params.text as string\n const size = params.size as number\n const depth = params.depth as number\n\n // 如果文本包含 CJK 字符,检查是否有 CJK 字体\n let renderText = text\n if (containsCjk(text)) {\n const cjkResult = await loadSystemCjkFont()\n if (!cjkResult) {\n // 无 CJK 字体:将 CJK 字符替换为 '?' 以实现优雅降级\n renderText = text.replace(/[\\u4E00-\\u9FFF\\u3400-\\u4DBF\\u2F800-\\u2FA1F\\u3000-\\u303F\\uFF00-\\uFFEF]/g, '?')\n }\n }\n\n // 将文字转换为 OCCT solid\n const rawSolid = textToSolid(kernel, renderText, {\n fontSize: size,\n depth,\n })\n\n // Center the solid to match mesh path behavior:\n // X/Z centered at origin, Y bottom aligned to 0\n const bbox = getSolidBoundingBox(kernel, rawSolid)\n const cx = (bbox.min[0] + bbox.max[0]) / 2\n const cz = (bbox.min[2] + bbox.max[2]) / 2\n const centeredSolid = kernel.translate(rawSolid, -cx, -bbox.min[1], -cz)\n kernel.release(rawSolid)\n\n return fromBrep(solidToShape(kernel, centeredSolid), { solid: centeredSolid })\n}\n\n/** 兼容两种调用形态:`cad.text({ text, size, depth })`(创建类)与\n * `cad.text(part0, { text, size, depth })`(历史 fixture 带输入参数,输入被忽略)。 */\nfunction textParamsOf(inputOrParams: unknown, maybeParams?: Record<string, unknown>): Record<string, unknown> {\n return (maybeParams ?? inputOrParams ?? {}) as Record<string, unknown>\n}\n\n/**\n * 生成文字零件(文字轮廓挤出,X/Z 居中、Y 底部对齐原点)。\n * @group 创建\n * @inputs 0\n * @async true\n * @qual warn\n * @name text\n * @returns Shape 文字几何,生成独立零件。\n * @param maybeParams - 兼容形态的补充参数(正常不传)。type:Record<string, unknown> required:false\n * @param inputOrParams.text - 要生成的文字。type:string required:true\n * @param inputOrParams.size - 字号(mm)。type:number required:true\n * @param inputOrParams.depth - 挤出深度(mm)。type:number required:true\n * @param inputOrParams.font - 字体。type:string 默认 默认字体\n * @note font 语义未定(当前只有默认字体),⚠️ 暂不要传。兼容 `cad.text(part0, {...})` 带输入形态(输入被忽略),正常写 `cad.text({...})` 即可。\n * @example\n * const t = await cad.text({ text: 'Hello', size: 20, depth: 5 })\n */\nexport const text = defineOp({\n mesh: async (inputOrParams: unknown, maybeParams?: Record<string, unknown>) => {\n const params = textParamsOf(inputOrParams, maybeParams)\n assertTextParams(params)\n return meshText({ text: params.text as string, size: params.size as number, depth: params.depth as number })\n },\n brep: async (inputOrParams: unknown, maybeParams?: Record<string, unknown>) => {\n const params = textParamsOf(inputOrParams, maybeParams)\n assertTextParams(params)\n return textBrep(params)\n },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } } as Provenance,\n})\n"]}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@faicad/faijs-extra",
3
+ "version": "0.16.0",
4
+ "description": "Editor extension library for faijs — fai_* ops, group/assembly/copy/load, and the svg / 3D-text creators",
5
+ "keywords": [
6
+ "faijs",
7
+ "cad",
8
+ "editor",
9
+ "svg",
10
+ "text",
11
+ "three"
12
+ ],
13
+ "license": "MIT",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://gitcode.com/Faicad/faijs.git"
17
+ },
18
+ "type": "module",
19
+ "sideEffects": false,
20
+ "main": "./dist/index.js",
21
+ "types": "./dist/index.d.ts",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "default": "./dist/index.js"
26
+ },
27
+ "./browser": {
28
+ "types": "./dist/browser.d.ts",
29
+ "default": "./dist/browser.js"
30
+ },
31
+ "./editor-ops": {
32
+ "types": "./dist/editor-ops.d.ts",
33
+ "default": "./dist/editor-ops.js"
34
+ }
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "NOTICE",
39
+ "LICENSE"
40
+ ],
41
+ "dependencies": {
42
+ "opentype.js": "^1.3.4"
43
+ },
44
+ "peerDependencies": {
45
+ "@faicad/faijs": "^0.16.0",
46
+ "three": "^0.162.0 || ^0.184.0"
47
+ },
48
+ "devDependencies": {
49
+ "typescript": "*",
50
+ "vitest": "*",
51
+ "three": "^0.184.0",
52
+ "@types/three": "^0.184.1"
53
+ },
54
+ "scripts": {
55
+ "build": "tsc -p tsconfig.build.json && node ../../scripts/fix-import-extensions.mjs dist",
56
+ "typecheck": "tsc --noEmit",
57
+ "test": "vitest run",
58
+ "lint": "eslint src"
59
+ }
60
+ }