@faicad/faijs-fcstd 0.17.0 → 0.18.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.
- package/dist/codegen.d.ts +1 -1
- package/dist/codegen.d.ts.map +1 -1
- package/dist/codegen.js +4 -4
- package/dist/codegen.js.map +1 -1
- package/dist/convert.d.ts +3 -3
- package/dist/convert.d.ts.map +1 -1
- package/dist/convert.js +6 -6
- package/dist/convert.js.map +1 -1
- package/dist/feature-translate.d.ts +1 -1
- package/dist/feature-translate.d.ts.map +1 -1
- package/dist/feature-translate.js +13 -2
- package/dist/feature-translate.js.map +1 -1
- package/dist/sketch-parse.d.ts +12 -163
- package/dist/sketch-parse.d.ts.map +1 -1
- package/dist/sketch-parse.js +2 -49
- package/dist/sketch-parse.js.map +1 -1
- package/package.json +3 -3
package/dist/sketch-parse.d.ts
CHANGED
|
@@ -1,176 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* M3.1 — FCStd sketch parsing: <GeometryList> → SketchGeom[],
|
|
2
|
+
* M3.1 — FCStd sketch XML parsing: <GeometryList> → SketchGeom[],
|
|
3
3
|
* <ConstraintList> → SketchCon[].
|
|
4
4
|
*
|
|
5
|
+
* The sketch model types and the solve pipeline now live in
|
|
6
|
+
* `@faicad/faijs-sketch`; this module keeps the FCStd-specific XML parsing and
|
|
7
|
+
* re-exports the types under their historical names so existing consumers of
|
|
8
|
+
* the read layer keep compiling.
|
|
9
|
+
*
|
|
5
10
|
* Field format per plan §5.2/§5.3:
|
|
6
11
|
* - geometry coordinates are 3D (X/Y/Z); sketch-local Z is usually 0
|
|
7
12
|
* - <Constrain> (singular) carries Type as the ConstraintType enum integer
|
|
8
|
-
* (Constraint.h:52-77)
|
|
9
13
|
* - ElementIds/ElementPositions (new) take precedence over First/Second/Third
|
|
10
14
|
* (old); 47.5% of sample constraints lack the new format (§5.3.1)
|
|
11
|
-
* - IsDriving defaults to true when missing
|
|
12
|
-
* - geoId: >= 0 own geometry; -1 HAxis/RtPnt; -2 VAxis; <= -3 external
|
|
15
|
+
* - IsDriving defaults to true when missing
|
|
16
|
+
* - geoId: >= 0 own geometry; -1 HAxis/RtPnt; -2 VAxis; <= -3 external
|
|
13
17
|
*/
|
|
14
18
|
import type { FcstdProperty } from './document.js';
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
readonly Vertical: 3;
|
|
20
|
-
readonly Parallel: 4;
|
|
21
|
-
readonly Tangent: 5;
|
|
22
|
-
readonly Distance: 6;
|
|
23
|
-
readonly DistanceX: 7;
|
|
24
|
-
readonly DistanceY: 8;
|
|
25
|
-
readonly Angle: 9;
|
|
26
|
-
readonly Perpendicular: 10;
|
|
27
|
-
readonly Radius: 11;
|
|
28
|
-
readonly Equal: 12;
|
|
29
|
-
readonly PointOnObject: 13;
|
|
30
|
-
readonly Symmetric: 14;
|
|
31
|
-
readonly InternalAlignment: 15;
|
|
32
|
-
readonly SnellsLaw: 16;
|
|
33
|
-
readonly Block: 17;
|
|
34
|
-
readonly Diameter: 18;
|
|
35
|
-
readonly Weight: 19;
|
|
36
|
-
readonly Group: 20;
|
|
37
|
-
readonly Text: 21;
|
|
38
|
-
};
|
|
39
|
-
/**
|
|
40
|
-
* Human-readable names for the ConstraintType enum integers (debugging/
|
|
41
|
-
* diagnostics only).
|
|
42
|
-
*/
|
|
43
|
-
export declare const CONSTRAINT_NAMES: Record<number, string>;
|
|
44
|
-
/** GeoEnum (src/Mod/Sketcher/App/GeoEnum.h:71-78) */
|
|
45
|
-
export declare const GeoId: {
|
|
46
|
-
readonly RtPnt: -1;
|
|
47
|
-
readonly HAxis: -1;
|
|
48
|
-
readonly VAxis: -2;
|
|
49
|
-
readonly RefExt: -3;
|
|
50
|
-
};
|
|
51
|
-
/** PointPos (GeoEnum.h:88-94) */
|
|
52
|
-
export declare const PointPos: {
|
|
53
|
-
readonly none: 0;
|
|
54
|
-
readonly start: 1;
|
|
55
|
-
readonly end: 2;
|
|
56
|
-
readonly mid: 3;
|
|
57
|
-
};
|
|
58
|
-
/**
|
|
59
|
-
* One parsed sketch geometry element (point, line, circle, arc or ellipse),
|
|
60
|
-
* in 3D sketch-local coordinates.
|
|
61
|
-
*/
|
|
62
|
-
export type SketchGeom = {
|
|
63
|
-
kind: 'point';
|
|
64
|
-
index: number;
|
|
65
|
-
x: number;
|
|
66
|
-
y: number;
|
|
67
|
-
z: number;
|
|
68
|
-
} | {
|
|
69
|
-
kind: 'line';
|
|
70
|
-
index: number;
|
|
71
|
-
x1: number;
|
|
72
|
-
y1: number;
|
|
73
|
-
z1: number;
|
|
74
|
-
x2: number;
|
|
75
|
-
y2: number;
|
|
76
|
-
z2: number;
|
|
77
|
-
} | {
|
|
78
|
-
kind: 'circle';
|
|
79
|
-
index: number;
|
|
80
|
-
cx: number;
|
|
81
|
-
cy: number;
|
|
82
|
-
cz: number;
|
|
83
|
-
radius: number;
|
|
84
|
-
} | {
|
|
85
|
-
kind: 'arc';
|
|
86
|
-
index: number;
|
|
87
|
-
cx: number;
|
|
88
|
-
cy: number;
|
|
89
|
-
cz: number;
|
|
90
|
-
radius: number;
|
|
91
|
-
startAngle: number;
|
|
92
|
-
endAngle: number;
|
|
93
|
-
/** arc endpoints derived from angles (kept for solver wiring) */
|
|
94
|
-
x1: number;
|
|
95
|
-
y1: number;
|
|
96
|
-
z1: number;
|
|
97
|
-
x2: number;
|
|
98
|
-
y2: number;
|
|
99
|
-
z2: number;
|
|
100
|
-
} | {
|
|
101
|
-
kind: 'ellipse';
|
|
102
|
-
index: number;
|
|
103
|
-
cx: number;
|
|
104
|
-
cy: number;
|
|
105
|
-
cz: number;
|
|
106
|
-
majorRadius: number;
|
|
107
|
-
minorRadius: number;
|
|
108
|
-
/** rotation of major axis, radians */
|
|
109
|
-
angleXU: number;
|
|
110
|
-
/** first focus (computed) */
|
|
111
|
-
fx1: number;
|
|
112
|
-
fy1: number;
|
|
113
|
-
fx2: number;
|
|
114
|
-
fy2: number;
|
|
115
|
-
} | {
|
|
116
|
-
/** P4: Part::GeomBSplineCurve (Poles/Knots/Degree/IsPeriodic) */
|
|
117
|
-
kind: 'bspline';
|
|
118
|
-
index: number;
|
|
119
|
-
poles: {
|
|
120
|
-
x: number;
|
|
121
|
-
y: number;
|
|
122
|
-
}[];
|
|
123
|
-
knots: number[];
|
|
124
|
-
degree: number;
|
|
125
|
-
periodic: boolean;
|
|
126
|
-
/** curve start/end (exact for clamped splines; solver wiring + chaining) */
|
|
127
|
-
x1: number;
|
|
128
|
-
y1: number;
|
|
129
|
-
z1: number;
|
|
130
|
-
x2: number;
|
|
131
|
-
y2: number;
|
|
132
|
-
z2: number;
|
|
133
|
-
};
|
|
134
|
-
/**
|
|
135
|
-
* One (geometry, point) reference inside a constraint: a geoId plus a
|
|
136
|
-
* PointPos selector.
|
|
137
|
-
*/
|
|
138
|
-
export interface GeoRef {
|
|
139
|
-
/** geometry id: >= 0 own geometry; -1 HAxis/RtPnt; -2 VAxis; <= -3 external */
|
|
140
|
-
geoId: number;
|
|
141
|
-
/** PointPos selector (0 = edge itself, 1/2 = start/end, 3 = center) */
|
|
142
|
-
pos: number;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* One parsed sketch constraint (`<Constrain>` element).
|
|
146
|
-
*/
|
|
147
|
-
export interface SketchCon {
|
|
148
|
-
/** index in the ConstraintList */
|
|
149
|
-
index: number;
|
|
150
|
-
/** ConstraintType integer */
|
|
151
|
-
type: number;
|
|
152
|
-
/** resolved element refs (ElementIds or First/Second/Third fallback) */
|
|
153
|
-
refs: GeoRef[];
|
|
154
|
-
/** driving dimension value (Distance/Angle/Radius/...) */
|
|
155
|
-
value: number;
|
|
156
|
-
/** IsDriving; missing means true (§5.3.1) */
|
|
157
|
-
isDriving: boolean;
|
|
158
|
-
/** raw name attribute */
|
|
159
|
-
name: string;
|
|
160
|
-
/** InternalAlignmentType when type === 15 */
|
|
161
|
-
internalAlignmentType?: number;
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* The fully parsed sketch: geometry, constraints, constrainedness and the set
|
|
165
|
-
* of referenced external geoIds.
|
|
166
|
-
*/
|
|
167
|
-
export interface ParsedSketch {
|
|
168
|
-
geoms: SketchGeom[];
|
|
169
|
-
constraints: SketchCon[];
|
|
170
|
-
fullyConstrained: boolean;
|
|
171
|
-
/** geoIds <= -3 referenced by constraints (D4 external geometry) */
|
|
172
|
-
externalGeoIds: number[];
|
|
173
|
-
}
|
|
19
|
+
import { ConstraintType, CONSTRAINT_NAMES, GeoId, PointPos } from '@faicad/faijs-sketch';
|
|
20
|
+
import type { FcstdSketchGeom as SketchGeom, FcstdSketchCon as SketchCon, FcstdParsedSketch as ParsedSketch } from '@faicad/faijs-sketch';
|
|
21
|
+
export { ConstraintType, CONSTRAINT_NAMES, GeoId, PointPos };
|
|
22
|
+
export type { FcstdSketchGeom as SketchGeom, FcstdGeoRef as GeoRef, FcstdSketchCon as SketchCon, FcstdParsedSketch as ParsedSketch, } from '@faicad/faijs-sketch';
|
|
174
23
|
/**
|
|
175
24
|
* Parse a sketch's `<GeometryList>` property into typed geometry elements.
|
|
176
25
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sketch-parse.d.ts","sourceRoot":"","sources":["../src/sketch-parse.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sketch-parse.d.ts","sourceRoot":"","sources":["../src/sketch-parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,KAAK,EACL,QAAQ,EACT,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACV,eAAe,IAAI,UAAU,EAE7B,cAAc,IAAI,SAAS,EAC3B,iBAAiB,IAAI,YAAY,EAClC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7D,YAAY,EACV,eAAe,IAAI,UAAU,EAC7B,WAAW,IAAI,MAAM,EACrB,cAAc,IAAI,SAAS,EAC3B,iBAAiB,IAAI,YAAY,GAClC,MAAM,sBAAsB,CAAC;AAO9B;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,UAAU,EAAE,CAmHnE;AAMD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,EAAE,CA4CpE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,aAAa,GAAG,SAAS,EACvC,eAAe,EAAE,aAAa,GAAG,SAAS,EAC1C,gBAAgB,EAAE,OAAO,GACxB,YAAY,CAkBd"}
|
package/dist/sketch-parse.js
CHANGED
|
@@ -1,52 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
Coincident: 1,
|
|
4
|
-
Horizontal: 2,
|
|
5
|
-
Vertical: 3,
|
|
6
|
-
Parallel: 4,
|
|
7
|
-
Tangent: 5,
|
|
8
|
-
Distance: 6,
|
|
9
|
-
DistanceX: 7,
|
|
10
|
-
DistanceY: 8,
|
|
11
|
-
Angle: 9,
|
|
12
|
-
Perpendicular: 10,
|
|
13
|
-
Radius: 11,
|
|
14
|
-
Equal: 12,
|
|
15
|
-
PointOnObject: 13,
|
|
16
|
-
Symmetric: 14,
|
|
17
|
-
InternalAlignment: 15,
|
|
18
|
-
SnellsLaw: 16,
|
|
19
|
-
Block: 17,
|
|
20
|
-
Diameter: 18,
|
|
21
|
-
Weight: 19,
|
|
22
|
-
Group: 20,
|
|
23
|
-
Text: 21,
|
|
24
|
-
};
|
|
25
|
-
/**
|
|
26
|
-
* Human-readable names for the ConstraintType enum integers (debugging/
|
|
27
|
-
* diagnostics only).
|
|
28
|
-
*/
|
|
29
|
-
export const CONSTRAINT_NAMES = {
|
|
30
|
-
1: 'Coincident', 2: 'Horizontal', 3: 'Vertical', 4: 'Parallel', 5: 'Tangent',
|
|
31
|
-
6: 'Distance', 7: 'DistanceX', 8: 'DistanceY', 9: 'Angle', 10: 'Perpendicular',
|
|
32
|
-
11: 'Radius', 12: 'Equal', 13: 'PointOnObject', 14: 'Symmetric',
|
|
33
|
-
15: 'InternalAlignment', 16: 'SnellsLaw', 17: 'Block', 18: 'Diameter',
|
|
34
|
-
19: 'Weight', 20: 'Group', 21: 'Text',
|
|
35
|
-
};
|
|
36
|
-
/** GeoEnum (src/Mod/Sketcher/App/GeoEnum.h:71-78) */
|
|
37
|
-
export const GeoId = {
|
|
38
|
-
RtPnt: -1,
|
|
39
|
-
HAxis: -1,
|
|
40
|
-
VAxis: -2,
|
|
41
|
-
RefExt: -3,
|
|
42
|
-
};
|
|
43
|
-
/** PointPos (GeoEnum.h:88-94) */
|
|
44
|
-
export const PointPos = {
|
|
45
|
-
none: 0, // edge itself
|
|
46
|
-
start: 1,
|
|
47
|
-
end: 2,
|
|
48
|
-
mid: 3, // center of circle/ellipse
|
|
49
|
-
};
|
|
1
|
+
import { ConstraintType, CONSTRAINT_NAMES, GeoId, PointPos, } from '@faicad/faijs-sketch';
|
|
2
|
+
export { ConstraintType, CONSTRAINT_NAMES, GeoId, PointPos };
|
|
50
3
|
function num(attrs, key) {
|
|
51
4
|
const v = attrs[key];
|
|
52
5
|
return v === undefined ? 0 : Number(v);
|
package/dist/sketch-parse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sketch-parse.js","sourceRoot":"","sources":["../src/sketch-parse.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M3.1 — FCStd sketch parsing: <GeometryList> → SketchGeom[],\n * <ConstraintList> → SketchCon[].\n *\n * Field format per plan §5.2/§5.3:\n * - geometry coordinates are 3D (X/Y/Z); sketch-local Z is usually 0\n * - <Constrain> (singular) carries Type as the ConstraintType enum integer\n * (Constraint.h:52-77)\n * - ElementIds/ElementPositions (new) take precedence over First/Second/Third\n * (old); 47.5% of sample constraints lack the new format (§5.3.1)\n * - IsDriving defaults to true when missing (Constraint.h:240)\n * - geoId: >= 0 own geometry; -1 HAxis/RtPnt; -2 VAxis; <= -3 external (D4)\n */\nimport type { FcstdProperty } from './document.js';\n\n/** ConstraintType enum values (src/Mod/Sketcher/App/Constraint.h:52-77) */\nexport const ConstraintType = {\n Coincident: 1,\n Horizontal: 2,\n Vertical: 3,\n Parallel: 4,\n Tangent: 5,\n Distance: 6,\n DistanceX: 7,\n DistanceY: 8,\n Angle: 9,\n Perpendicular: 10,\n Radius: 11,\n Equal: 12,\n PointOnObject: 13,\n Symmetric: 14,\n InternalAlignment: 15,\n SnellsLaw: 16,\n Block: 17,\n Diameter: 18,\n Weight: 19,\n Group: 20,\n Text: 21,\n} as const;\n\n/**\n * Human-readable names for the ConstraintType enum integers (debugging/\n * diagnostics only).\n */\nexport const CONSTRAINT_NAMES: Record<number, string> = {\n 1: 'Coincident', 2: 'Horizontal', 3: 'Vertical', 4: 'Parallel', 5: 'Tangent',\n 6: 'Distance', 7: 'DistanceX', 8: 'DistanceY', 9: 'Angle', 10: 'Perpendicular',\n 11: 'Radius', 12: 'Equal', 13: 'PointOnObject', 14: 'Symmetric',\n 15: 'InternalAlignment', 16: 'SnellsLaw', 17: 'Block', 18: 'Diameter',\n 19: 'Weight', 20: 'Group', 21: 'Text',\n};\n\n/** GeoEnum (src/Mod/Sketcher/App/GeoEnum.h:71-78) */\nexport const GeoId = {\n RtPnt: -1,\n HAxis: -1,\n VAxis: -2,\n RefExt: -3,\n} as const;\n\n/** PointPos (GeoEnum.h:88-94) */\nexport const PointPos = {\n none: 0, // edge itself\n start: 1,\n end: 2,\n mid: 3, // center of circle/ellipse\n} as const;\n\n/**\n * One parsed sketch geometry element (point, line, circle, arc or ellipse),\n * in 3D sketch-local coordinates.\n */\nexport type SketchGeom =\n | { kind: 'point'; index: number; x: number; y: number; z: number }\n | { kind: 'line'; index: number; x1: number; y1: number; z1: number; x2: number; y2: number; z2: number }\n | { kind: 'circle'; index: number; cx: number; cy: number; cz: number; radius: number }\n | {\n kind: 'arc';\n index: number;\n cx: number;\n cy: number;\n cz: number;\n radius: number;\n startAngle: number; // radians\n endAngle: number;\n /** arc endpoints derived from angles (kept for solver wiring) */\n x1: number;\n y1: number;\n z1: number;\n x2: number;\n y2: number;\n z2: number;\n }\n | {\n kind: 'ellipse';\n index: number;\n cx: number;\n cy: number;\n cz: number;\n majorRadius: number;\n minorRadius: number;\n /** rotation of major axis, radians */\n angleXU: number;\n /** first focus (computed) */\n fx1: number;\n fy1: number;\n fx2: number;\n fy2: number;\n }\n | {\n /** P4: Part::GeomBSplineCurve (Poles/Knots/Degree/IsPeriodic) */\n kind: 'bspline';\n index: number;\n poles: { x: number; y: number }[];\n knots: number[];\n degree: number;\n periodic: boolean;\n /** curve start/end (exact for clamped splines; solver wiring + chaining) */\n x1: number;\n y1: number;\n z1: number;\n x2: number;\n y2: number;\n z2: number;\n };\n\n/**\n * One (geometry, point) reference inside a constraint: a geoId plus a\n * PointPos selector.\n */\nexport interface GeoRef {\n /** geometry id: >= 0 own geometry; -1 HAxis/RtPnt; -2 VAxis; <= -3 external */\n geoId: number;\n /** PointPos selector (0 = edge itself, 1/2 = start/end, 3 = center) */\n pos: number; // PointPos\n}\n\n/**\n * One parsed sketch constraint (`<Constrain>` element).\n */\nexport interface SketchCon {\n /** index in the ConstraintList */\n index: number;\n /** ConstraintType integer */\n type: number;\n /** resolved element refs (ElementIds or First/Second/Third fallback) */\n refs: GeoRef[];\n /** driving dimension value (Distance/Angle/Radius/...) */\n value: number;\n /** IsDriving; missing means true (§5.3.1) */\n isDriving: boolean;\n /** raw name attribute */\n name: string;\n /** InternalAlignmentType when type === 15 */\n internalAlignmentType?: number;\n}\n\n/**\n * The fully parsed sketch: geometry, constraints, constrainedness and the set\n * of referenced external geoIds.\n */\nexport interface ParsedSketch {\n geoms: SketchGeom[];\n constraints: SketchCon[];\n fullyConstrained: boolean;\n /** geoIds <= -3 referenced by constraints (D4 external geometry) */\n externalGeoIds: number[];\n}\n\nfunction num(attrs: Record<string, string>, key: string): number {\n const v = attrs[key];\n return v === undefined ? 0 : Number(v);\n}\n\n/**\n * Parse a sketch's `<GeometryList>` property into typed geometry elements.\n *\n * @param prop - the sketch's Geometry property.\n * @returns the parsed geometry list; unsupported element kinds degrade to a\n * NaN point so the caller can downgrade the sketch.\n */\nexport function parseGeometryList(prop: FcstdProperty): SketchGeom[] {\n // <GeometryList count=\"N\"><Geometry type=\"...\">...</Geometry>...</GeometryList>\n const listEl = prop.children[0];\n if (!listEl) return [];\n const geoms: SketchGeom[] = [];\n let index = 0;\n for (const child of listEl.children) {\n const gtype = child.attributes['type'] ?? '';\n // <Geometry> may carry <Construction/>, <GeoExtensions/> or <UID/>\n // siblings before the actual geometry element — pick the first real\n // geometry child.\n const inner = child.children.find(\n (c) => c.tagName !== 'Construction' && c.tagName !== 'GeoExtensions' && c.tagName !== 'UID',\n );\n if (!inner) continue;\n const a = inner.attributes;\n const tag = inner.tagName;\n switch (true) {\n case tag === 'LineSegment' || gtype.includes('GeomLineSegment'): {\n geoms.push({\n kind: 'line',\n index,\n x1: num(a, 'StartX'), y1: num(a, 'StartY'), z1: num(a, 'StartZ'),\n x2: num(a, 'EndX'), y2: num(a, 'EndY'), z2: num(a, 'EndZ'),\n });\n break;\n }\n case tag === 'Circle' || gtype.includes('GeomCircle'): {\n geoms.push({\n kind: 'circle',\n index,\n cx: num(a, 'CenterX'), cy: num(a, 'CenterY'), cz: num(a, 'CenterZ'),\n radius: num(a, 'Radius'),\n });\n break;\n }\n case tag === 'ArcOfCircle' || gtype.includes('GeomArcOfCircle'): {\n const cx = num(a, 'CenterX');\n const cy = num(a, 'CenterY');\n const cz = num(a, 'CenterZ');\n const r = num(a, 'Radius');\n const sa = num(a, 'StartAngle');\n const ea = num(a, 'EndAngle');\n geoms.push({\n kind: 'arc',\n index, cx, cy, cz, radius: r, startAngle: sa, endAngle: ea,\n x1: cx + r * Math.cos(sa), y1: cy + r * Math.sin(sa), z1: cz,\n x2: cx + r * Math.cos(ea), y2: cy + r * Math.sin(ea), z2: cz,\n });\n break;\n }\n case tag === 'GeomPoint' || tag === 'Point' || gtype.includes('GeomPoint'): {\n geoms.push({ kind: 'point', index, x: num(a, 'X'), y: num(a, 'Y'), z: num(a, 'Z') });\n break;\n }\n case tag === 'Ellipse' || gtype.includes('GeomEllipse'): {\n const cx = num(a, 'CenterX');\n const cy = num(a, 'CenterY');\n const major = num(a, 'MajorRadius');\n const minor = num(a, 'MinorRadius');\n const ang = num(a, 'AngleXU');\n const f = Math.sqrt(Math.max(0, major * major - minor * minor));\n const ca = Math.cos(ang);\n const sa2 = Math.sin(ang);\n geoms.push({\n kind: 'ellipse', index, cx, cy, cz: num(a, 'CenterZ'),\n majorRadius: major, minorRadius: minor, angleXU: ang,\n fx1: cx + f * ca, fy1: cy + f * sa2,\n fx2: cx - f * ca, fy2: cy - f * sa2,\n });\n break;\n }\n case tag === 'BSplineCurve' || gtype.includes('GeomBSplineCurve'): {\n // P4: poles are child <Pole X= Y= Z=/> elements, knots child\n // <Knot Value= Multiplicity=/> (attributes only carry counts).\n const poles = inner.children\n .filter((c) => c.tagName === 'Pole')\n .map((c) => ({ x: num(c.attributes, 'X'), y: num(c.attributes, 'Y') }));\n const knots: number[] = [];\n for (const c of inner.children) {\n if (c.tagName !== 'Knot') continue;\n const m = num(c.attributes, 'Multiplicity');\n const v = num(c.attributes, 'Value');\n const mult = Number.isFinite(m) && m >= 1 ? m : 1;\n for (let k = 0; k < mult; k++) knots.push(v);\n }\n const degree = num(a, 'Degree');\n const periodic = num(a, 'IsPeriodic') !== 0;\n const first = poles[0];\n const last = poles[poles.length - 1];\n geoms.push({\n kind: 'bspline',\n index,\n poles,\n knots,\n degree,\n periodic,\n x1: first ? first.x : NaN,\n y1: first ? first.y : NaN,\n z1: 0,\n x2: last ? last.x : NaN,\n y2: last ? last.y : NaN,\n z2: 0,\n });\n break;\n }\n default:\n // ArcOfEllipse / hyperbola / parabola: not supported in M3\n // (sample set: 0 occurrences, plan §5.5.3); caller downgrades to L2.\n geoms.push({ kind: 'point', index, x: NaN, y: NaN, z: NaN });\n break;\n }\n index++;\n }\n return geoms;\n}\n\nfunction parseGeoRef(attrs: Record<string, string>, prefix: string): GeoRef {\n return { geoId: Math.trunc(num(attrs, prefix)), pos: Math.trunc(num(attrs, `${prefix}Pos`)) };\n}\n\n/**\n * Parse a sketch's `<ConstraintList>` property into constraint records.\n *\n * @param prop - the sketch's Constraints property.\n * @returns the parsed constraints, with element refs resolved from\n * ElementIds/ElementPositions or the old First/Second/Third fallback.\n */\nexport function parseConstraintList(prop: FcstdProperty): SketchCon[] {\n // <ConstraintList count=\"N\"><Constrain .../>...</ConstraintList>\n const listEl = prop.children[0];\n if (!listEl) return [];\n const cons: SketchCon[] = [];\n let index = 0;\n for (const child of listEl.children) {\n if (child.tagName !== 'Constrain') continue;\n const a = child.attributes;\n const type = Math.trunc(num(a, 'Type'));\n\n // ElementIds (new, space-separated) takes precedence; fallback First/Second/Third\n const refs: GeoRef[] = [];\n const eids = a['ElementIds']?.trim();\n const eposs = a['ElementPositions']?.trim();\n if (eids && eposs) {\n const ids = eids.split(/\\s+/).map(Number);\n const poss = eposs.split(/\\s+/).map(Number);\n for (let i = 0; i < ids.length; i++) {\n refs.push({ geoId: ids[i]!, pos: poss[i] ?? 0 });\n }\n } else {\n // old-style triple; Third=GeoUndef(-2000) means unused\n for (const prefix of ['First', 'Second', 'Third']) {\n const geoId = Math.trunc(num(a, prefix));\n if (geoId === -2000) continue;\n refs.push(parseGeoRef(a, prefix));\n }\n }\n\n const isDriving = a['IsDriving'] === undefined ? true : a['IsDriving'] === '1';\n\n cons.push({\n index,\n type,\n refs,\n value: num(a, 'Value'),\n isDriving,\n name: a['Name'] ?? '',\n internalAlignmentType: type === 15 ? Math.trunc(num(a, 'InternalAlignmentType')) : undefined,\n });\n index++;\n }\n return cons;\n}\n\n/**\n * Parse a sketch object's geometry and constraint properties (M3.1 entry).\n *\n * @param geometryProp - the sketch's Geometry property (may be undefined).\n * @param constraintsProp - the sketch's Constraints property (may be undefined).\n * @param fullyConstrained - the sketch's FullyConstrained flag.\n * @returns the parsed sketch, including external geoIds referenced by constraints.\n */\nexport function parseSketchObject(\n geometryProp: FcstdProperty | undefined,\n constraintsProp: FcstdProperty | undefined,\n fullyConstrained: boolean,\n): ParsedSketch {\n const geoms = geometryProp ? parseGeometryList(geometryProp) : [];\n const constraints = constraintsProp ? parseConstraintList(constraintsProp) : [];\n const externalGeoIds = new Set<number>();\n for (const c of constraints) {\n for (const r of c.refs) {\n // GeoUndef (-2000) is an unused-slot placeholder in old-format triples\n // and ElementIds — it is NOT external geometry. External refs are the\n // small negative range starting at RefExt (-3).\n if (r.geoId <= GeoId.RefExt && r.geoId > -2000) externalGeoIds.add(r.geoId);\n }\n }\n return {\n geoms,\n constraints,\n fullyConstrained,\n externalGeoIds: [...externalGeoIds],\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sketch-parse.js","sourceRoot":"","sources":["../src/sketch-parse.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M3.1 — FCStd sketch XML parsing: <GeometryList> → SketchGeom[],\n * <ConstraintList> → SketchCon[].\n *\n * The sketch model types and the solve pipeline now live in\n * `@faicad/faijs-sketch`; this module keeps the FCStd-specific XML parsing and\n * re-exports the types under their historical names so existing consumers of\n * the read layer keep compiling.\n *\n * Field format per plan §5.2/§5.3:\n * - geometry coordinates are 3D (X/Y/Z); sketch-local Z is usually 0\n * - <Constrain> (singular) carries Type as the ConstraintType enum integer\n * - ElementIds/ElementPositions (new) take precedence over First/Second/Third\n * (old); 47.5% of sample constraints lack the new format (§5.3.1)\n * - IsDriving defaults to true when missing\n * - geoId: >= 0 own geometry; -1 HAxis/RtPnt; -2 VAxis; <= -3 external\n */\nimport type { FcstdProperty } from './document.js';\nimport {\n ConstraintType,\n CONSTRAINT_NAMES,\n GeoId,\n PointPos,\n} from '@faicad/faijs-sketch';\nimport type {\n FcstdSketchGeom as SketchGeom,\n FcstdGeoRef as GeoRef,\n FcstdSketchCon as SketchCon,\n FcstdParsedSketch as ParsedSketch,\n} from '@faicad/faijs-sketch';\n\nexport { ConstraintType, CONSTRAINT_NAMES, GeoId, PointPos };\nexport type {\n FcstdSketchGeom as SketchGeom,\n FcstdGeoRef as GeoRef,\n FcstdSketchCon as SketchCon,\n FcstdParsedSketch as ParsedSketch,\n} from '@faicad/faijs-sketch';\n\nfunction num(attrs: Record<string, string>, key: string): number {\n const v = attrs[key];\n return v === undefined ? 0 : Number(v);\n}\n\n/**\n * Parse a sketch's `<GeometryList>` property into typed geometry elements.\n *\n * @param prop - the sketch's Geometry property.\n * @returns the parsed geometry list; unsupported element kinds degrade to a\n * NaN point so the caller can downgrade the sketch.\n */\nexport function parseGeometryList(prop: FcstdProperty): SketchGeom[] {\n // <GeometryList count=\"N\"><Geometry type=\"...\">...</Geometry>...</GeometryList>\n const listEl = prop.children[0];\n if (!listEl) return [];\n const geoms: SketchGeom[] = [];\n let index = 0;\n for (const child of listEl.children) {\n const gtype = child.attributes['type'] ?? '';\n // <Geometry> may carry <Construction/>, <GeoExtensions/> or <UID/>\n // siblings before the actual geometry element — pick the first real\n // geometry child.\n const inner = child.children.find(\n (c) => c.tagName !== 'Construction' && c.tagName !== 'GeoExtensions' && c.tagName !== 'UID',\n );\n if (!inner) continue;\n const a = inner.attributes;\n const tag = inner.tagName;\n switch (true) {\n case tag === 'LineSegment' || gtype.includes('GeomLineSegment'): {\n geoms.push({\n kind: 'line',\n index,\n x1: num(a, 'StartX'), y1: num(a, 'StartY'), z1: num(a, 'StartZ'),\n x2: num(a, 'EndX'), y2: num(a, 'EndY'), z2: num(a, 'EndZ'),\n });\n break;\n }\n case tag === 'Circle' || gtype.includes('GeomCircle'): {\n geoms.push({\n kind: 'circle',\n index,\n cx: num(a, 'CenterX'), cy: num(a, 'CenterY'), cz: num(a, 'CenterZ'),\n radius: num(a, 'Radius'),\n });\n break;\n }\n case tag === 'ArcOfCircle' || gtype.includes('GeomArcOfCircle'): {\n const cx = num(a, 'CenterX');\n const cy = num(a, 'CenterY');\n const cz = num(a, 'CenterZ');\n const r = num(a, 'Radius');\n const sa = num(a, 'StartAngle');\n const ea = num(a, 'EndAngle');\n geoms.push({\n kind: 'arc',\n index, cx, cy, cz, radius: r, startAngle: sa, endAngle: ea,\n x1: cx + r * Math.cos(sa), y1: cy + r * Math.sin(sa), z1: cz,\n x2: cx + r * Math.cos(ea), y2: cy + r * Math.sin(ea), z2: cz,\n });\n break;\n }\n case tag === 'GeomPoint' || tag === 'Point' || gtype.includes('GeomPoint'): {\n geoms.push({ kind: 'point', index, x: num(a, 'X'), y: num(a, 'Y'), z: num(a, 'Z') });\n break;\n }\n case tag === 'Ellipse' || gtype.includes('GeomEllipse'): {\n const cx = num(a, 'CenterX');\n const cy = num(a, 'CenterY');\n const major = num(a, 'MajorRadius');\n const minor = num(a, 'MinorRadius');\n const ang = num(a, 'AngleXU');\n const f = Math.sqrt(Math.max(0, major * major - minor * minor));\n const ca = Math.cos(ang);\n const sa2 = Math.sin(ang);\n geoms.push({\n kind: 'ellipse', index, cx, cy, cz: num(a, 'CenterZ'),\n majorRadius: major, minorRadius: minor, angleXU: ang,\n fx1: cx + f * ca, fy1: cy + f * sa2,\n fx2: cx - f * ca, fy2: cy - f * sa2,\n });\n break;\n }\n case tag === 'BSplineCurve' || gtype.includes('GeomBSplineCurve'): {\n // P4: poles are child <Pole X= Y= Z=/> elements, knots child\n // <Knot Value= Multiplicity=/> (attributes only carry counts).\n const poles = inner.children\n .filter((c) => c.tagName === 'Pole')\n .map((c) => ({ x: num(c.attributes, 'X'), y: num(c.attributes, 'Y') }));\n const knots: number[] = [];\n for (const c of inner.children) {\n if (c.tagName !== 'Knot') continue;\n const m = num(c.attributes, 'Multiplicity');\n const v = num(c.attributes, 'Value');\n const mult = Number.isFinite(m) && m >= 1 ? m : 1;\n for (let k = 0; k < mult; k++) knots.push(v);\n }\n const degree = num(a, 'Degree');\n const periodic = num(a, 'IsPeriodic') !== 0;\n const first = poles[0];\n const last = poles[poles.length - 1];\n geoms.push({\n kind: 'bspline',\n index,\n poles,\n knots,\n degree,\n periodic,\n x1: first ? first.x : NaN,\n y1: first ? first.y : NaN,\n z1: 0,\n x2: last ? last.x : NaN,\n y2: last ? last.y : NaN,\n z2: 0,\n });\n break;\n }\n default:\n // ArcOfEllipse / hyperbola / parabola: not supported in M3\n // (sample set: 0 occurrences, plan §5.5.3); caller downgrades to L2.\n geoms.push({ kind: 'point', index, x: NaN, y: NaN, z: NaN });\n break;\n }\n index++;\n }\n return geoms;\n}\n\nfunction parseGeoRef(attrs: Record<string, string>, prefix: string): GeoRef {\n return { geoId: Math.trunc(num(attrs, prefix)), pos: Math.trunc(num(attrs, `${prefix}Pos`)) };\n}\n\n/**\n * Parse a sketch's `<ConstraintList>` property into constraint records.\n *\n * @param prop - the sketch's Constraints property.\n * @returns the parsed constraints, with element refs resolved from\n * ElementIds/ElementPositions or the old First/Second/Third fallback.\n */\nexport function parseConstraintList(prop: FcstdProperty): SketchCon[] {\n // <ConstraintList count=\"N\"><Constrain .../>...</ConstraintList>\n const listEl = prop.children[0];\n if (!listEl) return [];\n const cons: SketchCon[] = [];\n let index = 0;\n for (const child of listEl.children) {\n if (child.tagName !== 'Constrain') continue;\n const a = child.attributes;\n const type = Math.trunc(num(a, 'Type'));\n\n // ElementIds (new, space-separated) takes precedence; fallback First/Second/Third\n const refs: GeoRef[] = [];\n const eids = a['ElementIds']?.trim();\n const eposs = a['ElementPositions']?.trim();\n if (eids && eposs) {\n const ids = eids.split(/\\s+/).map(Number);\n const poss = eposs.split(/\\s+/).map(Number);\n for (let i = 0; i < ids.length; i++) {\n refs.push({ geoId: ids[i]!, pos: poss[i] ?? 0 });\n }\n } else {\n // old-style triple; Third=GeoUndef(-2000) means unused\n for (const prefix of ['First', 'Second', 'Third']) {\n const geoId = Math.trunc(num(a, prefix));\n if (geoId === -2000) continue;\n refs.push(parseGeoRef(a, prefix));\n }\n }\n\n const isDriving = a['IsDriving'] === undefined ? true : a['IsDriving'] === '1';\n\n cons.push({\n index,\n type,\n refs,\n value: num(a, 'Value'),\n isDriving,\n name: a['Name'] ?? '',\n internalAlignmentType: type === 15 ? Math.trunc(num(a, 'InternalAlignmentType')) : undefined,\n });\n index++;\n }\n return cons;\n}\n\n/**\n * Parse a sketch object's geometry and constraint properties (M3.1 entry).\n *\n * @param geometryProp - the sketch's Geometry property (may be undefined).\n * @param constraintsProp - the sketch's Constraints property (may be undefined).\n * @param fullyConstrained - the sketch's FullyConstrained flag.\n * @returns the parsed sketch, including external geoIds referenced by constraints.\n */\nexport function parseSketchObject(\n geometryProp: FcstdProperty | undefined,\n constraintsProp: FcstdProperty | undefined,\n fullyConstrained: boolean,\n): ParsedSketch {\n const geoms = geometryProp ? parseGeometryList(geometryProp) : [];\n const constraints = constraintsProp ? parseConstraintList(constraintsProp) : [];\n const externalGeoIds = new Set<number>();\n for (const c of constraints) {\n for (const r of c.refs) {\n // GeoUndef (-2000) is an unused-slot placeholder in old-format triples\n // and ElementIds — it is NOT external geometry. External refs are the\n // small negative range starting at RefExt (-3).\n if (r.geoId <= GeoId.RefExt && r.geoId > -2000) externalGeoIds.add(r.geoId);\n }\n }\n return {\n geoms,\n constraints,\n fullyConstrained,\n externalGeoIds: [...externalGeoIds],\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@faicad/faijs-fcstd",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"description": "FCStd reader and .fai.js conversion pipeline for faijs — unpack, sketch parse/solve, feature translate, batch CLI",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"faijs",
|
|
@@ -41,12 +41,12 @@
|
|
|
41
41
|
"LICENSE"
|
|
42
42
|
],
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@
|
|
44
|
+
"@faicad/faijs-sketch": "^0.18.0",
|
|
45
45
|
"@xmldom/xmldom": "^0.9.8",
|
|
46
46
|
"fflate": "^0.8.2"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
|
-
"@faicad/faijs": "^0.
|
|
49
|
+
"@faicad/faijs": "^0.18.0",
|
|
50
50
|
"occt-wasm": "^3.8.4"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|