Add P-touch Labels for Asset: 63x20 mm label format for PT-E560BT
New three-column label format for Brother P-touch EDGE PT-E560BT asset tags:
logo | three static lines + variable field | QR code.
Layout and rendering
- ptouch_label.py: geometry engine with PDF and preview renderers. Both
consume the same geometry, so the preview matches the print exactly.
- Code symbols are snapped to whole printer dots per module. Fractional
modules are the usual reason a small QR code will not scan.
- QR is maximised to the printable height by default (16.4 mm, 4 dots per
module) instead of a fixed 16 mm box (12.3 mm, 3 dots per module).
- Code payload is composed as prefix + inventory + suffix. A legacy
{inventory} template is migrated on first save.
Hardware handling
- print_area.py reads the driver's real printable area via GetDeviceCaps.
The PT-E560BT head is 128 dots at 180 dpi, so the maximum print height is
18.06 mm even on 24 mm tape; the driver reports media as 65x24 mm but only
about 61x18 mm is reachable. Content is fitted to the reachable area,
otherwise the driver silently crops it.
- set_printer_resolution.py reads/switches the driver's resolution mode. The
driver offers 180x180 (symmetric) and 180x360 (anisotropic, 2x across the
tape); the anisotropic mode scaled output incorrectly.
GUI
- label_printer_ptouch_gui.py: 600x300 two-column panel - controls on the
left, live preview on the right. Advanced settings for logo, static lines,
code prefix/suffix and error correction.
- native_file_dialog.py: the standard Windows file picker, run in a
subprocess because Tk and Kivy both want the main event loop.
Printing
- Print failures are reported honestly. print_to_printer previously returned
True unconditionally, so a failed print claimed success and was logged as
SUCCESS.
- SumatraPDF exit codes are now checked (4 = no printer, 5 = driver error).
- The PDF is sent with noscale so driver-side scaling cannot distort the QR
module pitch.
Tests
- validate_ptouch_layout.py decodes the QR back out of the rendered preview
module by module, proving the preview and PDF are the same layout.
- test_ptouch_pipeline.py writes to a temp config so it cannot overwrite
operator settings.
- test_gui_layout.py exercises the real app class headlessly.
- test_print_reporting.py covers the failure paths.
Diagnostics: check_print_area.py, check_print_geometry.py, check_devmode.py,
print_calibration.py, print_measure_scale.py, capture_print_job.py.
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
# P-touch Labels for Asset
|
||||
|
||||
Barcode label printing for **Brother P-touch EDGE PT-E560BT** asset tags.
|
||||
|
||||
Generates a three-column label sized to the printer's real printable area, with a
|
||||
logo, three lines of fixed text plus a variable field, and a QR code that encodes
|
||||
a composed string. Includes a preview that matches the print exactly, and a
|
||||
Kivy GUI for operators.
|
||||
|
||||
```
|
||||
0 20 mm 45 mm 63 mm
|
||||
+---------+------------+--------+
|
||||
| | static 1 | QR |
|
||||
| LOGO | static 2 | CODE |
|
||||
| 16x16 | static 3 | |
|
||||
| | VARIABLE | |
|
||||
+---------+------------+--------+
|
||||
```
|
||||
|
||||
## Install
|
||||
|
||||
```bash
|
||||
pip install -r requirements_ptouch.txt
|
||||
```
|
||||
|
||||
## Run
|
||||
|
||||
```bash
|
||||
python label_printer_ptouch_gui.py # operator GUI (Kivy)
|
||||
```
|
||||
|
||||
The original three-row format is still available via `label_printer_gui.py` and
|
||||
is unchanged.
|
||||
|
||||
## Configuration
|
||||
|
||||
Operator settings live in `label_config.json` (not committed - it holds a local
|
||||
logo path). Edit them in **Advanced settings** in the GUI:
|
||||
|
||||
| Setting | Purpose |
|
||||
|---|---|
|
||||
| Logo image | PNG/JPG for the first column, with a thumbnail preview |
|
||||
| Static text lines | The three fixed lines |
|
||||
| Code prefix / suffix | Code payload is `prefix + inventory + suffix` |
|
||||
| QR error correction | `L` (shortest) to `H` (most robust) |
|
||||
|
||||
## Hardware notes
|
||||
|
||||
The PT-E560BT has a **128-dot print head at 180 dpi**, so the maximum print height
|
||||
is **18.06 mm** even on 24 mm tape. The label is therefore fitted to the driver's
|
||||
*printable area* (~61 x 18 mm), read at runtime, rather than to the nominal media
|
||||
size (65 x 24 mm).
|
||||
|
||||
The driver exposes two resolution modes; use the symmetric one:
|
||||
|
||||
```bash
|
||||
python set_printer_resolution.py --mode 180
|
||||
```
|
||||
|
||||
See [documentation/PTOUCH_63x20.md](documentation/PTOUCH_63x20.md) for the full
|
||||
layout, code-composition and dot-alignment details.
|
||||
|
||||
## Diagnostics
|
||||
|
||||
| Script | Purpose |
|
||||
|---|---|
|
||||
| `check_print_area.py` | Driver page and printable area (authoritative `GetDeviceCaps`) |
|
||||
| `check_print_geometry.py` | Compares our PDF page against the driver's media |
|
||||
| `check_devmode.py` | Dumps the full driver DEVMODE |
|
||||
| `set_printer_resolution.py` | Read/switch the driver resolution mode |
|
||||
| `print_calibration.py` | Label with ruler marks, for measuring on tape |
|
||||
| `print_measure_scale.py` | Measures the actual X/Y scale factors |
|
||||
| `capture_print_job.py` | Captures raw bytes sent to the printer |
|
||||
|
||||
## Tests
|
||||
|
||||
```bash
|
||||
python validate_ptouch_layout.py # geometry + QR round-trip from rendered pixels
|
||||
python test_ptouch_pipeline.py # config, PDF, print path (uses a temp config)
|
||||
python test_gui_layout.py # GUI wiring, headless
|
||||
python test_print_reporting.py # print failures are reported honestly
|
||||
```
|
||||
|
||||
`validate_ptouch_layout.py` decodes the QR back out of the rendered preview,
|
||||
module by module, which is what proves the preview and the PDF are the same
|
||||
layout and that the symbol survives dot-alignment.
|
||||
Reference in New Issue
Block a user