circuit-json-to-gltf 0.0.74 → 0.0.76
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/README.md +1 -0
- package/dist/index.d.ts +23 -21
- package/dist/index.js +65 -34
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -65,6 +65,7 @@ convertCircuitJsonToGltf(circuitJson: CircuitJson, options?: ConversionOptions):
|
|
|
65
65
|
|
|
66
66
|
- `format`: "gltf" (JSON) or "glb" (binary) - default: "gltf"
|
|
67
67
|
- `boardTextureResolution`: Resolution for board texture rendering - default: 1024
|
|
68
|
+
- `boardDrillQuality`: Drill geometry detail level, "high" or "fast" - default: "fast"
|
|
68
69
|
- `drawFauxBoard`: Draw a fallback board if no `pcb_board` or `pcb_panel` is present - default: false
|
|
69
70
|
- `includeModels`: Whether to load external 3D models - default: true
|
|
70
71
|
- `modelCache`: Map for caching loaded models
|
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ interface AuthHeaders extends Record<string, string> {
|
|
|
6
6
|
interface ConversionOptions {
|
|
7
7
|
format?: "gltf" | "glb";
|
|
8
8
|
boardTextureResolution?: number;
|
|
9
|
+
boardDrillQuality?: "high" | "fast";
|
|
9
10
|
drawFauxBoard?: boolean;
|
|
10
11
|
includeModels?: boolean;
|
|
11
12
|
modelCache?: Map<string, STLMesh | OBJMesh>;
|
|
@@ -122,6 +123,7 @@ interface CircuitTo3DOptions {
|
|
|
122
123
|
componentColor?: Color;
|
|
123
124
|
copperColor?: Color;
|
|
124
125
|
boardThickness?: number;
|
|
126
|
+
boardDrillQuality?: "high" | "fast";
|
|
125
127
|
drawFauxBoard?: boolean;
|
|
126
128
|
defaultComponentHeight?: number;
|
|
127
129
|
renderBoardTextures?: boolean;
|
|
@@ -175,27 +177,6 @@ declare function loadSTL({ url, transform, projectBaseUrl, authHeaders, }: {
|
|
|
175
177
|
}): Promise<STLMesh>;
|
|
176
178
|
declare function clearSTLCache(): void;
|
|
177
179
|
|
|
178
|
-
declare function applyCoordinateTransform(point: Point3, config: CoordinateTransformConfig): Point3;
|
|
179
|
-
declare function transformTriangles(triangles: Triangle[], config: CoordinateTransformConfig): Triangle[];
|
|
180
|
-
declare const COORDINATE_TRANSFORMS: {
|
|
181
|
-
readonly Z_UP_TO_Y_UP: CoordinateTransformConfig;
|
|
182
|
-
readonly Z_OUT_OF_TOP: CoordinateTransformConfig;
|
|
183
|
-
readonly STEP_INVERTED: CoordinateTransformConfig;
|
|
184
|
-
readonly USB_PORT_FIX: CoordinateTransformConfig;
|
|
185
|
-
readonly Z_UP_TO_Y_UP_USB_FIX: CoordinateTransformConfig;
|
|
186
|
-
readonly IDENTITY: CoordinateTransformConfig;
|
|
187
|
-
readonly TEST_ROTATE_X_90: CoordinateTransformConfig;
|
|
188
|
-
readonly TEST_ROTATE_X_270: CoordinateTransformConfig;
|
|
189
|
-
readonly TEST_ROTATE_Y_90: CoordinateTransformConfig;
|
|
190
|
-
readonly TEST_ROTATE_Y_270: CoordinateTransformConfig;
|
|
191
|
-
readonly TEST_ROTATE_Z_90: CoordinateTransformConfig;
|
|
192
|
-
readonly TEST_ROTATE_Z_270: CoordinateTransformConfig;
|
|
193
|
-
readonly TEST_FLIP_X: CoordinateTransformConfig;
|
|
194
|
-
readonly TEST_FLIP_Z: CoordinateTransformConfig;
|
|
195
|
-
readonly FOOTPRINTER_MODEL_TRANSFORM: CoordinateTransformConfig;
|
|
196
|
-
readonly OBJ_Z_UP_TO_Y_UP: CoordinateTransformConfig;
|
|
197
|
-
};
|
|
198
|
-
|
|
199
180
|
interface CameraFitOptions {
|
|
200
181
|
/**
|
|
201
182
|
* Target-to-camera direction vector used for solved camera position.
|
|
@@ -228,6 +209,27 @@ declare function getBestCameraPosition(circuitJson: CircuitJson): {
|
|
|
228
209
|
fov: number;
|
|
229
210
|
};
|
|
230
211
|
|
|
212
|
+
declare function applyCoordinateTransform(point: Point3, config: CoordinateTransformConfig): Point3;
|
|
213
|
+
declare function transformTriangles(triangles: Triangle[], config: CoordinateTransformConfig): Triangle[];
|
|
214
|
+
declare const COORDINATE_TRANSFORMS: {
|
|
215
|
+
readonly Z_UP_TO_Y_UP: CoordinateTransformConfig;
|
|
216
|
+
readonly Z_OUT_OF_TOP: CoordinateTransformConfig;
|
|
217
|
+
readonly STEP_INVERTED: CoordinateTransformConfig;
|
|
218
|
+
readonly USB_PORT_FIX: CoordinateTransformConfig;
|
|
219
|
+
readonly Z_UP_TO_Y_UP_USB_FIX: CoordinateTransformConfig;
|
|
220
|
+
readonly IDENTITY: CoordinateTransformConfig;
|
|
221
|
+
readonly TEST_ROTATE_X_90: CoordinateTransformConfig;
|
|
222
|
+
readonly TEST_ROTATE_X_270: CoordinateTransformConfig;
|
|
223
|
+
readonly TEST_ROTATE_Y_90: CoordinateTransformConfig;
|
|
224
|
+
readonly TEST_ROTATE_Y_270: CoordinateTransformConfig;
|
|
225
|
+
readonly TEST_ROTATE_Z_90: CoordinateTransformConfig;
|
|
226
|
+
readonly TEST_ROTATE_Z_270: CoordinateTransformConfig;
|
|
227
|
+
readonly TEST_FLIP_X: CoordinateTransformConfig;
|
|
228
|
+
readonly TEST_FLIP_Z: CoordinateTransformConfig;
|
|
229
|
+
readonly FOOTPRINTER_MODEL_TRANSFORM: CoordinateTransformConfig;
|
|
230
|
+
readonly OBJ_Z_UP_TO_Y_UP: CoordinateTransformConfig;
|
|
231
|
+
};
|
|
232
|
+
|
|
231
233
|
declare function convertCircuitJsonToGltf(circuitJson: CircuitJson, options?: ConversionOptions): Promise<ArrayBuffer | object>;
|
|
232
234
|
|
|
233
235
|
interface Point {
|
package/dist/index.js
CHANGED
|
@@ -14855,8 +14855,10 @@ function convertOcctResultToMesh(result, transform) {
|
|
|
14855
14855
|
const normals = mesh.attributes?.normal?.array;
|
|
14856
14856
|
const indices = mesh.index.array;
|
|
14857
14857
|
const brepFaces = mesh.brep_faces ?? [];
|
|
14858
|
+
const sortedBrepFaces = brepFaces.length > 1 ? [...brepFaces].sort((a, b) => a.first - b.first) : brepFaces;
|
|
14858
14859
|
const meshColor = mesh.color ? [mesh.color[0], mesh.color[1], mesh.color[2]] : void 0;
|
|
14859
14860
|
const numTriangles = indices.length / 3;
|
|
14861
|
+
let brepFaceIndex = 0;
|
|
14860
14862
|
for (let t = 0; t < numTriangles; t++) {
|
|
14861
14863
|
const i0 = indices[t * 3];
|
|
14862
14864
|
const i1 = indices[t * 3 + 1];
|
|
@@ -14888,17 +14890,18 @@ function convertOcctResultToMesh(result, transform) {
|
|
|
14888
14890
|
}
|
|
14889
14891
|
let triangleColor;
|
|
14890
14892
|
let foundFaceColor = false;
|
|
14891
|
-
|
|
14892
|
-
|
|
14893
|
-
|
|
14894
|
-
|
|
14895
|
-
|
|
14896
|
-
|
|
14897
|
-
|
|
14898
|
-
]
|
|
14899
|
-
|
|
14900
|
-
|
|
14901
|
-
|
|
14893
|
+
while (brepFaceIndex < sortedBrepFaces.length && t > sortedBrepFaces[brepFaceIndex].last) {
|
|
14894
|
+
brepFaceIndex++;
|
|
14895
|
+
}
|
|
14896
|
+
const currentBrepFace = sortedBrepFaces[brepFaceIndex];
|
|
14897
|
+
if (currentBrepFace && t >= currentBrepFace.first && t <= currentBrepFace.last && currentBrepFace.color) {
|
|
14898
|
+
triangleColor = [
|
|
14899
|
+
Math.round(currentBrepFace.color[0] * 255),
|
|
14900
|
+
Math.round(currentBrepFace.color[1] * 255),
|
|
14901
|
+
Math.round(currentBrepFace.color[2] * 255),
|
|
14902
|
+
1
|
|
14903
|
+
];
|
|
14904
|
+
foundFaceColor = true;
|
|
14902
14905
|
}
|
|
14903
14906
|
if (!foundFaceColor && meshColor) {
|
|
14904
14907
|
triangleColor = [
|
|
@@ -15199,10 +15202,12 @@ function scaleMesh(mesh, scale) {
|
|
|
15199
15202
|
|
|
15200
15203
|
// lib/utils/pcb-board-cutouts.ts
|
|
15201
15204
|
var import_extrusions = __toESM(require_extrusions(), 1);
|
|
15202
|
-
var import_primitives = __toESM(require_primitives(), 1);
|
|
15203
15205
|
var import_transforms = __toESM(require_transforms(), 1);
|
|
15204
|
-
var
|
|
15205
|
-
var
|
|
15206
|
+
var import_primitives = __toESM(require_primitives(), 1);
|
|
15207
|
+
var DEFAULT_QUALITY_MODE_SEGMENTS = 24;
|
|
15208
|
+
var REDUCED_QUALITY_MODE_SEGMENTS = 8;
|
|
15209
|
+
var HIGH_QUALITY_MODE_SEGMENTS = 64;
|
|
15210
|
+
var HIGH_QUALITY_MODE_REDUCED_SEGMENTS = 16;
|
|
15206
15211
|
var HOLE_COUNT_THRESHOLD = 50;
|
|
15207
15212
|
var toBoardSpaceVec2 = (point, center) => [point.x - center.x, -(point.y - center.y)];
|
|
15208
15213
|
var isFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value);
|
|
@@ -15216,13 +15221,13 @@ var arePointsClockwise = (points) => {
|
|
|
15216
15221
|
const signedArea = area / 2;
|
|
15217
15222
|
return signedArea <= 0;
|
|
15218
15223
|
};
|
|
15219
|
-
var createCircularHole = (x, y, radius, thickness, segments =
|
|
15224
|
+
var createCircularHole = (x, y, radius, thickness, segments = DEFAULT_QUALITY_MODE_SEGMENTS) => (0, import_primitives.cylinder)({
|
|
15220
15225
|
center: [x, y, 0],
|
|
15221
15226
|
height: thickness + 1,
|
|
15222
15227
|
radius,
|
|
15223
15228
|
segments
|
|
15224
15229
|
});
|
|
15225
|
-
var createCutoutGeoms = (boardCenter, thickness, cutouts = []) => {
|
|
15230
|
+
var createCutoutGeoms = (boardCenter, thickness, cutouts = [], segments = DEFAULT_QUALITY_MODE_SEGMENTS) => {
|
|
15226
15231
|
const geoms = [];
|
|
15227
15232
|
for (const cutout of cutouts) {
|
|
15228
15233
|
if (!cutout) continue;
|
|
@@ -15297,7 +15302,7 @@ var createCutoutGeoms = (boardCenter, thickness, cutouts = []) => {
|
|
|
15297
15302
|
if (!radius) continue;
|
|
15298
15303
|
const relX = center.x - boardCenter.x;
|
|
15299
15304
|
const relY = -(center.y - boardCenter.y);
|
|
15300
|
-
geoms.push(createCircularHole(relX, relY, radius, thickness));
|
|
15305
|
+
geoms.push(createCircularHole(relX, relY, radius, thickness, segments));
|
|
15301
15306
|
break;
|
|
15302
15307
|
}
|
|
15303
15308
|
case "polygon": {
|
|
@@ -15329,12 +15334,12 @@ var filterCutoutsForBoard = (cutouts, board) => {
|
|
|
15329
15334
|
};
|
|
15330
15335
|
|
|
15331
15336
|
// lib/utils/pcb-board-geometry.ts
|
|
15332
|
-
var import_extrusions2 = __toESM(require_extrusions(), 1);
|
|
15333
|
-
var import_primitives2 = __toESM(require_primitives(), 1);
|
|
15334
|
-
var import_transforms2 = __toESM(require_transforms(), 1);
|
|
15335
|
-
var import_booleans2 = __toESM(require_booleans(), 1);
|
|
15336
15337
|
var geom3 = __toESM(require_geom3(), 1);
|
|
15337
15338
|
var import_measureBoundingBox = __toESM(require_measureBoundingBox2(), 1);
|
|
15339
|
+
var import_booleans2 = __toESM(require_booleans(), 1);
|
|
15340
|
+
var import_extrusions2 = __toESM(require_extrusions(), 1);
|
|
15341
|
+
var import_transforms2 = __toESM(require_transforms(), 1);
|
|
15342
|
+
var import_primitives2 = __toESM(require_primitives(), 1);
|
|
15338
15343
|
|
|
15339
15344
|
// lib/utils/batched-union.ts
|
|
15340
15345
|
var import_booleans = __toESM(require_booleans(), 1);
|
|
@@ -15363,6 +15368,12 @@ var batchedUnion = (geoms, batchSize = 50) => {
|
|
|
15363
15368
|
|
|
15364
15369
|
// lib/utils/pcb-board-geometry.ts
|
|
15365
15370
|
var RADIUS_EPSILON = 1e-4;
|
|
15371
|
+
var getHoleSegments = (totalHoleCount, drillQuality) => {
|
|
15372
|
+
if (drillQuality === "high") {
|
|
15373
|
+
return totalHoleCount > HOLE_COUNT_THRESHOLD ? HIGH_QUALITY_MODE_REDUCED_SEGMENTS : HIGH_QUALITY_MODE_SEGMENTS;
|
|
15374
|
+
}
|
|
15375
|
+
return totalHoleCount > HOLE_COUNT_THRESHOLD ? REDUCED_QUALITY_MODE_SEGMENTS : DEFAULT_QUALITY_MODE_SEGMENTS;
|
|
15376
|
+
};
|
|
15366
15377
|
var getNumberProperty = (obj, key) => {
|
|
15367
15378
|
const value = obj[key];
|
|
15368
15379
|
return typeof value === "number" ? value : void 0;
|
|
@@ -15387,7 +15398,7 @@ var createBoardOutlineGeom = (board, center, thickness) => {
|
|
|
15387
15398
|
geom = (0, import_transforms2.translate)([0, 0, -thickness / 2], geom);
|
|
15388
15399
|
return geom;
|
|
15389
15400
|
};
|
|
15390
|
-
var createPillHoleWithSegments = (x, y, width, height, thickness, rotate, segments =
|
|
15401
|
+
var createPillHoleWithSegments = (x, y, width, height, thickness, rotate, segments = DEFAULT_QUALITY_MODE_SEGMENTS) => {
|
|
15391
15402
|
const minDimension = Math.min(width, height);
|
|
15392
15403
|
const maxAllowedRadius = Math.max(0, minDimension / 2 - RADIUS_EPSILON);
|
|
15393
15404
|
const roundRadius = maxAllowedRadius <= 0 ? 0 : Math.min(height / 2, maxAllowedRadius);
|
|
@@ -15403,7 +15414,7 @@ var createPillHoleWithSegments = (x, y, width, height, thickness, rotate, segmen
|
|
|
15403
15414
|
}
|
|
15404
15415
|
return (0, import_transforms2.translate)([x, y, 0], hole3d);
|
|
15405
15416
|
};
|
|
15406
|
-
var createHoleGeoms = (boardCenter, thickness, holes = [], platedHoles = [], segments =
|
|
15417
|
+
var createHoleGeoms = (boardCenter, thickness, holes = [], platedHoles = [], segments = DEFAULT_QUALITY_MODE_SEGMENTS) => {
|
|
15407
15418
|
const holeGeoms = [];
|
|
15408
15419
|
for (const hole of holes) {
|
|
15409
15420
|
const holeRecord = hole;
|
|
@@ -15540,12 +15551,17 @@ var createBoundingBox = (bbox) => {
|
|
|
15540
15551
|
};
|
|
15541
15552
|
};
|
|
15542
15553
|
var createBoardMesh = (board, options) => {
|
|
15543
|
-
const {
|
|
15554
|
+
const {
|
|
15555
|
+
thickness,
|
|
15556
|
+
holes = [],
|
|
15557
|
+
platedHoles = [],
|
|
15558
|
+
cutouts = [],
|
|
15559
|
+
drillQuality = "fast"
|
|
15560
|
+
} = options;
|
|
15544
15561
|
const center = board.center ?? { x: 0, y: 0 };
|
|
15545
15562
|
let boardGeom = createBoardOutlineGeom(board, center, thickness);
|
|
15546
15563
|
const totalHoleCount = holes.length + platedHoles.length;
|
|
15547
|
-
const
|
|
15548
|
-
const segments = useReducedSegments ? REDUCED_SEGMENTS : DEFAULT_SEGMENTS;
|
|
15564
|
+
const segments = getHoleSegments(totalHoleCount, drillQuality);
|
|
15549
15565
|
const holeGeoms = createHoleGeoms(
|
|
15550
15566
|
center,
|
|
15551
15567
|
thickness,
|
|
@@ -15553,7 +15569,7 @@ var createBoardMesh = (board, options) => {
|
|
|
15553
15569
|
platedHoles,
|
|
15554
15570
|
segments
|
|
15555
15571
|
);
|
|
15556
|
-
const cutoutGeoms = createCutoutGeoms(center, thickness, cutouts);
|
|
15572
|
+
const cutoutGeoms = createCutoutGeoms(center, thickness, cutouts, segments);
|
|
15557
15573
|
const subtractGeoms = [...holeGeoms, ...cutoutGeoms];
|
|
15558
15574
|
if (subtractGeoms.length > 0) {
|
|
15559
15575
|
const unifiedHoles = batchedUnion(subtractGeoms);
|
|
@@ -15571,19 +15587,29 @@ var createBoardMesh = (board, options) => {
|
|
|
15571
15587
|
};
|
|
15572
15588
|
|
|
15573
15589
|
// lib/utils/pcb-panel-geometry.ts
|
|
15574
|
-
var import_transforms3 = __toESM(require_transforms(), 1);
|
|
15575
|
-
var import_booleans3 = __toESM(require_booleans(), 1);
|
|
15576
15590
|
var geom32 = __toESM(require_geom3(), 1);
|
|
15577
15591
|
var import_measureBoundingBox2 = __toESM(require_measureBoundingBox2(), 1);
|
|
15592
|
+
var import_booleans3 = __toESM(require_booleans(), 1);
|
|
15593
|
+
var import_transforms3 = __toESM(require_transforms(), 1);
|
|
15578
15594
|
var createPanelMesh = (panel, options) => {
|
|
15579
15595
|
const { thickness, holes = [], platedHoles = [], cutouts = [] } = options;
|
|
15596
|
+
const drillQuality = options.drillQuality ?? "fast";
|
|
15580
15597
|
const center = panel.center ?? { x: 0, y: 0 };
|
|
15581
15598
|
let panelGeom = createBoardOutlineGeom(panel, center, thickness);
|
|
15582
|
-
const
|
|
15583
|
-
const
|
|
15599
|
+
const totalHoleCount = holes.length + platedHoles.length;
|
|
15600
|
+
const segments = drillQuality === "high" ? totalHoleCount > HOLE_COUNT_THRESHOLD ? HIGH_QUALITY_MODE_REDUCED_SEGMENTS : HIGH_QUALITY_MODE_SEGMENTS : totalHoleCount > HOLE_COUNT_THRESHOLD ? REDUCED_QUALITY_MODE_SEGMENTS : DEFAULT_QUALITY_MODE_SEGMENTS;
|
|
15601
|
+
const holeGeoms = createHoleGeoms(
|
|
15602
|
+
center,
|
|
15603
|
+
thickness,
|
|
15604
|
+
holes,
|
|
15605
|
+
platedHoles,
|
|
15606
|
+
segments
|
|
15607
|
+
);
|
|
15608
|
+
const cutoutGeoms = createCutoutGeoms(center, thickness, cutouts, segments);
|
|
15584
15609
|
const subtractGeoms = [...holeGeoms, ...cutoutGeoms];
|
|
15585
15610
|
if (subtractGeoms.length > 0) {
|
|
15586
|
-
|
|
15611
|
+
const unifiedHoles = batchedUnion(subtractGeoms);
|
|
15612
|
+
panelGeom = (0, import_booleans3.subtract)(panelGeom, unifiedHoles);
|
|
15587
15613
|
}
|
|
15588
15614
|
panelGeom = (0, import_transforms3.rotateX)(-Math.PI / 2, panelGeom);
|
|
15589
15615
|
const polygons = geom32.toPolygons(panelGeom);
|
|
@@ -15714,6 +15740,7 @@ async function convertCircuitJsonTo3D(circuitJson, options = {}) {
|
|
|
15714
15740
|
componentColor = "rgba(128,128,128,0.5)",
|
|
15715
15741
|
copperColor = "#C87B4B",
|
|
15716
15742
|
boardThickness = DEFAULT_BOARD_THICKNESS,
|
|
15743
|
+
boardDrillQuality = "fast",
|
|
15717
15744
|
drawFauxBoard = false,
|
|
15718
15745
|
defaultComponentHeight = DEFAULT_COMPONENT_HEIGHT,
|
|
15719
15746
|
renderBoardTextures: shouldRenderTextures = true,
|
|
@@ -15738,7 +15765,8 @@ async function convertCircuitJsonTo3D(circuitJson, options = {}) {
|
|
|
15738
15765
|
thickness: effectiveBoardThickness,
|
|
15739
15766
|
holes: pcbHoles,
|
|
15740
15767
|
platedHoles: pcbPlatedHoles,
|
|
15741
|
-
cutouts: panelCutouts
|
|
15768
|
+
cutouts: panelCutouts,
|
|
15769
|
+
drillQuality: boardDrillQuality
|
|
15742
15770
|
});
|
|
15743
15771
|
const meshWidth = panelMesh.boundingBox.max.x - panelMesh.boundingBox.min.x;
|
|
15744
15772
|
const meshHeight = panelMesh.boundingBox.max.z - panelMesh.boundingBox.min.z;
|
|
@@ -15783,7 +15811,8 @@ async function convertCircuitJsonTo3D(circuitJson, options = {}) {
|
|
|
15783
15811
|
thickness: effectiveBoardThickness,
|
|
15784
15812
|
holes: pcbHoles,
|
|
15785
15813
|
platedHoles: pcbPlatedHoles,
|
|
15786
|
-
cutouts: boardCutouts
|
|
15814
|
+
cutouts: boardCutouts,
|
|
15815
|
+
drillQuality: boardDrillQuality
|
|
15787
15816
|
});
|
|
15788
15817
|
const meshWidth = boardMesh.boundingBox.max.x - boardMesh.boundingBox.min.x;
|
|
15789
15818
|
const meshHeight = boardMesh.boundingBox.max.z - boardMesh.boundingBox.min.z;
|
|
@@ -17570,6 +17599,7 @@ async function convertCircuitJsonToGltf(circuitJson, options = {}) {
|
|
|
17570
17599
|
const {
|
|
17571
17600
|
format = "gltf",
|
|
17572
17601
|
boardTextureResolution = 1024,
|
|
17602
|
+
boardDrillQuality = "fast",
|
|
17573
17603
|
drawFauxBoard = false,
|
|
17574
17604
|
includeModels = true,
|
|
17575
17605
|
modelCache,
|
|
@@ -17579,6 +17609,7 @@ async function convertCircuitJsonToGltf(circuitJson, options = {}) {
|
|
|
17579
17609
|
const scene3D = await convertCircuitJsonTo3D(circuitJson, {
|
|
17580
17610
|
renderBoardTextures: true,
|
|
17581
17611
|
textureResolution: boardTextureResolution,
|
|
17612
|
+
boardDrillQuality,
|
|
17582
17613
|
drawFauxBoard,
|
|
17583
17614
|
coordinateTransform: options.coordinateTransform,
|
|
17584
17615
|
showBoundingBoxes,
|