diff --git a/pcbnew/dialogs/dialog_board_statistics.cpp b/pcbnew/dialogs/dialog_board_statistics.cpp index d3c1a3b816..f1ec3fb15f 100644 --- a/pcbnew/dialogs/dialog_board_statistics.cpp +++ b/pcbnew/dialogs/dialog_board_statistics.cpp @@ -51,6 +51,10 @@ #define ROW_BOARD_AREA 1 #define ROW_FRONT_COPPER_AREA 2 #define ROW_BACK_COPPER_AREA 3 +#define ROW_MIN_CLEARANCE 4 +#define ROW_MIN_TRACK_WIDTH 5 +#define ROW_MIN_DRILL_DIAMETER 6 +#define ROW_BOARD_THICKNESS 7 /** @@ -90,6 +94,10 @@ DIALOG_BOARD_STATISTICS::DIALOG_BOARD_STATISTICS( PCB_EDIT_FRAME* aParentFrame ) m_boardArea( 0.0 ), m_frontCopperArea( 0.0 ), m_backCopperArea( 0.0 ), + m_minClearanceTrackToTrack( std::numeric_limits::max() ), + m_minTrackWidth( std::numeric_limits::max() ), + m_minDrillSize( std::numeric_limits::max() ), + m_boardThickness( 0 ), m_hasOutline( false ), m_startLayerColInitialSize( 1 ), m_stopLayerColInitialSize( 1 ) @@ -122,6 +130,10 @@ DIALOG_BOARD_STATISTICS::DIALOG_BOARD_STATISTICS( PCB_EDIT_FRAME* aParentFrame ) m_gridBoard->SetCellValue( ROW_BOARD_AREA, COL_LABEL, _( "Area:" ) ); m_gridBoard->SetCellValue( ROW_FRONT_COPPER_AREA, COL_LABEL, _( "Front copper area:" ) ); m_gridBoard->SetCellValue( ROW_BACK_COPPER_AREA, COL_LABEL, _( "Back copper area:" ) ); + m_gridBoard->SetCellValue( ROW_MIN_CLEARANCE, COL_LABEL, _( "Min track clearance:" ) ); + m_gridBoard->SetCellValue( ROW_MIN_TRACK_WIDTH, COL_LABEL, _( "Min track width:" ) ); + m_gridBoard->SetCellValue( ROW_MIN_DRILL_DIAMETER,COL_LABEL, _( "Min drill diameter:" ) ); + m_gridBoard->SetCellValue( ROW_BOARD_THICKNESS, COL_LABEL, _( "Board stackup thickness:" ) ); for( wxGrid* grid : { m_gridComponents, m_gridPads, m_gridVias, m_gridBoard } ) { @@ -203,7 +215,7 @@ bool DIALOG_BOARD_STATISTICS::TransferDataToWindow() { refreshItemsTypes(); getDataFromPCB(); - updateWidets(); + updateWidgets(); Layout(); m_drillsPanel->Layout(); @@ -325,6 +337,36 @@ void DIALOG_BOARD_STATISTICS::getDataFromPCB() // Get via counts for( PCB_TRACK* track : board->Tracks() ) { + // Get min track width + if( track->Type() == PCB_TRACE_T ) + m_minTrackWidth = std::min( m_minTrackWidth, track->GetWidth() ); + + if( !track->IsType( { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T } ) ) + continue; + + // Get min clearance between tracks + auto layer = track->GetLayer(); + auto trackShapeA = track->GetEffectiveShape( layer ); + + for( PCB_TRACK* otherTrack : board->Tracks() ) + { + if( layer != otherTrack->GetLayer() ) + continue; + + if( track->GetNetCode() == otherTrack->GetNetCode() ) + continue; + + if( !otherTrack->IsType( { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T } ) ) + continue; + + int actual = 0; + auto trackShapeB = otherTrack->GetEffectiveShape( layer ); + bool collide = trackShapeA->Collide( trackShapeB.get(), m_minClearanceTrackToTrack, &actual ); + + if( collide ) + m_minClearanceTrackToTrack = std::min( m_minClearanceTrackToTrack, actual ); + } + if( track->Type() == PCB_VIA_T ) { PCB_VIA* via = static_cast( track ); @@ -475,6 +517,8 @@ void DIALOG_BOARD_STATISTICS::getDataFromPCB() m_frontCopperArea = frontCopper.Area(); m_backCopperArea = backCopper.Area(); + + m_boardThickness = board->GetStackupOrDefault().BuildBoardThicknessFromStackup(); } @@ -484,7 +528,7 @@ static wxString formatCount( int aCount ) }; -void DIALOG_BOARD_STATISTICS::updateWidets() +void DIALOG_BOARD_STATISTICS::updateWidgets() { int totalPads = 0; int row = 0; @@ -565,8 +609,20 @@ void DIALOG_BOARD_STATISTICS::updateWidets() m_gridBoard->SetCellValue( ROW_BACK_COPPER_AREA, COL_AMOUNT, m_frame->MessageTextFromValue( m_backCopperArea, true, EDA_DATA_TYPE::AREA ) ); + m_gridBoard->SetCellValue( ROW_MIN_CLEARANCE, COL_AMOUNT, + m_frame->MessageTextFromValue( m_minClearanceTrackToTrack, true, EDA_DATA_TYPE::DISTANCE ) ); + + m_gridBoard->SetCellValue( ROW_MIN_TRACK_WIDTH, COL_AMOUNT, + m_frame->MessageTextFromValue( m_minTrackWidth, true, EDA_DATA_TYPE::DISTANCE ) ); + + m_gridBoard->SetCellValue( ROW_BOARD_THICKNESS, COL_AMOUNT, + m_frame->MessageTextFromValue( m_boardThickness, true, EDA_DATA_TYPE::DISTANCE ) ); + updateDrillGrid(); + m_gridBoard->SetCellValue( ROW_MIN_DRILL_DIAMETER, COL_AMOUNT, + m_frame->MessageTextFromValue( m_minDrillSize, true, EDA_DATA_TYPE::DISTANCE ) ); + m_gridComponents->AutoSize(); m_gridPads->AutoSize(); m_gridBoard->AutoSize(); @@ -594,6 +650,9 @@ void DIALOG_BOARD_STATISTICS::updateDrillGrid() default: shapeStr = _( "???" ); break; } + if( line.shape == PAD_DRILL_SHAPE::CIRCLE ) + m_minDrillSize = std::min( m_minDrillSize, line.xSize ); + if( line.startLayer == UNDEFINED_LAYER ) startLayerStr = _( "N/A" ); else @@ -736,7 +795,7 @@ void DIALOG_BOARD_STATISTICS::checkboxClicked( wxCommandEvent& aEvent ) s_savedDialogState.subtractHolesFromCopper = m_checkBoxSubtractHolesFromCopper->GetValue(); refreshItemsTypes(); getDataFromPCB(); - updateWidets(); + updateWidgets(); Layout(); m_drillsPanel->Layout(); } @@ -797,6 +856,18 @@ void DIALOG_BOARD_STATISTICS::saveReportClicked( wxCommandEvent& aEvent ) msg << wxS( "- " ) << _( "Back copper area" ) + wxS( ": " ) << m_frame->MessageTextFromValue( m_backCopperArea, true, EDA_DATA_TYPE::AREA ) << wxT( "\n" ); + msg << wxS( "- " ) << _( "Min track clearance" ) + wxS( ": " ) + << m_frame->MessageTextFromValue( m_minClearanceTrackToTrack, true, EDA_DATA_TYPE::DISTANCE ) << wxT( "\n" ); + + msg << wxS( "- " ) << _( "Min track width" ) + wxS( ": " ) + << m_frame->MessageTextFromValue( m_minTrackWidth, true, EDA_DATA_TYPE::DISTANCE ) << wxT( "\n" ); + + msg << wxS( "- " ) << _( "Min drill diameter" ) + wxS( ": " ) + << m_frame->MessageTextFromValue( m_minDrillSize, true, EDA_DATA_TYPE::DISTANCE ) << wxT( "\n" ); + + msg << wxS( "- " ) << _( "Board stackup thickness" ) + wxS( ": " ) + << m_frame->MessageTextFromValue( m_boardThickness, true, EDA_DATA_TYPE::DISTANCE ) << wxT( "\n" ); + msg << wxT( "\n" ); msg << _( "Pads" ) << wxT( "\n----\n" ); diff --git a/pcbnew/dialogs/dialog_board_statistics.h b/pcbnew/dialogs/dialog_board_statistics.h index cd06f19106..12c3f3f386 100644 --- a/pcbnew/dialogs/dialog_board_statistics.h +++ b/pcbnew/dialogs/dialog_board_statistics.h @@ -182,7 +182,7 @@ private: void getDataFromPCB(); ///< Apply data to dialog widgets. - void updateWidets(); + void updateWidgets(); ///< Update drills grid. void updateDrillGrid(); @@ -209,6 +209,10 @@ private: double m_boardArea; double m_frontCopperArea; double m_backCopperArea; + int m_minClearanceTrackToTrack; + int m_minTrackWidth; + int m_minDrillSize; + int m_boardThickness; bool m_hasOutline; ///< Show if board outline properly defined. diff --git a/pcbnew/dialogs/dialog_board_statistics_base.cpp b/pcbnew/dialogs/dialog_board_statistics_base.cpp index dd05e78fdb..4e46cd7dd4 100644 --- a/pcbnew/dialogs/dialog_board_statistics_base.cpp +++ b/pcbnew/dialogs/dialog_board_statistics_base.cpp @@ -127,7 +127,7 @@ DIALOG_BOARD_STATISTICS_BASE::DIALOG_BOARD_STATISTICS_BASE( wxWindow* parent, wx m_gridBoard = new wxGrid( m_generalPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL ); // Grid - m_gridBoard->CreateGrid( 4, 2 ); + m_gridBoard->CreateGrid( 8, 2 ); m_gridBoard->EnableEditing( false ); m_gridBoard->EnableGridLines( false ); m_gridBoard->EnableDragGridSize( false ); diff --git a/pcbnew/dialogs/dialog_board_statistics_base.fbp b/pcbnew/dialogs/dialog_board_statistics_base.fbp index ac4f9c3c71..3155058e6b 100644 --- a/pcbnew/dialogs/dialog_board_statistics_base.fbp +++ b/pcbnew/dialogs/dialog_board_statistics_base.fbp @@ -703,7 +703,7 @@ wxALIGN_CENTER - 4 + 8 1 ; ; forward_declare