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 ),
218 if( ( footprint->GetAttributes() & line.attribute_mask ) == line.attribute_value )
220 if( footprint->IsFlipped() )
228 for(
PAD*
pad : footprint->Pads() )
233 if(
pad->GetAttribute() == line.attribute )
240 if(
pad->GetDrillSize().x > 0 &&
pad->GetDrillSize().y > 0 )
244 if(
pad->GetLayerSet().CuStack().empty() )
252 top =
pad->GetLayerSet().CuStack().front();
253 bottom =
pad->GetLayerSet().CuStack().back();
257 pad->GetDrillShape(),
258 pad->GetAttribute() != PAD_ATTRIB::NPTH,
285 if(
PCB_VIA*
via = dyn_cast<PCB_VIA*>( track ) )
289 if(
via->GetViaType() == line.attribute )
298 via->BottomLayer() );
323 bool boundingBoxCreated =
false;
330 bool edgeCutsExists =
false;
336 edgeCutsExists =
true;
341 if( !edgeCutsExists )
356 for(
int j = 0; j < polySet.
HoleCount( i ); j++ )
360 if( boundingBoxCreated )
366 bbox = outline.
BBox();
367 boundingBoxCreated =
true;
379 return wxString::Format( wxT(
"%i" ), aCount );
392 totalPads += line.qty;
406 totalVias += line.qty;
426 totalFront += line.frontSideQty;
427 totalBack += line.backSideQty;
444 EDA_DATA_TYPE::AREA ) );
472 wxString startLayerStr;
473 wxString stopLayerStr;
479 default: shapeStr =
_(
"???" );
break;
483 startLayerStr =
_(
"N/A" );
488 stopLayerStr =
_(
"N/A" );
499 line.isPlated ?
_(
"PTH" ) :
_(
"NPTH" ) );
501 line.isPad ?
_(
"Pad" ) :
_(
"Via" ) );
512 bool aUseFirstColAsLabel )
514 std::vector<int> widths( aGrid->GetNumberCols(), 0 );
515 int rowLabelsWidth = 0;
521 for(
int col = 0; col < aGrid->GetNumberCols(); col++ )
522 widths[col] = aGrid->GetColLabelValue( col ).length();
525 for(
int row = 0; row < aGrid->GetNumberRows(); row++ )
527 rowLabelsWidth = std::max<int>( rowLabelsWidth, aGrid->GetRowLabelValue( row ).length() );
529 for(
int col = 0; col < aGrid->GetNumberCols(); col++ )
530 widths[col] = std::max<int>( widths[col], aGrid->GetCellValue( row, col ).length() );
541 for(
int col = 0; col < aGrid->GetNumberCols(); col++ )
544 tmp.Printf( wxT(
" %*s |" ), widths[col], aGrid->GetColLabelValue( col ) );
546 tmp.Printf( wxT(
" %*s |" ), widths[col], aGrid->GetCellValue( 0, col ) );
557 for(
int col = 0; col < aGrid->GetNumberCols(); col++ )
560 aStr.Append(
'-', widths[col] );
568 int firstRow = 0, firstCol = 0;
573 if( aUseFirstColAsLabel )
576 for(
int row = firstRow; row < aGrid->GetNumberRows(); row++ )
578 if( aUseFirstColAsLabel )
579 tmp.Printf( wxT(
"|%-*s |" ), widths[0], aGrid->GetCellValue( row, 0 ) );
581 tmp.Printf( wxT(
"|" ) );
585 for(
int col = firstCol; col < aGrid->GetNumberCols(); col++ )
587 tmp.Printf( wxT(
" %*s |" ), widths[col], aGrid->GetCellValue( row, col ) );
598 wxGridUpdateLocker deferRepaintsTillLeavingScope(
m_gridDrills );
605 for(
int i = 0; i <
m_gridDrills->GetNumberCols(); i++ )
611 double scalingFactor = std::max( 1.0,
641 boardName = fn.GetName();
644 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
646 if( dlg.ShowModal() == wxID_CANCEL )
652 outFile = wxFopen( dlg.GetPath(), wxT(
"wt" ) );
654 if( outFile ==
nullptr )
656 msg.Printf(
_(
"Failed to create file '%s'." ), dlg.GetPath() );
661 msg <<
_(
"PCB statistics report\n=====================" ) << wxT(
"\n" );
662 msg << wxS(
"- " ) <<
_(
"Date" ) << wxS(
": " ) << wxDateTime::Now().Format() << wxT(
"\n" );
663 msg << wxS(
"- " ) <<
_(
"Project" ) << wxS(
": " )<<
Prj().
GetProjectName() << wxT(
"\n" );
664 msg << wxS(
"- " ) <<
_(
"Board name" ) << wxS(
": " )<< boardName << wxT(
"\n" );
667 msg <<
_(
"Board" ) << wxT(
"\n-----\n" );
671 msg << wxS(
"- " ) <<
_(
"Width" ) << wxS(
": " )
673 msg << wxS(
"- " ) <<
_(
"Height" ) << wxS(
": " )
675 msg << wxS(
"- " ) <<
_(
"Area" ) + wxS(
": " )
681 msg << wxS(
"- " ) <<
_(
"Width" ) << wxS(
": " ) <<
_(
"unknown" ) << wxT(
"\n" );
682 msg << wxS(
"- " ) <<
_(
"Height" ) << wxS(
": " ) <<
_(
"unknown" ) << wxT(
"\n" );
683 msg << wxS(
"- " ) <<
_(
"Area" ) << wxS(
": " ) <<
_(
"unknown" ) << wxT(
"\n" );
687 msg <<
_(
"Pads" ) << wxT(
"\n----\n" );
690 msg << wxT(
"- " ) << type.title << wxS(
" " ) << type.qty << wxT(
"\n" );
693 msg <<
_(
"Vias" ) << wxT(
"\n----\n" );
696 msg << wxT(
"- " ) << type.title << wxS(
" " ) << type.qty << wxT(
"\n" );
700 std::vector<int> widths;
701 std::vector<wxString> labels{ wxT(
"" ),
_(
"Front Side" ),
_(
"Back Side" ),
_(
"Total" ) };
704 widths.reserve( labels.size() );
706 for(
const wxString& label : labels )
707 widths.push_back( label.size() );
715 widths[0] = std::max<int>( line.title.size(), widths[0] );
716 frontTotal += line.frontSideQty;
717 backTotal += line.backSideQty;
721 tmp.Printf( wxT(
"%i" ), frontTotal );
722 widths[1] = std::max<int>( tmp.size(), widths[1] );
723 tmp.Printf( wxT(
"%i" ), backTotal );
724 widths[2] = std::max<int>( tmp.size(), widths[2] );
725 tmp.Printf( wxT(
"%i" ), frontTotal + backTotal );
726 widths[3] = std::max<int>( tmp.size(), widths[3] );
730 msg <<
_(
"Components" ) << wxT(
"\n----------\n" );
736 msg <<
_(
"Drill holes" ) << wxT(
"\n-----------\n" );
741 if( fprintf( outFile,
"%s",
TO_UTF8( msg ) ) < 0 )
743 msg.Printf(
_(
"Error writing file '%s'." ), dlg.GetPath() );
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Information pertinent to a Pcbnew printed circuit board.
bool GetBoardPolygonOutlines(SHAPE_POLY_SET &aOutlines, OUTLINE_ERROR_HANDLER *aErrorHandler=nullptr, bool aAllowUseArcsInPolygons=false)
Extract the board outlines and build a closed polygon from lines, arcs and circle items on edge cut l...
FOOTPRINTS & Footprints()
const wxString & GetFileName() const
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
coord_type GetHeight() const
coord_type GetWidth() const
BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
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.
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.
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
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.
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
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 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)
wxString TextFileWildcard()
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
wxFont GetStatusFont(wxWindow *aWindow)
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
Definition of file extensions used in Kicad.