@pooder/kit 4.0.0 → 4.2.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/.test-dist/src/CanvasService.js +83 -0
- package/.test-dist/src/ViewportSystem.js +75 -0
- package/.test-dist/src/background.js +203 -0
- package/.test-dist/src/constraints.js +153 -0
- package/.test-dist/src/coordinate.js +74 -0
- package/.test-dist/src/dieline.js +758 -0
- package/.test-dist/src/feature.js +687 -0
- package/.test-dist/src/featureComplete.js +31 -0
- package/.test-dist/src/featureDraft.js +31 -0
- package/.test-dist/src/film.js +167 -0
- package/.test-dist/src/geometry.js +292 -0
- package/.test-dist/src/image.js +421 -0
- package/.test-dist/src/index.js +31 -0
- package/.test-dist/src/mirror.js +104 -0
- package/.test-dist/src/ruler.js +383 -0
- package/.test-dist/src/tracer.js +448 -0
- package/.test-dist/src/units.js +30 -0
- package/.test-dist/src/white-ink.js +310 -0
- package/.test-dist/tests/run.js +60 -0
- package/CHANGELOG.md +12 -0
- package/dist/index.d.mts +54 -5
- package/dist/index.d.ts +54 -5
- package/dist/index.js +584 -190
- package/dist/index.mjs +581 -189
- package/package.json +3 -2
- package/src/CanvasService.ts +7 -0
- package/src/ViewportSystem.ts +92 -0
- package/src/background.ts +230 -230
- package/src/constraints.ts +207 -0
- package/src/coordinate.ts +106 -106
- package/src/dieline.ts +194 -75
- package/src/feature.ts +239 -147
- package/src/featureComplete.ts +45 -0
- package/src/film.ts +194 -194
- package/src/geometry.ts +4 -0
- package/src/image.ts +512 -512
- package/src/index.ts +1 -0
- package/src/mirror.ts +128 -128
- package/src/ruler.ts +508 -500
- package/src/tracer.ts +570 -570
- package/src/units.ts +27 -0
- package/src/white-ink.ts +373 -373
- package/tests/run.ts +81 -0
- package/tsconfig.test.json +15 -0
package/src/dieline.ts
CHANGED
|
@@ -8,7 +8,8 @@ import {
|
|
|
8
8
|
import { Path, Pattern } from "fabric";
|
|
9
9
|
import CanvasService from "./CanvasService";
|
|
10
10
|
import { ImageTracer } from "./tracer";
|
|
11
|
-
import {
|
|
11
|
+
import { Unit } from "./coordinate";
|
|
12
|
+
import { parseLengthToMm } from "./units";
|
|
12
13
|
import {
|
|
13
14
|
generateDielinePath,
|
|
14
15
|
generateMaskPath,
|
|
@@ -19,7 +20,8 @@ import {
|
|
|
19
20
|
|
|
20
21
|
export interface DielineGeometry {
|
|
21
22
|
shape: "rect" | "circle" | "ellipse" | "custom";
|
|
22
|
-
unit:
|
|
23
|
+
unit: "mm";
|
|
24
|
+
displayUnit: Unit;
|
|
23
25
|
x: number;
|
|
24
26
|
y: number;
|
|
25
27
|
width: number;
|
|
@@ -40,7 +42,7 @@ export interface LineStyle {
|
|
|
40
42
|
}
|
|
41
43
|
|
|
42
44
|
export interface DielineState {
|
|
43
|
-
|
|
45
|
+
displayUnit: Unit;
|
|
44
46
|
shape: "rect" | "circle" | "ellipse" | "custom";
|
|
45
47
|
width: number;
|
|
46
48
|
height: number;
|
|
@@ -63,7 +65,7 @@ export class DielineTool implements Extension {
|
|
|
63
65
|
};
|
|
64
66
|
|
|
65
67
|
private state: DielineState = {
|
|
66
|
-
|
|
68
|
+
displayUnit: "mm",
|
|
67
69
|
shape: "rect",
|
|
68
70
|
width: 500,
|
|
69
71
|
height: 500,
|
|
@@ -118,61 +120,138 @@ export class DielineTool implements Extension {
|
|
|
118
120
|
if (configService) {
|
|
119
121
|
// Load initial config
|
|
120
122
|
const s = this.state;
|
|
121
|
-
s.
|
|
123
|
+
s.displayUnit = configService.get("dieline.displayUnit", s.displayUnit);
|
|
122
124
|
s.shape = configService.get("dieline.shape", s.shape);
|
|
123
|
-
s.width =
|
|
124
|
-
|
|
125
|
-
|
|
125
|
+
s.width = parseLengthToMm(
|
|
126
|
+
configService.get("dieline.width", s.width),
|
|
127
|
+
"mm",
|
|
128
|
+
);
|
|
129
|
+
s.height = parseLengthToMm(
|
|
130
|
+
configService.get("dieline.height", s.height),
|
|
131
|
+
"mm",
|
|
132
|
+
);
|
|
133
|
+
s.radius = parseLengthToMm(
|
|
134
|
+
configService.get("dieline.radius", s.radius),
|
|
135
|
+
"mm",
|
|
136
|
+
);
|
|
126
137
|
s.padding = configService.get("dieline.padding", s.padding);
|
|
127
|
-
s.offset =
|
|
128
|
-
|
|
138
|
+
s.offset = parseLengthToMm(
|
|
139
|
+
configService.get("dieline.offset", s.offset),
|
|
140
|
+
"mm",
|
|
141
|
+
);
|
|
142
|
+
|
|
129
143
|
// Main Line
|
|
130
|
-
s.mainLine.width = configService.get(
|
|
131
|
-
|
|
132
|
-
|
|
144
|
+
s.mainLine.width = configService.get(
|
|
145
|
+
"dieline.strokeWidth",
|
|
146
|
+
s.mainLine.width,
|
|
147
|
+
);
|
|
148
|
+
s.mainLine.color = configService.get(
|
|
149
|
+
"dieline.strokeColor",
|
|
150
|
+
s.mainLine.color,
|
|
151
|
+
);
|
|
152
|
+
s.mainLine.dashLength = configService.get(
|
|
153
|
+
"dieline.dashLength",
|
|
154
|
+
s.mainLine.dashLength,
|
|
155
|
+
);
|
|
133
156
|
s.mainLine.style = configService.get("dieline.style", s.mainLine.style);
|
|
134
157
|
|
|
135
158
|
// Offset Line
|
|
136
|
-
s.offsetLine.width = configService.get(
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
159
|
+
s.offsetLine.width = configService.get(
|
|
160
|
+
"dieline.offsetStrokeWidth",
|
|
161
|
+
s.offsetLine.width,
|
|
162
|
+
);
|
|
163
|
+
s.offsetLine.color = configService.get(
|
|
164
|
+
"dieline.offsetStrokeColor",
|
|
165
|
+
s.offsetLine.color,
|
|
166
|
+
);
|
|
167
|
+
s.offsetLine.dashLength = configService.get(
|
|
168
|
+
"dieline.offsetDashLength",
|
|
169
|
+
s.offsetLine.dashLength,
|
|
170
|
+
);
|
|
171
|
+
s.offsetLine.style = configService.get(
|
|
172
|
+
"dieline.offsetStyle",
|
|
173
|
+
s.offsetLine.style,
|
|
174
|
+
);
|
|
140
175
|
|
|
141
176
|
s.insideColor = configService.get("dieline.insideColor", s.insideColor);
|
|
142
|
-
s.outsideColor = configService.get(
|
|
143
|
-
|
|
177
|
+
s.outsideColor = configService.get(
|
|
178
|
+
"dieline.outsideColor",
|
|
179
|
+
s.outsideColor,
|
|
180
|
+
);
|
|
181
|
+
s.showBleedLines = configService.get(
|
|
182
|
+
"dieline.showBleedLines",
|
|
183
|
+
s.showBleedLines,
|
|
184
|
+
);
|
|
144
185
|
s.features = configService.get("dieline.features", s.features);
|
|
145
186
|
s.pathData = configService.get("dieline.pathData", s.pathData);
|
|
146
187
|
|
|
147
188
|
// Listen for changes
|
|
148
189
|
configService.onAnyChange((e: { key: string; value: any }) => {
|
|
149
190
|
if (e.key.startsWith("dieline.")) {
|
|
150
|
-
console.log(`[DielineTool] Config change detected: ${e.key} -> ${e.value}`);
|
|
151
|
-
|
|
152
191
|
switch (e.key) {
|
|
153
|
-
case "dieline.
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
case "dieline.
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
case "dieline.
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
case "dieline.
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
case "dieline.
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
case "dieline.
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
case "dieline.
|
|
192
|
+
case "dieline.displayUnit":
|
|
193
|
+
s.displayUnit = e.value;
|
|
194
|
+
break;
|
|
195
|
+
case "dieline.shape":
|
|
196
|
+
s.shape = e.value;
|
|
197
|
+
break;
|
|
198
|
+
case "dieline.width":
|
|
199
|
+
s.width = parseLengthToMm(e.value, "mm");
|
|
200
|
+
break;
|
|
201
|
+
case "dieline.height":
|
|
202
|
+
s.height = parseLengthToMm(e.value, "mm");
|
|
203
|
+
break;
|
|
204
|
+
case "dieline.radius":
|
|
205
|
+
s.radius = parseLengthToMm(e.value, "mm");
|
|
206
|
+
break;
|
|
207
|
+
case "dieline.padding":
|
|
208
|
+
s.padding = e.value;
|
|
209
|
+
break;
|
|
210
|
+
case "dieline.offset":
|
|
211
|
+
s.offset = parseLengthToMm(e.value, "mm");
|
|
212
|
+
break;
|
|
213
|
+
|
|
214
|
+
case "dieline.strokeWidth":
|
|
215
|
+
s.mainLine.width = e.value;
|
|
216
|
+
break;
|
|
217
|
+
case "dieline.strokeColor":
|
|
218
|
+
s.mainLine.color = e.value;
|
|
219
|
+
break;
|
|
220
|
+
case "dieline.dashLength":
|
|
221
|
+
s.mainLine.dashLength = e.value;
|
|
222
|
+
break;
|
|
223
|
+
case "dieline.style":
|
|
224
|
+
s.mainLine.style = e.value;
|
|
225
|
+
break;
|
|
226
|
+
|
|
227
|
+
case "dieline.offsetStrokeWidth":
|
|
228
|
+
s.offsetLine.width = e.value;
|
|
229
|
+
break;
|
|
230
|
+
case "dieline.offsetStrokeColor":
|
|
231
|
+
s.offsetLine.color = e.value;
|
|
232
|
+
break;
|
|
233
|
+
case "dieline.offsetDashLength":
|
|
234
|
+
s.offsetLine.dashLength = e.value;
|
|
235
|
+
break;
|
|
236
|
+
case "dieline.offsetStyle":
|
|
237
|
+
s.offsetLine.style = e.value;
|
|
238
|
+
break;
|
|
239
|
+
|
|
240
|
+
case "dieline.insideColor":
|
|
241
|
+
s.insideColor = e.value;
|
|
242
|
+
break;
|
|
243
|
+
case "dieline.outsideColor":
|
|
244
|
+
s.outsideColor = e.value;
|
|
245
|
+
break;
|
|
246
|
+
case "dieline.showBleedLines":
|
|
247
|
+
s.showBleedLines = e.value;
|
|
248
|
+
break;
|
|
249
|
+
case "dieline.features":
|
|
250
|
+
s.features = e.value;
|
|
251
|
+
break;
|
|
252
|
+
case "dieline.pathData":
|
|
253
|
+
s.pathData = e.value;
|
|
254
|
+
break;
|
|
176
255
|
}
|
|
177
256
|
this.updateDieline();
|
|
178
257
|
}
|
|
@@ -194,11 +273,11 @@ export class DielineTool implements Extension {
|
|
|
194
273
|
return {
|
|
195
274
|
[ContributionPointIds.CONFIGURATIONS]: [
|
|
196
275
|
{
|
|
197
|
-
id: "dieline.
|
|
276
|
+
id: "dieline.displayUnit",
|
|
198
277
|
type: "select",
|
|
199
|
-
label: "Unit",
|
|
200
|
-
options: ["
|
|
201
|
-
default: s.
|
|
278
|
+
label: "Display Unit",
|
|
279
|
+
options: ["mm", "cm", "in"],
|
|
280
|
+
default: s.displayUnit,
|
|
202
281
|
},
|
|
203
282
|
{
|
|
204
283
|
id: "dieline.shape",
|
|
@@ -210,7 +289,7 @@ export class DielineTool implements Extension {
|
|
|
210
289
|
{
|
|
211
290
|
id: "dieline.width",
|
|
212
291
|
type: "number",
|
|
213
|
-
label: "Width",
|
|
292
|
+
label: "Width (mm)",
|
|
214
293
|
min: 10,
|
|
215
294
|
max: 2000,
|
|
216
295
|
default: s.width,
|
|
@@ -218,7 +297,7 @@ export class DielineTool implements Extension {
|
|
|
218
297
|
{
|
|
219
298
|
id: "dieline.height",
|
|
220
299
|
type: "number",
|
|
221
|
-
label: "Height",
|
|
300
|
+
label: "Height (mm)",
|
|
222
301
|
min: 10,
|
|
223
302
|
max: 2000,
|
|
224
303
|
default: s.height,
|
|
@@ -226,7 +305,7 @@ export class DielineTool implements Extension {
|
|
|
226
305
|
{
|
|
227
306
|
id: "dieline.radius",
|
|
228
307
|
type: "number",
|
|
229
|
-
label: "Corner Radius",
|
|
308
|
+
label: "Corner Radius (mm)",
|
|
230
309
|
min: 0,
|
|
231
310
|
max: 500,
|
|
232
311
|
default: s.radius,
|
|
@@ -241,7 +320,7 @@ export class DielineTool implements Extension {
|
|
|
241
320
|
{
|
|
242
321
|
id: "dieline.offset",
|
|
243
322
|
type: "number",
|
|
244
|
-
label: "Bleed Offset",
|
|
323
|
+
label: "Bleed Offset (mm)",
|
|
245
324
|
min: -100,
|
|
246
325
|
max: 100,
|
|
247
326
|
default: s.offset,
|
|
@@ -332,6 +411,33 @@ export class DielineTool implements Extension {
|
|
|
332
411
|
},
|
|
333
412
|
] as ConfigurationContribution[],
|
|
334
413
|
[ContributionPointIds.COMMANDS]: [
|
|
414
|
+
{
|
|
415
|
+
command: "updateFeaturePosition",
|
|
416
|
+
title: "Update Feature Position",
|
|
417
|
+
handler: (groupId: string, x: number, y: number) => {
|
|
418
|
+
const configService = this.context?.services.get<any>(
|
|
419
|
+
"ConfigurationService",
|
|
420
|
+
);
|
|
421
|
+
if (!configService) return;
|
|
422
|
+
|
|
423
|
+
const features = configService.get("dieline.features") || [];
|
|
424
|
+
|
|
425
|
+
let changed = false;
|
|
426
|
+
const newFeatures = features.map((f: any) => {
|
|
427
|
+
if (f.groupId === groupId) {
|
|
428
|
+
if (f.x !== x || f.y !== y) {
|
|
429
|
+
changed = true;
|
|
430
|
+
return { ...f, x, y };
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return f;
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
if (changed) {
|
|
437
|
+
configService.update("dieline.features", newFeatures);
|
|
438
|
+
}
|
|
439
|
+
},
|
|
440
|
+
},
|
|
335
441
|
{
|
|
336
442
|
command: "getGeometry",
|
|
337
443
|
title: "Get Geometry",
|
|
@@ -459,7 +565,7 @@ export class DielineTool implements Extension {
|
|
|
459
565
|
if (!layer) return;
|
|
460
566
|
|
|
461
567
|
const {
|
|
462
|
-
|
|
568
|
+
displayUnit,
|
|
463
569
|
shape,
|
|
464
570
|
radius,
|
|
465
571
|
offset,
|
|
@@ -470,7 +576,7 @@ export class DielineTool implements Extension {
|
|
|
470
576
|
showBleedLines,
|
|
471
577
|
features,
|
|
472
578
|
} = this.state;
|
|
473
|
-
|
|
579
|
+
const { width, height } = this.state;
|
|
474
580
|
|
|
475
581
|
const canvasW = this.canvasService.canvas.width || 800;
|
|
476
582
|
const canvasH = this.canvasService.canvas.height || 600;
|
|
@@ -478,11 +584,12 @@ export class DielineTool implements Extension {
|
|
|
478
584
|
// Calculate Layout based on Physical Dimensions and Canvas Size
|
|
479
585
|
// Add padding to avoid edge hugging
|
|
480
586
|
const paddingPx = this.resolvePadding(canvasW, canvasH);
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
587
|
+
|
|
588
|
+
// Update Viewport System
|
|
589
|
+
this.canvasService.viewport.setPadding(paddingPx);
|
|
590
|
+
this.canvasService.viewport.updatePhysical(width, height);
|
|
591
|
+
|
|
592
|
+
const layout = this.canvasService.viewport.layout;
|
|
486
593
|
|
|
487
594
|
const scale = layout.scale;
|
|
488
595
|
const cx = layout.offsetX + layout.width / 2;
|
|
@@ -499,7 +606,6 @@ export class DielineTool implements Extension {
|
|
|
499
606
|
|
|
500
607
|
// Scale Features for Geometry Generation
|
|
501
608
|
const absoluteFeatures = (features || []).map((f) => {
|
|
502
|
-
// Scale current unit -> pixels (features share the same unit as the dieline)
|
|
503
609
|
const featureScale = scale;
|
|
504
610
|
|
|
505
611
|
return {
|
|
@@ -674,7 +780,9 @@ export class DielineTool implements Extension {
|
|
|
674
780
|
stroke: mainLine.style === "hidden" ? null : mainLine.color,
|
|
675
781
|
strokeWidth: mainLine.width,
|
|
676
782
|
strokeDashArray:
|
|
677
|
-
mainLine.style === "dashed"
|
|
783
|
+
mainLine.style === "dashed"
|
|
784
|
+
? [mainLine.dashLength, mainLine.dashLength]
|
|
785
|
+
: undefined,
|
|
678
786
|
selectable: false,
|
|
679
787
|
evented: false,
|
|
680
788
|
originX: "left",
|
|
@@ -718,16 +826,26 @@ export class DielineTool implements Extension {
|
|
|
718
826
|
|
|
719
827
|
public getGeometry(): DielineGeometry | null {
|
|
720
828
|
if (!this.canvasService) return null;
|
|
721
|
-
const {
|
|
829
|
+
const {
|
|
830
|
+
displayUnit,
|
|
831
|
+
shape,
|
|
832
|
+
width,
|
|
833
|
+
height,
|
|
834
|
+
radius,
|
|
835
|
+
offset,
|
|
836
|
+
mainLine,
|
|
837
|
+
pathData,
|
|
838
|
+
} = this.state;
|
|
722
839
|
const canvasW = this.canvasService.canvas.width || 800;
|
|
723
840
|
const canvasH = this.canvasService.canvas.height || 600;
|
|
724
841
|
|
|
725
842
|
const paddingPx = this.resolvePadding(canvasW, canvasH);
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
843
|
+
|
|
844
|
+
// Update Viewport System (Ensure it's up to date)
|
|
845
|
+
this.canvasService.viewport.setPadding(paddingPx);
|
|
846
|
+
this.canvasService.viewport.updatePhysical(width, height);
|
|
847
|
+
|
|
848
|
+
const layout = this.canvasService.viewport.layout;
|
|
731
849
|
|
|
732
850
|
const scale = layout.scale;
|
|
733
851
|
const cx = layout.offsetX + layout.width / 2;
|
|
@@ -738,14 +856,14 @@ export class DielineTool implements Extension {
|
|
|
738
856
|
|
|
739
857
|
return {
|
|
740
858
|
shape,
|
|
741
|
-
unit,
|
|
859
|
+
unit: "mm",
|
|
860
|
+
displayUnit,
|
|
742
861
|
x: cx,
|
|
743
862
|
y: cy,
|
|
744
863
|
width: visualWidth,
|
|
745
864
|
height: visualHeight,
|
|
746
865
|
radius: radius * scale,
|
|
747
866
|
offset: offset * scale,
|
|
748
|
-
// Pass scale to help other tools (like FeatureTool) convert units
|
|
749
867
|
scale,
|
|
750
868
|
strokeWidth: mainLine.width,
|
|
751
869
|
pathData,
|
|
@@ -759,16 +877,17 @@ export class DielineTool implements Extension {
|
|
|
759
877
|
if (!userLayer) return null;
|
|
760
878
|
|
|
761
879
|
// 1. Generate Path Data
|
|
762
|
-
const { shape, width, height, radius, features,
|
|
880
|
+
const { shape, width, height, radius, features, pathData } = this.state;
|
|
763
881
|
const canvasW = this.canvasService.canvas.width || 800;
|
|
764
882
|
const canvasH = this.canvasService.canvas.height || 600;
|
|
765
883
|
|
|
766
884
|
const paddingPx = this.resolvePadding(canvasW, canvasH);
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
885
|
+
|
|
886
|
+
// Update Viewport System
|
|
887
|
+
this.canvasService.viewport.setPadding(paddingPx);
|
|
888
|
+
this.canvasService.viewport.updatePhysical(width, height);
|
|
889
|
+
|
|
890
|
+
const layout = this.canvasService.viewport.layout;
|
|
772
891
|
const scale = layout.scale;
|
|
773
892
|
const cx = layout.offsetX + layout.width / 2;
|
|
774
893
|
const cy = layout.offsetY + layout.height / 2;
|