KiKit icon indicating copy to clipboard operation
KiKit copied to clipboard

Only CLI fails to panelize for more than 2 x 2

Open dafri92 opened this issue 4 months ago • 2 comments

Prerequisites

  • [x] I have read FAQ
  • [x] I have searched existing issues (including closed ones)
  • [x] I use KiKit at least version 1.7.2 (older version are not supported)

KiKit version

kikit, version 1.7.2

KiCAD version (only KiCAD 8 and 9 are supported)

9.0.3

Operating system

macOS 15.6, Windows 11

Description

I'm trying to panelize the attached PCB. This is the minimal example I could get to generate the error. Using the GUI approach with the KiCad plugin works as expected (tested on Windows).

Using these commands to panelize from CLI fails

  • "/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/bin/kikit" panelize --layout 'grid; rows: 4; cols: 4;' "Panelize Fail.kicad_pcb" "Panel.kicad_pcb"
  • `"${KICAD9_3RD_PARTY}\Python311\Scripts\kikit.exe" panelize --layout 'grid; rows: 4; cols: 4;' "Panelize Fail.kicad_pcb" "Panel.kicad_pcb"``

with the error message both on macOS and Windows:

An error occurred: Board rotation has to be passed as EDA_ANGLE, not a number
No output files produced

Interestingly when changing the panel size to 2 x 2 or 1 x 1 it works as expected.

Panelize Fail.zip

Steps to Reproduce

Here to output with debug option set from macOS

"/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/bin/kikit" panelize --debug 'trace: true' --layout 'grid; rows: 4; cols: 4;' "Panelize Fail.kicad_pcb" "Panel.kicad_pcb"
12:12:28 AM: Debug: Adding duplicate image handler for 'PNG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'JPEG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TIFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'GIF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PCX file'
12:12:28 AM: Debug: Adding duplicate image handler for 'IFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows icon file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows animated cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TGA file'
12:12:28 AM: Debug: Adding duplicate image handler for 'XPM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'JPEG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TIFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'GIF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PCX file'
12:12:28 AM: Debug: Adding duplicate image handler for 'IFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows icon file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows animated cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TGA file'
12:12:28 AM: Debug: Adding duplicate image handler for 'XPM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'JPEG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TIFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'GIF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PCX file'
12:12:28 AM: Debug: Adding duplicate image handler for 'IFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows icon file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows animated cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TGA file'
12:12:28 AM: Debug: Adding duplicate image handler for 'XPM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'JPEG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TIFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'GIF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PCX file'
12:12:28 AM: Debug: Adding duplicate image handler for 'IFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows icon file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows animated cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TGA file'
12:12:28 AM: Debug: Adding duplicate image handler for 'XPM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'JPEG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TIFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'GIF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PCX file'
12:12:28 AM: Debug: Adding duplicate image handler for 'IFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows icon file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows animated cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TGA file'
12:12:28 AM: Debug: Adding duplicate image handler for 'XPM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'JPEG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TIFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'GIF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PCX file'
12:12:28 AM: Debug: Adding duplicate image handler for 'IFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows icon file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows animated cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TGA file'
12:12:28 AM: Debug: Adding duplicate image handler for 'XPM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'JPEG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TIFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'GIF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PCX file'
12:12:28 AM: Debug: Adding duplicate image handler for 'IFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows icon file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows animated cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TGA file'
12:12:28 AM: Debug: Adding duplicate image handler for 'XPM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'JPEG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TIFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'GIF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PCX file'
12:12:28 AM: Debug: Adding duplicate image handler for 'IFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows icon file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows animated cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TGA file'
12:12:28 AM: Debug: Adding duplicate image handler for 'XPM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'JPEG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TIFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'GIF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PCX file'
12:12:28 AM: Debug: Adding duplicate image handler for 'IFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows icon file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows animated cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TGA file'
12:12:28 AM: Debug: Adding duplicate image handler for 'XPM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'JPEG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TIFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'GIF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PCX file'
12:12:28 AM: Debug: Adding duplicate image handler for 'IFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows icon file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows animated cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TGA file'
12:12:28 AM: Debug: Adding duplicate image handler for 'XPM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'JPEG file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TIFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'GIF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PNM file'
12:12:28 AM: Debug: Adding duplicate image handler for 'PCX file'
12:12:28 AM: Debug: Adding duplicate image handler for 'IFF file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows icon file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'Windows animated cursor file'
12:12:28 AM: Debug: Adding duplicate image handler for 'TGA file'
12:12:28 AM: Debug: Adding duplicate image handler for 'XPM file'
swig/python detected a memory leak of type 'BOX2< VECTOR2< int > > *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
An error occurred: Board rotation has to be passed as EDA_ANGLE, not a number
No output files produced
Traceback (most recent call last):
  File "/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/kikit/panelize_ui.py", line 217, in panelize
    doPanelization(input, output, preset, plugin)
  File "/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/kikit/panelize_ui.py", line 271, in doPanelization
    ki.buildLayout(preset, panel, input, sourceArea)
  File "/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/kikit/panelize_ui_impl.py", line 257, in buildLayout
    substrates = panel.makeGrid(
  File "/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/kikit/panelize.py", line 1375, in makeGrid
    boardSize = self.appendBoard(
  File "/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/kikit/panelize.py", line 1027, in appendBoard
    raise RuntimeError("Board rotation has to be passed as EDA_ANGLE, not a number")
RuntimeError: Board rotation has to be passed as EDA_ANGLE, not a number
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'BOX2< VECTOR2< int > > *', no destructor found.
swig/python detected a memory leak of type 'BOX2< VECTOR2< int > > *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'BOX2< VECTOR2< int > > *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'VECTOR2< int > *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'std::vector< ZONE * > *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.
swig/python detected a memory leak of type 'EDA_ANGLE *', no destructor found.

Panelize Fail.zip

dafri92 avatar Aug 13 '25 22:08 dafri92

Please, attach the output when running with --debug 'trace: true'.

yaqwsx avatar Aug 15 '25 07:08 yaqwsx

I did. Here is the highlight:

An error occurred: Board rotation has to be passed as EDA_ANGLE, not a number
No output files produced
Traceback (most recent call last):
  File "/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/kikit/panelize_ui.py", line 217, in panelize
    doPanelization(input, output, preset, plugin)
  File "/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/kikit/panelize_ui.py", line 271, in doPanelization
    ki.buildLayout(preset, panel, input, sourceArea)
  File "/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/kikit/panelize_ui_impl.py", line 257, in buildLayout
    substrates = panel.makeGrid(
  File "/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/kikit/panelize.py", line 1375, in makeGrid
    boardSize = self.appendBoard(
  File "/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/kikit/panelize.py", line 1027, in appendBoard
    raise RuntimeError("Board rotation has to be passed as EDA_ANGLE, not a number")
RuntimeError: Board rotation has to be passed as EDA_ANGLE, not a number

dafri92 avatar Aug 16 '25 19:08 dafri92