circuit-json-to-lbrn 0.0.42 → 0.0.44
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/index.d.ts +12 -1
- package/dist/index.js +238 -15
- package/lib/ConvertContext.ts +12 -0
- package/lib/createCopperCutFillForLayer.ts +217 -0
- package/lib/element-handlers/addPcbTrace/index.ts +35 -13
- package/lib/getManifold.ts +31 -0
- package/lib/index.ts +72 -4
- package/package.json +3 -2
- package/site/index.html +24 -1
- package/site/main.tsx +8 -0
- package/tests/basics/__snapshots__/board-outline-does-not-appear-in soldermask.snap.svg +1 -1
- package/tests/basics/__snapshots__/board-outline.snap.svg +1 -1
- package/tests/basics/__snapshots__/mixed-soldermask-margins.snap.svg +1 -1
- package/tests/basics/addPcbCutout/__snapshots__/pcb-cutout-circle.snap.svg +1 -1
- package/tests/basics/addPcbCutout/__snapshots__/pcb-cutout-path.snap.svg +1 -1
- package/tests/basics/addPcbCutout/__snapshots__/pcb-cutout-polygon.snap.svg +1 -1
- package/tests/basics/addPcbCutout/__snapshots__/pcb-cutout-rect.snap.svg +1 -1
- package/tests/basics/addPcbCutout/pcb-cutout-circle.test.ts +1 -1
- package/tests/basics/addPcbCutout/pcb-cutout-path.test.ts +1 -1
- package/tests/basics/addPcbCutout/pcb-cutout-polygon.test.ts +1 -1
- package/tests/basics/addPcbCutout/pcb-cutout-rect.test.ts +1 -1
- package/tests/basics/addPcbHole/__snapshots__/pcb-hole-circle.snap.svg +1 -1
- package/tests/basics/addPcbHole/__snapshots__/pcb-hole-oval.snap.svg +1 -1
- package/tests/basics/addPcbHole/__snapshots__/pcb-hole-pill.snap.svg +1 -1
- package/tests/basics/addPcbHole/__snapshots__/pcb-hole-rect.snap.svg +1 -1
- package/tests/basics/addPcbHole/__snapshots__/pcb-hole-rotated-pill.snap.svg +1 -1
- package/tests/basics/addPcbHole/__snapshots__/pcb-hole-soldermask-margin.snap.svg +1 -1
- package/tests/basics/addPcbHole/__snapshots__/pcb-hole-with-soldermask.snap.svg +1 -1
- package/tests/basics/addPcbHole/pcb-hole-circle.test.ts +1 -1
- package/tests/basics/addPcbHole/pcb-hole-oval.test.ts +1 -1
- package/tests/basics/addPcbHole/pcb-hole-pill.test.ts +1 -1
- package/tests/basics/addPcbHole/pcb-hole-rect.test.ts +1 -1
- package/tests/basics/addPcbHole/pcb-hole-rotated-pill.test.ts +1 -1
- package/tests/basics/addPcbHole/pcb-hole-soldermask-margin.test.ts +1 -1
- package/tests/basics/addPcbHole/pcb-hole-with-soldermask.test.ts +1 -1
- package/tests/basics/addPcbVia/__snapshots__/pcb-via-basic.snap.svg +1 -1
- package/tests/basics/addPcbVia/__snapshots__/pcb-via-with-net.snap.svg +1 -1
- package/tests/basics/addPcbVia/__snapshots__/pcb-via-with-soldermask.snap.svg +1 -1
- package/tests/basics/addPcbVia/pcb-via-basic.test.ts +1 -1
- package/tests/basics/addPcbVia/pcb-via-with-net.test.ts +1 -1
- package/tests/basics/addPcbVia/pcb-via-with-soldermask.test.ts +1 -1
- package/tests/basics/addPlatedHole/__snapshots__/pcb-plated-hole-circular-hole-with-rect-pad.snap.svg +1 -1
- package/tests/basics/addPlatedHole/__snapshots__/pcb-plated-hole-oval.snap.svg +1 -1
- package/tests/basics/addPlatedHole/__snapshots__/pcb-plated-hole-pill-with-rect-pad.snap.svg +1 -1
- package/tests/basics/addPlatedHole/__snapshots__/pcb-plated-hole-pill.snap.svg +1 -1
- package/tests/basics/addPlatedHole/__snapshots__/pcb-plated-hole-polygon.snap.svg +1 -1
- package/tests/basics/addPlatedHole/__snapshots__/pcb-plated-hole-rotated-pill-with-rect-pad.snap.svg +1 -1
- package/tests/basics/addPlatedHole/pcb-plated-hole-circle.test.ts +1 -1
- package/tests/basics/addPlatedHole/pcb-plated-hole-circular-hole-with-rect-pad.test.ts +1 -1
- package/tests/basics/addPlatedHole/pcb-plated-hole-oval.test.ts +1 -1
- package/tests/basics/addPlatedHole/pcb-plated-hole-pill-with-rect-pad.test.ts +1 -1
- package/tests/basics/addPlatedHole/pcb-plated-hole-pill.test.ts +1 -1
- package/tests/basics/addPlatedHole/pcb-plated-hole-polygon.test.ts +1 -1
- package/tests/basics/addPlatedHole/pcb-plated-hole-rotated-pill-with-rect-pad.test.ts +1 -1
- package/tests/basics/addSmtPad/__snapshots__/circleSmtPad.snap.svg +1 -1
- package/tests/basics/addSmtPad/__snapshots__/pillSmtPad.snap.svg +1 -1
- package/tests/basics/addSmtPad/__snapshots__/polygonSmtPad.snap.svg +1 -1
- package/tests/basics/addSmtPad/__snapshots__/rotatedPillSmtPad.snap.svg +1 -1
- package/tests/basics/addSmtPad/__snapshots__/rotatedRectSmtPad.snap.svg +1 -1
- package/tests/basics/addSmtPad/circleSmtPad.test.ts +1 -1
- package/tests/basics/addSmtPad/pillSmtPad.test.ts +1 -1
- package/tests/basics/addSmtPad/polygonSmtPad.test.ts +1 -1
- package/tests/basics/addSmtPad/rotatedPillSmtPad.test.ts +1 -1
- package/tests/basics/addSmtPad/rotatedRectSmtPad.test.ts +1 -1
- package/tests/basics/board-outline-does-not-appear-in soldermask.test.ts +1 -1
- package/tests/basics/board-outline.test.ts +1 -1
- package/tests/basics/copper-cut-fill/__snapshots__/copper-cut-fill-basic.snap.svg +8 -0
- package/tests/basics/copper-cut-fill/__snapshots__/copper-cut-fill-with-pads.snap.svg +8 -0
- package/tests/basics/copper-cut-fill/copper-cut-fill-basic.test.ts +73 -0
- package/tests/basics/copper-cut-fill/copper-cut-fill-with-pads.test.ts +128 -0
- package/tests/basics/keyboard-defaul60/keyboard-both-layer-includeSoldermask.test.ts +1 -1
- package/tests/basics/keyboard-defaul60/keyboard-both-layers.test.ts +1 -1
- package/tests/basics/keyboard-defaul60/keyboard-bottom-layer.test.ts +1 -1
- package/tests/basics/keyboard-defaul60/keyboard-top-layer.test.ts +1 -1
- package/tests/basics/laser-profile.test.ts +4 -4
- package/tests/basics/lga-interconnect.test.ts +1 -1
- package/tests/basics/mixed-soldermask-margins.test.ts +1 -1
- package/tests/basics/single-trace.test.ts +1 -1
- package/tests/basics/soldermask/copper-and-soldermask.test.ts +1 -1
- package/tests/basics/soldermask/copper-only.test.ts +1 -1
- package/tests/basics/soldermask/soldermask-only.test.ts +1 -1
- package/tests/basics/soldermask-margin/__snapshots__/percent-soldermask-margin.snap.svg +1 -1
- package/tests/basics/soldermask-margin/negative-soldermask-margin.test.ts +1 -1
- package/tests/basics/soldermask-margin/percent-soldermask-margin.test.ts +1 -1
- package/tests/basics/soldermask-margin/positive-soldermask-margin.test.ts +1 -1
- package/tests/basics/trace-margin/pico-w-3x5-led-matrix-trace-margin.test.ts +1 -1
- package/tests/basics/trace-margin/trace-margin-basic.test.ts +1 -1
- package/tests/basics/trace-margin/trace-margin-error.test.ts +4 -4
- package/tests/examples/example01/__snapshots__/example01.snap.svg +1 -1
- package/tests/examples/example01/example01.test.ts +1 -1
- package/tests/examples/example02/example02.test.ts +1 -1
- package/tests/examples/example03/example03.test.ts +1 -1
- package/tests/examples/example04/example04.test.ts +1 -1
- package/tests/examples/example05/__snapshots__/example05.snap.svg +1 -0
- package/tests/examples/example05/example05.circuit.json +9562 -0
- package/tests/examples/example05/example05.test.ts +31 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Lazy-load the manifold WASM module
|
|
2
|
+
// Supports both Node.js and browser environments with CDN fallback
|
|
3
|
+
|
|
4
|
+
let manifoldInstance: any = null
|
|
5
|
+
|
|
6
|
+
export const getManifold = async () => {
|
|
7
|
+
if (!manifoldInstance) {
|
|
8
|
+
let ManifoldModule: any
|
|
9
|
+
|
|
10
|
+
// Try Node.js import first (for CLI/tests)
|
|
11
|
+
try {
|
|
12
|
+
const moduleName = "manifold-3d"
|
|
13
|
+
ManifoldModule = (await import(/* @vite-ignore */ moduleName)).default
|
|
14
|
+
} catch {
|
|
15
|
+
// Fallback to CDN for browser environments
|
|
16
|
+
try {
|
|
17
|
+
const cdnUrl =
|
|
18
|
+
"https://cdn.jsdelivr.net/npm/manifold-3d@3.0.0/manifold.js"
|
|
19
|
+
ManifoldModule = (await import(/* @vite-ignore */ cdnUrl)).default
|
|
20
|
+
} catch (cdnError) {
|
|
21
|
+
throw new Error(
|
|
22
|
+
`Failed to load manifold-3d: not available in Node.js or via CDN. ${cdnError}`,
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
manifoldInstance = await ManifoldModule()
|
|
28
|
+
manifoldInstance.setup() // Initialize the JS-friendly API
|
|
29
|
+
}
|
|
30
|
+
return manifoldInstance
|
|
31
|
+
}
|
package/lib/index.ts
CHANGED
|
@@ -16,6 +16,7 @@ import { addPcbHole } from "./element-handlers/addPcbHole"
|
|
|
16
16
|
import { addPcbCutout } from "./element-handlers/addPcbCutout"
|
|
17
17
|
import { createCopperShapesForLayer } from "./createCopperShapesForLayer"
|
|
18
18
|
import { createTraceClearanceAreasForLayer } from "./createTraceClearanceAreasForLayer"
|
|
19
|
+
import { createCopperCutFillForLayer } from "./createCopperCutFillForLayer"
|
|
19
20
|
|
|
20
21
|
export interface ConvertCircuitJsonToLbrnOptions {
|
|
21
22
|
includeSilkscreen?: boolean
|
|
@@ -28,6 +29,17 @@ export interface ConvertCircuitJsonToLbrnOptions {
|
|
|
28
29
|
includeLayers?: Array<"top" | "bottom">
|
|
29
30
|
traceMargin?: number
|
|
30
31
|
laserSpotSize?: number
|
|
32
|
+
/**
|
|
33
|
+
* Whether to generate copper cut fill layers.
|
|
34
|
+
* Creates a ring/band around traces and pads that will be laser cut
|
|
35
|
+
* to remove copper, without cutting into the traces or pads themselves.
|
|
36
|
+
*/
|
|
37
|
+
includeCopperCutFill?: boolean
|
|
38
|
+
/**
|
|
39
|
+
* Margin to expand the copper outline for the cut fill band (in mm).
|
|
40
|
+
* This determines how wide the band of copper removal will be around traces/pads.
|
|
41
|
+
*/
|
|
42
|
+
copperCutFillMargin?: number
|
|
31
43
|
laserProfile?: {
|
|
32
44
|
copper?: {
|
|
33
45
|
speed?: number
|
|
@@ -43,10 +55,10 @@ export interface ConvertCircuitJsonToLbrnOptions {
|
|
|
43
55
|
}
|
|
44
56
|
}
|
|
45
57
|
}
|
|
46
|
-
export const convertCircuitJsonToLbrn = (
|
|
58
|
+
export const convertCircuitJsonToLbrn = async (
|
|
47
59
|
circuitJson: CircuitJson,
|
|
48
60
|
options: ConvertCircuitJsonToLbrnOptions = {},
|
|
49
|
-
): LightBurnProject => {
|
|
61
|
+
): Promise<LightBurnProject> => {
|
|
50
62
|
const db = cju(circuitJson)
|
|
51
63
|
const project = new LightBurnProject({
|
|
52
64
|
appVersion: "1.7.03",
|
|
@@ -63,6 +75,8 @@ export const convertCircuitJsonToLbrn = (
|
|
|
63
75
|
options.globalCopperSoldermaskMarginAdjustment ?? 0
|
|
64
76
|
const solderMaskMarginPercent = options.solderMaskMarginPercent ?? 0
|
|
65
77
|
const laserProfile = options.laserProfile
|
|
78
|
+
const includeCopperCutFill = options.includeCopperCutFill ?? false
|
|
79
|
+
const copperCutFillMargin = options.copperCutFillMargin ?? 0.5
|
|
66
80
|
|
|
67
81
|
// Default laser settings from GitHub issue
|
|
68
82
|
const defaultCopperSettings = {
|
|
@@ -134,6 +148,9 @@ export const convertCircuitJsonToLbrn = (
|
|
|
134
148
|
})
|
|
135
149
|
project.children.push(soldermaskCutSetting)
|
|
136
150
|
|
|
151
|
+
// Track the next available cut setting index
|
|
152
|
+
let nextCutIndex = 4
|
|
153
|
+
|
|
137
154
|
// Create trace clearance cut settings if needed
|
|
138
155
|
let topTraceClearanceAreaCutSetting: CutSetting | undefined
|
|
139
156
|
let bottomTraceClearanceAreaCutSetting: CutSetting | undefined
|
|
@@ -142,7 +159,7 @@ export const convertCircuitJsonToLbrn = (
|
|
|
142
159
|
if (includeLayers.includes("top")) {
|
|
143
160
|
topTraceClearanceAreaCutSetting = new CutSetting({
|
|
144
161
|
type: "Scan",
|
|
145
|
-
index:
|
|
162
|
+
index: nextCutIndex++,
|
|
146
163
|
name: "Clear Top Trace Clearance Areas",
|
|
147
164
|
numPasses: 12,
|
|
148
165
|
speed: 100,
|
|
@@ -157,7 +174,7 @@ export const convertCircuitJsonToLbrn = (
|
|
|
157
174
|
if (includeLayers.includes("bottom")) {
|
|
158
175
|
bottomTraceClearanceAreaCutSetting = new CutSetting({
|
|
159
176
|
type: "Scan",
|
|
160
|
-
index:
|
|
177
|
+
index: nextCutIndex++,
|
|
161
178
|
name: "Clear Bottom Trace Clearance Areas",
|
|
162
179
|
numPasses: 12,
|
|
163
180
|
speed: 100,
|
|
@@ -170,6 +187,42 @@ export const convertCircuitJsonToLbrn = (
|
|
|
170
187
|
}
|
|
171
188
|
}
|
|
172
189
|
|
|
190
|
+
// Create copper cut fill cut settings if needed
|
|
191
|
+
let topCopperCutFillCutSetting: CutSetting | undefined
|
|
192
|
+
let bottomCopperCutFillCutSetting: CutSetting | undefined
|
|
193
|
+
|
|
194
|
+
if (includeCopperCutFill && includeCopper) {
|
|
195
|
+
if (includeLayers.includes("top")) {
|
|
196
|
+
topCopperCutFillCutSetting = new CutSetting({
|
|
197
|
+
type: "Scan",
|
|
198
|
+
index: nextCutIndex++,
|
|
199
|
+
name: "Top Copper Cut Fill",
|
|
200
|
+
numPasses: copperSettings.numPasses,
|
|
201
|
+
speed: copperSettings.speed,
|
|
202
|
+
scanOpt: "individual",
|
|
203
|
+
interval: laserSpotSize,
|
|
204
|
+
angle: 45,
|
|
205
|
+
crossHatch: true,
|
|
206
|
+
})
|
|
207
|
+
project.children.push(topCopperCutFillCutSetting)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (includeLayers.includes("bottom")) {
|
|
211
|
+
bottomCopperCutFillCutSetting = new CutSetting({
|
|
212
|
+
type: "Scan",
|
|
213
|
+
index: nextCutIndex++,
|
|
214
|
+
name: "Bottom Copper Cut Fill",
|
|
215
|
+
numPasses: copperSettings.numPasses,
|
|
216
|
+
speed: copperSettings.speed,
|
|
217
|
+
scanOpt: "individual",
|
|
218
|
+
interval: laserSpotSize,
|
|
219
|
+
angle: 45,
|
|
220
|
+
crossHatch: true,
|
|
221
|
+
})
|
|
222
|
+
project.children.push(bottomCopperCutFillCutSetting)
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
173
226
|
// Build connectivity map and origin
|
|
174
227
|
const connMap = getFullConnectivityMapFromCircuitJson(circuitJson)
|
|
175
228
|
let origin = options.origin
|
|
@@ -201,6 +254,11 @@ export const convertCircuitJsonToLbrn = (
|
|
|
201
254
|
topTraceClearanceAreaCutSetting,
|
|
202
255
|
bottomTraceClearanceAreaCutSetting,
|
|
203
256
|
solderMaskMarginPercent,
|
|
257
|
+
topCopperCutFillCutSetting,
|
|
258
|
+
bottomCopperCutFillCutSetting,
|
|
259
|
+
copperCutFillMargin,
|
|
260
|
+
topTraceEndpoints: new Set(),
|
|
261
|
+
bottomTraceEndpoints: new Set(),
|
|
204
262
|
}
|
|
205
263
|
|
|
206
264
|
// Initialize net geometry maps
|
|
@@ -260,5 +318,15 @@ export const convertCircuitJsonToLbrn = (
|
|
|
260
318
|
}
|
|
261
319
|
}
|
|
262
320
|
|
|
321
|
+
// Create copper cut fill for each layer
|
|
322
|
+
if (includeCopperCutFill && includeCopper) {
|
|
323
|
+
if (includeLayers.includes("top")) {
|
|
324
|
+
await createCopperCutFillForLayer({ layer: "top", ctx })
|
|
325
|
+
}
|
|
326
|
+
if (includeLayers.includes("bottom")) {
|
|
327
|
+
await createCopperCutFillForLayer({ layer: "bottom", ctx })
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
263
331
|
return project
|
|
264
332
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "circuit-json-to-lbrn",
|
|
3
3
|
"main": "dist/index.js",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.44",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"start": "bun run site/index.html",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"typescript": "^5"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"lbrnts": "^0.0.
|
|
31
|
+
"lbrnts": "^0.0.13",
|
|
32
|
+
"manifold-3d": "^3.3.2"
|
|
32
33
|
}
|
|
33
34
|
}
|
package/site/index.html
CHANGED
|
@@ -98,6 +98,19 @@
|
|
|
98
98
|
class="w-full px-4 py-2 bg-gray-700 border border-gray-600 rounded-lg text-white focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
99
99
|
/>
|
|
100
100
|
</div>
|
|
101
|
+
<div>
|
|
102
|
+
<label class="block text-sm font-medium text-gray-300 mb-2">
|
|
103
|
+
Copper Cut Fill Margin (mm)
|
|
104
|
+
</label>
|
|
105
|
+
<input
|
|
106
|
+
type="number"
|
|
107
|
+
id="copperCutFillMargin"
|
|
108
|
+
value="0.5"
|
|
109
|
+
step="0.01"
|
|
110
|
+
class="w-full px-4 py-2 bg-gray-700 border border-gray-600 rounded-lg text-white focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
111
|
+
/>
|
|
112
|
+
<p class="text-xs text-gray-500 mt-1">Ring width around traces/pads for copper removal fill</p>
|
|
113
|
+
</div>
|
|
101
114
|
<div>
|
|
102
115
|
<label class="block text-sm font-medium text-gray-300 mb-2">
|
|
103
116
|
Soldermask Margin (mm)
|
|
@@ -249,7 +262,7 @@
|
|
|
249
262
|
</div>
|
|
250
263
|
</details>
|
|
251
264
|
</div>
|
|
252
|
-
<div class="md:col-span-2 grid grid-cols-1 md:grid-cols-
|
|
265
|
+
<div class="md:col-span-2 grid grid-cols-1 md:grid-cols-4 gap-4">
|
|
253
266
|
<label class="flex items-center cursor-pointer">
|
|
254
267
|
<input
|
|
255
268
|
type="checkbox"
|
|
@@ -261,6 +274,16 @@
|
|
|
261
274
|
Include Copper
|
|
262
275
|
</span>
|
|
263
276
|
</label>
|
|
277
|
+
<label class="flex items-center cursor-pointer">
|
|
278
|
+
<input
|
|
279
|
+
type="checkbox"
|
|
280
|
+
id="includeCopperCutFill"
|
|
281
|
+
class="w-5 h-5 text-blue-500 bg-gray-700 border-gray-600 rounded focus:ring-blue-500 focus:ring-2"
|
|
282
|
+
/>
|
|
283
|
+
<span class="ml-3 text-sm font-medium text-gray-300">
|
|
284
|
+
Include Copper Cut Fill
|
|
285
|
+
</span>
|
|
286
|
+
</label>
|
|
264
287
|
<label class="flex items-center cursor-pointer">
|
|
265
288
|
<input
|
|
266
289
|
type="checkbox"
|
package/site/main.tsx
CHANGED
|
@@ -48,6 +48,12 @@ const laserSpotSizeInput = document.getElementById(
|
|
|
48
48
|
const includeCopperInput = document.getElementById(
|
|
49
49
|
"includeCopper",
|
|
50
50
|
) as HTMLInputElement
|
|
51
|
+
const includeCopperCutFillInput = document.getElementById(
|
|
52
|
+
"includeCopperCutFill",
|
|
53
|
+
) as HTMLInputElement
|
|
54
|
+
const copperCutFillMarginInput = document.getElementById(
|
|
55
|
+
"copperCutFillMargin",
|
|
56
|
+
) as HTMLInputElement
|
|
51
57
|
const includeSoldermaskInput = document.getElementById(
|
|
52
58
|
"includeSoldermask",
|
|
53
59
|
) as HTMLInputElement
|
|
@@ -164,6 +170,8 @@ function getConversionOptions() {
|
|
|
164
170
|
y: parseFloat(originYInput.value) || 0,
|
|
165
171
|
},
|
|
166
172
|
includeCopper: includeCopperInput.checked,
|
|
173
|
+
includeCopperCutFill: includeCopperCutFillInput.checked,
|
|
174
|
+
copperCutFillMargin: parseFloat(copperCutFillMarginInput.value) || 0.5,
|
|
167
175
|
includeSoldermask: includeSoldermaskInput.checked,
|
|
168
176
|
globalCopperSoldermaskMarginAdjustment:
|
|
169
177
|
parseFloat(globalCopperSoldermaskMarginAdjustmentInput.value) || 0,
|
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
<style></style><rect class="boundary" x="0" y="0" fill="#000" width="800" height="600" data-type="pcb_background" data-pcb-layer="global"/><rect class="pcb-boundary" fill="none" stroke="#fff" stroke-width="0.3" x="150" y="50" width="500" height="500" data-type="pcb_boundary" data-pcb-layer="global"/><path class="pcb-board" d="M 150 550 L 650 550 L 650 50 L 150 50 Z" fill="none" stroke="rgba(255, 255, 255, 0.5)" stroke-width="5" data-type="pcb_board" data-pcb-layer="board"/><circle class="pcb-pad" fill="rgb(200, 52, 52)" cx="400" cy="300" r="50" data-type="pcb_smtpad" data-pcb-layer="top"/>
|
|
4
4
|
</g>
|
|
5
5
|
<g transform="translate(0, 600) scale(36.199095022624434, 36.199095022624434) translate(10, 10)">
|
|
6
|
-
<rect x="-10" y="-10" width="22.1" height="22.1" fill="white"/><g transform="matrix(1 0 0 -1 0 2.0999999999999996)"><g transform="matrix(1,0,0,1,0,0)"><clipPath id="clip-
|
|
6
|
+
<rect x="-10" y="-10" width="22.1" height="22.1" fill="white"/><g transform="matrix(1 0 0 -1 0 2.0999999999999996)"><g transform="matrix(1,0,0,1,0,0)"><clipPath id="clip-1768711599583-i48y917cs__stack1"><path d="M 2.1 1.1 L 2.095184726672197 1.1980171403295607 L 2.0807852804032305 1.2950903220161283 L 2.056940335732209 1.3902846772544624 L 2.0238795325112866 1.48268343236509 L 1.981921264348355 1.5713967368259978 L 1.9314696123025454 1.6555702330196023 L 1.873010453362737 1.7343932841636456 L 1.8071067811865476 1.8071067811865476 L 1.7343932841636456 1.873010453362737 L 1.6555702330196023 1.9314696123025454 L 1.571396736825998 1.981921264348355 L 1.48268343236509 2.0238795325112866 L 1.3902846772544624 2.056940335732209 L 1.2950903220161285 2.0807852804032305 L 1.198017140329561 2.095184726672197 L 1.1 2.1 L 1.0019828596704394 2.095184726672197 L 0.9049096779838719 2.0807852804032305 L 0.8097153227455379 2.056940335732209 L 0.7173165676349104 2.0238795325112866 L 0.6286032631740024 1.981921264348355 L 0.5444297669803981 1.9314696123025454 L 0.4656067158363547 1.8730104533627372 L 0.3928932188134526 1.8071067811865476 L 0.3269895466372631 1.7343932841636456 L 0.26853038769745474 1.6555702330196023 L 0.21807873565164515 1.571396736825998 L 0.17612046748871335 1.48268343236509 L 0.14305966426779126 1.3902846772544626 L 0.11921471959676966 1.2950903220161287 L 0.10481527332780327 1.198017140329561 L 0.10000000000000009 1.1000000000000003 L 0.10481527332780316 1.0019828596704394 L 0.11921471959676966 0.9049096779838717 L 0.14305966426779115 0.809715322745538 L 0.17612046748871324 0.7173165676349105 L 0.21807873565164504 0.6286032631740024 L 0.26853038769745463 0.5444297669803981 L 0.326989546637263 0.4656067158363548 L 0.3928932188134524 0.3928932188134526 L 0.46560671583635427 0.32698954663726343 L 0.5444297669803979 0.26853038769745485 L 0.6286032631740022 0.21807873565164515 L 0.7173165676349098 0.17612046748871357 L 0.8097153227455376 0.14305966426779126 L 0.9049096779838715 0.11921471959676977 L 1.0019828596704397 0.10481527332780316 L 1.0999999999999999 0.10000000000000009 L 1.19801714032956 0.10481527332780316 L 1.2950903220161285 0.11921471959676966 L 1.3902846772544621 0.14305966426779115 L 1.4826834323650901 0.17612046748871346 L 1.5713967368259976 0.21807873565164504 L 1.6555702330196018 0.26853038769745463 L 1.7343932841636458 0.3269895466372632 L 1.8071067811865476 0.3928932188134524 L 1.8730104533627367 0.46560671583635416 L 1.9314696123025454 0.5444297669803979 L 1.981921264348355 0.6286032631740022 L 2.0238795325112866 0.7173165676349097 L 2.056940335732209 0.8097153227455376 L 2.0807852804032305 0.9049096779838713 L 2.095184726672197 1.0019828596704397 L 2.1 1.1 L 2.1 1.1 Z"/></clipPath><g clip-path="url(#clip-1768711599583-i48y917cs__stack1)"><line x1="1.8819090885900998" y1="0.10000000000000009" x2="2.1" y2="0.3180909114099004" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="1.6273506473629429" y1="0.10000000000000009" x2="2.1" y2="0.5726493526370571" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="1.3727922061357856" y1="0.10000000000000009" x2="2.1" y2="0.8272077938642143" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="1.1182337649086285" y1="0.10000000000000009" x2="2.1" y2="1.0817662350913715" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="0.8636753236814712" y1="0.10000000000000009" x2="2.1" y2="1.3363246763185288" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="0.6091168824543141" y1="0.10000000000000009" x2="2.1" y2="1.5908831175456861" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="0.3545584412271572" y1="0.10000000000000009" x2="2.1" y2="1.8454415587728423" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="0.10000000000000009" y1="0.10000000000000031" x2="2.1" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="0.10000000000000009" y1="0.3545584412271576" x2="1.8454415587728428" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="0.10000000000000009" y1="0.6091168824543145" x2="1.590883117545686" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="0.10000000000000009" y1="0.8636753236814715" x2="1.336324676318529" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="0.10000000000000009" y1="1.1182337649086287" x2="1.0817662350913717" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="0.10000000000000009" y1="1.3727922061357856" x2="0.8272077938642147" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="0.10000000000000009" y1="1.6273506473629427" x2="0.5726493526370575" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="0.10000000000000009" y1="1.8819090885901" x2="0.3180909114099002" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="2.1" y1="1.8819090885900998" x2="1.8819090885900998" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="2.1" y1="1.6273506473629427" x2="1.6273506473629429" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="2.1" y1="1.3727922061357856" x2="1.3727922061357858" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="2.1" y1="1.1182337649086282" x2="1.1182337649086285" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="2.1" y1="0.8636753236814709" x2="0.8636753236814714" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="2.1" y1="0.6091168824543141" x2="0.6091168824543147" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="2.1" y1="0.354558441227157" x2="0.3545584412271574" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="2.0999999999999996" y1="0.10000000000000009" x2="0.10000000000000031" y2="2.1" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="1.8454415587728425" y1="0.10000000000000009" x2="0.10000000000000009" y2="1.8454415587728428" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="1.590883117545686" y1="0.10000000000000009" x2="0.10000000000000009" y2="1.5908831175456861" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="1.3363246763185288" y1="0.10000000000000009" x2="0.10000000000000009" y2="1.336324676318529" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="1.0817662350913717" y1="0.10000000000000009" x2="0.10000000000000009" y2="1.081766235091372" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="0.8272077938642146" y1="0.10000000000000009" x2="0.10000000000000009" y2="0.8272077938642147" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="0.5726493526370573" y1="0.10000000000000009" x2="0.10000000000000009" y2="0.5726493526370574" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/><line x1="0.3180909114099002" y1="0.10000000000000009" x2="0.10000000000000009" y2="0.31809091140990026" stroke="#00FF00" stroke-width="0.1" stroke-opacity="0.8"/></g><path d="M 2.1 1.1 L 2.095184726672197 1.1980171403295607 L 2.0807852804032305 1.2950903220161283 L 2.056940335732209 1.3902846772544624 L 2.0238795325112866 1.48268343236509 L 1.981921264348355 1.5713967368259978 L 1.9314696123025454 1.6555702330196023 L 1.873010453362737 1.7343932841636456 L 1.8071067811865476 1.8071067811865476 L 1.7343932841636456 1.873010453362737 L 1.6555702330196023 1.9314696123025454 L 1.571396736825998 1.981921264348355 L 1.48268343236509 2.0238795325112866 L 1.3902846772544624 2.056940335732209 L 1.2950903220161285 2.0807852804032305 L 1.198017140329561 2.095184726672197 L 1.1 2.1 L 1.0019828596704394 2.095184726672197 L 0.9049096779838719 2.0807852804032305 L 0.8097153227455379 2.056940335732209 L 0.7173165676349104 2.0238795325112866 L 0.6286032631740024 1.981921264348355 L 0.5444297669803981 1.9314696123025454 L 0.4656067158363547 1.8730104533627372 L 0.3928932188134526 1.8071067811865476 L 0.3269895466372631 1.7343932841636456 L 0.26853038769745474 1.6555702330196023 L 0.21807873565164515 1.571396736825998 L 0.17612046748871335 1.48268343236509 L 0.14305966426779126 1.3902846772544626 L 0.11921471959676966 1.2950903220161287 L 0.10481527332780327 1.198017140329561 L 0.10000000000000009 1.1000000000000003 L 0.10481527332780316 1.0019828596704394 L 0.11921471959676966 0.9049096779838717 L 0.14305966426779115 0.809715322745538 L 0.17612046748871324 0.7173165676349105 L 0.21807873565164504 0.6286032631740024 L 0.26853038769745463 0.5444297669803981 L 0.326989546637263 0.4656067158363548 L 0.3928932188134524 0.3928932188134526 L 0.46560671583635427 0.32698954663726343 L 0.5444297669803979 0.26853038769745485 L 0.6286032631740022 0.21807873565164515 L 0.7173165676349098 0.17612046748871357 L 0.8097153227455376 0.14305966426779126 L 0.9049096779838715 0.11921471959676977 L 1.0019828596704397 0.10481527332780316 L 1.0999999999999999 0.10000000000000009 L 1.19801714032956 0.10481527332780316 L 1.2950903220161285 0.11921471959676966 L 1.3902846772544621 0.14305966426779115 L 1.4826834323650901 0.17612046748871346 L 1.5713967368259976 0.21807873565164504 L 1.6555702330196018 0.26853038769745463 L 1.7343932841636458 0.3269895466372632 L 1.8071067811865476 0.3928932188134524 L 1.8730104533627367 0.46560671583635416 L 1.9314696123025454 0.5444297669803979 L 1.981921264348355 0.6286032631740022 L 2.0238795325112866 0.7173165676349097 L 2.056940335732209 0.8097153227455376 L 2.0807852804032305 0.9049096779838713 L 2.095184726672197 1.0019828596704397 L 2.1 1.1 L 2.1 1.1 Z" fill="none" stroke="#00FF00" stroke-width="0.1" stroke-linecap="round" stroke-linejoin="round"/></g></g>
|
|
7
7
|
</g>
|
|
8
8
|
</svg>
|
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
<style></style><rect class="boundary" x="0" y="0" fill="#000" width="800" height="600" data-type="pcb_background" data-pcb-layer="global"/><rect class="pcb-boundary" fill="none" stroke="#fff" stroke-width="0.3" x="19.047619047619047" y="157.14285714285717" width="761.9047619047619" height="285.7142857142857" data-type="pcb_boundary" data-pcb-layer="global"/><path class="pcb-board" d="M 19.047619047619047 442.8571428571429 L 780.952380952381 442.8571428571429 L 780.952380952381 157.14285714285717 L 114.28571428571429 157.14285714285717 L 19.047619047619047 252.3809523809524 Z" fill="none" stroke="rgba(255, 255, 255, 0.5)" stroke-width="1.9047619047619049" data-type="pcb_board" data-pcb-layer="board"/><rect class="pcb-pad" fill="rgb(200, 52, 52)" x="190.47619047619048" y="319.0476190476191" width="38.095238095238095" height="57.14285714285714" data-type="pcb_smtpad" data-pcb-layer="top"/><path class="pcb-trace" stroke="rgb(200, 52, 52)" fill="none" d="M 209.52380952380952 347.61904761904765 L 590.4761904761905 347.61904761904765" stroke-width="9.523809523809524" stroke-linecap="round" stroke-linejoin="round" shape-rendering="crispEdges" data-type="pcb_trace" data-pcb-layer="top"/>
|
|
4
4
|
</g>
|
|
5
5
|
<g transform="translate(0, 600) scale(13.333333333333334, 13.333333333333334) translate(10, 10)">
|
|
6
|
-
<rect x="-10" y="-10" width="60" height="35" fill="white"/><g transform="matrix(1 0 0 -1 0 15)"><g transform="matrix(1,0,0,1,0,0)"><path d="M 0 0 L 40 0 L 40 15 L 5 15 L 0 10 L 0 0 L 0 0 Z" fill="none" stroke="#FF0000" stroke-width="0.1"/></g><g transform="matrix(1,0,0,1,0,0)"><path d="M 29.888675552865575 4.75 L 29.8947620560996 4.745933128559396 L 30 4.725 L 30.1052379439004 4.745933128559396 L 30.1944543648263 4.805545635173699 L 30.254066871440603 4.8947620560996 L 30.275 5 L 30.254066871440603 5.105237943900399 L 30.1944543648263 5.1944543648263 L 30.1052379439004 5.254066871440604 L 30 5.275 L 29.8947620560996 5.254066871440604 L 29.888675552865575 5.25 L 11 5.25 L 11 6.5 L 9 6.5 L 9 3.5 L 11 3.5 L 11 4.75 L 29.888675552865575 4.75 L 29.888675552865575 4.75" fill="none" stroke="#000000" stroke-width="0.1"/></g></g>
|
|
6
|
+
<rect x="-10" y="-10" width="60" height="35" fill="white"/><g transform="matrix(1 0 0 -1 0 15)"><g transform="matrix(1,0,0,1,0,0)"><path d="M 0 0 L 40 0 L 40 15 L 5 15 L 0 10 L 0 0 L 0 0 Z" fill="none" stroke="#FF0000" stroke-width="0.1" stroke-linecap="round" stroke-linejoin="round"/></g><g transform="matrix(1,0,0,1,0,0)"><path d="M 29.888675552865575 4.75 L 29.8947620560996 4.745933128559396 L 30 4.725 L 30.1052379439004 4.745933128559396 L 30.1944543648263 4.805545635173699 L 30.254066871440603 4.8947620560996 L 30.275 5 L 30.254066871440603 5.105237943900399 L 30.1944543648263 5.1944543648263 L 30.1052379439004 5.254066871440604 L 30 5.275 L 29.8947620560996 5.254066871440604 L 29.888675552865575 5.25 L 11 5.25 L 11 6.5 L 9 6.5 L 9 3.5 L 11 3.5 L 11 4.75 L 29.888675552865575 4.75 L 29.888675552865575 4.75" fill="none" stroke="#000000" stroke-width="0.1" stroke-linecap="round" stroke-linejoin="round"/></g></g>
|
|
7
7
|
</g>
|
|
8
8
|
</svg>
|