96 bool last_notplated_opt =
false;
172 std::set<DRILL_SPAN> unique;
174 for(
int i = 0; i < vias.
GetCount(); ++i )
180 via->LayerPair( &top_layer, &bottom_layer );
183 unique.emplace( top_layer, bottom_layer,
false,
false );
190 if( aDrill.size.x <= 0 && aDrill.size.y <= 0 )
193 unique.emplace( aDrill.start, aDrill.end,
true,
false );
196 addBackdrillSpan(
via->Padstack().SecondaryDrill() );
197 addBackdrillSpan(
via->Padstack().TertiaryDrill() );
200 std::vector<DRILL_SPAN> ret;
202 ret.emplace_back(
F_Cu,
B_Cu,
false,
false );
207 ret.push_back( span );
226 int ly_id = ( aLayer -
B_Cu ) / 2;
227 return fmt::format(
"in{}", ly_id );
235 std::string ret =
layerName( aPair.first );
244 bool aMerge_PTH_NPTH )
const
252 int conventional_layer_num = 1;
256 if( layer == aLayer )
257 return conventional_layer_num;
259 conventional_layer_num++;
262 return conventional_layer_num;
267 extend.Printf( wxT(
"_Backdrills_Drill_%d_%d" ),
273 extend = wxT(
"-NPTH" );
277 if( !aMerge_PTH_NPTH )
278 extend = wxT(
"-PTH" );
287 wxFileName fn =
m_pcb->GetFileName();
289 fn.SetName( fn.GetName() + extend );
292 wxString ret = fn.GetFullName();
308 extend << wxT(
"-filling-" );
312 extend << wxT(
"-capping-" );
316 extend << wxT(
"-covering-" );
320 extend << wxT(
"-covering-" );
324 extend << wxT(
"-plugging-" );
328 extend << wxT(
"-plugging-" );
332 extend << wxT(
"-tenting-" );
336 extend << wxT(
"-tenting-" );
341 wxFileName fn =
m_pcb->GetFileName();
343 fn.SetName( fn.GetName() + extend );
346 wxString ret = fn.GetFullName();
360 hole_sets.emplace_back(
F_Cu,
B_Cu,
false,
true );
362 for( std::vector<DRILL_SPAN>::const_iterator it = hole_sets.begin(); it != hole_sets.end(); ++it )
372 fn.SetPath( aPlotDirectory );
374 fn.SetExt( wxEmptyString );
375 wxString fullfilename = fn.GetFullPath() + wxT(
"-drl_map" );
384 msg.Printf(
_(
"Failed to create file '%s'." ), fullfilename );
394 msg.Printf(
_(
"Created file '%s'." ), fullfilename );
409 bool aCompatNCdrill )
const
416 text = wxT(
"; #@! " );
420 text << wxT(
"TF.FileFunction," );
423 text << wxT(
"NonPlated," );
425 text << wxT(
"MixedPlating," );
427 text << wxT(
"Plated," );
429 int layer1 = aSpan.
Pair().first;
430 int layer2 = aSpan.
Pair().second;
440 else if( layer1 ==
B_Cu )
441 layer1 =
m_pcb->GetCopperLayerCount();
443 layer1 = ( ( layer1 -
B_Cu ) / 2 ) + 1;
447 else if( layer2 ==
B_Cu )
448 layer2 =
m_pcb->GetCopperLayerCount();
450 layer2 = ( ( layer2 -
B_Cu ) / 2) + 1;
453 if( layer1 > layer2 )
454 std::swap( layer1, layer2 );
456 text << layer1 << wxT(
"," ) << layer2;
460 int bottomlayer =
m_pcb->GetCopperLayerCount();
463 text << wxT(
",Blind" );
465 text << wxT(
",NPTH" );
468 else if( layer1 == toplayer && layer2 == bottomlayer )
469 text << wxT(
",PTH" );
470 else if( layer1 == toplayer || layer2 == bottomlayer )
471 text << wxT(
",Blind" );
473 text << wxT(
",Buried" );
484 bool hasOblong =
false;
485 bool hasDrill =
false;
497 if( hasOblong && hasDrill )
498 text << wxT(
",Mixed" );
500 text << wxT(
",Drill" );
502 text << wxT(
",Rout" );
530 int bestsize = aMarkerDiameter / 10;
532 const double MIN_SIZE_MM = 0.1;
533 bestsize = std::max( bestsize,
pcbIUScale.mmToIU( MIN_SIZE_MM ) );
542 const double SKETCH_LINE_WIDTH_MM = 0.1;
543 return pcbIUScale.mmToIU( SKETCH_LINE_WIDTH_MM );
550 const double DEFAULT_LINE_WIDTH_MM = 0.2;
551 return pcbIUScale.mmToIU( DEFAULT_LINE_WIDTH_MM );
565 int bottom_limit = 0;
573 LSET visibleLayers =
m_pcb->GetVisibleLayers();
575 BOX2I bbbox =
m_pcb->GetBoardEdgesBoundingBox();
576 m_pcb->SetVisibleLayers( visibleLayers );
606 double Xscale = double( pageSizeIU.
x - ( 2 * margin ) ) / bbbox.
GetWidth();
610 int ypagesize_for_board =
KiROUND( pageSizeIU.
y * 0.6 );
611 double Yscale = double( ypagesize_for_board - margin ) / bbbox.
GetHeight();
613 scale = std::min( Xscale, Yscale );
626 bottom_limit = ( pageSizeIU.
y - margin ) / std::min(
scale, 1.0 );
646 plotter = dxf_plotter;
661 if( !plotter->
OpenFile( aFullFileName ) )
684 text =
"%TF.FileFunction,Drillmap*%";
688 text = wxT(
"%TF.FilePolarity,Positive*%" );
706 switch( item->Type() )
724 for(
BOARD_ITEM* item : footprint->GraphicalItems() )
729 switch( item->Type() )
745 int plotX, plotY, TextWidth;
749 int textmarginaftersymbol =
pcbIUScale.mmToIU( 2 );
765 double charScale = std::min( 1.0, 1.0 /
scale );
767 TextWidth =
KiROUND( ( charSize * charScale ) / 10.0 );
768 intervalle =
KiROUND( charSize * charScale ) + TextWidth;
771 plotX =
KiROUND( bbbox.
GetX() + textmarginaftersymbol * charScale );
775 wxString Text = wxT(
"Drill Map:" );
780 attrs.
m_Size =
KiROUND( charSize * charScale, charSize * charScale );
791 int max_line_len = 0;
803 if( bottom_limit && ( plotY + intervalle > bottom_limit ) )
806 plotX += max_line_len +
pcbIUScale.mmToIU( 10 );
813 plot_diam = std::min( plot_diam,
KiROUND( charSize * charScale ) );
814 int x =
KiROUND( plotX - textmarginaftersymbol * charScale - plot_diam / 2.0 );
815 int y =
KiROUND( plotY + charSize * charScale );
829 extraInfo += wxT(
", castellated" );
831 extraInfo += wxT(
", press-fit" );
842 extraInfo += wxString::Format( wxT(
", backdrill stub %.3f-%.3fmm" ), minStub, maxStub );
846 extraInfo += wxString::Format( wxT(
", backdrill stub %.3fmm" ), minStub );
851 extraInfo += wxT(
", backdrill" );
856 extraInfo += wxT(
", post-machined" );
861 counts.Printf( wxT(
"(1 hole%s)" ), extraInfo );
863 counts.Printf( wxT(
"(1 slot%s)" ), extraInfo );
865 counts.Printf( wxT(
"(%d holes%s)" ), tool.
m_TotalCount, extraInfo );
867 counts.Printf( wxT(
"(%d holes + 1 slot%s)" ), tool.
m_TotalCount - 1, extraInfo );
876 msg += wxT(
" (not plated)" );
881 intervalle =
KiROUND( ( ( charSize * charScale ) + TextWidth ) * 1.2 );
883 if( intervalle < ( plot_diam + ( 1 *
pcbIUScale.IU_PER_MM /
scale ) + TextWidth ) )
884 intervalle = plot_diam + ( 1 *
pcbIUScale.IU_PER_MM /
scale ) + TextWidth;
888 int text_len = msg.Len() * ( ( charSize * charScale ) + TextWidth );
889 max_line_len = std::max( max_line_len, text_len + plot_diam );
901 wxFFile out( aFullFileName,
"wb" );
903 if( !out.IsOpened() )
907 wxString msg = wxString::Format(
_(
"Error creating drill report file '%s'" ),
915 FILE* outFp = out.fp();
917 static const char separator[] =
918 " =============================================================\n";
922 unsigned totalHoleCount;
923 wxFileName brdFilename(
m_pcb->GetFileName() );
927 bool writeError =
false;
931 fmt::print( outFp,
"Drill report for {}\n",
TO_UTF8( brdFilename.GetFullName() ) );
935 fmt::print( outFp,
"Copper Layer Stackup:\n" );
936 fmt::print( outFp,
"{}", separator );
938 int conventional_layer_num = 1;
942 fmt::print( outFp,
" L{:<2}: {:<25} {}\n", conventional_layer_num++,
947 fmt::print( outFp,
"\n\n" );
955 bool buildNPTHlist =
false;
958 for(
unsigned pair_ndx = 0; pair_ndx < hole_sets.size(); ++pair_ndx )
966 fmt::print( outFp,
"Drill file '{}' contains\n",
969 fmt::print( outFp,
" plated through holes:\n" );
970 fmt::print( outFp,
"{}", separator );
972 fmt::print( outFp,
" Total plated holes count {}\n", totalHoleCount );
976 fmt::print( outFp,
"Drill file '{}' contains\n",
979 fmt::print( outFp,
" backdrill span: '{}' to '{}':\n",
983 fmt::print( outFp,
"{}", separator );
985 fmt::print( outFp,
" Total backdrilled holes count {}\n", totalHoleCount );
989 fmt::print( outFp,
"Drill file '{}' contains\n",
992 fmt::print( outFp,
" holes connecting layer pair: '{} and {}' ({} vias):\n",
995 span.
Pair().first ==
F_Cu || span.
Pair().second ==
B_Cu ?
"blind" :
"buried" );
997 fmt::print( outFp,
"{}", separator );
999 fmt::print( outFp,
" Total plated holes count {}\n", totalHoleCount );
1002 fmt::print( outFp,
"\n\n" );
1008 buildNPTHlist =
true;
1016 fmt::print( outFp,
"Not plated through holes are merged with plated holes\n" );
1018 fmt::print( outFp,
"Drill file '{}' contains\n",
1021 fmt::print( outFp,
" unplated through holes:\n" );
1022 fmt::print( outFp,
"{}", separator );
1024 fmt::print( outFp,
" Total unplated holes count {}\n", totalHoleCount );
1026 catch(
const std::system_error& )
1030 catch(
const fmt::format_error& )
1035 if( writeError && aReporter )
1037 wxString msg = wxString::Format(
_(
"Error writing drill report file '%s'" ), aFullFileName );
1073 unsigned totalHoleCount = 0;
1084 if( bucket != aSummary )
1088 int tool_number = ii+1;
1089 fmt::print( out,
" T{} {:2.3f}mm {:2.4f}\" ", tool_number,
1095 fmt::print( out,
"(1 hole" );
1097 fmt::print( out,
"(1 hole) (with 1 slot" );
1101 fmt::print( out,
"({} holes) (with 1 slot", tool.
m_TotalCount );
1106 fmt::print( out,
", castellated" );
1109 fmt::print( out,
", press-fit" );
1111 fmt::print( out,
")\n" );
1116 fmt::print( out,
"\n" );
1118 return totalHoleCount;
constexpr EDA_IU_SCALE pcbIUScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
constexpr size_type GetWidth() const
constexpr Vec Centre() const
constexpr coord_type GetX() const
constexpr size_type GetHeight() const
constexpr coord_type GetBottom() const
void SetLayerSet(const LSET &aLayerMask)
void PlotShape(const PCB_SHAPE *aShape)
int GetCount() const
Return the number of objects in the list.
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
void SetUnits(DXF_UNITS aUnit)
Set the units to use for plotting the DXF file.
virtual void SetParentGroup(EDA_GROUP *aGroup)
unsigned printToolSummary(FILE *out, TOOL_SUMMARY aSummary) const
Print m_toolListBuffer[] tools to aOut and returns total hole count.
virtual const wxString getProtectionFileName(const DRILL_SPAN &aSpan, IPC4761_FEATURES aFeature) const
const PAGE_INFO * m_pageInfo
void AddCreatedFile(const wxString &aPath)
wxString m_drillFileExtension
std::vector< HOLE_INFO > m_holeListBuffer
TOOL_SUMMARY
Selects which subset of m_toolListBuffer a summary covers.
@ UNPLATED
Non-plated holes, excluding backdrills.
@ BACKDRILL
Backdrills, which are non-plated by construction.
void buildHolesList(const DRILL_SPAN &aSpan, bool aGenerateNPTH_list)
Create the list of holes and tools for a given board.
bool genDrillMapFile(const wxString &aFullFileName, PLOT_FORMAT aFormat)
Plot a map of drill marks for holes.
VECTOR2I GetOffset()
Return the plot offset (usually the position of the drill/place origin).
std::vector< DRILL_SPAN > getUniqueLayerPairs() const
Get unique layer pairs by examining the micro and blind_buried vias.
std::vector< DRILL_TOOL > m_toolListBuffer
const std::string layerPairName(DRILL_LAYER_PAIR aPair) const
bool CreateMapFilesSet(const wxString &aPlotDirectory, REPORTER *aReporter=nullptr)
Create the full set of map files for the board, in PS, PDF ... format (use SetMapFileFormat() to sele...
const std::string layerName(PCB_LAYER_ID aLayer) const
int getHolesCount() const
virtual const wxString getDrillFileName(const DRILL_SPAN &aSpan, bool aNPTH, bool aMerge_PTH_NPTH) const
bool plotDrillMarks(PLOTTER *aPlotter)
Write the drill marks in PDF, POSTSCRIPT or other supported formats/.
const wxString BuildFileFunctionAttributeString(const DRILL_SPAN &aSpan, TYPE_FILE aHoleType, bool aCompatNCdrill=false) const
bool GenDrillReportFile(const wxString &aFullFileName, REPORTER *aReporter=nullptr)
Create a plain text report file giving a list of drill values and drill count for through holes,...
void UseX2format(bool aEnable)
void UseX2NetAttributes(bool aEnable)
void DisableApertMacros(bool aDisable)
Disable Aperture Macro (AM) command, only for broken Gerber Readers.
Handle hole which must be drilled (diameter, position and layers).
HOLE_ATTRIBUTE m_HoleAttribute
static const METRICS & Default()
PCB specific render settings.
void SetDefaultPenWidth(int aWidth)
LSET is a set of PCB_LAYER_IDs.
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Describe the page size and margins of a paper page on which to eventually print or plot.
const VECTOR2D GetSizeIU(double aIUScale) const
Gets the page size in internal units.
Parameters and options when plotting/printing a board.
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
Collect all BOARD_ITEM objects of a given set of KICAD_T type(s).
void Collect(BOARD_ITEM *aBoard, const std::vector< KICAD_T > &aTypes)
Collect BOARD_ITEM objects using this class's Inspector method, which does the collection.
Base plotter engine class.
virtual bool OpenFile(const wxString &aFullFilename)
Open or create the plot file aFullFilename.
virtual void SetPageSettings(const PAGE_INFO &aPageSettings)
void SetRenderSettings(RENDER_SETTINGS *aSettings)
static const int USE_DEFAULT_LINE_WIDTH
virtual void ThickOval(const VECTOR2I &aPos, const VECTOR2I &aSize, const EDA_ANGLE &aOrient, int aWidth, void *aData)
virtual bool StartPlot(const wxString &aPageNumber)=0
virtual void SetGerberCoordinatesFormat(int aResolution, bool aUseInches=false)
virtual PLOT_FORMAT GetPlotterType() const =0
Return the effective plot engine in use.
void Marker(const VECTOR2I &position, int diametre, unsigned aShapeId)
Draw a pattern shape number aShapeId, to coord position.
virtual void SetCreator(const wxString &aCreator)
void ClearHeaderLinesList()
Remove all lines from the list of free lines to print at the beginning of the file.
virtual void SetViewport(const VECTOR2I &aOffset, double aIusPerDecimil, double aScale, bool aMirror)=0
Set the plot offset and scaling for the current plot.
void AddLineToHeader(const wxString &aExtraString)
Add a line to the list of free lines to print at the beginning of the file.
virtual void SetColorMode(bool aColorMode)
Plot in B/W or color.
virtual void SetCurrentLineWidth(int width, void *aData=nullptr)=0
Set the line width for the next drawing.
virtual void PlotText(const VECTOR2I &aPos, const COLOR4D &aColor, const wxString &aText, const TEXT_ATTRIBUTES &aAttributes, KIFONT::FONT *aFont=nullptr, const KIFONT::METRICS &aFontMetrics=KIFONT::METRICS::Default(), void *aData=nullptr)
A pure virtual class used to derive REPORTER objects from.
virtual REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
Report a string with a given severity.
GR_TEXT_H_ALIGN_T m_Halign
GR_TEXT_V_ALIGN_T m_Valign
wxString GetDefaultPlotExtension(PLOT_FORMAT aFormat)
Return the default plot extension for a format.
std::vector< DRILL_OPERATION > EnumerateDrillOperations(const BOARD &aBoard, const DRILL_QUERY &aQuery)
The one place that decides what the board's holes are.
std::vector< HOLE_INFO > ToLegacyHoleList(const std::vector< DRILL_OPERATION > &aOperations)
Project canonical operations onto the drill writers' record.
std::pair< PCB_LAYER_ID, PCB_LAYER_ID > DRILL_LAYER_PAIR
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
double diameter_in_mm(double ius)
double diameter_in_inches(double ius)
static bool cmpHoleSorting(const HOLE_INFO &a, const HOLE_INFO &b)
static int getMarkerBestPenSize(int aMarkerDiameter)
int getSketchOvalBestPenSize()
helper classes to handle hole info for drill files generators.
#define USE_ATTRIB_FOR_HOLES
PCB_LAYER_ID
A quick note on layer IDs:
PCB_LAYER_ID ToLAYER_ID(int aLayer)
This file contains miscellaneous commonly used macros and functions.
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
void AddGerberX2Header(PLOTTER *aPlotter, const BOARD *aBoard, bool aUseX1CompatibilityMode)
Calculate some X2 attributes as defined in the Gerber file format specification J4 (chapter 5) and ad...
PLOT_FORMAT
The set of supported output plot formats.
Plotting engines similar to ps (PostScript, Gerber, svg)
std::vector< FAB_LAYER_COLOR > dummy
wxString From_UTF8(const char *cstring)
wxString GetISO8601CurrentDateTime()
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Selects which operations EnumerateDrillOperations() returns.
bool m_NonPlatedOnly
Emit only non-plated holes.
bool m_MergePTHNPTH
Emit plated and non-plated together, as the merged drill file does.
DRILL_LAYER_PAIR Pair() const
PCB_LAYER_ID DrillEndLayer() const
PCB_LAYER_ID DrillStartLayer() const
The properties of a padstack drill.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
VECTOR2< int32_t > VECTOR2I