def separate(input, output, source, page, debug, keepannotations): """ Separate a single board out of a multi-board design. The separated board is placed in the middle of the sheet. You can specify the board via bounding box or annotation. See documentation for further details on usage. """ try: from kikit import panelize_ui_impl as ki from kikit.panelize import Panel from pcbnewTransition.transition import isV6, pcbnew from pcbnew import LoadBoard, wxPointMM from kikit.common import fakeKiCADGui app = fakeKiCADGui() preset = ki.obtainPreset([], validate=False, source=source, page=page, debug=debug) if preset["debug"]["deterministic"] and isV6(): pcbnew.KIID.SeedGenerator(42) board = LoadBoard(input) sourceArea = ki.readSourceArea(preset["source"], board) panel = Panel(output) panel.inheritDesignSettings(board) panel.inheritProperties(board) panel.inheritTitleBlock(board) destination = wxPointMM(150, 100) panel.appendBoard(input, destination, sourceArea, interpretAnnotations=(not keepannotations)) ki.setStackup(preset["source"], panel) ki.positionPanel(preset["page"], panel) ki.setPageSize(preset["page"], panel, board) panel.save(reconstructArcs=True) except Exception as e: import sys sys.stderr.write("An error occurred: " + str(e) + "\n") sys.stderr.write("No output files produced\n") if isinstance(preset, dict) and preset["debug"]["trace"]: traceback.print_exc(file=sys.stderr) sys.exit(1)
def doPanelization(input, output, preset, plugins=[]): """ The panelization logic is separated into a separate function so we can handle errors based on the context; e.g., CLI vs GUI """ from kikit import panelize_ui_impl as ki from kikit.panelize import Panel from pcbnewTransition.transition import isV6, pcbnew from pcbnew import LoadBoard from itertools import chain if preset["debug"]["deterministic"] and isV6(): pcbnew.KIID.SeedGenerator(42) if preset["debug"]["drawtabfail"]: import kikit.substrate kikit.substrate.TABFAIL_VISUAL = True board = LoadBoard(input) panel = Panel(output) useHookPlugins = ki.loadHookPlugins(plugins, board, preset) useHookPlugins(lambda x: x.prePanelSetup(panel)) # Register extra footprints for annotations for tabFootprint in preset["tabs"]["tabfootprints"]: panel.annotationReader.registerTab(tabFootprint.lib, tabFootprint.footprint) panel.inheritDesignSettings(board) panel.inheritProperties(board) panel.inheritTitleBlock(board) useHookPlugins(lambda x: x.afterPanelSetup(panel)) sourceArea = ki.readSourceArea(preset["source"], board) substrates, framingSubstrates, backboneCuts = \ ki.buildLayout(preset, panel, input, sourceArea) useHookPlugins(lambda x: x.afterLayout(panel, substrates)) tabCuts = ki.buildTabs(preset, panel, substrates, framingSubstrates, ki.frameOffset(preset["framing"])) useHookPlugins(lambda x: x.afterTabs(panel, tabCuts, backboneCuts)) frameCuts = ki.buildFraming(preset, panel) useHookPlugins(lambda x: x.afterFraming(panel, frameCuts)) ki.buildTooling(preset, panel) ki.buildFiducials(preset, panel) ki.buildText(preset["text"], panel) ki.buildPostprocessing(preset["post"], panel) ki.makeTabCuts(preset, panel, tabCuts) ki.makeOtherCuts(preset, panel, chain(backboneCuts, frameCuts)) useHookPlugins(lambda x: x.afterCuts(panel)) ki.buildCopperfill(preset["copperfill"], panel) ki.setStackup(preset["source"], panel) ki.positionPanel(preset["page"], panel) ki.setPageSize(preset["page"], panel, board) ki.runUserScript(preset["post"], panel) useHookPlugins(lambda x: x.finish(panel)) ki.buildDebugAnnotation(preset["debug"], panel) panel.save(reconstructArcs=preset["post"]["reconstructarcs"], refillAllZones=preset["post"]["refillzones"])