KiBot/kibot/out_any_diff.py

107 lines
4.2 KiB
Python

# -*- coding: utf-8 -*-
# Copyright (c) 2022-2024 Salvador E. Tropea
# Copyright (c) 2022-2024 Instituto Nacional de Tecnología Industrial
# License: GPL-3.0
# Project: KiBot (formerly KiPlot)
import os
from tempfile import NamedTemporaryFile
from .gs import GS
from .kiplot import run_command
from .out_base import VariantOptions
from .pre_base import BasePreFlight
from .macros import macros, document, output_class # noqa: F401
from . import log
logger = log.get_logger()
class AnyDiffOptions(VariantOptions):
def __init__(self):
with document:
self.zones = 'global'
""" [global,fill,unfill,none] How to handle PCB zones. The default is *global* and means that we
fill zones if the *check_zone_fills* preflight is enabled. The *fill* option always forces
a refill, *unfill* forces a zone removal and *none* lets the zones unchanged """
super().__init__()
self._expand_id = 'diff'
self._expand_ext = 'pdf'
self._kiri_mode = False
def add_zones_ops(self, cmd):
if self.zones == 'global':
if BasePreFlight.get_option('check_zone_fills'):
cmd.extend(['--zones', 'fill'])
elif self.zones == 'fill':
cmd.extend(['--zones', 'fill'])
elif self.zones == 'unfill':
cmd.extend(['--zones', 'unfill'])
def add_to_cache(self, name, hash):
cmd = [self.command, '--no_reader', '--only_cache', '--old_file_hash', hash, '--cache_dir', self.cache_dir]
if self._kiri_mode:
cmd.append('--kiri_mode')
self.add_zones_ops(cmd)
if self.incl_file:
cmd.extend(['--layers', self.incl_file])
if not hasattr(self, 'only_first_sch_page') or not self.only_first_sch_page:
cmd.append('--all_pages')
if GS.debug_enabled:
cmd.insert(1, '-'+'v'*GS.debug_level)
cmd.extend([name, name])
self.name_used_for_cache = name
run_command(cmd)
def run_git(self, cmd, cwd=None, just_raise=False):
if cwd is None:
cwd = self.repo_dir
return run_command([self.git_command]+cmd, change_to=cwd, just_raise=just_raise)
def git_dirty(self, file=None):
ops = ['status', '--porcelain', '-uno']
if file is not None:
ops.append(file)
return self.run_git(ops)
def remove_git_worktree(self, name):
logger.debug('Removing temporal checkout at '+name)
self.run_git(['worktree', 'remove', '--force', name])
def write_empty_file(self, name, create_tmp=False):
base, ext = os.path.splitext(name)
kind = 'PCB' if ext == '.kicad_pcb' else 'schematic'
if create_tmp:
# Use a temporary file
with NamedTemporaryFile(mode='w', suffix=ext, delete=False) as f:
name = f.name
base = os.path.splitext(name)[0]
to_remove = [name]
logger.debug('Creating empty '+kind+': '+name)
with open(name, 'w') as f:
if ext == '.kicad_sch':
f.write("(kicad_sch (version 20211123) (generator eeschema))\n")
elif ext == '.sch':
f.write("EESchema Schematic File Version 4\nEELAYER 30 0\nEELAYER END\n$Descr A4 11693 8268\n"
"$EndDescr\n$EndSCHEMATC\n")
elif ext == '.kicad_pcb':
f.write("(kicad_pcb (version 20171130) (host pcbnew 5.1.5))\n")
else: # pragma: no cover
raise AssertionError('Unknown extension')
if ext == '.sch':
lib_name = base+'-cache.lib'
if not os.path.isfile(lib_name):
logger.debug('Creating dummy cache lib: '+lib_name)
with open(lib_name, 'w') as f:
f.write("EESchema-LIBRARY Version 2.4\n#\n#End Library\n")
to_remove.append(lib_name)
return name, to_remove
def save_layers_incl(self, layers):
self._solved_layers = layers
logger.debug('Including layers:')
with NamedTemporaryFile(mode='w', suffix='.lst', delete=False) as f:
self.incl_file = f.name
for la in layers:
logger.debug('- {} ({})'.format(la.layer, la.id))
f.write(str(la.id)+'\n')
return self.incl_file