Update status bar with clearance & rule sources.
This commit is contained in:
parent
fca7ade81f
commit
a5b53a623d
|
@ -300,6 +300,14 @@ public:
|
|||
*/
|
||||
virtual void TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuffer,
|
||||
int aClearanceValue, int aError = ARC_LOW_DEF, bool ignoreLineWidth = false ) const;
|
||||
|
||||
protected:
|
||||
/**
|
||||
* Helper function
|
||||
* Return a string (to be shown to the user) describing a layer mask.
|
||||
* The BOARD is needed because layer names are (somewhat) customizable
|
||||
*/
|
||||
static wxString LayerMaskDescribe( const BOARD* aBoard, LSET aMask );
|
||||
};
|
||||
|
||||
#endif /* BOARD_ITEM_STRUCT_H */
|
||||
|
|
|
@ -117,7 +117,7 @@ int BOARD_CONNECTED_ITEM::GetClearance( BOARD_ITEM* aItem, wxString* aSource ) c
|
|||
clearance = myClearance;
|
||||
|
||||
if( aSource )
|
||||
*aSource = wxString::Format( _( "'%s' netclass clearance" ), myNetclass->GetName() );
|
||||
*aSource = wxString::Format( _( "'%s' netclass" ), myNetclass->GetName() );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -130,7 +130,7 @@ int BOARD_CONNECTED_ITEM::GetClearance( BOARD_ITEM* aItem, wxString* aSource ) c
|
|||
clearance = itemClearance;
|
||||
|
||||
if( aSource )
|
||||
*aSource = wxString::Format( _( "'%s' netclass clearance" ), itemNetclass->GetName() );
|
||||
*aSource = wxString::Format( _( "'%s' netclass" ), itemNetclass->GetName() );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -143,7 +143,7 @@ int BOARD_CONNECTED_ITEM::GetClearance( BOARD_ITEM* aItem, wxString* aSource ) c
|
|||
clearance = edgeClearance;
|
||||
|
||||
if( aSource )
|
||||
*aSource = _( "board edge clearance" );
|
||||
*aSource = _( "board edge" );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -77,6 +77,39 @@ wxString BOARD_ITEM::GetLayerName() const
|
|||
}
|
||||
|
||||
|
||||
wxString BOARD_ITEM::LayerMaskDescribe( const BOARD* aBoard, LSET aMask )
|
||||
{
|
||||
// Try to be smart and useful. Check all copper first.
|
||||
if( aMask[F_Cu] && aMask[B_Cu] )
|
||||
return _( "All copper layers" );
|
||||
|
||||
// Check for copper.
|
||||
auto layer = aBoard->GetEnabledLayers().AllCuMask() & aMask;
|
||||
|
||||
for( int i = 0; i < 2; i++ )
|
||||
{
|
||||
for( int bit = PCBNEW_LAYER_ID_START; bit < PCB_LAYER_ID_COUNT; ++bit )
|
||||
{
|
||||
if( layer[ bit ] )
|
||||
{
|
||||
wxString layerInfo = aBoard->GetLayerName( static_cast<PCB_LAYER_ID>( bit ) );
|
||||
|
||||
if( aMask.count() > 1 )
|
||||
layerInfo << _( " and others" );
|
||||
|
||||
return layerInfo;
|
||||
}
|
||||
}
|
||||
|
||||
// No copper; check for technicals.
|
||||
layer = aBoard->GetEnabledLayers().AllTechMask() & aMask;
|
||||
}
|
||||
|
||||
// No copper, no technicals: no layer
|
||||
return _( "no layers" );
|
||||
}
|
||||
|
||||
|
||||
void BOARD_ITEM::ViewGetLayers( int aLayers[], int& aCount ) const
|
||||
{
|
||||
// Basic fallback
|
||||
|
|
|
@ -47,16 +47,6 @@
|
|||
#include <convert_basic_shapes_to_polygon.h>
|
||||
|
||||
|
||||
/**
|
||||
* Helper function
|
||||
* Return a string (to be shown to the user) describing a layer mask.
|
||||
* Useful for showing where is a pad.
|
||||
* The BOARD is needed because layer names are (somewhat) customizable
|
||||
*/
|
||||
static wxString LayerMaskDescribe( const BOARD* aBoard, LSET aMask );
|
||||
|
||||
int D_PAD::m_PadSketchModePenSize = 0; // Pen size used to draw pads in sketch mode
|
||||
|
||||
D_PAD::D_PAD( MODULE* parent ) :
|
||||
BOARD_CONNECTED_ITEM( parent, PCB_PAD_T )
|
||||
{
|
||||
|
@ -633,7 +623,7 @@ int D_PAD::GetClearance( BOARD_ITEM* aItem, wxString* aSource ) const
|
|||
clearance = m_LocalClearance;
|
||||
|
||||
if( aSource )
|
||||
*aSource = wxString::Format( _( "pad %s clearance" ), GetName() );
|
||||
*aSource = wxString::Format( _( "pad %s" ), GetName() );
|
||||
}
|
||||
|
||||
// A footprint can have a specific clearance value
|
||||
|
@ -642,7 +632,7 @@ int D_PAD::GetClearance( BOARD_ITEM* aItem, wxString* aSource ) const
|
|||
clearance = GetParent()->GetLocalClearance();
|
||||
|
||||
if( aSource )
|
||||
*aSource = wxString::Format( _( "%s footprint clearance" ), GetParent()->GetReference() );
|
||||
*aSource = wxString::Format( _( "%s footprint" ), GetParent()->GetReference() );
|
||||
}
|
||||
|
||||
// Otherwise use the baseclass method to fetch the netclass and/or rule setting
|
||||
|
@ -933,28 +923,32 @@ void D_PAD::BuildPadPolygon( wxPoint aCoord[4], wxSize aInflateValue,
|
|||
|
||||
void D_PAD::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
|
||||
{
|
||||
MODULE* module;
|
||||
wxString msg;
|
||||
BOARD* board;
|
||||
|
||||
module = (MODULE*) m_Parent;
|
||||
EDA_UNITS units = aFrame->GetUserUnits();
|
||||
wxString msg, msg2;
|
||||
BOARD* board = GetBoard();
|
||||
BOARD_DESIGN_SETTINGS& bds = board->GetDesignSettings();
|
||||
MODULE* module = (MODULE*) m_Parent;
|
||||
|
||||
if( module )
|
||||
{
|
||||
aList.emplace_back( _( "Footprint" ), module->GetReference(), DARKCYAN );
|
||||
}
|
||||
|
||||
aList.emplace_back( _( "Pad" ), m_name, BROWN );
|
||||
|
||||
if( !GetPinFunction().IsEmpty() )
|
||||
aList.emplace_back( _( "Pin fct" ), GetPinFunction(), BROWN );
|
||||
aList.emplace_back( _( "Pin Name" ), GetPinFunction(), BROWN );
|
||||
|
||||
aList.emplace_back( _( "Net" ), UnescapeString( GetNetname() ), DARKCYAN );
|
||||
|
||||
board = GetBoard();
|
||||
// Display the netclass name (a pad having a netcode = 0 (no net) use the
|
||||
// default netclass for clearance):
|
||||
if( m_netinfo->GetNet() <= 0 )
|
||||
msg = bds.GetDefault()->GetName();
|
||||
else
|
||||
msg = GetNetClassName();
|
||||
|
||||
aList.emplace_back( _( "Layer" ),
|
||||
LayerMaskDescribe( board, m_layerMask ), DARKGREEN );
|
||||
aList.emplace_back( _( "NetClass" ), msg, CYAN );
|
||||
|
||||
aList.emplace_back( _( "Layer" ), LayerMaskDescribe( board, m_layerMask ), DARKGREEN );
|
||||
|
||||
// Show the pad shape, attribute and property
|
||||
wxString props = ShowPadAttr();
|
||||
|
@ -975,13 +969,28 @@ void D_PAD::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>
|
|||
|
||||
aList.emplace_back( ShowPadShape(), props, DARKGREEN );
|
||||
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), m_Size.x, true );
|
||||
if( (GetShape() == PAD_SHAPE_CIRCLE || GetShape() == PAD_SHAPE_OVAL )
|
||||
&& m_Size.x == m_Size.y )
|
||||
{
|
||||
msg = MessageTextFromValue( units, m_Size.x, true );
|
||||
aList.emplace_back( _( "Diameter" ), msg, RED );
|
||||
}
|
||||
else
|
||||
{
|
||||
msg = MessageTextFromValue( units, m_Size.x, true );
|
||||
aList.emplace_back( _( "Width" ), msg, RED );
|
||||
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), m_Size.y, true );
|
||||
msg = MessageTextFromValue( units, m_Size.y, true );
|
||||
aList.emplace_back( _( "Height" ), msg, RED );
|
||||
}
|
||||
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), m_Drill.x, true );
|
||||
if( GetPadToDieLength() )
|
||||
{
|
||||
msg = MessageTextFromValue(units, GetPadToDieLength(), true );
|
||||
aList.emplace_back( _( "Length in Package" ), msg, CYAN );
|
||||
}
|
||||
|
||||
msg = MessageTextFromValue( units, m_Drill.x, true );
|
||||
|
||||
if( GetDrillShape() == PAD_DRILL_SHAPE_CIRCLE )
|
||||
{
|
||||
|
@ -989,46 +998,18 @@ void D_PAD::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>
|
|||
}
|
||||
else
|
||||
{
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), m_Drill.x, true )
|
||||
msg = MessageTextFromValue( units, m_Drill.x, true )
|
||||
+ wxT( "/" )
|
||||
+ MessageTextFromValue( aFrame->GetUserUnits(), m_Drill.y, true );
|
||||
+ MessageTextFromValue( units, m_Drill.y, true );
|
||||
aList.emplace_back( _( "Drill X / Y" ), msg, RED );
|
||||
}
|
||||
|
||||
double module_orient_degrees = module ? module->GetOrientationDegrees() : 0;
|
||||
wxString source;
|
||||
int clearance = GetClearance( nullptr, &source );
|
||||
|
||||
if( module_orient_degrees != 0.0 )
|
||||
msg.Printf( wxT( "%3.1f(+%3.1f)" ),
|
||||
GetOrientationDegrees() - module_orient_degrees,
|
||||
module_orient_degrees );
|
||||
else
|
||||
msg.Printf( wxT( "%3.1f" ), GetOrientationDegrees() );
|
||||
|
||||
aList.emplace_back( _( "Angle" ), msg, LIGHTBLUE );
|
||||
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), m_Pos.x )
|
||||
+ wxT( ", " )
|
||||
+ MessageTextFromValue( aFrame->GetUserUnits(), m_Pos.y );
|
||||
aList.emplace_back( _( "Position" ), msg, LIGHTBLUE );
|
||||
|
||||
if( GetPadToDieLength() )
|
||||
{
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), GetPadToDieLength(), true );
|
||||
aList.emplace_back( _( "Length in package" ), msg, CYAN );
|
||||
}
|
||||
|
||||
// Display the actual pad clearance:
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), GetClearance(), true );
|
||||
aList.emplace_back( _( "Pad clearance" ), msg, CYAN );
|
||||
|
||||
// Display the netclass name (a pad having a netcode = 0 (no net) use the
|
||||
// default netclass for clearance):
|
||||
if( m_netinfo->GetNet() <= 0 )
|
||||
msg = GetBoard()->GetDesignSettings().GetDefault()->GetName();
|
||||
else
|
||||
msg = GetNetClassName();
|
||||
|
||||
aList.emplace_back( _( "Net class" ), msg, CYAN );
|
||||
msg.Printf( _( "Min Clearance: %s" ), MessageTextFromValue( units, clearance, true ) );
|
||||
msg2.Printf( _( "Source: %s" ), source );
|
||||
aList.emplace_back( msg, msg2, BLACK );
|
||||
}
|
||||
|
||||
|
||||
|
@ -1245,9 +1226,7 @@ bool D_PAD::HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy ) con
|
|||
|
||||
// Test rectangular portion between rounded ends
|
||||
if( arect.Intersects( shapeRect, m_Orient ) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
@ -1278,20 +1257,14 @@ bool D_PAD::HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy ) con
|
|||
for( int ii=0; ii<4; ii++ )
|
||||
{
|
||||
if( TestPointInsidePolygon( poly, 4, corners[ii] ) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if( arect.Contains( poly[ii] ) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if( arect.Intersects( poly[ii], poly[(ii+1) % 4] ) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -1427,29 +1400,14 @@ wxString D_PAD::ShowPadShape() const
|
|||
{
|
||||
switch( GetShape() )
|
||||
{
|
||||
case PAD_SHAPE_CIRCLE:
|
||||
return _( "Circle" );
|
||||
|
||||
case PAD_SHAPE_OVAL:
|
||||
return _( "Oval" );
|
||||
|
||||
case PAD_SHAPE_RECT:
|
||||
return _( "Rect" );
|
||||
|
||||
case PAD_SHAPE_TRAPEZOID:
|
||||
return _( "Trap" );
|
||||
|
||||
case PAD_SHAPE_ROUNDRECT:
|
||||
return _( "Roundrect" );
|
||||
|
||||
case PAD_SHAPE_CHAMFERED_RECT:
|
||||
return _( "Chamferedrect" );
|
||||
|
||||
case PAD_SHAPE_CUSTOM:
|
||||
return _( "CustomShape" );
|
||||
|
||||
default:
|
||||
return wxT( "???" );
|
||||
case PAD_SHAPE_CIRCLE: return _( "Circle" );
|
||||
case PAD_SHAPE_OVAL: return _( "Oval" );
|
||||
case PAD_SHAPE_RECT: return _( "Rect" );
|
||||
case PAD_SHAPE_TRAPEZOID: return _( "Trap" );
|
||||
case PAD_SHAPE_ROUNDRECT: return _( "Roundrect" );
|
||||
case PAD_SHAPE_CHAMFERED_RECT: return _( "Chamferedrect" );
|
||||
case PAD_SHAPE_CUSTOM: return _( "CustomShape" );
|
||||
default: return wxT( "???" );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1458,20 +1416,11 @@ wxString D_PAD::ShowPadAttr() const
|
|||
{
|
||||
switch( GetAttribute() )
|
||||
{
|
||||
case PAD_ATTRIB_STANDARD:
|
||||
return _( "Std" );
|
||||
|
||||
case PAD_ATTRIB_SMD:
|
||||
return _( "SMD" );
|
||||
|
||||
case PAD_ATTRIB_CONN:
|
||||
return _( "Conn" );
|
||||
|
||||
case PAD_ATTRIB_HOLE_NOT_PLATED:
|
||||
return _( "Not Plated" );
|
||||
|
||||
default:
|
||||
return wxT( "???" );
|
||||
case PAD_ATTRIB_STANDARD: return _( "Std" );
|
||||
case PAD_ATTRIB_SMD: return _( "SMD" );
|
||||
case PAD_ATTRIB_CONN: return _( "Conn" );
|
||||
case PAD_ATTRIB_HOLE_NOT_PLATED: return _( "Not Plated" );
|
||||
default: return wxT( "???" );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1650,39 +1599,6 @@ const BOX2I D_PAD::ViewBBox() const
|
|||
}
|
||||
|
||||
|
||||
wxString LayerMaskDescribe( const BOARD *aBoard, LSET aMask )
|
||||
{
|
||||
// Try to be smart and useful. Check all copper first.
|
||||
if( aMask[F_Cu] && aMask[B_Cu] )
|
||||
return _( "All copper layers" );
|
||||
|
||||
// Check for copper.
|
||||
auto layer = aBoard->GetEnabledLayers().AllCuMask() & aMask;
|
||||
|
||||
for( int i = 0; i < 2; i++ )
|
||||
{
|
||||
for( int bit = PCBNEW_LAYER_ID_START; bit < PCB_LAYER_ID_COUNT; ++bit )
|
||||
{
|
||||
if( layer[ bit ] )
|
||||
{
|
||||
wxString layerInfo = aBoard->GetLayerName( static_cast<PCB_LAYER_ID>( bit ) );
|
||||
|
||||
if( aMask.count() > 1 )
|
||||
layerInfo << _( " and others" );
|
||||
|
||||
return layerInfo;
|
||||
}
|
||||
}
|
||||
|
||||
// No copper; check for technicals.
|
||||
layer = aBoard->GetEnabledLayers().AllTechMask() & aMask;
|
||||
}
|
||||
|
||||
// No copper, no technicals: no layer
|
||||
return _( "no layers" );
|
||||
}
|
||||
|
||||
|
||||
void D_PAD::ImportSettingsFrom( const D_PAD& aMasterPad )
|
||||
{
|
||||
SetShape( aMasterPad.GetShape() );
|
||||
|
|
|
@ -125,6 +125,78 @@ int TRACK::GetClearance( BOARD_ITEM* aItem, wxString* aSource ) const
|
|||
}
|
||||
|
||||
|
||||
int TRACK::GetMinWidth( wxString* aSource ) const
|
||||
{
|
||||
BOARD_DESIGN_SETTINGS& bds = GetBoard()->GetDesignSettings();
|
||||
NETCLASS* netclass = nullptr;
|
||||
std::vector<DRC_SELECTOR*> matched;
|
||||
|
||||
// NB: we must check the net first, as when it is 0 GetNetClass() will return the
|
||||
// orphaned net netclass, not the default netclass.
|
||||
if( m_netinfo->GetNet() == 0 )
|
||||
netclass = bds.GetDefault();
|
||||
else
|
||||
netclass = GetNetClass();
|
||||
|
||||
MatchSelectors( bds.m_DRCRuleSelectors, this, netclass, nullptr, nullptr, &matched );
|
||||
|
||||
int minWidth = bds.m_TrackMinWidth;
|
||||
|
||||
if( aSource )
|
||||
*aSource = _( "board" );
|
||||
|
||||
for( DRC_SELECTOR* selector : matched )
|
||||
{
|
||||
if( selector->m_Rule->m_TrackWidth > minWidth )
|
||||
{
|
||||
minWidth = selector->m_Rule->m_TrackWidth;
|
||||
|
||||
if( aSource )
|
||||
*aSource = wxString::Format( _( "'%s' rule" ), selector->m_Rule->m_Name );
|
||||
}
|
||||
}
|
||||
|
||||
return minWidth;
|
||||
}
|
||||
|
||||
|
||||
int VIA::GetMinAnnulus( wxString* aSource ) const
|
||||
{
|
||||
BOARD_DESIGN_SETTINGS& bds = GetBoard()->GetDesignSettings();
|
||||
NETCLASS* netclass = nullptr;
|
||||
std::vector<DRC_SELECTOR*> matched;
|
||||
|
||||
// NB: we must check the net first, as when it is 0 GetNetClass() will return the
|
||||
// orphaned net netclass, not the default netclass.
|
||||
if( m_netinfo->GetNet() == 0 )
|
||||
netclass = bds.GetDefault();
|
||||
else
|
||||
netclass = GetNetClass();
|
||||
|
||||
MatchSelectors( bds.m_DRCRuleSelectors, this, netclass, nullptr, nullptr, &matched );
|
||||
|
||||
int minAnnulus = bds.m_ViasMinAnnulus;
|
||||
|
||||
if( aSource )
|
||||
*aSource = _( "board" );
|
||||
|
||||
MatchSelectors( bds.m_DRCRuleSelectors, this, netclass, nullptr, nullptr, &matched );
|
||||
|
||||
for( DRC_SELECTOR* selector : matched )
|
||||
{
|
||||
if( selector->m_Rule->m_AnnulusWidth > minAnnulus )
|
||||
{
|
||||
minAnnulus = selector->m_Rule->m_AnnulusWidth;
|
||||
|
||||
if( aSource )
|
||||
*aSource = wxString::Format( _( "'%s' rule" ), selector->m_Rule->m_Name );
|
||||
}
|
||||
}
|
||||
|
||||
return minAnnulus;
|
||||
}
|
||||
|
||||
|
||||
int VIA::GetDrillValue() const
|
||||
{
|
||||
if( m_Drill > 0 ) // Use the specific value.
|
||||
|
@ -512,11 +584,27 @@ unsigned int VIA::ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const
|
|||
// see class_track.h
|
||||
void TRACK::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
|
||||
{
|
||||
EDA_UNITS units = aFrame->GetUserUnits();
|
||||
wxString msg;
|
||||
wxString msg2;
|
||||
wxString source;
|
||||
BOARD* board = GetBoard();
|
||||
|
||||
// Display basic infos
|
||||
GetMsgPanelInfoBase( aFrame, aList );
|
||||
aList.emplace_back( _( "Type" ), _( "Track" ), DARKCYAN );
|
||||
|
||||
GetMsgPanelInfoBase_Common( aFrame, aList );
|
||||
|
||||
// Display layer
|
||||
if( board )
|
||||
msg = board->GetLayerName( m_Layer );
|
||||
else
|
||||
msg.Printf(wxT("%d"), m_Layer );
|
||||
|
||||
// Display width
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), m_Width, true );
|
||||
|
||||
aList.emplace_back( _( "Width" ), msg, DARKCYAN );
|
||||
|
||||
// Display full track length (in Pcbnew)
|
||||
if( board )
|
||||
|
@ -532,135 +620,40 @@ void TRACK::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>
|
|||
|
||||
if( lenPadToDie != 0 )
|
||||
{
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), trackLen + lenPadToDie );
|
||||
aList.emplace_back( _( "Full Length" ), msg, DARKCYAN );
|
||||
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), lenPadToDie, true );
|
||||
aList.emplace_back( _( "Pad To Die Length" ), msg, DARKCYAN );
|
||||
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), trackLen + lenPadToDie );
|
||||
aList.emplace_back( _( "Full Length" ), msg, DARKCYAN );
|
||||
}
|
||||
}
|
||||
|
||||
NETCLASS* netclass = GetNetClass();
|
||||
int clearance = GetClearance( nullptr, &source );
|
||||
|
||||
if( netclass )
|
||||
{
|
||||
aList.emplace_back( _( "NC Name" ), netclass->GetName(), DARKMAGENTA );
|
||||
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), netclass->GetClearance(), true );
|
||||
aList.emplace_back( _( "NC Clearance" ), msg, DARKMAGENTA );
|
||||
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), netclass->GetTrackWidth(), true );
|
||||
aList.emplace_back( _( "NC Width" ), msg, DARKMAGENTA );
|
||||
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), netclass->GetViaDiameter(), true );
|
||||
aList.emplace_back( _( "NC Via Size" ), msg, DARKMAGENTA );
|
||||
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), netclass->GetViaDrill(), true );
|
||||
aList.emplace_back( _( "NC Via Drill"), msg, DARKMAGENTA );
|
||||
}
|
||||
}
|
||||
|
||||
void TRACK::GetMsgPanelInfoBase_Common( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
|
||||
{
|
||||
wxString msg;
|
||||
|
||||
// Display Net Name
|
||||
if( GetBoard() )
|
||||
{
|
||||
NETINFO_ITEM* net = GetNet();
|
||||
|
||||
if( net )
|
||||
msg = UnescapeString( net->GetNetname() );
|
||||
else
|
||||
msg = wxT( "<no name>" );
|
||||
|
||||
aList.emplace_back( _( "NetName" ), msg, RED );
|
||||
|
||||
// Display net code : (useful in test or debug)
|
||||
msg.Printf( wxT( "%d" ), GetNetCode() );
|
||||
aList.emplace_back( _( "NetCode" ), msg, RED );
|
||||
}
|
||||
|
||||
#if defined(DEBUG)
|
||||
|
||||
// Display the flags
|
||||
msg.Printf( wxT( "0x%08X" ), m_Flags );
|
||||
aList.emplace_back( wxT( "Flags" ), msg, BLUE );
|
||||
|
||||
#if 0
|
||||
// Display start and end pointers:
|
||||
msg.Printf( wxT( "%p" ), start );
|
||||
aList.push_back( MSG_PANEL_ITEM( wxT( "start ptr" ), msg, BLUE ) );
|
||||
msg.Printf( wxT( "%p" ), end );
|
||||
aList.push_back( MSG_PANEL_ITEM( wxT( "end ptr" ), msg, BLUE ) );
|
||||
// Display this ptr
|
||||
msg.Printf( wxT( "%p" ), this );
|
||||
aList.push_back( MSG_PANEL_ITEM( wxT( "this" ), msg, BLUE ) );
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
// Display start and end positions:
|
||||
msg.Printf( wxT( "%d %d" ), m_Start.x, m_Start.y );
|
||||
aList.push_back( MSG_PANEL_ITEM( wxT( "Start pos" ), msg, BLUE ) );
|
||||
msg.Printf( wxT( "%d %d" ), m_End.x, m_End.y );
|
||||
aList.push_back( MSG_PANEL_ITEM( wxT( "End pos" ), msg, BLUE ) );
|
||||
#endif
|
||||
|
||||
#endif // defined(DEBUG)
|
||||
|
||||
// Display the State member
|
||||
msg = wxT( ". . " );
|
||||
|
||||
if( GetState( TRACK_LOCKED ) )
|
||||
msg[0] = 'L';
|
||||
|
||||
if( GetState( TRACK_AR ) )
|
||||
msg[2] = 'A';
|
||||
|
||||
aList.emplace_back( _( "Status" ), msg, MAGENTA );
|
||||
}
|
||||
|
||||
|
||||
void TRACK::GetMsgPanelInfoBase( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
|
||||
{
|
||||
wxString msg;
|
||||
BOARD* board = GetBoard();
|
||||
|
||||
aList.emplace_back( _( "Type" ), _( "Track" ), DARKCYAN );
|
||||
|
||||
GetMsgPanelInfoBase_Common( aFrame, aList );
|
||||
|
||||
// Display layer
|
||||
if( board )
|
||||
msg = board->GetLayerName( m_Layer );
|
||||
else
|
||||
msg.Printf(wxT("%d"), m_Layer );
|
||||
|
||||
aList.emplace_back( _( "Layer" ), msg, BROWN );
|
||||
|
||||
// Display width
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), m_Width, true );
|
||||
|
||||
aList.emplace_back( _( "Width" ), msg, DARKCYAN );
|
||||
|
||||
// Display segment length
|
||||
msg = ::MessageTextFromValue( aFrame->GetUserUnits(), GetLength() );
|
||||
aList.emplace_back( _( "Segment Length" ), msg, DARKCYAN );
|
||||
}
|
||||
|
||||
|
||||
void VIA::GetMsgPanelInfoBase( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
|
||||
msg.Printf( _( "Min Clearance: %s" ), MessageTextFromValue( units, clearance, true ) );
|
||||
msg2.Printf( _( "Source: %s" ), source );
|
||||
aList.emplace_back( msg, msg2, BLACK );
|
||||
|
||||
int minWidth = GetMinWidth( &source );
|
||||
|
||||
msg.Printf( _( "Min Width: %s" ), MessageTextFromValue( units, minWidth, true ) );
|
||||
msg2.Printf( _( "Source: %s" ), source );
|
||||
aList.emplace_back( msg, msg2, BLACK );
|
||||
}
|
||||
|
||||
|
||||
void VIA::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
|
||||
{
|
||||
EDA_UNITS units = aFrame->GetUserUnits();
|
||||
wxString msg;
|
||||
wxString msg2;
|
||||
wxString source;
|
||||
BOARD* board = GetBoard();
|
||||
|
||||
// Display basic infos
|
||||
switch( GetViaType() )
|
||||
{
|
||||
default:
|
||||
case VIATYPE::NOT_DEFINED:
|
||||
msg = wxT( "???" ); // Not used yet, does not exist currently
|
||||
break;
|
||||
|
||||
case VIATYPE::MICROVIA:
|
||||
msg = _( "Micro Via" ); // from external layer (TOP or BOTTOM) from
|
||||
// the near neighbor inner layer only
|
||||
|
@ -674,21 +667,23 @@ void VIA::GetMsgPanelInfoBase( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITE
|
|||
case VIATYPE::THROUGH:
|
||||
msg = _( "Through Via" ); // Usual via (from TOP to BOTTOM layer only )
|
||||
break;
|
||||
|
||||
case VIATYPE::NOT_DEFINED:
|
||||
msg = wxT( "???" ); // Not used yet, does not exist currently
|
||||
break;
|
||||
}
|
||||
|
||||
aList.emplace_back( _( "Type" ), msg, DARKCYAN );
|
||||
|
||||
GetMsgPanelInfoBase_Common( aFrame, aList );
|
||||
|
||||
|
||||
// Display layer pair
|
||||
PCB_LAYER_ID top_layer, bottom_layer;
|
||||
|
||||
LayerPair( &top_layer, &bottom_layer );
|
||||
|
||||
if( board )
|
||||
msg = board->GetLayerName( top_layer ) + wxT( "/" )
|
||||
+ board->GetLayerName( bottom_layer );
|
||||
msg = board->GetLayerName( top_layer ) + wxT( "/" ) + board->GetLayerName( bottom_layer );
|
||||
else
|
||||
msg.Printf( wxT( "%d/%d" ), top_layer, bottom_layer );
|
||||
|
||||
|
@ -703,34 +698,81 @@ void VIA::GetMsgPanelInfoBase( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITE
|
|||
// Display drill value
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), GetDrillValue() );
|
||||
|
||||
wxString title = _( "Drill" );
|
||||
title += wxT( " " );
|
||||
aList.emplace_back( _( "Drill" ), msg, RED );
|
||||
|
||||
bool drl_specific = true;
|
||||
int clearance = GetClearance( nullptr, &source );
|
||||
|
||||
msg.Printf( _( "Min Clearance: %s" ), MessageTextFromValue( units, clearance, true ) );
|
||||
msg2.Printf( _( "Source: %s" ), source );
|
||||
aList.emplace_back( msg, msg2, BLACK );
|
||||
|
||||
int minAnnulus = GetMinAnnulus( &source );
|
||||
|
||||
msg.Printf( _( "Min Annulus: %s" ), MessageTextFromValue( units, minAnnulus, true ) );
|
||||
msg2.Printf( _( "Source: %s" ), source );
|
||||
aList.emplace_back( msg, msg2, BLACK );
|
||||
}
|
||||
|
||||
|
||||
void TRACK::GetMsgPanelInfoBase_Common( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
|
||||
{
|
||||
wxString msg;
|
||||
|
||||
// Display Net Name
|
||||
if( GetBoard() )
|
||||
{
|
||||
NETINFO_ITEM* net = GetNet();
|
||||
int drill_class_value = 0;
|
||||
NETCLASS* netclass = nullptr;
|
||||
|
||||
if( net )
|
||||
{
|
||||
if( GetViaType() == VIATYPE::MICROVIA )
|
||||
drill_class_value = net->GetMicroViaDrillSize();
|
||||
if( net->GetNet() )
|
||||
netclass = GetNetClass();
|
||||
else
|
||||
drill_class_value = net->GetViaDrillSize();
|
||||
netclass = GetBoard()->GetDesignSettings().GetDefault();
|
||||
|
||||
msg = UnescapeString( net->GetNetname() );
|
||||
}
|
||||
else
|
||||
{
|
||||
msg = wxT( "<no name>" );
|
||||
}
|
||||
|
||||
drl_specific = GetDrillValue() != drill_class_value;
|
||||
aList.emplace_back( _( "Net" ), msg, RED );
|
||||
|
||||
if( netclass )
|
||||
aList.emplace_back( _( "NetClass" ), netclass->GetName(), DARKMAGENTA );
|
||||
}
|
||||
|
||||
#if 0 // Enable for debugging
|
||||
if( GetBoard() )
|
||||
{
|
||||
// Display net code:
|
||||
msg.Printf( wxT( "%d" ), GetNetCode() );
|
||||
aList.emplace_back( _( "NetCode" ), msg, RED );
|
||||
}
|
||||
|
||||
if( drl_specific )
|
||||
title += _( "(Specific)" );
|
||||
else
|
||||
title += _( "(NetClass)" );
|
||||
// Display the flags:
|
||||
msg.Printf( wxT( "0x%08X" ), m_Flags );
|
||||
aList.emplace_back( wxT( "Flags" ), msg, BLUE );
|
||||
|
||||
aList.emplace_back( title, msg, RED );
|
||||
// Display start and end positions:
|
||||
msg.Printf( wxT( "%d %d" ), m_Start.x, m_Start.y );
|
||||
aList.push_back( MSG_PANEL_ITEM( wxT( "Start pos" ), msg, BLUE ) );
|
||||
msg.Printf( wxT( "%d %d" ), m_End.x, m_End.y );
|
||||
aList.push_back( MSG_PANEL_ITEM( wxT( "End pos" ), msg, BLUE ) );
|
||||
#endif
|
||||
|
||||
// Display the State member
|
||||
msg = wxT( ". . " );
|
||||
|
||||
if( GetState( TRACK_LOCKED ) )
|
||||
msg[0] = 'L';
|
||||
|
||||
if( GetState( TRACK_AR ) )
|
||||
msg[2] = 'A';
|
||||
|
||||
aList.emplace_back( _( "Status" ), msg, MAGENTA );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -212,6 +212,8 @@ public:
|
|||
*/
|
||||
int GetClearance( BOARD_ITEM* aItem = nullptr, wxString* aSource = nullptr ) const override;
|
||||
|
||||
int GetMinWidth( wxString* aSource ) const;
|
||||
|
||||
wxString GetSelectMenuText( EDA_UNITS aUnits ) const override;
|
||||
|
||||
BITMAP_DEF GetMenuImage() const override;
|
||||
|
@ -247,14 +249,6 @@ public:
|
|||
#endif
|
||||
|
||||
protected:
|
||||
/**
|
||||
* Function GetMsgPanelInfoBase
|
||||
* Display info about the track segment only, and does not calculate the full track length
|
||||
* @param aList A list of #MSG_PANEL_ITEM objects to add status information.
|
||||
*/
|
||||
virtual void GetMsgPanelInfoBase( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList );
|
||||
|
||||
|
||||
void GetMsgPanelInfoBase_Common( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList );
|
||||
|
||||
|
||||
|
@ -414,6 +408,8 @@ public:
|
|||
const wxPoint GetPosition() const override { return m_Start; }
|
||||
void SetPosition( const wxPoint& aPoint ) override { m_Start = aPoint; m_End = aPoint; }
|
||||
|
||||
void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;
|
||||
|
||||
bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override;
|
||||
bool HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy = 0 ) const override;
|
||||
|
||||
|
@ -438,6 +434,8 @@ public:
|
|||
void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
|
||||
#endif
|
||||
|
||||
int GetMinAnnulus( wxString* aSource ) const;
|
||||
|
||||
/**
|
||||
* Function SetDrill
|
||||
* sets the drill value for vias.
|
||||
|
@ -474,9 +472,6 @@ public:
|
|||
|
||||
virtual void SwapData( BOARD_ITEM* aImage ) override;
|
||||
|
||||
protected:
|
||||
void GetMsgPanelInfoBase( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;
|
||||
|
||||
private:
|
||||
/// The bottom layer of the via (the top layer is in m_Layer)
|
||||
PCB_LAYER_ID m_BottomLayer;
|
||||
|
|
|
@ -470,7 +470,7 @@ int ZONE_CONTAINER::GetClearance( BOARD_ITEM* aItem, wxString* aSource ) const
|
|||
clearance = m_ZoneClearance;
|
||||
|
||||
if( aSource )
|
||||
*aSource = _( "zone clearance" );
|
||||
*aSource = _( "zone" );
|
||||
}
|
||||
|
||||
return clearance;
|
||||
|
@ -510,15 +510,21 @@ bool ZONE_CONTAINER::HitTestCutout( const VECTOR2I& aRefPos, int* aOutlineIdx, i
|
|||
|
||||
void ZONE_CONTAINER::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
|
||||
{
|
||||
wxString msg;
|
||||
EDA_UNITS units = aFrame->GetUserUnits();
|
||||
wxString msg, msg2;
|
||||
|
||||
msg = _( "Zone Outline" );
|
||||
if( GetIsKeepout() )
|
||||
msg = _( "Keepout Area" );
|
||||
else if( IsOnCopperLayer() )
|
||||
msg = _( "Copper Zone" );
|
||||
else
|
||||
msg = _( "Non-copper Zone" );
|
||||
|
||||
// Display Cutout instead of Outline for holes inside a zone
|
||||
// i.e. when num contour !=0
|
||||
// Check whether the selected corner is in a hole; i.e., in any contour but the first one.
|
||||
if( m_CornerSelection != nullptr && m_CornerSelection->m_contour > 0 )
|
||||
msg << wxT( " " ) << _( "(Cutout)" );
|
||||
msg << wxT( " " ) << _( "Cutout" );
|
||||
|
||||
aList.emplace_back( MSG_PANEL_ITEM( _( "Type" ), msg, DARKCYAN ) );
|
||||
|
||||
|
@ -548,59 +554,53 @@ void ZONE_CONTAINER::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PA
|
|||
if( GetNetCode() >= 0 )
|
||||
{
|
||||
NETINFO_ITEM* net = GetNet();
|
||||
NETCLASS* netclass = nullptr;
|
||||
|
||||
if( net )
|
||||
{
|
||||
if( net->GetNet() )
|
||||
netclass = GetNetClass();
|
||||
else
|
||||
netclass = GetBoard()->GetDesignSettings().GetDefault();
|
||||
|
||||
msg = UnescapeString( net->GetNetname() );
|
||||
else // Should not occur
|
||||
msg = _( "<unknown>" );
|
||||
}
|
||||
else // a netcode < 0 is an error
|
||||
msg = wxT( "<error>" );
|
||||
else
|
||||
{
|
||||
msg = wxT( "<no name>" );
|
||||
}
|
||||
|
||||
aList.emplace_back( MSG_PANEL_ITEM( _( "NetName" ), msg, RED ) );
|
||||
aList.emplace_back( _( "Net" ), msg, RED );
|
||||
|
||||
// Display net code : (useful in test or debug)
|
||||
msg.Printf( wxT( "%d" ), GetNetCode() );
|
||||
aList.emplace_back( MSG_PANEL_ITEM( _( "NetCode" ), msg, RED ) );
|
||||
if( netclass )
|
||||
aList.emplace_back( _( "NetClass" ), netclass->GetName(), DARKMAGENTA );
|
||||
}
|
||||
|
||||
// Display priority level
|
||||
msg.Printf( wxT( "%d" ), GetPriority() );
|
||||
aList.emplace_back( MSG_PANEL_ITEM( _( "Priority" ), msg, BLUE ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
aList.emplace_back( MSG_PANEL_ITEM( _( "Non Copper Zone" ), wxEmptyString, RED ) );
|
||||
}
|
||||
|
||||
aList.emplace_back( MSG_PANEL_ITEM( _( "Layer" ), GetLayerName(), BROWN ) );
|
||||
|
||||
msg.Printf( wxT( "%d" ), (int) m_Poly->TotalVertices() );
|
||||
aList.emplace_back( MSG_PANEL_ITEM( _( "Vertices" ), msg, BLUE ) );
|
||||
aList.emplace_back( _( "Layer" ), LayerMaskDescribe( GetBoard(), m_layerSet ), DARKGREEN );
|
||||
|
||||
switch( m_FillMode )
|
||||
{
|
||||
case ZONE_FILL_MODE::POLYGONS:
|
||||
msg = _( "Solid" ); break;
|
||||
case ZONE_FILL_MODE::HATCH_PATTERN:
|
||||
msg = _( "Hatched" ); break;
|
||||
default:
|
||||
msg = _( "Unknown" ); break;
|
||||
case ZONE_FILL_MODE::POLYGONS: msg = _( "Solid" ); break;
|
||||
case ZONE_FILL_MODE::HATCH_PATTERN: msg = _( "Hatched" ); break;
|
||||
default: msg = _( "Unknown" ); break;
|
||||
}
|
||||
|
||||
aList.emplace_back( MSG_PANEL_ITEM( _( "Fill Mode" ), msg, BROWN ) );
|
||||
aList.emplace_back( _( "Fill Mode" ), msg, BROWN );
|
||||
|
||||
msg = MessageTextFromValue( aFrame->GetUserUnits(), m_area, false, EDA_DATA_TYPE::AREA );
|
||||
aList.emplace_back( MSG_PANEL_ITEM( _( "Filled Area" ), msg, BLUE ) );
|
||||
msg = MessageTextFromValue( units, m_area, false, EDA_DATA_TYPE::AREA );
|
||||
aList.emplace_back( _( "Filled Area" ), msg, BLUE );
|
||||
|
||||
// Useful for statistics :
|
||||
msg.Printf( wxT( "%d" ), (int) m_HatchLines.size() );
|
||||
aList.emplace_back( MSG_PANEL_ITEM( _( "Hatch Lines" ), msg, BLUE ) );
|
||||
wxString source;
|
||||
int clearance = GetClearance( nullptr, &source );
|
||||
|
||||
if( !m_FilledPolysList.IsEmpty() )
|
||||
{
|
||||
msg.Printf( wxT( "%d" ), m_FilledPolysList.TotalVertices() );
|
||||
aList.emplace_back( MSG_PANEL_ITEM( _( "Corner Count" ), msg, BLUE ) );
|
||||
}
|
||||
msg.Printf( _( "Min Clearance: %s" ), MessageTextFromValue( units, clearance, true ) );
|
||||
msg2.Printf( _( "Source: %s" ), source );
|
||||
aList.emplace_back( msg, msg2, BLACK );
|
||||
}
|
||||
|
||||
|
||||
|
@ -668,14 +668,10 @@ void ZONE_CONTAINER::Flip( const wxPoint& aCentre, bool aFlipLeftRight )
|
|||
int copperLayerCount = GetBoard()->GetCopperLayerCount();
|
||||
|
||||
if( GetIsKeepout() )
|
||||
{
|
||||
SetLayerSet( FlipLayerMask( GetLayerSet(), copperLayerCount ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
SetLayer( FlipLayer( GetLayer(), copperLayerCount ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ZONE_CONTAINER::Mirror( const wxPoint& aMirrorRef, bool aMirrorLeftRight )
|
||||
|
@ -749,10 +745,8 @@ void ZONE_CONTAINER::AddPolygon( std::vector< wxPoint >& aPolygon )
|
|||
SHAPE_LINE_CHAIN outline;
|
||||
|
||||
// Create an outline and populate it with the points of aPolygon
|
||||
for( unsigned i = 0; i < aPolygon.size(); i++ )
|
||||
{
|
||||
outline.Append( VECTOR2I( aPolygon[i] ) );
|
||||
}
|
||||
for( const wxPoint& pt : aPolygon)
|
||||
outline.Append( pt );
|
||||
|
||||
outline.SetClosed( true );
|
||||
|
||||
|
|
|
@ -332,7 +332,7 @@ int DRC::testZoneToZoneOutlines( BOARD_COMMIT& aCommit )
|
|||
{
|
||||
drcItem = new DRC_ITEM( DRCE_ZONES_TOO_CLOSE );
|
||||
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s %s; actual %s)" ),
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s clearance %s; actual %s)" ),
|
||||
m_clearanceSource,
|
||||
MessageTextFromValue( userUnits(), zone2zoneClearance, true ),
|
||||
MessageTextFromValue( userUnits(), conflict.second, true ) );
|
||||
|
@ -716,7 +716,7 @@ void DRC::testPadClearances( BOARD_COMMIT& aCommit )
|
|||
actual = std::max( 0, actual );
|
||||
DRC_ITEM* drcItem = new DRC_ITEM( DRCE_PAD_NEAR_EDGE );
|
||||
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s %s; actual %s)" ),
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s clearance %s; actual %s)" ),
|
||||
m_clearanceSource,
|
||||
MessageTextFromValue( userUnits(), minClearance, true ),
|
||||
MessageTextFromValue( userUnits(), actual, true ) );
|
||||
|
@ -1039,7 +1039,7 @@ void DRC::testCopperDrawItem( BOARD_COMMIT& aCommit, BOARD_ITEM* aItem )
|
|||
: DRCE_TRACK_NEAR_COPPER;
|
||||
DRC_ITEM* drcItem = new DRC_ITEM( errorCode );
|
||||
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s %s; actual %s)" ),
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s clearance %s; actual %s)" ),
|
||||
m_clearanceSource,
|
||||
MessageTextFromValue( userUnits(), minClearance, true ),
|
||||
MessageTextFromValue( userUnits(), actual, true ) );
|
||||
|
@ -1097,7 +1097,7 @@ void DRC::testCopperDrawItem( BOARD_COMMIT& aCommit, BOARD_ITEM* aItem )
|
|||
int actual = std::max( 0.0, sqrt( center2center_squared ) - widths );
|
||||
DRC_ITEM* drcItem = new DRC_ITEM( DRCE_PAD_NEAR_COPPER );
|
||||
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s %s; actual %s)" ),
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s clearance %s; actual %s)" ),
|
||||
m_clearanceSource,
|
||||
MessageTextFromValue( userUnits(), minClearance, true ),
|
||||
MessageTextFromValue( userUnits(), actual, true ) );
|
||||
|
@ -1277,7 +1277,7 @@ bool DRC::doPadToPadsDrc( BOARD_COMMIT& aCommit, D_PAD* aRefPad, D_PAD** aStart,
|
|||
{
|
||||
DRC_ITEM* drcItem = new DRC_ITEM( DRCE_HOLE_NEAR_PAD );
|
||||
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s %s; actual %s)" ),
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s clearance %s; actual %s)" ),
|
||||
m_clearanceSource,
|
||||
MessageTextFromValue( userUnits(), minClearance, true ),
|
||||
MessageTextFromValue( userUnits(), actual, true ) );
|
||||
|
@ -1306,7 +1306,7 @@ bool DRC::doPadToPadsDrc( BOARD_COMMIT& aCommit, D_PAD* aRefPad, D_PAD** aStart,
|
|||
{
|
||||
DRC_ITEM* drcItem = new DRC_ITEM( DRCE_HOLE_NEAR_PAD );
|
||||
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s %s; actual %s)" ),
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s clearance %s; actual %s)" ),
|
||||
m_clearanceSource,
|
||||
MessageTextFromValue( userUnits(), minClearance, true ),
|
||||
MessageTextFromValue( userUnits(), actual, true ) );
|
||||
|
@ -1354,7 +1354,7 @@ bool DRC::doPadToPadsDrc( BOARD_COMMIT& aCommit, D_PAD* aRefPad, D_PAD** aStart,
|
|||
{
|
||||
DRC_ITEM* drcItem = new DRC_ITEM( DRCE_PAD_NEAR_PAD );
|
||||
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s %s; actual %s)" ),
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s clearance %s; actual %s)" ),
|
||||
m_clearanceSource,
|
||||
MessageTextFromValue( userUnits(), minClearance, true ),
|
||||
MessageTextFromValue( userUnits(), actual, true ) );
|
||||
|
|
|
@ -140,18 +140,14 @@ void DRC::doTrackDrc( BOARD_COMMIT& aCommit, TRACK* aRefSeg, TRACKS::iterator aS
|
|||
TRACKS::iterator aEndIt, bool aTestZones )
|
||||
{
|
||||
BOARD_DESIGN_SETTINGS& bds = m_pcb->GetDesignSettings();
|
||||
std::vector<DRC_SELECTOR*> matched;
|
||||
|
||||
SEG refSeg( aRefSeg->GetStart(), aRefSeg->GetEnd() );
|
||||
PCB_LAYER_ID refLayer = aRefSeg->GetLayer();
|
||||
LSET refLayerSet = aRefSeg->GetLayerSet();
|
||||
|
||||
NETCLASS* netclass = aRefSeg->GetNet()->GetNet() == 0 ? bds.GetDefault()
|
||||
: aRefSeg->GetNetClass();
|
||||
EDA_RECT refSegBB = aRefSeg->GetBoundingBox();
|
||||
int refSegWidth = aRefSeg->GetWidth();
|
||||
|
||||
MatchSelectors( bds.m_DRCRuleSelectors, aRefSeg, netclass, nullptr, nullptr, &matched );
|
||||
|
||||
|
||||
/******************************************/
|
||||
|
@ -162,16 +158,7 @@ void DRC::doTrackDrc( BOARD_COMMIT& aCommit, TRACK* aRefSeg, TRACKS::iterator aS
|
|||
{
|
||||
VIA *refvia = static_cast<VIA*>( aRefSeg );
|
||||
int viaAnnulus = ( refvia->GetWidth() - refvia->GetDrill() ) / 2;
|
||||
int minAnnulus = 0;
|
||||
|
||||
for( DRC_SELECTOR* selector : matched )
|
||||
{
|
||||
if( selector->m_Rule->m_AnnulusWidth > minAnnulus )
|
||||
{
|
||||
minAnnulus = selector->m_Rule->m_AnnulusWidth;
|
||||
m_clearanceSource = wxString::Format( _( "'%s' rule" ), selector->m_Rule->m_Name );
|
||||
}
|
||||
}
|
||||
int minAnnulus = refvia->GetMinAnnulus( &m_clearanceSource );
|
||||
|
||||
// test if the via size is smaller than minimum
|
||||
if( refvia->GetViaType() == VIATYPE::MICROVIA )
|
||||
|
@ -328,17 +315,7 @@ void DRC::doTrackDrc( BOARD_COMMIT& aCommit, TRACK* aRefSeg, TRACKS::iterator aS
|
|||
}
|
||||
else // This is a track segment
|
||||
{
|
||||
int minWidth = bds.m_TrackMinWidth;
|
||||
m_clearanceSource = _( "board" );
|
||||
|
||||
for( DRC_SELECTOR* selector : matched )
|
||||
{
|
||||
if( selector->m_Rule->m_TrackWidth > minWidth )
|
||||
{
|
||||
minWidth = selector->m_Rule->m_TrackWidth;
|
||||
m_clearanceSource = wxString::Format( _( "'%s' rule" ), selector->m_Rule->m_Name );
|
||||
}
|
||||
}
|
||||
int minWidth = aRefSeg->GetMinWidth( &m_clearanceSource );
|
||||
|
||||
if( refSegWidth < minWidth )
|
||||
{
|
||||
|
@ -414,7 +391,7 @@ void DRC::doTrackDrc( BOARD_COMMIT& aCommit, TRACK* aRefSeg, TRACKS::iterator aS
|
|||
int actual = std::max( 0.0, sqrt( center2center_squared ) - widths );
|
||||
DRC_ITEM* drcItem = new DRC_ITEM( DRCE_TRACK_NEAR_HOLE );
|
||||
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s %s; actual %s)" ),
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s clearance %s; actual %s)" ),
|
||||
m_clearanceSource,
|
||||
MessageTextFromValue( userUnits(), minClearance, true ),
|
||||
MessageTextFromValue( userUnits(), actual, true ) );
|
||||
|
@ -439,7 +416,7 @@ void DRC::doTrackDrc( BOARD_COMMIT& aCommit, TRACK* aRefSeg, TRACKS::iterator aS
|
|||
SEG padSeg( pad->GetPosition(), pad->GetPosition() );
|
||||
DRC_ITEM* drcItem = new DRC_ITEM( DRCE_TRACK_NEAR_PAD );
|
||||
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s %s; actual %s)" ),
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s clearance %s; actual %s)" ),
|
||||
m_clearanceSource,
|
||||
MessageTextFromValue( userUnits(), minClearance, true ),
|
||||
MessageTextFromValue( userUnits(), actual, true ) );
|
||||
|
@ -535,7 +512,7 @@ void DRC::doTrackDrc( BOARD_COMMIT& aCommit, TRACK* aRefSeg, TRACKS::iterator aS
|
|||
int actual = std::max( 0.0, sqrt( center2center_squared ) - widths );
|
||||
DRC_ITEM* drcItem = new DRC_ITEM( errorCode );
|
||||
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s %s; actual %s)" ),
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s clearance %s; actual %s)" ),
|
||||
m_clearanceSource,
|
||||
MessageTextFromValue( userUnits(), minClearance, true ),
|
||||
MessageTextFromValue( userUnits(), actual, true ) );
|
||||
|
@ -587,7 +564,7 @@ void DRC::doTrackDrc( BOARD_COMMIT& aCommit, TRACK* aRefSeg, TRACKS::iterator aS
|
|||
int actual = std::max( 0.0, sqrt( center2center_squared ) - widths );
|
||||
DRC_ITEM* drcItem = new DRC_ITEM( DRCE_TRACK_NEAR_ZONE );
|
||||
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s %s; actual %s)" ),
|
||||
m_msg.Printf( drcItem->GetErrorText() + _( " (%s clearance %s; actual %s)" ),
|
||||
m_clearanceSource,
|
||||
MessageTextFromValue( userUnits(), minClearance, true ),
|
||||
MessageTextFromValue( userUnits(), actual, true ) );
|
||||
|
|
Loading…
Reference in New Issue