Add knockout text support to IPC2581.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18042
This commit is contained in:
Jeff Young 2024-05-25 22:30:20 +01:00
parent b0dddb6d95
commit f1aea810cb
2 changed files with 32 additions and 3 deletions

View File

@ -598,6 +598,23 @@ void PCB_IO_IPC2581::addLineDesc( wxXmlNode* aNode, int aWidth, LINE_STYLE aDash
} }
void PCB_IO_IPC2581::addKnockoutText( wxXmlNode* aContentNode, PCB_TEXT* aText )
{
// If we are stroking a polygon, we need two contours. This is only allowed inside a
// "UserSpecial" shape
wxXmlNode* special_node = appendNode( aContentNode, "UserSpecial" );
SHAPE_POLY_SET finalPoly;
aText->TransformTextToPolySet( finalPoly, 0, m_board->GetDesignSettings().m_MaxError,
ERROR_INSIDE );
finalPoly.Fracture( SHAPE_POLY_SET::PM_FAST );
for( int ii = 0; ii < finalPoly.OutlineCount(); ++ii )
addContourNode( special_node, finalPoly, ii, FILL_T::FILLED_SHAPE, 0, LINE_STYLE::SOLID );
}
void PCB_IO_IPC2581::addText( wxXmlNode* aContentNode, EDA_TEXT* aText, void PCB_IO_IPC2581::addText( wxXmlNode* aContentNode, EDA_TEXT* aText,
const KIFONT::METRICS& aFontMetrics ) const KIFONT::METRICS& aFontMetrics )
{ {
@ -707,7 +724,7 @@ void PCB_IO_IPC2581::addText( wxXmlNode* aContentNode, EDA_TEXT* aText,
addXY( point_node, pts.front() ); addXY( point_node, pts.front() );
} ); } );
//TODO: handle knockout text and multiline //TODO: handle multiline text
font->Draw( &callback_gal, aText->GetShownText( true ), aText->GetTextPos(), attrs, font->Draw( &callback_gal, aText->GetShownText( true ), aText->GetTextPos(), attrs,
aFontMetrics ); aFontMetrics );
@ -2117,7 +2134,12 @@ wxXmlNode* PCB_IO_IPC2581::addPackage( wxXmlNode* aContentNode, FOOTPRINT* aFp )
case PCB_TEXT_T: case PCB_TEXT_T:
{ {
PCB_TEXT* text = static_cast<PCB_TEXT*>( item ); PCB_TEXT* text = static_cast<PCB_TEXT*>( item );
addText( output_node, text, text->GetFontMetrics() );
if( text->IsKnockout() )
addKnockoutText( output_node, text );
else
addText( output_node, text, text->GetFontMetrics() );
break; break;
} }
@ -2708,7 +2730,11 @@ void PCB_IO_IPC2581::generateLayerSetNet( wxXmlNode* aLayerNode, PCB_LAYER_ID aL
wxXmlNode* tempFeature = appendNode( tempSetNode, "Features" ); wxXmlNode* tempFeature = appendNode( tempSetNode, "Features" );
addLocationNode( tempFeature, 0.0, 0.0 ); addLocationNode( tempFeature, 0.0, 0.0 );
addText( tempFeature, text_item, text->GetFontMetrics() );
if( text->Type() == PCB_TEXT_T && static_cast<PCB_TEXT*>( text )->IsKnockout() )
addKnockoutText( tempFeature, static_cast<PCB_TEXT*>( text ) );
else
addText( tempFeature, text_item, text->GetFontMetrics() );
if( text->Type() == PCB_TEXTBOX_T ) if( text->Type() == PCB_TEXTBOX_T )
{ {

View File

@ -42,6 +42,7 @@ class NETINFO_ITEM;
class PAD; class PAD;
class PCB_SHAPE; class PCB_SHAPE;
class PCB_VIA; class PCB_VIA;
class PCB_TEXT;
class PROGRESS_REPORTER; class PROGRESS_REPORTER;
class SHAPE_POLY_SET; class SHAPE_POLY_SET;
class SHAPE_SEGMENT; class SHAPE_SEGMENT;
@ -209,6 +210,8 @@ private:
void addSlotCavity( wxXmlNode* aContentNode, const PAD& aPad, const wxString& aName ); void addSlotCavity( wxXmlNode* aContentNode, const PAD& aPad, const wxString& aName );
void addKnockoutText( wxXmlNode* aContentNode, PCB_TEXT* aText );
void addText( wxXmlNode* aContentNode, EDA_TEXT* aShape, const KIFONT::METRICS& aFontMetrics ); void addText( wxXmlNode* aContentNode, EDA_TEXT* aShape, const KIFONT::METRICS& aFontMetrics );
void addLineDesc( wxXmlNode* aNode, int aWidth, LINE_STYLE aDashType, bool aForce = false ); void addLineDesc( wxXmlNode* aNode, int aWidth, LINE_STYLE aDashType, bool aForce = false );