[SKiDL BUG] KeyError: 'draw' when generating kicad5 schematic
I attempted to generate a KiCAD5 schematic to later import it into KiCAD9. (Netlist and SVG generation works just fine.)
The culprit seems to be a Part class that doesn't have a Part.draw attribute anymore:
KICAD9_SYMBOL_DIR="/usr/share/kicad/symbols" python main.py
WARNING: KICAD6_SYMBOL_DIR environment variable is missing, so the default KiCad symbol libraries won't be searched. @ [/home/user/code/3rdparty/skidl/pi-digital-io/<frozen importlib._bootstrap_external>:999=>/home/user/code/3rdparty/skidl/pi-digital-io/<frozen importlib._bootstrap>:488]
WARNING: KICAD_SYMBOL_DIR environment variable is missing, so the default KiCad symbol libraries won't be searched. @ [/home/user/code/3rdparty/skidl/pi-digital-io/<frozen importlib._bootstrap_external>:999=>/home/user/code/3rdparty/skidl/pi-digital-io/<frozen importlib._bootstrap>:488]
WARNING: KICAD8_SYMBOL_DIR environment variable is missing, so the default KiCad symbol libraries won't be searched. @ [/home/user/code/3rdparty/skidl/pi-digital-io/<frozen importlib._bootstrap_external>:999=>/home/user/code/3rdparty/skidl/pi-digital-io/<frozen importlib._bootstrap>:488]
WARNING: KICAD7_SYMBOL_DIR environment variable is missing, so the default KiCad symbol libraries won't be searched. @ [/home/user/code/3rdparty/skidl/pi-digital-io/<frozen importlib._bootstrap_external>:999=>/home/user/code/3rdparty/skidl/pi-digital-io/<frozen importlib._bootstrap>:488]
Traceback (most recent call last):
File "/home/user/code/3rdparty/skidl/skidl/src/skidl/skidlbaseobj.py", line 63, in __getattr__
return self.__getattribute__("fields")[key]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
KeyError: 'draw'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/user/code/3rdparty/skidl/pi-digital-io/main.py", line 116, in <module>
generate_schematic(tool="kicad5")
File "/home/user/code/3rdparty/skidl/skidl/src/skidl/circuit.py", line 1318, in generate_schematic
tool_modules[tool].gen_schematic(self, **kwargs)
File "/home/user/code/3rdparty/skidl/skidl/src/skidl/tools/kicad5/gen_schematic.py", line 723, in gen_schematic
preprocess_circuit(circuit, **options)
File "/home/user/code/3rdparty/skidl/skidl/src/skidl/tools/kicad5/gen_schematic.py", line 666, in preprocess_circuit
calc_part_bbox(part)
File "/home/user/code/3rdparty/skidl/skidl/src/skidl/tools/kicad5/gen_schematic.py", line 631, in calc_part_bbox
bare_bboxes = calc_symbol_bbox(part)[1:]
^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/code/3rdparty/skidl/skidl/src/skidl/tools/kicad5/bboxes.py", line 113, in calc_symbol_bbox
for obj in part.draw:
^^^^^^^^^
File "/home/user/code/3rdparty/skidl/skidl/src/skidl/part.py", line 612, in __getattr__
return SkidlBaseObject.__getattr__(self, attr)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/code/3rdparty/skidl/skidl/src/skidl/skidlbaseobj.py", line 65, in __getattr__
raise AttributeError
AttributeError
Source:
if __name__ == "__main__":
... your circuit ...
generate_schematic(tool="kicad5")
- gentoo
- Python 3.12.11
- SKiDL master branch at 48da23
PS: Thank you so much for all your work on this awesome project!
Thanks for using SKiDL!
You're using the command KICAD9_SYMBOL_DIR="/usr/share/kicad/symbols" python main.py but setting the environment variable is not necessary. If you're generating a schematic, then you need to use set_default_tool(KICAD5) at the start of your code and use the KiCad5 libraries. Then a KiCad5 schematic will be generated. When you open that schematic with KiCad9, it will convert the KiCad5 symbols to the newer ones.
However, the command you used should not have led to the exception you reported. Perhaps you could send me a SKiDL file that raises the same error? Then I could test it myself and see if I get the same error.
I get another error with set_default_tool(KICAD5), probably because I don't have it installed. Do I need KiCAD5 installed to generate a schematic? Can't I use the KICAD9 libraries and generate a KICAD5 schematic? Maybe that's the problem.
In any other case, here's a minimal snippet to raise that error:
from skidl import *
# ---------------------------------------------------------------------
if __name__ == "__main__":
# create nets
vcc_in = Net('VCC_IN')
gnd_in = Net('GND_IN')
vcc_5v = Net('+5V')
gnd = Net('GND')
d1 = Part(
lib="Device", name="D_TVS",
footprint="Diode_THT:D_DO-34_SOD68_P2.54mm_Vertical_AnodeUp"
)
vcc_in += d1[1]
gnd_in += d1[2]
generate_schematic(tool="kicad5")