KiBot/kibot/pre_annotate_power.py

76 lines
2.6 KiB
Python

# -*- coding: utf-8 -*-
# Copyright (c) 2022 Salvador E. Tropea
# Copyright (c) 2022 Instituto Nacional de Tecnología Industrial
# License: GPL-3.0
# Project: KiBot (formerly KiPlot)
from .error import KiPlotConfigurationError
from .gs import (GS)
from .kiplot import load_sch
from .misc import W_NOANNO
from .macros import macros, pre_class # noqa: F401
from .log import get_logger
logger = get_logger(__name__)
@pre_class
class Annotate_Power(BasePreFlight): # noqa: F821
""" [boolean=false] Annotates all power components.
This preflight modifies the schematic, use it only in revision control environments.
Used to solve ERC problems when using filters that remove power reference numbers """
def __init__(self, name, value):
super().__init__(name, value)
if not isinstance(value, bool):
raise KiPlotConfigurationError('must be boolean')
self._enabled = value
self._sch_related = True
def annotate_ki5(self):
""" Annotate power components for KiCad 5 """
comps = GS.sch.get_components(exclude_power=False)
num = 1
for c in comps:
if c.is_power:
# Force a new number
c.ref = c.f_ref = c.ref_prefix+'{:02d}'.format(num)
c.ref_suffix = str(num)
num = num+1
# Fix the ARs
if c.ar:
first = True
for o in c.ar:
if first:
# Copy this to the first
o.ref = c.ref
first = False
else:
# Allocate new numbers for the rest
o.ref = c.ref_prefix+'{:02d}'.format(num)
num = num+1
# Fix the reference field
field = next(filter(lambda x: x.number == 0, c.fields), None)
if field:
field.value = c.ref
def annotate_ki6(self):
""" Annotate power components for KiCad 6 """
num = 1
for ins in GS.sch.symbol_instances:
c = ins.component
if c.is_power:
c.set_ref(c.ref_prefix+'{:02d}'.format(num))
num = num+1
def run(self):
load_sch()
if not GS.sch:
return
if not GS.sch.annotation_error:
logger.warning(W_NOANNO+"No annotation problems, skipping power annotation")
return
if GS.ki5:
self.annotate_ki5()
else:
self.annotate_ki6()
GS.sch.save()