[PCB Print][Added] Options to fine tune the centering

- You can select which layers are used for centering purposes

Closes #573
This commit is contained in:
Salvador E. Tropea 2024-02-01 08:44:26 -03:00
parent 83d502422a
commit b88e09c448
4 changed files with 39 additions and 4 deletions

View File

@ -84,6 +84,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Support for CURRENT_DATE text variable - Support for CURRENT_DATE text variable
- Options to mirror the text in the user layers when creating a mirrored page - Options to mirror the text in the user layers when creating a mirrored page
(#561) (#561)
- Options to select which layers are used for centering purposes (#573)
- Populate: - Populate:
- Basic support for regular list items (#480) - Basic support for regular list items (#480)
- Position: - Position:

View File

@ -2342,6 +2342,9 @@ outputs:
force_edge_cuts: false force_edge_cuts: false
# [string=''] Color used for the `force_edge_cuts` option # [string=''] Color used for the `force_edge_cuts` option
forced_edge_cuts_color: '' forced_edge_cuts_color: ''
# [boolean=true] Used when enabling the `force_edge_cuts`, in this case this is the `use_for_center` option of the forced
# layer
forced_edge_cuts_use_for_center: true
# [string='PDF'] [PDF,SVG,PNG,EPS,PS] Format for the output file/s. # [string='PDF'] [PDF,SVG,PNG,EPS,PS] Format for the output file/s.
# Note that for PS you need `ghostscript` which isn't part of the default docker images # Note that for PS you need `ghostscript` which isn't part of the default docker images
format: 'PDF' format: 'PDF'
@ -2360,6 +2363,10 @@ outputs:
# [boolean=true] Tell KiCad to apply the scaling for each page as a separated entity. # [boolean=true] Tell KiCad to apply the scaling for each page as a separated entity.
# Disabling it the pages are coherent and can be superposed # Disabling it the pages are coherent and can be superposed
individual_page_scaling: true individual_page_scaling: true
# [boolean=false] Invert the meaning of the `use_for_center` layer option.
# This can be used to just select the edge cuts for centering, in this case enable this option
# and disable the `use_for_center` option of the edge cuts layer
invert_use_for_center: false
# [boolean=false] Store the temporal page and layer files in the output dir and don't delete them # [boolean=false] Store the temporal page and layer files in the output dir and don't delete them
keep_temporal_files: false keep_temporal_files: false
# [string=''] Color used for micro `colored_vias` # [string=''] Color used for micro `colored_vias`
@ -2407,6 +2414,9 @@ outputs:
# [string=''] Suffix used in file names related to this layer. Derived from the name if not specified. # [string=''] Suffix used in file names related to this layer. Derived from the name if not specified.
# A default can be specified using the `layer_defaults` global option # A default can be specified using the `layer_defaults` global option
suffix: '' suffix: ''
# [boolean=true] Use this layer for centering purposes.
# You can invert the meaning using the `invert_use_for_center` option
use_for_center: true
# [number=0.1] [0.02,2] For objects without width [mm] (KiCad 5) # [number=0.1] [0.02,2] For objects without width [mm] (KiCad 5)
line_width: 0.1 line_width: 0.1
# [boolean=false] Print mirrored (X axis inverted) # [boolean=false] Print mirrored (X axis inverted)
@ -2449,6 +2459,9 @@ outputs:
# [string=''] Suffix used in file names related to this layer. Derived from the name if not specified. # [string=''] Suffix used in file names related to this layer. Derived from the name if not specified.
# A default can be specified using the `layer_defaults` global option # A default can be specified using the `layer_defaults` global option
suffix: '' suffix: ''
# [boolean=true] Use this layer for centering purposes.
# You can invert the meaning using the `invert_use_for_center` option
use_for_center: true
# [number=1.0] Scale factor (0 means autoscaling) # [number=1.0] Scale factor (0 means autoscaling)
scaling: 1.0 scaling: 1.0
# [string='Assembly'] Text to use for the `sheet` in the title block. # [string='Assembly'] Text to use for the `sheet` in the title block.

View File

@ -55,6 +55,8 @@ Parameters:
- ``plot_footprint_values`` :index:`: <pair: output - pcb_print - options - pages - layers; plot_footprint_values>` [boolean=true] Include the footprint values. - ``plot_footprint_values`` :index:`: <pair: output - pcb_print - options - pages - layers; plot_footprint_values>` [boolean=true] Include the footprint values.
- ``suffix`` :index:`: <pair: output - pcb_print - options - pages - layers; suffix>` [string=''] Suffix used in file names related to this layer. Derived from the name if not specified. - ``suffix`` :index:`: <pair: output - pcb_print - options - pages - layers; suffix>` [string=''] Suffix used in file names related to this layer. Derived from the name if not specified.
A default can be specified using the `layer_defaults` global option. A default can be specified using the `layer_defaults` global option.
- ``use_for_center`` :index:`: <pair: output - pcb_print - options - pages - layers; use_for_center>` [boolean=true] Use this layer for centering purposes.
You can invert the meaning using the `invert_use_for_center` option.
- **scaling** :index:`: <pair: output - pcb_print - options - pages; scaling>` [number=1.0] Scale factor (0 means autoscaling). - **scaling** :index:`: <pair: output - pcb_print - options - pages; scaling>` [number=1.0] Scale factor (0 means autoscaling).
- **sort_layers** :index:`: <pair: output - pcb_print - options - pages; sort_layers>` [boolean=false] Try to sort the layers in the same order that uses KiCad for printing. - **sort_layers** :index:`: <pair: output - pcb_print - options - pages; sort_layers>` [boolean=false] Try to sort the layers in the same order that uses KiCad for printing.
@ -91,6 +93,8 @@ Parameters:
- ``plot_footprint_values`` :index:`: <pair: output - pcb_print - options - pages - repeat_layers; plot_footprint_values>` [boolean=true] Include the footprint values. - ``plot_footprint_values`` :index:`: <pair: output - pcb_print - options - pages - repeat_layers; plot_footprint_values>` [boolean=true] Include the footprint values.
- ``suffix`` :index:`: <pair: output - pcb_print - options - pages - repeat_layers; suffix>` [string=''] Suffix used in file names related to this layer. Derived from the name if not specified. - ``suffix`` :index:`: <pair: output - pcb_print - options - pages - repeat_layers; suffix>` [string=''] Suffix used in file names related to this layer. Derived from the name if not specified.
A default can be specified using the `layer_defaults` global option. A default can be specified using the `layer_defaults` global option.
- ``use_for_center`` :index:`: <pair: output - pcb_print - options - pages - repeat_layers; use_for_center>` [boolean=true] Use this layer for centering purposes.
You can invert the meaning using the `invert_use_for_center` option.
- ``sheet`` :index:`: <pair: output - pcb_print - options - pages; sheet>` [string='Assembly'] Text to use for the `sheet` in the title block. - ``sheet`` :index:`: <pair: output - pcb_print - options - pages; sheet>` [string='Assembly'] Text to use for the `sheet` in the title block.
Pattern (%*) and text variables are expanded. Pattern (%*) and text variables are expanded.
@ -121,6 +125,8 @@ Parameters:
like the the solder mask are handled as images by the conversion tools. like the the solder mask are handled as images by the conversion tools.
- ``drill_marks`` :index:`: <pair: output - pcb_print - options; drill_marks>` [string='full'] [none,small,full] What to use to indicate the drill places, can be none, small or full (for real scale). - ``drill_marks`` :index:`: <pair: output - pcb_print - options; drill_marks>` [string='full'] [none,small,full] What to use to indicate the drill places, can be none, small or full (for real scale).
- ``forced_edge_cuts_color`` :index:`: <pair: output - pcb_print - options; forced_edge_cuts_color>` [string=''] Color used for the `force_edge_cuts` option. - ``forced_edge_cuts_color`` :index:`: <pair: output - pcb_print - options; forced_edge_cuts_color>` [string=''] Color used for the `force_edge_cuts` option.
- ``forced_edge_cuts_use_for_center`` :index:`: <pair: output - pcb_print - options; forced_edge_cuts_use_for_center>` [boolean=true] Used when enabling the `force_edge_cuts`, in this case this is the `use_for_center` option of the forced
layer.
- ``frame_plot_mechanism`` :index:`: <pair: output - pcb_print - options; frame_plot_mechanism>` [string='internal'] [gui,internal,plot] Plotting the frame from Python is problematic. - ``frame_plot_mechanism`` :index:`: <pair: output - pcb_print - options; frame_plot_mechanism>` [string='internal'] [gui,internal,plot] Plotting the frame from Python is problematic.
This option selects a workaround strategy. This option selects a workaround strategy.
gui: uses KiCad GUI to do it. Is slow but you get the correct frame. gui: uses KiCad GUI to do it. Is slow but you get the correct frame.
@ -133,6 +139,9 @@ Parameters:
Affected by global options. Affected by global options.
- ``individual_page_scaling`` :index:`: <pair: output - pcb_print - options; individual_page_scaling>` [boolean=true] Tell KiCad to apply the scaling for each page as a separated entity. - ``individual_page_scaling`` :index:`: <pair: output - pcb_print - options; individual_page_scaling>` [boolean=true] Tell KiCad to apply the scaling for each page as a separated entity.
Disabling it the pages are coherent and can be superposed. Disabling it the pages are coherent and can be superposed.
- ``invert_use_for_center`` :index:`: <pair: output - pcb_print - options; invert_use_for_center>` [boolean=false] Invert the meaning of the `use_for_center` layer option.
This can be used to just select the edge cuts for centering, in this case enable this option
and disable the `use_for_center` option of the edge cuts layer.
- ``keep_temporal_files`` :index:`: <pair: output - pcb_print - options; keep_temporal_files>` [boolean=false] Store the temporal page and layer files in the output dir and don't delete them. - ``keep_temporal_files`` :index:`: <pair: output - pcb_print - options; keep_temporal_files>` [boolean=false] Store the temporal page and layer files in the output dir and don't delete them.
- ``micro_via_color`` :index:`: <pair: output - pcb_print - options; micro_via_color>` [string=''] Color used for micro `colored_vias`. - ``micro_via_color`` :index:`: <pair: output - pcb_print - options; micro_via_color>` [string=''] Color used for micro `colored_vias`.
- ``pad_color`` :index:`: <pair: output - pcb_print - options; pad_color>` [string=''] Color used for `colored_pads`. - ``pad_color`` :index:`: <pair: output - pcb_print - options; pad_color>` [string=''] Color used for `colored_pads`.

View File

@ -135,6 +135,9 @@ class LayerOptions(Layer):
""" Include the footprint values """ """ Include the footprint values """
self.force_plot_invisible_refs_vals = False self.force_plot_invisible_refs_vals = False
""" Include references and values even when they are marked as invisible """ """ Include references and values even when they are marked as invisible """
self.use_for_center = True
""" Use this layer for centering purposes.
You can invert the meaning using the `invert_use_for_center` option """
def config(self, parent): def config(self, parent):
super().config(parent) super().config(parent)
@ -327,6 +330,9 @@ class PCB_PrintOptions(VariantOptions):
""" Store the temporal page and layer files in the output dir and don't delete them """ """ Store the temporal page and layer files in the output dir and don't delete them """
self.force_edge_cuts = False self.force_edge_cuts = False
""" *Add the `Edge.Cuts` to all the pages """ """ *Add the `Edge.Cuts` to all the pages """
self.forced_edge_cuts_use_for_center = True
""" Used when enabling the `force_edge_cuts`, in this case this is the `use_for_center` option of the forced
layer """
self.forced_edge_cuts_color = '' self.forced_edge_cuts_color = ''
""" Color used for the `force_edge_cuts` option """ """ Color used for the `force_edge_cuts` option """
self.scaling = 1.0 self.scaling = 1.0
@ -352,6 +358,10 @@ class PCB_PrintOptions(VariantOptions):
""" [0,6] Scale factor used to represent 1 mm in the SVG (KiCad 6). """ [0,6] Scale factor used to represent 1 mm in the SVG (KiCad 6).
The value is how much zeros has the multiplier (1 mm = 10 power `svg_precision` units). The value is how much zeros has the multiplier (1 mm = 10 power `svg_precision` units).
Note that for an A4 paper Firefox 91 and Chrome 105 can't handle more than 5 """ Note that for an A4 paper Firefox 91 and Chrome 105 can't handle more than 5 """
self.invert_use_for_center = False
""" Invert the meaning of the `use_for_center` layer option.
This can be used to just select the edge cuts for centering, in this case enable this option
and disable the `use_for_center` option of the edge cuts layer """
add_drill_marks(self) add_drill_marks(self)
super().__init__() super().__init__()
self._expand_id = 'assembly' self._expand_id = 'assembly'
@ -1164,8 +1174,9 @@ class PCB_PrintOptions(VariantOptions):
vis_layers = LSET() vis_layers = LSET()
for p in self.pages: for p in self.pages:
for la in p.layers: for la in p.layers:
if la.use_for_center ^ self.invert_use_for_center:
vis_layers.addLayer(la._id) vis_layers.addLayer(la._id)
if self.force_edge_cuts: if self.force_edge_cuts and (self.forced_edge_cuts_use_for_center ^ self.invert_use_for_center):
vis_layers.addLayer(edge_id) vis_layers.addLayer(edge_id)
GS.board.SetVisibleLayers(vis_layers) GS.board.SetVisibleLayers(vis_layers)
# Generate the output, page by page # Generate the output, page by page
@ -1176,8 +1187,9 @@ class PCB_PrintOptions(VariantOptions):
if self.individual_page_scaling: if self.individual_page_scaling:
vis_layers = LSET() vis_layers = LSET()
for la in p.layers: for la in p.layers:
if la.use_for_center ^ self.invert_use_for_center:
vis_layers.addLayer(la._id) vis_layers.addLayer(la._id)
if self.force_edge_cuts: if self.force_edge_cuts and (self.forced_edge_cuts_use_for_center ^ self.invert_use_for_center):
vis_layers.addLayer(edge_id) vis_layers.addLayer(edge_id)
GS.board.SetVisibleLayers(vis_layers) GS.board.SetVisibleLayers(vis_layers)
needs_ki7_scale_workaround = p.scaling != 1.0 and self.check_ki7_scale_issue() needs_ki7_scale_workaround = p.scaling != 1.0 and self.check_ki7_scale_issue()