From b27872d7e8f9670acf3e57af29f73502a7aa1eb2 Mon Sep 17 00:00:00 2001 From: "Salvador E. Tropea" Date: Tue, 27 Oct 2020 17:58:51 -0300 Subject: [PATCH] Fixed problems when using the `pdf_pcb_print` on special case. When using variants to remove a component with ridiculous pads that only has solder paste (no copper, nor even solder mask aperture). --- CHANGELOG.md | 4 + kibot/misc.py | 1 + kibot/out_base.py | 16 +- .../kicad_5/wrong_paste.kicad_pcb | 361 ++++++++++++++++++ tests/board_samples/kicad_5/wrong_paste.sch | 28 ++ tests/test_plot/test_print_pcb.py | 11 + tests/yaml_samples/wrong_paste.kibot.yaml | 17 + 7 files changed, 435 insertions(+), 3 deletions(-) create mode 100644 tests/board_samples/kicad_5/wrong_paste.kicad_pcb create mode 100644 tests/board_samples/kicad_5/wrong_paste.sch create mode 100644 tests/yaml_samples/wrong_paste.kibot.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index c91eb215..560a3e19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - KiBom variants when using multiple variants and a components used more than one, specifying oposite rules. +- Problems when using the `pdf_pcb_print` output and variants to remove + a component with ridiculous pads that only has solder paste (no + copper, nor even solder mask aperture). + ## [0.7.0] - 2020-09-11 ### Added diff --git a/kibot/misc.py b/kibot/misc.py index 2dfbc810..b20cb533 100644 --- a/kibot/misc.py +++ b/kibot/misc.py @@ -155,6 +155,7 @@ W_MISSLIB = '(W041) ' W_MISSDCM = '(W042) ' W_MISSCMP = '(W043) ' W_VARSCH = '(W044) ' +W_WRONGPASTE = '(W045) ' class Rect(object): diff --git a/kibot/out_base.py b/kibot/out_base.py index 16f2d0be..80da1a73 100644 --- a/kibot/out_base.py +++ b/kibot/out_base.py @@ -5,7 +5,7 @@ # Project: KiBot (formerly KiPlot) from .gs import GS from .kiplot import load_sch -from .misc import Rect, KICAD_VERSION_5_99 +from .misc import Rect, KICAD_VERSION_5_99, W_WRONGPASTE if GS.kicad_version_n >= KICAD_VERSION_5_99: # New name, no alias ... from pcbnew import FP_SHAPE, wxPoint, LSET @@ -190,14 +190,18 @@ class VariantOptions(BaseOptions): def remove_paste_and_glue(self, board, comps_hash): """ Remove from solder paste layers the filtered components. """ exclude = LSET() - exclude.addLayer(board.GetLayerID('F.Paste')) - exclude.addLayer(board.GetLayerID('B.Paste')) + fpaste = board.GetLayerID('F.Paste') + bpaste = board.GetLayerID('B.Paste') + exclude.addLayer(fpaste) + exclude.addLayer(bpaste) old_layers = [] fadhes = board.GetLayerID('F.Adhes') badhes = board.GetLayerID('B.Adhes') old_fadhes = [] old_badhes = [] rescue = board.GetLayerID('Rescue') + fmask = board.GetLayerID('F.Mask') + bmask = board.GetLayerID('B.Mask') for m in board.GetModules(): ref = m.GetReference() c = comps_hash.get(ref, None) @@ -206,8 +210,14 @@ class VariantOptions(BaseOptions): old_c_layers = [] for p in m.Pads(): pad_layers = p.GetLayerSet() + is_front = fpaste in pad_layers.Seq() old_c_layers.append(pad_layers.FmtHex()) pad_layers.removeLayerSet(exclude) + if len(pad_layers.Seq()) == 0: + # No layers at all. Ridiculous, but happends. + # At least add an F.Mask + pad_layers.addLayer(fmask if is_front else bmask) + logger.warning(W_WRONGPASTE+'Pad with solder paste, but no copper or solder mask aperture in '+ref) p.SetLayerSet(pad_layers) old_layers.append(old_c_layers) # Remove any graphical item in the *.Adhes layers diff --git a/tests/board_samples/kicad_5/wrong_paste.kicad_pcb b/tests/board_samples/kicad_5/wrong_paste.kicad_pcb new file mode 100644 index 00000000..71cedbf3 --- /dev/null +++ b/tests/board_samples/kicad_5/wrong_paste.kicad_pcb @@ -0,0 +1,361 @@ +(kicad_pcb (version 20171130) (host pcbnew 5.1.7+dfsg1-1) + + (general + (thickness 1.6) + (drawings 0) + (tracks 0) + (zones 0) + (modules 1) + (nets 28) + ) + + (page A4) + (layers + (0 F.Cu signal) + (31 B.Cu signal) + (32 B.Adhes user) + (33 F.Adhes user) + (34 B.Paste user) + (35 F.Paste user) + (36 B.SilkS user) + (37 F.SilkS user) + (38 B.Mask user) + (39 F.Mask user) + (40 Dwgs.User user) + (41 Cmts.User user) + (42 Eco1.User user) + (43 Eco2.User user) + (44 Edge.Cuts user) + (45 Margin user) + (46 B.CrtYd user) + (47 F.CrtYd user) + (48 B.Fab user) + (49 F.Fab user) + ) + + (setup + (last_trace_width 0.25) + (trace_clearance 0.2) + (zone_clearance 0.508) + (zone_45_only no) + (trace_min 0.2) + (via_size 0.8) + (via_drill 0.4) + (via_min_size 0.4) + (via_min_drill 0.3) + (uvia_size 0.3) + (uvia_drill 0.1) + (uvias_allowed no) + (uvia_min_size 0.2) + (uvia_min_drill 0.1) + (edge_width 0.05) + (segment_width 0.2) + (pcb_text_width 0.3) + (pcb_text_size 1.5 1.5) + (mod_edge_width 0.12) + (mod_text_size 1 1) + (mod_text_width 0.15) + (pad_size 1.524 1.524) + (pad_drill 0.762) + (pad_to_mask_clearance 0) + (aux_axis_origin 0 0) + (visible_elements FFFFFF7F) + (pcbplotparams + (layerselection 0x010fc_ffffffff) + (usegerberextensions false) + (usegerberattributes true) + (usegerberadvancedattributes true) + (creategerberjobfile true) + (excludeedgelayer true) + (linewidth 0.100000) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15.000000) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue true) + (plotinvisibletext false) + (padsonsilk false) + (subtractmaskfromsilk false) + (outputformat 1) + (mirror false) + (drillshape 1) + (scaleselection 1) + (outputdirectory "")) + ) + + (net 0 "") + (net 1 "Net-(U1-Pad2)") + (net 2 "Net-(U1-Pad28)") + (net 3 "Net-(U1-Pad27)") + (net 4 "Net-(U1-Pad26)") + (net 5 "Net-(U1-Pad25)") + (net 6 "Net-(U1-Pad24)") + (net 7 "Net-(U1-Pad23)") + (net 8 "Net-(U1-Pad22)") + (net 9 "Net-(U1-Pad21)") + (net 10 "Net-(U1-Pad20)") + (net 11 "Net-(U1-Pad19)") + (net 12 "Net-(U1-Pad18)") + (net 13 "Net-(U1-Pad17)") + (net 14 "Net-(U1-Pad16)") + (net 15 "Net-(U1-Pad15)") + (net 16 "Net-(U1-Pad14)") + (net 17 "Net-(U1-Pad13)") + (net 18 "Net-(U1-Pad12)") + (net 19 "Net-(U1-Pad11)") + (net 20 "Net-(U1-Pad10)") + (net 21 "Net-(U1-Pad9)") + (net 22 "Net-(U1-Pad8)") + (net 23 "Net-(U1-Pad7)") + (net 24 "Net-(U1-Pad5)") + (net 25 "Net-(U1-Pad4)") + (net 26 "Net-(U1-Pad3)") + (net 27 "Net-(U1-Pad1)") + + (net_class Default "This is the default net class." + (clearance 0.2) + (trace_width 0.25) + (via_dia 0.8) + (via_drill 0.4) + (uvia_dia 0.3) + (uvia_drill 0.1) + (add_net "Net-(U1-Pad1)") + (add_net "Net-(U1-Pad10)") + (add_net "Net-(U1-Pad11)") + (add_net "Net-(U1-Pad12)") + (add_net "Net-(U1-Pad13)") + (add_net "Net-(U1-Pad14)") + (add_net "Net-(U1-Pad15)") + (add_net "Net-(U1-Pad16)") + (add_net "Net-(U1-Pad17)") + (add_net "Net-(U1-Pad18)") + (add_net "Net-(U1-Pad19)") + (add_net "Net-(U1-Pad2)") + (add_net "Net-(U1-Pad20)") + (add_net "Net-(U1-Pad21)") + (add_net "Net-(U1-Pad22)") + (add_net "Net-(U1-Pad23)") + (add_net "Net-(U1-Pad24)") + (add_net "Net-(U1-Pad25)") + (add_net "Net-(U1-Pad26)") + (add_net "Net-(U1-Pad27)") + (add_net "Net-(U1-Pad28)") + (add_net "Net-(U1-Pad3)") + (add_net "Net-(U1-Pad4)") + (add_net "Net-(U1-Pad5)") + (add_net "Net-(U1-Pad7)") + (add_net "Net-(U1-Pad8)") + (add_net "Net-(U1-Pad9)") + ) + + (module Package_DFN_QFN:QFN-28-1EP_5x5mm_P0.5mm_EP3.35x3.35mm_ThermalVias (layer F.Cu) (tedit 5DC5F6A4) (tstamp 5F9851E2) + (at 112.903 67.6148) + (descr "QFN, 28 Pin (http://ww1.microchip.com/downloads/en/PackagingSpec/00000049BQ.pdf#page=283), generated with kicad-footprint-generator ipc_noLead_generator.py") + (tags "QFN NoLead") + (path /5F9852AB) + (attr smd) + (fp_text reference U1 (at 0 -3.8) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value AX5043 (at 0 3.8) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user %R (at 0 0) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.885 -2.61) (end 2.61 -2.61) (layer F.SilkS) (width 0.12)) + (fp_line (start 2.61 -2.61) (end 2.61 -1.885) (layer F.SilkS) (width 0.12)) + (fp_line (start -1.885 2.61) (end -2.61 2.61) (layer F.SilkS) (width 0.12)) + (fp_line (start -2.61 2.61) (end -2.61 1.885) (layer F.SilkS) (width 0.12)) + (fp_line (start 1.885 2.61) (end 2.61 2.61) (layer F.SilkS) (width 0.12)) + (fp_line (start 2.61 2.61) (end 2.61 1.885) (layer F.SilkS) (width 0.12)) + (fp_line (start -1.885 -2.61) (end -2.61 -2.61) (layer F.SilkS) (width 0.12)) + (fp_line (start -1.5 -2.5) (end 2.5 -2.5) (layer F.Fab) (width 0.1)) + (fp_line (start 2.5 -2.5) (end 2.5 2.5) (layer F.Fab) (width 0.1)) + (fp_line (start 2.5 2.5) (end -2.5 2.5) (layer F.Fab) (width 0.1)) + (fp_line (start -2.5 2.5) (end -2.5 -1.5) (layer F.Fab) (width 0.1)) + (fp_line (start -2.5 -1.5) (end -1.5 -2.5) (layer F.Fab) (width 0.1)) + (fp_line (start -3.1 -3.1) (end -3.1 3.1) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.1 3.1) (end 3.1 3.1) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.1 3.1) (end 3.1 -3.1) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.1 -3.1) (end -3.1 -3.1) (layer F.CrtYd) (width 0.05)) + (pad "" smd custom (at 1.3375 1.3375) (size 0.43669 0.43669) (layers F.Paste) + (options (clearance outline) (anchor circle)) + (primitives + (gr_poly (pts + (xy -0.164589 -0.075523) (xy -0.075523 -0.164589) (xy 0.164589 -0.164589) (xy 0.164589 0.164589) (xy -0.164589 0.164589) +) (width 0.215024)) + )) + (pad "" smd custom (at 1.3375 -1.3375) (size 0.43669 0.43669) (layers F.Paste) + (options (clearance outline) (anchor circle)) + (primitives + (gr_poly (pts + (xy -0.164589 -0.164589) (xy 0.164589 -0.164589) (xy 0.164589 0.164589) (xy -0.075523 0.164589) (xy -0.164589 0.075523) +) (width 0.215024)) + )) + (pad "" smd custom (at -1.3375 1.3375) (size 0.43669 0.43669) (layers F.Paste) + (options (clearance outline) (anchor circle)) + (primitives + (gr_poly (pts + (xy -0.164589 -0.164589) (xy 0.075523 -0.164589) (xy 0.164589 -0.075523) (xy 0.164589 0.164589) (xy -0.164589 0.164589) +) (width 0.215024)) + )) + (pad "" smd custom (at -1.3375 -1.3375) (size 0.43669 0.43669) (layers F.Paste) + (options (clearance outline) (anchor circle)) + (primitives + (gr_poly (pts + (xy -0.164589 -0.164589) (xy 0.164589 -0.164589) (xy 0.164589 0.075523) (xy 0.075523 0.164589) (xy -0.164589 0.164589) +) (width 0.215024)) + )) + (pad "" smd custom (at 0.5 1.3375) (size 0.458956 0.458956) (layers F.Paste) + (options (clearance outline) (anchor circle)) + (primitives + (gr_poly (pts + (xy -0.317866 -0.116234) (xy -0.247246 -0.186855) (xy 0.247246 -0.186855) (xy 0.317866 -0.116234) (xy 0.317866 0.186855) + (xy -0.317866 0.186855)) (width 0.170493)) + )) + (pad "" smd custom (at -0.5 1.3375) (size 0.458956 0.458956) (layers F.Paste) + (options (clearance outline) (anchor circle)) + (primitives + (gr_poly (pts + (xy -0.317866 -0.116234) (xy -0.247246 -0.186855) (xy 0.247246 -0.186855) (xy 0.317866 -0.116234) (xy 0.317866 0.186855) + (xy -0.317866 0.186855)) (width 0.170493)) + )) + (pad "" smd custom (at 0.5 -1.3375) (size 0.458956 0.458956) (layers F.Paste) + (options (clearance outline) (anchor circle)) + (primitives + (gr_poly (pts + (xy -0.317866 -0.186855) (xy 0.317866 -0.186855) (xy 0.317866 0.116234) (xy 0.247246 0.186855) (xy -0.247246 0.186855) + (xy -0.317866 0.116234)) (width 0.170493)) + )) + (pad "" smd custom (at -0.5 -1.3375) (size 0.458956 0.458956) (layers F.Paste) + (options (clearance outline) (anchor circle)) + (primitives + (gr_poly (pts + (xy -0.317866 -0.186855) (xy 0.317866 -0.186855) (xy 0.317866 0.116234) (xy 0.247246 0.186855) (xy -0.247246 0.186855) + (xy -0.317866 0.116234)) (width 0.170493)) + )) + (pad "" smd custom (at 1.3375 0.5) (size 0.458956 0.458956) (layers F.Paste) + (options (clearance outline) (anchor circle)) + (primitives + (gr_poly (pts + (xy -0.186855 -0.247246) (xy -0.116234 -0.317866) (xy 0.186855 -0.317866) (xy 0.186855 0.317866) (xy -0.116234 0.317866) + (xy -0.186855 0.247246)) (width 0.170493)) + )) + (pad "" smd custom (at 1.3375 -0.5) (size 0.458956 0.458956) (layers F.Paste) + (options (clearance outline) (anchor circle)) + (primitives + (gr_poly (pts + (xy -0.186855 -0.247246) (xy -0.116234 -0.317866) (xy 0.186855 -0.317866) (xy 0.186855 0.317866) (xy -0.116234 0.317866) + (xy -0.186855 0.247246)) (width 0.170493)) + )) + (pad "" smd custom (at -1.3375 0.5) (size 0.458956 0.458956) (layers F.Paste) + (options (clearance outline) (anchor circle)) + (primitives + (gr_poly (pts + (xy -0.186855 -0.317866) (xy 0.116234 -0.317866) (xy 0.186855 -0.247246) (xy 0.186855 0.247246) (xy 0.116234 0.317866) + (xy -0.186855 0.317866)) (width 0.170493)) + )) + (pad "" smd custom (at -1.3375 -0.5) (size 0.458956 0.458956) (layers F.Paste) + (options (clearance outline) (anchor circle)) + (primitives + (gr_poly (pts + (xy -0.186855 -0.317866) (xy 0.116234 -0.317866) (xy 0.186855 -0.247246) (xy 0.186855 0.247246) (xy 0.116234 0.317866) + (xy -0.186855 0.317866)) (width 0.170493)) + )) + (pad "" smd roundrect (at 0.5 0.5) (size 0.806226 0.806226) (layers F.Paste) (roundrect_rratio 0.25)) + (pad "" smd roundrect (at 0.5 -0.5) (size 0.806226 0.806226) (layers F.Paste) (roundrect_rratio 0.25)) + (pad "" smd roundrect (at -0.5 0.5) (size 0.806226 0.806226) (layers F.Paste) (roundrect_rratio 0.25)) + (pad "" smd roundrect (at -0.5 -0.5) (size 0.806226 0.806226) (layers F.Paste) (roundrect_rratio 0.25)) + (pad 29 smd rect (at 0 0) (size 2.5 2.5) (layers B.Cu) + (net 1 "Net-(U1-Pad2)")) + (pad 29 thru_hole circle (at 1 1) (size 0.5 0.5) (drill 0.2) (layers *.Cu) + (net 1 "Net-(U1-Pad2)")) + (pad 29 thru_hole circle (at 0 1) (size 0.5 0.5) (drill 0.2) (layers *.Cu) + (net 1 "Net-(U1-Pad2)")) + (pad 29 thru_hole circle (at -1 1) (size 0.5 0.5) (drill 0.2) (layers *.Cu) + (net 1 "Net-(U1-Pad2)")) + (pad 29 thru_hole circle (at 1 0) (size 0.5 0.5) (drill 0.2) (layers *.Cu) + (net 1 "Net-(U1-Pad2)")) + (pad 29 thru_hole circle (at 0 0) (size 0.5 0.5) (drill 0.2) (layers *.Cu) + (net 1 "Net-(U1-Pad2)")) + (pad 29 thru_hole circle (at -1 0) (size 0.5 0.5) (drill 0.2) (layers *.Cu) + (net 1 "Net-(U1-Pad2)")) + (pad 29 thru_hole circle (at 1 -1) (size 0.5 0.5) (drill 0.2) (layers *.Cu) + (net 1 "Net-(U1-Pad2)")) + (pad 29 thru_hole circle (at 0 -1) (size 0.5 0.5) (drill 0.2) (layers *.Cu) + (net 1 "Net-(U1-Pad2)")) + (pad 29 thru_hole circle (at -1 -1) (size 0.5 0.5) (drill 0.2) (layers *.Cu) + (net 1 "Net-(U1-Pad2)")) + (pad 29 smd rect (at 0 0) (size 3.35 3.35) (layers F.Cu F.Mask) + (net 1 "Net-(U1-Pad2)")) + (pad 28 smd roundrect (at -1.5 -2.45) (size 0.25 0.8) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 2 "Net-(U1-Pad28)")) + (pad 27 smd roundrect (at -1 -2.45) (size 0.25 0.8) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 3 "Net-(U1-Pad27)")) + (pad 26 smd roundrect (at -0.5 -2.45) (size 0.25 0.8) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 4 "Net-(U1-Pad26)")) + (pad 25 smd roundrect (at 0 -2.45) (size 0.25 0.8) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 5 "Net-(U1-Pad25)")) + (pad 24 smd roundrect (at 0.5 -2.45) (size 0.25 0.8) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 6 "Net-(U1-Pad24)")) + (pad 23 smd roundrect (at 1 -2.45) (size 0.25 0.8) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 7 "Net-(U1-Pad23)")) + (pad 22 smd roundrect (at 1.5 -2.45) (size 0.25 0.8) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 8 "Net-(U1-Pad22)")) + (pad 21 smd roundrect (at 2.45 -1.5) (size 0.8 0.25) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 9 "Net-(U1-Pad21)")) + (pad 20 smd roundrect (at 2.45 -1) (size 0.8 0.25) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 10 "Net-(U1-Pad20)")) + (pad 19 smd roundrect (at 2.45 -0.5) (size 0.8 0.25) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 11 "Net-(U1-Pad19)")) + (pad 18 smd roundrect (at 2.45 0) (size 0.8 0.25) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 12 "Net-(U1-Pad18)")) + (pad 17 smd roundrect (at 2.45 0.5) (size 0.8 0.25) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 13 "Net-(U1-Pad17)")) + (pad 16 smd roundrect (at 2.45 1) (size 0.8 0.25) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 14 "Net-(U1-Pad16)")) + (pad 15 smd roundrect (at 2.45 1.5) (size 0.8 0.25) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 15 "Net-(U1-Pad15)")) + (pad 14 smd roundrect (at 1.5 2.45) (size 0.25 0.8) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 16 "Net-(U1-Pad14)")) + (pad 13 smd roundrect (at 1 2.45) (size 0.25 0.8) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 17 "Net-(U1-Pad13)")) + (pad 12 smd roundrect (at 0.5 2.45) (size 0.25 0.8) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 18 "Net-(U1-Pad12)")) + (pad 11 smd roundrect (at 0 2.45) (size 0.25 0.8) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 19 "Net-(U1-Pad11)")) + (pad 10 smd roundrect (at -0.5 2.45) (size 0.25 0.8) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 20 "Net-(U1-Pad10)")) + (pad 9 smd roundrect (at -1 2.45) (size 0.25 0.8) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 21 "Net-(U1-Pad9)")) + (pad 8 smd roundrect (at -1.5 2.45) (size 0.25 0.8) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 22 "Net-(U1-Pad8)")) + (pad 7 smd roundrect (at -2.45 1.5) (size 0.8 0.25) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 23 "Net-(U1-Pad7)")) + (pad 6 smd roundrect (at -2.45 1) (size 0.8 0.25) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 1 "Net-(U1-Pad2)")) + (pad 5 smd roundrect (at -2.45 0.5) (size 0.8 0.25) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 24 "Net-(U1-Pad5)")) + (pad 4 smd roundrect (at -2.45 0) (size 0.8 0.25) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 25 "Net-(U1-Pad4)")) + (pad 3 smd roundrect (at -2.45 -0.5) (size 0.8 0.25) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 26 "Net-(U1-Pad3)")) + (pad 2 smd roundrect (at -2.45 -1) (size 0.8 0.25) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 1 "Net-(U1-Pad2)")) + (pad 1 smd roundrect (at -2.45 -1.5) (size 0.8 0.25) (layers F.Cu F.Paste F.Mask) (roundrect_rratio 0.25) + (net 27 "Net-(U1-Pad1)")) + (model ${KISYS3DMOD}/Package_DFN_QFN.3dshapes/QFN-28-1EP_5x5mm_P0.5mm_EP3.35x3.35mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + +) diff --git a/tests/board_samples/kicad_5/wrong_paste.sch b/tests/board_samples/kicad_5/wrong_paste.sch new file mode 100644 index 00000000..315f5c1d --- /dev/null +++ b/tests/board_samples/kicad_5/wrong_paste.sch @@ -0,0 +1,28 @@ +EESchema Schematic File Version 4 +EELAYER 30 0 +EELAYER END +$Descr A4 11693 8268 +encoding utf-8 +Sheet 1 1 +Title "" +Date "" +Rev "" +Comp "" +Comment1 "" +Comment2 "" +Comment3 "" +Comment4 "" +$EndDescr +$Comp +L RF:AX5043 U1 +U 1 1 5F9852AB +P 3900 3350 +F 0 "U1" H 3900 2361 50 0000 C CNN +F 1 "AX5043" H 3900 2270 50 0000 C CNN +F 2 "Package_DFN_QFN:QFN-28-1EP_5x5mm_P0.5mm_EP3.35x3.35mm" H 6000 4800 50 0001 C CNN +F 3 "https://www.onsemi.com/pub/Collateral/AX5043-D.PDF" H 5250 4700 50 0001 C CNN +F 4 "DNF" H 3900 3350 50 0001 C CNN "Config" + 1 3900 3350 + 1 0 0 -1 +$EndComp +$EndSCHEMATC diff --git a/tests/test_plot/test_print_pcb.py b/tests/test_plot/test_print_pcb.py index 88ad2c40..680fbc7e 100644 --- a/tests/test_plot/test_print_pcb.py +++ b/tests/test_plot/test_print_pcb.py @@ -61,3 +61,14 @@ def test_print_pcb_options(): ctx.expect_out_file(PDF_FILE) ctx.compare_pdf(PDF_FILE) ctx.clean_up() + + +def test_print_wrong_paste(): + prj = 'wrong_paste' + ctx = context.TestContext('print_wrong_paste', prj, 'wrong_paste', PDF_DIR) + ctx.run() + # Check all outputs are there + fname = prj+'-F_Fab.pdf' + ctx.expect_out_file(fname) + ctx.search_err(r'Pad with solder paste, but no copper') + ctx.clean_up() diff --git a/tests/yaml_samples/wrong_paste.kibot.yaml b/tests/yaml_samples/wrong_paste.kibot.yaml new file mode 100644 index 00000000..d93e8abe --- /dev/null +++ b/tests/yaml_samples/wrong_paste.kibot.yaml @@ -0,0 +1,17 @@ +# Example KiBot config file +kibot: + version: 1 + +variants: + - name: 'default' + comment: 'Default variant' + type: ibom + variants_blacklist: DNF + +outputs: + - name: 'pdf_default' + comment: "PCB print w/variant" + type: pdf_pcb_print + options: + variant: default + layers: F.Fab