From f25d74628bf94cf5043e1ed7fcbc640d2772ac03 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Mon, 9 May 2022 09:24:39 +0200 Subject: [PATCH] Plot pad outlines on Fab files: fix many issues. Depending on plotter type and pad type, the plotted shapes were not always the outlines, but a outline inside the pad shape (due to legacy reasons). In many cases the plotted shape was in fact incorrect. Now the actual pads outlines are plotted without modification. From Master branch --- common/plotters/GERBER_plotter.cpp | 10 +++----- common/plotters/HPGL_plotter.cpp | 10 ++++---- common/plotters/PS_plotter.cpp | 41 ++---------------------------- common/plotters/plotter.cpp | 4 +-- 4 files changed, 12 insertions(+), 53 deletions(-) diff --git a/common/plotters/GERBER_plotter.cpp b/common/plotters/GERBER_plotter.cpp index 73a040248e..d4b0826c96 100644 --- a/common/plotters/GERBER_plotter.cpp +++ b/common/plotters/GERBER_plotter.cpp @@ -1252,7 +1252,7 @@ void GERBER_PLOTTER::FlashPadCircle( const wxPoint& pos, int diametre, OUTLINE_M SetCurrentLineWidth( USE_DEFAULT_LINE_WIDTH ); - Circle( pos, diametre - m_currentPenWidth, FILL_T::NO_FILL, DO_NOT_SET_LINE_WIDTH ); + Circle( pos, diametre, FILL_T::NO_FILL, DO_NOT_SET_LINE_WIDTH ); } else { @@ -1372,10 +1372,8 @@ void GERBER_PLOTTER::FlashPadRect( const wxPoint& pos, const wxSize& aSize, formatNetAttribute( &gbr_metadata->m_NetlistMetadata ); SetCurrentLineWidth( USE_DEFAULT_LINE_WIDTH ); - Rect( wxPoint( pos.x - (size.x - GetCurrentLineWidth()) / 2, - pos.y - (size.y - GetCurrentLineWidth()) / 2 ), - wxPoint( pos.x + (size.x - GetCurrentLineWidth()) / 2, - pos.y + (size.y - GetCurrentLineWidth()) / 2 ), + Rect( wxPoint( pos.x - ( size.x / 2 ), pos.y - ( size.y / 2 ) ), + wxPoint( pos.x + ( size.x / 2 ), pos.y + ( size.y / 2 ) ), FILL_T::NO_FILL, GetCurrentLineWidth() ); } else @@ -1445,7 +1443,6 @@ void GERBER_PLOTTER::FlashPadRoundRect( const wxPoint& aPadPos, const wxSize& aS 0.0, 0, 0, GetPlotterArcHighDef(), ERROR_INSIDE ); SetCurrentLineWidth( USE_DEFAULT_LINE_WIDTH, &gbr_metadata ); - outline.Inflate( -GetCurrentLineWidth()/2, 16 ); std::vector< wxPoint > cornerList; // TransformRoundRectToPolygon creates only one convex polygon @@ -1657,7 +1654,6 @@ void GERBER_PLOTTER::FlashPadCustom( const wxPoint& aPadPos, const wxSize& aSize if( aTraceMode != FILLED ) { SetCurrentLineWidth( USE_DEFAULT_LINE_WIDTH, &gbr_metadata ); - polyshape.Inflate( -GetCurrentLineWidth()/2, 16 ); } std::vector< wxPoint > cornerList; diff --git a/common/plotters/HPGL_plotter.cpp b/common/plotters/HPGL_plotter.cpp index eb8397cf3c..9c96575ed4 100644 --- a/common/plotters/HPGL_plotter.cpp +++ b/common/plotters/HPGL_plotter.cpp @@ -2,7 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2017 Jean-Pierre Charras, jp.charras at wanadoo.fr - * Copyright (C) 2020-2021 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2020-2022 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -486,7 +486,7 @@ void HPGL_PLOTTER::PlotPoly( const std::vector& aCornerList, FILL_T aFi m_current_item->content << hpgl_end_polygon_cmd; // Close, fill polygon and draw outlines m_current_item->pen_returns = true; } - else if( aWidth > 0 ) + else if( aWidth != 0 ) { // Plot only the polygon outline. for( unsigned ii = 1; ii < aCornerList.size(); ii++ ) @@ -659,10 +659,10 @@ void HPGL_PLOTTER::FlashPadCircle( const wxPoint& pos, int diametre, // if filled mode, the pen diameter is removed from diameter // to keep the pad size radius -= KiROUND( penDiameter ) / 2; - } - if( radius < 0 ) - radius = 0; + if( radius < 0 ) + radius = 0; + } double rsize = userToDeviceSize( radius ); diff --git a/common/plotters/PS_plotter.cpp b/common/plotters/PS_plotter.cpp index b99e7dc0a2..e5dc3308cb 100644 --- a/common/plotters/PS_plotter.cpp +++ b/common/plotters/PS_plotter.cpp @@ -2,7 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2017 Jean-Pierre Charras, jp.charras at wanadoo.fr - * Copyright (C) 2020-2021 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2020-2022 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -127,13 +127,7 @@ void PSLIKE_PLOTTER::FlashPadCircle( const wxPoint& aPadPos, int aDiameter, else // Plot a ring: { SetCurrentLineWidth( USE_DEFAULT_LINE_WIDTH ); - int linewidth = GetCurrentLineWidth(); - - // avoid aDiameter <= 1 ) - if( linewidth > aDiameter-2 ) - linewidth = aDiameter-2; - - Circle( aPadPos, aDiameter - linewidth, FILL_T::NO_FILL, linewidth ); + Circle( aPadPos, aDiameter, FILL_T::NO_FILL, GetCurrentLineWidth() ); } SetCurrentLineWidth( USE_DEFAULT_LINE_WIDTH ); @@ -152,15 +146,6 @@ void PSLIKE_PLOTTER::FlashPadRect( const wxPoint& aPadPos, const wxSize& aSize, else SetCurrentLineWidth( USE_DEFAULT_LINE_WIDTH ); - size.x -= GetCurrentLineWidth(); - size.y -= GetCurrentLineWidth(); - - if( size.x < 1 ) - size.x = 1; - - if( size.y < 1 ) - size.y = 1; - int dx = size.x / 2; int dy = size.y / 2; @@ -203,9 +188,6 @@ void PSLIKE_PLOTTER::FlashPadRoundRect( const wxPoint& aPadPos, const wxSize& aS else { SetCurrentLineWidth( USE_DEFAULT_LINE_WIDTH ); - size.x -= GetCurrentLineWidth(); - size.y -= GetCurrentLineWidth(); - aCornerRadius -= GetCurrentLineWidth() / 2; } @@ -243,8 +225,6 @@ void PSLIKE_PLOTTER::FlashPadCustom( const wxPoint& aPadPos, const wxSize& aSize else { SetCurrentLineWidth( USE_DEFAULT_LINE_WIDTH ); - size.x -= GetCurrentLineWidth(); - size.y -= GetCurrentLineWidth(); } @@ -283,23 +263,6 @@ void PSLIKE_PLOTTER::FlashPadTrapez( const wxPoint& aPadPos, const wxPoint *aCor else { SetCurrentLineWidth( USE_DEFAULT_LINE_WIDTH ); - int w = GetCurrentLineWidth(); - - // offset polygon by w - // coord[0] is assumed the lower left - // coord[1] is assumed the upper left - // coord[2] is assumed the upper right - // coord[3] is assumed the lower right - - /* Trace the outline. */ - cornerList[0].x += w; - cornerList[0].y -= w; - cornerList[1].x += w; - cornerList[1].y += w; - cornerList[2].x -= w; - cornerList[2].y += w; - cornerList[3].x -= w; - cornerList[3].y -= w; } for( int ii = 0; ii < 4; ii++ ) diff --git a/common/plotters/plotter.cpp b/common/plotters/plotter.cpp index 2830cf87e0..77b3f57312 100644 --- a/common/plotters/plotter.cpp +++ b/common/plotters/plotter.cpp @@ -2,7 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2017 Jean-Pierre Charras, jp.charras at wanadoo.fr - * Copyright (C) 2017-2021 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2017-2022 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -486,7 +486,7 @@ void PLOTTER::sketchOval( const wxPoint& pos, const wxSize& aSize, double orient } deltaxy = size.y - size.x; /* distance between centers of the oval */ - radius = ( size.x - width ) / 2; + radius = size.x / 2; cx = -radius; cy = -deltaxy / 2; RotatePoint( &cx, &cy, orient );