107 lines
4.2 KiB
Python
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
|