cleanup
This commit is contained in:
@@ -8,319 +8,65 @@ pipx install --system-site-packages kikit
|
||||

|
||||
|
||||
|
||||
# KiKit Fixture Post-Processor
|
||||
# KiKit Fixture Processor
|
||||
|
||||
Post-processing script for KiKit panelized PCBs that places any generated panel
|
||||
inside a fixed CNC fixture coordinate system.
|
||||
Processing script for KiKit panelizes PCBs and draws a fixture sketch and positions the whole panel for easy CNC processing.
|
||||
|
||||
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)`
|
||||
- Centres the finished panel inside a predefined fixture frame
|
||||
- Adds mechanical alignment pin holes
|
||||
- Moves the finished panel to the origin `(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.
|
||||
and alignment holes.
|
||||
|
||||
---
|
||||
|
||||
# Usage
|
||||
|
||||
Place `fixture_postprocess.py` next to the source `.kicad_pcb` file and run KiKit:
|
||||
|
||||
```bash
|
||||
# Panelize the PCB using the preset defined in `myPreset.json`.
|
||||
kikit panelize \
|
||||
-p myPreset.json \
|
||||
../Flow_Controller.kicad_pcb \
|
||||
panel/Flow_Controller_Panel.kicad_pcb
|
||||
```
|
||||
|
||||
---
|
||||
Have a look at the new `panel/Flow_Controller_Panel.kicad_pcb` file. It will contain the panel out ot layout specified in `myPreset.json`. E.g.: Grid of 1 x 2 with space 2.1 mm.
|
||||
|
||||
# Panel Layout Parameters
|
||||
|
||||
## Grid Layout
|
||||
|
||||
Adjust the panel dimensions using:
|
||||
|
||||
```text
|
||||
rows: <n>
|
||||
cols: <n>
|
||||
```json
|
||||
"layout": {
|
||||
"type": "grid",
|
||||
"rows": 1,
|
||||
"cols": 2,
|
||||
"hspace": "2.1mm",
|
||||
"vspace": "2.1mm"
|
||||
}
|
||||
```
|
||||
|
||||
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
|
||||
|
||||
Adapt milling and drilling parameters in `millproject`. Look up [pcb2gcode/wiki](https://github.com/pcb2gcode/pcb2gcode/wiki) for help.
|
||||
```bash
|
||||
nano millproject
|
||||
```
|
||||
*Make sure to set `mirror-axis` in the `millproject` to half of your board width!!!*
|
||||
|
||||
Run the export by providing the `.kicad_pcb` file as a first argument:
|
||||
|
||||
```bash
|
||||
chmod +x export.sh
|
||||
./export.sh panel/Flow_Controller_Panel.kicad_pcb
|
||||
./export.sh -o gcode panel/Flow_Controller_Panel.kicad_pcb
|
||||
```
|
||||
The script will first generate gerber files in the `output` directory and then convert them into `ngc` format in the `gcode` directory.
|
||||
The script will first generate gerber files in the `gerbers` directory and then generate gcode files in the `gcode` directory.
|
||||
|
||||
Launch the `gSender` program.
|
||||
* Load the `gcode/drill.ngc` file for drilling holes.
|
||||
* Load the `gcode/outline.ngc` file for milling the board outlines.
|
||||
* Load the `gcode/back.ngc` file if you want to mill the isolation traces.
|
||||
* Load the `gcode/front.ngc` file if you want to mill the isolation traces.
|
||||
|
||||
## Milling tip: Increase the thermal spoke and trace width
|
||||
When routing for milling, use the widest traces possible. 1mm, 2mm and wider, the machine doesn't care, but later you won't be soldering leads to small fragile strips of copper. You can use copper pours for routing too.
|
||||
|
||||
Reference in New Issue
Block a user