Gerbview: fix an issue (Debug only) with RoundRect aperture macro.
When a RoundRect aperture macro was used with a radius = 0, a wxWidget assert was generated, due to incorrect polygonal shape to draw.
This commit is contained in:
parent
76a6177eb7
commit
1151783a34
|
@ -2,7 +2,7 @@
|
|||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2020 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||
* Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
|
||||
* Copyright (C) 2021 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 as published by the
|
||||
|
@ -108,10 +108,10 @@
|
|||
"%AMOutline5P*\n\
|
||||
0 Free polygon, 5 corners , with rotation*\n\
|
||||
0 The origin of the aperture is its center*\n\
|
||||
0 number of corners: always 8*\n\
|
||||
0 number of corners: always 5*\n\
|
||||
0 $1 to $10 corner X, Y*\n\
|
||||
0 $11 Rotation angle, in degrees counterclockwise*\n\
|
||||
0 create outline with 8 corners*\n\
|
||||
0 create outline with 5 corners*\n\
|
||||
4,1,5,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$1,$2,$11*%\n"
|
||||
|
||||
// A aperture macro to define a polygon by 6 corners
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
*
|
||||
* Copyright (C) 1992-2017 Jean-Pierre Charras <jp.charras at wanadoo.fr>
|
||||
* Copyright (C) 2010 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
||||
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
|
||||
* Copyright (C) 1992-2021 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
|
||||
|
@ -96,10 +96,12 @@ void AM_PRIMITIVE::DrawBasicShape( const GERBER_DRAW_ITEM* aParent,
|
|||
SHAPE_POLY_SET& aShapeBuffer,
|
||||
wxPoint aShapePos )
|
||||
{
|
||||
#define TO_POLY_SHAPE { aShapeBuffer.NewOutline(); \
|
||||
for( unsigned jj = 0; jj < polybuffer.size(); jj++ )\
|
||||
aShapeBuffer.Append( polybuffer[jj].x, polybuffer[jj].y );\
|
||||
aShapeBuffer.Append( polybuffer[0].x, polybuffer[0].y );}
|
||||
#define TO_POLY_SHAPE { if( polybuffer.size() > 1 )\
|
||||
{ aShapeBuffer.NewOutline(); \
|
||||
for( unsigned jj = 0; jj < polybuffer.size(); jj++ )\
|
||||
aShapeBuffer.Append( polybuffer[jj].x, polybuffer[jj].y );\
|
||||
aShapeBuffer.Append( polybuffer[0].x, polybuffer[0].y );}\
|
||||
}
|
||||
|
||||
// Draw the primitive shape for flashed items.
|
||||
static std::vector<wxPoint> polybuffer; // create a static buffer to avoid a lot of memory reallocation
|
||||
|
@ -462,8 +464,13 @@ void AM_PRIMITIVE::ConvertShapeToPolygon( const GERBER_DRAW_ITEM* aParent,
|
|||
* <rotation> is a optional parameter: rotation from origin.
|
||||
* type is not stored in parameters list, so the first parameter is exposure
|
||||
*/
|
||||
wxPoint center = mapPt( params[2].GetValue( tool ), params[3].GetValue( tool ), m_GerbMetric );
|
||||
int radius = scaletoIU( params[1].GetValue( tool ), m_GerbMetric ) / 2;
|
||||
// A circle primitive can have a 0 size (for instance when used in roundrect macro),
|
||||
// so skip it
|
||||
if( radius <= 0 )
|
||||
break;
|
||||
|
||||
wxPoint center = mapPt( params[2].GetValue( tool ), params[3].GetValue( tool ), m_GerbMetric );
|
||||
wxPoint corner;
|
||||
const int delta = 3600 / seg_per_circle; // rot angle in 0.1 degree
|
||||
|
||||
|
@ -806,6 +813,9 @@ SHAPE_POLY_SET* APERTURE_MACRO::GetApertureMacroShape( const GERBER_DRAW_ITEM* a
|
|||
}
|
||||
}
|
||||
|
||||
// Merge and cleanup basic shape polygons
|
||||
m_shape.Simplify( SHAPE_POLY_SET::PM_FAST );
|
||||
|
||||
// If a hole is defined inside a polygon, we must fracture the polygon
|
||||
// to be able to drawn it (i.e link holes by overlapping edges)
|
||||
if( hasHole )
|
||||
|
|
Loading…
Reference in New Issue