[PCB2Blender_tools][Added] Stackup support
This commit is contained in:
parent
466f97a0e3
commit
f49d679b7c
|
|
@ -3131,6 +3131,9 @@ Notes:
|
||||||
- `pads_info_dir`: [string='pads'] Sub-directory where the pads info files are stored.
|
- `pads_info_dir`: [string='pads'] Sub-directory where the pads info files are stored.
|
||||||
- `pre_transform`: [string|list(string)='_none'] Name of the filter to transform fields before applying other filters.
|
- `pre_transform`: [string|list(string)='_none'] Name of the filter to transform fields before applying other filters.
|
||||||
A short-cut to use for simple cases where a variant is an overkill.
|
A short-cut to use for simple cases where a variant is an overkill.
|
||||||
|
- `stackup_create`: [boolean=false] Create a JSON file containing the board stackup.
|
||||||
|
- `stackup_dir`: [string='.'] Directory for the stackup file.
|
||||||
|
- `stackup_file`: [string='board.yaml'] Name for the stackup file.
|
||||||
- `variant`: [string=''] Board variant to apply.
|
- `variant`: [string=''] Board variant to apply.
|
||||||
- `category`: [string|list(string)=''] The category for this output. If not specified an internally defined category is used.
|
- `category`: [string|list(string)=''] The category for this output. If not specified an internally defined category is used.
|
||||||
Categories looks like file system paths, i.e. **PCB/fabrication/gerber**.
|
Categories looks like file system paths, i.e. **PCB/fabrication/gerber**.
|
||||||
|
|
|
||||||
|
|
@ -1863,6 +1863,12 @@ outputs:
|
||||||
# [string|list(string)='_none'] Name of the filter to transform fields before applying other filters.
|
# [string|list(string)='_none'] Name of the filter to transform fields before applying other filters.
|
||||||
# A short-cut to use for simple cases where a variant is an overkill
|
# A short-cut to use for simple cases where a variant is an overkill
|
||||||
pre_transform: '_none'
|
pre_transform: '_none'
|
||||||
|
# [boolean=false] Create a JSON file containing the board stackup
|
||||||
|
stackup_create: false
|
||||||
|
# [string='.'] Directory for the stackup file
|
||||||
|
stackup_dir: '.'
|
||||||
|
# [string='board.yaml'] Name for the stackup file
|
||||||
|
stackup_file: 'board.yaml'
|
||||||
# [string=''] Board variant to apply
|
# [string=''] Board variant to apply
|
||||||
variant: ''
|
variant: ''
|
||||||
# PCB Print:
|
# PCB Print:
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
# License: GPL-3.0
|
# License: GPL-3.0
|
||||||
# Project: KiBot (formerly KiPlot)
|
# Project: KiBot (formerly KiPlot)
|
||||||
# Some code is adapted from: https://github.com/30350n/pcb2blender
|
# Some code is adapted from: https://github.com/30350n/pcb2blender
|
||||||
|
import json
|
||||||
import os
|
import os
|
||||||
import struct
|
import struct
|
||||||
from pcbnew import B_Paste, F_Paste
|
from pcbnew import B_Paste, F_Paste
|
||||||
|
|
@ -32,6 +33,12 @@ class PCB2Blender_ToolsOptions(VariantOptions):
|
||||||
""" Create the files containing the PCB pads information """
|
""" Create the files containing the PCB pads information """
|
||||||
self.pads_info_dir = 'pads'
|
self.pads_info_dir = 'pads'
|
||||||
""" Sub-directory where the pads info files are stored """
|
""" Sub-directory where the pads info files are stored """
|
||||||
|
self.stackup_create = False
|
||||||
|
""" Create a JSON file containing the board stackup """
|
||||||
|
self.stackup_file = 'board.yaml'
|
||||||
|
""" Name for the stackup file """
|
||||||
|
self.stackup_dir = '.'
|
||||||
|
""" Directory for the stackup file """
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self._expand_id = 'pcb2blender'
|
self._expand_id = 'pcb2blender'
|
||||||
self._expand_ext = 'pcb3d'
|
self._expand_ext = 'pcb3d'
|
||||||
|
|
@ -88,12 +95,36 @@ class PCB2Blender_ToolsOptions(VariantOptions):
|
||||||
pad.GetDrillShape(),
|
pad.GetDrillShape(),
|
||||||
*map(GS.to_mm, pad.GetDrillSize())))
|
*map(GS.to_mm, pad.GetDrillSize())))
|
||||||
|
|
||||||
|
def do_stackup(self, dir_name):
|
||||||
|
if not self.stackup_create or (not GS.global_pcb_finish and not GS.stackup):
|
||||||
|
return
|
||||||
|
dir_name = os.path.join(dir_name, self.stackup_dir)
|
||||||
|
os.makedirs(dir_name, exist_ok=True)
|
||||||
|
fname = os.path.join(dir_name, self.stackup_file)
|
||||||
|
# Create the board_info
|
||||||
|
board_info = {}
|
||||||
|
if GS.global_pcb_finish:
|
||||||
|
board_info['copper_finish'] = GS.global_pcb_finish
|
||||||
|
if GS.stackup:
|
||||||
|
layers_parsed = []
|
||||||
|
for la in GS.stackup:
|
||||||
|
parsed_layer = {'name': la.name, 'type': la.type}
|
||||||
|
if la.color is not None:
|
||||||
|
parsed_layer['color'] = la.color
|
||||||
|
if la.thickness is not None:
|
||||||
|
parsed_layer['thickness'] = la.thickness/1000
|
||||||
|
layers_parsed.append(parsed_layer)
|
||||||
|
board_info['stackup'] = layers_parsed
|
||||||
|
with open(fname, 'wt') as f:
|
||||||
|
json.dump(board_info, f, indent=3)
|
||||||
|
|
||||||
def run(self, output):
|
def run(self, output):
|
||||||
super().run(output)
|
super().run(output)
|
||||||
dir_name = os.path.dirname(output)
|
dir_name = os.path.dirname(output)
|
||||||
self.filter_pcb_components(do_3D=True)
|
self.filter_pcb_components(do_3D=True)
|
||||||
self.do_board_bounds(dir_name)
|
self.do_board_bounds(dir_name)
|
||||||
self.do_pads_info(dir_name)
|
self.do_pads_info(dir_name)
|
||||||
|
self.do_stackup(dir_name)
|
||||||
self.unfilter_pcb_components(do_3D=True)
|
self.unfilter_pcb_components(do_3D=True)
|
||||||
|
|
||||||
def get_targets(self, out_dir):
|
def get_targets(self, out_dir):
|
||||||
|
|
|
||||||
|
|
@ -7,3 +7,5 @@ outputs:
|
||||||
comment: "PCB to Blender tools test"
|
comment: "PCB to Blender tools test"
|
||||||
dir: pcb2blender
|
dir: pcb2blender
|
||||||
type: pcb2blender_tools
|
type: pcb2blender_tools
|
||||||
|
options:
|
||||||
|
stackup_create: true
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue