modified kikit script

This commit is contained in:
cpu
2026-05-20 18:03:49 +02:00
parent 7c739130d2
commit b14223904c
33 changed files with 46630 additions and 24262 deletions

View File

@@ -1,24 +1,306 @@
## Panelize the board
# Install kikit
Install `kikit`:
```bash
pipx install --system-site-packages kikit
```
Panelize a finished PCB:
```bash
mkdir -p panel
![Panel](../images/Flow_Controller_panel.png)
# KiKit Fixture Post-Processor
Post-processing script for KiKit panelized PCBs that places any generated panel
inside a fixed CNC fixture coordinate system.
The script:
- Centres the finished panel inside a predefined fixture opening
- Adds mechanical alignment pin holes
- Draws fixture reference geometry
- Moves the complete design so the fixture origin is always at `(0, 0)`
The resulting output is intended for repeatable CNC manufacturing workflows
where drilling, routing, and UV exposure all share the same physical fixture
and machine datum.
---
# Fixture Geometry
## Outer Fixture Frame
| Parameter | Value |
|---|---|
| Width | 200.0 mm |
| Height | 130.0 mm |
## Inner Fixture Opening
| Parameter | Value |
|---|---|
| Width | 153.4 mm |
| Height | 87.0 mm |
The inner opening defines the usable panel area.
The region between the outer frame and inner opening forms the fixture rails.
---
# Alignment Pins
The script inserts four non-plated alignment holes:
- Diameter: `Ø 3.172 mm NPTH`
- Naming: `PIN1``PIN4`
- Positioning: fully user-defined absolute coordinates
This allows:
- deterministic CNC coordinates
- compatibility with existing jigs
- custom asymmetric fixtures
- reuse across multiple panel layouts
---
# Coordinate System
After processing:
- The fixture outer top-left corner is positioned at `(0, 0)`
- All PCB data is translated accordingly
- Every generated panel shares the same global coordinate system
This creates deterministic CAM output suitable for automated tooling and
repeatable fixture-based manufacturing.
---
# Usage
Place `fixture_postprocess.py` next to the source `.kicad_pcb` file and run KiKit:
```bash
kikit panelize \
--layout 'type: grid; rows: 1; cols: 2; space: 0mm' \
--tabs 'type: fixed; width: 48mm; vcount: 1' \
--cuts 'type: mousebites; drill: 1mm; spacing: 1.5mm' \
--post 'origin: tl; script: move_to_origin.py' \
--framing 'type: none' \
../Flow_Controller.kicad_pcb panel/Flow_Controller_Panel.kicad_pcb
-p myPreset.json \
../Flow_Controller.kicad_pcb \
panel/Flow_Controller_Panel.kicad_pcb
```
![Panel](../images/Flow_Controller_panel.png)
---
# Panel Layout Parameters
## Grid Layout
Adjust the panel dimensions using:
```text
rows: <n>
cols: <n>
```
Examples:
- `1×1`
- `1×2`
- `2×2`
The script automatically recalculates centering offsets for the resulting panel size.
---
## Tool Diameter Compensation
The following values should match the routing tool diameter:
```text
space
slotwidth
```
Example:
```text
space: 2.1mm
slotwidth: 2.1mm
```
This is typically equal to the outline routing bit diameter.
---
# Processing Pipeline
The post-processing script performs the following operations:
1. Reads the fully panelized KiKit output
2. Calculates the panel bounding box
3. Calculates the offset required to centre the panel inside the fixture opening
4. Translates the complete board dataset:
- footprints
- tracks
- vias
- zones
- drawings
- board outlines
- substrate geometry
- locked items
5. Places four NPTH alignment pin footprints
6. Draws fixture reference rectangles on the `User.1` layer
7. Repositions the design so the fixture outer top-left corner equals `(0, 0)`
---
# Fixture Visualization
The script draws two rectangles on the `User.1` layer:
- Outer fixture boundary
- Inner fixture opening
These graphics:
- are visible in KiCad
- help verify positioning visually
- are NOT placed on `Edge.Cuts`
- are NOT exported into manufacturing Gerbers or NC drill files
They exist purely as fixture reference geometry.
---
# CNC Workflow
| Operation | File | Purpose |
|---|---|---|
| Drilling | Excellon `.drl` | PCB holes + fixture alignment pins |
| Routing | `Edge.Cuts` Gerber | Board outlines and mousebite tabs |
| UV exposure | Copper Gerbers | Soldermask/alignment registration |
Because all outputs share:
- identical `(0,0)` origin
- identical alignment pin locations
- identical fixture geometry
the PCB can remain mounted in the same physical fixture for the complete process.
No re-alignment or re-fixturing is required between operations.
---
# Alignment Pins
The script inserts four non-plated alignment holes:
- Diameter: `Ø 3.172 mm NPTH`
- Naming: `PIN1``PIN4`
Users may override any coordinate manually.
---
# Default Pin Placement Calculation
For the default fixture dimensions:
```python
OUTER_W_MM = 200.0
OUTER_H_MM = 130.0
INNER_W_MM = 153.4
INNER_H_MM = 87.0
```
the resulting suggested coordinates are:
| Pin | X (mm) | Y (mm) |
|---|---|---|
| PIN1 (top) | 100.0 | 10.75 |
| PIN2 (right) | 188.35 | 65.0 |
| PIN3 (bottom) | 100.0 | 119.25 |
| PIN4 (left) | 11.65 | 65.0 |
---
# Fixture Configuration
Edit the constants at the top of `fixture_postprocess.py`:
```python
# ============================================================
# Fixture geometry
# ============================================================
OUTER_W_MM = 200.0
OUTER_H_MM = 130.0
INNER_W_MM = 153.4
INNER_H_MM = 87.0
# ============================================================
# Alignment pins
# Absolute fixture-space coordinates in millimetres
# ============================================================
PIN_DIAMETER_MM = 3.172
# Suggested defaults:
# top = centered in top rail
# right = centered in right rail
# bottom = centered in bottom rail
# left = centered in left rail
PIN1_X_MM = 100.0
PIN1_Y_MM = 10.75
PIN2_X_MM = 188.35
PIN2_Y_MM = 65.0
PIN3_X_MM = 100.0
PIN3_Y_MM = 119.25
PIN4_X_MM = 11.65
PIN4_Y_MM = 65.0
```
These values may be adjusted freely without changing the placement logic.
---
# Design Constraints
The generated panel must fit completely inside the inner fixture opening.
If the panel exceeds the available space, the script emits:
```text
WARNING: panel … is larger than the inner opening
```
Possible solutions:
- reduce `rows`
- reduce `cols`
- reduce KiKit frame width
- reduce spacing
- use a smaller PCB design
---
# Intended Use Case
This workflow is intended for:
- CNC isolation milling
- UV mask alignment systems
- repeatable prototyping fixtures
- hybrid PCB manufacturing workflows
- automated or semi-automated PCB handling
The primary design goal is deterministic panel placement independent of PCB size.
## Exporting gcode files from KiCad

Binary file not shown.

View File

@@ -0,0 +1,232 @@
import math
import pcbnew
from shapely.affinity import translate
# ============================================================
# Fixture geometry
# ============================================================
OUTER_W_MM = 200.0
OUTER_H_MM = 130.0
INNER_W_MM = 153.4
INNER_H_MM = 87.0
INNER_X_MM = (OUTER_W_MM - INNER_W_MM) / 2 # 23.3
INNER_Y_MM = (OUTER_H_MM - INNER_H_MM) / 2 # 21.5
# ============================================================
# Alignment pins
# Absolute fixture-space coordinates in millimetres
# ============================================================
PIN_DIAMETER_MM = 3.172
# Suggested defaults:
# top = centered in top rail
# right = centered in right rail
# bottom = centered in bottom rail
# left = centered in left rail
PIN1_X_MM = 100.0
PIN1_Y_MM = 10.75
PIN2_X_MM = 188.35
PIN2_Y_MM = 65.0
PIN3_X_MM = 100.0
PIN3_Y_MM = 119.25
PIN4_X_MM = 11.65
PIN4_Y_MM = 65.0
# KiCad internal unit: 1 mm = 1 000 000 nm
MM = 1_000_000
def mm(v: float) -> int:
"""Convert mm float to KiCad internal units (nm)."""
return int(round(v * MM))
def _move_all(panel, dx_nm: int, dy_nm: int) -> None:
"""Translate every object on the board by (dx_nm, dy_nm)."""
vec = pcbnew.VECTOR2I(dx_nm, dy_nm)
for fp in panel.board.GetFootprints():
fp.Move(vec)
for track in panel.board.GetTracks():
track.Move(vec)
for drawing in panel.board.GetDrawings():
drawing.Move(vec)
for zone in panel.board.Zones():
zone.Move(vec)
# Keep the Shapely substrate in sync
panel.boardSubstrate.substrates = translate(
panel.boardSubstrate.substrates,
xoff=dx_nm,
yoff=dy_nm,
)
def _edge_cuts_bbox(panel):
"""Return (minx, miny, maxx, maxy) in nm from the Shapely substrate."""
return panel.boardSubstrate.substrates.bounds # already in nm
def _draw_rect(board, layer, x0_nm, y0_nm, x1_nm, y1_nm, width_nm=None):
"""Draw an axis-aligned rectangle on *layer* using four PCB_SHAPE lines."""
if width_nm is None:
width_nm = mm(0.1) # 0.1 mm line width thin reference line
corners = [
(x0_nm, y0_nm), (x1_nm, y0_nm),
(x1_nm, y1_nm), (x0_nm, y1_nm),
]
for i in range(4):
seg = pcbnew.PCB_SHAPE(board)
seg.SetShape(pcbnew.SHAPE_T_SEGMENT)
seg.SetLayer(layer)
seg.SetWidth(width_nm)
x_a, y_a = corners[i]
x_b, y_b = corners[(i + 1) % 4]
seg.SetStart(pcbnew.VECTOR2I(x_a, y_a))
seg.SetEnd(pcbnew.VECTOR2I(x_b, y_b))
board.Add(seg)
def _draw_circle(board, layer, cx_nm, cy_nm, r_nm, width_nm=None):
"""Draw a circle on *layer*."""
if width_nm is None:
width_nm = mm(0.1)
circ = pcbnew.PCB_SHAPE(board)
circ.SetShape(pcbnew.SHAPE_T_CIRCLE)
circ.SetLayer(layer)
circ.SetWidth(width_nm)
circ.SetCenter(pcbnew.VECTOR2I(cx_nm, cy_nm))
circ.SetEnd(pcbnew.VECTOR2I(cx_nm + r_nm, cy_nm))
board.Add(circ)
def _add_pin_footprint(board, x_nm, y_nm, diameter_mm, index):
"""
Add a non-plated through-hole (NPTH) mounting hole footprint at (x_nm, y_nm).
We create a minimal footprint with a single NPTH pad so that:
• The drill appears in the Excellon output → used for physical alignment pins.
• No copper ring is added.
"""
fp = pcbnew.FOOTPRINT(board)
fp.SetReference(f"PIN{index}")
fp.Reference().SetVisible(False)
fp.SetValue(f"Ø{diameter_mm:.3f}mm NPTH")
fp.Value().SetVisible(False)
fp.SetPosition(pcbnew.VECTOR2I(x_nm, y_nm))
pad = pcbnew.PAD(fp)
pad.SetAttribute(pcbnew.PAD_ATTRIB_NPTH)
pad.SetShape(pcbnew.PAD_SHAPE_CIRCLE)
pad.SetDrillShape(pcbnew.PAD_DRILL_SHAPE_CIRCLE)
d_nm = mm(diameter_mm)
pad.SetSize(pcbnew.VECTOR2I(d_nm, d_nm))
pad.SetDrillSize(pcbnew.VECTOR2I(d_nm, d_nm))
pad.SetLayerSet(pcbnew.LSET.AllCuMask()) # NPTH pads span all Cu layers
pad.SetNumber("")
fp.Add(pad)
board.Add(fp)
# Also draw a circle on Dwgs_User so the pin is visible even without
# the fab/courtyard layers being turned on.
_draw_circle(
board,
pcbnew.Dwgs_User,
x_nm, y_nm,
mm(diameter_mm / 2),
mm(0.1),
)
return fp
# ──────────────────────────────────────────────────────────────
# MAIN ENTRY POINT
# ──────────────────────────────────────────────────────────────
def kikitPostprocess(panel, args):
board = panel.board
# ── Step 1: get current Edge.Cuts bounding box ────────────────────────────
bounds = _edge_cuts_bbox(panel) # (minx, miny, maxx, maxy) in nm
panel_w_nm = bounds[2] - bounds[0]
panel_h_nm = bounds[3] - bounds[1]
panel_w_mm = panel_w_nm / MM
panel_h_mm = panel_h_nm / MM
print(f"[fixture] Panel size: {panel_w_mm:.3f} x {panel_h_mm:.3f} mm")
# ── Step 2: compute where panel top-left should land ─────────────────────
# We want the panel centred inside the inner opening of the fixture.
# Inner opening: top-left is at (INNER_X_MM, INNER_Y_MM) relative to
# the fixture outer top-left.
panel_target_x_mm = INNER_X_MM + (INNER_W_MM - panel_w_mm) / 2
panel_target_y_mm = INNER_Y_MM + (INNER_H_MM - panel_h_mm) / 2
print(f"[fixture] Panel will be placed at ({panel_target_x_mm:.3f}, {panel_target_y_mm:.3f}) mm")
# Warn if the panel is larger than the inner opening (it will still be
# centred but will overlap the frame rails).
if panel_w_mm > INNER_W_MM or panel_h_mm > INNER_H_MM:
print(
f"[fixture] WARNING: panel ({panel_w_mm:.1f}×{panel_h_mm:.1f} mm) "
f"is larger than the inner opening ({INNER_W_MM}×{INNER_H_MM} mm)!"
)
# ── Step 3: move everything so that the panel lands at the target ─────────
# Current panel TL is at (bounds[0], bounds[1]).
# We need to shift by (target - current).
dx_nm = mm(panel_target_x_mm) - bounds[0]
dy_nm = mm(panel_target_y_mm) - bounds[1]
_move_all(panel, int(dx_nm), int(dy_nm))
# ── Step 4: verify final position ────────────────────────────────────────
new_bounds = _edge_cuts_bbox(panel)
print(
f"[fixture] Panel TL after move: "
f"({new_bounds[0]/MM:.3f}, {new_bounds[1]/MM:.3f}) mm"
)
# ── Step 5: draw fixture frame on Dwgs_User ───────────────────────────
# Outer rectangle: (0,0) → (200, 130) mm
_draw_rect(
board, pcbnew.Dwgs_User,
mm(0), mm(0),
mm(OUTER_W_MM), mm(OUTER_H_MM),
mm(0.15),
)
# Inner rectangle: (23.3, 21.5) → (176.7, 108.5) mm
_draw_rect(
board, pcbnew.Dwgs_User,
mm(INNER_X_MM), mm(INNER_Y_MM),
mm(INNER_X_MM + INNER_W_MM), mm(INNER_Y_MM + INNER_H_MM),
mm(0.15),
)
print("[fixture] Fixture frame drawn on Dwgs_User layer.")
# ── Step 6: add alignment pin footprints ──────────────────────────────────
# Place pins at the absolute coordinates defined in the configuration block above
pin_positions_mm = [
(PIN1_X_MM, PIN1_Y_MM, "PIN1 (Top)"),
(PIN2_X_MM, PIN2_Y_MM, "PIN2 (Right)"),
(PIN3_X_MM, PIN3_Y_MM, "PIN3 (Bottom)"),
(PIN4_X_MM, PIN4_Y_MM, "PIN4 (Left)"),
]
for idx, (px_mm, py_mm, label) in enumerate(pin_positions_mm, start=1):
_add_pin_footprint(board, mm(px_mm), mm(py_mm), PIN_DIAMETER_MM, idx)
print(
f"[fixture] {label} placed at "
f"({px_mm:.3f}, {py_mm:.3f}) mm"
)
print("[fixture] Post-processing complete.")

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="418.014" height="221.1" viewBox="0 0 8708.63 4606.25" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<polyline points="1970.1,4028.53 1970.01,4028.52 1969.62,4028.52 1969.55,4028.53" style="stroke:rgb(255,0,0);stroke-width:3.937008;fill:none;stroke-opacity:0.5;stroke-linecap:round;stroke-linejoin:round;;fill:none"/>
<polyline points="1970.1,4028.53 1970.01,4028.52 1969.62,4028.52 1969.55,4028.53" style="stroke:rgb(0,0,0);stroke-width:1px;fill:none;stroke-opacity:1;stroke-linecap:round;stroke-linejoin:round;;fill:none"/>
<polyline points="1969.52,4028.53 1969.62,4028.52 1970.01,4028.52 1970.12,4028.53" style="stroke:rgb(255,0,0);stroke-width:3.937008;fill:none;stroke-opacity:0.5;stroke-linecap:round;stroke-linejoin:round;;fill:none"/>
<polyline points="1969.52,4028.53 1969.62,4028.52 1970.01,4028.52 1970.12,4028.53" style="stroke:rgb(0,0,0);stroke-width:1px;fill:none;stroke-opacity:1;stroke-linecap:round;stroke-linejoin:round;;fill:none"/>
<polyline points="6072.67,4028.57 6072.5,4028.56 6072.37,4028.54 6071.98,4028.53 6071.88,4028.53" style="stroke:rgb(255,0,0);stroke-width:3.937008;fill:none;stroke-opacity:0.5;stroke-linecap:round;stroke-linejoin:round;;fill:none"/>
<polyline points="6072.67,4028.57 6072.5,4028.56 6072.37,4028.54 6071.98,4028.53 6071.88,4028.53" style="stroke:rgb(0,0,0);stroke-width:1px;fill:none;stroke-opacity:1;stroke-linecap:round;stroke-linejoin:round;;fill:none"/>
<polyline points="6071.86,4028.54 6071.98,4028.53 6072.37,4028.54 6072.5,4028.56 6072.7,4028.57" style="stroke:rgb(255,0,0);stroke-width:3.937008;fill:none;stroke-opacity:0.5;stroke-linecap:round;stroke-linejoin:round;;fill:none"/>
<polyline points="6071.86,4028.54 6071.98,4028.53 6072.37,4028.54 6072.5,4028.56 6072.7,4028.57" style="stroke:rgb(0,0,0);stroke-width:1px;fill:none;stroke-opacity:1;stroke-linecap:round;stroke-linejoin:round;;fill:none"/>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="418.014" height="221.1" viewBox="0 0 8708.63 4606.25" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<polyline points="1969.56,4028.53 1970.06,4028.53" style="stroke:rgb(255,0,0);stroke-width:3.937008;fill:none;stroke-opacity:0.5;stroke-linecap:round;stroke-linejoin:round;;fill:none"/>
<polyline points="1969.56,4028.53 1970.06,4028.53" style="stroke:rgb(0,0,0);stroke-width:1px;fill:none;stroke-opacity:1;stroke-linecap:round;stroke-linejoin:round;;fill:none"/>
<polyline points="1970.06,4028.53 1969.56,4028.53" style="stroke:rgb(255,0,0);stroke-width:3.937008;fill:none;stroke-opacity:0.5;stroke-linecap:round;stroke-linejoin:round;;fill:none"/>
<polyline points="1970.06,4028.53 1969.56,4028.53" style="stroke:rgb(0,0,0);stroke-width:1px;fill:none;stroke-opacity:1;stroke-linecap:round;stroke-linejoin:round;;fill:none"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -20,235 +20,346 @@ G0 Z2.00000
G04 P1.00000
G1 F500.00000
G0 X4.60000 Y-4.60000
G0 X0.00000 Y-10.75000
G1 Z-2.20000
G1 Z2.00000
G0 X12.15400 Y-6.09600
G0 X29.05000 Y-40.20000
G1 Z-2.20000
G1 Z2.00000
G0 X14.69400 Y-6.09600
G0 X28.05000 Y-40.20000
G1 Z-2.20000
G1 Z2.00000
G0 X17.23400 Y-6.09600
G0 X27.05000 Y-40.20000
G1 Z-2.20000
G1 Z2.00000
G0 X5.45000 Y-13.00000
G0 X26.05000 Y-40.20000
G1 Z-2.20000
G1 Z2.00000
G0 X5.45000 Y-15.50000
G0 X25.05000 Y-40.20000
G1 Z-2.20000
G1 Z2.00000
G0 X5.45000 Y-18.00000
G0 X24.05000 Y-40.20000
G1 Z-2.20000
G1 Z2.00000
G0 X4.60000 Y-45.40000
G0 X23.05000 Y-40.20000
G1 Z-2.20000
G1 Z2.00000
G0 X20.00000 Y-44.91800
G0 X20.36700 Y-45.14700
G1 Z-2.20000
G1 Z2.00000
G0 X20.00000 Y-42.41800
G0 X14.13000 Y-45.55000
G1 Z-2.20000
G1 Z2.00000
G0 X20.00000 Y-39.91800
G0 X11.59000 Y-45.55000
G1 Z-2.20000
G1 Z2.00000
G0 X32.15000 Y-29.42500
G0 X9.05000 Y-45.55000
G1 Z-2.20000
G1 Z2.00000
G0 X32.25000 Y-25.67500
G0 X4.05000 Y-43.00000
G1 Z-2.20000
G1 Z2.00000
G0 X42.63400 Y-16.12000
G0 X-4.05000 Y-43.00000
G1 Z-2.20000
G1 Z2.00000
G0 X42.63400 Y-18.66000
G0 X-8.84800 Y-45.17900
G1 Z-2.20000
G1 Z2.00000
G0 X42.63400 Y-21.20000
G0 X-8.41600 Y-56.12000
G1 Z-2.20000
G1 Z2.00000
G0 X42.63400 Y-23.74000
G0 X-8.41600 Y-58.66000
G1 Z-2.20000
G1 Z2.00000
G0 X42.63400 Y-26.28000
G0 X-8.41600 Y-61.20000
G1 Z-2.20000
G1 Z2.00000
G0 X42.63400 Y-28.82000
G0 X-8.41600 Y-63.74000
G1 Z-2.20000
G1 Z2.00000
G0 X42.63400 Y-31.36000
G0 X-8.41600 Y-66.28000
G1 Z-2.20000
G1 Z2.00000
G0 X42.63400 Y-33.90000
G0 X-8.41600 Y-68.82000
G1 Z-2.20000
G1 Z2.00000
G0 X45.40000 Y-45.40000
G0 X-8.41600 Y-71.36000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-48.00000
G0 X-1.25000 Y-62.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-46.46700
G0 X-1.25000 Y-63.00000
G1 Z-2.20000
G1 Z2.00000
G0 X54.60000 Y-45.40000
G0 X-1.25000 Y-64.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-44.93300
G0 X-1.25000 Y-65.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-43.40000
G0 X-1.25000 Y-66.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-41.86700
G0 X-1.25000 Y-67.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-40.33300
G0 X-8.41600 Y-73.90000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-38.80000
G0 X-18.90000 Y-69.42500
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-37.26700
G0 X-18.80000 Y-65.67500
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-35.73300
G0 X-31.73300 Y-45.14700
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-34.20000
G0 X-23.05000 Y-40.20000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-32.66700
G0 X-24.05000 Y-40.20000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-31.13300
G0 X-25.05000 Y-40.20000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-29.60000
G0 X-26.05000 Y-40.20000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-28.06700
G0 X-27.05000 Y-40.20000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-26.53300
G0 X-28.05000 Y-40.20000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-25.00000
G0 X-29.05000 Y-40.20000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-23.46700
G0 X-37.97000 Y-45.55000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-21.93300
G0 X-40.51000 Y-45.55000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-20.40000
G0 X-45.60000 Y-53.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-18.86700
G0 X-45.60000 Y-55.50000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-17.33300
G0 X-43.05000 Y-45.55000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-15.80000
G0 X-48.05000 Y-43.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-14.26700
G0 X-88.35000 Y-65.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-12.73300
G0 X-50.85000 Y-62.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-11.20000
G0 X-45.60000 Y-58.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-9.66700
G0 X-50.85000 Y-63.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-8.13300
G0 X-50.85000 Y-64.00000
G1 Z-2.20000
G1 Z2.00000
G0 X45.40000 Y-4.60000
G0 X-50.85000 Y-65.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-6.60000
G0 X-50.85000 Y-66.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-5.06700
G0 X-50.85000 Y-67.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-3.53300
G0 X-50.85000 Y-68.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.00000 Y-2.00000
G0 X-45.65000 Y-73.85000
G1 Z-2.20000
G1 Z2.00000
G0 X54.60000 Y-4.60000
G0 X-45.65000 Y-76.35000
G1 Z-2.20000
G1 Z2.00000
G0 X62.15400 Y-6.09600
G0 X-45.65000 Y-78.85000
G1 Z-2.20000
G1 Z2.00000
G0 X64.69400 Y-6.09600
G0 X-48.05000 Y-87.00000
G1 Z-2.20000
G1 Z2.00000
G0 X67.23400 Y-6.09600
G0 X-31.78400 Y-84.82200
G1 Z-2.20000
G1 Z2.00000
G0 X55.45000 Y-13.00000
G0 X-29.05000 Y-89.80000
G1 Z-2.20000
G1 Z2.00000
G0 X55.45000 Y-15.50000
G0 X-28.05000 Y-89.80000
G1 Z-2.20000
G1 Z2.00000
G0 X55.45000 Y-18.00000
G0 X-27.05000 Y-89.80000
G1 Z-2.20000
G1 Z2.00000
G0 X70.00000 Y-39.91800
G0 X-26.05000 Y-89.80000
G1 Z-2.20000
G1 Z2.00000
G0 X70.00000 Y-42.41800
G0 X-25.05000 Y-89.80000
G1 Z-2.20000
G1 Z2.00000
G0 X70.00000 Y-44.91800
G0 X-24.05000 Y-89.80000
G1 Z-2.20000
G1 Z2.00000
G0 X95.40000 Y-45.40000
G0 X-23.05000 Y-89.80000
G1 Z-2.20000
G1 Z2.00000
G0 X92.63400 Y-33.90000
G0 X-8.92400 Y-84.84700
G1 Z-2.20000
G1 Z2.00000
G0 X92.63400 Y-31.36000
G0 X-4.05000 Y-87.00000
G1 Z-2.20000
G1 Z2.00000
G0 X92.63400 Y-28.82000
G0 X4.05000 Y-87.00000
G1 Z-2.20000
G1 Z2.00000
G0 X92.63400 Y-26.28000
G0 X6.45000 Y-78.85000
G1 Z-2.20000
G1 Z2.00000
G0 X82.25000 Y-25.67500
G0 X6.45000 Y-76.35000
G1 Z-2.20000
G1 Z2.00000
G0 X82.15000 Y-29.42500
G0 X6.45000 Y-73.85000
G1 Z-2.20000
G1 Z2.00000
G0 X92.63400 Y-23.74000
G0 X1.25000 Y-68.00000
G1 Z-2.20000
G1 Z2.00000
G0 X92.63400 Y-21.20000
G0 X-1.25000 Y-68.00000
G1 Z-2.20000
G1 Z2.00000
G0 X92.63400 Y-18.66000
G0 X1.25000 Y-67.00000
G1 Z-2.20000
G1 Z2.00000
G0 X92.63400 Y-16.12000
G0 X1.25000 Y-66.00000
G1 Z-2.20000
G1 Z2.00000
G0 X95.40000 Y-4.60000
G0 X1.25000 Y-65.00000
G1 Z-2.20000
G1 Z2.00000
G0 X1.25000 Y-64.00000
G1 Z-2.20000
G1 Z2.00000
G0 X1.25000 Y-63.00000
G1 Z-2.20000
G1 Z2.00000
G0 X1.25000 Y-62.00000
G1 Z-2.20000
G1 Z2.00000
G0 X6.50000 Y-58.00000
G1 Z-2.20000
G1 Z2.00000
G0 X6.50000 Y-55.50000
G1 Z-2.20000
G1 Z2.00000
G0 X6.50000 Y-53.00000
G1 Z-2.20000
G1 Z2.00000
G0 X33.30000 Y-65.67500
G1 Z-2.20000
G1 Z2.00000
G0 X33.20000 Y-69.42500
G1 Z-2.20000
G1 Z2.00000
G0 X20.31600 Y-84.82200
G1 Z-2.20000
G1 Z2.00000
G0 X23.05000 Y-89.80000
G1 Z-2.20000
G1 Z2.00000
G0 X24.05000 Y-89.80000
G1 Z-2.20000
G1 Z2.00000
G0 X25.05000 Y-89.80000
G1 Z-2.20000
G1 Z2.00000
G0 X26.05000 Y-89.80000
G1 Z-2.20000
G1 Z2.00000
G0 X27.05000 Y-89.80000
G1 Z-2.20000
G1 Z2.00000
G0 X0.00000 Y-119.25000
G1 Z-2.20000
G1 Z2.00000
G0 X28.05000 Y-89.80000
G1 Z-2.20000
G1 Z2.00000
G0 X29.05000 Y-89.80000
G1 Z-2.20000
G1 Z2.00000
G0 X43.17600 Y-84.84700
G1 Z-2.20000
G1 Z2.00000
G0 X48.05000 Y-87.00000
G1 Z-2.20000
G1 Z2.00000
G0 X43.68400 Y-73.90000
G1 Z-2.20000
G1 Z2.00000
G0 X43.68400 Y-71.36000
G1 Z-2.20000
G1 Z2.00000
G0 X43.68400 Y-68.82000
G1 Z-2.20000
G1 Z2.00000
G0 X43.68400 Y-66.28000
G1 Z-2.20000
G1 Z2.00000
G0 X43.68400 Y-63.74000
G1 Z-2.20000
G1 Z2.00000
G0 X50.85000 Y-68.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.85000 Y-67.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.85000 Y-66.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.85000 Y-65.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.85000 Y-64.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.85000 Y-63.00000
G1 Z-2.20000
G1 Z2.00000
G0 X50.85000 Y-62.00000
G1 Z-2.20000
G1 Z2.00000
G0 X43.68400 Y-61.20000
G1 Z-2.20000
G1 Z2.00000
G0 X43.68400 Y-58.66000
G1 Z-2.20000
G1 Z2.00000
G0 X43.68400 Y-56.12000
G1 Z-2.20000
G1 Z2.00000
G0 X43.25200 Y-45.17900
G1 Z-2.20000
G1 Z2.00000
G0 X48.05000 Y-43.00000
G1 Z-2.20000
G1 Z2.00000
G0 X88.35000 Y-65.00000
G1 Z-2.20000
G1 Z2.00000

View File

@@ -1,84 +1,121 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="394.205" height="205.228" viewBox="0 0 8212.6 4275.59" version="1.1"
<svg width="418.014" height="221.1" viewBox="0 0 8708.63 4606.25" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<circle cx="7681.1" cy="531.496" r="37.4016" style=""/>
<circle cx="7086.3" cy="649.291" r="37.4016" style=""/>
<circle cx="6886.3" cy="649.291" r="37.4016" style=""/>
<circle cx="6686.3" cy="649.291" r="37.4016" style=""/>
<circle cx="7614.17" cy="1192.91" r="37.4016" style=""/>
<circle cx="7614.17" cy="1389.76" r="37.4016" style=""/>
<circle cx="7614.17" cy="1586.61" r="37.4016" style=""/>
<circle cx="7681.1" cy="3744.09" r="37.4016" style=""/>
<circle cx="6468.5" cy="3706.14" r="37.4016" style=""/>
<circle cx="6468.5" cy="3509.29" r="37.4016" style=""/>
<circle cx="6468.5" cy="3312.44" r="37.4016" style=""/>
<circle cx="5511.81" cy="2486.22" r="37.4016" style=""/>
<circle cx="5503.94" cy="2190.94" r="37.4016" style=""/>
<circle cx="4686.3" cy="1438.58" r="37.4016" style=""/>
<circle cx="4686.3" cy="1638.58" r="37.4016" style=""/>
<circle cx="4686.3" cy="1838.58" r="37.4016" style=""/>
<circle cx="4686.3" cy="2038.58" r="37.4016" style=""/>
<circle cx="4686.3" cy="2238.58" r="37.4016" style=""/>
<circle cx="4686.3" cy="2438.58" r="37.4016" style=""/>
<circle cx="4686.3" cy="2638.58" r="37.4016" style=""/>
<circle cx="4686.3" cy="2838.58" r="37.4016" style=""/>
<circle cx="4468.5" cy="3744.09" r="37.4016" style=""/>
<circle cx="4106.3" cy="3948.82" r="37.4016" style=""/>
<circle cx="4106.3" cy="3828.11" r="37.4016" style=""/>
<circle cx="3744.09" cy="3744.09" r="37.4016" style=""/>
<circle cx="4106.3" cy="3707.32" r="37.4016" style=""/>
<circle cx="4106.3" cy="3586.61" r="37.4016" style=""/>
<circle cx="4106.3" cy="3465.91" r="37.4016" style=""/>
<circle cx="4106.3" cy="3345.12" r="37.4016" style=""/>
<circle cx="4106.3" cy="3224.41" r="37.4016" style=""/>
<circle cx="4106.3" cy="3103.7" r="37.4016" style=""/>
<circle cx="4106.3" cy="2982.91" r="37.4016" style=""/>
<circle cx="4106.3" cy="2862.2" r="37.4016" style=""/>
<circle cx="4106.3" cy="2741.5" r="37.4016" style=""/>
<circle cx="4106.3" cy="2620.71" r="37.4016" style=""/>
<circle cx="4106.3" cy="2500" r="37.4016" style=""/>
<circle cx="4106.3" cy="2379.29" r="37.4016" style=""/>
<circle cx="4106.3" cy="2258.5" r="37.4016" style=""/>
<circle cx="4106.3" cy="2137.8" r="37.4016" style=""/>
<circle cx="4106.3" cy="2017.09" r="37.4016" style=""/>
<circle cx="4106.3" cy="1896.3" r="37.4016" style=""/>
<circle cx="4106.3" cy="1775.59" r="37.4016" style=""/>
<circle cx="4106.3" cy="1654.88" r="37.4016" style=""/>
<circle cx="4106.3" cy="1534.09" r="37.4016" style=""/>
<circle cx="4106.3" cy="1413.39" r="37.4016" style=""/>
<circle cx="4106.3" cy="1292.68" r="37.4016" style=""/>
<circle cx="4106.3" cy="1171.89" r="37.4016" style=""/>
<circle cx="4106.3" cy="1051.18" r="37.4016" style=""/>
<circle cx="4106.3" cy="930.472" r="37.4016" style=""/>
<circle cx="4106.3" cy="809.685" r="37.4016" style=""/>
<circle cx="4468.5" cy="531.496" r="37.4016" style=""/>
<circle cx="4106.3" cy="688.976" r="37.4016" style=""/>
<circle cx="4106.3" cy="568.268" r="37.4016" style=""/>
<circle cx="4106.3" cy="447.48" r="37.4016" style=""/>
<circle cx="4106.3" cy="326.772" r="37.4016" style=""/>
<circle cx="3744.09" cy="531.496" r="37.4016" style=""/>
<circle cx="3149.29" cy="649.291" r="37.4016" style=""/>
<circle cx="2949.29" cy="649.291" r="37.4016" style=""/>
<circle cx="2749.29" cy="649.291" r="37.4016" style=""/>
<circle cx="3677.17" cy="1192.91" r="37.4016" style=""/>
<circle cx="3677.17" cy="1389.76" r="37.4016" style=""/>
<circle cx="3677.17" cy="1586.61" r="37.4016" style=""/>
<circle cx="2531.5" cy="3312.44" r="37.4016" style=""/>
<circle cx="2531.5" cy="3509.29" r="37.4016" style=""/>
<circle cx="2531.5" cy="3706.14" r="37.4016" style=""/>
<circle cx="531.496" cy="3744.09" r="37.4016" style=""/>
<circle cx="749.291" cy="2838.58" r="37.4016" style=""/>
<circle cx="749.291" cy="2638.58" r="37.4016" style=""/>
<circle cx="749.291" cy="2438.58" r="37.4016" style=""/>
<circle cx="749.291" cy="2238.58" r="37.4016" style=""/>
<circle cx="1566.93" cy="2190.94" r="37.4016" style=""/>
<circle cx="1574.8" cy="2486.22" r="37.4016" style=""/>
<circle cx="749.291" cy="2038.58" r="37.4016" style=""/>
<circle cx="749.291" cy="1838.58" r="37.4016" style=""/>
<circle cx="749.291" cy="1638.58" r="37.4016" style=""/>
<circle cx="749.291" cy="1438.58" r="37.4016" style=""/>
<circle cx="531.496" cy="531.496" r="37.4016" style=""/>
<circle cx="4354.33" cy="-1968.53" r="37.4016" style=""/>
<circle cx="2066.93" cy="350.371" r="37.4016" style=""/>
<circle cx="2145.67" cy="350.371" r="37.4016" style=""/>
<circle cx="2224.41" cy="350.371" r="37.4016" style=""/>
<circle cx="2303.15" cy="350.371" r="37.4016" style=""/>
<circle cx="2381.89" cy="350.371" r="37.4016" style=""/>
<circle cx="2460.63" cy="350.371" r="37.4016" style=""/>
<circle cx="2539.37" cy="350.371" r="37.4016" style=""/>
<circle cx="2750.63" cy="739.899" r="37.4016" style=""/>
<circle cx="3241.73" cy="771.631" r="37.4016" style=""/>
<circle cx="3441.73" cy="771.631" r="37.4016" style=""/>
<circle cx="3641.73" cy="771.631" r="37.4016" style=""/>
<circle cx="4035.43" cy="570.844" r="37.4016" style=""/>
<circle cx="4673.23" cy="570.844" r="37.4016" style=""/>
<circle cx="5051.02" cy="742.419" r="37.4016" style=""/>
<circle cx="5017.01" cy="1603.91" r="37.4016" style=""/>
<circle cx="5017.01" cy="1803.91" r="37.4016" style=""/>
<circle cx="5017.01" cy="2003.91" r="37.4016" style=""/>
<circle cx="5017.01" cy="2203.91" r="37.4016" style=""/>
<circle cx="5017.01" cy="2403.91" r="37.4016" style=""/>
<circle cx="5017.01" cy="2603.91" r="37.4016" style=""/>
<circle cx="5017.01" cy="2803.91" r="37.4016" style=""/>
<circle cx="4452.76" cy="2066.91" r="37.4016" style=""/>
<circle cx="4452.76" cy="2145.65" r="37.4016" style=""/>
<circle cx="4452.76" cy="2224.39" r="37.4016" style=""/>
<circle cx="4452.76" cy="2303.13" r="37.4016" style=""/>
<circle cx="4452.76" cy="2381.87" r="37.4016" style=""/>
<circle cx="4452.76" cy="2460.61" r="37.4016" style=""/>
<circle cx="5017.01" cy="3003.91" r="37.4016" style=""/>
<circle cx="5842.52" cy="2651.55" r="37.4016" style=""/>
<circle cx="5834.65" cy="2356.28" r="37.4016" style=""/>
<circle cx="6852.99" cy="739.899" r="37.4016" style=""/>
<circle cx="6169.29" cy="350.371" r="37.4016" style=""/>
<circle cx="6248.03" cy="350.371" r="37.4016" style=""/>
<circle cx="6326.77" cy="350.371" r="37.4016" style=""/>
<circle cx="6405.51" cy="350.371" r="37.4016" style=""/>
<circle cx="6484.25" cy="350.371" r="37.4016" style=""/>
<circle cx="6562.99" cy="350.371" r="37.4016" style=""/>
<circle cx="6641.73" cy="350.371" r="37.4016" style=""/>
<circle cx="7344.09" cy="771.631" r="37.4016" style=""/>
<circle cx="7544.09" cy="771.631" r="37.4016" style=""/>
<circle cx="7944.88" cy="1358.25" r="37.4016" style=""/>
<circle cx="7944.88" cy="1555.1" r="37.4016" style=""/>
<circle cx="7744.09" cy="771.631" r="37.4016" style=""/>
<circle cx="8137.8" cy="570.844" r="37.4016" style=""/>
<circle cx="11311" cy="2303.13" r="37.4016" style=""/>
<circle cx="8358.27" cy="2066.91" r="37.4016" style=""/>
<circle cx="7944.88" cy="1751.95" r="37.4016" style=""/>
<circle cx="8358.27" cy="2145.65" r="37.4016" style=""/>
<circle cx="8358.27" cy="2224.39" r="37.4016" style=""/>
<circle cx="8358.27" cy="2303.13" r="37.4016" style=""/>
<circle cx="8358.27" cy="2381.87" r="37.4016" style=""/>
<circle cx="8358.27" cy="2460.61" r="37.4016" style=""/>
<circle cx="8358.27" cy="2539.35" r="37.4016" style=""/>
<circle cx="7948.82" cy="2999.98" r="37.4016" style=""/>
<circle cx="7948.82" cy="3196.83" r="37.4016" style=""/>
<circle cx="7948.82" cy="3393.68" r="37.4016" style=""/>
<circle cx="8137.8" cy="4035.41" r="37.4016" style=""/>
<circle cx="6857.01" cy="3863.91" r="37.4016" style=""/>
<circle cx="6641.73" cy="4255.88" r="37.4016" style=""/>
<circle cx="6562.99" cy="4255.88" r="37.4016" style=""/>
<circle cx="6484.25" cy="4255.88" r="37.4016" style=""/>
<circle cx="6405.51" cy="4255.88" r="37.4016" style=""/>
<circle cx="6326.77" cy="4255.88" r="37.4016" style=""/>
<circle cx="6248.03" cy="4255.88" r="37.4016" style=""/>
<circle cx="6169.29" cy="4255.88" r="37.4016" style=""/>
<circle cx="5057.01" cy="3865.88" r="37.4016" style=""/>
<circle cx="4673.23" cy="4035.41" r="37.4016" style=""/>
<circle cx="4035.43" cy="4035.41" r="37.4016" style=""/>
<circle cx="3846.46" cy="3393.68" r="37.4016" style=""/>
<circle cx="3846.46" cy="3196.83" r="37.4016" style=""/>
<circle cx="3846.46" cy="2999.98" r="37.4016" style=""/>
<circle cx="4255.91" cy="2539.35" r="37.4016" style=""/>
<circle cx="4452.76" cy="2539.35" r="37.4016" style=""/>
<circle cx="4255.91" cy="2460.61" r="37.4016" style=""/>
<circle cx="4255.91" cy="2381.87" r="37.4016" style=""/>
<circle cx="4255.91" cy="2303.13" r="37.4016" style=""/>
<circle cx="4255.91" cy="2224.39" r="37.4016" style=""/>
<circle cx="4255.91" cy="2145.65" r="37.4016" style=""/>
<circle cx="4255.91" cy="2066.91" r="37.4016" style=""/>
<circle cx="3842.52" cy="1751.95" r="37.4016" style=""/>
<circle cx="3842.52" cy="1555.1" r="37.4016" style=""/>
<circle cx="3842.52" cy="1358.25" r="37.4016" style=""/>
<circle cx="1732.28" cy="2356.28" r="37.4016" style=""/>
<circle cx="1740.16" cy="2651.55" r="37.4016" style=""/>
<circle cx="2754.65" cy="3863.91" r="37.4016" style=""/>
<circle cx="2539.37" cy="4255.88" r="37.4016" style=""/>
<circle cx="2460.63" cy="4255.88" r="37.4016" style=""/>
<circle cx="2381.89" cy="4255.88" r="37.4016" style=""/>
<circle cx="2303.15" cy="4255.88" r="37.4016" style=""/>
<circle cx="2224.41" cy="4255.88" r="37.4016" style=""/>
<circle cx="4354.33" cy="6574.78" r="37.4016" style=""/>
<circle cx="2145.67" cy="4255.88" r="37.4016" style=""/>
<circle cx="2066.93" cy="4255.88" r="37.4016" style=""/>
<circle cx="954.646" cy="3865.88" r="37.4016" style=""/>
<circle cx="570.866" cy="4035.41" r="37.4016" style=""/>
<circle cx="914.646" cy="3003.91" r="37.4016" style=""/>
<circle cx="914.646" cy="2803.91" r="37.4016" style=""/>
<circle cx="914.646" cy="2603.91" r="37.4016" style=""/>
<circle cx="914.646" cy="2403.91" r="37.4016" style=""/>
<circle cx="914.646" cy="2203.91" r="37.4016" style=""/>
<circle cx="350.394" cy="2539.35" r="37.4016" style=""/>
<circle cx="350.394" cy="2460.61" r="37.4016" style=""/>
<circle cx="350.394" cy="2381.87" r="37.4016" style=""/>
<circle cx="350.394" cy="2303.13" r="37.4016" style=""/>
<circle cx="350.394" cy="2224.39" r="37.4016" style=""/>
<circle cx="350.394" cy="2145.65" r="37.4016" style=""/>
<circle cx="350.394" cy="2066.91" r="37.4016" style=""/>
<circle cx="914.646" cy="2003.91" r="37.4016" style=""/>
<circle cx="914.646" cy="1803.91" r="37.4016" style=""/>
<circle cx="914.646" cy="1603.91" r="37.4016" style=""/>
<circle cx="948.661" cy="742.419" r="37.4016" style=""/>
<circle cx="570.866" cy="570.844" r="37.4016" style=""/>
<circle cx="-2602.36" cy="2303.13" r="37.4016" style=""/>
</svg>

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -20,93 +20,297 @@ G04 P1.00000 (Wait for spindle to get up to speed)
G04 P0 ( dwell for no time -- G64 should not smooth over this point )
G00 Z2.00000 ( retract )
G00 X101.04999 Y-49.99998 ( rapid move to begin. )
G00 X52.00002 Y-90.92517 ( rapid move to begin. )
G01 Z-4.00000 F50.00000 ( plunge. )
G04 P0 ( dwell for no time -- G64 should not smooth over this point )
G01 F400.00000
G01 X101.04996 Y-26.29491
G00 Z0.00000
G01 X101.04996 Y-23.69491
G01 X51.99966 Y-90.71861
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X101.04993 Y0.01016
G01 X101.03891 Y0.15217
G01 X101.00876 Y0.29136
G01 X100.98666 Y0.35911
G01 X100.95588 Y0.43449
G01 X100.88826 Y0.55984
G01 X100.80434 Y0.67490
G01 X100.70559 Y0.77757
G01 X100.64323 Y0.82989
G01 X100.58544 Y0.87163
G01 X100.46210 Y0.94282
G01 X100.35911 Y0.98666
G01 X100.24214 Y1.02169
G01 X100.12189 Y1.04290
G01 X100.00000 Y1.04999
G01 X51.30001 Y1.04999
G01 X51.99938 Y-90.55170
G00 Z0.00000
G01 X48.70001 Y1.04999
G01 X51.99922 Y-90.45729
G01 X51.99921 Y-90.45212
G01 X51.94965 Y-90.54069
G01 X51.90472 Y-90.60924
G01 X51.86050 Y-90.66640
G01 X51.85455 Y-90.67409
G01 X51.79225 Y-90.74211
G01 X51.72425 Y-90.80442
G01 X51.65941 Y-90.85458
G01 X51.64306 Y-90.86530
G01 X51.59085 Y-90.89954
G01 X51.50215 Y-90.94917
G01 X51.57808 Y-90.94930
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X0.00002 Y1.04999
G01 X-0.08133 Y1.04684
G01 X-0.15215 Y1.03891
G01 X-0.29134 Y1.00876
G01 X-0.35908 Y0.98666
G01 X-0.43447 Y0.95588
G01 X-0.55982 Y0.88826
G01 X-0.67488 Y0.80434
G01 X-0.77755 Y0.70559
G01 X-0.82987 Y0.64323
G01 X-0.87160 Y0.58544
G01 X-0.94280 Y0.46210
G01 X-0.98664 Y0.35911
G01 X-1.02167 Y0.24214
G01 X-1.04288 Y0.12189
G01 X-1.04996 Y0.00000
G01 X-1.04994 Y-23.70507
G01 X51.59941 Y-90.94934
G00 Z0.00000
G01 X-1.04994 Y-26.30507
G01 X51.86031 Y-90.94979
G01 X51.97523 Y-90.94998
G01 X51.99885 Y-90.94881
G01 X52.00002 Y-90.92517
G04 P0 ( dwell for no time -- G64 should not smooth over this point )
G00 Z2.00000 ( retract )
G00 X-51.49954 Y-90.94907 ( rapid move to begin. )
G01 Z-4.00000 F50.00000 ( plunge. )
G04 P0 ( dwell for no time -- G64 should not smooth over this point )
G01 F400.00000
G00 Z0.00000
G01 X-51.50760 Y-90.94906
G01 X-51.83861 Y-90.94890
G01 X-51.99881 Y-90.94881
G01 X-51.99881 Y-90.81165
G01 X-51.99881 Y-90.78886
G01 X-51.99881 Y-90.54960
G01 X-51.99881 Y-90.45003
G01 X-51.94631 Y-90.53032
G01 X-51.90694 Y-90.58112
G01 X-51.88938 Y-90.60378
G01 X-51.72091 Y-90.77792
G01 X-51.70116 Y-90.79542
G01 X-51.63076 Y-90.85778
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X-1.04991 Y-50.01014
G01 X-1.03889 Y-50.15215
G01 X-1.00874 Y-50.29134
G01 X-0.98664 Y-50.35908
G01 X-0.95586 Y-50.43447
G01 X-0.88824 Y-50.55982
G01 X-0.80432 Y-50.67488
G01 X-0.70556 Y-50.77755
G01 X-0.64321 Y-50.82987
G01 X-0.58542 Y-50.87160
G01 X-0.46208 Y-50.94277
G01 X-0.35908 Y-50.98664
G01 X-0.24212 Y-51.02167
G01 X-0.12187 Y-51.04285
G01 X0.00002 Y-51.04996
G01 X48.70509 Y-51.04994
G01 X-51.62078 Y-90.86662
G00 Z0.00000
G01 X51.30509 Y-51.04994
G01 X-51.49954 Y-90.94907
G04 P0 ( dwell for no time -- G64 should not smooth over this point )
G00 Z2.00000 ( retract )
G00 X52.00002 Y-39.53165 ( rapid move to begin. )
G01 Z-4.00000 F50.00000 ( plunge. )
G04 P0 ( dwell for no time -- G64 should not smooth over this point )
G01 F400.00000
G00 Z0.00000
G01 X51.99904 Y-39.12963
G01 X51.99885 Y-39.05113
G01 X51.86234 Y-39.05103
G01 X51.82895 Y-39.05101
G01 X51.61072 Y-39.05085
G01 X51.50154 Y-39.05077
G01 X51.58783 Y-39.09875
G01 X51.65565 Y-39.14285
G01 X51.71988 Y-39.19205
G01 X51.75973 Y-39.22776
G01 X51.78013 Y-39.24605
G01 X51.84272 Y-39.31214
G01 X51.85955 Y-39.33333
G01 X51.89933 Y-39.38341
G01 X51.92100 Y-39.41578
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X100.01016 Y-51.04991
G01 X100.11176 Y-51.04397
G01 X100.21232 Y-51.02824
G01 X100.31087 Y-51.00290
G01 X100.40650 Y-50.96805
G01 X100.49832 Y-50.92418
G01 X100.58544 Y-50.87160
G01 X100.66708 Y-50.81082
G01 X100.74244 Y-50.74242
G01 X100.81084 Y-50.66706
G01 X100.87163 Y-50.58542
G01 X100.92420 Y-50.49830
G01 X100.97201 Y-50.39708
G01 X101.00587 Y-50.30112
G01 X101.03030 Y-50.20231
G01 X101.04506 Y-50.10163
G01 X101.04999 Y-49.99998
G01 X51.94434 Y-39.45064
G00 Z0.00000
G01 X51.99679 Y-39.54362
G01 X51.99921 Y-39.54790
G01 X52.00002 Y-39.53165
G04 P0 ( dwell for no time -- G64 should not smooth over this point )
G00 Z2.00000 ( retract )
G00 X-51.49954 Y-39.05087 ( rapid move to begin. )
G01 Z-4.00000 F50.00000 ( plunge. )
G04 P0 ( dwell for no time -- G64 should not smooth over this point )
G01 F400.00000
G00 Z0.00000
G01 X-51.83765 Y-39.05105
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X-51.86302 Y-39.05106
G00 Z0.00000
G01 X-51.99881 Y-39.05113
G01 X-51.99890 Y-39.21225
G01 X-51.99890 Y-39.21325
G01 X-51.99909 Y-39.55031
G01 X-51.91676 Y-39.42809
G01 X-51.90766 Y-39.41773
G01 X-51.84620 Y-39.34777
G01 X-51.82799 Y-39.32705
G01 X-51.68163 Y-39.18700
G01 X-51.65139 Y-39.15806
G01 X-51.63164 Y-39.14290
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X-51.57884 Y-39.10236
G00 Z0.00000
G01 X-51.49954 Y-39.05087
G04 P0 ( dwell for no time -- G64 should not smooth over this point )
G00 Z2.00000 ( retract )
G00 X0.59796 Y-90.94917 ( rapid move to begin. )
G01 Z-4.00000 F50.00000 ( plunge. )
G04 P0 ( dwell for no time -- G64 should not smooth over this point )
G01 F400.00000
G00 Z0.00000
G01 X-0.38604 Y-90.94915
G01 X-0.59840 Y-90.94914
G01 X-0.57576 Y-90.93378
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X-0.43737 Y-90.83987
G00 Z0.00000
G01 X-0.34275 Y-90.76319
G01 X-0.24445 Y-90.66063
G01 X-0.16635 Y-90.55430
G01 X-0.09787 Y-90.42982
G01 X-0.04682 Y-90.29723
G01 X-0.01413 Y-90.15898
G01 X-0.00041 Y-90.01757
G01 X-0.00040 Y-89.77894
G01 X-0.00038 Y-88.78861
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X-0.00022 Y-80.67196
G00 Z0.00000
G01 X-0.00017 Y-78.07196
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X0.00002 Y-68.72635
G01 X0.00095 Y-89.80499
G00 Z0.00000
G01 X0.00096 Y-90.03035
G01 X0.01481 Y-90.17231
G01 X0.04775 Y-90.31107
G01 X0.09918 Y-90.44409
G01 X0.16817 Y-90.56893
G01 X0.25344 Y-90.68323
G01 X0.35341 Y-90.78496
G01 X0.46626 Y-90.87218
G01 X0.59250 Y-90.94598
G01 X0.59796 Y-90.94917
G04 P0 ( dwell for no time -- G64 should not smooth over this point )
G00 Z2.00000 ( retract )
G00 X0.59796 Y-39.05077 ( rapid move to begin. )
G01 Z-4.00000 F50.00000 ( plunge. )
G04 P0 ( dwell for no time -- G64 should not smooth over this point )
G01 F400.00000
G00 Z0.00000
G01 X-0.38717 Y-39.05079
G01 X-0.59916 Y-39.05080
G01 X-0.57714 Y-39.06571
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X-0.43132 Y-39.16444
G00 Z0.00000
G01 X-0.34450 Y-39.23515
G01 X-0.25230 Y-39.33002
G01 X-0.16724 Y-39.44427
G01 X-0.09840 Y-39.56901
G01 X-0.04707 Y-39.70190
G01 X-0.01420 Y-39.84051
G01 X-0.00041 Y-39.98229
G01 X-0.00040 Y-40.22440
G01 X-0.00038 Y-41.21107
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X-0.00022 Y-49.32795
G00 Z0.00000
G01 X-0.00017 Y-51.92795
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X0.00002 Y-61.27361
G01 X0.00095 Y-40.19495
G00 Z0.00000
G01 X0.00096 Y-39.96959
G01 X0.01481 Y-39.82763
G01 X0.04775 Y-39.68887
G01 X0.09918 Y-39.55585
G01 X0.16817 Y-39.43101
G01 X0.25344 Y-39.31671
G01 X0.35341 Y-39.21498
G01 X0.46626 Y-39.12776
G01 X0.59665 Y-39.05154
G01 X0.59796 Y-39.05077
G04 P0 ( dwell for no time -- G64 should not smooth over this point )
G00 Z2.00000 ( retract )
G00 X54.20002 Y-37.91288 ( rapid move to begin. )
G01 Z-4.00000 F50.00000 ( plunge. )
G04 P0 ( dwell for no time -- G64 should not smooth over this point )
G01 F400.00000
G01 X54.19509 Y-37.81123
G01 X54.18033 Y-37.71054
G01 X54.15592 Y-37.61176
G01 X54.12204 Y-37.51580
G01 X54.07904 Y-37.42357
G01 X54.02732 Y-37.33592
G01 X53.96735 Y-37.25372
G01 X53.89969 Y-37.17768
G01 X53.82501 Y-37.10856
G01 X53.74398 Y-37.04699
G01 X53.65737 Y-36.99358
G01 X53.55663 Y-36.94478
G01 X53.46100 Y-36.90998
G01 X53.36245 Y-36.88458
G01 X53.26192 Y-36.86884
G01 X53.16032 Y-36.86292
G01 X1.30565 Y-36.85680
G00 Z0.00000
G01 X-1.29435 Y-36.85649
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X-53.14902 Y-36.85037
G01 X-53.27092 Y-36.85746
G01 X-53.39118 Y-36.87864
G01 X-53.50818 Y-36.91367
G01 X-53.62029 Y-36.96200
G01 X-53.74295 Y-37.03442
G01 X-53.85468 Y-37.12276
G01 X-53.95344 Y-37.22540
G01 X-54.03739 Y-37.34046
G01 X-54.10500 Y-37.46584
G01 X-54.15501 Y-37.59919
G01 X-54.17533 Y-37.67806
G01 X-54.18806 Y-37.74816
G01 X-54.19908 Y-37.89017
G01 X-54.19932 Y-63.69465
G00 Z0.00000
G01 X-54.19935 Y-66.29465
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X-54.19959 Y-92.09913
G01 X-54.19250 Y-92.22102
G01 X-54.17129 Y-92.34129
G01 X-54.13627 Y-92.45826
G01 X-54.08791 Y-92.57038
G01 X-54.01552 Y-92.69303
G01 X-53.97323 Y-92.75039
G01 X-53.92029 Y-92.81226
G01 X-53.81668 Y-92.91000
G01 X-53.70081 Y-92.99280
G01 X-53.57480 Y-93.05920
G01 X-53.50871 Y-93.08582
G01 X-53.43119 Y-93.11068
G01 X-53.29169 Y-93.13949
G01 X-53.14960 Y-93.14914
G01 X-1.30022 Y-93.14935
G00 Z0.00000
G01 X1.29978 Y-93.14936
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X53.14917 Y-93.14957
G01 X53.27106 Y-93.14249
G01 X53.39133 Y-93.12128
G01 X53.50830 Y-93.08625
G01 X53.62041 Y-93.03789
G01 X53.74307 Y-92.96550
G01 X53.85478 Y-92.87716
G01 X53.95351 Y-92.77452
G01 X54.03746 Y-92.65945
G01 X54.07340 Y-92.59791
G01 X54.10924 Y-92.52481
G01 X54.15793 Y-92.39098
G01 X54.18810 Y-92.25176
G01 X54.19913 Y-92.10977
G01 X54.19955 Y-66.31133
G00 Z0.00000
G01 X54.19959 Y-63.71133
G01 Z-4.00000 F50.00000
G01 F400.00000
G01 X54.20002 Y-37.91288
G04 P0 ( dwell for no time -- G64 should not smooth over this point )
G00 Z35.000000 ( retract )

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 189 KiB

After

Width:  |  Height:  |  Size: 211 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 518 B

After

Width:  |  Height:  |  Size: 8.7 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 189 KiB

After

Width:  |  Height:  |  Size: 211 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 1.7 MiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 882 KiB

After

Width:  |  Height:  |  Size: 982 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 52 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 912 KiB

After

Width:  |  Height:  |  Size: 1006 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 231 KiB

After

Width:  |  Height:  |  Size: 280 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 44 KiB

88
scripts/myPreset.json Normal file
View File

@@ -0,0 +1,88 @@
{
"layout": {
"type": "grid",
"rows": 1,
"cols": 2,
"hspace": "2.1mm",
"vspace": "2.1mm"
},
"tabs": {
"type": "fixed",
"hcount": 1,
"vcount": 1,
"hwidth": "3mm",
"vwidth": "3mm"
},
"cuts": {
"type": "mousebites",
"offset": "0.2mm",
"prolong": "0.7mm",
"drill": "0.5mm",
"spacing": "0.8mm"
},
"framing": {
"type": "tightframe",
"copperFill": true,
"slotwidth": "2.1mm",
"mintotalheight": "100mm",
"mintotalwidth": "160mm",
"maxtotalheight": "100mm",
"maxtotalwidth": "160mm"
},
"tooling": {
"type": "plugin",
"code": "tooling_plugin.py.CustomTooling",
"arg": ""
},
"text": {
"type": "simple",
"text": "v1",
"anchor": "mt",
"hoffset": "0mm",
"voffset": "2.5mm",
"orientation": "0deg",
"width": "1.5mm",
"height": "1.5mm",
"hjustify": "center",
"vjustify": "center",
"thickness": "0.3mm",
"layer": "F.SilkS"
},
"copperfill": {
"type": "solid",
"clearance": "0.5mm",
"edgeclearance": "0.5mm",
"layers": "B.Cu"
},
"post": {
"type": "auto",
"copperfill": false,
"reconstructarcs": false,
"millradius": "1mm",
"millradiusouter": "0mm",
"script": "",
"scriptarg": "",
"origin": "tl",
"refillzones": false,
"dimensions": false,
"edgewidth": "0.1mm"
},
"page": {
"type": "inherit",
"anchor": "tl",
"posx": "0mm",
"posy": "0mm",
"width": "1000mm",
"height": "1000mm"
},
"debug": {
"type": "none",
"drawPartitionLines": false,
"drawBackboneLines": false,
"drawboxes": false,
"trace": false,
"deterministic": false,
"drawtabfail": false,
"drawTabFillet": false
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@
"Application": "Pcbnew",
"Version": "9.0.9-9.0.9~ubuntu24.04.1"
},
"CreationDate": "2026-05-16T18:36:28+02:00"
"CreationDate": "2026-05-20T19:29:47+02:00"
},
"GeneralSpecs": {
"ProjectId": {
@@ -14,8 +14,8 @@
"Revision": "rev?"
},
"Size": {
"X": 100.1,
"Y": 50.1
"X": 106.3996,
"Y": 54.2993
},
"LayerNumber": 2,
"BoardThickness": 1.6002,

View File

@@ -1,7 +1,7 @@
M48
; DRILL file {KiCad 9.0.9-9.0.9~ubuntu24.04.1} date 2026-05-16T18:36:28+0200
; DRILL file {KiCad 9.0.9-9.0.9~ubuntu24.04.1} date 2026-05-20T19:29:47+0200
; FORMAT={-:-/ absolute / metric / decimal}
; #@! TF.CreationDate,2026-05-16T18:36:28+02:00
; #@! TF.CreationDate,2026-05-20T19:29:47+02:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,9.0.9-9.0.9~ubuntu24.04.1
; #@! TF.FileFunction,MixedPlating,1,2
FMAT,2
@@ -13,92 +13,135 @@ T2C1.000
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
T3C1.000
; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill
T4C1.000
T4C0.500
; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill
T5C3.200
T5C2.150
; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill
T6C2.700
; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill
T7C3.172
%
G90
G05
T1
X30.0Y-39.918
X30.0Y-42.418
X30.0Y-44.918
X44.55Y-13.0
X44.55Y-15.5
X44.55Y-18.0
X80.0Y-39.918
X80.0Y-42.418
X80.0Y-44.918
X94.55Y-13.0
X94.55Y-15.5
X94.55Y-18.0
X93.5Y-53.0
X93.5Y-55.5
X93.5Y-58.0
X93.55Y-73.85
X93.55Y-76.35
X93.55Y-78.85
X145.6Y-53.0
X145.6Y-55.5
X145.6Y-58.0
X145.65Y-73.85
X145.65Y-76.35
X145.65Y-78.85
T2
X17.75Y-25.675
X17.85Y-29.425
X67.75Y-25.675
X67.85Y-29.425
X66.7Y-65.675
X66.8Y-69.425
X118.8Y-65.675
X118.9Y-69.425
T3
X7.366Y-16.12
X7.366Y-18.66
X7.366Y-21.2
X7.366Y-23.74
X7.366Y-26.28
X7.366Y-28.82
X7.366Y-31.36
X7.366Y-33.9
X32.766Y-6.096
X35.306Y-6.096
X37.846Y-6.096
X57.366Y-16.12
X57.366Y-18.66
X57.366Y-21.2
X57.366Y-23.74
X57.366Y-26.28
X57.366Y-28.82
X57.366Y-31.36
X57.366Y-33.9
X82.766Y-6.096
X85.306Y-6.096
X87.846Y-6.096
X56.316Y-56.12
X56.316Y-58.66
X56.316Y-61.2
X56.316Y-63.74
X56.316Y-66.28
X56.316Y-68.82
X56.316Y-71.36
X56.316Y-73.9
X85.87Y-45.55
X88.41Y-45.55
X90.95Y-45.55
X108.416Y-56.12
X108.416Y-58.66
X108.416Y-61.2
X108.416Y-63.74
X108.416Y-66.28
X108.416Y-68.82
X108.416Y-71.36
X108.416Y-73.9
X137.97Y-45.55
X140.51Y-45.55
X143.05Y-45.55
T4
X50.0Y-2.0
X50.0Y-3.533
X50.0Y-5.067
X50.0Y-6.6
X50.0Y-8.133
X50.0Y-9.667
X50.0Y-11.2
X50.0Y-12.733
X50.0Y-14.267
X50.0Y-15.8
X50.0Y-17.333
X50.0Y-18.867
X50.0Y-20.4
X50.0Y-21.933
X50.0Y-23.467
X50.0Y-25.0
X50.0Y-26.533
X50.0Y-28.067
X50.0Y-29.6
X50.0Y-31.133
X50.0Y-32.667
X50.0Y-34.2
X50.0Y-35.733
X50.0Y-37.267
X50.0Y-38.8
X50.0Y-40.333
X50.0Y-41.867
X50.0Y-43.4
X50.0Y-44.933
X50.0Y-46.467
X50.0Y-48.0
X49.15Y-62.0
X49.15Y-63.0
X49.15Y-64.0
X49.15Y-65.0
X49.15Y-66.0
X49.15Y-67.0
X49.15Y-68.0
X70.95Y-40.2
X70.95Y-89.8
X71.95Y-40.2
X71.95Y-89.8
X72.95Y-40.2
X72.95Y-89.8
X73.95Y-40.2
X73.95Y-89.8
X74.95Y-40.2
X74.95Y-89.8
X75.95Y-40.2
X75.95Y-89.8
X76.95Y-40.2
X76.95Y-89.8
X98.75Y-62.0
X98.75Y-63.0
X98.75Y-64.0
X98.75Y-65.0
X98.75Y-66.0
X98.75Y-67.0
X98.75Y-68.0
X101.25Y-62.0
X101.25Y-63.0
X101.25Y-64.0
X101.25Y-65.0
X101.25Y-66.0
X101.25Y-67.0
X101.25Y-68.0
X123.05Y-40.2
X123.05Y-89.8
X124.05Y-40.2
X124.05Y-89.8
X125.05Y-40.2
X125.05Y-89.8
X126.05Y-40.2
X126.05Y-89.8
X127.05Y-40.2
X127.05Y-89.8
X128.05Y-40.2
X128.05Y-89.8
X129.05Y-40.2
X129.05Y-89.8
X150.85Y-62.0
X150.85Y-63.0
X150.85Y-64.0
X150.85Y-65.0
X150.85Y-66.0
X150.85Y-67.0
X150.85Y-68.0
T5
X4.6Y-4.6
X4.6Y-45.4
X45.4Y-4.6
X45.4Y-45.4
X54.6Y-4.6
X54.6Y-45.4
X95.4Y-4.6
X95.4Y-45.4
X56.748Y-45.179
X56.824Y-84.847
X79.633Y-45.147
X79.684Y-84.822
X108.848Y-45.179
X108.924Y-84.847
X131.733Y-45.147
X131.784Y-84.822
T6
X51.95Y-43.0
X51.95Y-87.0
X95.95Y-43.0
X95.95Y-87.0
X104.05Y-43.0
X104.05Y-87.0
X148.05Y-43.0
X148.05Y-87.0
T7
X11.65Y-65.0
X100.0Y-10.75
X100.0Y-119.25
X188.35Y-65.0
M30

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"board": {
"active_layer": 17,
"active_layer": 0,
"active_layer_preset": "",
"auto_track_width": true,
"hidden_netclasses": [],
@@ -40,7 +40,6 @@
"footprint_references",
"tracks",
"drc_errors",
"drawing_sheet",
"bitmaps",
"pads",
"zones",
@@ -50,7 +49,7 @@
"conflict_shadows",
"shapes"
],
"visible_layers": "00000000_00000000_0fffffff_fffffffe",
"visible_layers": "00000000_00000000_0fffffff_ffffffff",
"zone_display_mode": 0
},
"git": {

View File

@@ -37,9 +37,9 @@
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 0.95,
"height": 1.95,
"width": 1.7
"drill": 0.0,
"height": 0.4,
"width": 1.325
},
"silk_line_width": 0.1524,
"silk_text_italic": false,
@@ -123,7 +123,7 @@
},
"rules": {
"max_error": 0.005,
"min_clearance": 0.3,
"min_clearance": 0.25,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.5,
"min_groove_width": 0.0,
@@ -321,45 +321,29 @@
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": [
{
"netclass": "Board_0-Default",
"pattern": "Board_0-/FLOW_PULSE_MCU"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-+5V"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-GND"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-/SWIO"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-/I2C_SCL"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-/ALARM _CNC"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-unconnected-(J3-#-Pad6)"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-/RAW_SENSOR"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-Net-(Q1-G)"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-/ALARM_TRIGGER"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-/I2C_SDA"
"pattern": "Board_0-/SWIO"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-Net-(J3-UP)"
},
{
"netclass": "Board_0-Default",
@@ -367,7 +351,23 @@
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-Net-(Q1-G)"
"pattern": "Board_0-/I2C_SDA"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-unconnected-(J3-#-Pad6)"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-+3.3V"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-+5V"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-/ALARM _CNC"
},
{
"netclass": "Board_0-Default",
@@ -375,11 +375,19 @@
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-Net-(J3-UP)"
"pattern": "Board_0-/I2C_SCL"
},
{
"netclass": "Board_0-Default",
"pattern": "Board_0-/FLOW_PULSE_MCU"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-GND"
"pattern": "Board_1-/I2C_SCL"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-/RAW_SENSOR"
},
{
"netclass": "Board_1-Default",
@@ -387,20 +395,40 @@
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-/FLOW_PULSE_MCU"
"pattern": "Board_1-Net-(Q1-G)"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-unconnected-(J3-*-Pad5)"
"pattern": "Board_1-GND"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-unconnected-(J3-#-Pad6)"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-+5V"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-/I2C_SDA"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-unconnected-(J3-*-Pad5)"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-/ALARM_TRIGGER"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-/BUTTON_ADC"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-+3.3V"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-Net-(J3-UP)"
@@ -411,27 +439,7 @@
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-/I2C_SCL"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-Net-(Q1-G)"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-/BUTTON_ADC"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-/ALARM_TRIGGER"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-/RAW_SENSOR"
},
{
"netclass": "Board_1-Default",
"pattern": "Board_1-+5V"
"pattern": "Board_1-/FLOW_PULSE_MCU"
}
]
},

130
scripts/tooling_plugin.py Normal file
View File

@@ -0,0 +1,130 @@
from kikit.plugin import ToolingPlugin
import pcbnew
class CustomTooling(ToolingPlugin):
def buildTooling(self, panel):
board = panel.board
# panelBBox() -> (xmin, ymin, xmax, ymax)
xmin, ymin, xmax, ymax = panel.panelBBox()
min_x = pcbnew.ToMM(xmin)
min_y = pcbnew.ToMM(ymin)
max_x = pcbnew.ToMM(xmax)
max_y = pcbnew.ToMM(ymax)
margin_x_mm = 10
margin_y_mm = 2.5
center_x = (min_x + max_x) / 2
center_y = (min_y + max_y) / 2
holes = [
(min_x + margin_x_mm, min_y + margin_y_mm), # top left
(center_x, min_y + margin_y_mm), # top center
(max_x - margin_x_mm, min_y + margin_y_mm), # top right
(min_x + margin_x_mm, max_y - margin_y_mm), # bottom left
(center_x, max_y - margin_y_mm), # bottom center
(max_x - margin_x_mm, max_y - margin_y_mm), # bottom right
]
hole_d = pcbnew.FromMM(3.172)
for x_mm, y_mm in holes:
fp = pcbnew.FOOTPRINT(board)
fp.SetReference("")
pos = pcbnew.VECTOR2I(
pcbnew.FromMM(x_mm),
pcbnew.FromMM(y_mm)
)
fp.SetPosition(pos)
pad = pcbnew.PAD(fp)
pad.SetShape(pcbnew.PAD_SHAPE_CIRCLE)
pad.SetAttribute(pcbnew.PAD_ATTRIB_NPTH)
pad.SetSize(pcbnew.VECTOR2I(hole_d, hole_d))
pad.SetDrillSize(pcbnew.VECTOR2I(hole_d, hole_d))
pad.SetPosition(pos)
fp.Add(pad)
board.Add(fp)
# =========================
# SCREEN RECTANGLE
# =========================
screen_w = 153.4
screen_h = 87.0
# Panel center
center_x = (min_x + max_x) / 2
center_y = (min_y + max_y) / 2
# Screen rectangle corners
screen_x0 = center_x - (screen_w / 2)
screen_y0 = center_y - (screen_h / 2)
screen_x1 = center_x + (screen_w / 2)
screen_y1 = center_y + (screen_h / 2)
screen = pcbnew.PCB_SHAPE(board)
screen.SetShape(pcbnew.SHAPE_T_RECT)
screen.SetLayer(pcbnew.Dwgs_User)
screen.SetStart(
pcbnew.VECTOR2I(
pcbnew.FromMM(screen_x0),
pcbnew.FromMM(screen_y0)
)
)
screen.SetEnd(
pcbnew.VECTOR2I(
pcbnew.FromMM(screen_x1),
pcbnew.FromMM(screen_y1)
)
)
screen.SetWidth(pcbnew.FromMM(0.2))
board.Add(screen)
# =========================
# FIXTURE RECTANGLE
# =========================
fixture_w = 200.0
fixture_h = 130.0
# Fixture rectangle corners
fixture_x0 = center_x - (fixture_w / 2)
fixture_y0 = center_y - (fixture_h / 2)
fixture_x1 = center_x + (fixture_w / 2)
fixture_y1 = center_y + (fixture_h / 2)
fixture = pcbnew.PCB_SHAPE(board)
fixture.SetShape(pcbnew.SHAPE_T_RECT)
fixture.SetLayer(pcbnew.Dwgs_User)
fixture.SetStart(
pcbnew.VECTOR2I(
pcbnew.FromMM(fixture_x0),
pcbnew.FromMM(fixture_y0)
)
)
fixture.SetEnd(
pcbnew.VECTOR2I(
pcbnew.FromMM(fixture_x1),
pcbnew.FromMM(fixture_y1)
)
)
fixture.SetWidth(pcbnew.FromMM(0.2))
board.Add(fixture)