diff --git a/gerbview/am_primitive.cpp b/gerbview/am_primitive.cpp index fdc9918951..76a95ca970 100644 --- a/gerbview/am_primitive.cpp +++ b/gerbview/am_primitive.cpp @@ -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, bool aFilledShape ) { diff --git a/gerbview/am_primitive.h b/gerbview/am_primitive.h index b27fe8065a..7118599058 100644 --- a/gerbview/am_primitive.h +++ b/gerbview/am_primitive.h @@ -202,7 +202,8 @@ struct APERTURE_MACRO * @param aShapePos is the actual shape position. * @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 ); /** diff --git a/gerbview/dcode.cpp b/gerbview/dcode.cpp index 2af2cc5a90..033732aa35 100644 --- a/gerbview/dcode.cpp +++ b/gerbview/dcode.cpp @@ -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 ) { int radius; @@ -174,7 +174,7 @@ void D_CODE::DrawFlashedShape( GERBER_DRAW_ITEM* aParent, wxDC* aDC, const COLOR else // rectangular hole { if( m_Polygon.OutlineCount() == 0 ) - ConvertShapeToPolygon(); + ConvertShapeToPolygon( aParent ); DrawFlashedPolygon( aParent, aDC, aColor, aFilledShape, aShapePos ); } @@ -201,7 +201,7 @@ void D_CODE::DrawFlashedShape( GERBER_DRAW_ITEM* aParent, wxDC* aDC, const COLOR else { if( m_Polygon.OutlineCount() == 0 ) - ConvertShapeToPolygon(); + ConvertShapeToPolygon( aParent ); DrawFlashedPolygon( aParent, aDC, aColor, aFilledShape, aShapePos ); } @@ -242,7 +242,7 @@ void D_CODE::DrawFlashedShape( GERBER_DRAW_ITEM* aParent, wxDC* aDC, const COLOR else { if( m_Polygon.OutlineCount() == 0 ) - ConvertShapeToPolygon(); + ConvertShapeToPolygon( aParent ); 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: if( m_Polygon.OutlineCount() == 0 ) - ConvertShapeToPolygon(); + ConvertShapeToPolygon( aParent ); DrawFlashedPolygon( aParent, aDC, aColor, aFilledShape, aShapePos ); 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 ) { 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 ); -void D_CODE::ConvertShapeToPolygon() +void D_CODE::ConvertShapeToPolygon( const GERBER_DRAW_ITEM* aParent ) { VECTOR2I initialpos; VECTOR2I currpos; @@ -372,8 +373,7 @@ void D_CODE::ConvertShapeToPolygon() addHoleToPolygon( &m_Polygon, m_DrillShape, m_Drill, initialpos ); } - - break; + break; case APT_POLYGON: m_Polygon.NewOutline(); @@ -402,8 +402,9 @@ void D_CODE::ConvertShapeToPolygon() break; case APT_MACRO: - - // TODO + APERTURE_MACRO* macro = GetMacro(); + SHAPE_POLY_SET* macroShape = macro->GetApertureMacroShape( aParent, initialpos ); + m_Polygon.Append( *macroShape ); break; } } diff --git a/gerbview/dcode.h b/gerbview/dcode.h index 14002a4980..406e8aab51 100644 --- a/gerbview/dcode.h +++ b/gerbview/dcode.h @@ -141,7 +141,8 @@ public: * @param aShapePos is the actual shape position * @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 ); /** @@ -157,7 +158,8 @@ public: * @param aFilled set to true to draw in filled mode, false to draw in sketch mode. * @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 ); /** @@ -165,8 +167,10 @@ public: * * 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. + * @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 diff --git a/gerbview/export_to_pcbnew.cpp b/gerbview/export_to_pcbnew.cpp index d37e42e326..31c128664f 100644 --- a/gerbview/export_to_pcbnew.cpp +++ b/gerbview/export_to_pcbnew.cpp @@ -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_POLY: case GBR_SPOT_MACRO: - d_codeDescr->ConvertShapeToPolygon(); + d_codeDescr->ConvertShapeToPolygon( aGbrItem ); writePcbPolygon( d_codeDescr->m_Polygon, aLayer, aGbrItem->GetABPosition( seg_start ) ); 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_RECT: case GBR_SPOT_OVAL: + case GBR_SPOT_POLY: + case GBR_SPOT_MACRO: export_flashed_copper_item( aGbrItem, aLayer ); 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 ); D_CODE* d_codeDescr = aGbrItem->GetDcodeDescr(); - SHAPE_POLY_SET polygon; if( d_codeDescr == nullptr ) 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; } - d_codeDescr->ConvertShapeToPolygon(); - writePcbPolygon( d_codeDescr->m_Polygon, aLayer, offset ); + APERTURE_MACRO* macro = d_codeDescr->GetMacro(); + SHAPE_POLY_SET* macroShape = macro->GetApertureMacroShape( aGbrItem, VECTOR2I( 0, 0 ) ); + writePcbPolygon( *macroShape, aLayer, offset ); } diff --git a/gerbview/gerber_draw_item.cpp b/gerbview/gerber_draw_item.cpp index dbde150579..76adb2ea53 100644 --- a/gerbview/gerber_draw_item.cpp +++ b/gerbview/gerber_draw_item.cpp @@ -323,7 +323,7 @@ const BOX2I GERBER_DRAW_ITEM::GetBoundingBox() const if( code ) { if( code->m_Polygon.OutlineCount() == 0 ) - code->ConvertShapeToPolygon(); + code->ConvertShapeToPolygon( this ); bbox.Inflate( code->m_Polygon.BBox().GetWidth() / 2, code->m_Polygon.BBox().GetHeight() / 2 ); diff --git a/gerbview/gerbview_painter.cpp b/gerbview/gerbview_painter.cpp index e23f43d51c..823ebd2a0b 100644 --- a/gerbview/gerbview_painter.cpp +++ b/gerbview/gerbview_painter.cpp @@ -473,7 +473,7 @@ void GERBVIEW_PAINTER::drawFlashedShape( GERBER_DRAW_ITEM* aItem, bool aFilled ) else // rectangular hole { if( code->m_Polygon.OutlineCount() == 0 ) - code->ConvertShapeToPolygon(); + code->ConvertShapeToPolygon( aItem ); drawPolygon( aItem, code->m_Polygon, aFilled, true ); } @@ -498,7 +498,7 @@ void GERBVIEW_PAINTER::drawFlashedShape( GERBER_DRAW_ITEM* aItem, bool aFilled ) else { if( code->m_Polygon.OutlineCount() == 0 ) - code->ConvertShapeToPolygon(); + code->ConvertShapeToPolygon( aItem ); drawPolygon( aItem, code->m_Polygon, aFilled, true ); } @@ -537,7 +537,7 @@ void GERBVIEW_PAINTER::drawFlashedShape( GERBER_DRAW_ITEM* aItem, bool aFilled ) else { if( code->m_Polygon.OutlineCount() == 0 ) - code->ConvertShapeToPolygon(); + code->ConvertShapeToPolygon( aItem ); 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: if( code->m_Polygon.OutlineCount() == 0 ) - code->ConvertShapeToPolygon(); + code->ConvertShapeToPolygon( aItem ); drawPolygon( aItem, code->m_Polygon, aFilled, true ); break;