33#include <wx/filedlg.h>
40#define COL_FRONT_SIDE 1
41#define COL_BOTTOM_SIDE 2
45#define ROW_BOARD_WIDTH 0
46#define ROW_BOARD_HEIGHT 1
47#define ROW_BOARD_AREA 2
79 m_parentFrame(aParentFrame),
83 m_hasOutline( false ),
84 m_startLayerColInitialSize( 1 ),
85 m_stopLayerColInitialSize( 1 )
104 m_gridBoard->SetCellAlignment( 0, 0, wxALIGN_LEFT, wxALIGN_CENTRE );
106 m_gridBoard->SetCellAlignment( 1, 0, wxALIGN_LEFT, wxALIGN_CENTRE );
108 m_gridBoard->SetCellAlignment( 2, 0, wxALIGN_LEFT, wxALIGN_CENTRE );
112 for(
auto&
grid : grids )
115 grid->SetCellHighlightPenWidth( 0 );
116 grid->SetColMinimalAcceptableWidth( 80 );
117 for(
int i = 0; i <
grid->GetNumberRows(); i++ )
118 grid->SetCellAlignment( i,
COL_LABEL, wxALIGN_LEFT, wxALIGN_CENTRE );
126 fn.SetName( fn.GetName() + wxT(
"_report" ) );
127 fn.SetExt( wxT(
"txt" ) );
193 + wxSystemSettings::GetMetric( wxSYS_VSCROLL_X ),
219 if( ( footprint->GetAttributes() & line.attribute_mask ) == line.attribute_value )
221 switch( footprint->GetSide() )
223 case F_Cu: line.frontSideQty++;
break;
224 case B_Cu: line.backSideQty++;
break;
232 for(
PAD*
pad : footprint->Pads() )
237 if(
pad->GetAttribute() == line.attribute )
244 if(
pad->GetDrillSize().x > 0 &&
pad->GetDrillSize().y > 0 )
248 if(
pad->GetLayerSet().CuStack().empty() )
256 top =
pad->GetLayerSet().CuStack().front();
257 bottom =
pad->GetLayerSet().CuStack().back();
261 pad->GetDrillShape(),
262 pad->GetAttribute() != PAD_ATTRIB::NPTH,
295 if(
via->GetViaType() == line.attribute )
303 PAD_DRILL_SHAPE::CIRCLE,
true,
false,
via->TopLayer(),
304 via->BottomLayer() );
344 for(
int j = 0; j < polySet.
HoleCount( i ); j++ )
349 for(
PAD*
pad : fp->Pads() )
351 if( !
pad->HasHole() )
354 auto hole =
pad->GetEffectiveHoleShape();
355 const SEG& seg = hole->GetSeg();
356 double width = hole->GetWidth();
357 double area = seg.
Length() * width;
362 area += M_PI * 0.25 * width * width;
372 double drill =
via->GetDrillValue();
393 return wxString::Format( wxT(
"%i" ), aCount );
406 totalPads += line.qty;
420 totalVias += line.qty;
440 totalFront += line.frontSideQty;
441 totalBack += line.backSideQty;
458 EDA_DATA_TYPE::AREA ) );
486 wxString startLayerStr;
487 wxString stopLayerStr;
491 case PAD_DRILL_SHAPE::CIRCLE: shapeStr =
_(
"Round" );
break;
492 case PAD_DRILL_SHAPE::OBLONG: shapeStr =
_(
"Slot" );
break;
493 default: shapeStr =
_(
"???" );
break;
497 startLayerStr =
_(
"N/A" );
502 stopLayerStr =
_(
"N/A" );
513 line.isPlated ?
_(
"PTH" ) :
_(
"NPTH" ) );
515 line.isPad ?
_(
"Pad" ) :
_(
"Via" ) );
526 bool aUseFirstColAsLabel )
528 std::vector<int> widths( aGrid->GetNumberCols(), 0 );
529 int rowLabelsWidth = 0;
535 for(
int col = 0; col < aGrid->GetNumberCols(); col++ )
536 widths[col] = aGrid->GetColLabelValue( col ).length();
539 for(
int row = 0; row < aGrid->GetNumberRows(); row++ )
541 rowLabelsWidth = std::max<int>( rowLabelsWidth, aGrid->GetRowLabelValue( row ).length() );
543 for(
int col = 0; col < aGrid->GetNumberCols(); col++ )
544 widths[col] = std::max<int>( widths[col], aGrid->GetCellValue( row, col ).length() );
555 for(
int col = 0; col < aGrid->GetNumberCols(); col++ )
558 tmp.Printf( wxT(
" %*s |" ), widths[col], aGrid->GetColLabelValue( col ) );
560 tmp.Printf( wxT(
" %*s |" ), widths[col], aGrid->GetCellValue( 0, col ) );
571 for(
int col = 0; col < aGrid->GetNumberCols(); col++ )
574 aStr.Append(
'-', widths[col] );
582 int firstRow = 0, firstCol = 0;
587 if( aUseFirstColAsLabel )
590 for(
int row = firstRow; row < aGrid->GetNumberRows(); row++ )
592 if( aUseFirstColAsLabel )
593 tmp.Printf( wxT(
"|%-*s |" ), widths[0], aGrid->GetCellValue( row, 0 ) );
595 tmp.Printf( wxT(
"|" ) );
599 for(
int col = firstCol; col < aGrid->GetNumberCols(); col++ )
601 tmp.Printf( wxT(
" %*s |" ), widths[col], aGrid->GetCellValue( row, col ) );
612 wxGridUpdateLocker deferRepaintsTillLeavingScope(
m_gridDrills );
619 for(
int i = 0; i <
m_gridDrills->GetNumberCols(); i++ )
625 double scalingFactor = std::max( 1.0,
655 boardName = fn.GetName();
658 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
660 if( dlg.ShowModal() == wxID_CANCEL )
666 outFile = wxFopen( dlg.GetPath(), wxT(
"wt" ) );
668 if( outFile ==
nullptr )
670 msg.Printf(
_(
"Failed to create file '%s'." ), dlg.GetPath() );
675 msg <<
_(
"PCB statistics report\n=====================" ) << wxT(
"\n" );
676 msg << wxS(
"- " ) <<
_(
"Date" ) << wxS(
": " ) << wxDateTime::Now().Format() << wxT(
"\n" );
677 msg << wxS(
"- " ) <<
_(
"Project" ) << wxS(
": " )<<
Prj().
GetProjectName() << wxT(
"\n" );
678 msg << wxS(
"- " ) <<
_(
"Board name" ) << wxS(
": " )<< boardName << wxT(
"\n" );
681 msg <<
_(
"Board" ) << wxT(
"\n-----\n" );
685 msg << wxS(
"- " ) <<
_(
"Width" ) << wxS(
": " )
687 msg << wxS(
"- " ) <<
_(
"Height" ) << wxS(
": " )
689 msg << wxS(
"- " ) <<
_(
"Area" ) + wxS(
": " )
695 msg << wxS(
"- " ) <<
_(
"Width" ) << wxS(
": " ) <<
_(
"unknown" ) << wxT(
"\n" );
696 msg << wxS(
"- " ) <<
_(
"Height" ) << wxS(
": " ) <<
_(
"unknown" ) << wxT(
"\n" );
697 msg << wxS(
"- " ) <<
_(
"Area" ) << wxS(
": " ) <<
_(
"unknown" ) << wxT(
"\n" );
701 msg <<
_(
"Pads" ) << wxT(
"\n----\n" );
704 msg << wxT(
"- " ) << type.title << wxS(
" " ) << type.qty << wxT(
"\n" );
707 msg <<
_(
"Vias" ) << wxT(
"\n----\n" );
710 msg << wxT(
"- " ) << type.title << wxS(
" " ) << type.qty << wxT(
"\n" );
714 std::vector<int> widths;
715 std::vector<wxString> labels{ wxT(
"" ),
_(
"Front Side" ),
_(
"Back Side" ),
_(
"Total" ) };
718 widths.reserve( labels.size() );
720 for(
const wxString& label : labels )
721 widths.push_back( label.size() );
729 widths[0] = std::max<int>( line.title.size(), widths[0] );
730 frontTotal += line.frontSideQty;
731 backTotal += line.backSideQty;
735 tmp.Printf( wxT(
"%i" ), frontTotal );
736 widths[1] = std::max<int>( tmp.size(), widths[1] );
737 tmp.Printf( wxT(
"%i" ), backTotal );
738 widths[2] = std::max<int>( tmp.size(), widths[2] );
739 tmp.Printf( wxT(
"%i" ), frontTotal + backTotal );
740 widths[3] = std::max<int>( tmp.size(), widths[3] );
744 msg <<
_(
"Components" ) << wxT(
"\n----------\n" );
750 msg <<
_(
"Drill holes" ) << wxT(
"\n-----------\n" );
755 if( fprintf( outFile,
"%s",
TO_UTF8( msg ) ) < 0 )
757 msg.Printf(
_(
"Error writing file '%s'." ), dlg.GetPath() );
Information pertinent to a Pcbnew printed circuit board.
bool GetBoardPolygonOutlines(SHAPE_POLY_SET &aOutlines, OUTLINE_ERROR_HANDLER *aErrorHandler=nullptr, bool aAllowUseArcsInPolygons=false, bool aIncludeNPTHAsOutlines=false)
Extract the board outlines and build a closed polygon from lines, arcs and circle items on edge cut l...
const FOOTPRINTS & Footprints() const
const TRACKS & Tracks() const
const wxString & GetFileName() const
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
constexpr size_type GetWidth() const
constexpr size_type GetHeight() const
Class DIALOG_BOARD_STATISTICS_BASE.
wxCheckBox * m_checkBoxSubtractHoles
wxButton * m_sdbControlSizerCancel
wxGrid * m_gridComponents
wxCheckBox * m_checkBoxExcludeComponentsNoPins
void checkboxClicked(wxCommandEvent &aEvent) override
Save board statistics to a file.
void printGridToStringAsTable(wxGrid *aGrid, wxString &aStr, bool aUseColLabels, bool aUseFirstColAsLabel)
std::deque< FP_LINE_ITEM > m_fpTypes
int m_startLayerColInitialSize
Width of the start layer column as calculated by the wxWidgets autosizing algorithm.
void updateWidets()
Update drills grid.
PCB_EDIT_FRAME * m_parentFrame
void saveReportClicked(wxCommandEvent &aEvent) override
std::deque< LINE_ITEM< PAD_ATTRIB > > m_padTypes
void updateDrillGrid()
Print grid to string in tabular format.
~DIALOG_BOARD_STATISTICS()
Get data from the PCB board and print it to dialog.
int m_stopLayerColInitialSize
Width of the stop layer column.
DIALOG_BOARD_STATISTICS(PCB_EDIT_FRAME *aParentFrame)
void drillGridSort(wxGridEvent &aEvent)
void refreshItemsTypes()
< Function to fill up all items types to be shown in the dialog.
void drillGridSize(wxSizeEvent &aEvent) override
bool m_hasOutline
Show if board outline properly defined.
void adjustDrillGridColumns()
bool TransferDataToWindow() override
std::deque< DRILL_LINE_ITEM > m_drillTypes
std::deque< LINE_ITEM< VIATYPE > > m_viaTypes
void getDataFromPCB()
Apply data to dialog widgets.
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
The main frame for Pcbnew.
virtual const wxString GetProjectFullName() const
Return the full path and name of the project.
virtual const wxString GetProjectName() const
Return the short name of the project.
int Length() const
Return the length (this).
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
double Area(bool aAbsolute=true) const
Return the area of this chain.
Represent a set of closed polygons.
int HoleCount(int aOutline) const
Returns the number of holes in a given outline.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
SHAPE_LINE_CHAIN & Hole(int aOutline, int aHole)
Return the reference to aHole-th hole in the aIndex-th outline.
int OutlineCount() const
Return the number of outlines in the set.
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
void EnsureColLabelsVisible()
Ensure the height of the row displaying the column labels is enough, even if labels are multiline tex...
void ClearRows()
wxWidgets recently added an ASSERT which fires if the position is greater than or equal to the number...
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
static DIALOG_BOARD_STATISTICS_SAVED_STATE s_savedDialogState
static wxString formatCount(int aCount)
static wxString TextFileWildcard()
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
KICOMMON_API wxFont GetStatusFont(wxWindow *aWindow)
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Footprint attributes (such as SMD, THT, Virtual and so on), which will be shown in the dialog.
Type information, which will be shown in dialog.
The dialog last saved state.
bool saveReportInitialized
DIALOG_BOARD_STATISTICS_SAVED_STATE()
wxString saveReportFolder
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
Definition of file extensions used in Kicad.