Gerbview: fix missing pad shapes when exporting to Pcbnew.

This commit is contained in:
jean-pierre charras 2022-09-07 18:54:04 +02:00
parent 4efa13a3e3
commit 0b233d593a
7 changed files with 33 additions and 25 deletions

View File

@ -862,7 +862,7 @@ SHAPE_POLY_SET* APERTURE_MACRO::GetApertureMacroShape( const GERBER_DRAW_ITEM* a
} }
void APERTURE_MACRO::DrawApertureMacroShape( GERBER_DRAW_ITEM* aParent, wxDC* aDC, void APERTURE_MACRO::DrawApertureMacroShape( const GERBER_DRAW_ITEM* aParent, wxDC* aDC,
const COLOR4D& aColor, const VECTOR2I& aShapePos, const COLOR4D& aColor, const VECTOR2I& aShapePos,
bool aFilledShape ) bool aFilledShape )
{ {

View File

@ -202,7 +202,8 @@ struct APERTURE_MACRO
* @param aShapePos is the actual shape position. * @param aShapePos is the actual shape position.
* @param aFilledShape set to true to draw in filled mode, false to draw in sketch mode. * @param aFilledShape set to true to draw in filled mode, false to draw in sketch mode.
*/ */
void DrawApertureMacroShape( GERBER_DRAW_ITEM* aParent, wxDC* aDC, const COLOR4D& aColor, void DrawApertureMacroShape( const GERBER_DRAW_ITEM* aParent, wxDC* aDC,
const COLOR4D& aColor,
const VECTOR2I& aShapePos, bool aFilledShape ); const VECTOR2I& aShapePos, bool aFilledShape );
/** /**

View File

@ -144,7 +144,7 @@ int D_CODE::GetShapeDim( GERBER_DRAW_ITEM* aParent )
} }
void D_CODE::DrawFlashedShape( GERBER_DRAW_ITEM* aParent, wxDC* aDC, const COLOR4D& aColor, void D_CODE::DrawFlashedShape( const GERBER_DRAW_ITEM* aParent, wxDC* aDC, const COLOR4D& aColor,
const VECTOR2I& aShapePos, bool aFilledShape ) const VECTOR2I& aShapePos, bool aFilledShape )
{ {
int radius; int radius;
@ -174,7 +174,7 @@ void D_CODE::DrawFlashedShape( GERBER_DRAW_ITEM* aParent, wxDC* aDC, const COLOR
else // rectangular hole else // rectangular hole
{ {
if( m_Polygon.OutlineCount() == 0 ) if( m_Polygon.OutlineCount() == 0 )
ConvertShapeToPolygon(); ConvertShapeToPolygon( aParent );
DrawFlashedPolygon( aParent, aDC, aColor, aFilledShape, aShapePos ); DrawFlashedPolygon( aParent, aDC, aColor, aFilledShape, aShapePos );
} }
@ -201,7 +201,7 @@ void D_CODE::DrawFlashedShape( GERBER_DRAW_ITEM* aParent, wxDC* aDC, const COLOR
else else
{ {
if( m_Polygon.OutlineCount() == 0 ) if( m_Polygon.OutlineCount() == 0 )
ConvertShapeToPolygon(); ConvertShapeToPolygon( aParent );
DrawFlashedPolygon( aParent, aDC, aColor, aFilledShape, aShapePos ); DrawFlashedPolygon( aParent, aDC, aColor, aFilledShape, aShapePos );
} }
@ -242,7 +242,7 @@ void D_CODE::DrawFlashedShape( GERBER_DRAW_ITEM* aParent, wxDC* aDC, const COLOR
else else
{ {
if( m_Polygon.OutlineCount() == 0 ) if( m_Polygon.OutlineCount() == 0 )
ConvertShapeToPolygon(); ConvertShapeToPolygon( aParent );
DrawFlashedPolygon( aParent, aDC, aColor, aFilledShape, aShapePos ); DrawFlashedPolygon( aParent, aDC, aColor, aFilledShape, aShapePos );
} }
@ -252,7 +252,7 @@ void D_CODE::DrawFlashedShape( GERBER_DRAW_ITEM* aParent, wxDC* aDC, const COLOR
case APT_POLYGON: case APT_POLYGON:
if( m_Polygon.OutlineCount() == 0 ) if( m_Polygon.OutlineCount() == 0 )
ConvertShapeToPolygon(); ConvertShapeToPolygon( aParent );
DrawFlashedPolygon( aParent, aDC, aColor, aFilledShape, aShapePos ); DrawFlashedPolygon( aParent, aDC, aColor, aFilledShape, aShapePos );
break; break;
@ -260,7 +260,8 @@ void D_CODE::DrawFlashedShape( GERBER_DRAW_ITEM* aParent, wxDC* aDC, const COLOR
} }
void D_CODE::DrawFlashedPolygon( GERBER_DRAW_ITEM* aParent, wxDC* aDC, const COLOR4D& aColor, void D_CODE::DrawFlashedPolygon( const GERBER_DRAW_ITEM* aParent, wxDC* aDC,
const COLOR4D& aColor,
bool aFilled, const VECTOR2I& aPosition ) bool aFilled, const VECTOR2I& aPosition )
{ {
if( m_Polygon.OutlineCount() == 0 ) if( m_Polygon.OutlineCount() == 0 )
@ -290,7 +291,7 @@ static void addHoleToPolygon( SHAPE_POLY_SET* aPolygon, APERTURE_DEF_HOLETYPE aH
const VECTOR2I& aSize, const VECTOR2I& aAnchorPos ); const VECTOR2I& aSize, const VECTOR2I& aAnchorPos );
void D_CODE::ConvertShapeToPolygon() void D_CODE::ConvertShapeToPolygon( const GERBER_DRAW_ITEM* aParent )
{ {
VECTOR2I initialpos; VECTOR2I initialpos;
VECTOR2I currpos; VECTOR2I currpos;
@ -372,8 +373,7 @@ void D_CODE::ConvertShapeToPolygon()
addHoleToPolygon( &m_Polygon, m_DrillShape, m_Drill, initialpos ); addHoleToPolygon( &m_Polygon, m_DrillShape, m_Drill, initialpos );
} }
break;
break;
case APT_POLYGON: case APT_POLYGON:
m_Polygon.NewOutline(); m_Polygon.NewOutline();
@ -402,8 +402,9 @@ void D_CODE::ConvertShapeToPolygon()
break; break;
case APT_MACRO: case APT_MACRO:
APERTURE_MACRO* macro = GetMacro();
// TODO SHAPE_POLY_SET* macroShape = macro->GetApertureMacroShape( aParent, initialpos );
m_Polygon.Append( *macroShape );
break; break;
} }
} }

View File

@ -141,7 +141,8 @@ public:
* @param aShapePos is the actual shape position * @param aShapePos is the actual shape position
* @param aFilledShape set to true to draw in filled mode, false to draw in sketch mode * @param aFilledShape set to true to draw in filled mode, false to draw in sketch mode
*/ */
void DrawFlashedShape( GERBER_DRAW_ITEM* aParent, wxDC* aDC, const COLOR4D& aColor, void DrawFlashedShape( const GERBER_DRAW_ITEM* aParent, wxDC* aDC,
const COLOR4D& aColor,
const VECTOR2I& aShapePos, bool aFilledShape ); const VECTOR2I& aShapePos, bool aFilledShape );
/** /**
@ -157,7 +158,8 @@ public:
* @param aFilled set to true to draw in filled mode, false to draw in sketch mode. * @param aFilled set to true to draw in filled mode, false to draw in sketch mode.
* @param aPosition is the actual shape position. * @param aPosition is the actual shape position.
*/ */
void DrawFlashedPolygon( GERBER_DRAW_ITEM* aParent, wxDC* aDC, const COLOR4D& aColor, void DrawFlashedPolygon( const GERBER_DRAW_ITEM* aParent, wxDC* aDC,
const COLOR4D& aColor,
bool aFilled, const VECTOR2I& aPosition ); bool aFilled, const VECTOR2I& aPosition );
/** /**
@ -165,8 +167,10 @@ public:
* *
* Arcs and circles are approximated by segments. Useful when a shape is not a graphic * Arcs and circles are approximated by segments. Useful when a shape is not a graphic
* primitive (shape with hole, rotated shape ... ) and cannot be easily drawn. * primitive (shape with hole, rotated shape ... ) and cannot be easily drawn.
* @param aParent is the #GERBER_DRAW_ITEM using this DCode.
* Not used in all shapes, used for APT_MACRO
*/ */
void ConvertShapeToPolygon(); void ConvertShapeToPolygon( const GERBER_DRAW_ITEM* aParent );
/** /**
* Calculate a value that can be used to evaluate the size of text when displaying the * Calculate a value that can be used to evaluate the size of text when displaying the

View File

@ -170,7 +170,7 @@ void GBR_TO_PCB_EXPORTER::export_non_copper_item( const GERBER_DRAW_ITEM* aGbrIt
case GBR_SPOT_OVAL: case GBR_SPOT_OVAL:
case GBR_SPOT_POLY: case GBR_SPOT_POLY:
case GBR_SPOT_MACRO: case GBR_SPOT_MACRO:
d_codeDescr->ConvertShapeToPolygon(); d_codeDescr->ConvertShapeToPolygon( aGbrItem );
writePcbPolygon( d_codeDescr->m_Polygon, aLayer, aGbrItem->GetABPosition( seg_start ) ); writePcbPolygon( d_codeDescr->m_Polygon, aLayer, aGbrItem->GetABPosition( seg_start ) );
break; break;
@ -281,6 +281,8 @@ void GBR_TO_PCB_EXPORTER::export_copper_item( const GERBER_DRAW_ITEM* aGbrItem,
case GBR_SPOT_CIRCLE: case GBR_SPOT_CIRCLE:
case GBR_SPOT_RECT: case GBR_SPOT_RECT:
case GBR_SPOT_OVAL: case GBR_SPOT_OVAL:
case GBR_SPOT_POLY:
case GBR_SPOT_MACRO:
export_flashed_copper_item( aGbrItem, aLayer ); export_flashed_copper_item( aGbrItem, aLayer );
break; break;
@ -395,7 +397,6 @@ void GBR_TO_PCB_EXPORTER::export_flashed_copper_item( const GERBER_DRAW_ITEM* aG
static D_CODE flashed_item_D_CODE( 0 ); static D_CODE flashed_item_D_CODE( 0 );
D_CODE* d_codeDescr = aGbrItem->GetDcodeDescr(); D_CODE* d_codeDescr = aGbrItem->GetDcodeDescr();
SHAPE_POLY_SET polygon;
if( d_codeDescr == nullptr ) if( d_codeDescr == nullptr )
d_codeDescr = &flashed_item_D_CODE; d_codeDescr = &flashed_item_D_CODE;
@ -423,8 +424,9 @@ void GBR_TO_PCB_EXPORTER::export_flashed_copper_item( const GERBER_DRAW_ITEM* aG
return; return;
} }
d_codeDescr->ConvertShapeToPolygon(); APERTURE_MACRO* macro = d_codeDescr->GetMacro();
writePcbPolygon( d_codeDescr->m_Polygon, aLayer, offset ); SHAPE_POLY_SET* macroShape = macro->GetApertureMacroShape( aGbrItem, VECTOR2I( 0, 0 ) );
writePcbPolygon( *macroShape, aLayer, offset );
} }

View File

@ -323,7 +323,7 @@ const BOX2I GERBER_DRAW_ITEM::GetBoundingBox() const
if( code ) if( code )
{ {
if( code->m_Polygon.OutlineCount() == 0 ) if( code->m_Polygon.OutlineCount() == 0 )
code->ConvertShapeToPolygon(); code->ConvertShapeToPolygon( this );
bbox.Inflate( code->m_Polygon.BBox().GetWidth() / 2, bbox.Inflate( code->m_Polygon.BBox().GetWidth() / 2,
code->m_Polygon.BBox().GetHeight() / 2 ); code->m_Polygon.BBox().GetHeight() / 2 );

View File

@ -473,7 +473,7 @@ void GERBVIEW_PAINTER::drawFlashedShape( GERBER_DRAW_ITEM* aItem, bool aFilled )
else // rectangular hole else // rectangular hole
{ {
if( code->m_Polygon.OutlineCount() == 0 ) if( code->m_Polygon.OutlineCount() == 0 )
code->ConvertShapeToPolygon(); code->ConvertShapeToPolygon( aItem );
drawPolygon( aItem, code->m_Polygon, aFilled, true ); drawPolygon( aItem, code->m_Polygon, aFilled, true );
} }
@ -498,7 +498,7 @@ void GERBVIEW_PAINTER::drawFlashedShape( GERBER_DRAW_ITEM* aItem, bool aFilled )
else else
{ {
if( code->m_Polygon.OutlineCount() == 0 ) if( code->m_Polygon.OutlineCount() == 0 )
code->ConvertShapeToPolygon(); code->ConvertShapeToPolygon( aItem );
drawPolygon( aItem, code->m_Polygon, aFilled, true ); drawPolygon( aItem, code->m_Polygon, aFilled, true );
} }
@ -537,7 +537,7 @@ void GERBVIEW_PAINTER::drawFlashedShape( GERBER_DRAW_ITEM* aItem, bool aFilled )
else else
{ {
if( code->m_Polygon.OutlineCount() == 0 ) if( code->m_Polygon.OutlineCount() == 0 )
code->ConvertShapeToPolygon(); code->ConvertShapeToPolygon( aItem );
drawPolygon( aItem, code->m_Polygon, aFilled, true ); drawPolygon( aItem, code->m_Polygon, aFilled, true );
} }
@ -546,7 +546,7 @@ void GERBVIEW_PAINTER::drawFlashedShape( GERBER_DRAW_ITEM* aItem, bool aFilled )
case GBR_SPOT_POLY: case GBR_SPOT_POLY:
if( code->m_Polygon.OutlineCount() == 0 ) if( code->m_Polygon.OutlineCount() == 0 )
code->ConvertShapeToPolygon(); code->ConvertShapeToPolygon( aItem );
drawPolygon( aItem, code->m_Polygon, aFilled, true ); drawPolygon( aItem, code->m_Polygon, aFilled, true );
break; break;