Explicit control over hidden text in bounding boxes.

In particular, don't consider hidden text when plotting,
and only when AsItemCheckboxes is checked for printing.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/17958
This commit is contained in:
Jeff Young 2024-05-06 21:34:40 +01:00
parent 24f02e72d0
commit 8184ed64e7
14 changed files with 24 additions and 25 deletions

View File

@ -344,7 +344,7 @@ void BOARD_ADAPTER::InitSettings( REPORTER* aStatusReporter, REPORTER* aWarningR
BOX2I bbbox; BOX2I bbbox;
if( m_board ) if( m_board )
bbbox = m_board->ComputeBoundingBox( !m_board->IsFootprintHolder() && haveOutline ); bbbox = m_board->ComputeBoundingBox( !m_board->IsFootprintHolder() && haveOutline, false );
// Gives a non null size to avoid issues in zoom / scale calculations // Gives a non null size to avoid issues in zoom / scale calculations
if( ( bbbox.GetWidth() == 0 ) && ( bbbox.GetHeight() == 0 ) ) if( ( bbbox.GetWidth() == 0 ) && ( bbbox.GetHeight() == 0 ) )

View File

@ -1552,17 +1552,13 @@ unsigned BOARD::GetNodesCount( int aNet ) const
} }
BOX2I BOARD::ComputeBoundingBox( bool aBoardEdgesOnly ) const BOX2I BOARD::ComputeBoundingBox( bool aBoardEdgesOnly, bool aIncludeHiddenText ) const
{ {
BOX2I bbox; BOX2I bbox;
LSET visible = GetVisibleLayers(); LSET visible = GetVisibleLayers();
bool showHiddenText = IsElementVisible( LAYER_HIDDEN_TEXT );
if( PgmOrNull() && PgmOrNull()->m_Printing ) // If the board is just showing a footprint, we want all footprint layers included in the
showHiddenText = false; // bounding box
// If the board is just showing a footprint, we want all footprint layers
// included in the bounding box
if( IsFootprintHolder() ) if( IsFootprintHolder() )
visible.set(); visible.set();
@ -1595,7 +1591,7 @@ BOX2I BOARD::ComputeBoundingBox( bool aBoardEdgesOnly ) const
} }
else else
{ {
bbox.Merge( footprint->GetBoundingBox( true, showHiddenText ) ); bbox.Merge( footprint->GetBoundingBox( true, aIncludeHiddenText ) );
} }
} }

View File

@ -892,11 +892,11 @@ public:
* @param aBoardEdgesOnly is true if we are interested in board edge segments only. * @param aBoardEdgesOnly is true if we are interested in board edge segments only.
* @return the board's bounding box. * @return the board's bounding box.
*/ */
BOX2I ComputeBoundingBox( bool aBoardEdgesOnly = false ) const; BOX2I ComputeBoundingBox( bool aBoardEdgesOnly, bool aIncludeHiddenText ) const;
const BOX2I GetBoundingBox() const override const BOX2I GetBoundingBox() const override
{ {
return ComputeBoundingBox( false ); return ComputeBoundingBox( false, IsElementVisible( LAYER_HIDDEN_TEXT ) );
} }
/** /**
@ -910,7 +910,7 @@ public:
*/ */
const BOX2I GetBoardEdgesBoundingBox() const const BOX2I GetBoardEdgesBoundingBox() const
{ {
return ComputeBoundingBox( true ); return ComputeBoundingBox( true, false );
} }
void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override; void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;

View File

@ -821,7 +821,7 @@ bool BuildBoardPolygonOutlines( BOARD* aBoard, SHAPE_POLY_SET& aOutlines, int aE
// If null area, uses the global bounding box. // If null area, uses the global bounding box.
if( ( bbbox.GetWidth() ) == 0 || ( bbbox.GetHeight() == 0 ) ) if( ( bbbox.GetWidth() ) == 0 || ( bbbox.GetHeight() == 0 ) )
bbbox = aBoard->ComputeBoundingBox(); bbbox = aBoard->ComputeBoundingBox( false, false );
// Ensure non null area. If happen, gives a minimal size. // Ensure non null area. If happen, gives a minimal size.
if( ( bbbox.GetWidth() ) == 0 || ( bbbox.GetHeight() == 0 ) ) if( ( bbbox.GetWidth() ) == 0 || ( bbbox.GetHeight() == 0 ) )
@ -881,7 +881,7 @@ void buildBoardBoundingBoxPoly( const BOARD* aBoard, SHAPE_POLY_SET& aOutline )
// If null area, uses the global bounding box. // If null area, uses the global bounding box.
if( ( bbbox.GetWidth() ) == 0 || ( bbbox.GetHeight() == 0 ) ) if( ( bbbox.GetWidth() ) == 0 || ( bbbox.GetHeight() == 0 ) )
bbbox = aBoard->ComputeBoundingBox(); bbbox = aBoard->ComputeBoundingBox( false, false );
// Ensure non null area. If happen, gives a minimal size. // Ensure non null area. If happen, gives a minimal size.
if( ( bbbox.GetWidth() ) == 0 || ( bbbox.GetHeight() == 0 ) ) if( ( bbbox.GetWidth() ) == 0 || ( bbbox.GetHeight() == 0 ) )

View File

@ -560,7 +560,7 @@ void DIALOG_EXPORT_STEP::onExportButton( wxCommandEvent& aEvent )
case STEP_ORIGIN_BOARD_CENTER: case STEP_ORIGIN_BOARD_CENTER:
{ {
BOX2I bbox = m_parent->GetBoard()->ComputeBoundingBox( true ); BOX2I bbox = m_parent->GetBoard()->ComputeBoundingBox( true, false );
double xOrg = pcbIUScale.IUTomm( bbox.GetCenter().x ); double xOrg = pcbIUScale.IUTomm( bbox.GetCenter().x );
double yOrg = pcbIUScale.IUTomm( bbox.GetCenter().y ); double yOrg = pcbIUScale.IUTomm( bbox.GetCenter().y );
LOCALE_IO dummy; LOCALE_IO dummy;

View File

@ -264,7 +264,7 @@ void PCB_EDIT_FRAME::OnExportVRML( wxCommandEvent& event )
{ {
// Origin = board center: // Origin = board center:
BOARD* pcb = GetBoard(); BOARD* pcb = GetBoard();
BOX2I bbox = pcb->ComputeBoundingBox( true ); BOX2I bbox = pcb->ComputeBoundingBox( true, false );
aXRef = pcbIUScale.IUTomm( bbox.GetCenter().x ); aXRef = pcbIUScale.IUTomm( bbox.GetCenter().x );
aYRef = pcbIUScale.IUTomm( bbox.GetCenter().y ); aYRef = pcbIUScale.IUTomm( bbox.GetCenter().y );
} }

View File

@ -204,7 +204,7 @@ bool GENCAD_EXPORTER::WriteFile( wxString& aFullFileName )
BOARD* pcb = m_board; BOARD* pcb = m_board;
// Update some board data, to ensure a reliable gencad export // Update some board data, to ensure a reliable gencad export
pcb->ComputeBoundingBox(); pcb->ComputeBoundingBox( false, false );
/* Temporary modification of footprints that are flipped (i.e. on bottom /* Temporary modification of footprints that are flipped (i.e. on bottom
* layer) to convert them to non flipped footprints. * layer) to convert them to non flipped footprints.

View File

@ -63,7 +63,7 @@ bool EXPORT_SVG::Plot( BOARD* aBoard, const PCB_PLOT_SVG_OPTIONS& aSvgPlotOption
if( aSvgPlotOptions.m_pageSizeMode == 2 ) // Page is board boundary size if( aSvgPlotOptions.m_pageSizeMode == 2 ) // Page is board boundary size
{ {
BOX2I bbox = aBoard->ComputeBoundingBox(); BOX2I bbox = aBoard->ComputeBoundingBox( false, false );
PAGE_INFO currpageInfo = aBoard->GetPageSettings(); PAGE_INFO currpageInfo = aBoard->GetPageSettings();
currpageInfo.SetWidthMils( bbox.GetWidth() / pcbIUScale.IU_PER_MILS ); currpageInfo.SetWidthMils( bbox.GetWidth() / pcbIUScale.IU_PER_MILS );

View File

@ -309,7 +309,7 @@ std::string PLACE_FILE_EXPORTER::GenReportData()
buffer += "\n$BeginDESCRIPTION\n"; buffer += "\n$BeginDESCRIPTION\n";
BOX2I bbbox = m_board->ComputeBoundingBox(); BOX2I bbbox = m_board->ComputeBoundingBox( false, false );
buffer += "\n$BOARD\n"; buffer += "\n$BOARD\n";

View File

@ -241,7 +241,7 @@ BOARD* PCB_IO_EASYEDA::LoadBoard( const wxString& aFileName, BOARD* aAppendToMe,
parser.ParseBoard( m_board, origin, m_loadedFootprints, doc.shape ); parser.ParseBoard( m_board, origin, m_loadedFootprints, doc.shape );
// Center the board // Center the board
BOX2I outlineBbox = m_board->ComputeBoundingBox( true ); BOX2I outlineBbox = m_board->ComputeBoundingBox( true, false );
PAGE_INFO pageInfo = m_board->GetPageSettings(); PAGE_INFO pageInfo = m_board->GetPageSettings();
VECTOR2D pageCenter( pcbIUScale.MilsToIU( pageInfo.GetWidthMils() / 2 ), VECTOR2D pageCenter( pcbIUScale.MilsToIU( pageInfo.GetWidthMils() / 2 ),

View File

@ -1819,7 +1819,7 @@ void PCB_IO_EASYEDAPRO_PARSER::ParseBoard(
aBoard->Add( ptr.release(), ADD_MODE::APPEND ); aBoard->Add( ptr.release(), ADD_MODE::APPEND );
// Center the board // Center the board
BOX2I outlineBbox = aBoard->ComputeBoundingBox( true ); BOX2I outlineBbox = aBoard->ComputeBoundingBox( true, false );
PAGE_INFO pageInfo = aBoard->GetPageSettings(); PAGE_INFO pageInfo = aBoard->GetPageSettings();
VECTOR2D pageCenter( pcbIUScale.MilsToIU( pageInfo.GetWidthMils() / 2 ), VECTOR2D pageCenter( pcbIUScale.MilsToIU( pageInfo.GetWidthMils() / 2 ),

View File

@ -166,7 +166,7 @@ int PCBNEW_JOBS_HANDLER::JobExportStep( JOB* aJob )
if( !aStepJob->m_hasUserOrigin ) if( !aStepJob->m_hasUserOrigin )
{ {
BOX2I bbox = brd->ComputeBoundingBox( true ); BOX2I bbox = brd->ComputeBoundingBox( true, false );
originX = pcbIUScale.IUTomm( bbox.GetCenter().x ); originX = pcbIUScale.IUTomm( bbox.GetCenter().x );
originY = pcbIUScale.IUTomm( bbox.GetCenter().y ); originY = pcbIUScale.IUTomm( bbox.GetCenter().y );
} }

View File

@ -288,7 +288,10 @@ void PCBNEW_PRINTOUT::setupGal( KIGFX::GAL* aGal )
BOX2I PCBNEW_PRINTOUT::getBoundingBox() BOX2I PCBNEW_PRINTOUT::getBoundingBox()
{ {
return m_board->ComputeBoundingBox(); bool showHiddenText = m_pcbnewSettings.m_AsItemCheckboxes
&& m_board->IsElementVisible( LAYER_HIDDEN_TEXT );
return m_board->ComputeBoundingBox( false, showHiddenText );
} }

View File

@ -1061,7 +1061,7 @@ static void initializePlotter( PLOTTER* aPlotter, const BOARD* aBoard,
autocenter = (aPlotOpts->GetScale() != 1.0); autocenter = (aPlotOpts->GetScale() != 1.0);
} }
BOX2I bbox = aBoard->ComputeBoundingBox(); BOX2I bbox = aBoard->ComputeBoundingBox( false, false );
VECTOR2I boardCenter = bbox.Centre(); VECTOR2I boardCenter = bbox.Centre();
VECTOR2I boardSize = bbox.GetSize(); VECTOR2I boardSize = bbox.GetSize();
@ -1266,7 +1266,7 @@ PLOTTER* StartPlotBoard( BOARD *aBoard, const PCB_PLOT_PARAMS *aPlotOpts, int aL
// done in the driver (if supported) // done in the driver (if supported)
if( aPlotOpts->GetNegative() ) if( aPlotOpts->GetNegative() )
{ {
BOX2I bbox = aBoard->ComputeBoundingBox(); BOX2I bbox = aBoard->ComputeBoundingBox( false, false );
FillNegativeKnockout( plotter, bbox ); FillNegativeKnockout( plotter, bbox );
} }