More NULL expunging.

This commit is contained in:
Wayne Stambaugh 2021-07-19 19:56:05 -04:00
parent 75190370dd
commit cf00319c85
137 changed files with 4805 additions and 4379 deletions

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2017 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2017-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -67,7 +67,7 @@ ACTION_PLUGIN* ACTION_PLUGINS::GetActionByMenu( int aMenu )
return m_actionsList[i];
}
return NULL;
return nullptr;
}
@ -87,7 +87,7 @@ ACTION_PLUGIN* ACTION_PLUGINS::GetActionByButton( int aButton )
return m_actionsList[i];
}
return NULL;
return nullptr;
}
@ -107,7 +107,7 @@ ACTION_PLUGIN* ACTION_PLUGINS::GetActionByPath(const wxString& aPath)
}
}
return NULL;
return nullptr;
}
@ -125,7 +125,7 @@ ACTION_PLUGIN* ACTION_PLUGINS::GetAction( const wxString& aName )
return action;
}
return NULL;
return nullptr;
}
@ -190,6 +190,7 @@ bool ACTION_PLUGINS::deregister_object( void* aObject )
if( action->GetObject() == aObject )
{
m_actionsList.erase( m_actionsList.begin() + i );
//m_actionsListMenu.erase( m_actionsListMenu.begin() + i );
delete action;
return true;

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Created on: 11 Mar 2016, author John Beard
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2016-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -64,7 +64,7 @@ void ARRAY_CREATOR::Invoke()
int ret = dialog.ShowModal();
if( ret != wxID_OK || array_opts == NULL )
if( ret != wxID_OK || array_opts == nullptr )
return;
BOARD_COMMIT commit( &m_parent );

View File

@ -3,9 +3,9 @@
*
* Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@gmail.com>
*
* Copyright (C) 1992-2020 KiCad Developers, see change_log.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -139,6 +139,7 @@ int AR_AUTOPLACER::genPlacementRoutingMatrix()
m_matrix.TraceSegmentPcb( (PCB_SHAPE*) drawing, CELL_IS_HOLE | CELL_IS_EDGE,
m_matrix.m_GridRouting, AR_MATRIX::WRITE_CELL );
}
break;
default:
@ -272,7 +273,7 @@ bool AR_AUTOPLACER::fillMatrix()
void AR_AUTOPLACER::rotateFootprint( FOOTPRINT* aFootprint, double angle, bool incremental )
{
if( aFootprint == NULL )
if( aFootprint == nullptr )
return;
if( incremental )
@ -296,6 +297,7 @@ void AR_AUTOPLACER::addFpBody( wxPoint aStart, wxPoint aEnd, LSET aLayerMask )
m_fpAreaTop.Append( aEnd.x, aEnd.y );
m_fpAreaTop.Append( aStart.x, aEnd.y );
}
if( aLayerMask[ B_Cu ] )
{
m_fpAreaBottom.NewOutline();
@ -320,6 +322,7 @@ void AR_AUTOPLACER::addPad( PAD* aPad, int aClearance )
m_fpAreaTop.Append( bbox.GetRight(), bbox.GetBottom() );
m_fpAreaTop.Append( bbox.GetLeft(), bbox.GetBottom() );
}
if( aPad->IsOnLayer( B_Cu ) )
{
m_fpAreaBottom.NewOutline();
@ -407,7 +410,7 @@ void AR_AUTOPLACER::genModuleOnRoutingMatrix( FOOTPRINT* Module )
layerMask.set( B_Cu );
m_matrix.TraceFilledRectangle( ox, oy, fx, fy, layerMask,
CELL_IS_MODULE, AR_MATRIX::WRITE_OR_CELL );
CELL_IS_MODULE, AR_MATRIX::WRITE_OR_CELL );
// Trace pads + clearance areas.
for( PAD* pad : Module->Pads() )
@ -429,12 +432,6 @@ void AR_AUTOPLACER::genModuleOnRoutingMatrix( FOOTPRINT* Module )
}
/* Test if the rectangular area (ux, ux .. y0, y1):
* - is a free zone (except OCCUPED_By_MODULE returns)
* - is on the working surface of the board (otherwise returns OUT_OF_BOARD)
*
* Returns OUT_OF_BOARD, or OCCUPED_By_MODULE or FREE_CELL if OK
*/
int AR_AUTOPLACER::testRectangle( const EDA_RECT& aRect, int side )
{
EDA_RECT rect = aRect;
@ -488,10 +485,6 @@ int AR_AUTOPLACER::testRectangle( const EDA_RECT& aRect, int side )
}
/* Calculates and returns the clearance area of the rectangular surface
* aRect):
* (Sum of cells in terms of distance)
*/
unsigned int AR_AUTOPLACER::calculateKeepOutArea( const EDA_RECT& aRect, int side )
{
wxPoint start = aRect.GetOrigin();
@ -541,10 +534,6 @@ unsigned int AR_AUTOPLACER::calculateKeepOutArea( const EDA_RECT& aRect, int sid
}
/* Test if the footprint can be placed on the board.
* Returns the value TstRectangle().
* Module is known by its bounding box
*/
int AR_AUTOPLACER::testFootprintOnBoard( FOOTPRINT* aFootprint, bool TstOtherSide,
const wxPoint& aOffset )
{
@ -693,7 +682,8 @@ const PAD* AR_AUTOPLACER::nearestPad( FOOTPRINT *aRefFP, PAD* aRefPad, const wxP
if( pad->GetNetCode() != aRefPad->GetNetCode() || pad->GetNetCode() <= 0 )
continue;
auto dist = (VECTOR2I( aRefPad->GetPosition() - aOffset ) - VECTOR2I( pad->GetPosition() ) ).EuclideanNorm();
auto dist = ( VECTOR2I( aRefPad->GetPosition() - aOffset ) -
VECTOR2I( pad->GetPosition() ) ).EuclideanNorm();
if ( dist < nearestDist )
{
@ -737,7 +727,7 @@ double AR_AUTOPLACER::computePlacementRatsnestCost( FOOTPRINT *aFootprint, const
dx = abs( dx );
dy = abs( dy );
// ttry to have always dx >= dy to calculate the cost of the rastsnet
// ttry to have always dx >= dy to calculate the cost of the ratsnest
if( dx < dy )
std::swap( dx, dy );
@ -776,7 +766,7 @@ static bool sortFootprintsByRatsnestSize( FOOTPRINT* ref, FOOTPRINT* compare )
}
FOOTPRINT* AR_AUTOPLACER::pickFootprint( )
FOOTPRINT* AR_AUTOPLACER::pickFootprint()
{
std::vector<FOOTPRINT*> fpList;
@ -947,8 +937,8 @@ AR_RESULT AR_AUTOPLACER::AutoplaceFootprints( std::vector<FOOTPRINT*>& aFootprin
//m_frame->SetStatusText( msg );
if( m_progressReporter )
m_progressReporter->SetTitle( wxString::Format(
_( "Autoplacing %s" ), footprint->GetReference() ) );
m_progressReporter->SetTitle( wxString::Format( _( "Autoplacing %s" ),
footprint->GetReference() ) );
double initialOrient = footprint->GetOrientation();
@ -1061,6 +1051,7 @@ end_of_tst:
break;
}
}
cnt++;
}

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -60,14 +60,10 @@ bool BOARD_CONNECTED_ITEM::SetNetCode( int aNetCode, bool aNoAssert )
if( !aNoAssert )
wxASSERT( m_netinfo );
return ( m_netinfo != NULL );
return ( m_netinfo != nullptr );
}
/*
* This method returns the Default netclass for nets which don't have their own, and the
* Orphaned netclass for unassigned nets (netCode == 0)
*/
NETCLASS* BOARD_CONNECTED_ITEM::GetEffectiveNetclass() const
{
// NB: we must check the net first, as when it is 0 GetNetClass() will return the
@ -79,9 +75,6 @@ NETCLASS* BOARD_CONNECTED_ITEM::GetEffectiveNetclass() const
}
/*
* Returns the item's "own" clearance (ie: that not affected by other items).
*/
int BOARD_CONNECTED_ITEM::GetOwnClearance( PCB_LAYER_ID aLayer, wxString* aSource ) const
{
DRC_CONSTRAINT constraint;

View File

@ -46,7 +46,7 @@ public:
static inline bool ClassOf( const EDA_ITEM* aItem )
{
if( aItem == NULL )
if( aItem == nullptr )
return false;
switch( aItem->Type() )

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -57,7 +57,7 @@ BOARD* BOARD_ITEM::GetBoard() const
if( parent )
return parent->GetBoard();
return NULL;
return nullptr;
}
@ -135,7 +135,8 @@ void BOARD_ITEM::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBu
int aError, ERROR_LOC aErrorLoc,
bool ignoreLineWidth ) const
{
wxASSERT_MSG( false, "Called TransformShapeWithClearanceToPolygon() on unsupported BOARD_ITEM." );
wxASSERT_MSG( false,
"Called TransformShapeWithClearanceToPolygon() on unsupported BOARD_ITEM." );
};
@ -147,7 +148,7 @@ bool BOARD_ITEM::ptr_cmp::operator() ( const BOARD_ITEM* a, const BOARD_ITEM* b
if( a->GetLayer() != b->GetLayer() )
return a->GetLayer() < b->GetLayer();
if( a->m_Uuid != b->m_Uuid ) // shopuld be always the case foer valid boards
if( a->m_Uuid != b->m_Uuid ) // should be always the case for valid boards
return a->m_Uuid < b->m_Uuid;
return a < b;

View File

@ -55,6 +55,7 @@ struct TSEGM_2_POLY_PRMS
SHAPE_POLY_SET* m_cornerBuffer;
};
TSEGM_2_POLY_PRMS prms;
@ -67,7 +68,8 @@ static void addTextSegmToPoly( int x0, int y0, int xf, int yf, void* aData )
}
void BOARD::ConvertBrdLayerToPolygonalContours( PCB_LAYER_ID aLayer, SHAPE_POLY_SET& aOutlines ) const
void BOARD::ConvertBrdLayerToPolygonalContours( PCB_LAYER_ID aLayer,
SHAPE_POLY_SET& aOutlines ) const
{
int maxError = GetDesignSettings().m_MaxError;
@ -120,16 +122,16 @@ void BOARD::ConvertBrdLayerToPolygonalContours( PCB_LAYER_ID aLayer, SHAPE_POLY_
const PCB_SHAPE* shape = static_cast<const PCB_SHAPE*>( item );
shape->TransformShapeWithClearanceToPolygon( aOutlines, aLayer, 0, maxError,
ERROR_INSIDE );
}
break;
}
case PCB_TEXT_T:
{
const PCB_TEXT* text = static_cast<const PCB_TEXT*>( item );
text->TransformTextShapeWithClearanceToPolygon( aOutlines, aLayer, 0, maxError,
ERROR_INSIDE );
}
break;
}
default:
break;
@ -164,11 +166,13 @@ void FOOTPRINT::TransformPadsWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuff
case PAD_SHAPE::CIRCLE:
if( pad->GetDrillShape() == PAD_DRILL_SHAPE_CIRCLE )
continue;
break;
case PAD_SHAPE::OVAL:
if( pad->GetDrillShape() != PAD_DRILL_SHAPE_CIRCLE )
continue;
break;
default:
@ -283,12 +287,6 @@ void FOOTPRINT::TransformFPShapesWithClearanceToPolygon( SHAPE_POLY_SET& aCorner
}
/**
* Convert the text to a polygonSet describing the actual character strokes (one per segment).
* @aCornerBuffer = SHAPE_POLY_SET to store the polygon corners
* @aClearanceValue = the clearance around the text
* @aError = the maximum error to allow when approximating curves
*/
void FP_TEXT::TransformTextShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuffer,
PCB_LAYER_ID aLayer, int aClearance,
int aError, ERROR_LOC aErrorLoc ) const
@ -302,8 +300,9 @@ void FP_TEXT::TransformTextShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerB
if( IsMirrored() )
size.x = -size.x;
GRText( NULL, GetTextPos(), BLACK, GetShownText(), GetDrawRotation(), size, GetHorizJustify(),
GetVertJustify(), penWidth, IsItalic(), IsBold(), addTextSegmToPoly, &prms );
GRText( nullptr, GetTextPos(), BLACK, GetShownText(), GetDrawRotation(), size,
GetHorizJustify(), GetVertJustify(), penWidth, IsItalic(), IsBold(),
addTextSegmToPoly, &prms );
}
@ -383,15 +382,9 @@ void EDA_TEXT::TransformBoundingBoxWithClearanceToPolygon( SHAPE_POLY_SET* aCorn
}
/**
* Convert the text to a polygonSet describing the actual character strokes (one per segment).
* @aCornerBuffer = SHAPE_POLY_SET to store the polygon corners
* @aClearanceValue = the clearance around the text
* @aError = the maximum error to allow when approximating curves
*/
void PCB_TEXT::TransformTextShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuffer,
PCB_LAYER_ID aLayer, int aClearanceValue,
int aError, ERROR_LOC aErrorLoc ) const
PCB_LAYER_ID aLayer, int aClearanceValue,
int aError, ERROR_LOC aErrorLoc ) const
{
wxSize size = GetTextSize();
@ -405,15 +398,15 @@ void PCB_TEXT::TransformTextShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCorner
prms.m_error = aError;
COLOR4D color; // not actually used, but needed by GRText
GRText( NULL, GetTextPos(), color, GetShownText(), GetTextAngle(), size, GetHorizJustify(),
GRText( nullptr, GetTextPos(), color, GetShownText(), GetTextAngle(), size, GetHorizJustify(),
GetVertJustify(), penWidth, IsItalic(), IsBold(), addTextSegmToPoly, &prms );
}
void PCB_TEXT::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuffer,
PCB_LAYER_ID aLayer, int aClearance,
int aError, ERROR_LOC aErrorLoc,
bool aIgnoreLineWidth ) const
PCB_LAYER_ID aLayer, int aClearance,
int aError, ERROR_LOC aErrorLoc,
bool aIgnoreLineWidth ) const
{
EDA_TEXT::TransformBoundingBoxWithClearanceToPolygon( &aCornerBuffer, aClearance );
}
@ -441,6 +434,7 @@ void PCB_SHAPE::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuf
TransformRingToPolygon( aCornerBuffer, GetCenter(), GetRadius(), width, aError,
aErrorLoc );
}
break;
case PCB_SHAPE_TYPE::RECT:
@ -463,8 +457,9 @@ void PCB_SHAPE::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuf
TransformOvalToPolygon( aCornerBuffer, pts[2], pts[3], width, aError, aErrorLoc );
TransformOvalToPolygon( aCornerBuffer, pts[3], pts[0], width, aError, aErrorLoc );
}
}
break;
}
case PCB_SHAPE_TYPE::ARC:
TransformArcToPolygon( aCornerBuffer, GetArcStart(), GetArcMid(), GetArcEnd(), width,
@ -518,8 +513,9 @@ void PCB_SHAPE::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuf
pt1 = pt2;
}
}
}
break;
}
case PCB_SHAPE_TYPE::CURVE: // Bezier curve
{
@ -530,10 +526,12 @@ void PCB_SHAPE::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuf
for( unsigned ii = 1; ii < poly.size(); ii++ )
{
TransformOvalToPolygon( aCornerBuffer, poly[ii - 1], poly[ii], width, aError, aErrorLoc );
TransformOvalToPolygon( aCornerBuffer, poly[ii - 1], poly[ii], width, aError,
aErrorLoc );
}
}
break;
}
default:
wxFAIL_MSG( "PCB_SHAPE::TransformShapeWithClearanceToPolygon no implementation for "
@ -557,8 +555,8 @@ void PCB_TRACK::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuf
{
int radius = ( m_Width / 2 ) + aClearanceValue;
TransformCircleToPolygon( aCornerBuffer, m_Start, radius, aError, aErrorLoc );
}
break;
}
case PCB_ARC_T:
{
@ -567,17 +565,17 @@ void PCB_TRACK::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuf
TransformArcToPolygon( aCornerBuffer, arc->GetStart(), arc->GetMid(),
arc->GetEnd(), width, aError, aErrorLoc );
}
break;
}
default:
{
int width = m_Width + ( 2 * aClearanceValue );
TransformOvalToPolygon( aCornerBuffer, m_Start, m_End, width, aError, aErrorLoc );
}
break;
}
}
}
@ -633,8 +631,8 @@ void PAD::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuffer,
TransformTrapezoidToPolygon( outline, padShapePos, m_size, angle, ddx, ddy,
aClearanceValue, aError, aErrorLoc );
aCornerBuffer.Append( outline );
}
break;
}
case PAD_SHAPE::CHAMFERED_RECT:
case PAD_SHAPE::ROUNDRECT:
@ -648,8 +646,8 @@ void PAD::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuffer,
doChamfer ? GetChamferPositions() : 0,
aClearanceValue, aError, aErrorLoc );
aCornerBuffer.Append( outline );
}
break;
}
case PAD_SHAPE::CUSTOM:
{
@ -676,8 +674,8 @@ void PAD::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuffer,
}
aCornerBuffer.Append( outline );
}
break;
}
default:
wxFAIL_MSG( "PAD::TransformShapeWithClearanceToPolygon no implementation for "
@ -748,7 +746,8 @@ void PCB_DIMENSION_BASE::TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& a
}
else
{
wxFAIL_MSG( "PCB_DIMENSION_BASE::TransformShapeWithClearanceToPolygon unexpected shape type." );
wxFAIL_MSG( "PCB_DIMENSION_BASE::TransformShapeWithClearanceToPolygon unexpected "
"shape type." );
}
}
}

View File

@ -210,7 +210,9 @@ void PANEL_SETUP_BOARD_STACKUP::onAdjustDielectricThickness( wxCommandEvent& eve
}
}
else
{
wxMessageBox( _( "All dielectric thickness layers are locked" ) );
}
computeBoardThickness();
}
@ -227,7 +229,7 @@ void PANEL_SETUP_BOARD_STACKUP::disconnectEvents()
{
cb->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED,
wxCommandEventHandler( PANEL_SETUP_BOARD_STACKUP::onColorSelected ),
NULL, this );
nullptr, this );
}
wxButton* matButt = dynamic_cast<wxButton*>( item );
@ -236,7 +238,7 @@ void PANEL_SETUP_BOARD_STACKUP::disconnectEvents()
{
matButt->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler( PANEL_SETUP_BOARD_STACKUP::onMaterialChange ),
NULL, this );
nullptr, this );
}
wxTextCtrl* textCtrl = dynamic_cast<wxTextCtrl*>( item );
@ -245,7 +247,7 @@ void PANEL_SETUP_BOARD_STACKUP::disconnectEvents()
{
textCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED,
wxCommandEventHandler( PANEL_SETUP_BOARD_STACKUP::onThicknessChange ),
NULL, this );
nullptr, this );
}
}
}
@ -391,7 +393,7 @@ void PANEL_SETUP_BOARD_STACKUP::onExportToClipboard( wxCommandEvent& event )
if( !transferDataFromUIToStackup() )
return;
// Build a ascii representation of stackup and copy it in the clipboard
// Build a ASCII representation of stackup and copy it in the clipboard
wxString report = BuildStackupReport( m_stackup, m_units );
wxLogNull doNotLog; // disable logging of failed clipboard actions
@ -631,8 +633,7 @@ void PANEL_SETUP_BOARD_STACKUP::showOnlyActiveLayers()
}
void PANEL_SETUP_BOARD_STACKUP::addMaterialChooser( wxWindowID aId,
const wxString * aMaterialName,
void PANEL_SETUP_BOARD_STACKUP::addMaterialChooser( wxWindowID aId, const wxString* aMaterialName,
BOARD_STACKUP_ROW_UI_ITEM& aUiRowItem )
{
wxBoxSizer* bSizerMat = new wxBoxSizer( wxHORIZONTAL );
@ -651,12 +652,12 @@ void PANEL_SETUP_BOARD_STACKUP::addMaterialChooser( wxWindowID aId,
bSizerMat->Add( textCtrl, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
wxButton* m_buttonMat = new wxButton( m_scGridWin, aId, _( "..." ), wxDefaultPosition,
wxDefaultSize, wxBU_EXACTFIT );
wxDefaultSize, wxBU_EXACTFIT );
bSizerMat->Add( m_buttonMat, 0, wxALIGN_CENTER_VERTICAL, 2 );
m_buttonMat->Connect( wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler( PANEL_SETUP_BOARD_STACKUP::onMaterialChange ),
NULL, this );
nullptr, this );
m_controlItemsList.push_back( m_buttonMat );
aUiRowItem.m_MaterialCtrl = textCtrl;
@ -761,7 +762,7 @@ BOARD_STACKUP_ROW_UI_ITEM PANEL_SETUP_BOARD_STACKUP::createRowData( int aRow,
m_controlItemsList.push_back( textCtrl );
textCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED,
wxCommandEventHandler( PANEL_SETUP_BOARD_STACKUP::onThicknessChange ),
NULL, this );
nullptr, this );
ui_row_item.m_ThicknessCtrl = textCtrl;
if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC )
@ -1021,7 +1022,8 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup()
else
{
success = false;
error_msg << _( "Incorrect value for Epsilon R (Epsilon R must be positive or null if not used)" );
error_msg << _( "Incorrect value for Epsilon R (Epsilon R must be positive or "
"null if not used)" );
}
}
@ -1041,7 +1043,8 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup()
if( !error_msg.IsEmpty() )
error_msg << "\n";
error_msg << _( "Incorrect value for Loss tg (Loss tg must be positive or null if not used)" );
error_msg << _( "Incorrect value for Loss tg (Loss tg must be positive or null "
"if not used)" );
}
}
@ -1266,8 +1269,7 @@ void PANEL_SETUP_BOARD_STACKUP::onColorSelected( wxCommandEvent& event )
combo->SetString( idx, label );
wxBitmap layerbmp( m_colorSwatchesSize.x, m_colorSwatchesSize.y );
LAYER_SELECTOR::DrawColorSwatch( layerbmp, COLOR4D( 0, 0, 0, 0 ),
COLOR4D( color ) );
LAYER_SELECTOR::DrawColorSwatch( layerbmp, COLOR4D( 0, 0, 0, 0 ), COLOR4D( color ) );
combo->SetItemBitmap( combo->GetCount()-1, layerbmp );
}
}
@ -1506,7 +1508,7 @@ wxBitmapComboBox* PANEL_SETUP_BOARD_STACKUP::createBmComboBox( BOARD_STACKUP_ITE
combo->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED,
wxCommandEventHandler( PANEL_SETUP_BOARD_STACKUP::onColorSelected ),
NULL, this );
nullptr, this );
return combo;
}
@ -1530,7 +1532,7 @@ void drawBitmap( wxBitmap& aBitmap, wxColor aColor )
}
p = rowStart;
p.OffsetY(data, 1);
p.OffsetY( data, 1 );
}
}

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2009-2014 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -64,6 +64,7 @@ public:
int m_Id;
int m_Count;
};
WX_DECLARE_LIST( BOM_ENTRY, BOM_ENTRY_LIST );
WX_DEFINE_LIST( BOM_ENTRY_LIST )
@ -97,7 +98,7 @@ void PCB_EDIT_FRAME::RecreateBOMFileFromBoard( wxCommandEvent& aEvent )
fp_bom = wxFopen( fn.GetFullPath(), wxT( "wt" ) );
if( fp_bom == NULL )
if( fp_bom == nullptr )
{
msg.Printf( _( "Failed to create file '%s'." ), fn.GetFullPath() );
DisplayError( this, msg );
@ -169,7 +170,7 @@ void PCB_EDIT_FRAME::RecreateBOMFileFromBoard( wxCommandEvent& aEvent )
// We do not need this object, now: remove it from list and delete it
list.DeleteObject( curEntry );
delete (curEntry);
delete curEntry;
}
fclose( fp_bom );

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2007-2008 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2004-2018 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2004-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -231,7 +231,6 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
#endif
switch( item->Type() )
{
case PCB_PAD_T:
@ -243,8 +242,8 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
// for through pads: pads on Front or Back board sides must be visible
pad = static_cast<PAD*>( item );
if( (pad->GetAttribute() != PAD_ATTRIB::SMD) &&
(pad->GetAttribute() != PAD_ATTRIB::CONN) ) // a hole is present, so multiple layers
if( ( pad->GetAttribute() != PAD_ATTRIB::SMD ) &&
( pad->GetAttribute() != PAD_ATTRIB::CONN ) ) // a hole is present, so multiple layers
{
// proceed to the common tests below, but without the parent footprint test,
// by leaving footprint==NULL, but having pad != null
@ -265,6 +264,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
case PCB_ARC_T:
if( m_Guide->IgnoreTracks() )
goto exit;
break;
case PCB_FP_ZONE_T:
@ -295,46 +295,50 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
break;
case PCB_FP_TEXT_T:
{
FP_TEXT *text = static_cast<FP_TEXT*>( item );
if( m_Guide->IgnoreHiddenFPText() && !text->IsVisible() )
goto exit;
if( m_Guide->IgnoreFPTextOnBack() && IsBackLayer( text->GetLayer() ) )
goto exit;
if( m_Guide->IgnoreFPTextOnFront() && IsFrontLayer( text->GetLayer() ) )
goto exit;
/* The three text types have different criteria: reference
* and value have their own ignore flags; user text instead
* follows their layer visibility. Checking this here is
* simpler than later (when layer visibility is checked for
* other entities) */
switch( text->GetType() )
{
FP_TEXT *text = static_cast<FP_TEXT*>( item );
if( m_Guide->IgnoreHiddenFPText() && !text->IsVisible() )
case FP_TEXT::TEXT_is_REFERENCE:
if( m_Guide->IgnoreFPReferences() )
goto exit;
if( m_Guide->IgnoreFPTextOnBack() && IsBackLayer( text->GetLayer() ) )
break;
case FP_TEXT::TEXT_is_VALUE:
if( m_Guide->IgnoreFPValues() )
goto exit;
if( m_Guide->IgnoreFPTextOnFront() && IsFrontLayer( text->GetLayer() ) )
break;
case FP_TEXT::TEXT_is_DIVERS:
if( !m_Guide->IsLayerVisible( text->GetLayer() )
&& m_Guide->IgnoreNonVisibleLayers() )
goto exit;
/* The three text types have different criteria: reference
* and value have their own ignore flags; user text instead
* follows their layer visibility. Checking this here is
* simpler than later (when layer visibility is checked for
* other entities) */
switch( text->GetType() )
{
case FP_TEXT::TEXT_is_REFERENCE:
if( m_Guide->IgnoreFPReferences() )
goto exit;
break;
case FP_TEXT::TEXT_is_VALUE:
if( m_Guide->IgnoreFPValues() )
goto exit;
break;
case FP_TEXT::TEXT_is_DIVERS:
if( !m_Guide->IsLayerVisible( text->GetLayer() )
&& m_Guide->IgnoreNonVisibleLayers() )
goto exit;
break;
}
// Extract the footprint since it could be hidden
footprint = static_cast<FOOTPRINT*>( item->GetParent() );
break;
}
// Extract the footprint since it could be hidden
footprint = static_cast<FOOTPRINT*>( item->GetParent() );
break;
}
case PCB_FP_SHAPE_T:
shape = static_cast<FP_SHAPE*>( item );
@ -360,10 +364,10 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
if( footprint ) // true from case PCB_PAD_T, PCB_FP_TEXT_T, or PCB_FOOTPRINT_T
{
if( m_Guide->IgnoreFootprintsOnBack() && ( footprint->GetLayer() == B_Cu) )
if( m_Guide->IgnoreFootprintsOnBack() && ( footprint->GetLayer() == B_Cu ) )
goto exit;
if( m_Guide->IgnoreFootprintsOnFront() && ( footprint->GetLayer() == F_Cu) )
if( m_Guide->IgnoreFootprintsOnFront() && ( footprint->GetLayer() == F_Cu ) )
goto exit;
}
@ -579,7 +583,7 @@ void GENERAL_COLLECTOR::Collect( BOARD_ITEM* aItem, const KICAD_T aScanList[],
// the Inspect() function.
SetRefPos( aRefPos );
aItem->Visit( m_inspector, NULL, m_scanTypes );
aItem->Visit( m_inspector, nullptr, m_scanTypes );
// record the length of the primary list before concatenating on to it.
m_PrimaryLength = m_list.size();
@ -606,7 +610,7 @@ void PCB_TYPE_COLLECTOR::Collect( BOARD_ITEM* aBoard, const KICAD_T aScanList[]
{
Empty(); // empty any existing collection
aBoard->Visit( m_inspector, NULL, aScanList );
aBoard->Visit( m_inspector, nullptr, aScanList );
}
@ -625,5 +629,5 @@ void PCB_LAYER_COLLECTOR::Collect( BOARD_ITEM* aBoard, const KICAD_T aScanList[]
{
Empty();
aBoard->Visit( m_inspector, NULL, aScanList );
aBoard->Visit( m_inspector, nullptr, aScanList );
}

View File

@ -85,9 +85,9 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
line[sizeof(line) - 1] = 0;
idcmd = strtok( line, " \n\r" );
text = strtok( NULL, "\"\n\r" );
text = strtok( nullptr, "\"\n\r" );
if( idcmd == NULL )
if( idcmd == nullptr )
return;
if( strcmp( idcmd, "$NET:" ) == 0 )
@ -108,6 +108,7 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
SetMsgPanel( items );
}
}
if( strcmp( idcmd, "$NETS:" ) == 0 )
{
if( !crossProbingSettings.auto_highlight )
@ -148,10 +149,10 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
{
wxString pinName = FROM_UTF8( text );
text = strtok( NULL, " \n\r" );
text = strtok( nullptr, " \n\r" );
if( text && strcmp( text, "$PART:" ) == 0 )
text = strtok( NULL, "\"\n\r" );
text = strtok( nullptr, "\"\n\r" );
modName = FROM_UTF8( text );
@ -163,9 +164,9 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
if( pad )
netcode = pad->GetNetCode();
if( footprint == NULL )
if( footprint == nullptr )
msg.Printf( _( "%s not found" ), modName );
else if( pad == NULL )
else if( pad == nullptr )
msg.Printf( _( "%s pin %s not found" ), modName, pinName );
else
msg.Printf( _( "%s pin %s found" ), modName, pinName );
@ -284,7 +285,8 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
// The "fabs" on x ensures the right answer when the view is flipped
screenSize.x = std::max( 10.0, fabs( screenSize.x ) );
screenSize.y = std::max( 10.0, screenSize.y );
double ratio = std::max( fabs( bbSize.x / screenSize.x ), fabs( bbSize.y / screenSize.y ) );
double ratio = std::max( fabs( bbSize.x / screenSize.x ),
fabs( bbSize.y / screenSize.y ) );
// Try not to zoom on every cross-probe; it gets very noisy
if( crossProbingSettings.zoom_to_fit && ( ratio < 0.5 || ratio > 1.0 ) )
@ -309,19 +311,23 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
double currTextHeight = Millimeter2iu( DEFAULT_TEXT_SIZE );
double compRatio = bbSize.y / currTextHeight; // Ratio of component to text height
double compRatioBent = 1.0; // This will end up as the scaling factor we apply to "ratio"
// This is similar to the original KiCad code that scaled the zoom to make sure components
// were visible on screen. It's simply a ratio of screen size to component size, and its
// job is to zoom in to make the component fullscreen. Earlier in the code the
// component BBox is given a 20% margin to add some breathing room. We compare
// the height of this enlarged component bbox to the default text height. If a component
// will end up with the sides clipped, we adjust later to make sure it fits on screen.
// This will end up as the scaling factor we apply to "ratio".
double compRatioBent = 1.0;
// This is similar to the original KiCad code that scaled the zoom to make sure
// components were visible on screen. It's simply a ratio of screen size to
// component size, and its job is to zoom in to make the component fullscreen.
// Earlier in the code the component BBox is given a 20% margin to add some
// breathing room. We compare the height of this enlarged component bbox to the
// default text height. If a component will end up with the sides clipped, we
// adjust later to make sure it fits on screen.
//
// The "fabs" on x ensures the right answer when the view is flipped
screenSize.x = std::max( 10.0, fabs( screenSize.x ) );
screenSize.y = std::max( 10.0, screenSize.y );
double ratio = std::max( -1.0, fabs( bbSize.y / screenSize.y ) );
// Original KiCad code for how much to scale the zoom
double kicadRatio = std::max( fabs( bbSize.x / screenSize.x ),
fabs( bbSize.y / screenSize.y ) );
@ -369,19 +375,23 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
}
}
else
{
compRatioBent = lut.front().second; // Small component default
}
// If the width of the part we're probing is bigger than what the screen width will be
// after the zoom, then punt and use the KiCad zoom algorithm since it guarantees the
// part's width will be encompassed within the screen. This will apply to parts that are
// much wider than they are tall.
// part's width will be encompassed within the screen. This will apply to parts that
// are much wider than they are tall.
if( bbSize.x > screenSize.x * ratio * compRatioBent )
{
ratio = kicadRatio; // Use standard KiCad zoom algorithm for parts too wide to fit screen
// Use standard KiCad zoom algorithm for parts too wide to fit screen/
ratio = kicadRatio;
compRatioBent = 1.0; // Reset so we don't modify the "KiCad" ratio
wxLogTrace( "CROSS_PROBE_SCALE",
"Part TOO WIDE for screen. Using normal KiCad zoom ratio: %1.5f", ratio );
"Part TOO WIDE for screen. Using normal KiCad zoom ratio: %1.5f",
ratio );
}
// Now that "compRatioBent" holds our final scaling factor we apply it to the original
@ -389,15 +399,18 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
ratio *= compRatioBent;
bool alwaysZoom = false; // DEBUG - allows us to minimize zooming or not
// Try not to zoom on every cross-probe; it gets very noisy
if( ( ratio < 0.5 || ratio > 1.0 ) || alwaysZoom )
view->SetScale( view->GetScale() / ratio );
#endif // ifndef DEFAULT_PCBNEW_CODE
}
view->SetCenter( bbox.Centre() );
}
view->UpdateAllLayersColor();
// Ensure the display is refreshed, because in some installs the refresh is done only
// when the gal canvas has the focus, and that is not the case when crossprobing from
// Eeschema:
@ -419,36 +432,33 @@ std::string FormatProbeItem( BOARD_ITEM* aItem )
return StrPrintf( "$PART: \"%s\"", TO_UTF8( footprint->GetReference() ) );
case PCB_PAD_T:
{
footprint = static_cast<FOOTPRINT*>( aItem->GetParent() );
wxString pad = static_cast<PAD*>( aItem )->GetName();
{
footprint = static_cast<FOOTPRINT*>( aItem->GetParent() );
wxString pad = static_cast<PAD*>( aItem )->GetName();
return StrPrintf( "$PART: \"%s\" $PAD: \"%s\"",
TO_UTF8( footprint->GetReference() ),
TO_UTF8( pad ) );
}
return StrPrintf( "$PART: \"%s\" $PAD: \"%s\"", TO_UTF8( footprint->GetReference() ),
TO_UTF8( pad ) );
}
case PCB_FP_TEXT_T:
{
footprint = static_cast<FOOTPRINT*>( aItem->GetParent() );
{
footprint = static_cast<FOOTPRINT*>( aItem->GetParent() );
FP_TEXT* text = static_cast<FP_TEXT*>( aItem );
const char* text_key;
FP_TEXT* text = static_cast<FP_TEXT*>( aItem );
const char* text_key;
/* This can't be a switch since the break need to pull out
* from the outer switch! */
if( text->GetType() == FP_TEXT::TEXT_is_REFERENCE )
text_key = "$REF:";
else if( text->GetType() == FP_TEXT::TEXT_is_VALUE )
text_key = "$VAL:";
else
break;
/* This can't be a switch since the break need to pull out
* from the outer switch! */
if( text->GetType() == FP_TEXT::TEXT_is_REFERENCE )
text_key = "$REF:";
else if( text->GetType() == FP_TEXT::TEXT_is_VALUE )
text_key = "$VAL:";
else
break;
return StrPrintf( "$PART: \"%s\" %s \"%s\"",
TO_UTF8( footprint->GetReference() ),
text_key,
TO_UTF8( text->GetText() ) );
}
return StrPrintf( "$PART: \"%s\" %s \"%s\"", TO_UTF8( footprint->GetReference() ), text_key,
TO_UTF8( text->GetText() ) );
}
default:
break;
@ -458,14 +468,6 @@ std::string FormatProbeItem( BOARD_ITEM* aItem )
}
/* Send a remote command to Eeschema via a socket,
* aSyncItem = item to be located on schematic (footprint, pin or text)
* Commands are
* $PART: "reference" put cursor on component anchor
* $PART: "reference" $PAD: "pad number" put cursor on the component pin
* $PART: "reference" $REF: "reference" put cursor on the component ref
* $PART: "reference" $VAL: "value" put cursor on the component value
*/
void PCB_EDIT_FRAME::SendMessageToEESCHEMA( BOARD_ITEM* aSyncItem )
{
std::string packet = FormatProbeItem( aSyncItem );
@ -473,7 +475,9 @@ void PCB_EDIT_FRAME::SendMessageToEESCHEMA( BOARD_ITEM* aSyncItem )
if( !packet.empty() )
{
if( Kiface().IsSingle() )
{
SendCommand( MSG_TO_SCH, packet );
}
else
{
// Typically ExpressMail is going to be s-expression packets, but since
@ -492,7 +496,9 @@ void PCB_EDIT_FRAME::SendCrossProbeNetName( const wxString& aNetName )
if( !packet.empty() )
{
if( Kiface().IsSingle() )
{
SendCommand( MSG_TO_SCH, packet );
}
else
{
// Typically ExpressMail is going to be s-expression packets, but since
@ -539,8 +545,8 @@ void PCB_EDIT_FRAME::KiwayMailIn( KIWAY_EXPRESS& mail )
netlist.Format( "pcb_netlist", &sf, 0, CTL_OMIT_FILTERS );
payload = sf.GetString();
}
break;
}
case MAIL_PCB_UPDATE_LINKS:
try
@ -564,6 +570,7 @@ void PCB_EDIT_FRAME::KiwayMailIn( KIWAY_EXPRESS& mail )
assert( false ); // should never happen
return;
}
break;
case MAIL_CROSS_PROBE:
@ -596,8 +603,9 @@ void PCB_EDIT_FRAME::KiwayMailIn( KIWAY_EXPRESS& mail )
if( importFormat >= 0 )
importFile( path, importFormat );
}
break;
}
// many many others.
default:

View File

@ -48,6 +48,7 @@
using std::placeholders::_1;
DIALOG_BOARD_SETUP::DIALOG_BOARD_SETUP( PCB_EDIT_FRAME* aFrame ) :
PAGED_DIALOG( aFrame, _( "Board Setup" ), false,
_( "Import Settings from Another Board..." ) ),
@ -88,6 +89,7 @@ DIALOG_BOARD_SETUP::DIALOG_BOARD_SETUP( PCB_EDIT_FRAME* aFrame ) :
m_treebook->AddSubPage( m_layers, _( "Board Editor Layers" ) );
m_layerSetupPage = 1;
m_treebook->AddSubPage( m_physicalStackup, _( "Physical Stackup" ) );
// Change this value if m_physicalStackup is not the page 2 of m_treebook
m_physicalStackupPage = 2; // The page number (from 0) to select the m_physicalStackup panel
m_treebook->AddSubPage( m_boardFinish, _( "Board Finish" ) );
@ -111,7 +113,8 @@ DIALOG_BOARD_SETUP::DIALOG_BOARD_SETUP( PCB_EDIT_FRAME* aFrame ) :
// Connect Events
m_treebook->Connect( wxEVT_TREEBOOK_PAGE_CHANGED,
wxBookCtrlEventHandler( DIALOG_BOARD_SETUP::OnPageChange ), NULL, this );
wxBookCtrlEventHandler( DIALOG_BOARD_SETUP::OnPageChange ),
nullptr, this );
finishDialogSettings();
}
@ -120,7 +123,8 @@ DIALOG_BOARD_SETUP::DIALOG_BOARD_SETUP( PCB_EDIT_FRAME* aFrame ) :
DIALOG_BOARD_SETUP::~DIALOG_BOARD_SETUP()
{
m_treebook->Disconnect( wxEVT_TREEBOOK_PAGE_CHANGED,
wxBookCtrlEventHandler( DIALOG_BOARD_SETUP::OnPageChange ), NULL, this );
wxBookCtrlEventHandler( DIALOG_BOARD_SETUP::OnPageChange ),
nullptr, this );
}
@ -160,7 +164,6 @@ void DIALOG_BOARD_SETUP::OnPageChange( wxBookCtrlEvent& event )
}
// Run Import Settings... action
void DIALOG_BOARD_SETUP::OnAuxiliaryAction( wxCommandEvent& event )
{
DIALOG_IMPORT_SETTINGS importDlg( this, m_frame );

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2019 Alexander Shuklin, jasuramme@gmail.com
* Copyright (C) 2019 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2019-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -45,8 +45,9 @@
#define ROW_BOARD_HEIGHT 1
#define ROW_BOARD_AREA 2
/**
* Struct containing the dialog last saved state
* The dialog last saved state.
*/
struct DIALOG_BOARD_STATISTICS_SAVED_STATE
{
@ -69,6 +70,7 @@ struct DIALOG_BOARD_STATISTICS_SAVED_STATE
// used to reinit last state after a project change
};
static DIALOG_BOARD_STATISTICS_SAVED_STATE s_savedDialogState;
DIALOG_BOARD_STATISTICS::DIALOG_BOARD_STATISTICS( PCB_EDIT_FRAME* aParentFrame ) :
@ -81,7 +83,9 @@ DIALOG_BOARD_STATISTICS::DIALOG_BOARD_STATISTICS( PCB_EDIT_FRAME* aParentFrame )
m_parentFrame = aParentFrame;
m_gridDrills->UseNativeColHeader();
m_gridDrills->Connect( wxEVT_GRID_COL_SORT, wxGridEventHandler( DIALOG_BOARD_STATISTICS::drillGridSort ), NULL, this );
m_gridDrills->Connect( wxEVT_GRID_COL_SORT,
wxGridEventHandler( DIALOG_BOARD_STATISTICS::drillGridSort ),
nullptr, this );
m_checkBoxExcludeComponentsNoPins->SetValue( s_savedDialogState.excludeNoPins );
m_checkBoxSubtractHoles->SetValue( s_savedDialogState.subtractHoles );
@ -103,6 +107,7 @@ DIALOG_BOARD_STATISTICS::DIALOG_BOARD_STATISTICS( PCB_EDIT_FRAME* aParentFrame )
m_gridBoard->SetCellAlignment( 2, 0, wxALIGN_LEFT, wxALIGN_CENTRE );
wxGrid* grids[] = { m_gridComponents, m_gridPads, m_gridVias, m_gridBoard };
for( auto& grid : grids )
{
// Remove wxgrid's selection boxes
@ -130,6 +135,7 @@ DIALOG_BOARD_STATISTICS::DIALOG_BOARD_STATISTICS( PCB_EDIT_FRAME* aParentFrame )
m_sdbControlSizerCancel->SetLabel( _( "Close" ) );
}
void DIALOG_BOARD_STATISTICS::refreshItemsTypes()
{
m_componentsTypes.clear();
@ -167,6 +173,7 @@ void DIALOG_BOARD_STATISTICS::refreshItemsTypes()
m_gridVias->AppendRows( appendRows );
}
bool DIALOG_BOARD_STATISTICS::TransferDataToWindow()
{
refreshItemsTypes();
@ -178,6 +185,7 @@ bool DIALOG_BOARD_STATISTICS::TransferDataToWindow()
return true;
}
void DIALOG_BOARD_STATISTICS::getDataFromPCB()
{
BOARD* board = m_parentFrame->GetBoard();
@ -348,6 +356,7 @@ void DIALOG_BOARD_STATISTICS::getDataFromPCB()
}
}
void DIALOG_BOARD_STATISTICS::updateWidets()
{
int totalPads = 0;
@ -356,8 +365,8 @@ void DIALOG_BOARD_STATISTICS::updateWidets()
for( const auto& type : m_padsTypes )
{
m_gridPads->SetCellValue( currentRow, COL_LABEL, type.title );
m_gridPads->SetCellValue(
currentRow, COL_AMOUNT, wxString::Format( wxT( "%i " ), type.qty ) );
m_gridPads->SetCellValue( currentRow, COL_AMOUNT,
wxString::Format( wxT( "%i " ), type.qty ) );
totalPads += type.qty;
currentRow++;
}
@ -371,8 +380,7 @@ void DIALOG_BOARD_STATISTICS::updateWidets()
for( const auto& type : m_viasTypes )
{
m_gridVias->SetCellValue( currentRow, COL_LABEL, type.title );
m_gridVias->SetCellValue(
currentRow, COL_AMOUNT, wxString::Format( "%i ", type.qty ) );
m_gridVias->SetCellValue( currentRow, COL_AMOUNT, wxString::Format( "%i ", type.qty ) );
totalVias += type.qty;
currentRow++;
}
@ -416,7 +424,8 @@ void DIALOG_BOARD_STATISTICS::updateWidets()
m_gridBoard->SetCellValue( ROW_BOARD_HEIGHT, COL_AMOUNT,
MessageTextFromValue( GetUserUnits(), m_boardHeight ) + " " );
m_gridBoard->SetCellValue( ROW_BOARD_AREA, COL_AMOUNT,
MessageTextFromValue( GetUserUnits(), m_boardArea, true, EDA_DATA_TYPE::AREA ) );
MessageTextFromValue( GetUserUnits(), m_boardArea, true,
EDA_DATA_TYPE::AREA ) );
}
else
{
@ -436,6 +445,7 @@ void DIALOG_BOARD_STATISTICS::updateWidets()
adjustDrillGridColumns();
}
void DIALOG_BOARD_STATISTICS::updateDrillGrid()
{
BOARD* board = m_parentFrame->GetBoard();
@ -488,8 +498,10 @@ void DIALOG_BOARD_STATISTICS::updateDrillGrid()
}
}
void DIALOG_BOARD_STATISTICS::printGridToStringAsTable( wxGrid* aGrid, wxString& aStr,
bool aUseRowLabels, bool aUseColLabels, bool aUseFirstColAsLabel )
bool aUseRowLabels, bool aUseColLabels,
bool aUseFirstColAsLabel )
{
std::vector<int> widths( aGrid->GetNumberCols(), 0 );
int rowLabelsWidth = 0;
@ -530,6 +542,7 @@ void DIALOG_BOARD_STATISTICS::printGridToStringAsTable( wxGrid* aGrid, wxString&
tmp.Printf( " %*s |", widths[col], aGrid->GetColLabelValue( col ) );
else
tmp.Printf( " %*s |", widths[col], aGrid->GetCellValue( 0, col ) );
aStr << tmp;
}
@ -572,6 +585,7 @@ void DIALOG_BOARD_STATISTICS::printGridToStringAsTable( wxGrid* aGrid, wxString&
tmp.Printf( "|%-*s |", widths[0], aGrid->GetCellValue( row, 0 ) );
else
tmp.Printf( "|" );
aStr << tmp;
for( int col = firstCol; col < aGrid->GetNumberCols(); col++ )
@ -579,10 +593,12 @@ void DIALOG_BOARD_STATISTICS::printGridToStringAsTable( wxGrid* aGrid, wxString&
tmp.Printf( " %*s |", widths[col], aGrid->GetCellValue( row, col ) );
aStr << tmp;
}
aStr << "\n";
}
}
void DIALOG_BOARD_STATISTICS::adjustDrillGridColumns()
{
int newTotalWidth = m_gridDrills->GetClientSize().GetWidth();
@ -605,7 +621,7 @@ void DIALOG_BOARD_STATISTICS::adjustDrillGridColumns()
m_gridDrills->Refresh();
}
// If any checkbox clicked, we have to refresh dialog data
void DIALOG_BOARD_STATISTICS::checkboxClicked( wxCommandEvent& aEvent )
{
s_savedDialogState.excludeNoPins = m_checkBoxExcludeComponentsNoPins->GetValue();
@ -617,6 +633,7 @@ void DIALOG_BOARD_STATISTICS::checkboxClicked( wxCommandEvent& aEvent )
drillsPanel->Layout();
}
void DIALOG_BOARD_STATISTICS::saveReportClicked( wxCommandEvent& aEvent )
{
FILE* outFile;
@ -639,7 +656,7 @@ void DIALOG_BOARD_STATISTICS::saveReportClicked( wxCommandEvent& aEvent )
outFile = wxFopen( saveFileDialog.GetPath(), "wt" );
if( outFile == NULL )
if( outFile == nullptr )
{
msg.Printf( _( "Failed to create file '%s'." ), saveFileDialog.GetPath() );
DisplayErrorMessage( this, msg );
@ -656,9 +673,12 @@ void DIALOG_BOARD_STATISTICS::saveReportClicked( wxCommandEvent& aEvent )
if( m_hasOutline )
{
msg << wxS( "- " ) << _( "Width" ) << wxS( ": " ) << MessageTextFromValue( GetUserUnits(), m_boardWidth ) << "\n";
msg << wxS( "- " ) << _( "Height" ) << wxS( ": " )<< MessageTextFromValue( GetUserUnits(), m_boardHeight ) << "\n";
msg << wxS( "- " ) << _( "Area" ) + wxS( ": " ) << MessageTextFromValue( GetUserUnits(), m_boardArea, true, EDA_DATA_TYPE::AREA );
msg << wxS( "- " ) << _( "Width" ) << wxS( ": " ) <<
MessageTextFromValue( GetUserUnits(), m_boardWidth ) << "\n";
msg << wxS( "- " ) << _( "Height" ) << wxS( ": " ) <<
MessageTextFromValue( GetUserUnits(), m_boardHeight ) << "\n";
msg << wxS( "- " ) << _( "Area" ) + wxS( ": " ) <<
MessageTextFromValue( GetUserUnits(), m_boardArea, true, EDA_DATA_TYPE::AREA );
msg << "\n";
}
else
@ -687,6 +707,7 @@ void DIALOG_BOARD_STATISTICS::saveReportClicked( wxCommandEvent& aEvent )
wxString tmp;
widths.reserve( labels.size() );
for( const auto& label : labels )
widths.push_back( label.size() );
@ -731,6 +752,7 @@ void DIALOG_BOARD_STATISTICS::saveReportClicked( wxCommandEvent& aEvent )
fclose( outFile );
}
void DIALOG_BOARD_STATISTICS::drillGridSize( wxSizeEvent& aEvent )
{
aEvent.Skip();
@ -748,6 +770,7 @@ void DIALOG_BOARD_STATISTICS::drillGridSort( wxGridEvent& aEvent )
updateDrillGrid();
}
DIALOG_BOARD_STATISTICS::~DIALOG_BOARD_STATISTICS()
{
}

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2020-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -65,15 +65,17 @@ WX_HTML_REPORT_BOX* DIALOG_CONSTRAINTS_REPORTER::AddPage( const wxString& aTitle
WX_HTML_REPORT_BOX* reporter = new WX_HTML_REPORT_BOX( panel, wxID_ANY, wxDefaultPosition,
wxDefaultSize,
wxHW_SCROLLBAR_AUTO|wxBORDER_SIMPLE );
wxHW_SCROLLBAR_AUTO | wxBORDER_SIMPLE );
sizer->Add( reporter, 1, wxEXPAND|wxALL, 5 );
sizer->Add( reporter, 1, wxEXPAND | wxALL, 5 );
panel->SetSizer( sizer );
panel->Layout();
m_notebook->AddPage( panel, aTitle );
reporter->SetUnits( m_frame->GetUserUnits() );
reporter->Connect( wxEVT_COMMAND_HTML_LINK_CLICKED, wxHtmlLinkEventHandler( DIALOG_CONSTRAINTS_REPORTER::OnErrorLinkClicked ), NULL, this );
reporter->Connect( wxEVT_COMMAND_HTML_LINK_CLICKED,
wxHtmlLinkEventHandler( DIALOG_CONSTRAINTS_REPORTER::OnErrorLinkClicked ),
nullptr, this );
return reporter;
}

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2009-2016 Dick Hollenbeck, dick@softplc.com
* Copyright (C) 2004-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2004-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -153,8 +153,6 @@ void DIALOG_DRC::initValues()
}
// PROGRESS_REPORTER calls
bool DIALOG_DRC::updateUI()
{
double cur = (double) m_progress.load() / m_maxProgress;
@ -502,8 +500,9 @@ void DIALOG_DRC::OnDRCItemRClick( wxDataViewEvent& aEvent )
static_cast<RC_TREE_MODEL*>( aEvent.GetModel() )->ValueChanged( node );
modified = true;
}
}
break;
}
case 2:
{
@ -522,8 +521,9 @@ void DIALOG_DRC::OnDRCItemRClick( wxDataViewEvent& aEvent )
modified = true;
}
}
break;
}
case 3:
{
@ -531,8 +531,8 @@ void DIALOG_DRC::OnDRCItemRClick( wxDataViewEvent& aEvent )
BOARD_INSPECTION_TOOL* inspectionTool = toolMgr->GetTool<BOARD_INSPECTION_TOOL>();
inspectionTool->InspectDRCError( node->m_RcItem );
}
break;
}
case 4:
bds().m_DRCSeverities[ rcItem->GetErrorCode() ] = RPT_SEVERITY_ERROR;
@ -582,8 +582,8 @@ void DIALOG_DRC::OnDRCItemRClick( wxDataViewEvent& aEvent )
// Rebuild model and view
static_cast<RC_TREE_MODEL*>( aEvent.GetModel() )->SetProvider( m_markersProvider );
modified = true;
}
break;
}
case 7:
m_frame->ShowBoardSetupDialog( _( "Violation Severity" ) );
@ -786,7 +786,7 @@ bool DIALOG_DRC::writeReport( const wxString& aFullFileName )
{
FILE* fp = wxFopen( aFullFileName, wxT( "w" ) );
if( fp == NULL )
if( fp == nullptr )
return false;
std::map<KIID, EDA_ITEM*> itemMap;
@ -959,7 +959,9 @@ void DIALOG_DRC::updateDisplayedCounts()
m_Notebook->SetPageText( 1, msg );
if( m_footprintTestsRun )
{
msg.sprintf( m_footprintsTitleTemplate, numFootprints );
}
else
{
msg = m_footprintsTitleTemplate;

View File

@ -4,7 +4,7 @@
* Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2015 Dick Hollenbeck, dick@softplc.com
* Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 2004-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2004-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -49,15 +49,19 @@
#include <fp_lib_table.h>
int DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::m_page = 0; // remember the last open page during session
// Remember the last open page during session.
int DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::m_page = 0;
DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR( FOOTPRINT_EDIT_FRAME* aParent,
FOOTPRINT* aFootprint ) :
DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR(
FOOTPRINT_EDIT_FRAME* aParent,
FOOTPRINT* aFootprint ) :
DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR_BASE( aParent ),
m_netClearance( aParent, m_NetClearanceLabel, m_NetClearanceCtrl, m_NetClearanceUnits ),
m_solderMask( aParent, m_SolderMaskMarginLabel, m_SolderMaskMarginCtrl, m_SolderMaskMarginUnits ),
m_solderPaste( aParent, m_SolderPasteMarginLabel, m_SolderPasteMarginCtrl, m_SolderPasteMarginUnits ),
m_solderMask( aParent, m_SolderMaskMarginLabel, m_SolderMaskMarginCtrl,
m_SolderMaskMarginUnits ),
m_solderPaste( aParent, m_SolderPasteMarginLabel, m_SolderPasteMarginCtrl,
m_SolderPasteMarginUnits ),
m_inSelect( false )
{
m_frame = aParent;
@ -89,6 +93,7 @@ DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR( FO
m_itemsGrid->ShowHideColumns( m_frame->GetSettings()->m_FootprintTextShownColumns );
PCBNEW_SETTINGS* cfg = Pgm().GetSettingsManager().GetAppSettings<PCBNEW_SETTINGS>();
if( cfg->m_lastFootprint3dDir.IsEmpty() )
{
wxGetEnv( KICAD6_3DMODEL_DIR, &cfg->m_lastFootprint3dDir );
@ -158,7 +163,9 @@ DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR( FO
m_button3DShapeRemove->SetBitmap( KiBitmap( BITMAPS::small_trash ) );
// wxFormBuilder doesn't include this event...
m_itemsGrid->Connect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::OnGridCellChanging ), NULL, this );
m_itemsGrid->Connect( wxEVT_GRID_CELL_CHANGING,
wxGridEventHandler( DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::OnGridCellChanging ),
nullptr, this );
finishDialogSettings();
}
@ -172,7 +179,9 @@ DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::~DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR()
// Prevents crash bug in wxGrid's d'tor
m_itemsGrid->DestroyTable( m_texts );
m_itemsGrid->Disconnect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::OnGridCellChanging ), NULL, this );
m_itemsGrid->Disconnect( wxEVT_GRID_CELL_CHANGING,
wxGridEventHandler( DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::OnGridCellChanging ),
nullptr, this );
// Delete the GRID_TRICKS.
m_itemsGrid->PopEventHandler( true );
@ -283,6 +292,7 @@ bool DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::TransferDataToWindow()
wxString default_path;
wxGetEnv( KICAD6_3DMODEL_DIR, &default_path );
#ifdef __WINDOWS__
default_path.Replace( wxT( "/" ), wxT( "\\" ) );
#endif
@ -396,7 +406,7 @@ void DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::On3DModelCellChanged( wxGridEvent& a
filename.insert( 0, wxT( ":" ) );
#ifdef __WINDOWS__
// In Kicad files, filenames and paths are stored using Unix notation
// In KiCad files, filenames and paths are stored using Unix notation
filename.Replace( wxT( "\\" ), wxT( "/" ) );
#endif
@ -482,7 +492,7 @@ void DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::OnAdd3DModel( wxCommandEvent& )
filename = alias + wxT( ":" ) + shortPath;
#ifdef __WINDOWS__
// In Kicad files, filenames and paths are stored using Unix notation
// In KiCad files, filenames and paths are stored using Unix notation
model.m_Filename.Replace( "\\", "/" );
#endif
@ -690,6 +700,7 @@ bool DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::TransferDataFromWindow()
// A -50% margin ratio means no paste on a pad, the ratio must be >= -50%
if( dtmp < -50.0 )
dtmp = -50.0;
// A margin ratio is always <= 0
// 0 means use full pad copper area
if( dtmp > 0.0 )
@ -832,7 +843,7 @@ void DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::OnUpdateUI( wxUpdateUIEvent& event )
if( m_itemsGrid->IsCellEditControlShown() )
{
// Currently: nonthing to do
// Currently: nothing to do
}
// Handle a delayed focus. The delay allows us to:

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2009-2016 Jean-Pierre Charras, jean-pierre.charras at wanadoo.fr
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -33,6 +33,7 @@
#include <tools/global_edit_tool.h>
#include "dialog_global_edit_tracks_and_vias_base.h"
// Columns of netclasses grid
enum {
GRID_NAME = 0,
@ -133,7 +134,9 @@ DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS::DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS( PCB_EDIT
m_netclassGrid->SetCellHighlightPenWidth( 0 );
m_sdbSizerOK->SetDefault();
m_netFilter->Connect( NET_SELECTED, wxCommandEventHandler( DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS::OnNetFilterSelect ), NULL, this );
m_netFilter->Connect( NET_SELECTED,
wxCommandEventHandler( DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS::OnNetFilterSelect ),
nullptr, this );
finishDialogSettings();
}
@ -151,7 +154,9 @@ DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS::~DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS()
g_layerFilter = m_layerFilter->GetLayerSelection();
g_filterSelected = m_selectedItemsFilter->GetValue();
m_netFilter->Disconnect( NET_SELECTED, wxCommandEventHandler( DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS::OnNetFilterSelect ), NULL, this );
m_netFilter->Disconnect( NET_SELECTED,
wxCommandEventHandler( DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS::OnNetFilterSelect ),
nullptr, this );
delete[] m_originalColWidths;
}
@ -210,6 +215,7 @@ void DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS::buildNetclassesGrid()
SET_NETCLASS_VALUE( 1, GRID_uVIADRILL, defaultNetclass->GetuViaDrill() );
int row = 2;
for( const auto& netclass : netclasses )
{
m_netclassGrid->SetCellValue( row, GRID_NAME, netclass.first );
@ -237,7 +243,7 @@ bool DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS::TransferDataToWindow()
else if( item )
m_netclassFilter->SetStringSelection( item->GetNet()->GetNetClassName() );
if( g_filterByNet && m_brd->FindNet( g_netFilter ) != NULL )
if( g_filterByNet && m_brd->FindNet( g_netFilter ) != nullptr )
{
m_netFilter->SetSelectedNet( g_netFilter );
m_netFilterOpt->SetValue( true );

View File

@ -7,7 +7,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2017 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -67,9 +67,10 @@ DIALOG_PAD_PRIMITIVES_PROPERTIES::DIALOG_PAD_PRIMITIVES_PROPERTIES( wxWindow* aP
finishDialogSettings();
}
bool DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataToWindow()
{
if( m_shape == NULL )
if( m_shape == nullptr )
return false;
m_thickness.SetValue( m_shape->GetWidth() );
@ -169,6 +170,7 @@ bool DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataToWindow()
return true;
}
bool DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataFromWindow()
{
if( m_thickness.GetValue() == 0 && !m_filledCtrl->GetValue() )
@ -201,6 +203,7 @@ bool DIALOG_PAD_PRIMITIVES_PROPERTIES::TransferDataFromWindow()
// the start point in m_End
m_shape->SetStart( wxPoint( m_endX.GetValue(), m_endY.GetValue() ) );
m_shape->SetEnd( wxPoint( m_startX.GetValue(), m_startY.GetValue() ) );
// arc angle
m_shape->SetAngle( m_radius.GetValue() );
break;
@ -249,7 +252,9 @@ DIALOG_PAD_PRIMITIVE_POLY_PROPS::DIALOG_PAD_PRIMITIVE_POLY_PROPS( wxWindow* aPar
m_sdbSizerOK->SetDefault();
GetSizer()->SetSizeHints( this );
m_gridCornersList->Connect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_PAD_PRIMITIVE_POLY_PROPS::onCellChanging ), NULL, this );
m_gridCornersList->Connect( wxEVT_GRID_CELL_CHANGING,
wxGridEventHandler( DIALOG_PAD_PRIMITIVE_POLY_PROPS::onCellChanging ),
nullptr, this );
// Now all widgets have the size fixed, call FinishDialogSettings
finishDialogSettings();
@ -258,13 +263,15 @@ DIALOG_PAD_PRIMITIVE_POLY_PROPS::DIALOG_PAD_PRIMITIVE_POLY_PROPS( wxWindow* aPar
DIALOG_PAD_PRIMITIVE_POLY_PROPS::~DIALOG_PAD_PRIMITIVE_POLY_PROPS()
{
m_gridCornersList->Disconnect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_PAD_PRIMITIVE_POLY_PROPS::onCellChanging ), NULL, this );
m_gridCornersList->Disconnect( wxEVT_GRID_CELL_CHANGING,
wxGridEventHandler( DIALOG_PAD_PRIMITIVE_POLY_PROPS::onCellChanging ),
nullptr, this );
}
bool DIALOG_PAD_PRIMITIVE_POLY_PROPS::TransferDataToWindow()
{
if( m_shape == NULL )
if( m_shape == nullptr )
return false;
m_thickness.SetValue( m_shape->GetWidth() );
@ -285,6 +292,7 @@ bool DIALOG_PAD_PRIMITIVE_POLY_PROPS::TransferDataToWindow()
// enter others corner coordinates
wxString msg;
for( unsigned row = 0; row < m_currPoints.size(); ++row )
{
// Row label is "Corner x"
@ -321,7 +329,6 @@ bool DIALOG_PAD_PRIMITIVE_POLY_PROPS::Validate()
}
// test for a valid polygon (a not self intersectiong polygon)
bool DIALOG_PAD_PRIMITIVE_POLY_PROPS::doValidate( bool aRemoveRedundantCorners )
{
if( !m_gridCornersList->CommitPendingChanges() )
@ -413,6 +420,7 @@ void DIALOG_PAD_PRIMITIVE_POLY_PROPS::OnButtonAdd( wxCommandEvent& event )
m_panelPoly->Refresh();
}
void DIALOG_PAD_PRIMITIVE_POLY_PROPS::OnButtonDelete( wxCommandEvent& event )
{
if( !m_gridCornersList->CommitPendingChanges() )
@ -442,12 +450,14 @@ void DIALOG_PAD_PRIMITIVE_POLY_PROPS::OnButtonDelete( wxCommandEvent& event )
TransferDataToWindow();
m_gridCornersList->ForceRefresh();
// select the row previous to the last deleted row
m_gridCornersList->SelectRow( std::max( 0, selections[ 0 ] - 1 ) );
m_panelPoly->Refresh();
}
void DIALOG_PAD_PRIMITIVE_POLY_PROPS::onPaintPolyPanel( wxPaintEvent& event )
{
wxPaintDC dc( m_panelPoly );
@ -476,8 +486,8 @@ void DIALOG_PAD_PRIMITIVE_POLY_PROPS::onPaintPolyPanel( wxPaintEvent& event )
// Draw X and Y axis. This is particularly useful to show the
// reference position of basic shape
// Axis are drawn before the polygon to avoid masking segments on axis
GRLine( NULL, &dc, -dc_size.x, 0, dc_size.x, 0, 0, LIGHTBLUE ); // X axis
GRLine( NULL, &dc, 0, -dc_size.y, 0, dc_size.y, 0, LIGHTBLUE ); // Y axis
GRLine( nullptr, &dc, -dc_size.x, 0, dc_size.x, 0, 0, LIGHTBLUE ); // X axis
GRLine( nullptr, &dc, 0, -dc_size.y, 0, dc_size.y, 0, LIGHTBLUE ); // Y axis
// Draw polygon.
// The selected edge(s) are shown in selectcolor, the others in normalcolor.
@ -498,23 +508,27 @@ void DIALOG_PAD_PRIMITIVE_POLY_PROPS::onPaintPolyPanel( wxPaintEvent& event )
if( jj >= m_currPoints.size() )
jj = 0;
GRLine( NULL, &dc, m_currPoints[ii] * scale, m_currPoints[jj] * scale, m_thickness.GetValue() * scale, color );
GRLine( nullptr, &dc, m_currPoints[ii] * scale, m_currPoints[jj] * scale,
m_thickness.GetValue() * scale, color );
}
event.Skip();
}
void DIALOG_PAD_PRIMITIVE_POLY_PROPS::onPolyPanelResize( wxSizeEvent& event )
{
m_panelPoly->Refresh();
event.Skip();
}
void DIALOG_PAD_PRIMITIVE_POLY_PROPS::onGridSelect( wxGridRangeSelectEvent& event )
{
m_panelPoly->Refresh();
}
void DIALOG_PAD_PRIMITIVE_POLY_PROPS::onCellChanging( wxGridEvent& event )
{
int row = event.GetRow();
@ -535,8 +549,6 @@ void DIALOG_PAD_PRIMITIVE_POLY_PROPS::onCellChanging( wxGridEvent& event )
}
// A dialog to apply geometry transforms to a shape or set of shapes
// (move, rotate around origin, scaling factor, duplication).
DIALOG_PAD_PRIMITIVES_TRANSFORM::DIALOG_PAD_PRIMITIVES_TRANSFORM( wxWindow* aParent,
PCB_BASE_FRAME* aFrame,
std::vector<std::shared_ptr<PCB_SHAPE>>& aList,
@ -597,8 +609,10 @@ void DIALOG_PAD_PRIMITIVES_TRANSFORM::Transform( std::vector<std::shared_ptr<PCB
{
std::shared_ptr<PCB_SHAPE> shape;
if( aList == NULL )
if( aList == nullptr )
{
shape = m_list[idx];
}
else
{
aList->emplace_back( std::make_shared<PCB_SHAPE>( *m_list[idx] ) );

View File

@ -3,8 +3,8 @@
*
* Copyright (C) 2019 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2013 Dick Hollenbeck, dick@softplc.com
* Copyright (C) 2008-2013 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2008-2013 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -66,6 +66,7 @@ static PAD_SHAPE code_shape[] =
PAD_SHAPE::CUSTOM // choice = PAD_SHAPE::CUSTOM_RECT_ANCHOR
};
// the ordered index of the pad shape wxChoice in dialog.
// keep it consistent with code_shape[] and dialog strings
enum CODE_CHOICE
@ -81,6 +82,7 @@ enum CODE_CHOICE
CHOICE_SHAPE_CUSTOM_RECT_ANCHOR
};
static PAD_ATTRIB code_type[] =
{
PAD_ATTRIB::PTH,
@ -91,13 +93,15 @@ static PAD_ATTRIB code_type[] =
// only on tech layers (usually only on paste layer
};
// Thse define have the same value as the m_PadType wxChoice GetSelected() return value
// These define have the same value as the m_PadType wxChoice GetSelected() return value
#define PTH_DLG_TYPE 0
#define SMD_DLG_TYPE 1
#define CONN_DLG_TYPE 2
#define NPTH_DLG_TYPE 3
#define APERTURE_DLG_TYPE 4
void PCB_BASE_FRAME::ShowPadPropertiesDialog( PAD* aPad )
{
DIALOG_PAD_PROPERTIES dlg( this, aPad );
@ -164,7 +168,7 @@ DIALOG_PAD_PROPERTIES::DIALOG_PAD_PROPERTIES( PCB_BASE_FRAME* aParent, PAD* aPad
m_nonCopperWarningIcon->SetBitmap( KiBitmap( BITMAPS::dialog_warning ) );
m_padMaster = m_parent->GetDesignSettings().m_Pad_Master.get();
m_dummyPad = new PAD( (FOOTPRINT*) NULL );
m_dummyPad = new PAD( (FOOTPRINT*) nullptr );
if( aPad )
{
@ -209,7 +213,9 @@ DIALOG_PAD_PROPERTIES::DIALOG_PAD_PROPERTIES( PCB_BASE_FRAME* aParent, PAD* aPad
m_sdbSizerOK->SetDefault();
m_canUpdate = true;
m_PadNetSelector->Connect( NET_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES::OnValuesChanged ), NULL, this );
m_PadNetSelector->Connect( NET_SELECTED,
wxCommandEventHandler( DIALOG_PAD_PROPERTIES::OnValuesChanged ),
nullptr, this );
// Now all widgets have the size fixed, call FinishDialogSettings
finishDialogSettings();
@ -221,14 +227,17 @@ DIALOG_PAD_PROPERTIES::DIALOG_PAD_PROPERTIES( PCB_BASE_FRAME* aParent, PAD* aPad
DIALOG_PAD_PROPERTIES::~DIALOG_PAD_PROPERTIES()
{
m_PadNetSelector->Disconnect( NET_SELECTED, wxCommandEventHandler( DIALOG_PAD_PROPERTIES::OnValuesChanged ), NULL, this );
m_PadNetSelector->Disconnect( NET_SELECTED,
wxCommandEventHandler( DIALOG_PAD_PROPERTIES::OnValuesChanged ),
nullptr, this );
delete m_dummyPad;
delete m_axisOrigin;
}
bool DIALOG_PAD_PROPERTIES::m_sketchPreview = false; // Stores the pad draw option during a session
// Store the pad draw option during a session.
bool DIALOG_PAD_PROPERTIES::m_sketchPreview = false;
void DIALOG_PAD_PROPERTIES::OnInitDialog( wxInitDialogEvent& event )
@ -308,6 +317,7 @@ void DIALOG_PAD_PROPERTIES::prepareCanvas()
// gives a non null grid size (0.001mm) because GAL layer does not like a 0 size grid:
double gridsize = 0.001 * IU_PER_MM;
view->GetGAL()->SetGridSize( VECTOR2D( gridsize, gridsize ) );
// And do not show the grid:
view->GetGAL()->SetGridVisibility( false );
view->Add( m_dummyPad );
@ -691,7 +701,8 @@ void DIALOG_PAD_PROPERTIES::displayPrimitivesList()
for( wxString& s : bs_info )
s.Empty();
bs_info[4] = _( "width" ) + wxS( " " )+ MessageTextFromValue( m_units, primitive->GetWidth() );
bs_info[4] = _( "width" ) + wxS( " " )+ MessageTextFromValue( m_units,
primitive->GetWidth() );
switch( primitive->GetShape() )
{
@ -710,7 +721,8 @@ void DIALOG_PAD_PROPERTIES::displayPrimitivesList()
case PCB_SHAPE_TYPE::ARC: // Arc with rounded ends
bs_info[0] = _( "Arc" );
bs_info[1] = _( "center" ) + wxS( " " )+ formatCoord( m_units, primitive->GetCenter() );
bs_info[2] = _( "start" ) + wxS( " " )+ formatCoord( m_units, primitive->GetArcStart() );
bs_info[2] = _( "start" ) + wxS( " " )+ formatCoord( m_units,
primitive->GetArcStart() );
bs_info[3] = _( "angle" ) + wxS( " " )+ FormatAngle( primitive->GetAngle() );
break;
@ -721,7 +733,8 @@ void DIALOG_PAD_PROPERTIES::displayPrimitivesList()
bs_info[0] = _( "circle" );
bs_info[1] = formatCoord( m_units, primitive->GetStart() );
bs_info[2] = _( "radius" ) + wxS( " " )+ MessageTextFromValue( m_units, primitive->GetRadius() );
bs_info[2] = _( "radius" ) + wxS( " " )+ MessageTextFromValue( m_units,
primitive->GetRadius() );
break;
case PCB_SHAPE_TYPE::POLYGON: // polygon
@ -747,6 +760,7 @@ void DIALOG_PAD_PROPERTIES::displayPrimitivesList()
m_listCtrlPrimitives->SetColumnWidth( ii, wxLIST_AUTOSIZE );
}
void DIALOG_PAD_PROPERTIES::OnResize( wxSizeEvent& event )
{
redraw();
@ -776,7 +790,6 @@ void DIALOG_PAD_PROPERTIES::onChangePadMode( wxCommandEvent& event )
}
void DIALOG_PAD_PROPERTIES::OnPadShapeSelection( wxCommandEvent& event )
{
switch( m_PadShapeSelector->GetSelection() )
@ -798,8 +811,9 @@ void DIALOG_PAD_PROPERTIES::OnPadShapeSelection( wxCommandEvent& event )
// A reasonable default (from IPC-7351C)
if( m_dummyPad->GetRoundRectRadiusRatio() == 0.0 )
m_tcCornerSizeRatio->ChangeValue( "25" );
}
break;
}
case CHOICE_SHAPE_CHAMFERED_RECT:
m_shapePropsBook->SetSelection( 3 );
@ -820,8 +834,8 @@ void DIALOG_PAD_PROPERTIES::OnPadShapeSelection( wxCommandEvent& event )
m_cbTopRight->SetValue( false );
m_cbBottomLeft->SetValue( false );
m_cbBottomRight->SetValue( false );
break;
}
break;
case CHOICE_SHAPE_CHAMFERED_ROUNDED_RECT:
m_shapePropsBook->SetSelection( 4 );
@ -1197,7 +1211,6 @@ void DIALOG_PAD_PROPERTIES::OnSetCopperLayers( wxCommandEvent& event )
}
// Called when select/deselect a layer.
void DIALOG_PAD_PROPERTIES::OnSetLayers( wxCommandEvent& event )
{
transferDataToPad( m_dummyPad );
@ -1205,7 +1218,6 @@ void DIALOG_PAD_PROPERTIES::OnSetLayers( wxCommandEvent& event )
}
// test if all values are acceptable for the pad
bool DIALOG_PAD_PROPERTIES::padValuesOK()
{
bool error = transferDataToPad( m_dummyPad );
@ -1292,7 +1304,7 @@ bool DIALOG_PAD_PROPERTIES::padValuesOK()
// Some pads need a positive solder paste clearance (mainly for BGA with small pads)
// However, a positive value can create issues if the resulting shape is too big.
// (like a solder paste creating a solder paste area on a neighbour pad or on the solder mask)
// (like a solder paste creating a solder paste area on a neighbor pad or on the solder mask)
// So we could ask for user to confirm the choice
// For now we just check for disappearing paste
wxSize paste_size;
@ -1541,6 +1553,7 @@ bool DIALOG_PAD_PROPERTIES::TransferDataFromWindow()
return false;
transferDataToPad( m_padMaster );
// m_padMaster is a pattern: ensure there is no net for this pad:
m_padMaster->SetNetCode( NETINFO_LIST::UNCONNECTED );
@ -2035,8 +2048,8 @@ void DIALOG_PAD_PROPERTIES::OnValuesChanged( wxCommandEvent& event )
if( m_canUpdate )
{
transferDataToPad( m_dummyPad );
// If the pad size has changed, update the displayed values
// for rounded rect pads
// If the pad size has changed, update the displayed values for rounded rect pads.
updateRoundRectCornerValues();
redraw();
@ -2093,20 +2106,18 @@ void DIALOG_PAD_PROPERTIES::OnPrimitiveSelection( wxListEvent& event )
}
/// Called on a double click on the basic shapes list
void DIALOG_PAD_PROPERTIES::onPrimitiveDClick( wxMouseEvent& event )
{
editPrimitive();
}
// Called on a click on basic shapes list panel button
void DIALOG_PAD_PROPERTIES::onEditPrimitive( wxCommandEvent& event )
{
editPrimitive();
}
// Called on a click on basic shapes list panel button
void DIALOG_PAD_PROPERTIES::onDeletePrimitive( wxCommandEvent& event )
{
long select = m_listCtrlPrimitives->GetFirstSelected();

View File

@ -280,7 +280,6 @@ void DIALOG_PRINT_PCBNEW::createLeftPanel()
sizerLeft->Add( copperLabel, 0, wxRIGHT, 5 );
sizerLeft->Add( m_listCopperLayers, 1, wxEXPAND | wxBOTTOM | wxRIGHT, 5 );
// Technical layer list
auto technicalLabel = new wxStaticText( sbLayersSizer->GetStaticBox(), wxID_ANY,
_( "Technical layers:" ) );
@ -290,22 +289,22 @@ void DIALOG_PRINT_PCBNEW::createLeftPanel()
sizerRight->Add( technicalLabel, 0, wxLEFT, 5 );
sizerRight->Add( m_listTechLayers, 1, wxEXPAND | wxBOTTOM | wxLEFT, 5 );
// Layer list layout
wxBoxSizer* bLayerListsSizer = new wxBoxSizer( wxHORIZONTAL );
bLayerListsSizer->Add( sizerLeft, 1, wxEXPAND, 5 );
bLayerListsSizer->Add( sizerRight, 1, wxEXPAND, 5 );
// Select/Unselect all buttons
m_buttonSelectAll = new wxButton( sbLayersSizer->GetStaticBox(), wxID_ANY, _( "Select all" ) );
m_buttonDeselectAll = new wxButton( sbLayersSizer->GetStaticBox(), wxID_ANY,
_( "Deselect all" ) );
m_buttonSelectAll->Connect( wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler( DIALOG_PRINT_PCBNEW::onSelectAllClick ), NULL, this );
wxCommandEventHandler( DIALOG_PRINT_PCBNEW::onSelectAllClick ),
nullptr, this );
m_buttonDeselectAll->Connect( wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler( DIALOG_PRINT_PCBNEW::onDeselectAllClick ), NULL, this );
wxCommandEventHandler( DIALOG_PRINT_PCBNEW::onDeselectAllClick ),
nullptr, this );
wxBoxSizer* buttonSizer = new wxBoxSizer( wxHORIZONTAL );
buttonSizer->Add( m_buttonSelectAll, 1, wxRIGHT | wxTOP | wxBOTTOM, 5 );

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2014 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2014 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 1992-2019 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -36,6 +36,7 @@
#define LAYER_LIST_COLUMN_NAME 2
#define LAYER_LIST_ROW_ALL_INNER_LAYERS 1
class DIALOG_RULE_AREA_PROPERTIES : public DIALOG_RULE_AREA_PROPERTIES_BASE
{
public:
@ -150,15 +151,21 @@ bool DIALOG_RULE_AREA_PROPERTIES::TransferDataFromWindow()
if( m_zonesettings.m_Layers.count() == 0 )
{
DisplayError( NULL, _( "No layers selected." ) );
DisplayError( this, _( "No layers selected." ) );
return false;
}
switch( m_OutlineDisplayCtrl->GetSelection() )
{
case 0: m_zonesettings.m_ZoneBorderDisplayStyle = ZONE_BORDER_DISPLAY_STYLE::NO_HATCH; break;
case 1: m_zonesettings.m_ZoneBorderDisplayStyle = ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE; break;
case 2: m_zonesettings.m_ZoneBorderDisplayStyle = ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_FULL; break;
case 0:
m_zonesettings.m_ZoneBorderDisplayStyle = ZONE_BORDER_DISPLAY_STYLE::NO_HATCH;
break;
case 1:
m_zonesettings.m_ZoneBorderDisplayStyle = ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE;
break;
case 2:
m_zonesettings.m_ZoneBorderDisplayStyle = ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_FULL;
break;
}
auto cfg = m_parent->GetPcbNewSettings();

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004-2018 Jean-Pierre Charras jp.charras at wanadoo.fr
* Copyright (C) 2010-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2010-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -38,6 +38,7 @@
#include <math/util.h> // for KiROUND
#include <scintilla_tricks.h>
DIALOG_TEXT_PROPERTIES::DIALOG_TEXT_PROPERTIES( PCB_BASE_EDIT_FRAME* aParent, BOARD_ITEM* aItem ) :
DIALOG_TEXT_PROPERTIES_BASE( aParent ),
m_Parent( aParent ),
@ -158,7 +159,8 @@ DIALOG_TEXT_PROPERTIES::DIALOG_TEXT_PROPERTIES( PCB_BASE_EDIT_FRAME* aParent, BO
// wxTextCtrls fail to generate wxEVT_CHAR events when the wxTE_MULTILINE flag is set,
// so we have to listen to wxEVT_CHAR_HOOK events instead.
Connect( wxEVT_CHAR_HOOK, wxKeyEventHandler( DIALOG_TEXT_PROPERTIES::OnCharHook ), NULL, this );
Connect( wxEVT_CHAR_HOOK, wxKeyEventHandler( DIALOG_TEXT_PROPERTIES::OnCharHook ),
nullptr, this );
finishDialogSettings();
}
@ -166,13 +168,13 @@ DIALOG_TEXT_PROPERTIES::DIALOG_TEXT_PROPERTIES( PCB_BASE_EDIT_FRAME* aParent, BO
DIALOG_TEXT_PROPERTIES::~DIALOG_TEXT_PROPERTIES()
{
Disconnect( wxEVT_CHAR_HOOK, wxKeyEventHandler( DIALOG_TEXT_PROPERTIES::OnCharHook ), NULL, this );
Disconnect( wxEVT_CHAR_HOOK, wxKeyEventHandler( DIALOG_TEXT_PROPERTIES::OnCharHook ),
nullptr, this );
delete m_scintillaTricks;
}
// Launch the text properties dialog in quasi modal mode.
void PCB_BASE_EDIT_FRAME::ShowTextPropertiesDialog( BOARD_ITEM* aText )
{
DIALOG_TEXT_PROPERTIES dlg( this, aText );

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2020 KiCad Developers, see change_log.txt for contributors.
* Copyright (C) 2020-2021 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -57,19 +57,14 @@ void DRC_RULES_PARSER::reportError( const wxString& aMessage )
if( m_reporter )
{
wxString msg = wxString::Format( _( "ERROR: <a href='%d:%d'>%s</a>%s" ),
CurLineNumber(),
CurOffset(),
first,
rest );
wxString msg = wxString::Format( _( "ERROR: <a href='%d:%d'>%s</a>%s" ), CurLineNumber(),
CurOffset(), first, rest );
m_reporter->Report( msg, RPT_SEVERITY_ERROR );
}
else
{
wxString msg = wxString::Format( _( "ERROR: %s%s" ),
first,
rest );
wxString msg = wxString::Format( _( "ERROR: %s%s" ), first, rest );
THROW_PARSE_ERROR( msg, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
}
@ -128,7 +123,7 @@ void DRC_RULES_PARSER::Parse( std::vector<DRC_RULE*>& aRules, REPORTER* aReporte
if( (int) token == DSN_NUMBER )
{
m_requiredVersion = (int)strtol( CurText(), NULL, 10 );
m_requiredVersion = (int)strtol( CurText(), nullptr, 10 );
m_tooRecent = ( m_requiredVersion > DRC_RULE_FILE_VERSION );
token = NextTok();
}
@ -158,8 +153,7 @@ void DRC_RULES_PARSER::Parse( std::vector<DRC_RULE*>& aRules, REPORTER* aReporte
break;
default:
msg.Printf( _( "Unrecognized item '%s'.| Expected %s." ),
FromUTF8(),
msg.Printf( _( "Unrecognized item '%s'.| Expected %s." ), FromUTF8(),
"'rule', 'version'" );
reportError( msg );
parseUnknown();
@ -220,8 +214,7 @@ DRC_RULE* DRC_RULES_PARSER::parseDRC_RULE()
if( (int) NextTok() != DSN_RIGHT )
{
reportError( wxString::Format( _( "Unrecognized item '%s'." ),
FromUTF8() ) );
reportError( wxString::Format( _( "Unrecognized item '%s'." ), FromUTF8() ) );
parseUnknown();
}
@ -237,8 +230,7 @@ DRC_RULE* DRC_RULES_PARSER::parseDRC_RULE()
return rule;
default:
msg.Printf( _( "Unrecognized item '%s'.| Expected %s." ),
FromUTF8(),
msg.Printf( _( "Unrecognized item '%s'.| Expected %s." ), FromUTF8(),
"'constraint', 'condition', 'disallow'" );
reportError( msg );
parseUnknown();
@ -264,10 +256,10 @@ void DRC_RULES_PARSER::parseConstraint( DRC_RULE* aRule )
if( (int) token == DSN_RIGHT || token == T_EOF )
{
msg.Printf( _( "Missing constraint type.| Expected %s." ),
"'clearance', 'hole_clearance', 'edge_clearance', 'hole', 'hole_to_hole', "
"'courtyard_clearance', 'silk_clearance', 'track_width', 'annular_width', "
"'disallow', 'length', 'skew', 'via_count', 'diff_pair_gap' or "
"'diff_pair_uncoupled'" );
"'clearance', 'hole_clearance', 'edge_clearance', 'hole', 'hole_to_hole', "
"'courtyard_clearance', 'silk_clearance', 'track_width', 'annular_width', "
"'disallow', 'length', 'skew', 'via_count', 'diff_pair_gap' or "
"'diff_pair_uncoupled'" );
reportError( msg );
return;
}
@ -290,8 +282,7 @@ void DRC_RULES_PARSER::parseConstraint( DRC_RULE* aRule )
case T_diff_pair_gap: constraint.m_Type = DIFF_PAIR_GAP_CONSTRAINT; break;
case T_diff_pair_uncoupled: constraint.m_Type = DIFF_PAIR_MAX_UNCOUPLED_CONSTRAINT; break;
default:
msg.Printf( _( "Unrecognized item '%s'.| Expected %s." ),
FromUTF8(),
msg.Printf( _( "Unrecognized item '%s'.| Expected %s." ), FromUTF8(),
"'clearance', 'hole_clearance', 'edge_clearance', 'hole', hole_to_hole',"
"'courtyard_clearance', 'silk_clearance', 'track_width', 'annular_width', "
"'disallow', 'length', 'skew', 'diff_pair_gap' or 'diff_pair_uncoupled'." );
@ -323,8 +314,7 @@ void DRC_RULES_PARSER::parseConstraint( DRC_RULE* aRule )
return;
default:
msg.Printf( _( "Unrecognized item '%s'.| Expected %s." ),
FromUTF8(),
msg.Printf( _( "Unrecognized item '%s'.| Expected %s." ), FromUTF8(),
"'track', 'via', 'micro_via', 'buried_via', 'pad', 'zone', 'text', "
"'graphic', 'hole' or 'footprint'." );
reportError( msg );
@ -441,18 +431,13 @@ void DRC_RULES_PARSER::parseValueWithUnits( const wxString& aExpr, int& aResult
if( m_reporter )
{
wxString msg = wxString::Format( _( "ERROR: <a href='%d:%d'>%s</a>%s" ),
CurLineNumber(),
CurOffset() + aOffset,
first,
rest );
CurLineNumber(), CurOffset() + aOffset, first, rest );
m_reporter->Report( msg, RPT_SEVERITY_ERROR );
}
else
{
wxString msg = wxString::Format( _( "ERROR: %s%s" ),
first,
rest );
wxString msg = wxString::Format( _( "ERROR: %s%s" ), first, rest );
THROW_PARSE_ERROR( msg, CurSource(), CurLine(), CurLineNumber(),
CurOffset() + aOffset );
@ -508,8 +493,7 @@ LSET DRC_RULES_PARSER::parseLayer()
if( (int) NextTok() != DSN_RIGHT )
{
reportError( wxString::Format( _( "Unrecognized item '%s'." ),
FromUTF8() ) );
reportError( wxString::Format( _( "Unrecognized item '%s'." ), FromUTF8() ) );
parseUnknown();
}

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2018 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -37,7 +37,7 @@ bool RecreateCmpFile( BOARD * aBrd, const wxString& aFullCmpFileName )
{
FILE* cmpFile = wxFopen( aFullCmpFileName, wxT( "wt" ) );
if( cmpFile == NULL )
if( cmpFile == nullptr )
return false;
fprintf( cmpFile, "Cmp-Mod V01 Created by PcbNew date = %s\n", TO_UTF8( DateAndTime() ) );

View File

@ -6,6 +6,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 Cirilo Bernardo
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -48,16 +49,17 @@
#endif
#include <convert_to_biu.h> // to define Millimeter2iu(x)
// assumed default graphical line thickness: == 0.1mm
#define LINE_WIDTH (Millimeter2iu( 0.1 ))
static FILENAME_RESOLVER* resolver;
/**
* Function idf_export_outline
* retrieves line segment information from the edge layer and compiles
* the data into a form which can be output as an IDFv3 compliant
* BOARD_OUTLINE section.
* Retrieve line segment information from the edge layer and compiles the data into a form
* which can be output as an IDFv3 compliant #BOARD_OUTLINE section.
*/
static void idf_export_outline( BOARD* aPcb, IDF3_BOARD& aIDFBoard )
{
@ -67,7 +69,7 @@ static void idf_export_outline( BOARD* aPcb, IDF3_BOARD& aIDFBoard )
IDF_POINT sp, ep; // start and end points from KiCad item
std::list< IDF_SEGMENT* > lines; // IDF intermediate form of KiCad graphical item
IDF_OUTLINE* outline = NULL; // graphical items forming an outline or cutout
IDF_OUTLINE* outline = nullptr; // graphical items forming an outline or cutout
// NOTE: IMPLEMENTATION
// If/when component cutouts are allowed, we must implement them separately. Cutouts
@ -88,86 +90,90 @@ static void idf_export_outline( BOARD* aPcb, IDF3_BOARD& aIDFBoard )
switch( graphic->GetShape() )
{
case PCB_SHAPE_TYPE::SEGMENT:
{
if( ( graphic->GetStart().x == graphic->GetEnd().x )
&& ( graphic->GetStart().y == graphic->GetEnd().y ) )
{
if( ( graphic->GetStart().x == graphic->GetEnd().x )
&& ( graphic->GetStart().y == graphic->GetEnd().y ) )
{
break;
}
sp.x = graphic->GetStart().x * scale + offX;
sp.y = -graphic->GetStart().y * scale + offY;
ep.x = graphic->GetEnd().x * scale + offX;
ep.y = -graphic->GetEnd().y * scale + offY;
IDF_SEGMENT* seg = new IDF_SEGMENT( sp, ep );
if( seg )
lines.push_back( seg );
break;
}
sp.x = graphic->GetStart().x * scale + offX;
sp.y = -graphic->GetStart().y * scale + offY;
ep.x = graphic->GetEnd().x * scale + offX;
ep.y = -graphic->GetEnd().y * scale + offY;
IDF_SEGMENT* seg = new IDF_SEGMENT( sp, ep );
if( seg )
lines.push_back( seg );
break;
}
case PCB_SHAPE_TYPE::RECT:
{
if( ( graphic->GetStart().x == graphic->GetEnd().x )
&& ( graphic->GetStart().y == graphic->GetEnd().y ) )
{
if( ( graphic->GetStart().x == graphic->GetEnd().x )
&& ( graphic->GetStart().y == graphic->GetEnd().y ) )
{
break;
}
double top = graphic->GetStart().y * scale + offY;
double left = graphic->GetStart().x * scale + offX;
double bottom = graphic->GetEnd().y * scale + offY;
double right = graphic->GetEnd().x * scale + offX;
IDF_POINT corners[4];
corners[0] = IDF_POINT( left, top );
corners[1] = IDF_POINT( right, top );
corners[2] = IDF_POINT( right, bottom );
corners[3] = IDF_POINT( left, bottom );
lines.push_back( new IDF_SEGMENT( corners[0], corners[1] ) );
lines.push_back( new IDF_SEGMENT( corners[1], corners[2] ) );
lines.push_back( new IDF_SEGMENT( corners[2], corners[3] ) );
lines.push_back( new IDF_SEGMENT( corners[3], corners[0] ) );
break;
}
double top = graphic->GetStart().y * scale + offY;
double left = graphic->GetStart().x * scale + offX;
double bottom = graphic->GetEnd().y * scale + offY;
double right = graphic->GetEnd().x * scale + offX;
IDF_POINT corners[4];
corners[0] = IDF_POINT( left, top );
corners[1] = IDF_POINT( right, top );
corners[2] = IDF_POINT( right, bottom );
corners[3] = IDF_POINT( left, bottom );
lines.push_back( new IDF_SEGMENT( corners[0], corners[1] ) );
lines.push_back( new IDF_SEGMENT( corners[1], corners[2] ) );
lines.push_back( new IDF_SEGMENT( corners[2], corners[3] ) );
lines.push_back( new IDF_SEGMENT( corners[3], corners[0] ) );
break;
}
case PCB_SHAPE_TYPE::ARC:
{
if( ( graphic->GetCenter().x == graphic->GetArcStart().x )
&& ( graphic->GetCenter().y == graphic->GetArcStart().y ) )
{
if( ( graphic->GetCenter().x == graphic->GetArcStart().x )
&& ( graphic->GetCenter().y == graphic->GetArcStart().y ) )
{
break;
}
sp.x = graphic->GetCenter().x * scale + offX;
sp.y = -graphic->GetCenter().y * scale + offY;
ep.x = graphic->GetArcStart().x * scale + offX;
ep.y = -graphic->GetArcStart().y * scale + offY;
IDF_SEGMENT* seg = new IDF_SEGMENT( sp, ep, -graphic->GetAngle() / 10.0, true );
if( seg )
lines.push_back( seg );
break;
}
sp.x = graphic->GetCenter().x * scale + offX;
sp.y = -graphic->GetCenter().y * scale + offY;
ep.x = graphic->GetArcStart().x * scale + offX;
ep.y = -graphic->GetArcStart().y * scale + offY;
IDF_SEGMENT* seg = new IDF_SEGMENT( sp, ep, -graphic->GetAngle() / 10.0, true );
if( seg )
lines.push_back( seg );
break;
}
case PCB_SHAPE_TYPE::CIRCLE:
{
if( graphic->GetRadius() == 0 )
break;
{
if( graphic->GetRadius() == 0 )
break;
sp.x = graphic->GetCenter().x * scale + offX;
sp.y = -graphic->GetCenter().y * scale + offY;
ep.x = sp.x - graphic->GetRadius() * scale;
ep.y = sp.y;
// Circles must always have an angle of +360 deg. to appease
// quirky MCAD implementations of IDF.
IDF_SEGMENT* seg = new IDF_SEGMENT( sp, ep, 360.0, true );
sp.x = graphic->GetCenter().x * scale + offX;
sp.y = -graphic->GetCenter().y * scale + offY;
ep.x = sp.x - graphic->GetRadius() * scale;
ep.y = sp.y;
// Circles must always have an angle of +360 deg. to appease
// quirky MCAD implementations of IDF.
IDF_SEGMENT* seg = new IDF_SEGMENT( sp, ep, 360.0, true );
if( seg )
lines.push_back( seg );
if( seg )
lines.push_back( seg );
}
break;
}
default:
break;
@ -191,7 +197,7 @@ static void idf_export_outline( BOARD* aPcb, IDF3_BOARD& aIDFBoard )
goto UseBoundingBox;
aIDFBoard.AddBoardOutline( outline );
outline = NULL;
outline = nullptr;
// get all cutouts and write them out
while( !lines.empty() )
@ -208,7 +214,7 @@ static void idf_export_outline( BOARD* aPcb, IDF3_BOARD& aIDFBoard )
}
aIDFBoard.AddBoardOutline( outline );
outline = NULL;
outline = nullptr;
}
return;
@ -275,11 +281,9 @@ UseBoundingBox:
/**
* Function idf_export_footprint
* retrieves information from all board footprints, adds drill holes to
* the DRILLED_HOLES or BOARD_OUTLINE section as appropriate,
* compiles data for the PLACEMENT section and compiles data for
* the library ELECTRICAL section.
* Retrieve information from all board footprints, adds drill holes to the DRILLED_HOLES or
* BOARD_OUTLINE section as appropriate, Compiles data for the PLACEMENT section and compiles
* data for the library ELECTRICAL section.
*/
static void idf_export_footprint( BOARD* aPcb, FOOTPRINT* aFootprint, IDF3_BOARD& aIDFBoard )
{
@ -407,7 +411,7 @@ static void idf_export_footprint( BOARD* aPcb, FOOTPRINT* aFootprint, IDF3_BOARD
// add any valid models to the library item list
std::string refdes;
IDF3_COMPONENT* comp = NULL;
IDF3_COMPONENT* comp = nullptr;
auto sM = aFootprint->Models().begin();
auto eM = aFootprint->Models().end();
@ -474,14 +478,14 @@ static void idf_export_footprint( BOARD* aPcb, FOOTPRINT* aFootprint, IDF3_BOARD
while( rotz <= -360.0 ) rotz += 360.0;
}
if( comp == NULL )
if( comp == nullptr )
comp = aIDFBoard.FindComponent( refdes );
if( comp == NULL )
if( comp == nullptr )
{
comp = new IDF3_COMPONENT( &aIDFBoard );
if( comp == NULL )
if( comp == nullptr )
throw( std::runtime_error( aIDFBoard.GetError() ) );
comp->SetRefDes( refdes );
@ -570,7 +574,6 @@ static void idf_export_footprint( BOARD* aPcb, FOOTPRINT* aFootprint, IDF3_BOARD
}
}
// create the local data ...
IDF3_COMP_OUTLINE_DATA* data = new IDF3_COMP_OUTLINE_DATA( comp, outline );
@ -582,9 +585,8 @@ static void idf_export_footprint( BOARD* aPcb, FOOTPRINT* aFootprint, IDF3_BOARD
/**
* Function Export_IDF3
* generates IDFv3 compliant board (*.emn) and library (*.emp)
* files representing the user's PCB design.
* Generate IDFv3 compliant board (*.emn) and library (*.emp) files representing the user's
* PCB design.
*/
bool PCB_EDIT_FRAME::Export_IDF3( BOARD* aPcb, const wxString& aFullFileName,
bool aUseThou, double aXRef, double aYRef )

View File

@ -56,7 +56,7 @@
EXPORTER_PCB_VRML::EXPORTER_PCB_VRML() :
m_OutputPCB( (SGNODE*) NULL )
m_OutputPCB( nullptr )
{
m_ReuseDef = true;
m_precision = 6;
@ -101,10 +101,10 @@ EXPORTER_PCB_VRML::~EXPORTER_PCB_VRML()
// destroy any unassociated material appearances
for( int j = 0; j < VRML_COLOR_LAST; ++j )
{
if( m_sgmaterial[j] && NULL == S3D::GetSGNodeParent( m_sgmaterial[j] ) )
if( m_sgmaterial[j] && nullptr == S3D::GetSGNodeParent( m_sgmaterial[j] ) )
S3D::DestroyNode( m_sgmaterial[j] );
m_sgmaterial[j] = NULL;
m_sgmaterial[j] = nullptr;
}
if( !m_components.empty() )
@ -114,7 +114,7 @@ EXPORTER_PCB_VRML::~EXPORTER_PCB_VRML()
for( auto i : m_components )
{
tmp.Attach( i );
tmp.SetParent( NULL );
tmp.SetParent( nullptr );
}
m_components.clear();
@ -176,6 +176,7 @@ bool EXPORTER_PCB_VRML::GetLayer3D( LAYER_NUM layer, VRML_LAYER** vlayer )
void EXPORTER_PCB_VRML::ExportVrmlSolderMask()
{
SHAPE_POLY_SET holes, outlines = m_pcbOutlines;
// holes is the solder mask opening.
// the actual shape is the negative shape of mask opening.
PCB_LAYER_ID pcb_layer = F_Mask;
@ -198,7 +199,6 @@ void EXPORTER_PCB_VRML::ExportVrmlSolderMask()
}
// Build and export the 4 layers F_Cu, B_Cu, F_silk, B_Silk
void EXPORTER_PCB_VRML::ExportStandardLayers()
{
SHAPE_POLY_SET outlines;
@ -227,16 +227,15 @@ void EXPORTER_PCB_VRML::ExportStandardLayers()
}
}
// static var. for dealing with text
static EXPORTER_PCB_VRML* model_vrml;
void EXPORTER_PCB_VRML::write_triangle_bag( std::ostream& aOut_file, const VRML_COLOR& aColor,
VRML_LAYER* aLayer, bool aPlane, bool aTop,
double aTop_z, double aBottom_z )
VRML_LAYER* aLayer, bool aPlane, bool aTop,
double aTop_z, double aBottom_z )
{
/* A lot of nodes are not required, but blender sometimes chokes
* without them */
// A lot of nodes are not required, but blender sometimes chokes without them.
static const char* shape_boiler[] =
{
"Transform {\n",
@ -273,7 +272,9 @@ void EXPORTER_PCB_VRML::write_triangle_bag( std::ostream& aOut_file, const VRML_
while( marker_found < 4 )
{
if( shape_boiler[lineno] )
{
aOut_file << shape_boiler[lineno];
}
else
{
marker_found++;
@ -335,8 +336,7 @@ void EXPORTER_PCB_VRML::write_triangle_bag( std::ostream& aOut_file, const VRML_
}
void EXPORTER_PCB_VRML::writeLayers( const char* aFileName,
OSTREAM* aOutputFile )
void EXPORTER_PCB_VRML::writeLayers( const char* aFileName, OSTREAM* aOutputFile )
{
// VRML_LAYER board;
m_3D_board.Tesselate( &m_holes );
@ -374,13 +374,15 @@ void EXPORTER_PCB_VRML::writeLayers( const char* aFileName,
{
write_triangle_bag( *aOutputFile, GetColor( VRML_COLOR_PASTE ),
&m_top_paste, true, true,
GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * m_BoardToVrmlScale,
GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) *
m_BoardToVrmlScale,
0 );
}
else
{
create_vrml_plane( m_OutputPCB, VRML_COLOR_PASTE, &m_top_paste,
GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * m_BoardToVrmlScale,
GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) *
m_BoardToVrmlScale,
true );
}
@ -391,13 +393,15 @@ void EXPORTER_PCB_VRML::writeLayers( const char* aFileName,
{
write_triangle_bag( *aOutputFile, GetColor( VRML_COLOR_SOLDMASK ),
&m_top_soldermask, true, true,
GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * m_BoardToVrmlScale,
GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) *
m_BoardToVrmlScale,
0 );
}
else
{
create_vrml_plane( m_OutputPCB, VRML_COLOR_SOLDMASK, &m_top_soldermask,
GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * m_BoardToVrmlScale,
GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) *
m_BoardToVrmlScale,
true );
}
@ -429,7 +433,8 @@ void EXPORTER_PCB_VRML::writeLayers( const char* aFileName,
else
{
create_vrml_plane( m_OutputPCB, VRML_COLOR_PASTE, &m_bot_paste,
GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) * m_BoardToVrmlScale,
GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) *
m_BoardToVrmlScale,
false );
}
@ -440,31 +445,37 @@ void EXPORTER_PCB_VRML::writeLayers( const char* aFileName,
{
write_triangle_bag( *aOutputFile, GetColor( VRML_COLOR_SOLDMASK ),
&m_bot_soldermask, true, false,
GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) * m_BoardToVrmlScale,
GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) *
m_BoardToVrmlScale,
0 );
}
else
{
create_vrml_plane( m_OutputPCB, VRML_COLOR_SOLDMASK, &m_bot_soldermask,
GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) * m_BoardToVrmlScale,
GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) *
m_BoardToVrmlScale,
false );
}
// VRML_LAYER PTH;
m_plated_holes.Tesselate( NULL, true );
m_plated_holes.Tesselate( nullptr, true );
if( m_UseInlineModelsInBrdfile )
{
write_triangle_bag( *aOutputFile, GetColor( VRML_COLOR_PASTE ),
&m_plated_holes, false, false,
GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * m_BoardToVrmlScale,
GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) * m_BoardToVrmlScale );
GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) *
m_BoardToVrmlScale,
GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) *
m_BoardToVrmlScale );
}
else
{
create_vrml_shell( m_OutputPCB, VRML_COLOR_PASTE, &m_plated_holes,
GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * m_BoardToVrmlScale,
GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) * m_BoardToVrmlScale );
GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) *
m_BoardToVrmlScale,
GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) *
m_BoardToVrmlScale );
}
// VRML_LAYER m_top_silk;
@ -559,7 +570,6 @@ void EXPORTER_PCB_VRML::ExportVrmlPolygonSet( VRML_LAYER* aVlayer, const SHAPE_P
}
// board edges and cutouts
void EXPORTER_PCB_VRML::ExportVrmlBoard()
{
if( !m_Pcb->GetBoardPolygonOutlines( m_pcbOutlines ) )
@ -578,7 +588,7 @@ void EXPORTER_PCB_VRML::ExportVrmlBoard()
for( int j = 0; j < outline.PointCount(); j++ )
{
m_3D_board.AddVertex( seg, (double)outline.CPoint(j).x * m_BoardToVrmlScale,
-((double)outline.CPoint(j).y * m_BoardToVrmlScale ) );
-((double)outline.CPoint(j).y * m_BoardToVrmlScale ) );
}
@ -600,7 +610,7 @@ void EXPORTER_PCB_VRML::ExportVrmlBoard()
for( int j = 0; j < hole.PointCount(); j++ )
{
m_holes.AddVertex( seg, (double) hole.CPoint(j).x * m_BoardToVrmlScale,
-( (double) hole.CPoint(j).y * m_BoardToVrmlScale ) );
-( (double) hole.CPoint(j).y * m_BoardToVrmlScale ) );
}
m_holes.EnsureWinding( seg, true );
@ -608,9 +618,10 @@ void EXPORTER_PCB_VRML::ExportVrmlBoard()
}
}
// Max error allowed to approximate a circle by segments, in mm
static const double err_approx_max = 0.005;
void EXPORTER_PCB_VRML::ExportVrmlViaHoles()
{
PCB_LAYER_ID top_layer, bottom_layer;
@ -784,7 +795,7 @@ void EXPORTER_PCB_VRML::ExportVrmlFootprint( FOOTPRINT* aFootprint, std::ostream
{
SGNODE* mod3d = (SGNODE*) m_Cache3Dmodels->Load( sM->m_Filename );
if( NULL == mod3d )
if( nullptr == mod3d )
{
++sM;
continue;
@ -830,8 +841,8 @@ void EXPORTER_PCB_VRML::ExportVrmlFootprint( FOOTPRINT* aFootprint, std::ostream
if( isFlipped )
offsetz = -offsetz;
else // In normal mode, Y axis is reversed in Pcbnew.
offsety = -offsety;
else
offsety = -offsety; // In normal mode, Y axis is reversed in Pcbnew.
RotatePoint( &offsetx, &offsety, aFootprint->GetOrientation() );
@ -923,7 +934,7 @@ void EXPORTER_PCB_VRML::ExportVrmlFootprint( FOOTPRINT* aFootprint, std::ostream
modelShape->SetTranslation( trans );
modelShape->SetScale( SGPOINT( sM->m_Scale.x, sM->m_Scale.y, sM->m_Scale.z ) );
if( NULL == S3D::GetSGNodeParent( mod3d ) )
if( nullptr == S3D::GetSGNodeParent( mod3d ) )
{
m_components.push_back( mod3d );
modelShape->AddChildNode( mod3d );
@ -1003,10 +1014,10 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString& aFullFileName, double aMMt
{
// merge footprints in the .vrml board file
for( FOOTPRINT* footprint : pcb->Footprints() )
model3d.ExportVrmlFootprint( footprint, NULL );
model3d.ExportVrmlFootprint( footprint, nullptr );
// write out the board and all layers
model3d.writeLayers( TO_UTF8( aFullFileName ), NULL );
model3d.writeLayers( TO_UTF8( aFullFileName ), nullptr );
}
}
catch( const std::exception& e )
@ -1075,12 +1086,12 @@ SGNODE* EXPORTER_PCB_VRML::getSGColor( VRML_COLOR_INDEX colorIdx )
if( colorIdx == -1 )
colorIdx = VRML_COLOR_PCB;
else if( colorIdx == VRML_COLOR_LAST )
return NULL;
return nullptr;
if( m_sgmaterial[colorIdx] )
return m_sgmaterial[colorIdx];
IFSG_APPEARANCE vcolor( (SGNODE*) NULL );
IFSG_APPEARANCE vcolor( (SGNODE*) nullptr );
VRML_COLOR* cp = &vrml_colors_list[colorIdx];
vcolor.SetSpecular( cp->spec_red, cp->spec_grn, cp->spec_blu );
@ -1098,7 +1109,7 @@ SGNODE* EXPORTER_PCB_VRML::getSGColor( VRML_COLOR_INDEX colorIdx )
void EXPORTER_PCB_VRML::create_vrml_plane( IFSG_TRANSFORM& PcbOutput, VRML_COLOR_INDEX colorID,
VRML_LAYER* layer, double top_z, bool aTopPlane )
VRML_LAYER* layer, double top_z, bool aTopPlane )
{
std::vector< double > vertices;
std::vector< int > idxPlane;
@ -1110,7 +1121,8 @@ void EXPORTER_PCB_VRML::create_vrml_plane( IFSG_TRANSFORM& PcbOutput, VRML_COLOR
if( ( idxPlane.size() % 3 ) )
{
throw( std::runtime_error( "[BUG] index lists are not a multiple of 3 (not a triangle list)" ) );
throw( std::runtime_error( "[BUG] index lists are not a multiple of 3 (not a triangle "
"list)" ) );
}
std::vector< SGPOINT > vlist;
@ -1122,7 +1134,7 @@ void EXPORTER_PCB_VRML::create_vrml_plane( IFSG_TRANSFORM& PcbOutput, VRML_COLOR
// create the intermediate scenegraph
IFSG_TRANSFORM tx0( PcbOutput.GetRawPtr() ); // tx0 = Transform for this outline
IFSG_SHAPE shape( tx0 ); // shape will hold (a) all vertices and (b) a local list of normals
IFSG_SHAPE shape( tx0 ); // shape will hold (a) all vertices and (b) a local list of normals
IFSG_FACESET face( shape ); // this face shall represent the top and bottom planes
IFSG_COORDS cp( face ); // coordinates for all faces
cp.SetCoordsList( nvert, &vlist[0] );
@ -1145,9 +1157,9 @@ void EXPORTER_PCB_VRML::create_vrml_plane( IFSG_TRANSFORM& PcbOutput, VRML_COLOR
// assign a color from the palette
SGNODE* modelColor = getSGColor( colorID );
if( NULL != modelColor )
if( nullptr != modelColor )
{
if( NULL == S3D::GetSGNodeParent( modelColor ) )
if( nullptr == S3D::GetSGNodeParent( modelColor ) )
shape.AddChildNode( modelColor );
else
shape.AddRefNode( modelColor );
@ -1156,7 +1168,7 @@ void EXPORTER_PCB_VRML::create_vrml_plane( IFSG_TRANSFORM& PcbOutput, VRML_COLOR
void EXPORTER_PCB_VRML::create_vrml_shell( IFSG_TRANSFORM& PcbOutput, VRML_COLOR_INDEX colorID,
VRML_LAYER* layer, double top_z, double bottom_z )
VRML_LAYER* layer, double top_z, double bottom_z )
{
std::vector< double > vertices;
std::vector< int > idxPlane;
@ -1190,7 +1202,7 @@ void EXPORTER_PCB_VRML::create_vrml_shell( IFSG_TRANSFORM& PcbOutput, VRML_COLOR
// create the intermediate scenegraph
IFSG_TRANSFORM tx0( PcbOutput.GetRawPtr() ); // tx0 = Transform for this outline
IFSG_SHAPE shape( tx0 ); // shape will hold (a) all vertices and (b) a local list of normals
IFSG_SHAPE shape( tx0 ); // shape will hold (a) all vertices and (b) a local list of normals
IFSG_FACESET face( shape ); // this face shall represent the top and bottom planes
IFSG_COORDS cp( face ); // coordinates for all faces
cp.SetCoordsList( nvert, &vlist[0] );
@ -1212,9 +1224,9 @@ void EXPORTER_PCB_VRML::create_vrml_shell( IFSG_TRANSFORM& PcbOutput, VRML_COLOR
// assign a color from the palette
SGNODE* modelColor = getSGColor( colorID );
if( NULL != modelColor )
if( nullptr != modelColor )
{
if( NULL == S3D::GetSGNodeParent( modelColor ) )
if( nullptr == S3D::GetSGNodeParent( modelColor ) )
shape.AddChildNode( modelColor );
else
shape.AddRefNode( modelColor );

View File

@ -7,7 +7,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2017 Jean_Pierre Charras <jp.charras at wanadoo.fr>
* Copyright (C) 1992-2017 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -44,6 +44,7 @@
#include <gendrill_file_writer_base.h>
#include <pcb_painter.h>
/* Conversion utilities - these will be used often in there... */
inline double diameter_in_inches( double ius )
{
@ -72,7 +73,7 @@ bool GENDRILL_WRITER_BASE::genDrillMapFile( const wxString& aFullFileName, PLOT_
double scale = 1.0;
wxPoint offset = GetOffset();
PLOTTER* plotter = NULL;
PLOTTER* plotter = nullptr;
PAGE_INFO dummy( PAGE_INFO::A4, false );
int bottom_limit = 0; // Y coord limit of page. 0 mean do not use
@ -157,8 +158,8 @@ bool GENDRILL_WRITER_BASE::genDrillMapFile( const wxString& aFullFileName, PLOT_
plotter->SetPageSettings( pageA4 );
plotter->SetViewport( offset, IU_PER_MILS / 10, scale, false );
break;
}
break;
case PLOT_FORMAT::DXF:
{
@ -172,8 +173,8 @@ bool GENDRILL_WRITER_BASE::genDrillMapFile( const wxString& aFullFileName, PLOT_
plotter = dxf_plotter;
plotter->SetPageSettings( page_info );
plotter->SetViewport( offset, IU_PER_MILS / 10, scale, false );
break;
}
break;
}
plotter->SetCreator( wxT( "PCBNEW" ) );
@ -233,6 +234,7 @@ bool GENDRILL_WRITER_BASE::genDrillMapFile( const wxString& aFullFileName, PLOT_
// Print a list of symbols used.
int charSize = Millimeter2iu( 2 ); // text size in IUs
// real char scale will be 1/scale, because the global plot scale is scale
// for scale < 1.0 ( plot bigger actual size)
// Therefore charScale = 1.0 / scale keep the initial charSize
@ -276,6 +278,7 @@ bool GENDRILL_WRITER_BASE::genDrillMapFile( const wxString& aFullFileName, PLOT_
}
int plot_diam = KiROUND( tool.m_Diameter );
// For markers plotted with the comment, keep marker size <= text height
plot_diam = std::min( plot_diam, KiROUND( charSize * charScale ) );
int x = KiROUND( plotX - textmarginaftersymbol * charScale - plot_diam / 2.0 );
@ -302,7 +305,7 @@ bool GENDRILL_WRITER_BASE::genDrillMapFile( const wxString& aFullFileName, PLOT_
sprintf( line, "(%d holes + 1 slot)", tool.m_TotalCount - 1 );
else // if ( toolm_OvalCount > 1 )
sprintf( line, "(%d holes + %d slots)", tool.m_TotalCount - tool.m_OvalCount,
tool.m_OvalCount );
tool.m_OvalCount );
msg += FROM_UTF8( line );
@ -452,7 +455,7 @@ bool GENDRILL_WRITER_BASE::plotDrillMarks( PLOTTER* aPlotter )
if( hole.m_Hole_Shape != 0 )
{
wxSize oblong_size = hole.m_Hole_Size;
aPlotter->FlashPadOval( pos, oblong_size, hole.m_Hole_Orient, SKETCH, NULL );
aPlotter->FlashPadOval( pos, oblong_size, hole.m_Hole_Orient, SKETCH, nullptr );
}
}

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2015-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2015-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -22,7 +22,7 @@
*/
/*
* 1 - create ascii files for automatic placement of smd components
* 1 - create ASCII files for automatic placement of smd components
* 2 - create a footprint report (pos and footprint descr) (ascii file)
*/
@ -75,15 +75,6 @@ public:
}
private:
PCB_EDIT_FRAME* m_parent;
PCB_PLOT_PARAMS m_plotOpts;
REPORTER* m_reporter;
static int m_unitsOpt;
static int m_fileOpt;
static int m_fileFormat;
static bool m_includeBoardEdge;
void initDialog();
void OnOutputDirectoryBrowseClicked( wxCommandEvent& event ) override;
void OnGenerate( wxCommandEvent& event ) override;
@ -116,11 +107,13 @@ private:
m_cbIncludeBoardEdge->Enable( m_rbFormat->GetSelection() == 2 );
}
/** Creates files in text or csv format
/**
* Creates files in text or csv format
*/
bool CreateAsciiFiles();
/** Creates placement files in gerber format
/**
* Creates placement files in gerber format
*/
bool CreateGerberFiles();
@ -139,6 +132,15 @@ private:
{
return m_excludeTH->GetValue();
}
PCB_EDIT_FRAME* m_parent;
PCB_PLOT_PARAMS m_plotOpts;
REPORTER* m_reporter;
static int m_unitsOpt;
static int m_fileOpt;
static int m_fileFormat;
static bool m_includeBoardEdge;
};
@ -148,7 +150,6 @@ int DIALOG_GEN_FOOTPRINT_POSITION::m_fileFormat = 0;
bool DIALOG_GEN_FOOTPRINT_POSITION::m_includeBoardEdge = false;
void DIALOG_GEN_FOOTPRINT_POSITION::initDialog()
{
m_browseButton->SetBitmap( KiBitmap( BITMAPS::small_folder ) );
@ -197,13 +198,15 @@ void DIALOG_GEN_FOOTPRINT_POSITION::OnOutputDirectoryBrowseClicked( wxCommandEve
wxString boardFilePath = ( (wxFileName) m_parent->GetBoard()->GetFileName() ).GetPath();
if( !dirName.MakeRelativeTo( boardFilePath ) )
wxMessageBox( _( "Cannot make path relative (target volume different from board file volume)!" ),
wxMessageBox( _( "Cannot make path relative (target volume different from board "
"file volume)!" ),
_( "Plot Output Directory" ), wxOK | wxICON_ERROR );
}
m_outputDirectoryName->SetValue( dirName.GetFullPath() );
}
void DIALOG_GEN_FOOTPRINT_POSITION::OnGenerate( wxCommandEvent& event )
{
m_fileOpt = m_radioBoxFilesCount->GetSelection();
@ -234,6 +237,7 @@ void DIALOG_GEN_FOOTPRINT_POSITION::OnGenerate( wxCommandEvent& event )
CreateAsciiFiles();
}
bool DIALOG_GEN_FOOTPRINT_POSITION::CreateGerberFiles()
{
BOARD* brd = m_parent->GetBoard();
@ -364,10 +368,12 @@ bool DIALOG_GEN_FOOTPRINT_POSITION::CreateAsciiFiles()
if( singleFile )
{
bottomSide = true;
fn.SetName( fn.GetName() + wxT( "-" ) + wxT("all") );
fn.SetName( fn.GetName() + wxT( "-" ) + wxT( "all" ) );
}
else
{
fn.SetName( fn.GetName() + wxT( "-" ) + PLACE_FILE_EXPORTER::GetFrontSideName().c_str() );
}
if( useCSVfmt )
@ -376,7 +382,9 @@ bool DIALOG_GEN_FOOTPRINT_POSITION::CreateAsciiFiles()
fn.SetExt( wxT( "csv" ) );
}
else
{
fn.SetExt( FootprintPlaceFileExtension );
}
int fpcount = m_parent->DoGenFootprintsPositionFile( fn.GetFullPath(), UnitsMM(),
ExcludeAllTH(), topSide, bottomSide,
@ -419,7 +427,9 @@ bool DIALOG_GEN_FOOTPRINT_POSITION::CreateAsciiFiles()
fn.SetExt( wxT( "csv" ) );
}
else
{
fn.SetExt( FootprintPlaceFileExtension );
}
fpcount = m_parent->DoGenFootprintsPositionFile( fn.GetFullPath(), UnitsMM(), ExcludeAllTH(),
topSide, bottomSide, useCSVfmt, useAuxOrigin );
@ -470,13 +480,13 @@ int PCB_EDIT_FRAME::DoGenFootprintsPositionFile( const wxString& aFullFileName,
bool aBottomSide, bool aFormatCSV,
bool aUseAuxOrigin )
{
FILE * file = NULL;
FILE * file = nullptr;
if( !aFullFileName.IsEmpty() )
{
file = wxFopen( aFullFileName, wxT( "wt" ) );
if( file == NULL )
if( file == nullptr )
return -1;
}
@ -519,6 +529,7 @@ void PCB_EDIT_FRAME::GenFootprintsReport( wxCommandEvent& event )
bool success = DoGenFootprintsReport( fn.GetFullPath(), unitMM );
wxString msg;
if( success )
{
msg.Printf( _( "Footprint report file created:\n'%s'." ), fn.GetFullPath() );
@ -532,13 +543,12 @@ void PCB_EDIT_FRAME::GenFootprintsReport( wxCommandEvent& event )
}
}
/* Print a footprint report.
*/
bool PCB_EDIT_FRAME::DoGenFootprintsReport( const wxString& aFullFilename, bool aUnitsMM )
{
FILE* rptfile = wxFopen( aFullFilename, wxT( "wt" ) );
if( rptfile == NULL )
if( rptfile == nullptr )
return false;
std::string data;

View File

@ -51,16 +51,18 @@
#include <reporter.h>
#include <gbr_metadata.h>
// Oblong holes can be drilled by a "canned slot" command (G85) or a routing command
// a linear routing command (G01) is perhaps more usual for drill files
//
// set m_useRouteModeForOval to false to use a canned slot hole (old way)
// set m_useRouteModeForOval to true (preferred mode) to use a linear routed hole (new way)
EXCELLON_WRITER::EXCELLON_WRITER( BOARD* aPcb )
: GENDRILL_WRITER_BASE( aPcb )
{
m_file = NULL;
m_file = nullptr;
m_zeroFormat = DECIMAL_FORMAT;
m_conversionUnits = 0.0001;
m_mirror = false;
@ -108,13 +110,14 @@ void EXCELLON_WRITER::CreateDrillandMapFilesSet( const wxString& aPlotDirectory,
FILE* file = wxFopen( fullFilename, wxT( "w" ) );
if( file == NULL )
if( file == nullptr )
{
if( aReporter )
{
msg.Printf( _( "Failed to create file '%s'." ), fullFilename );
aReporter->Report( msg, RPT_SEVERITY_ERROR );
}
break;
}
else
@ -205,6 +208,7 @@ int EXCELLON_WRITER::createDrillFile( FILE* aFile, DRILL_LAYER_PAIR aLayerPair,
#if USE_ATTRIB_FOR_HOLES
writeHoleAttribute( tool_descr.m_HoleAttribute );
#endif
// if units are mm, the resolution is 0.001 mm (3 digits in mantissa)
// if units are inches, the resolution is 0.1 mil (4 digits in mantissa)
if( m_unitsMetric )
@ -344,10 +348,8 @@ int EXCELLON_WRITER::createDrillFile( FILE* aFile, DRILL_LAYER_PAIR aLayerPair,
}
void EXCELLON_WRITER::SetFormat( bool aMetric,
ZEROS_FMT aZerosFmt,
int aLeftDigits,
int aRightDigits )
void EXCELLON_WRITER::SetFormat( bool aMetric, ZEROS_FMT aZerosFmt, int aLeftDigits,
int aRightDigits )
{
m_unitsMetric = aMetric;
m_zeroFormat = aZerosFmt;
@ -477,8 +479,7 @@ void EXCELLON_WRITER::writeCoordinates( char* aLine, double aCoordX, double aCoo
}
void EXCELLON_WRITER::writeEXCELLONHeader( DRILL_LAYER_PAIR aLayerPair,
TYPE_FILE aHolesType )
void EXCELLON_WRITER::writeEXCELLONHeader( DRILL_LAYER_PAIR aLayerPair, TYPE_FILE aHolesType )
{
fputs( "M48\n", m_file ); // The beginning of a header
@ -567,7 +568,7 @@ void EXCELLON_WRITER::writeEXCELLONHeader( DRILL_LAYER_PAIR aLayerPair,
void EXCELLON_WRITER::writeEXCELLONEndOfFile()
{
//add if minimal here
// add if minimal here
fputs( "T0\nM30\n", m_file );
fclose( m_file );
}

View File

@ -84,8 +84,9 @@ void GERBER_WRITER::CreateDrillandMapFilesSet( const wxString& aPlotDirectory, b
// The file is created if it has holes, or if it is the non plated drill file
// to be sure the NPTH file is up to date in separate files mode.
// Also a PTH drill/map file is always created, to be sure at least one plated hole drill file
// is created (do not create any PTH drill file can be seen as not working drill generator).
// Also a PTH drill/map file is always created, to be sure at least one plated hole drill
// file is created (do not create any PTH drill file can be seen as not working drill
// generator).
if( getHolesCount() > 0 || doing_npth || pair == DRILL_LAYER_PAIR( F_Cu, B_Cu ) )
{
fn = getDrillFileName( pair, doing_npth, false );
@ -104,6 +105,7 @@ void GERBER_WRITER::CreateDrillandMapFilesSet( const wxString& aPlotDirectory, b
msg.Printf( _( "Failed to create file '%s'." ), fullFilename );
aReporter->Report( msg, RPT_SEVERITY_ERROR );
}
break;
}
else
@ -123,11 +125,13 @@ void GERBER_WRITER::CreateDrillandMapFilesSet( const wxString& aPlotDirectory, b
CreateMapFilesSet( aPlotDirectory, aReporter );
}
#if !FLASH_OVAL_HOLE
// A helper class to transform an oblong hole to a segment
static void convertOblong2Segment( wxSize aSize, double aOrient, wxPoint& aStart, wxPoint& aEnd );
#endif
int GERBER_WRITER::createDrillFile( wxString& aFullFilename, bool aIsNpth,
DRILL_LAYER_PAIR aLayerPair )
{
@ -145,6 +149,7 @@ int GERBER_WRITER::createDrillFile( wxString& aFullFilename, bool aIsNpth,
// Add the standard X2 header, without FileFunction
AddGerberX2Header( &plotter, m_pcb );
plotter.SetViewport( m_offset, IU_PER_MILS/10, /* scale */ 1.0, /* mirror */false );
// has meaning only for gerber plotter. Must be called only after SetViewport
plotter.SetGerberCoordinatesFormat( 6 );
plotter.SetCreator( wxT( "PCBNEW" ) );
@ -189,7 +194,7 @@ int GERBER_WRITER::createDrillFile( wxString& aFullFilename, bool aIsNpth,
if( !last_item_is_via )
{
// be sure the current object attribute is cleared for vias
plotter.EndBlock( NULL );
plotter.EndBlock( nullptr );
}
last_item_is_via = true;
@ -200,11 +205,13 @@ int GERBER_WRITER::createDrillFile( wxString& aFullFilename, bool aIsNpth,
const PAD* pad = dyn_cast<const PAD*>( hole_descr.m_ItemParent );
if( pad->GetProperty() == PAD_PROP::CASTELLATED )
{
gbr_metadata.SetApertureAttrib( GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB_CASTELLATEDDRILL );
}
else
{
// Good practice of oblong pad holes (slots) is to use a specific aperture for routing, not used
// in drill commands
// Good practice of oblong pad holes (slots) is to use a specific aperture for
// routing, not used in drill commands.
if( hole_descr.m_Hole_Shape )
gbr_metadata.SetApertureAttrib( GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB_CMP_OBLONG_DRILL );
else
@ -220,23 +227,21 @@ int GERBER_WRITER::createDrillFile( wxString& aFullFilename, bool aIsNpth,
if( hole_descr.m_Hole_Shape )
{
#if FLASH_OVAL_HOLE // set to 1 to use flashed oblong holes,
#if FLASH_OVAL_HOLE // set to 1 to use flashed oblong holes,
// 0 to draw them as a line.
plotter.FlashPadOval( hole_pos, hole_descr.m_Hole_Size,
hole_descr.m_Hole_Orient, FILLED, &gbr_metadata );
#else
#else
// Use routing for oblong hole (Slots)
wxPoint start, end;
convertOblong2Segment( hole_descr.m_Hole_Size,
hole_descr.m_Hole_Orient, start, end );
convertOblong2Segment( hole_descr.m_Hole_Size, hole_descr.m_Hole_Orient, start, end );
int width = std::min( hole_descr.m_Hole_Size.x, hole_descr.m_Hole_Size.y );
if ( width == 0 )
continue;
plotter.ThickSegment( start+hole_pos, end+hole_pos,
width, FILLED, &gbr_metadata );
#endif
plotter.ThickSegment( start+hole_pos, end+hole_pos, width, FILLED, &gbr_metadata );
#endif
}
else
{
@ -280,6 +285,7 @@ void convertOblong2Segment( wxSize aSize, double aOrient, wxPoint& aStart, wxPoi
}
#endif
void GERBER_WRITER::SetFormat( int aRightDigits )
{
/* Set conversion scale depending on drill file units */

View File

@ -7,7 +7,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2017 Jean_Pierre Charras <jp.charras at wanadoo.fr>
* Copyright (C) 1992-2017 KiCad Developers, see change_log.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -47,17 +47,18 @@ public:
}
/**
* Function SetFormat
* Initialize internal parameters to match the given format
* @param aRightDigits = number of digits for mantissa part of coordinates (5 or 6)
* Initialize internal parameters to match the given format.
*
* @param aRightDigits is the number of digits for mantissa part of coordinates (5 or 6).
*/
void SetFormat( int aRightDigits = 6 );
/**
* Function SetOptions
* Initialize internal parameters to match drill options
* note: PTH and NPTH are always separate files in Gerber format
* @param aOffset = drill coordinates offset
* Initialize internal parameters to match drill options.
*
* @note PTH and NPTH are always separate files in Gerber format.
*
* @param aOffset is the drill coordinates offset.
*/
void SetOptions( wxPoint aOffset )
{
@ -66,38 +67,38 @@ public:
}
/**
* Function CreateDrillandMapFilesSet
* Creates the full set of Excellon drill file for the board
* filenames are computed from the board name, and layers id
* @param aPlotDirectory = the output folder
* @param aGenDrill = true to generate the EXCELLON drill file
* @param aGenMap = true to generate a drill map file
* @param aReporter = a REPORTER to return activity or any message (can be NULL)
* Create the full set of Excellon drill file for the board filenames are computed from
* the board name, and layers id.
*
* @param aPlotDirectory is the output folder.
* @param aGenDrill set to true to generate the EXCELLON drill file.
* @param aGenMap set to true to generate a drill map file.
* @param aReporter is a #REPORTER to return activity or any message (can be NULL).
*/
void CreateDrillandMapFilesSet( const wxString& aPlotDirectory,
bool aGenDrill, bool aGenMap,
REPORTER * aReporter = NULL );
REPORTER * aReporter = nullptr );
private:
/**
* Function createDrillFile
* Creates an Excellon drill file
* @param aFullFilename = the full filename
* @param aIsNpth = true for a NPTH file, false for a PTH file
* @param aLayerPair = first board layer and the last board layer for this drill file
* for blind buried vias, they are not always top and bottom layers
* @return hole count, or -1 if the file cannot be created
* Create an Excellon drill file.
*
* @param aFullFilename is the full file name.
* @param aIsNpth set to true for a NPTH file or false for a PTH file.
* @param aLayerPair is the first board layer and the last board layer for this drill file
* for blind buried vias, they are not always top and bottom layers/
* @return hole count or -1 if the file cannot be created.
*/
int createDrillFile( wxString& aFullFilename, bool aIsNpth, DRILL_LAYER_PAIR aLayerPair );
int createDrillFile( wxString& aFullFilename, bool aIsNpth, DRILL_LAYER_PAIR aLayerPair );
/**
* @return a filename which identify the drill file function.
* it is the board name with the layer pair names added, and for separate
* (PTH and NPTH) files, "-NPH" or "-NPTH" added
* @param aPair = the layer pair
* @param aNPTH = true to generate the filename of NPTH holes
* @param aMerge_PTH_NPTH = true to generate the filename of a file which containd both
* NPH and NPTH holes
* @param aPair is the layer pair.
* @param aNPTH set to true to generate the filename of NPTH holes.
* @param aMerge_PTH_NPTH set to true to generate the filename of a file which contains both
* NPH and NPTH holes
* @return a filename which identify the drill file function. It is the board name with the
* layer pair names added, and for separate (PTH and NPTH) files, "-NPH" or "-NPTH"
* added.
*/
virtual const wxString getDrillFileName( DRILL_LAYER_PAIR aPair, bool aNPTH,
bool aMerge_PTH_NPTH ) const override;

View File

@ -197,7 +197,9 @@ bool AskLoadBoardFileName( PCB_EDIT_FRAME* aParent, int* aCtl, wxString* aFileNa
return true;
}
else
{
return false;
}
}
@ -694,7 +696,7 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
unsigned startTime = GetRunningMicroSecs();
#endif
loadedBoard = pi->Load( fullFileName, NULL, &props, &Prj(), &progressReporter );
loadedBoard = pi->Load( fullFileName, nullptr, &props, &Prj(), &progressReporter );
#if USE_INSTRUMENTATION
unsigned stopTime = GetRunningMicroSecs();
@ -1007,7 +1009,7 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool addToHistory,
wxASSERT( tempFile.IsAbsolute() );
pi->Save( tempFile.GetFullPath(), GetBoard(), NULL );
pi->Save( tempFile.GetFullPath(), GetBoard(), nullptr );
}
catch( const IO_ERROR& ioe )
{
@ -1108,7 +1110,7 @@ bool PCB_EDIT_FRAME::SavePcbCopy( const wxString& aFileName, bool aCreateProject
wxASSERT( pcbFileName.IsAbsolute() );
pi->Save( pcbFileName.GetFullPath(), GetBoard(), NULL );
pi->Save( pcbFileName.GetFullPath(), GetBoard(), nullptr );
}
catch( const IO_ERROR& ioe )
{

View File

@ -323,7 +323,7 @@ public:
*/
void SetLastEditTime( timestamp_t aTime ) { m_lastEditTime = aTime; }
void SetLastEditTime() { m_lastEditTime = time( NULL ); }
void SetLastEditTime() { m_lastEditTime = time( nullptr ); }
timestamp_t GetLastEditTime() const { return m_lastEditTime; }
/**

View File

@ -612,7 +612,8 @@ bool FOOTPRINT_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
if( IsContentModified() )
{
// Shutdown blocks must be determined and vetoed as early as possible
if( KIPLATFORM::APP::SupportsShutdownBlockReason() && aEvent.GetId() == wxEVT_QUERY_END_SESSION )
if( KIPLATFORM::APP::SupportsShutdownBlockReason() &&
aEvent.GetId() == wxEVT_QUERY_END_SESSION )
{
aEvent.Veto();
return false;
@ -639,7 +640,7 @@ bool FOOTPRINT_EDIT_FRAME::canCloseWindow( wxCloseEvent& aEvent )
void FOOTPRINT_EDIT_FRAME::doCloseWindow()
{
// No more vetos
GetCanvas()->SetEventDispatcher( NULL );
GetCanvas()->SetEventDispatcher( nullptr );
GetCanvas()->StopDrawing();
// Do not show the layer manager during closing to avoid flicker
@ -677,7 +678,7 @@ void FOOTPRINT_EDIT_FRAME::OnUpdateLoadFootprintFromBoard( wxUpdateUIEvent& aEve
{
PCB_EDIT_FRAME* frame = (PCB_EDIT_FRAME*) Kiway().Player( FRAME_PCB_EDITOR, false );
aEvent.Enable( frame && frame->GetBoard()->GetFirstFootprint() != NULL );
aEvent.Enable( frame && frame->GetBoard()->GetFirstFootprint() != nullptr );
}
@ -827,7 +828,7 @@ void FOOTPRINT_EDIT_FRAME::initLibraryTree()
if( GFootprintList.GetCount() == 0 )
GFootprintList.ReadCacheFromFile( Prj().GetProjectPath() + "fp-info-cache" );
GFootprintList.ReadFootprintFiles( fpTable, NULL, &progressReporter );
GFootprintList.ReadFootprintFiles( fpTable, nullptr, &progressReporter );
progressReporter.Show( false );
if( GFootprintList.GetErrorCount() )
@ -851,12 +852,12 @@ void FOOTPRINT_EDIT_FRAME::SyncLibraryTree( bool aProgress )
if( aProgress )
{
WX_PROGRESS_REPORTER progressReporter( this, _( "Updating Footprint Libraries" ), 2 );
GFootprintList.ReadFootprintFiles( fpTable, NULL, &progressReporter );
GFootprintList.ReadFootprintFiles( fpTable, nullptr, &progressReporter );
progressReporter.Show( false );
}
else
{
GFootprintList.ReadFootprintFiles( fpTable, NULL, NULL );
GFootprintList.ReadFootprintFiles( fpTable, nullptr, nullptr );
}
// Sync the LIB_TREE to the FOOTPRINT_INFO list

View File

@ -43,7 +43,7 @@ using namespace std::placeholders;
void FOOTPRINT_EDIT_FRAME::LoadFootprintFromBoard( wxCommandEvent& event )
{
LoadFootprintFromBoard( NULL );
LoadFootprintFromBoard( nullptr );
}
@ -209,8 +209,9 @@ void FOOTPRINT_EDIT_FRAME::OnEditItemRequest( BOARD_ITEM* aItem )
commit.Push( _( "Edit Zone" ) );
zoneSettings.ExportSetting( *static_cast<ZONE*>( aItem ) );
}
break;
}
break;
case PCB_GROUP_T:
m_toolManager->RunAction( PCB_ACTIONS::groupProperties, true, aItem );
@ -282,7 +283,8 @@ void FOOTPRINT_EDIT_FRAME::KiwayMailIn( KIWAY_EXPRESS& mail )
msg.Printf( _( "The current configuration does not include a library named '%s'.\n"
"Use Manage Footprint Libraries to edit the configuration." ),
fpFileName.GetPath() );
DisplayErrorMessage( this, _( "Library not found in footprint library table." ), msg );
DisplayErrorMessage( this, _( "Library not found in footprint library table." ),
msg );
break;
}

View File

@ -47,7 +47,7 @@ void FOOTPRINT_INFO_IMPL::load()
const FOOTPRINT* footprint = fptable->GetEnumeratedFootprint( m_nickname, m_fpname );
if( footprint == NULL ) // Should happen only with malformed/broken libraries
if( footprint == nullptr ) // Should happen only with malformed/broken libraries
{
m_pad_count = 0;
m_unique_pad_count = 0;
@ -87,6 +87,7 @@ bool FOOTPRINT_LIST_IMPL::CatchErrors( const std::function<void()>& aFunc )
{
m_errors.move_push( std::make_unique<IO_ERROR>( ioe ) );
}
return false;
}
@ -137,7 +138,6 @@ bool FOOTPRINT_LIST_IMPL::ReadFootprintFiles( FP_LIB_TABLE* aTable, const wxStri
loader.SetList( this );
loader.Start( aTable, aNickname );
while( !m_cancelled && (int)m_count_finished.load() < m_loader->m_total_libs )
{
if( m_progress_reporter && !m_progress_reporter->KeepRefreshing() )
@ -166,7 +166,7 @@ bool FOOTPRINT_LIST_IMPL::ReadFootprintFiles( FP_LIB_TABLE* aTable, const wxStri
}
if( m_cancelled )
m_list_timestamp = 0; // God knows what we got before we were cancelled
m_list_timestamp = 0; // God knows what we got before we were canceled
else
m_list_timestamp = generatedTimestamp;
@ -189,7 +189,9 @@ void FOOTPRINT_LIST_IMPL::startWorkers( FP_LIB_TABLE* aTable, wxString const* aN
m_queue_out.clear();
if( aNickname )
{
m_queue_in.push( *aNickname );
}
else
{
for( auto const& nickname : aTable->GetLogicalLibs() )
@ -204,6 +206,7 @@ void FOOTPRINT_LIST_IMPL::startWorkers( FP_LIB_TABLE* aTable, wxString const* aN
}
}
void FOOTPRINT_LIST_IMPL::stopWorkers()
{
std::lock_guard<std::mutex> lock1( m_join );
@ -219,11 +222,12 @@ void FOOTPRINT_LIST_IMPL::stopWorkers()
m_queue_in.clear();
m_count_finished.store( 0 );
// If we have cancelled in the middle of a load, clear our timestamp to re-load next time
// If we have canceled in the middle of a load, clear our timestamp to re-load next time
if( m_cancelled )
m_list_timestamp = 0;
}
bool FOOTPRINT_LIST_IMPL::joinWorkers()
{
{
@ -242,7 +246,7 @@ bool FOOTPRINT_LIST_IMPL::joinWorkers()
LOCALE_IO toggle_locale;
// Parse the footprints in parallel. WARNING! This requires changing the locale, which is
// GLOBAL. It is only threadsafe to construct the LOCALE_IO before the threads are created,
// GLOBAL. It is only thread safe to construct the LOCALE_IO before the threads are created,
// destroy it after they finish, and block the main (GUI) thread while they work. Any deviation
// from this will cause nasal demons.
//
@ -313,11 +317,12 @@ bool FOOTPRINT_LIST_IMPL::joinWorkers()
while( queue_parsed.pop( fpi ) )
m_list.push_back( std::move( fpi ) );
std::sort( m_list.begin(), m_list.end(), []( std::unique_ptr<FOOTPRINT_INFO> const& lhs,
std::unique_ptr<FOOTPRINT_INFO> const& rhs ) -> bool
{
return *lhs < *rhs;
} );
std::sort( m_list.begin(), m_list.end(),
[]( std::unique_ptr<FOOTPRINT_INFO> const& lhs,
std::unique_ptr<FOOTPRINT_INFO> const& rhs ) -> bool
{
return *lhs < *rhs;
} );
return m_errors.empty();
}

View File

@ -2,8 +2,8 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012-2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2008-2016 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 2004-2019 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2008-2016 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 2004-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -144,7 +144,7 @@ FOOTPRINT_VIEWER_FRAME::FOOTPRINT_VIEWER_FRAME( KIWAY* aKiway, wxWindow* aParent
libSizer->Add( m_libFilter, 0, wxEXPAND, 5 );
m_libList = new wxListBox( libPanel, ID_MODVIEW_LIB_LIST, wxDefaultPosition, wxDefaultSize,
0, NULL, wxLB_HSCROLL | wxNO_BORDER );
0, nullptr, wxLB_HSCROLL | wxNO_BORDER );
libSizer->Add( m_libList, 1, wxEXPAND, 5 );
libPanel->SetSizer( libSizer );
@ -163,7 +163,7 @@ FOOTPRINT_VIEWER_FRAME::FOOTPRINT_VIEWER_FRAME( KIWAY* aKiway, wxWindow* aParent
fpSizer->Add( m_fpFilter, 0, wxEXPAND, 5 );
m_fpList = new wxListBox( fpPanel, ID_MODVIEW_FOOTPRINT_LIST, wxDefaultPosition, wxDefaultSize,
0, NULL, wxLB_HSCROLL | wxNO_BORDER );
0, nullptr, wxLB_HSCROLL | wxNO_BORDER );
fpSizer->Add( m_fpList, 1, wxEXPAND, 5 );
fpPanel->SetSizer( fpSizer );
@ -312,14 +312,18 @@ void FOOTPRINT_VIEWER_FRAME::setupUIConditions()
mgr->SetConditions( ACTIONS::toggleGrid, CHECK( cond.GridVisible() ) );
mgr->SetConditions( ACTIONS::toggleCursorStyle, CHECK( cond.FullscreenCursor() ) );
mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MILLIMETRES ) ) );
mgr->SetConditions( ACTIONS::millimetersUnits,
CHECK( cond.Units( EDA_UNITS::MILLIMETRES ) ) );
mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCHES ) ) );
mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) );
mgr->SetConditions( ACTIONS::zoomTool, CHECK( cond.CurrentTool( ACTIONS::zoomTool ) ) );
mgr->SetConditions( ACTIONS::measureTool, CHECK( cond.CurrentTool( ACTIONS::measureTool ) ) );
mgr->SetConditions( ACTIONS::selectionTool, CHECK( cond.CurrentTool( ACTIONS::selectionTool ) ) );
mgr->SetConditions( ACTIONS::zoomTool,
CHECK( cond.CurrentTool( ACTIONS::zoomTool ) ) );
mgr->SetConditions( ACTIONS::measureTool,
CHECK( cond.CurrentTool( ACTIONS::measureTool ) ) );
mgr->SetConditions( ACTIONS::selectionTool,
CHECK( cond.CurrentTool( ACTIONS::selectionTool ) ) );
mgr->SetConditions( PCB_ACTIONS::showPadNumbers, CHECK( cond.PadNumbersDisplay() ) );
mgr->SetConditions( PCB_ACTIONS::padDisplayMode, CHECK( !cond.PadFillDisplay() ) );
@ -358,7 +362,9 @@ void FOOTPRINT_VIEWER_FRAME::doCloseWindow()
// window to be destroyed by the caller of KIWAY_PLAYER::ShowModal()
}
else
{
Destroy();
}
}
@ -441,7 +447,7 @@ void FOOTPRINT_VIEWER_FRAME::ReCreateFootprintList()
wxString nickname = getCurNickname();
fp_info_list->ReadFootprintFiles( Prj().PcbFootprintLibs(), !nickname ? NULL : &nickname );
fp_info_list->ReadFootprintFiles( Prj().PcbFootprintLibs(), !nickname ? nullptr : &nickname );
if( fp_info_list->GetErrorCount() )
{
@ -498,7 +504,9 @@ void FOOTPRINT_VIEWER_FRAME::ReCreateFootprintList()
ClickOnFootprintList( dummy );
}
else
{
setCurFootprintName( wxEmptyString );
}
}
else
{
@ -564,7 +572,9 @@ void FOOTPRINT_VIEWER_FRAME::OnCharHook( wxKeyEvent& aEvent )
AddFootprintToPCB( dummy );
}
else
{
aEvent.Skip();
}
}
@ -656,11 +666,10 @@ void FOOTPRINT_VIEWER_FRAME::ClickOnFootprintList( wxCommandEvent& aEvent )
}
catch( const IO_ERROR& ioe )
{
wxString msg = wxString::Format( _( "Could not load footprint '%s' from library '%s'."
"\n\n%s" ),
getCurFootprintName(),
getCurNickname(),
ioe.Problem() );
wxString msg =
wxString::Format( _( "Could not load footprint '%s' from library '%s'."
"\n\n%s" ),
getCurFootprintName(), getCurNickname(), ioe.Problem() );
DisplayError( this, msg );
}
@ -698,7 +707,7 @@ void FOOTPRINT_VIEWER_FRAME::AddFootprintToPCB( wxCommandEvent& aEvent )
{
PCB_EDIT_FRAME* pcbframe = (PCB_EDIT_FRAME*) Kiway().Player( FRAME_PCB_EDITOR, false );
if( pcbframe == NULL ) // happens when the board editor is not active (or closed)
if( pcbframe == nullptr ) // happens when the board editor is not active (or closed)
{
DisplayErrorMessage( this, _( "No board currently open." ) );
return;
@ -726,7 +735,7 @@ void FOOTPRINT_VIEWER_FRAME::AddFootprintToPCB( wxCommandEvent& aEvent )
// (Can be stored flipped if the lib is an archive built from a board)
if( newFootprint->IsFlipped() )
newFootprint->Flip( newFootprint->GetPosition(),
pcbframe->Settings().m_FlipLeftRight );
pcbframe->Settings().m_FlipLeftRight );
KIGFX::VIEW_CONTROLS* viewControls = pcbframe->GetCanvas()->GetViewControls();
VECTOR2D cursorPos = viewControls->GetCursorPosition();

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 NBEE Embedded Systems SL, Miguel Angel Ajo <miguelangel@ajo.es>
* Copyright (C) 2013 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2013-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -64,7 +64,7 @@ FOOTPRINT_WIZARD* FOOTPRINT_WIZARD_LIST::GetWizard( const wxString& aName )
return wizard;
}
return NULL;
return nullptr;
}

View File

@ -3,8 +3,8 @@
*
* Copyright (C) 2012-2015 Miguel Angel Ajo Pelayo <miguelangel@nbee.es>
* Copyright (C) 2012-2019 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2008-2015 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 2004-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 2004-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -79,10 +79,10 @@ END_EVENT_TABLE()
FOOTPRINT_WIZARD_FRAME::FOOTPRINT_WIZARD_FRAME( KIWAY* aKiway, wxWindow* aParent,
FRAME_T aFrameType ) :
PCB_BASE_EDIT_FRAME( aKiway, aParent, aFrameType, _( "Footprint Wizard" ),
wxDefaultPosition, wxDefaultSize,
aParent ? KICAD_DEFAULT_DRAWFRAME_STYLE | wxFRAME_FLOAT_ON_PARENT
: KICAD_DEFAULT_DRAWFRAME_STYLE | wxSTAY_ON_TOP,
FOOTPRINT_WIZARD_FRAME_NAME ),
wxDefaultPosition, wxDefaultSize,
aParent ? KICAD_DEFAULT_DRAWFRAME_STYLE | wxFRAME_FLOAT_ON_PARENT
: KICAD_DEFAULT_DRAWFRAME_STYLE | wxSTAY_ON_TOP,
FOOTPRINT_WIZARD_FRAME_NAME ),
m_wizardListShown( false )
{
wxASSERT( aFrameType == FRAME_FOOTPRINT_WIZARD );
@ -162,7 +162,7 @@ FOOTPRINT_WIZARD_FRAME::FOOTPRINT_WIZARD_FRAME( KIWAY* aKiway, wxWindow* aParent
m_parametersPanel = new wxPanel( this, wxID_ANY );
m_pageList = new wxListBox( m_parametersPanel, ID_FOOTPRINT_WIZARD_PAGE_LIST,
wxDefaultPosition, wxDefaultSize, 0, NULL,
wxDefaultPosition, wxDefaultSize, 0, nullptr,
wxLB_HSCROLL | wxNO_BORDER );
auto divider = new wxStaticLine( m_parametersPanel, wxID_ANY,
@ -254,7 +254,6 @@ void FOOTPRINT_WIZARD_FRAME::doCloseWindow()
if( !IsDismissed() )
DismissModal( false );
}
// else do nothing
}
@ -313,7 +312,9 @@ void FOOTPRINT_WIZARD_FRAME::UpdateMsgPanel()
SetMsgPanel( items );
}
else
{
ClearMsgPanel();
}
}
@ -341,13 +342,13 @@ void FOOTPRINT_WIZARD_FRAME::initParameterGrid()
m_parameterGrid->Connect( wxEVT_SIZE,
wxSizeEventHandler( FOOTPRINT_WIZARD_FRAME::OnGridSize ),
NULL, this );
nullptr, this );
}
void FOOTPRINT_WIZARD_FRAME::ReCreatePageList()
{
if( m_pageList == NULL )
if( m_pageList == nullptr )
return;
FOOTPRINT_WIZARD* footprintWizard = GetMyWizard();
@ -358,7 +359,7 @@ void FOOTPRINT_WIZARD_FRAME::ReCreatePageList()
m_pageList->Clear();
int max_page = footprintWizard->GetNumParameterPages();
for( int i = 0; i<max_page; i++ )
for( int i = 0; i < max_page; i++ )
{
wxString name = footprintWizard->GetParameterPageName( i );
m_pageList->Append( name );
@ -375,12 +376,12 @@ void FOOTPRINT_WIZARD_FRAME::ReCreatePageList()
void FOOTPRINT_WIZARD_FRAME::ReCreateParameterList()
{
if( m_parameterGrid == NULL )
if( m_parameterGrid == nullptr )
return;
FOOTPRINT_WIZARD* footprintWizard = GetMyWizard();
if( footprintWizard == NULL )
if( footprintWizard == nullptr )
return;
m_parameterGrid->Freeze();
@ -406,7 +407,7 @@ void FOOTPRINT_WIZARD_FRAME::ReCreateParameterList()
wxString designator, name, value, units, hint;
for( unsigned int i = 0; i< namesList.size(); i++ )
for( unsigned int i = 0; i < namesList.size(); i++ )
{
designator = designatorsList[i];
name = namesList[i];
@ -438,16 +439,15 @@ void FOOTPRINT_WIZARD_FRAME::ReCreateParameterList()
options.Add( tokenizer.GetNextToken() );
}
m_parameterGrid->SetCellEditor( i, WIZ_COL_VALUE, new wxGridCellChoiceEditor( options ) );
m_parameterGrid->SetCellEditor( i, WIZ_COL_VALUE,
new wxGridCellChoiceEditor( options ) );
units = wxT( "" );
}
// Integer parameters
else if( units == WIZARD_PARAM_UNITS_INTEGER )
else if( units == WIZARD_PARAM_UNITS_INTEGER ) // Integer parameters
{
m_parameterGrid->SetCellEditor( i, WIZ_COL_VALUE, new wxGridCellNumberEditor );
}
// Non-integer numerical parameters
else if( ( units == WIZARD_PARAM_UNITS_MM ) ||
( units == WIZARD_PARAM_UNITS_MILS ) ||
( units == WIZARD_PARAM_UNITS_FLOAT ) ||
@ -455,6 +455,7 @@ void FOOTPRINT_WIZARD_FRAME::ReCreateParameterList()
( units == WIZARD_PARAM_UNITS_DEGREES ) ||
( units == WIZARD_PARAM_UNITS_PERCENT ) )
{
// Non-integer numerical parameters
m_parameterGrid->SetCellEditor( i, WIZ_COL_VALUE, new wxGridCellFloatEditor );
// Convert separators to the locale-specific character
@ -478,7 +479,7 @@ void FOOTPRINT_WIZARD_FRAME::ReCreateParameterList()
void FOOTPRINT_WIZARD_FRAME::ResizeParamColumns()
{
// Parameter grid is not yet configured
if( ( m_parameterGrid == NULL ) || ( m_parameterGrid->GetNumberCols() == 0 ) )
if( ( m_parameterGrid == nullptr ) || ( m_parameterGrid->GetNumberCols() == 0 ) )
return;
// first auto-size the columns to ensure enough space around text

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2012 Miguel Angel Ajo Pelayo, miguelangel@nbee.es
* Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2004-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2004-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -41,6 +41,7 @@
#include <tool/tool_manager.h>
void FOOTPRINT_WIZARD_FRAME::Process_Special_Functions( wxCommandEvent& event )
{
wxString msg;
@ -70,8 +71,8 @@ void FOOTPRINT_WIZARD_FRAME::Process_Special_Functions( wxCommandEvent& event )
default:
wxFAIL_MSG( wxString::Format(
"FOOTPRINT_WIZARD_FRAME::Process_Special_Functions error: id = %d",
event.GetId() ) );
"FOOTPRINT_WIZARD_FRAME::Process_Special_Functions error: id = %d",
event.GetId() ) );
break;
}
}
@ -134,14 +135,14 @@ void FOOTPRINT_WIZARD_FRAME::DisplayBuildMessage( wxString& aMessage )
FOOTPRINT_WIZARD* FOOTPRINT_WIZARD_FRAME::GetMyWizard()
{
if( m_wizardName.Length() == 0 )
return NULL;
return nullptr;
FOOTPRINT_WIZARD* footprintWizard = FOOTPRINT_WIZARD_LIST::GetWizard( m_wizardName );
if( !footprintWizard )
{
wxMessageBox( _( "Couldn't reload footprint wizard" ) );
return NULL;
return nullptr;
}
return footprintWizard;
@ -161,7 +162,7 @@ FOOTPRINT* FOOTPRINT_WIZARD_FRAME::GetBuiltFootprint()
return footprint;
}
return NULL;
return nullptr;
}
@ -205,7 +206,7 @@ void FOOTPRINT_WIZARD_FRAME::DefaultParameters( wxCommandEvent& event )
{
FOOTPRINT_WIZARD* footprintWizard = GetMyWizard();
if ( footprintWizard == NULL )
if ( footprintWizard == nullptr )
return;
footprintWizard->ResetParameters();
@ -216,10 +217,12 @@ void FOOTPRINT_WIZARD_FRAME::DefaultParameters( wxCommandEvent& event )
DisplayWizardInfos();
}
// This is a flag to avoid reentering of ParametersUpdated
// that can happen in some cases
static bool lock_update_prms = false;
void FOOTPRINT_WIZARD_FRAME::ParametersUpdated( wxGridEvent& event )
{
FOOTPRINT_WIZARD* footprintWizard = GetMyWizard();

View File

@ -2,8 +2,8 @@
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2016 CERN
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
* @author Janito V. Ferreira Filho
* Copyright (C) 1992-2018 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -72,12 +72,13 @@ bool SVG_IMPORT_PLUGIN::Load( const wxString& aFileName )
bool SVG_IMPORT_PLUGIN::Import()
{
for( NSVGshape* shape = m_parsedImage->shapes; shape != NULL; shape = shape->next )
for( NSVGshape* shape = m_parsedImage->shapes; shape != nullptr; shape = shape->next )
{
double lineWidth = shape->strokeWidth;
for( NSVGpath* path = shape->paths; path != NULL; path = path->next )
DrawPath( path->pts, path->npts, path->closed, shape->fill.type == NSVG_PAINT_COLOR, lineWidth );
for( NSVGpath* path = shape->paths; path != nullptr; path = path->next )
DrawPath( path->pts, path->npts, path->closed, shape->fill.type == NSVG_PAINT_COLOR,
lineWidth );
}
return true;
@ -108,7 +109,8 @@ double SVG_IMPORT_PLUGIN::GetImageWidth() const
}
void SVG_IMPORT_PLUGIN::DrawPath( const float* aPoints, int aNumPoints, bool aClosedPath, bool aFilled, double aLineWidth )
void SVG_IMPORT_PLUGIN::DrawPath( const float* aPoints, int aNumPoints, bool aClosedPath,
bool aFilled, double aLineWidth )
{
std::vector< VECTOR2D > collectedPathPoints;
@ -123,7 +125,7 @@ void SVG_IMPORT_PLUGIN::DrawPath( const float* aPoints, int aNumPoints, bool aCl
void SVG_IMPORT_PLUGIN::DrawCubicBezierPath( const float* aPoints, int aNumPoints,
std::vector< VECTOR2D >& aGeneratedPoints )
std::vector< VECTOR2D >& aGeneratedPoints )
{
const int pointsPerSegment = 4;
const int curveSpecificPointsPerSegment = 3;
@ -141,7 +143,7 @@ void SVG_IMPORT_PLUGIN::DrawCubicBezierPath( const float* aPoints, int aNumPoint
void SVG_IMPORT_PLUGIN::DrawCubicBezierCurve( const float* aPoints,
std::vector< VECTOR2D >& aGeneratedPoints )
std::vector< VECTOR2D >& aGeneratedPoints )
{
auto start = getBezierPoint( aPoints, 0.0f );
auto end = getBezierPoint( aPoints, 1.0f );
@ -195,7 +197,7 @@ static VECTOR2D getBezierPoint( const float* aPoints, float aStep )
static VECTOR2D getPointInLine( const VECTOR2D& aLineStart, const VECTOR2D& aLineEnd,
float aDistance )
float aDistance )
{
return aLineStart + ( aLineEnd - aLineStart ) * aDistance;
}
@ -233,8 +235,9 @@ static VECTOR2D calculateBezierBoundingBoxExtremity( const float* aCurvePoints,
static void segmentBezierCurve( const VECTOR2D& aStart, const VECTOR2D& aEnd, float aOffset,
float aStep, const float* aCurvePoints, float aSegmentationThreshold,
std::vector< VECTOR2D >& aGeneratedPoints )
float aStep, const float* aCurvePoints,
float aSegmentationThreshold,
std::vector< VECTOR2D >& aGeneratedPoints )
{
VECTOR2D middle = getBezierPoint( aCurvePoints, aOffset + aStep );
float distanceToPreviousSegment = distanceFromPointToLine( middle, aStart, aEnd );
@ -242,30 +245,31 @@ static void segmentBezierCurve( const VECTOR2D& aStart, const VECTOR2D& aEnd, fl
if( distanceToPreviousSegment > aSegmentationThreshold )
{
createNewBezierCurveSegments( aStart, middle, aEnd, aOffset, aStep, aCurvePoints,
aSegmentationThreshold, aGeneratedPoints );
aSegmentationThreshold, aGeneratedPoints );
}
}
static void createNewBezierCurveSegments( const VECTOR2D& aStart, const VECTOR2D& aMiddle,
const VECTOR2D& aEnd, float aOffset, float aStep, const float* aCurvePoints,
float aSegmentationThreshold, std::vector< VECTOR2D >& aGeneratedPoints )
const VECTOR2D& aEnd, float aOffset, float aStep,
const float* aCurvePoints, float aSegmentationThreshold,
std::vector< VECTOR2D >& aGeneratedPoints )
{
float newStep = aStep / 2.f;
float offsetAfterMiddle = aOffset + aStep;
segmentBezierCurve( aStart, aMiddle, aOffset, newStep, aCurvePoints, aSegmentationThreshold,
aGeneratedPoints );
aGeneratedPoints );
aGeneratedPoints.push_back( aMiddle );
segmentBezierCurve( aMiddle, aEnd, offsetAfterMiddle, newStep, aCurvePoints,
aSegmentationThreshold, aGeneratedPoints );
aSegmentationThreshold, aGeneratedPoints );
}
static float distanceFromPointToLine( const VECTOR2D& aPoint, const VECTOR2D& aLineStart,
const VECTOR2D& aLineEnd )
const VECTOR2D& aLineEnd )
{
auto lineDirection = aLineEnd - aLineStart;
auto lineNormal = lineDirection.Perpendicular().Resize( 1.f );

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2007-2014 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -42,7 +42,7 @@
bool PCB_EDIT_FRAME::Clear_Pcb( bool aQuery, bool aFinal )
{
if( GetBoard() == NULL )
if( GetBoard() == nullptr )
return false;
if( aQuery && !GetBoard()->IsEmpty() )
@ -96,7 +96,7 @@ bool PCB_EDIT_FRAME::Clear_Pcb( bool aQuery, bool aFinal )
bool FOOTPRINT_EDIT_FRAME::Clear_Pcb( bool aQuery )
{
if( GetBoard() == NULL )
if( GetBoard() == nullptr )
return false;
bool is_last_fp_from_brd = IsCurrentFPFromBoard();

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2011-2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2016-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2016-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -111,7 +111,7 @@ const wxString IO_MGR::GetFileExtension( PCB_FILE_T aFileType )
wxString ext = wxEmptyString;
PLUGIN* plugin = PluginFind( aFileType );
if( plugin != NULL )
if( plugin != nullptr )
{
ext = plugin->GetFileExtension();
PluginRelease( plugin );

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2017-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2017-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -80,7 +80,7 @@ FOOTPRINT* MICROWAVE_TOOL::createFootprint( MICROWAVE_FOOTPRINT_SHAPE aFootprint
WX_TEXT_ENTRY_DIALOG dlg( &editFrame, msg, _( "Create microwave footprint" ), value );
if( dlg.ShowQuasiModal() != wxID_OK )
return NULL; // cancelled by user
return nullptr; // cancelled by user
value = dlg.GetValue();
gap_size = ValueFromString( editFrame.GetUserUnits(), value );
@ -95,7 +95,7 @@ FOOTPRINT* MICROWAVE_TOOL::createFootprint( MICROWAVE_FOOTPRINT_SHAPE aFootprint
_( "Create microwave footprint" ), msg );
if( angledlg.ShowQuasiModal() != wxID_OK )
return NULL; // cancelled by user
return nullptr; // cancelled by user
msg = angledlg.GetValue();
@ -112,7 +112,7 @@ FOOTPRINT* MICROWAVE_TOOL::createFootprint( MICROWAVE_FOOTPRINT_SHAPE aFootprint
}
if( abort )
return NULL;
return nullptr;
footprint = createBaseFootprint( cmp_name, text_size, pad_count );
auto it = footprint->Pads().begin();
@ -145,7 +145,7 @@ FOOTPRINT* MICROWAVE_TOOL::createFootprint( MICROWAVE_FOOTPRINT_SHAPE aFootprint
pad->SetShape( PAD_SHAPE::CUSTOM );
pad->SetAnchorPadShape( PAD_SHAPE::RECT );
int numPoints = (angle / 50) + 3; // Note: angles are in 0.1 degrees
int numPoints = ( angle / 50 ) + 3; // Note: angles are in 0.1 degrees
std::vector<wxPoint> polyPoints;
polyPoints.reserve( numPoints );
@ -169,8 +169,8 @@ FOOTPRINT* MICROWAVE_TOOL::createFootprint( MICROWAVE_FOOTPRINT_SHAPE aFootprint
polyPoints.push_back( polyPoints[0] );
pad->AddPrimitivePoly( polyPoints, 0, true ); // add a polygonal basic shape
}
break;
}
default:
break;

View File

@ -4,7 +4,7 @@
* Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2015-2016 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -57,22 +57,13 @@ static int PolyShapeType;
/**************** Polygon Shapes ***********************/
enum id_mw_cmd {
ID_READ_SHAPE_FILE = 1000
};
/* Setting polynomial form parameters
*/
class MWAVE_POLYGONAL_SHAPE_DLG : public wxDialog
{
private:
PCB_EDIT_FRAME* m_Parent;
wxRadioBox* m_ShapeOptionCtrl;
EDA_SIZE_CTRL* m_SizeCtrl;
public:
MWAVE_POLYGONAL_SHAPE_DLG( PCB_EDIT_FRAME* parent, const wxPoint& pos );
~MWAVE_POLYGONAL_SHAPE_DLG() { };
@ -82,8 +73,8 @@ private:
void OnCancelClick( wxCommandEvent& event );
/**
* Function ReadDataShapeDescr
* read a description shape file
* Read a description shape file.
*
* File format is
* Unit=MM
* XScale=271.501
@ -100,6 +91,10 @@ private:
void ReadDataShapeDescr( wxCommandEvent& event );
DECLARE_EVENT_TABLE()
PCB_EDIT_FRAME* m_Parent;
wxRadioBox* m_ShapeOptionCtrl;
EDA_SIZE_CTRL* m_SizeCtrl;
};
@ -172,7 +167,7 @@ void MWAVE_POLYGONAL_SHAPE_DLG::ReadDataShapeDescr( wxCommandEvent& event )
wxString fullFileName;
wxString mask = wxFileSelectorDefaultWildcardStr;
fullFileName = EDA_FILE_SELECTOR( _( "Read descr shape file" ), lastpath,
fullFileName = EDA_FILE_SELECTOR( _( "Read Shape Description File" ), lastpath,
fullFileName, wxEmptyString, mask, this,
wxFD_OPEN, true );
@ -185,7 +180,7 @@ void MWAVE_POLYGONAL_SHAPE_DLG::ReadDataShapeDescr( wxCommandEvent& event )
FILE* File = wxFopen( fullFileName, wxT( "rt" ) );
if( File == NULL )
if( File == nullptr )
{
DisplayError( this, _( "File not found" ) );
return;
@ -203,7 +198,7 @@ void MWAVE_POLYGONAL_SHAPE_DLG::ReadDataShapeDescr( wxCommandEvent& event )
{
char* Line = reader.Line();
char* param1 = strtok( Line, " =\n\r" );
char* param2 = strtok( NULL, " \t\n\r" );
char* param2 = strtok( nullptr, " \t\n\r" );
if( strncasecmp( param1, "Unit", 4 ) == 0 )
{
@ -223,7 +218,7 @@ void MWAVE_POLYGONAL_SHAPE_DLG::ReadDataShapeDescr( wxCommandEvent& event )
{
Line = reader.Line();
param1 = strtok( Line, " \t\n\r" );
param2 = strtok( NULL, " \t\n\r" );
param2 = strtok( nullptr, " \t\n\r" );
if( strncasecmp( param1, "$ENDCOORD", 8 ) == 0 )
break;
@ -265,7 +260,7 @@ FOOTPRINT* MICROWAVE_TOOL::createPolygonShape()
if( ret != wxID_OK )
{
PolyEdges.clear();
return NULL;
return nullptr;
}
if( PolyShapeType == 2 ) // mirrored
@ -277,13 +272,13 @@ FOOTPRINT* MICROWAVE_TOOL::createPolygonShape()
if( ( ShapeSize.x ) == 0 || ( ShapeSize.y == 0 ) )
{
editFrame.ShowInfoBarError( _( "Shape has a null size." ) );
return NULL;
return nullptr;
}
if( PolyEdges.size() == 0 )
{
editFrame.ShowInfoBarError( _( "Shape has no points." ) );
return NULL;
return nullptr;
}
cmp_name = wxT( "muwave_polygon" );
@ -351,8 +346,9 @@ FOOTPRINT* MICROWAVE_TOOL::createPolygonShape()
}
shape->SetPolyPoints( polyPoints );
// Set the polygon outline thickness to 0, only the polygonal shape is filled
// without extra thickness
// without extra thickness.
shape->SetWidth( 0 );
PolyEdges.clear();

View File

@ -183,7 +183,7 @@ class NETINFO_MAPPING
public:
NETINFO_MAPPING()
{
m_board = NULL;
m_board = nullptr;
}

View File

@ -7,7 +7,7 @@
*
* Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -38,10 +38,6 @@
#include <pad.h>
/*********************************************************/
/* class NETINFO_ITEM: handle data relative to a given net */
/*********************************************************/
NETINFO_ITEM::NETINFO_ITEM( BOARD* aParent, const wxString& aNetName, int aNetCode ) :
BOARD_ITEM( aParent, PCB_NETINFO_T ),
m_netCode( aNetCode ),
@ -80,7 +76,7 @@ void NETINFO_ITEM::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANE
aList.emplace_back( _( "Net Code" ), wxString::Format( "%d", GetNetCode() ) );
// Warning: for netcode == NETINFO_LIST::ORPHANED, the parent or the board can be NULL
BOARD * board = m_parent ? m_parent->GetBoard() : NULL;
BOARD * board = m_parent ? m_parent->GetBoard() : nullptr;
if( board )
{

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -67,7 +67,7 @@ NETINFO_ITEM* NETINFO_LIST::GetNetItem( int aNetCode ) const
if( result != m_netCodes.end() )
return (*result).second;
return NULL;
return nullptr;
}
@ -78,7 +78,7 @@ NETINFO_ITEM* NETINFO_LIST::GetNetItem( const wxString& aNetName ) const
if( result != m_netNames.end() )
return (*result).second;
return NULL;
return nullptr;
}
@ -135,22 +135,22 @@ void NETINFO_LIST::AppendNet( NETINFO_ITEM* aNewElement )
// if there is a net with such name then just assign the correct number
NETINFO_ITEM* sameName = GetNetItem( aNewElement->GetNetname() );
if( sameName != NULL )
if( sameName != nullptr )
{
aNewElement->m_netCode = sameName->GetNetCode();
return;
}
// be sure that net codes are consecutive
// negative net code means that it has to be auto assigned
else if( aNewElement->m_netCode != (int) m_netCodes.size() || aNewElement->m_netCode < 0 )
{
// be sure that net codes are consecutive
// negative net code means that it has to be auto assigned
aNewElement->m_netCode = getFreeNetCode();
}
// net names & codes are supposed to be unique
assert( GetNetItem( aNewElement->GetNetname() ) == NULL );
assert( GetNetItem( aNewElement->GetNetCode() ) == NULL );
assert( GetNetItem( aNewElement->GetNetname() ) == nullptr );
assert( GetNetItem( aNewElement->GetNetCode() ) == nullptr );
// add an entry for fast look up by a net name using a map
m_netNames.insert( std::make_pair( aNewElement->GetNetname(), aNewElement ) );

View File

@ -4,7 +4,7 @@
* Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2015 CERN
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@gmail.com>
*
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
@ -438,7 +438,9 @@ bool BOARD_NETLIST_UPDATER::updateComponentPadConnections( FOOTPRINT* aFootprint
}
}
else
{
cachePinFunction( pad, pinFunction );
}
// Test if new footprint pad has no net (pads not on copper layers have no net).
if( !net.IsValid() || !pad->IsOnCopperLayer() )
@ -481,7 +483,9 @@ bool BOARD_NETLIST_UPDATER::updateComponentPadConnections( FOOTPRINT* aFootprint
}
else
{
cacheNetname( pad, wxEmptyString );
}
}
else // New footprint pad has a net.
{
@ -601,6 +605,7 @@ bool BOARD_NETLIST_UPDATER::updateCopperZoneNets( NETLIST& aNetlist )
for( int ii = 0; ii < (int) aNetlist.GetCount(); ii++ )
{
const COMPONENT* component = aNetlist.GetComponent( ii );
for( unsigned jj = 0; jj < component->GetNetCount(); jj++ )
{
const COMPONENT_NET& net = component->GetNet( jj );
@ -776,7 +781,7 @@ bool BOARD_NETLIST_UPDATER::deleteSinglePadNets()
int count = 0;
wxString netname;
wxString msg;
PAD* previouspad = NULL;
PAD* previouspad = nullptr;
// We need the pad list for next tests.

View File

@ -6,8 +6,8 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2011 Jean-Pierre Charras.
* Copyright (C) 2013-2016 Wayne Stambaugh <stambaughw@verizon.net>.
* Copyright (C) 1992-2016 KiCad Developers, see change_log.txt for contributors.
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@gmail.com>.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -37,7 +37,7 @@ void LEGACY_NETLIST_READER::LoadNetlist()
{
int state = 0;
bool is_comment = false;
COMPONENT* component = NULL;
COMPONENT* component = nullptr;
while( m_lineReader->ReadLine() )
{
@ -46,7 +46,7 @@ void LEGACY_NETLIST_READER::LoadNetlist()
if( is_comment ) // Comments in progress
{
// Test for end of the current comment
if( ( line = strchr( line, '}' ) ) == NULL )
if( ( line = strchr( line, '}' ) ) == nullptr )
continue;
is_comment = false;
@ -63,7 +63,7 @@ void LEGACY_NETLIST_READER::LoadNetlist()
continue;
}
if( ( line = strchr( line, '}' ) ) == NULL )
if( ( line = strchr( line, '}' ) ) == nullptr )
continue;
}
@ -81,7 +81,7 @@ void LEGACY_NETLIST_READER::LoadNetlist()
if( state >= 3 ) // Pad descriptions are read here.
{
wxASSERT( component != NULL );
wxASSERT( component != nullptr );
loadNet( line, component );
state--;
@ -113,7 +113,7 @@ COMPONENT* LEGACY_NETLIST_READER::loadComponent( char* aText )
// Sample component line: /68183921-93a5-49ac-91b0-49d05a0e1647 $noname R20 4.7K {Lib=R}
// Read time stamp (first word)
if( ( text = strtok( line, " ()\t\n" ) ) == NULL )
if( ( text = strtok( line, " ()\t\n" ) ) == nullptr )
{
msg = _( "Cannot parse time stamp in symbol section of netlist." );
THROW_PARSE_ERROR( msg, m_lineReader->GetSource(), line, m_lineReader->LineNumber(),
@ -123,7 +123,7 @@ COMPONENT* LEGACY_NETLIST_READER::loadComponent( char* aText )
KIID_PATH path( FROM_UTF8( text ) );
// Read footprint name (second word)
if( ( text = strtok( NULL, " ()\t\n" ) ) == NULL )
if( ( text = strtok( nullptr, " ()\t\n" ) ) == nullptr )
{
msg = _( "Cannot parse footprint name in symbol section of netlist." );
THROW_PARSE_ERROR( msg, m_lineReader->GetSource(), aText, m_lineReader->LineNumber(),
@ -137,7 +137,7 @@ COMPONENT* LEGACY_NETLIST_READER::loadComponent( char* aText )
footprintName = wxEmptyString;
// Read schematic reference designator (third word)
if( ( text = strtok( NULL, " ()\t\n" ) ) == NULL )
if( ( text = strtok( nullptr, " ()\t\n" ) ) == nullptr )
{
msg = _( "Cannot parse reference designator in symbol section of netlist." );
THROW_PARSE_ERROR( msg, m_lineReader->GetSource(), aText, m_lineReader->LineNumber(),
@ -147,7 +147,7 @@ COMPONENT* LEGACY_NETLIST_READER::loadComponent( char* aText )
reference = FROM_UTF8( text );
// Read schematic value (forth word)
if( ( text = strtok( NULL, " ()\t\n" ) ) == NULL )
if( ( text = strtok( nullptr, " ()\t\n" ) ) == nullptr )
{
msg = _( "Cannot parse value in symbol section of netlist." );
THROW_PARSE_ERROR( msg, m_lineReader->GetSource(), aText, m_lineReader->LineNumber(),
@ -158,7 +158,7 @@ COMPONENT* LEGACY_NETLIST_READER::loadComponent( char* aText )
// Read component name (fifth word) {Lib=C}
// This is an optional field (a comment), which does not always exists
if( ( text = strtok( NULL, " ()\t\n" ) ) != NULL )
if( ( text = strtok( nullptr, " ()\t\n" ) ) != nullptr )
{
name = FROM_UTF8( text ).AfterFirst( wxChar( '=' ) ).BeforeLast( wxChar( '}' ) );
}
@ -184,7 +184,7 @@ void LEGACY_NETLIST_READER::loadNet( char* aText, COMPONENT* aComponent )
strncpy( line, aText, sizeof( line ) );
line[ sizeof(line) - 1 ] = '\0';
if( ( p = strtok( line, " ()\t\n" ) ) == NULL )
if( ( p = strtok( line, " ()\t\n" ) ) == nullptr )
{
msg = _( "Cannot parse pin name in symbol net section of netlist." );
THROW_PARSE_ERROR( msg, m_lineReader->GetSource(), line, m_lineReader->LineNumber(),
@ -193,7 +193,7 @@ void LEGACY_NETLIST_READER::loadNet( char* aText, COMPONENT* aComponent )
wxString pinName = FROM_UTF8( p );
if( ( p = strtok( NULL, " ()\t\n" ) ) == NULL )
if( ( p = strtok( nullptr, " ()\t\n" ) ) == nullptr )
{
msg = _( "Cannot parse net name in symbol net section of netlist." );
THROW_PARSE_ERROR( msg, m_lineReader->GetSource(), line, m_lineReader->LineNumber(),
@ -214,15 +214,15 @@ void LEGACY_NETLIST_READER::loadFootprintFilters()
wxArrayString filters;
wxString cmpRef;
char* line;
COMPONENT* component = NULL; // Suppress compil warning
COMPONENT* component = nullptr; // Suppress compile warning
while( ( line = m_lineReader->ReadLine() ) != NULL )
while( ( line = m_lineReader->ReadLine() ) != nullptr )
{
if( strncasecmp( line, "$endlist", 8 ) == 0 ) // end of list for the current component
{
wxASSERT( component != NULL );
wxASSERT( component != nullptr );
component->SetFootprintFilters( filters );
component = NULL;
component = nullptr;
filters.Clear();
continue;
}
@ -240,7 +240,7 @@ void LEGACY_NETLIST_READER::loadFootprintFilters()
component = m_netlist->GetComponentByReference( cmpRef );
// Cannot happen if the netlist is valid.
if( component == NULL )
if( component == nullptr )
{
wxString msg;
msg.Printf( _( "Cannot find symbol %s in footprint filter section of netlist." ),
@ -259,3 +259,6 @@ void LEGACY_NETLIST_READER::loadFootprintFilters()
}
}
}
// LocalWords: EDA Charras pcb netlist noname cmp endlist
// LocalWords: endfootprintlist

View File

@ -5,8 +5,8 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2011 Jean-Pierre Charras.
* Copyright (C) 2013-2016 Wayne Stambaugh <stambaughw@verizon.net>.
* Copyright (C) 1992-2016 KiCad Developers, see change_log.txt for contributors.
* Copyright (C) 2013-2016 Wayne Stambaugh <stambaughw@gmail.com>.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -51,9 +51,11 @@ NETLIST_READER::NETLIST_FILE_T NETLIST_READER::GuessNetlistFileType( LINE_READER
// depending on the tool which created the file
wxRegEx reOrcad( wxT( "(?i)[ ]*\\([ \t]+{+" ), wxRE_ADVANCED );
wxASSERT( reOrcad.IsValid() );
// Our legacy netlist format starts by "# EESchema Netlist "
wxRegEx reLegacy( wxT( "(?i)#[ \t]+EESchema[ \t]+Netlist[ \t]+" ), wxRE_ADVANCED );
wxASSERT( reLegacy.IsValid() );
// Our new netlist format starts by "(export (version "
wxRegEx reKicad( wxT( "[ ]*\\(export[ ]+" ), wxRE_ADVANCED );
wxASSERT( reKicad.IsValid() );
@ -80,16 +82,17 @@ NETLIST_READER* NETLIST_READER::GetNetlistReader( NETLIST* aNetlist,
const wxString& aNetlistFileName,
const wxString& aCompFootprintFileName )
{
wxASSERT( aNetlist != NULL );
wxASSERT( aNetlist != nullptr );
std::unique_ptr<FILE_LINE_READER> file_rdr = std::make_unique<FILE_LINE_READER>( aNetlistFileName );
std::unique_ptr<FILE_LINE_READER> file_rdr =
std::make_unique<FILE_LINE_READER>( aNetlistFileName );
NETLIST_FILE_T type = GuessNetlistFileType( file_rdr.get() );
file_rdr->Rewind();
// The component footprint link reader is NULL if no file name was specified.
std::unique_ptr<CMP_READER> cmp_rdr( aCompFootprintFileName.IsEmpty() ?
NULL :
nullptr :
new CMP_READER( new FILE_LINE_READER( aCompFootprintFileName ) ) );
switch( type )
@ -105,13 +108,13 @@ NETLIST_READER* NETLIST_READER::GetNetlistReader( NETLIST* aNetlist,
break;
}
return NULL;
return nullptr;
}
bool CMP_READER::Load( NETLIST* aNetlist )
{
wxCHECK_MSG( aNetlist != NULL,true, wxT( "No netlist passed to CMP_READER::Load()" ) );
wxCHECK_MSG( aNetlist != nullptr, true, wxT( "No netlist passed to CMP_READER::Load()" ) );
wxString reference; // Stores value read from line like Reference = BUS1;
wxString timestamp; // Stores value read from line like TimeStamp = /32307DE2/AA450F67;

View File

@ -45,7 +45,7 @@ void COMPONENT::SetFootprint( FOOTPRINT* aFootprint )
if( !m_kiids.empty() )
path.push_back( m_kiids.front() );
if( aFootprint == NULL )
if( aFootprint == nullptr )
return;
aFootprint->SetReference( m_reference );
@ -150,7 +150,7 @@ void NETLIST::AddComponent( COMPONENT* aComponent )
COMPONENT* NETLIST::GetComponentByReference( const wxString& aReference )
{
COMPONENT* component = NULL;
COMPONENT* component = nullptr;
for( unsigned i = 0; i < m_components.size(); i++ )
{

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -54,6 +54,7 @@
using KIGFX::PCB_PAINTER;
using KIGFX::PCB_RENDER_SETTINGS;
PAD::PAD( FOOTPRINT* parent ) :
BOARD_CONNECTED_ITEM( parent, PCB_PAD_T )
{
@ -67,21 +68,23 @@ PAD::PAD( FOOTPRINT* parent ) :
m_pos = GetParent()->GetPosition();
}
SetShape( PAD_SHAPE::CIRCLE ); // Default pad shape is PAD_CIRCLE.
SetAnchorPadShape( PAD_SHAPE::CIRCLE ); // Default shape for custom shaped pads
// is PAD_CIRCLE.
SetDrillShape( PAD_DRILL_SHAPE_CIRCLE ); // Default pad drill shape is a circle.
m_attribute = PAD_ATTRIB::PTH; // Default pad type is plated through hole
SetProperty( PAD_PROP::NONE ); // no special fabrication property
SetShape( PAD_SHAPE::CIRCLE ); // Default pad shape is PAD_CIRCLE.
SetAnchorPadShape( PAD_SHAPE::CIRCLE ); // Default shape for custom shaped pads
// is PAD_CIRCLE.
SetDrillShape( PAD_DRILL_SHAPE_CIRCLE ); // Default pad drill shape is a circle.
m_attribute = PAD_ATTRIB::PTH; // Default pad type is plated through hole
SetProperty( PAD_PROP::NONE ); // no special fabrication property
m_localClearance = 0;
m_localSolderMaskMargin = 0;
m_localSolderPasteMargin = 0;
m_localSolderPasteMarginRatio = 0.0;
// Parameters for round rect only:
m_roundedCornerScale = 0.25; // from IPC-7351C standard
m_roundedCornerScale = 0.25; // from IPC-7351C standard
// Parameters for chamfered rect only:
m_chamferScale = 0.2; // Size of chamfer: ratio of smallest of X,Y size
m_chamferPositions = RECT_NO_CHAMFER; // No chamfered corner
m_chamferScale = 0.2; // Size of chamfer: ratio of smallest of X,Y size
m_chamferPositions = RECT_NO_CHAMFER; // No chamfered corner
m_zoneConnection = ZONE_CONNECTION::INHERITED; // Use parent setting by default
m_thermalWidth = 0; // Use parent setting by default
@ -221,15 +224,15 @@ bool PAD::FlashLayer( int aLayer ) const
if( GetAttribute() != PAD_ATTRIB::PTH )
return IsOnLayer( static_cast<PCB_LAYER_ID>( aLayer ) );
/// Heatsink pads always get copper
/// Heat sink pads always get copper
if( GetProperty() == PAD_PROP::HEATSINK )
return IsOnLayer( static_cast<PCB_LAYER_ID>( aLayer ) );
if( !m_removeUnconnectedLayer )
return IsOnLayer( static_cast<PCB_LAYER_ID>( aLayer ) );
/// Plated through hole pads need copper on the top/bottom layers for proper soldering
/// Unless the user has removed them in the pad dialog
// Plated through hole pads need copper on the top/bottom layers for proper soldering
// Unless the user has removed them in the pad dialog
if( m_keepTopBottomLayer && ( aLayer == F_Cu || aLayer == B_Cu ) )
return IsOnLayer( static_cast<PCB_LAYER_ID>( aLayer ) );
@ -338,7 +341,9 @@ void PAD::BuildEffectiveShapes( PCB_LAYER_ID aLayer ) const
case PAD_SHAPE::OVAL:
if( m_size.x == m_size.y ) // the oval pad is in fact a circle
{
add( new SHAPE_CIRCLE( shapePos, m_size.x / 2 ) );
}
else
{
wxSize half_size = m_size / 2;
@ -347,6 +352,7 @@ void PAD::BuildEffectiveShapes( PCB_LAYER_ID aLayer ) const
RotatePoint( &half_len, m_orient );
add( new SHAPE_SEGMENT( shapePos - half_len, shapePos + half_len, half_width * 2 ) );
}
break;
case PAD_SHAPE::RECT:
@ -460,7 +466,6 @@ void PAD::BuildEffectiveShapes( PCB_LAYER_ID aLayer ) const
wxSize( bbox.GetWidth(), bbox.GetHeight() ) );
// Hole shape
//
wxSize half_size = m_drill / 2;
int half_width = std::min( half_size.x, half_size.y );
wxPoint half_len( half_size.x - half_width, half_size.y - half_width );
@ -471,7 +476,6 @@ void PAD::BuildEffectiveShapes( PCB_LAYER_ID aLayer ) const
half_width * 2 );
// All done
//
m_shapesDirty = false;
}
@ -489,7 +493,6 @@ void PAD::BuildEffectivePolygon() const
int maxError = board ? board->GetDesignSettings().m_MaxError : ARC_HIGH_DEF;
// Polygon
//
m_effectivePolygon = std::make_shared<SHAPE_POLY_SET>();
TransformShapeWithClearanceToPolygon( *m_effectivePolygon, UNDEFINED_LAYER, 0, maxError,
ERROR_INSIDE );
@ -498,7 +501,6 @@ void PAD::BuildEffectivePolygon() const
//
// PADSTACKS TODO: these will both need to cycle through all layers to get the largest
// values....
//
m_effectiveBoundingRadius = 0;
for( int cnt = 0; cnt < m_effectivePolygon->OutlineCount(); ++cnt )
@ -513,7 +515,6 @@ void PAD::BuildEffectivePolygon() const
}
// All done
//
m_polyDirty = false;
}
@ -533,7 +534,7 @@ void PAD::SetDrawCoord()
m_pos = m_pos0;
if( parentFootprint == NULL )
if( parentFootprint == nullptr )
return;
double angle = parentFootprint->GetOrientation();
@ -549,7 +550,7 @@ void PAD::SetLocalCoord()
{
FOOTPRINT* parentFootprint = static_cast<FOOTPRINT*>( m_parent );
if( parentFootprint == NULL )
if( parentFootprint == nullptr )
{
m_pos0 = m_pos;
return;
@ -646,7 +647,6 @@ void PAD::Flip( const wxPoint& aCentre, bool aFlipLeftRight )
}
// Flip (mirror) the basic shapes (primitives), in custom pads
void PAD::FlipPrimitives( bool aFlipLeftRight )
{
for( std::shared_ptr<PCB_SHAPE>& primitive : m_editPrimitives )
@ -656,7 +656,6 @@ void PAD::FlipPrimitives( bool aFlipLeftRight )
}
// Returns the position of the pad.
wxPoint PAD::ShapePos() const
{
if( m_offset.x == 0 && m_offset.y == 0 )
@ -695,8 +694,6 @@ int PAD::GetLocalClearance( wxString* aSource ) const
}
// Mask margins handling:
int PAD::GetSolderMaskMargin() const
{
// The pad inherits the margin only to calculate a default shape,
@ -897,7 +894,8 @@ void PAD::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>&
aList.emplace_back( ShowPadShape(), props );
if( ( GetShape() == PAD_SHAPE::CIRCLE || GetShape() == PAD_SHAPE::OVAL ) && m_size.x == m_size.y )
if( ( GetShape() == PAD_SHAPE::CIRCLE || GetShape() == PAD_SHAPE::OVAL ) &&
m_size.x == m_size.y )
{
aList.emplace_back( _( "Diameter" ), MessageTextFromValue( units, m_size.x ) );
}
@ -1012,7 +1010,8 @@ int PAD::Compare( const PAD* padref, const PAD* padcmp )
{
int diff;
if( ( diff = static_cast<int>( padref->GetShape() ) - static_cast<int>( padcmp->GetShape() ) ) != 0 )
if( ( diff = static_cast<int>( padref->GetShape() ) -
static_cast<int>( padcmp->GetShape() ) ) != 0 )
return diff;
if( ( diff = padref->GetDrillShape() - padcmp->GetDrillShape() ) != 0)
@ -1042,7 +1041,7 @@ int PAD::Compare( const PAD* padref, const PAD* padcmp )
if( ( diff = padref->m_deltaSize.y - padcmp->m_deltaSize.y ) != 0 )
return diff;
// TODO: test custom shapes
// TODO: test custom shapes
// Dick: specctra_export needs this
// Lorenzo: gencad also needs it to implement padstacks!
@ -1087,7 +1086,7 @@ wxString PAD::ShowPadShape() const
case PAD_SHAPE::ROUNDRECT: return _( "Roundrect" );
case PAD_SHAPE::CHAMFERED_RECT: return _( "Chamferedrect" );
case PAD_SHAPE::CUSTOM: return _( "CustomShape" );
default: return wxT( "???" );
default: return wxT( "???" );
}
}
@ -1100,7 +1099,7 @@ wxString PAD::ShowPadAttr() const
case PAD_ATTRIB::SMD: return _( "SMD" );
case PAD_ATTRIB::CONN: return _( "Conn" );
case PAD_ATTRIB::NPTH: return _( "NPTH" );
default: return wxT( "???" );
default: return wxT( "???" );
}
}
@ -1532,7 +1531,7 @@ static struct PAD_DESC
propMgr.AddProperty( new PROPERTY<PAD, wxString>( _HKI( "Parent" ),
NO_SETTER( PAD, wxString ), &PAD::GetParentAsString ) );
// TODO delta, dirill shape offset, layerset, zone connection
// TODO delta, drill shape offset, layer set, zone connection
}
} _PAD_DESC;

View File

@ -4,7 +4,7 @@
* Copyright (C) 2018 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -153,7 +153,7 @@ FP_LIB_TABLE* PROJECT::PcbFootprintLibs()
}
catch( ... )
{
DisplayErrorMessage( NULL, _( "Error loading project footprint library table." ) );
DisplayErrorMessage( nullptr, _( "Error loading project footprint library table." ) );
}
}
@ -465,7 +465,6 @@ EDA_3D_VIEWER_FRAME* PCB_BASE_FRAME::CreateAndShow3D_Frame()
}
// Note: virtual, overridden in PCB_EDIT_FRAME;
void PCB_BASE_FRAME::SwitchLayer( wxDC* DC, PCB_LAYER_ID layer )
{
PCB_LAYER_ID preslayer = GetActiveLayer();
@ -533,9 +532,6 @@ GENERAL_COLLECTORS_GUIDE PCB_BASE_FRAME::GetCollectorsGuide()
}
/*
* Display the grid status.
*/
void PCB_BASE_FRAME::DisplayGridMsg()
{
wxString line;
@ -548,9 +544,6 @@ void PCB_BASE_FRAME::DisplayGridMsg()
}
/*
* Update the status bar information.
*/
void PCB_BASE_FRAME::UpdateStatusBar()
{
EDA_DRAW_FRAME::UpdateStatusBar();
@ -691,6 +684,7 @@ FOOTPRINT_EDITOR_SETTINGS* PCB_BASE_FRAME::GetFootprintEditorSettings() const
return Pgm().GetSettingsManager().GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>();
}
MAGNETIC_SETTINGS* PCB_BASE_FRAME::GetMagneticItemsSettings()
{
wxCHECK( m_settings, nullptr );

View File

@ -3,8 +3,8 @@
*
* Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2012 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2012 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -289,12 +289,13 @@ void PCB_DIMENSION_BASE::Mirror( const wxPoint& axis_pos, bool aMirrorLeftRight
}
void PCB_DIMENSION_BASE::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
void PCB_DIMENSION_BASE::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame,
std::vector<MSG_PANEL_ITEM>& aList )
{
// for now, display only the text within the DIMENSION using class PCB_TEXT.
wxString msg;
wxCHECK_RET( m_parent != NULL, wxT( "PCB_TEXT::GetMsgPanelInfo() m_Parent is NULL." ) );
wxCHECK_RET( m_parent != nullptr, wxT( "PCB_TEXT::GetMsgPanelInfo() m_Parent is NULL." ) );
aList.emplace_back( _( "Dimension" ), m_text.GetShownText() );
@ -436,9 +437,7 @@ const EDA_RECT PCB_DIMENSION_BASE::GetBoundingBox() const
wxString PCB_DIMENSION_BASE::GetSelectMenuText( EDA_UNITS aUnits ) const
{
return wxString::Format( _( "Dimension '%s' on %s" ),
GetText(),
GetLayerName() );
return wxString::Format( _( "Dimension '%s' on %s" ), GetText(), GetLayerName() );
}
@ -471,6 +470,7 @@ OPT_VECTOR2I PCB_DIMENSION_BASE::segPolyIntersection( const SHAPE_POLY_SET& aPol
endpoint = *intersection;
}
}
if( start == endpoint )
return NULLOPT;
@ -529,6 +529,7 @@ void PCB_DIM_ALIGNED::SwapData( BOARD_ITEM* aImage )
Update();
}
BITMAPS PCB_DIM_ALIGNED::GetMenuImage() const
{
return BITMAPS::add_aligned_dimension;
@ -830,6 +831,7 @@ void PCB_DIM_ORTHOGONAL::updateText()
int textOffsetDistance = m_text.GetEffectiveTextPenWidth() + m_text.GetTextHeight();
VECTOR2I textOffset;
if( m_orientation == DIR::HORIZONTAL )
textOffset.y = -textOffsetDistance;
else
@ -847,6 +849,7 @@ void PCB_DIM_ORTHOGONAL::updateText()
if( m_keepTextAligned )
{
double textAngle;
if( abs( crossbarCenter.x ) > abs( crossbarCenter.y ) )
textAngle = 0;
else

View File

@ -2,6 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014-2017 CERN
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
@ -52,6 +53,7 @@
using namespace std::placeholders;
const LAYER_NUM GAL_LAYER_ORDER[] =
{
LAYER_GP_OVERLAY,
@ -147,6 +149,7 @@ PCB_DRAW_PANEL_GAL::PCB_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWin
m_painter = std::make_unique<KIGFX::PCB_PAINTER>( m_gal );
m_view->SetPainter( m_painter.get() );
// This fixes the zoom in and zoom out limits:
m_view->SetScaleLimits( ZOOM_MAX_LIMIT_PCBNEW, ZOOM_MIN_LIMIT_PCBNEW );
@ -291,7 +294,8 @@ void PCB_DRAW_PANEL_GAL::SetHighContrastLayer( PCB_LAYER_ID aLayer )
LAYER_PAD_FR_NETNAMES, LAYER_PAD_BK_NETNAMES, LAYER_PAD_NETNAMES,
ZONE_LAYER_FOR( aLayer ),
LAYER_PADS_TH, LAYER_PAD_PLATEDHOLES, LAYER_PAD_HOLEWALLS, LAYER_NON_PLATEDHOLES,
LAYER_VIA_THROUGH, LAYER_VIA_BBLIND, LAYER_VIA_MICROVIA, LAYER_VIA_HOLES, LAYER_VIA_HOLEWALLS,
LAYER_VIA_THROUGH, LAYER_VIA_BBLIND, LAYER_VIA_MICROVIA, LAYER_VIA_HOLES,
LAYER_VIA_HOLEWALLS,
LAYER_DRC_ERROR, LAYER_DRC_WARNING, LAYER_DRC_EXCLUSION, LAYER_MARKER_SHADOWS,
LAYER_SELECT_OVERLAY, LAYER_GP_OVERLAY,
LAYER_RATSNEST, LAYER_CURSOR, LAYER_ANCHOR
@ -325,7 +329,8 @@ void PCB_DRAW_PANEL_GAL::SetTopLayer( PCB_LAYER_ID aLayer )
// Layers that should always have on-top attribute enabled
const std::vector<LAYER_NUM> layers = {
LAYER_VIA_THROUGH, LAYER_VIA_BBLIND, LAYER_VIA_MICROVIA, LAYER_VIA_HOLES, LAYER_VIA_HOLEWALLS,
LAYER_VIA_THROUGH, LAYER_VIA_BBLIND, LAYER_VIA_MICROVIA, LAYER_VIA_HOLES,
LAYER_VIA_HOLEWALLS,
LAYER_VIA_NETNAMES,
LAYER_PADS_TH, LAYER_PAD_PLATEDHOLES, LAYER_PAD_HOLEWALLS, LAYER_NON_PLATEDHOLES,
LAYER_PAD_NETNAMES,
@ -348,7 +353,7 @@ void PCB_DRAW_PANEL_GAL::SetTopLayer( PCB_LAYER_ID aLayer )
LAYER_PAD_BK_NETNAMES, NETNAMES_LAYER_INDEX( B_Cu )
};
const std::vector<LAYER_NUM>* extraLayers = NULL;
const std::vector<LAYER_NUM>* extraLayers = nullptr;
// Bring a few more extra layers to the top depending on the selected board side
if( IsFrontLayer( aLayer ) )
@ -479,7 +484,7 @@ void PCB_DRAW_PANEL_GAL::OnShow()
try
{
// Check if the current rendering backend can be properly initialized
// Check if the current rendering back end can be properly initialized
m_view->UpdateItems();
}
catch( const std::runtime_error& e )
@ -563,9 +568,13 @@ void PCB_DRAW_PANEL_GAL::setDefaultLayerDeps()
m_view->SetRequired( GetNetnameLayer( layer ), layer );
}
else if( IsNonCopperLayer( layer ) )
{
m_view->SetRequired( ZONE_LAYER_FOR( layer ), layer );
}
else if( IsNetnameLayer( layer ) )
{
m_view->SetLayerDisplayOnly( layer );
}
}
m_view->SetLayerTarget( LAYER_ANCHOR, KIGFX::TARGET_NONCACHED );

View File

@ -176,9 +176,9 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
{
m_maximizeByDefault = true;
m_showBorderAndTitleBlock = true; // true to display sheet references
m_SelTrackWidthBox = NULL;
m_SelViaSizeBox = NULL;
m_SelLayerBox = NULL;
m_SelTrackWidthBox = nullptr;
m_SelViaSizeBox = nullptr;
m_SelLayerBox = nullptr;
m_show_layer_manager_tools = true;
m_hasAutoSave = true;
@ -429,7 +429,7 @@ void PCB_EDIT_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
BASE_SCREEN* screen = GetScreen();
if( screen != NULL )
if( screen != nullptr )
{
drawingSheet->SetPageNumber(TO_UTF8( screen->GetPageNumber() ) );
drawingSheet->SetSheetCount( screen->GetPageCount() );
@ -553,7 +553,7 @@ void PCB_EDIT_FRAME::setupUIConditions()
if( SCRIPTING::IsWxAvailable() )
mgr->SetConditions( PCB_ACTIONS::showPythonConsole, CHECK( cond.ScriptingConsoleVisible() ) );
auto enableZoneControlConition =
[this] ( const SELECTION& )
{
@ -1279,6 +1279,7 @@ void PCB_EDIT_FRAME::UpdateUserInterface()
{
// Canonical name
layerEnum.Map( *seq, LSET::Name( *seq ) );
// User name
layerEnum.Map( *seq, GetBoard()->GetLayerName( *seq ) );
}
@ -1511,7 +1512,7 @@ void PCB_EDIT_FRAME::PythonSyncEnvironmentVariables()
for( auto& var : vars )
UpdatePythonEnvVar( var.first, var.second.GetValue() );
// Because the env vars can de modified by the python scripts (rewritten in UTF8),
// Because the env vars can be modified by the python scripts (rewritten in UTF8),
// regenerate them (in Unicode) for our normal environment
for( auto& var : vars )
wxSetEnv( var.first, var.second.GetValue() );
@ -1532,7 +1533,7 @@ void PCB_EDIT_FRAME::PythonSyncProjectName()
void PCB_EDIT_FRAME::ShowFootprintPropertiesDialog( FOOTPRINT* aFootprint )
{
if( aFootprint == NULL )
if( aFootprint == nullptr )
return;
DIALOG_FOOTPRINT_PROPERTIES dlg( this, aFootprint );

View File

@ -412,7 +412,7 @@ public:
* \a aStoreInNewLib as true.
*/
void ExportFootprintsToLibrary( bool aStoreInNewLib, const wxString& aLibName = wxEmptyString,
wxString* aLibPath = NULL );
wxString* aLibPath = nullptr );
/**
* Create a BOM file from the current loaded board.

View File

@ -771,7 +771,7 @@ void PCB_PAINTER::draw( const PCB_VIA* aVia, int aLayer )
// Default font settings
m_gal->ResetTextAttributes();
m_gal->SetStrokeColor( m_pcbSettings.GetColor( NULL, aLayer ) );
m_gal->SetStrokeColor( m_pcbSettings.GetColor( nullptr, aLayer ) );
// Set the text position to the pad shape position (the pad position is not the best place)
VECTOR2D textpos( 0.0, 0.0 );
@ -1006,6 +1006,7 @@ void PCB_PAINTER::draw( const PAD* aPad, int aLayer )
m_gal->Restore();
}
return;
}
else if( aLayer == LAYER_PAD_HOLEWALLS )
@ -1157,8 +1158,9 @@ void PCB_PAINTER::draw( const PAD* aPad, int aLayer )
if( effectiveWidth > 0 )
m_gal->DrawSegment( seg->GetSeg().A, seg->GetSeg().B, effectiveWidth );
}
break;
}
case SH_CIRCLE:
{
@ -1167,8 +1169,9 @@ void PCB_PAINTER::draw( const PAD* aPad, int aLayer )
if( effectiveRadius > 0 )
m_gal->DrawCircle( circle->GetCenter(), effectiveRadius );
}
break;
}
case SH_RECT:
{
@ -1207,8 +1210,9 @@ void PCB_PAINTER::draw( const PAD* aPad, int aLayer )
{
m_gal->DrawRectangle( r->GetPosition(), r->GetPosition() + r->GetSize() );
}
}
break;
}
case SH_SIMPLE:
{
@ -1242,8 +1246,9 @@ void PCB_PAINTER::draw( const PAD* aPad, int aLayer )
m_gal->DrawSegment( seg.A, seg.B, margin.x * 2 );
}
}
}
break;
}
default:
// Better not get here; we already pre-flighted the shapes...
@ -1360,6 +1365,7 @@ void PCB_PAINTER::draw( const PCB_SHAPE* aShape, int aLayer )
m_gal->DrawSegment( start, end, thickness );
}
break;
case PCB_SHAPE_TYPE::RECT:
@ -1397,8 +1403,9 @@ void PCB_PAINTER::draw( const PCB_SHAPE* aShape, int aLayer )
m_gal->DrawPolygon( poly );
}
}
}
break;
}
case PCB_SHAPE_TYPE::ARC:
if( sketch )
@ -1488,8 +1495,9 @@ void PCB_PAINTER::draw( const PCB_SHAPE* aShape, int aLayer )
if( parentFootprint )
m_gal->Restore();
}
break;
}
case PCB_SHAPE_TYPE::CURVE:
if( sketch )
@ -1514,6 +1522,7 @@ void PCB_PAINTER::draw( const PCB_SHAPE* aShape, int aLayer )
VECTOR2D( aShape->GetBezierC2() ),
VECTOR2D( aShape->GetEnd() ), thickness );
}
break;
case PCB_SHAPE_TYPE::LAST:

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2018 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -70,7 +70,7 @@ static bool setInt( int* aTarget, int aValue, int aMin, int aMax )
temp = aMax;
*aTarget = temp;
return (temp == aValue);
return ( temp == aValue );
}
@ -84,10 +84,9 @@ static bool setDouble( double* aTarget, double aValue, double aMin, double aMax
temp = aMax;
*aTarget = temp;
return (temp == aValue);
return ( temp == aValue );
}
// PCB_PLOT_PARAMS
PCB_PLOT_PARAMS::PCB_PLOT_PARAMS()
{
@ -97,6 +96,7 @@ PCB_PLOT_PARAMS::PCB_PLOT_PARAMS()
m_includeGerberNetlistInfo = true;
m_createGerberJobFile = true;
m_gerberPrecision = gbrDefaultPrecision;
// we used 0.1mils for SVG step before, but nm precision is more accurate, so we use nm
m_svgPrecision = SVG_PRECISION_DEFAULT;
m_svgUseInch = false;
@ -131,19 +131,22 @@ PCB_PLOT_PARAMS::PCB_PLOT_PARAMS()
m_layerSelection = LSET( 7, F_SilkS, B_SilkS, F_Mask, B_Mask,
F_Paste, B_Paste, Edge_Cuts )
| LSET::AllCuMask();
// This parameter controls if the NPTH pads will be plotted or not
// it is a "local" parameter
m_skipNPTH_Pads = false;
m_sketchPadLineWidth = Millimeter2iu( 0.1 ); // line width to plot items in outline mode
// line width to plot items in outline mode.
m_sketchPadLineWidth = Millimeter2iu( 0.1 );
m_default_colors = std::make_shared<COLOR_SETTINGS>();
m_colors = m_default_colors.get();
}
void PCB_PLOT_PARAMS::SetGerberPrecision( int aPrecision )
{
// Currently geber files use mm.
// Currently Gerber files use mm.
// accepted precision is only 6 (max value, this is the resolution of Pcbnew)
// or 5, min value for professional boards, when 6 creates problems
// to board makers.
@ -152,13 +155,14 @@ void PCB_PLOT_PARAMS::SetGerberPrecision( int aPrecision )
gbrDefaultPrecision;
}
void PCB_PLOT_PARAMS::SetSvgPrecision( unsigned aPrecision, bool aUseInch )
{
m_svgUseInch = aUseInch;
m_svgPrecision = Clamp( SVG_PRECISION_MIN, aPrecision, SVG_PRECISION_MAX );
}
// PLEASE NOTE: only plot dialog options are processed
void PCB_PLOT_PARAMS::Format( OUTPUTFORMATTER* aFormatter,
int aNestLevel, int aControl ) const
{
@ -185,8 +189,9 @@ void PCB_PLOT_PARAMS::Format( OUTPUTFORMATTER* aFormatter,
aFormatter->Print( aNestLevel+1, "(%s %s)\n", getTokenName( T_creategerberjobfile ),
GetCreateGerberJobFile() ? trueStr : falseStr );
if( m_gerberPrecision != gbrDefaultPrecision ) // save this option only if it is not the default value,
// to avoid incompatibility with older Pcbnew version
// save this option only if it is not the default value,
// to avoid incompatibility with older Pcbnew version
if( m_gerberPrecision != gbrDefaultPrecision )
aFormatter->Print( aNestLevel+1, "(%s %d)\n",
getTokenName( T_gerberprecision ), m_gerberPrecision );
@ -262,76 +267,112 @@ bool PCB_PLOT_PARAMS::IsSameAs( const PCB_PLOT_PARAMS &aPcbPlotParams ) const
{
if( m_layerSelection != aPcbPlotParams.m_layerSelection )
return false;
if( m_useGerberProtelExtensions != aPcbPlotParams.m_useGerberProtelExtensions )
return false;
if( m_gerberDisableApertMacros != aPcbPlotParams.m_gerberDisableApertMacros )
return false;
if( m_useGerberX2format != aPcbPlotParams.m_useGerberX2format )
return false;
if( m_includeGerberNetlistInfo != aPcbPlotParams.m_includeGerberNetlistInfo )
return false;
if( m_createGerberJobFile != aPcbPlotParams.m_createGerberJobFile )
return false;
if( m_gerberPrecision != aPcbPlotParams.m_gerberPrecision )
return false;
if( m_excludeEdgeLayer != aPcbPlotParams.m_excludeEdgeLayer )
return false;
if( m_plotFrameRef != aPcbPlotParams.m_plotFrameRef )
return false;
if( m_plotViaOnMaskLayer != aPcbPlotParams.m_plotViaOnMaskLayer )
return false;
if( m_plotMode != aPcbPlotParams.m_plotMode )
return false;
if( m_DXFplotPolygonMode != aPcbPlotParams.m_DXFplotPolygonMode )
return false;
if( m_DXFplotUnits != aPcbPlotParams.m_DXFplotUnits )
return false;
if( m_svgPrecision != aPcbPlotParams.m_svgPrecision )
return false;
if( m_svgUseInch != aPcbPlotParams.m_svgUseInch )
return false;
if( m_useAuxOrigin != aPcbPlotParams.m_useAuxOrigin )
return false;
if( m_HPGLPenNum != aPcbPlotParams.m_HPGLPenNum )
return false;
if( m_HPGLPenSpeed != aPcbPlotParams.m_HPGLPenSpeed )
return false;
if( m_HPGLPenDiam != aPcbPlotParams.m_HPGLPenDiam )
return false;
if( m_negative != aPcbPlotParams.m_negative )
return false;
if( m_A4Output != aPcbPlotParams.m_A4Output )
return false;
if( m_plotReference != aPcbPlotParams.m_plotReference )
return false;
if( m_plotValue != aPcbPlotParams.m_plotValue )
return false;
if( m_plotInvisibleText != aPcbPlotParams.m_plotInvisibleText )
return false;
if( m_sketchPadsOnFabLayers != aPcbPlotParams.m_sketchPadsOnFabLayers )
return false;
if( m_subtractMaskFromSilk != aPcbPlotParams.m_subtractMaskFromSilk )
return false;
if( m_format != aPcbPlotParams.m_format )
return false;
if( m_mirror != aPcbPlotParams.m_mirror )
return false;
if( m_drillMarks != aPcbPlotParams.m_drillMarks )
return false;
if( m_scaleSelection != aPcbPlotParams.m_scaleSelection )
return false;
if( m_autoScale != aPcbPlotParams.m_autoScale )
return false;
if( m_scale != aPcbPlotParams.m_scale )
return false;
if( m_fineScaleAdjustX != aPcbPlotParams.m_fineScaleAdjustX )
return false;
if( m_fineScaleAdjustY != aPcbPlotParams.m_fineScaleAdjustY )
return false;
if( m_widthAdjust != aPcbPlotParams.m_widthAdjust )
return false;
if( m_textMode != aPcbPlotParams.m_textMode )
return false;
if( !m_outputDirectory.IsSameAs( aPcbPlotParams.m_outputDirectory ) )
return false;
@ -351,8 +392,6 @@ bool PCB_PLOT_PARAMS::SetHPGLPenSpeed( int aValue )
}
// PCB_PLOT_PARAMS_PARSER
PCB_PLOT_PARAMS_PARSER::PCB_PLOT_PARAMS_PARSER( LINE_READER* aReader ) :
PCB_PLOT_PARAMS_LEXER( aReader )
{
@ -385,29 +424,31 @@ void PCB_PLOT_PARAMS_PARSER::Parse( PCB_PLOT_PARAMS* aPcbPlotParams )
switch( token )
{
case T_layerselection:
{
token = NeedSYMBOLorNUMBER();
const std::string& cur = CurStr();
if( token == T_NUMBER ) // pretty 3 format had legacy Cu stack.
{
token = NeedSYMBOLorNUMBER();
const std::string& cur = CurStr();
if( token == T_NUMBER ) // pretty 3 format had legacy Cu stack.
{
// It's not possible to convert a legacy Cu layer number to a new Cu layer
// number without knowing the number or total Cu layers in the legacy board.
// We do not have that information here, so simply set all layers ON. User
// can turn them off in the UI.
aPcbPlotParams->m_layerSelection = LSET( 2, F_SilkS, B_SilkS)
| LSET::AllCuMask();
}
else if( cur.find_first_of( "0x" ) == 0 ) // pretty ver. 4.
{
// skip the leading 2 0x bytes.
aPcbPlotParams->m_layerSelection.ParseHex( cur.c_str()+2, cur.size()-2 );
}
else
Expecting( "integer or hex layerSelection" );
// It's not possible to convert a legacy Cu layer number to a new Cu layer
// number without knowing the number or total Cu layers in the legacy board.
// We do not have that information here, so simply set all layers ON. User
// can turn them off in the UI.
aPcbPlotParams->m_layerSelection = LSET( 2, F_SilkS, B_SilkS ) | LSET::AllCuMask();
}
else if( cur.find_first_of( "0x" ) == 0 ) // pretty ver. 4.
{
// skip the leading 2 0x bytes.
aPcbPlotParams->m_layerSelection.ParseHex( cur.c_str() + 2, cur.size() - 2 );
}
else
{
Expecting( "integer or hex layerSelection" );
}
break;
}
case T_disableapertmacros:
aPcbPlotParams->m_gerberDisableApertMacros = parseBool();
@ -430,7 +471,7 @@ void PCB_PLOT_PARAMS_PARSER::Parse( PCB_PLOT_PARAMS* aPcbPlotParams )
break;
case T_gerberprecision:
aPcbPlotParams->m_gerberPrecision = parseInt( gbrDefaultPrecision-1,
aPcbPlotParams->m_gerberPrecision = parseInt( gbrDefaultPrecision - 1,
gbrDefaultPrecision);
break;
@ -467,13 +508,11 @@ void PCB_PLOT_PARAMS_PARSER::Parse( PCB_PLOT_PARAMS* aPcbPlotParams )
break;
case T_hpglpennumber:
aPcbPlotParams->m_HPGLPenNum = parseInt( HPGL_PEN_NUMBER_MIN,
HPGL_PEN_NUMBER_MAX );
aPcbPlotParams->m_HPGLPenNum = parseInt( HPGL_PEN_NUMBER_MIN, HPGL_PEN_NUMBER_MAX );
break;
case T_hpglpenspeed:
aPcbPlotParams->m_HPGLPenSpeed = parseInt( HPGL_PEN_SPEED_MIN,
HPGL_PEN_SPEED_MAX );
aPcbPlotParams->m_HPGLPenSpeed = parseInt( HPGL_PEN_SPEED_MIN, HPGL_PEN_SPEED_MAX );
break;
case T_hpglpendiameter:
@ -481,7 +520,7 @@ void PCB_PLOT_PARAMS_PARSER::Parse( PCB_PLOT_PARAMS* aPcbPlotParams )
break;
case T_hpglpenoverlay:
// No more used. juste here for compatibility with old versions
// No more used. just here for compatibility with old versions
parseInt( 0, HPGL_PEN_DIAMETER_MAX );
break;
@ -599,7 +638,7 @@ double PCB_PLOT_PARAMS_PARSER::parseDouble()
if( token != T_NUMBER )
Expecting( T_NUMBER );
double val = strtod( CurText(), NULL );
double val = strtod( CurText(), nullptr );
return val;
}

View File

@ -3,8 +3,8 @@
*
* Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -104,7 +104,7 @@ double PCB_SHAPE::GetLength() const
default:
wxASSERT_MSG( false, "PCB_SHAPE::GetLength not implemented for shape"
+ ShowShape( GetShape() ) );
+ ShowShape( GetShape() ) );
break;
}
@ -188,8 +188,8 @@ void PCB_SHAPE::Scale( double aScale )
}
SetPolyPoints( pts );
}
break;
}
default:
break;
@ -400,7 +400,7 @@ wxPoint PCB_SHAPE::GetArcMid() const
case PCB_SHAPE_TYPE::ARC:
// rotate the starting point of the arc, given by m_End, through half
// the angle m_Angle to get the middle of the arc.
// m_Start is the arc centre
// m_Start is the arc center
endPoint = m_end; // m_End = start point of arc
RotatePoint( &endPoint, m_start, -m_angle / 2.0 );
break;
@ -420,13 +420,14 @@ double PCB_SHAPE::GetArcAngleStart() const
GetArcStart().x - GetCenter().x );
// Normalize it to 0 ... 360 deg, to avoid discontinuity for angles near 180 deg
// because 180 deg and -180 are very near angles when ampping betewwen -180 ... 180 deg.
// because 180 deg and -180 are very near angles when mapping between -180 ... 180 deg.
// and this is not easy to handle in calculations
NORMALIZE_ANGLE_POS( angleStart );
return angleStart;
}
double PCB_SHAPE::GetArcAngleEnd() const
{
// due to the Y axis orient atan2 needs - y value
@ -434,7 +435,7 @@ double PCB_SHAPE::GetArcAngleEnd() const
GetArcEnd().x - GetCenter().x );
// Normalize it to 0 ... 360 deg, to avoid discontinuity for angles near 180 deg
// because 180 deg and -180 are very near angles when ampping betewwen -180 ... 180 deg.
// because 180 deg and -180 are very near angles when mapping between -180 ... 180 deg.
// and this is not easy to handle in calculations
NORMALIZE_ANGLE_POS( angleStart );
@ -490,7 +491,7 @@ void PCB_SHAPE::SetAngle( double aAngle, bool aUpdateEnd )
FOOTPRINT* PCB_SHAPE::GetParentFootprint() const
{
if( !m_parent || m_parent->Type() != PCB_FOOTPRINT_T )
return NULL;
return nullptr;
return (FOOTPRINT*) m_parent;
}
@ -593,8 +594,9 @@ const EDA_RECT PCB_SHAPE::GetBoundingBox() const
for( wxPoint& pt : pts )
bbox.Merge( pt );
}
break;
}
case PCB_SHAPE_TYPE::SEGMENT:
bbox.SetEnd( m_end );
@ -628,8 +630,9 @@ const EDA_RECT PCB_SHAPE::GetBoundingBox() const
bbox.Merge( pt );
}
}
break;
}
case PCB_SHAPE_TYPE::CURVE:
bbox.Merge( m_bezierC1 );
@ -671,8 +674,9 @@ bool PCB_SHAPE::HitTest( const wxPoint& aPosition, int aAccuracy ) const
if( abs( radius - dist ) <= maxdist )
return true;
}
}
break;
}
case PCB_SHAPE_TYPE::ARC:
{
@ -685,7 +689,7 @@ bool PCB_SHAPE::HitTest( const wxPoint& aPosition, int aAccuracy ) const
// For arcs, the test point angle must be >= arc angle start
// and <= arc angle end
// However angle values > 360 deg are not easy to handle
// so we calculate the relative angle between arc start point and teast point
// so we calculate the relative angle between arc start point and test point
// this relative arc should be < arc angle if arc angle > 0 (CW arc)
// and > arc angle if arc angle < 0 (CCW arc)
double arc_angle_start = GetArcAngleStart(); // Always 0.0 ... 360 deg, in 0.1 deg
@ -695,7 +699,7 @@ bool PCB_SHAPE::HitTest( const wxPoint& aPosition, int aAccuracy ) const
// Calculate relative angle between the starting point of the arc, and the test point
arc_hittest -= arc_angle_start;
// Normalise arc_hittest between 0 ... 360 deg
// Normalize arc_hittest between 0 ... 360 deg
NORMALIZE_ANGLE_POS( arc_hittest );
// Check angle: inside the arc angle when it is > 0
@ -711,8 +715,9 @@ bool PCB_SHAPE::HitTest( const wxPoint& aPosition, int aAccuracy ) const
return true;
}
}
}
break;
}
case PCB_SHAPE_TYPE::CURVE:
const_cast<PCB_SHAPE*>( this )->RebuildBezierToSegmentsPointsList( m_width );
@ -756,8 +761,9 @@ bool PCB_SHAPE::HitTest( const wxPoint& aPosition, int aAccuracy ) const
return true;
}
}
}
break;
}
case PCB_SHAPE_TYPE::POLYGON:
if( IsFilled() )
@ -796,7 +802,9 @@ bool PCB_SHAPE::HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy )
case PCB_SHAPE_TYPE::CIRCLE:
// Test if area intersects or contains the circle:
if( aContained )
{
return arect.Contains( bb );
}
else
{
// If the rectangle does not intersect the bounding box, this is a much quicker test
@ -809,6 +817,7 @@ bool PCB_SHAPE::HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy )
return arect.IntersectsCircleEdge( GetCenter(), GetRadius(), GetWidth() );
}
}
break;
case PCB_SHAPE_TYPE::ARC:
@ -817,9 +826,9 @@ bool PCB_SHAPE::HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy )
{
return arect.Contains( bb );
}
// Test if the rect crosses the arc
else
{
// Test if the rect crosses the arc
arcRect = bb.Common( arect );
/* All following tests must pass:
@ -829,6 +838,7 @@ bool PCB_SHAPE::HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy )
return arcRect.Intersects( arect ) &&
arcRect.IntersectsCircleEdge( GetCenter(), GetRadius(), GetWidth() );
}
break;
case PCB_SHAPE_TYPE::RECT:
@ -910,6 +920,7 @@ bool PCB_SHAPE::HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy )
return true;
}
}
break;
case PCB_SHAPE_TYPE::CURVE:
@ -942,8 +953,8 @@ bool PCB_SHAPE::HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy )
return true;
}
}
break;
break;
default:
wxFAIL_MSG( "PCB_SHAPE::HitTest (rect) not implemented for "
@ -957,9 +968,7 @@ bool PCB_SHAPE::HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy )
wxString PCB_SHAPE::GetSelectMenuText( EDA_UNITS aUnits ) const
{
return wxString::Format( _( "%s on %s" ),
ShowShape( m_shape ),
GetLayerName() );
return wxString::Format( _( "%s on %s" ), ShowShape( m_shape ), GetLayerName() );
}
@ -1141,8 +1150,9 @@ std::vector<SHAPE*> PCB_SHAPE::MakeEffectiveShapes() const
effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[2], pts[3], m_width ) );
effectiveShapes.emplace_back( new SHAPE_SEGMENT( pts[3], pts[0], m_width ) );
}
}
break;
}
case PCB_SHAPE_TYPE::CIRCLE:
{
@ -1203,8 +1213,9 @@ std::vector<SHAPE*> PCB_SHAPE::MakeEffectiveShapes() const
for( int i = 0; i < l.SegmentCount(); i++ )
effectiveShapes.emplace_back( new SHAPE_SEGMENT( l.Segment( i ), m_width ) );
}
}
break;
}
default:
wxFAIL_MSG( "PCB_SHAPE::MakeEffectiveShapes unsupported PCB_SHAPE shape: "
@ -1285,7 +1296,8 @@ void PCB_SHAPE::SwapData( BOARD_ITEM* aImage )
}
bool PCB_SHAPE::cmp_drawings::operator()( const BOARD_ITEM* aFirst, const BOARD_ITEM* aSecond ) const
bool PCB_SHAPE::cmp_drawings::operator()( const BOARD_ITEM* aFirst,
const BOARD_ITEM* aSecond ) const
{
if( aFirst->Type() != aSecond->Type() )
return aFirst->Type() < aSecond->Type();

View File

@ -42,7 +42,7 @@ class MSG_PANEL_ITEM;
class PCB_SHAPE : public BOARD_ITEM
{
public:
PCB_SHAPE( BOARD_ITEM* aParent = NULL, KICAD_T idtype = PCB_SHAPE_T );
PCB_SHAPE( BOARD_ITEM* aParent = nullptr, KICAD_T idtype = PCB_SHAPE_T );
// Do not create a copy constructor & operator=.
// The ones generated by the compiler are adequate.
@ -139,8 +139,7 @@ public:
void SetEndX( int x ) { m_end.x = x; }
/**
* Function GetThirdPoint
* returns the third point point of the graphic
* Return the third point of the graphic.
*/
const wxPoint& GetThirdPoint() const { return m_thirdPoint; }
int GetThirdPointY() { return m_thirdPoint.y; }

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 1992-2019 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -74,7 +74,8 @@ static struct IFACE : public KIFACE_I
void OnKifaceEnd() override;
wxWindow* CreateWindow( wxWindow* aParent, int aClassId, KIWAY* aKiway, int aCtlBits = 0 ) override
wxWindow* CreateWindow( wxWindow* aParent, int aClassId, KIWAY* aKiway,
int aCtlBits = 0 ) override
{
switch( aClassId )
{
@ -136,12 +137,14 @@ static struct IFACE : public KIFACE_I
}
/**
* Function IfaceOrAddress
* return a pointer to the requested object. The safest way to use this is to retrieve
* a pointer to a static instance of an interface, similar to how the KIFACE interface
* is exported. But if you know what you are doing use it to retrieve anything you want.
* Return a pointer to the requested object.
*
* The safest way to use this is to retrieve a pointer to a static instance of an interface,
* similar to how the KIFACE interface is exported. But if you know what you are doing use
* it to retrieve anything you want.
*
* @param aDataId identifies which object you want the address of.
* @return void* - and must be cast into the know type.
* @return the object which must be cast into the know type.
*/
void* IfaceOrAddress( int aDataId ) override
{
@ -168,7 +171,6 @@ static struct IFACE : public KIFACE_I
}
/**
* Function SaveFileAs
* Saving a file under a different name is delegated to the various KIFACEs because
* the project doesn't know the internal format of the various files (which may have
* paths in them that need updating).
@ -181,6 +183,7 @@ static struct IFACE : public KIFACE_I
} // namespace
using namespace PCB;
@ -198,6 +201,7 @@ MY_API( KIFACE* ) KIFACE_GETTER( int* aKIFACEversion, int aKiwayVersion, PGM_BAS
return &kiface;
}
#if defined( BUILD_KIWAY_DLL )
PGM_BASE& Pgm()
{
@ -205,6 +209,7 @@ PGM_BASE& Pgm()
return *process;
}
// Similar to PGM_BASE& Pgm(), but return nullptr when a *.ki_face is run from a python script.
PGM_BASE* PgmOrNull()
{
@ -212,6 +217,7 @@ PGM_BASE* PgmOrNull()
}
#endif
/// The global footprint library table. This is not dynamically allocated because
/// in a multiple project environment we must keep its address constant (since it is
/// the fallback table for multiple projects).
@ -223,7 +229,6 @@ FP_LIB_TABLE GFootprintTable;
FOOTPRINT_LIST_IMPL GFootprintList;
bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits )
{
// This is process-level-initialization, not project-level-initialization of the DSO.
@ -237,7 +242,7 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits )
if( !fn.FileExists() )
{
DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG fpDialog( NULL );
DIALOG_GLOBAL_FP_LIB_TABLE_CONFIG fpDialog( nullptr );
fpDialog.ShowModal();
}
@ -261,7 +266,7 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits )
"Please edit this global footprint library table in Preferences menu."
);
DisplayErrorMessage( NULL, msg, ioe.What() );
DisplayErrorMessage( nullptr, msg, ioe.What() );
}
}

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 1992-2018 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -260,10 +260,12 @@ static const wxString GetGerberFilePolarityAttribute( LAYER_NUM aLayer )
return filePolarity;
}
/* Add some X2 attributes to the file header, as defined in the
* Gerber file format specification J4 and "Revision 2015.06"
*/
// A helper function to convert a X2 attribute string to a X1 structured comment:
static wxString& makeStringCompatX1( wxString& aText, bool aUseX1CompatibilityMode )
{
@ -295,9 +297,9 @@ void AddGerberX2Header( PLOTTER* aPlotter, const BOARD* aBoard, bool aUseX1Compa
// Creates the TF,.ProjectId. Format is (from Gerber file format doc):
// %TF.ProjectId,<project id>,<project GUID>,<revision id>*%
// <project id> is the name of the project, restricted to basic ASCII symbols only,
// Rem: <project id> accepts only ASCII 7 code (only basic ASCII codes are allowed in gerber files).
// and comma not accepted
// All illegal chars will be replaced by underscore
// Rem: <project id> accepts only ASCII 7 code (only basic ASCII codes are allowed in
// gerber files) and comma not accepted.
// All illegal chars will be replaced by underscore.
//
// <project GUID> is a string which is an unique id of a project.
// However Kicad does not handle such a project GUID, so it is built from the board name
@ -348,8 +350,8 @@ void AddGerberX2Header( PLOTTER* aPlotter, const BOARD* aBoard, bool aUseX1Compa
}
void AddGerberX2Attribute( PLOTTER* aPlotter,
const BOARD* aBoard, LAYER_NUM aLayer, bool aUseX1CompatibilityMode )
void AddGerberX2Attribute( PLOTTER* aPlotter, const BOARD* aBoard, LAYER_NUM aLayer,
bool aUseX1CompatibilityMode )
{
AddGerberX2Header( aPlotter, aBoard, aUseX1CompatibilityMode );
@ -401,7 +403,7 @@ void BuildPlotFileName( wxFileName* aFilename, const wxString& aOutputDir,
PLOT_CONTROLLER::PLOT_CONTROLLER( BOARD* aBoard )
{
m_plotter = NULL;
m_plotter = nullptr;
m_board = aBoard;
m_plotLayer = UNDEFINED_LAYER;
}
@ -416,7 +418,6 @@ PLOT_CONTROLLER::~PLOT_CONTROLLER()
/* IMPORTANT THING TO KNOW: the locale during plots *MUST* be kept as
* C/POSIX using a LOCALE_IO object on the stack. This even when
* opening/closing the plotfile, since some drivers do I/O even then */
void PLOT_CONTROLLER::ClosePlot()
{
LOCALE_IO toggle;
@ -428,13 +429,13 @@ void PLOT_CONTROLLER::ClosePlot()
delete m_plotter->RenderSettings();
delete m_plotter;
m_plotter = NULL;
m_plotter = nullptr;
}
}
bool PLOT_CONTROLLER::OpenPlotfile(
const wxString& aSuffix, PLOT_FORMAT aFormat, const wxString& aSheetDesc )
bool PLOT_CONTROLLER::OpenPlotfile( const wxString& aSuffix, PLOT_FORMAT aFormat,
const wxString& aSheetDesc )
{
LOCALE_IO toggle;
@ -472,7 +473,7 @@ bool PLOT_CONTROLLER::OpenPlotfile(
m_plotFile.GetFullPath(), aSheetDesc );
}
return( m_plotter != NULL );
return ( m_plotter != nullptr );
}

View File

@ -8,7 +8,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -207,11 +207,12 @@ void PlotOneBoardLayer( BOARD *aBoard, PLOTTER* aPlotter, PCB_LAYER_ID aLayer,
}
/*
/**
* Plot a copper layer or mask.
*
* Silk screen layers are not plotted here.
*/
void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
void PlotStandardLayer( BOARD* aBoard, PLOTTER* aPlotter, LSET aLayerMask,
const PCB_PLOT_PARAMS& aPlotOpt )
{
BRDITEMS_PLOTTER itemplotter( aPlotter, aBoard, aPlotOpt );
@ -240,7 +241,7 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
// Plot footprint pads
for( FOOTPRINT* footprint : aBoard->Footprints() )
{
aPlotter->StartBlock( NULL );
aPlotter->StartBlock( nullptr );
for( PAD* pad : footprint->Pads() )
{
@ -368,7 +369,8 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
// which can create bad shapes if margin.x is < 0
int maxError = aBoard->GetDesignSettings().m_MaxError;
int numSegs = GetArcToSegmentCount( mask_clearance, maxError, 360.0 );
outline.InflateWithLinkedHoles( mask_clearance, numSegs, SHAPE_POLY_SET::PM_FAST );
outline.InflateWithLinkedHoles( mask_clearance, numSegs,
SHAPE_POLY_SET::PM_FAST );
dummy.DeletePrimitivesList();
dummy.AddPrimitivePoly( outline, 0, true );
@ -391,8 +393,8 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
pad->SetRoundRectCornerRadius( std::max( initial_radius + mask_clearance, 0 ) );
itemplotter.PlotPad( pad, color, padPlotMode );
}
break;
}
case PAD_SHAPE::CHAMFERED_RECT:
if( mask_clearance == 0 )
@ -417,7 +419,8 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
int numSegs = GetArcToSegmentCount( mask_clearance, maxError, 360.0 );
dummy.TransformShapeWithClearanceToPolygon( outline, UNDEFINED_LAYER, 0,
maxError, ERROR_INSIDE );
outline.InflateWithLinkedHoles( mask_clearance, numSegs, SHAPE_POLY_SET::PM_FAST );
outline.InflateWithLinkedHoles( mask_clearance, numSegs,
SHAPE_POLY_SET::PM_FAST );
// Initialize the dummy pad shape:
dummy.SetAnchorPadShape( PAD_SHAPE::CIRCLE );
@ -434,6 +437,7 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
itemplotter.PlotPad( &dummy, color, padPlotMode );
}
break;
case PAD_SHAPE::CUSTOM:
@ -443,6 +447,7 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
PAD dummy( *pad );
SHAPE_POLY_SET shape;
pad->MergePrimitivesAsPolygon( &shape, UNDEFINED_LAYER );
// Shape polygon can have holes so use InflateWithLinkedHoles(), not Inflate()
// which can create bad shapes if margin.x is < 0
int maxError = aBoard->GetDesignSettings().m_MaxError;
@ -458,9 +463,9 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
dummy.SetSize( padPlotsSize );
itemplotter.PlotPad( &dummy, color, padPlotMode );
}
break;
}
}
// Restore the pad parameters modified by the plot code
pad->SetSize( padSize );
@ -469,7 +474,7 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
pad->SetRoundRectCornerRadius( padCornerRadius );
}
aPlotter->EndBlock( NULL );
aPlotter->EndBlock( nullptr );
}
// Plot vias on copper layers, and if aPlotOpt.GetPlotViaOnMaskLayer() is true,
@ -485,7 +490,7 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
gbr_metadata.SetNetAttribType( GBR_NETLIST_METADATA::GBR_NETINFO_NET );
}
aPlotter->StartBlock( NULL );
aPlotter->StartBlock( nullptr );
for( const PCB_TRACK* track : aBoard->Tracks() )
{
@ -539,14 +544,15 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
COLOR4D color = aPlotOpt.ColorSettings()->GetColor(
LAYER_VIAS + static_cast<int>( via->GetViaType() ) );
// Set plot color (change WHITE to LIGHTGRAY because the white items are not seen on a
// white paper or screen
aPlotter->SetColor( color != WHITE ? color : LIGHTGRAY );
aPlotter->FlashPadCircle( via->GetStart(), diameter, plotMode, &gbr_metadata );
}
aPlotter->EndBlock( NULL );
aPlotter->StartBlock( NULL );
aPlotter->EndBlock( nullptr );
aPlotter->StartBlock( nullptr );
gbr_metadata.SetApertureAttrib( GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB_CONDUCTOR );
// Plot tracks (not vias) :
@ -582,13 +588,12 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
aPlotter->ThickSegment( track->GetStart(), track->GetEnd(), width, plotMode,
&gbr_metadata );
}
}
aPlotter->EndBlock( NULL );
aPlotter->EndBlock( nullptr );
// Plot filled ares
aPlotter->StartBlock( NULL );
aPlotter->StartBlock( nullptr );
NETINFO_ITEM nonet( aBoard );
@ -622,7 +627,7 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
}
}
aPlotter->EndBlock( NULL );
aPlotter->EndBlock( nullptr );
// Adding drill marks, if required and if the plotter is able to plot them:
if( aPlotOpt.GetDrillMarksType() != PCB_PLOT_PARAMS::NO_DRILL_SHAPE )
@ -689,8 +694,8 @@ static const PCB_LAYER_ID plot_seq[] = {
};
/*
* Plot outlines of copper, for copper layer
/**
* Plot outlines of copper layer.
*/
void PlotLayerOutlines( BOARD* aBoard, PLOTTER* aPlotter, LSET aLayerMask,
const PCB_PLOT_PARAMS& aPlotOpt )
@ -718,7 +723,8 @@ void PlotLayerOutlines( BOARD* aBoard, PLOTTER* aPlotter, LSET aLayerMask,
for( int kk = 0; kk <= outlines.HoleCount(ii); kk++ )
{
cornerList.clear();
const SHAPE_LINE_CHAIN& path = (kk == 0) ? outlines.COutline( ii ) : outlines.CHole( ii, kk - 1 );
const SHAPE_LINE_CHAIN& path =
( kk == 0 ) ? outlines.COutline( ii ) : outlines.CHole( ii, kk - 1 );
aPlotter->PlotPoly( path, FILL_TYPE::NO_FILL );
}
@ -750,7 +756,7 @@ void PlotLayerOutlines( BOARD* aBoard, PLOTTER* aPlotter, LSET aLayerMask,
const SHAPE_SEGMENT* seg = pad->GetEffectiveHoleShape();
aPlotter->ThickSegment( (wxPoint) seg->GetSeg().A,
(wxPoint) seg->GetSeg().B,
seg->GetWidth(), SKETCH, NULL );
seg->GetWidth(), SKETCH, nullptr );
}
}
}
@ -770,7 +776,9 @@ void PlotLayerOutlines( BOARD* aBoard, PLOTTER* aPlotter, LSET aLayerMask,
}
/* Plot a solder mask layer.
/**
* Plot a solder mask layer.
*
* Solder mask layers have a minimum thickness value and cannot be drawn like standard layers,
* unless the minimum thickness is 0.
* Currently the algo is:
@ -845,6 +853,7 @@ void PlotSolderMaskLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
// inflate value to build final polygons
// After calculations the remaining polygons are polygons to plot
SHAPE_POLY_SET areas;
// Will contain exact shapes of all items on solder mask
SHAPE_POLY_SET initialPolys;
@ -914,6 +923,7 @@ void PlotSolderMaskLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
// add shapes inflated by aMinThickness/2 in areas
zone->TransformSmoothedOutlineToPolygon( areas, inflate + zone_margin, boardOutline );
// add shapes with their exact mask layer size in initialPolys
zone->TransformSmoothedOutlineToPolygon( initialPolys, zone_margin, boardOutline );
}
@ -935,6 +945,7 @@ void PlotSolderMaskLayer( BOARD *aBoard, PLOTTER* aPlotter, LSET aLayerMask,
ZONE zone( aBoard );
zone.SetMinThickness( 0 ); // trace polygons only
zone.SetLayer( layer );
// Combine the current areas to initial areas. This is mandatory because inflate/deflate
// transform is not perfect, and we want the initial areas perfectly kept
areas.BooleanAdd( initialPolys, SHAPE_POLY_SET::PM_FAST );
@ -1059,8 +1070,10 @@ static void initializePlotter( PLOTTER* aPlotter, const BOARD* aBoard,
aPlotter->SetPageSettings( *sheet_info );
aPlotter->SetViewport( offset, IU_PER_MILS/10, compound_scale, aPlotOpts->GetMirror() );
// Has meaning only for gerber plotter. Must be called only after SetViewport
aPlotter->SetGerberCoordinatesFormat( aPlotOpts->GetGerberPrecision() );
// Has meaning only for SVG plotter. Must be called only after SetViewport
aPlotter->SetSvgCoordinatesFormat( aPlotOpts->GetSvgPrecision(), aPlotOpts->GetSvgUseInch() );
@ -1104,13 +1117,14 @@ static void ConfigureHPGLPenSizes( HPGL_PLOTTER *aPlotter, const PCB_PLOT_PARAMS
/**
* Open a new plotfile using the options (and especially the format) specified in the options
* and prepare the page for plotting.
* Return the plotter object if OK, NULL if the file is not created (or has a problem)
*
* @return the plotter object if OK, NULL if the file is not created (or has a problem).
*/
PLOTTER* StartPlotBoard( BOARD *aBoard, const PCB_PLOT_PARAMS *aPlotOpts, int aLayer,
const wxString& aFullFileName, const wxString& aSheetDesc )
{
// Create the plotter driver and set the few plotter specific options
PLOTTER* plotter = NULL;
PLOTTER* plotter = nullptr;
switch( aPlotOpts->GetFormat() )
{
@ -1153,7 +1167,7 @@ PLOTTER* StartPlotBoard( BOARD *aBoard, const PCB_PLOT_PARAMS *aPlotOpts, int aL
default:
wxASSERT( false );
return NULL;
return nullptr;
}
KIGFX::PCB_RENDER_SETTINGS* renderSettings = new KIGFX::PCB_RENDER_SETTINGS();
@ -1216,5 +1230,5 @@ PLOTTER* StartPlotBoard( BOARD *aBoard, const PCB_PLOT_PARAMS *aPlotOpts, int aL
delete plotter->RenderSettings();
delete plotter;
return NULL;
return nullptr;
}

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -69,10 +69,6 @@
#include <wx/gdicmn.h>
/* class BRDITEMS_PLOTTER is a helper class to plot board items
* and a group of board items
*/
COLOR4D BRDITEMS_PLOTTER::getColor( LAYER_NUM aLayer ) const
{
COLOR4D color = ColorSettings()->GetColor( aLayer );
@ -105,6 +101,7 @@ void BRDITEMS_PLOTTER::PlotPad( const PAD* aPad, COLOR4D aColor, OUTLINE_MODE aP
{
gbr_metadata.SetNetAttribType( GBR_NETINFO_ALL );
gbr_metadata.SetCopper( true );
// Gives a default attribute, for instance for pads used as tracks in net ties:
// Connector pads and SMD pads are on external layers
// if on internal layers, they are certainly used as net tie
@ -160,7 +157,7 @@ void BRDITEMS_PLOTTER::PlotPad( const PAD* aPad, COLOR4D aColor, OUTLINE_MODE aP
break;
case PAD_ATTRIB::SMD: // SMD pads (on external copper layer only)
// with solder paste and mask
// with solder paste and mask
if( plotOnExternalCopperLayer )
gbr_metadata.SetApertureAttrib( GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB_SMDPAD_CUDEF );
break;
@ -336,7 +333,6 @@ void BRDITEMS_PLOTTER::PlotFootprintTextItems( const FOOTPRINT* aFootprint )
}
// plot items like text and graphics, but not tracks and footprints
void BRDITEMS_PLOTTER::PlotBoardGraphicItems()
{
for( BOARD_ITEM* item : m_board->Drawings() )
@ -516,7 +512,6 @@ void BRDITEMS_PLOTTER::PlotPcbTarget( const PCB_TARGET* aMire )
}
// Plot footprints graphic items (outlines)
void BRDITEMS_PLOTTER::PlotFootprintGraphicItems( const FOOTPRINT* aFootprint )
{
for( const BOARD_ITEM* item : aFootprint->GraphicalItems() )
@ -529,7 +524,6 @@ void BRDITEMS_PLOTTER::PlotFootprintGraphicItems( const FOOTPRINT* aFootprint )
}
//* Plot a graphic item (outline) relative to a footprint
void BRDITEMS_PLOTTER::PlotFootprintGraphicItem( const FP_SHAPE* aShape )
{
if( aShape->Type() != PCB_FP_SHAPE_T )
@ -676,6 +670,7 @@ void BRDITEMS_PLOTTER::PlotFootprintGraphicItem( const FP_SHAPE* aShape )
}
}
}
break;
case PCB_SHAPE_TYPE::CURVE:
@ -690,7 +685,6 @@ void BRDITEMS_PLOTTER::PlotFootprintGraphicItem( const FP_SHAPE* aShape )
}
// Plot a PCB Text, i.e. a text found on a copper or technical layer
void BRDITEMS_PLOTTER::PlotPcbText( const PCB_TEXT* aText )
{
wxString shownText( aText->GetShownText() );
@ -818,8 +812,8 @@ void BRDITEMS_PLOTTER::PlotFilledAreas( const ZONE* aZone, const SHAPE_POLY_SET&
}
}
static_cast<GERBER_PLOTTER*>( m_plotter )->PlotGerberRegion(
outline, &gbr_metadata );
static_cast<GERBER_PLOTTER*>( m_plotter )->PlotGerberRegion( outline,
&gbr_metadata );
}
else
{
@ -859,8 +853,6 @@ void BRDITEMS_PLOTTER::PlotFilledAreas( const ZONE* aZone, const SHAPE_POLY_SET&
}
/* Plot items type PCB_SHAPE on layers allowed by aLayerMask
*/
void BRDITEMS_PLOTTER::PlotPcbShape( const PCB_SHAPE* aShape )
{
if( !m_layerMask[aShape->GetLayer()] )
@ -941,6 +933,7 @@ void BRDITEMS_PLOTTER::PlotPcbShape( const PCB_SHAPE* aShape )
if( !sketch && aShape->IsFilled() )
{
m_plotter->SetCurrentLineWidth( thickness, &gbr_metadata );
// Draw the polygon: only one polygon is expected
// However we provide a multi polygon shape drawing
// ( for the future or to show a non expected shape )
@ -979,8 +972,9 @@ void BRDITEMS_PLOTTER::PlotPcbShape( const PCB_SHAPE* aShape )
m_plotter->PlotPoly( poly, FILL_TYPE::FILLED_SHAPE, -1, &gbr_metadata );
}
}
break;
}
default:
wxASSERT_MSG( false, "Unhandled PCB_SHAPE shape" );
@ -989,9 +983,6 @@ void BRDITEMS_PLOTTER::PlotPcbShape( const PCB_SHAPE* aShape )
}
/** Helper function to plot a single drill mark. It compensate and clamp
* the drill mark size depending on the current plot options
*/
void BRDITEMS_PLOTTER::plotOneDrillMark( PAD_DRILL_SHAPE_T aDrillShape, const wxPoint &aDrillPos,
wxSize aDrillSize, const wxSize &aPadSize,
double aOrientation, int aSmallDrill )
@ -1008,11 +999,11 @@ void BRDITEMS_PLOTTER::plotOneDrillMark( PAD_DRILL_SHAPE_T aDrillShape, const wx
{
aDrillSize.y -= getFineWidthAdj();
aDrillSize.y = Clamp( 1, aDrillSize.y, aPadSize.y - 1 );
m_plotter->FlashPadOval( aDrillPos, aDrillSize, aOrientation, GetPlotMode(), NULL );
m_plotter->FlashPadOval( aDrillPos, aDrillSize, aOrientation, GetPlotMode(), nullptr );
}
else
{
m_plotter->FlashPadCircle( aDrillPos, aDrillSize.x, GetPlotMode(), NULL );
m_plotter->FlashPadCircle( aDrillPos, aDrillSize.x, GetPlotMode(), nullptr );
}
}

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2012 Lorenzo Marcantonio, <l.marcantonio@logossrl.com>
* Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -39,8 +39,7 @@ class BOARD;
/**
* Batch plotter state object. Keeps the plot options and handles multiple
* plot requests
* Especially useful in Python scripts
* plot requests. Useful in Python scripts.
*/
class PLOT_CONTROLLER
{
@ -48,7 +47,8 @@ public:
/** Batch plotter constructor, nothing interesting here */
PLOT_CONTROLLER( BOARD *aBoard );
/** Batch plotter destructor, ensures that the last plot is closed
/**
* Ensure that the last plot is closed.
*/
~PLOT_CONTROLLER();
@ -62,24 +62,25 @@ public:
/**
* @return true if a plotter is initialized and can be used
* @return true if a plotter is initialized and can be used.
*/
bool IsPlotOpen() const { return m_plotter != NULL; }
bool IsPlotOpen() const { return m_plotter != nullptr; }
/** Close the current plot, nothing happens if it isn't open
/**
* Close the current plot, nothing happens if it isn't open.
*/
void ClosePlot();
/** Open a new plotfile; works as a factory for plotter objects
/** Open a new plotfile; works as a factory for plotter objects/
*
* @param aSuffix is a string added to the base filename (derived from
* the board filename) to identify the plot file
* @param aFormat is the plot file format identifier
* @param aSheetDesc
* the board filename) to identify the plot file.
* @param aFormat is the plot file format identifier.
*/
bool OpenPlotfile( const wxString& aSuffix, PLOT_FORMAT aFormat, const wxString& aSheetDesc );
/** Plot a single layer on the current plotfile
* m_plotLayer is the layer to plot
/**
* Plot a single layer on the current plotfile m_plotLayer is the layer to plot.
*/
bool PlotLayer();
@ -94,15 +95,15 @@ public:
const wxString GetPlotDirName() { return m_plotFile.GetPathWithSep(); }
/**
* Plotters can plot in Black and White mode or Color mode
* SetColorMode activate/de-actiavte the Color mode.
* @param aColorMode = true to activate the plot color mode
* Choose color or bland and white plot mode.
*
* @param aColorMode set to true to activate the plot color mode or false for black and white.
*/
void SetColorMode( bool );
void SetColorMode( bool aColorMode );
/**
* @return true if the current plot color mode is Color,
* false if the current plot color mode is Black and White
* @return true if the current plot color mode is color or false if the current plot color
* mode is black and white.
*/
bool GetColorMode();

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2020 Roberto Fernandez Bautista <roberto.fer.bau@gmail.com>
* Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2020-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@ -141,7 +141,7 @@ void CADSTAR_PCB_ARCHIVE_PARSER::LAYERDEFS::Parse( XNODE* aNode, PARSER_CONTEXT*
{
wxASSERT( aNode->GetName() == wxT( "LAYERDEFS" ) );
wxXmlAttribute* xmlAttribute = NULL;
wxXmlAttribute* xmlAttribute = nullptr;
XNODE* cNode = aNode->GetChildren();
@ -592,7 +592,8 @@ void CADSTAR_PCB_ARCHIVE_PARSER::COPPERCODE::Parse( XNODE* aNode, PARSER_CONTEXT
}
void CADSTAR_PCB_ARCHIVE_PARSER::SPACINGCODE::REASSIGN::Parse( XNODE* aNode, PARSER_CONTEXT* aContext )
void CADSTAR_PCB_ARCHIVE_PARSER::SPACINGCODE::REASSIGN::Parse( XNODE* aNode,
PARSER_CONTEXT* aContext )
{
wxASSERT( aNode->GetName() == wxT( "SPACEREASSIGN" ) );
@ -976,6 +977,7 @@ void CADSTAR_PCB_ARCHIVE_PARSER::TECHNOLOGY_SECTION::Parse( XNODE* aNode, PARSER
}
}
CADSTAR_PCB_ARCHIVE_PARSER::PAD_SIDE CADSTAR_PCB_ARCHIVE_PARSER::GetPadSide(
const wxString& aPadSideString )
{
@ -1231,7 +1233,8 @@ void CADSTAR_PCB_ARCHIVE_PARSER::DIMENSION::ARROW::Parse( XNODE* aNode, PARSER_C
}
void CADSTAR_PCB_ARCHIVE_PARSER::DIMENSION::TEXTFORMAT::Parse( XNODE* aNode, PARSER_CONTEXT* aContext )
void CADSTAR_PCB_ARCHIVE_PARSER::DIMENSION::TEXTFORMAT::Parse( XNODE* aNode,
PARSER_CONTEXT* aContext )
{
wxASSERT( aNode->GetName() == wxT( "DIMTEXT" ) );
@ -1256,7 +1259,8 @@ void CADSTAR_PCB_ARCHIVE_PARSER::DIMENSION::TEXTFORMAT::Parse( XNODE* aNode, PAR
}
void CADSTAR_PCB_ARCHIVE_PARSER::DIMENSION::EXTENSION_LINE::Parse( XNODE* aNode, PARSER_CONTEXT* aContext )
void CADSTAR_PCB_ARCHIVE_PARSER::DIMENSION::EXTENSION_LINE::Parse( XNODE* aNode,
PARSER_CONTEXT* aContext )
{
wxASSERT( aNode->GetName() == wxT( "EXTLINE" ) );
@ -1931,7 +1935,8 @@ void CADSTAR_PCB_ARCHIVE_PARSER::NET_PCB::PIN::Parse( XNODE* aNode, PARSER_CONTE
}
void CADSTAR_PCB_ARCHIVE_PARSER::NET_PCB::JUNCTION_PCB::Parse( XNODE* aNode, PARSER_CONTEXT* aContext )
void CADSTAR_PCB_ARCHIVE_PARSER::NET_PCB::JUNCTION_PCB::Parse( XNODE* aNode,
PARSER_CONTEXT* aContext )
{
ParseIdentifiers( aNode, aContext );
XNODE* cNode = aNode->GetChildren();
@ -1980,7 +1985,8 @@ void CADSTAR_PCB_ARCHIVE_PARSER::NET_PCB::VIA::Parse( XNODE* aNode, PARSER_CONTE
}
void CADSTAR_PCB_ARCHIVE_PARSER::NET_PCB::COPPER_TERMINAL::Parse( XNODE* aNode, PARSER_CONTEXT* aContext )
void CADSTAR_PCB_ARCHIVE_PARSER::NET_PCB::COPPER_TERMINAL::Parse( XNODE* aNode,
PARSER_CONTEXT* aContext )
{
wxASSERT( aNode->GetName() == wxT( "COPTERM" ) );
@ -1990,7 +1996,8 @@ void CADSTAR_PCB_ARCHIVE_PARSER::NET_PCB::COPPER_TERMINAL::Parse( XNODE* aNode,
}
XNODE* CADSTAR_PCB_ARCHIVE_PARSER::NET_PCB::ROUTE_VERTEX::Parse( XNODE* aNode, PARSER_CONTEXT* aContext )
XNODE* CADSTAR_PCB_ARCHIVE_PARSER::NET_PCB::ROUTE_VERTEX::Parse( XNODE* aNode,
PARSER_CONTEXT* aContext )
{
wxASSERT( aNode->GetName() == wxT( "ROUTEWIDTH" ) );
@ -2045,7 +2052,8 @@ void CADSTAR_PCB_ARCHIVE_PARSER::NET_PCB::ROUTE::Parse( XNODE* aNode, PARSER_CON
}
void CADSTAR_PCB_ARCHIVE_PARSER::NET_PCB::CONNECTION_PCB::Parse( XNODE* aNode, PARSER_CONTEXT* aContext )
void CADSTAR_PCB_ARCHIVE_PARSER::NET_PCB::CONNECTION_PCB::Parse( XNODE* aNode,
PARSER_CONTEXT* aContext )
{
ParseIdentifiers( aNode, aContext );
@ -2267,7 +2275,8 @@ void CADSTAR_PCB_ARCHIVE_PARSER::TEMPLATE::Parse( XNODE* aNode, PARSER_CONTEXT*
}
void CADSTAR_PCB_ARCHIVE_PARSER::COPPER::NETREF::COPPER_TERM::Parse( XNODE* aNode, PARSER_CONTEXT* aContext )
void CADSTAR_PCB_ARCHIVE_PARSER::COPPER::NETREF::COPPER_TERM::Parse( XNODE* aNode,
PARSER_CONTEXT* aContext )
{
wxASSERT( aNode->GetName() == wxT( "TERM" ) );

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2012-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2012-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -116,6 +116,7 @@ static wxString makeKey( const wxString& aFirst, const wxString& aSecond )
return key;
}
/// interpret special characters in Eagle text and converts them to KiCAD notation
static wxString interpret_text( const wxString& aText )
{
@ -225,7 +226,6 @@ void ERULES::parse( wxXmlNode* aRules, std::function<void()> aCheckpoint )
psElongationLong = wxAtoi( value );
else if( name == "psElongationOffset" )
psElongationOffset = wxAtoi( value );
else if( name == "mvStopFrame" )
value.ToCDouble( &mvStopFrame );
else if( name == "mvCreamFrame" )
@ -238,28 +238,24 @@ void ERULES::parse( wxXmlNode* aRules, std::function<void()> aCheckpoint )
mlMinCreamFrame = parseEagle( value );
else if( name == "mlMaxCreamFrame" )
mlMaxCreamFrame = parseEagle( value );
else if( name == "srRoundness" )
value.ToCDouble( &srRoundness );
else if( name == "srMinRoundness" )
srMinRoundness = parseEagle( value );
else if( name == "srMaxRoundness" )
srMaxRoundness = parseEagle( value );
else if( name == "psTop" )
psTop = wxAtoi( value );
else if( name == "psBottom" )
psBottom = wxAtoi( value );
else if( name == "psFirst" )
psFirst = wxAtoi( value );
else if( name == "rvPadTop" )
value.ToCDouble( &rvPadTop );
else if( name == "rlMinPadTop" )
rlMinPadTop = parseEagle( value );
else if( name == "rlMaxPadTop" )
rlMaxPadTop = parseEagle( value );
else if( name == "rvViaOuter" )
value.ToCDouble( &rvViaOuter );
else if( name == "rlMinViaOuter" )
@ -286,10 +282,10 @@ EAGLE_PLUGIN::EAGLE_PLUGIN() :
{
using namespace std::placeholders;
init( NULL );
init( nullptr );
clear_cu_map();
RegisterLayerMappingCallback( std::bind(
&EAGLE_PLUGIN::DefaultLayerMappingCallback, this, _1 ) );
RegisterLayerMappingCallback( std::bind( &EAGLE_PLUGIN::DefaultLayerMappingCallback,
this, _1 ) );
}
@ -322,7 +318,7 @@ void EAGLE_PLUGIN::checkpoint()
if( ++m_doneCount > m_lastProgressCount + PROGRESS_DELTA )
{
m_progressReporter->SetCurrentProgress( ( (double) m_doneCount )
/ std::max( 1U, m_totalCount ) );
/ std::max( 1U, m_totalCount ) );
if( !m_progressReporter->KeepRefreshing() )
THROW_IO_ERROR( ( "Open cancelled by user." ) );
@ -358,7 +354,7 @@ BOARD* EAGLE_PLUGIN::Load( const wxString& aFileName, BOARD* aAppendToMe,
m_board->SetFileName( aFileName );
// delete on exception, if I own m_board, according to aAppendToMe
unique_ptr<BOARD> deleter( aAppendToMe ? NULL : m_board );
unique_ptr<BOARD> deleter( aAppendToMe ? nullptr : m_board );
try
{
@ -371,6 +367,7 @@ BOARD* EAGLE_PLUGIN::Load( const wxString& aFileName, BOARD* aAppendToMe,
}
wxFileName fn = aFileName;
// Load the document
wxFFileInputStream stream( fn.GetFullPath() );
wxXmlDocument xmlDocument;
@ -416,7 +413,6 @@ BOARD* EAGLE_PLUGIN::Load( const wxString& aFileName, BOARD* aAppendToMe,
// should be empty, else missing m_xpath->pop()
wxASSERT( m_xpath->Contents().size() == 0 );
}
// Catch all exceptions thrown from the parser.
catch( const XML_PARSER_ERROR &exc )
{
wxString errmsg = exc.what();
@ -468,7 +464,7 @@ void EAGLE_PLUGIN::init( const PROPERTIES* aProperties )
m_xpath->clear();
m_pads_to_nets.clear();
m_board = NULL;
m_board = nullptr;
m_props = aProperties;
@ -642,6 +638,7 @@ void EAGLE_PLUGIN::loadLayerDefs( wxXmlNode* aLayers )
m_board->SetLayerName( layer, FROM_UTF8( it->name.c_str() ) );
m_board->SetLayerType( layer, LT_SIGNAL );
}
// could map the colors here
}
}
@ -650,6 +647,7 @@ void EAGLE_PLUGIN::loadLayerDefs( wxXmlNode* aLayers )
#define DIMENSION_PRECISION 1 // 0.001 mm
void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
{
if( !aGraphics )
@ -749,10 +747,14 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
pcbtxt->SetTextAngle( sign * 90 * 10 );
align = ETEXT::TOP_RIGHT;
}
else // Ok so text is not at 90,180 or 270 so do some funny stuff to get placement right
else
{
// Ok so text is not at 90,180 or 270 so do some funny stuff to get
// placement right.
if( ( degrees > 0 ) && ( degrees < 90 ) )
{
pcbtxt->SetTextAngle( sign * t.rot->degrees * 10 );
}
else if( ( degrees > 90 ) && ( degrees < 180 ) )
{
pcbtxt->SetTextAngle( sign * ( t.rot->degrees + 180 ) * 10 );
@ -814,6 +816,7 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
break;
}
}
m_xpath->pop();
}
else if( grName == "circle" )
@ -836,6 +839,7 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
// approximate circle as polygon with a edge every 10 degree
wxPoint center( kicad_x( c.x ), kicad_y( c.y ) );
int outlineRadius = radius + ( width / 2 );
for( int angle = 0; angle < 360; angle += 10 )
{
wxPoint rotatedPoint( outlineRadius, 0 );
@ -847,6 +851,7 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
{
zone->NewHole();
int innerRadius = radius - ( width / 2 );
for( int angle = 0; angle < 360; angle += 10 )
{
wxPoint rotatedPoint( innerRadius, 0 );
@ -875,6 +880,7 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
shape->SetWidth( width );
}
}
m_xpath->pop();
}
else if( grName == "rectangle" )
@ -953,7 +959,8 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
if( d.dimensionType )
{
// Eagle dimension graphic arms may have different lengths, but they look
// incorrect in KiCad (the graphic is tilted). Make them even length in such case.
// incorrect in KiCad (the graphic is tilted). Make them even length in
// such case.
if( *d.dimensionType == "horizontal" )
{
int newY = ( d.y1.ToPcbUnits() + d.y2.ToPcbUnits() ) / 2;
@ -970,6 +977,7 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
dimension->SetLayer( layer );
dimension->SetPrecision( DIMENSION_PRECISION );
// The origin and end are assumed to always be in this order from eagle
dimension->SetStart( wxPoint( kicad_x( d.x1 ), kicad_y( d.y1 ) ) );
dimension->SetEnd( wxPoint( kicad_x( d.x2 ), kicad_y( d.y2 ) ) );
@ -992,6 +1000,7 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
// Get next graphic
gr = gr->GetNext();
}
m_xpath->pop();
}
@ -1162,15 +1171,17 @@ void EAGLE_PLUGIN::loadElements( wxXmlNode* aElements )
footprint->SetValue( FROM_UTF8( e.value.c_str() ) );
if( !e.smashed )
{ // Not smashed so show NAME & VALUE
{
// Not smashed so show NAME & VALUE
if( valueNamePresetInPackageLayout )
footprint->Value().SetVisible( true ); // Only if place holder in package layout
if( refanceNamePresetInPackageLayout )
footprint->Reference().SetVisible( true ); // Only if place holder in package layout
footprint->Reference().SetVisible( true ); // Only if place holder in package layout
}
else if( *e.smashed == true )
{ // Smashed so set default to no show for NAME and VALUE
{
// Smashed so set default to no show for NAME and VALUE
footprint->Value().SetVisible( false );
footprint->Reference().SetVisible( false );
@ -1212,9 +1223,10 @@ void EAGLE_PLUGIN::loadElements( wxXmlNode* aElements )
{
wxString reference = e.name;
// EAGLE allows references to be single digits. This breaks KiCad netlisting, which requires
// parts to have non-digit + digit annotation. If the reference begins with a number,
// we prepend 'UNK' (unknown) for the symbol designator
// EAGLE allows references to be single digits. This breaks KiCad
// netlisting, which requires parts to have non-digit + digit
// annotation. If the reference begins with a number, we prepend
// 'UNK' (unknown) for the symbol designator.
if( reference.find_first_not_of( "0123456789" ) == wxString::npos )
reference.Prepend( "UNK" );
@ -1226,12 +1238,14 @@ void EAGLE_PLUGIN::loadElements( wxXmlNode* aElements )
break;
}
case EATTR::NAME :
if( refanceNamePresetInPackageLayout )
{
footprint->SetReference( "NAME" );
footprint->Reference().SetVisible( true );
}
break;
case EATTR::BOTH :
@ -1254,8 +1268,10 @@ void EAGLE_PLUGIN::loadElements( wxXmlNode* aElements )
}
}
else
{
// No display, so default is visible, and show value of NAME
footprint->Reference().SetVisible( true );
}
}
else if( a.name == "VALUE" )
{
@ -1339,12 +1355,11 @@ ZONE* EAGLE_PLUGIN::loadPolygon( wxXmlNode* aPolyNode )
|| p.layer == EAGLE_LAYER::BRESTRICT
|| p.layer == EAGLE_LAYER::VRESTRICT );
if( layer == UNDEFINED_LAYER ) {
wxLogMessage( wxString::Format(
_( "Ignoring a polygon since Eagle layer '%s' (%d) "
"was not mapped" ),
eagle_layer_name( p.layer ),
p.layer ) );
if( layer == UNDEFINED_LAYER )
{
wxLogMessage( wxString::Format( _( "Ignoring a polygon since Eagle layer '%s' (%d) "
"was not mapped" ),
eagle_layer_name( p.layer ), p.layer ) );
return nullptr;
}
@ -1395,17 +1410,15 @@ ZONE* EAGLE_PLUGIN::loadPolygon( wxXmlNode* aPolyNode )
wxPoint( kicad_x( v2.x ), kicad_y( v2.y ) ),
*v1.curve );
double angle = DEG2RAD( *v1.curve );
double end_angle = atan2( kicad_y( v2.y ) - center.y,
kicad_x( v2.x ) - center.x );
double radius = sqrt( pow( center.x - kicad_x( v1.x ), 2 )
+ pow( center.y - kicad_y( v1.y ), 2 ) );
double end_angle = atan2( kicad_y( v2.y ) - center.y, kicad_x( v2.x ) - center.x );
double radius = sqrt( pow( center.x - kicad_x( v1.x ), 2 )
+ pow( center.y - kicad_y( v1.y ), 2 ) );
int segCount = GetArcToSegmentCount( KiROUND( radius ), ARC_HIGH_DEF, *v1.curve );
double delta_angle = angle / segCount;
for( double a = end_angle + angle;
fabs( a - end_angle ) > fabs( delta_angle );
a -= delta_angle )
for( double a = end_angle + angle; fabs( a - end_angle ) > fabs( delta_angle );
a -= delta_angle )
{
polygon.Append( KiROUND( radius * cos( a ) ) + center.x,
KiROUND( radius * sin( a ) ) + center.y );
@ -1502,7 +1515,8 @@ void EAGLE_PLUGIN::orientFPText( FOOTPRINT* aFootprint, const EELEMENT& e, FP_TE
{
// Smashed part ?
if( aAttr )
{ // Yes
{
// Yes
const EATTR& a = *aAttr;
if( a.value )
@ -1615,8 +1629,10 @@ void EAGLE_PLUGIN::orientFPText( FOOTPRINT* aFootprint, const EELEMENT& e, FP_TE
;
}
}
else // Part is not smash so use Lib default for NAME/VALUE // the text is per the original package, sans <attribute>
else
{
// Part is not smash so use Lib default for NAME/VALUE // the text is per the original
// package, sans <attribute>.
double degrees = ( aFPText->GetTextAngle() + aFootprint->GetOrientation() ) / 10;
// @todo there are a few more cases than these to contend with:
@ -1648,28 +1664,20 @@ FOOTPRINT* EAGLE_PLUGIN::makeFootprint( wxXmlNode* aPackage, const wxString& aPk
if( itemName == "description" )
m->SetDescription( FROM_UTF8( packageItem->GetNodeContent().c_str() ) );
else if( itemName == "wire" )
packageWire( m.get(), packageItem );
else if( itemName == "pad" )
packagePad( m.get(), packageItem );
else if( itemName == "text" )
packageText( m.get(), packageItem );
else if( itemName == "rectangle" )
packageRectangle( m.get(), packageItem );
else if( itemName == "polygon" )
packagePolygon( m.get(), packageItem );
else if( itemName == "circle" )
packageCircle( m.get(), packageItem );
else if( itemName == "hole" )
packageHole( m.get(), packageItem, false );
else if( itemName == "smd" )
packageSMD( m.get(), packageItem );
@ -1692,8 +1700,7 @@ void EAGLE_PLUGIN::packageWire( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const
{
wxLogMessage( wxString::Format( _( "Ignoring a wire since Eagle layer '%s' (%d) "
"was not mapped" ),
eagle_layer_name( w.layer ),
w.layer ) );
eagle_layer_name( w.layer ), w.layer ) );
return;
}
@ -1865,8 +1872,7 @@ void EAGLE_PLUGIN::packageText( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const
{
wxLogMessage( wxString::Format( _( "Ignoring a text since Eagle layer '%s' (%d) "
"was not mapped" ),
eagle_layer_name( t.layer ),
t.layer ) );
eagle_layer_name( t.layer ), t.layer ) );
return;
}
@ -1892,7 +1898,6 @@ void EAGLE_PLUGIN::packageText( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const
txt->SetLayer( layer );
double ratio = t.ratio ? *t.ratio : 8; // DTD says 8 is default
int textThickness = KiROUND( t.size.ToPcbUnits() * ratio / 100 );
@ -1912,9 +1917,13 @@ void EAGLE_PLUGIN::packageText( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const
double degrees = t.rot->degrees;
if( degrees == 90 || t.rot->spin )
{
txt->SetTextAngle( sign * degrees * 10 );
}
else if( degrees == 180 )
{
align = ETEXT::TOP_RIGHT;
}
else if( degrees == 270 )
{
align = ETEXT::TOP_RIGHT;
@ -2003,8 +2012,7 @@ void EAGLE_PLUGIN::packageRectangle( FOOTPRINT* aFootprint, wxXmlNode* aTree ) c
{
wxLogMessage( wxString::Format( _( "Ignoring a rectangle since Eagle layer '%s' (%d) "
"was not mapped" ),
eagle_layer_name( r.layer ),
r.layer ) );
eagle_layer_name( r.layer ), r.layer ) );
return;
}
@ -2070,14 +2078,13 @@ void EAGLE_PLUGIN::packagePolygon( FOOTPRINT* aFootprint, wxXmlNode* aTree ) con
if( v1.curve )
{
EVERTEX v2 = vertices[i + 1];
wxPoint center = ConvertArcCenter(
wxPoint( kicad_x( v1.x ), kicad_y( v1.y ) ),
wxPoint( kicad_x( v2.x ), kicad_y( v2.y ) ), *v1.curve );
wxPoint center =
ConvertArcCenter( wxPoint( kicad_x( v1.x ), kicad_y( v1.y ) ),
wxPoint( kicad_x( v2.x ), kicad_y( v2.y ) ), *v1.curve );
double angle = DEG2RAD( *v1.curve );
double end_angle = atan2( kicad_y( v2.y ) - center.y,
kicad_x( v2.x ) - center.x );
double end_angle = atan2( kicad_y( v2.y ) - center.y, kicad_x( v2.x ) - center.x );
double radius = sqrt( pow( center.x - kicad_x( v1.x ), 2 )
+ pow( center.y - kicad_y( v1.y ), 2 ) );
+ pow( center.y - kicad_y( v1.y ), 2 ) );
// Don't allow a zero-radius curve
if( KiROUND( radius ) == 0 )
@ -2118,8 +2125,7 @@ void EAGLE_PLUGIN::packagePolygon( FOOTPRINT* aFootprint, wxXmlNode* aTree ) con
{
wxLogMessage( wxString::Format( _( "Ignoring a polygon since Eagle layer '%s' (%d) "
"was not mapped" ),
eagle_layer_name( p.layer ),
p.layer ) );
eagle_layer_name( p.layer ), p.layer ) );
return;
}
@ -2139,6 +2145,7 @@ void EAGLE_PLUGIN::packagePolygon( FOOTPRINT* aFootprint, wxXmlNode* aTree ) con
}
}
void EAGLE_PLUGIN::packageCircle( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const
{
ECIRCLE e( aTree );
@ -2158,6 +2165,7 @@ void EAGLE_PLUGIN::packageCircle( FOOTPRINT* aFootprint, wxXmlNode* aTree ) cons
// approximate circle as polygon with a edge every 10 degree
wxPoint center( kicad_x( e.x ), kicad_y( e.y ) );
int outlineRadius = radius + ( width / 2 );
for( int angle = 0; angle < 360; angle += 10 )
{
wxPoint rotatedPoint( outlineRadius, 0 );
@ -2169,6 +2177,7 @@ void EAGLE_PLUGIN::packageCircle( FOOTPRINT* aFootprint, wxXmlNode* aTree ) cons
{
zone->NewHole();
int innerRadius = radius - ( width / 2 );
for( int angle = 0; angle < 360; angle += 10 )
{
wxPoint rotatedPoint( innerRadius, 0 );
@ -2188,8 +2197,7 @@ void EAGLE_PLUGIN::packageCircle( FOOTPRINT* aFootprint, wxXmlNode* aTree ) cons
{
wxLogMessage( wxString::Format( _( "Ignoring a circle since Eagle layer '%s' (%d) "
"was not mapped" ),
eagle_layer_name( e.layer ),
e.layer ) );
eagle_layer_name( e.layer ), e.layer ) );
return;
}
@ -2294,8 +2302,9 @@ void EAGLE_PLUGIN::packageSMD( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const
int minPadSize = std::min( padSize.x, padSize.y );
// Rounded rectangle pads
int roundRadius = eagleClamp( m_rules->srMinRoundness * 2,
(int)( minPadSize * m_rules->srRoundness ), m_rules->srMaxRoundness * 2 );
int roundRadius =
eagleClamp( m_rules->srMinRoundness * 2, (int) ( minPadSize * m_rules->srRoundness ),
m_rules->srMaxRoundness * 2 );
if( e.roundness || roundRadius > 0 )
{
@ -2313,8 +2322,8 @@ void EAGLE_PLUGIN::packageSMD( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const
pad->SetOrientation( e.rot->degrees * 10 );
pad->SetLocalSolderPasteMargin( -eagleClamp( m_rules->mlMinCreamFrame,
(int) ( m_rules->mvCreamFrame * minPadSize ),
m_rules->mlMaxCreamFrame ) );
(int) ( m_rules->mvCreamFrame * minPadSize ),
m_rules->mlMaxCreamFrame ) );
// Solder mask
if( e.stop && *e.stop == false ) // enabled by default
@ -2348,9 +2357,10 @@ void EAGLE_PLUGIN::transferPad( const EPAD_COMMON& aEaglePad, PAD* aPad ) const
// Solder mask
const wxSize& padSize( aPad->GetSize() );
aPad->SetLocalSolderMaskMargin( eagleClamp( m_rules->mlMinStopFrame,
(int)( m_rules->mvStopFrame * std::min( padSize.x, padSize.y ) ),
m_rules->mlMaxStopFrame ) );
aPad->SetLocalSolderMaskMargin(
eagleClamp( m_rules->mlMinStopFrame,
(int) ( m_rules->mvStopFrame * std::min( padSize.x, padSize.y ) ),
m_rules->mlMaxStopFrame ) );
// Solid connection to copper zones
if( aEaglePad.thermals && !*aEaglePad.thermals )
@ -2421,15 +2431,15 @@ void EAGLE_PLUGIN::loadSignals( wxXmlNode* aSignals )
wxPoint center;
int width = w.width.ToPcbUnits();
if( width < m_min_trace )
m_min_trace = width;
if( w.curve )
{
center = ConvertArcCenter(
wxPoint( kicad_x( w.x1 ), kicad_y( w.y1 ) ),
wxPoint( kicad_x( w.x2 ), kicad_y( w.y2 ) ),
*w.curve );
center = ConvertArcCenter( wxPoint( kicad_x( w.x1 ), kicad_y( w.y1 ) ),
wxPoint( kicad_x( w.x2 ), kicad_y( w.y2 ) ),
*w.curve );
angle = DEG2RAD( *w.curve );
@ -2439,7 +2449,8 @@ void EAGLE_PLUGIN::loadSignals( wxXmlNode* aSignals )
radius = sqrt( pow( center.x - kicad_x( w.x1 ), 2 ) +
pow( center.y - kicad_y( w.y1 ), 2 ) );
int segs = GetArcToSegmentCount( KiROUND( radius ), ARC_HIGH_DEF, *w.curve );
int segs = GetArcToSegmentCount( KiROUND( radius ), ARC_HIGH_DEF,
*w.curve );
delta_angle = angle / segs;
}
@ -2480,7 +2491,6 @@ void EAGLE_PLUGIN::loadSignals( wxXmlNode* aSignals )
m_xpath->pop();
}
else if( itemName == "via" )
{
m_xpath->push( "via" );
@ -2489,8 +2499,7 @@ void EAGLE_PLUGIN::loadSignals( wxXmlNode* aSignals )
PCB_LAYER_ID layer_front_most = kicad_layer( v.layer_front_most );
PCB_LAYER_ID layer_back_most = kicad_layer( v.layer_back_most );
if( IsCopperLayer( layer_front_most ) &&
IsCopperLayer( layer_back_most ) )
if( IsCopperLayer( layer_front_most ) && IsCopperLayer( layer_back_most ) )
{
int kidiam;
int drillz = v.drill.ToPcbUnits();
@ -2519,9 +2528,10 @@ void EAGLE_PLUGIN::loadSignals( wxXmlNode* aSignals )
if( !v.diam || via->GetWidth() <= via->GetDrill() )
{
double annulus = eagleClamp( m_rules->rlMinViaOuter,
(double)( via->GetWidth() / 2 - via->GetDrill() ),
m_rules->rlMaxViaOuter );
double annulus =
eagleClamp( m_rules->rlMinViaOuter,
(double) ( via->GetWidth() / 2 - via->GetDrill() ),
m_rules->rlMaxViaOuter );
via->SetWidth( drillz + 2 * annulus );
}
@ -2597,7 +2607,9 @@ void EAGLE_PLUGIN::loadSignals( wxXmlNode* aSignals )
// therefore omit this signal/net.
}
else
{
netCode++;
}
// Get next signal
net = net->GetNext();
@ -2606,6 +2618,7 @@ void EAGLE_PLUGIN::loadSignals( wxXmlNode* aSignals )
m_xpath->pop(); // "signals.signal"
}
std::map<wxString, PCB_LAYER_ID> EAGLE_PLUGIN::DefaultLayerMappingCallback(
const std::vector<INPUT_LAYER_DESC>& aInputLayerDescriptionVector )
{
@ -2620,6 +2633,7 @@ std::map<wxString, PCB_LAYER_ID> EAGLE_PLUGIN::DefaultLayerMappingCallback(
return layer_map;
}
void EAGLE_PLUGIN::mapEagleLayersToKicad()
{
std::vector<INPUT_LAYER_DESC> inputDescs;
@ -2649,18 +2663,21 @@ void EAGLE_PLUGIN::mapEagleLayersToKicad()
dynamic_cast<wxWindow*>( m_progressReporter )->Show();
}
PCB_LAYER_ID EAGLE_PLUGIN::kicad_layer( int aEagleLayer ) const
{
auto result = m_layer_map.find( eagle_layer_name( aEagleLayer ) );
return result == m_layer_map.end() ? UNDEFINED_LAYER : result->second;
}
std::tuple<PCB_LAYER_ID, LSET, bool> EAGLE_PLUGIN::defaultKicadLayer( int aEagleLayer ) const
{
// eagle copper layer:
if( aEagleLayer >= 1 && aEagleLayer < int( arrayDim( m_cu_map ) ) )
{
LSET copperLayers;
for( int copperLayer : m_cu_map )
{
if( copperLayer >= 0 )
@ -2893,7 +2910,7 @@ void EAGLE_PLUGIN::cacheLib( const wxString& aLibPath )
m_xpath->push( "eagle.drawing.library" );
wxXmlNode* library = drawingChildren["library"];
loadLibrary( library, NULL );
loadLibrary( library, nullptr );
m_xpath->pop();
m_mod_time = modtime;
@ -2950,8 +2967,7 @@ void EAGLE_PLUGIN::FootprintEnumerate( wxArrayString& aFootprintNames, const wxS
FOOTPRINT* EAGLE_PLUGIN::FootprintLoad( const wxString& aLibraryPath,
const wxString& aFootprintName,
bool aKeepUUID,
const wxString& aFootprintName, bool aKeepUUID,
const PROPERTIES* aProperties )
{
init( aProperties );
@ -2959,7 +2975,7 @@ FOOTPRINT* EAGLE_PLUGIN::FootprintLoad( const wxString& aLibraryPath,
FOOTPRINT_MAP::const_iterator it = m_templates.find( aFootprintName );
if( it == m_templates.end() )
return NULL;
return nullptr;
// Return a copy of the template
FOOTPRINT* copy = (FOOTPRINT*) it->second->Duplicate();
@ -2971,47 +2987,4 @@ FOOTPRINT* EAGLE_PLUGIN::FootprintLoad( const wxString& aLibraryPath,
void EAGLE_PLUGIN::FootprintLibOptions( PROPERTIES* aListToAppendTo ) const
{
PLUGIN::FootprintLibOptions( aListToAppendTo );
/*
(*aListToAppendTo)["ignore_duplicates"] = UTF8( _( "Ignore duplicately named footprints within "
"the same Eagle library. "
"Only the first similarly named footprint "
"will be loaded." ) );
*/
}
/*
void EAGLE_PLUGIN::Save( const wxString& aFileName, BOARD* aBoard, const PROPERTIES* aProperties )
{
// Eagle lovers apply here.
}
void EAGLE_PLUGIN::FootprintSave( const wxString& aLibraryPath, const FOOTPRINT* aFootprint,
const PROPERTIES* aProperties )
{
}
void EAGLE_PLUGIN::FootprintDelete( const wxString& aLibraryPath, const wxString& aFootprintName )
{
}
void EAGLE_PLUGIN::FootprintLibCreate( const wxString& aLibraryPath, const PROPERTIES* aProperties )
{
}
bool EAGLE_PLUGIN::FootprintLibDelete( const wxString& aLibraryPath, const PROPERTIES* aProperties )
{
}
bool EAGLE_PLUGIN::IsFootprintLibWritable( const wxString& aLibraryPath )
{
return true;
}
*/

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2020 BeagleBoard Foundation
* Copyright (C) 2020 KiCad Developers, see CHANGELOG.TXT for contributors.
* Copyright (C) 2020-2021 KiCad Developers, see CHANGELOG.TXT for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -36,8 +36,8 @@
FABMASTER_PLUGIN::FABMASTER_PLUGIN()
{
m_board = NULL;
m_props = NULL;
m_board = nullptr;
m_props = nullptr;
}

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2020 KiCad Developers, see CHANGELOG.TXT for contributors.
* Copyright (C) 2020-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -36,16 +36,11 @@
class FABMASTER_PLUGIN : public PLUGIN
{
public:
const wxString PluginName() const override;
// -----<PUBLIC PLUGIN API>--------------------------------------------------
const wxString PluginName() const override;
BOARD* Load( const wxString& aFileName,
BOARD* aAppendToMe,
const PROPERTIES* aProperties = NULL,
PROJECT* aProject = nullptr,
PROGRESS_REPORTER* aProgressReporter = nullptr ) override;
BOARD* Load( const wxString& aFileName, BOARD* aAppendToMe,
const PROPERTIES* aProperties = nullptr, PROJECT* aProject = nullptr,
PROGRESS_REPORTER* aProgressReporter = nullptr ) override;
const wxString GetFileExtension() const override;
@ -55,8 +50,6 @@ public:
return 0;
}
// -----</PUBLIC PLUGIN API>-------------------------------------------------
FABMASTER_PLUGIN();
~FABMASTER_PLUGIN();
@ -67,4 +60,4 @@ private:
FABMASTER m_fabmaster;
};
#endif // PCAD_PLUGIN_H_
#endif // FABMASTER_PLUGIN_H_

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -98,8 +98,7 @@ static inline long parseInt( const wxString& aValue, double aScalar )
/**
* GPCB_FPL_CACHE_ITEM
* is helper class for creating a footprint library cache.
* helper class for creating a footprint library cache.
*
* The new footprint library design is a file path of individual footprint files
* that contain a single footprint per file. This class is a helper only for the
@ -108,14 +107,15 @@ static inline long parseInt( const wxString& aValue, double aScalar )
*/
class GPCB_FPL_CACHE_ITEM
{
WX_FILENAME m_filename; ///< The full file name and path of the footprint to cache.
std::unique_ptr<FOOTPRINT> m_footprint;
public:
GPCB_FPL_CACHE_ITEM( FOOTPRINT* aFootprint, const WX_FILENAME& aFileName );
WX_FILENAME GetFileName() const { return m_filename; }
FOOTPRINT* GetFootprint() const { return m_footprint.get(); }
private:
WX_FILENAME m_filename; ///< The full file name and path of the footprint to cache.
std::unique_ptr<FOOTPRINT> m_footprint;
};
@ -131,47 +131,6 @@ typedef boost::ptr_map< std::string, GPCB_FPL_CACHE_ITEM > FOOTPRINT_MAP;
class GPCB_FPL_CACHE
{
GPCB_PLUGIN* m_owner; ///< Plugin object that owns the cache.
wxFileName m_lib_path; ///< The path of the library.
FOOTPRINT_MAP m_footprints; ///< Map of footprint file name to FOOTPRINT*.
bool m_cache_dirty; ///< Stored separately because it's expensive to check
///< m_cache_timestamp against all the files.
long long m_cache_timestamp; ///< A hash of the timestamps for all the footprint
///< files.
FOOTPRINT* parseFOOTPRINT( LINE_READER* aLineReader );
/**
* Function testFlags
* tests \a aFlag for \a aMask or \a aName.
* @param aFlag = List of flags to test against: can be a bit field flag or a list name flag
* a bit field flag is an hexadecimal value: Ox00020000
* a list name flag is a string list of flags, comma separated like square,option1
* @param aMask = flag list to test
* @param aName = flag name to find in list
* @return true if found
*/
bool testFlags( const wxString& aFlag, long aMask, const wxChar* aName );
/**
* Function parseParameters
* extracts parameters and tokens from \a aLineReader and adds them to \a aParameterList.
*
* Delimiter characters are:
* [ ] ( ) Begin and end of parameter list and units indicator
* " is a string delimiter
* space is the param separator
* The first word is the keyword
* the second item is one of ( or [
* other are parameters (number or delimited string)
* last parameter is ) or ]
*
* @param aParameterList This list of parameters parsed.
* @param aLineReader The line reader object to parse.
*/
void parseParameters( wxArrayString& aParameterList, LINE_READER* aLineReader );
public:
GPCB_FPL_CACHE( GPCB_PLUGIN* aOwner, const wxString& aLibraryPath );
@ -190,18 +149,58 @@ public:
void Remove( const wxString& aFootprintName );
/**
* Function GetTimestamp
* Generate a timestamp representing all source files in the cache (including the
* parent directory).
*
* Timestamps should not be considered ordered. They either match or they don't.
*/
static long long GetTimestamp( const wxString& aLibPath );
/**
* Function IsModified
* Return true if the cache is not up-to-date.
*/
bool IsModified();
private:
FOOTPRINT* parseFOOTPRINT( LINE_READER* aLineReader );
/**
* Test \a aFlag for \a aMask or \a aName.
*
* @param aFlag is a list of flags to test against: can be a bit field flag or a list name flag
* a bit field flag is an hexadecimal value: Ox00020000 a list name flag is a
* string list of flags, comma separated like square,option1.
* @param aMask is the flag list to test.
* @param aName is the flag name to find in list.
* @return true if found.
*/
bool testFlags( const wxString& aFlag, long aMask, const wxChar* aName );
/**
* Extract parameters and tokens from \a aLineReader and adds them to \a aParameterList.
*
* Delimiter characters are:
* [ ] ( ) Begin and end of parameter list and units indicator
* " is a string delimiter
* space is the param separator
* The first word is the keyword
* the second item is one of ( or [
* other are parameters (number or delimited string)
* last parameter is ) or ]
*
* @param aParameterList This list of parameters parsed.
* @param aLineReader The line reader object to parse.
*/
void parseParameters( wxArrayString& aParameterList, LINE_READER* aLineReader );
GPCB_PLUGIN* m_owner; ///< Plugin object that owns the cache.
wxFileName m_lib_path; ///< The path of the library.
FOOTPRINT_MAP m_footprints; ///< Map of footprint file name to FOOTPRINT*.
bool m_cache_dirty; ///< Stored separately because it's expensive to check
///< m_cache_timestamp against all the files.
long long m_cache_timestamp; ///< A hash of the timestamps for all the footprint
///< files.
};
@ -317,14 +316,15 @@ FOOTPRINT* GPCB_FPL_CACHE::parseFOOTPRINT( LINE_READER* aLineReader )
#define NEW_GPCB_UNIT_CONV ( 0.01*IU_PER_MILS )
int paramCnt;
double conv_unit = NEW_GPCB_UNIT_CONV; // GPCB unit = 0.01 mils and Pcbnew 0.1
// GPCB unit = 0.01 mils and Pcbnew 0.1.
double conv_unit = NEW_GPCB_UNIT_CONV;
wxPoint textPos;
wxString msg;
wxArrayString parameters;
std::unique_ptr<FOOTPRINT> footprint = std::make_unique<FOOTPRINT>( nullptr );
if( aLineReader->ReadLine() == NULL )
if( aLineReader->ReadLine() == nullptr )
{
msg = aLineReader->GetSource() + ": empty file";
THROW_IO_ERROR( msg );
@ -374,6 +374,7 @@ FOOTPRINT* GPCB_FPL_CACHE::parseFOOTPRINT( LINE_READER* aLineReader )
// Read value
if( paramCnt > 10 )
footprint->SetValue( parameters[5] );
// With gEDA/pcb, value is meaningful after instantiation, only, so it's
// often empty in bare footprints.
if( footprint->Value().GetText().IsEmpty() )
@ -449,8 +450,8 @@ FOOTPRINT* GPCB_FPL_CACHE::parseFOOTPRINT( LINE_READER* aLineReader )
conv_unit = NEW_GPCB_UNIT_CONV;
}
wxLogTrace(
traceGedaPcbPlugin, wxT( "%s parameter count = %d." ), parameters[0], paramCnt );
wxLogTrace( traceGedaPcbPlugin, wxT( "%s parameter count = %d." ),
parameters[0], paramCnt );
// Parse a line with format: ElementLine [X1 Y1 X2 Y2 Thickness]
if( parameters[0].CmpNoCase( wxT( "ElementLine" ) ) == 0 )
@ -590,8 +591,7 @@ FOOTPRINT* GPCB_FPL_CACHE::parseFOOTPRINT( LINE_READER* aLineReader )
wxPoint padPos( (x1 + x2) / 2, (y1 + y2) / 2 );
pad->SetSize( wxSize( KiROUND( EuclideanNorm( delta ) ) + width,
width ) );
pad->SetSize( wxSize( KiROUND( EuclideanNorm( delta ) ) + width, width ) );
// Set the relative position before adjusting the absolute position
pad->SetPos0( padPos );

File diff suppressed because it is too large Load Diff

View File

@ -211,7 +211,7 @@ private:
FP_TEXT* parseFP_TEXT();
FP_SHAPE* parseFP_SHAPE();
PAD* parsePAD( FOOTPRINT* aParent = NULL );
PAD* parsePAD( FOOTPRINT* aParent = nullptr );
// Parse only the (option ...) inside a pad description
bool parsePAD_option( PAD* aPad );
@ -322,7 +322,7 @@ private:
inline int parseInt()
{
return (int)strtol( CurText(), NULL, 10 );
return (int)strtol( CurText(), nullptr, 10 );
}
inline int parseInt( const char* aExpected )
@ -334,7 +334,7 @@ private:
inline long parseHex()
{
NextTok();
return strtol( CurText(), NULL, 16 );
return strtol( CurText(), nullptr, 16 );
}
bool parseBool();

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2007, 2008 Lubo Racko <developer@lura.sk>
* Copyright (C) 2008, 2012 Alexander Lunev <al.lunev@yahoo.com>
* Copyright (C) 2012 KiCad Developers, see CHANGELOG.TXT for contributors.
* Copyright (C) 2012-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -41,9 +41,11 @@ namespace PCAD2KICAD {
// PCAD stroke font average ratio of width to size
const double TEXT_WIDTH_TO_SIZE_AVERAGE = 0.5;
// PCAD proportions of stroke font
const double STROKE_HEIGHT_TO_SIZE = 0.656;
const double STROKE_WIDTH_TO_SIZE = 0.69;
// TrueType font
const double TRUETYPE_HEIGHT_TO_SIZE = 0.585;
const double TRUETYPE_WIDTH_TO_SIZE = 0.585;
@ -51,6 +53,7 @@ const double TRUETYPE_THICK_PER_HEIGHT = 0.073;
const double TRUETYPE_BOLD_THICK_MUL = 1.6;
const long TRUETYPE_BOLD_MIN_WEIGHT = 700;
wxString GetWord( wxString* aStr )
{
wxString result = wxEmptyString;
@ -100,7 +103,7 @@ XNODE* FindPinMap( XNODE* aNode )
{
XNODE* result, * lNode;
result = NULL;
result = nullptr;
lNode = FindNode( aNode, wxT( "attachedPattern" ) );
if( lNode )
@ -110,7 +113,8 @@ XNODE* FindPinMap( XNODE* aNode )
}
double StrToDoublePrecisionUnits( const wxString& aStr, char aAxe, const wxString& aActualConversion )
double StrToDoublePrecisionUnits( const wxString& aStr, char aAxe,
const wxString& aActualConversion )
{
wxString ls;
double i;
@ -145,11 +149,13 @@ double StrToDoublePrecisionUnits( const wxString& aStr, char aAxe, const wxStrin
if( u == wxT( 'm' ) )
{
ls.ToCDouble( &i );
#ifdef PCAD2KICAD_SCALE_SCH_TO_INCH_GRID
if( aActualConversion == wxT( "SCH" )
|| aActualConversion == wxT( "SCHLIB" ) )
i = i * (0.0254 / 0.025);
#endif
i = Millimeter2iu( i );
}
else
@ -159,7 +165,9 @@ double StrToDoublePrecisionUnits( const wxString& aStr, char aAxe, const wxStrin
}
}
else
{
i = 0.0;
}
if( ( aActualConversion == wxT( "PCB" ) || aActualConversion == wxT( "SCH" ) )
&& aAxe == wxT( 'Y' ) )
@ -243,55 +251,41 @@ wxString ValidateReference( wxString aRef )
}
void SetWidth( wxString aStr,
const wxString& aDefaultMeasurementUnit,
int* aWidth,
void SetWidth( wxString aStr, const wxString& aDefaultMeasurementUnit, int* aWidth,
const wxString& aActualConversion )
{
*aWidth = StrToIntUnits( GetAndCutWordWithMeasureUnits( &aStr,
aDefaultMeasurementUnit ), wxT( ' ' ),
aActualConversion );
*aWidth = StrToIntUnits( GetAndCutWordWithMeasureUnits( &aStr, aDefaultMeasurementUnit ),
wxT( ' ' ), aActualConversion );
}
void SetHeight( wxString aStr,
const wxString& aDefaultMeasurementUnit,
int* aHeight,
void SetHeight( wxString aStr, const wxString& aDefaultMeasurementUnit, int* aHeight,
const wxString& aActualConversion )
{
*aHeight = StrToIntUnits( GetAndCutWordWithMeasureUnits( &aStr,
aDefaultMeasurementUnit ), wxT( ' ' ),
aActualConversion );
*aHeight = StrToIntUnits( GetAndCutWordWithMeasureUnits( &aStr, aDefaultMeasurementUnit ),
wxT( ' ' ), aActualConversion );
}
void SetPosition( wxString aStr,
const wxString& aDefaultMeasurementUnit,
int* aX,
int* aY,
void SetPosition( wxString aStr, const wxString& aDefaultMeasurementUnit, int* aX, int* aY,
const wxString& aActualConversion )
{
*aX = StrToIntUnits( GetAndCutWordWithMeasureUnits( &aStr,
aDefaultMeasurementUnit ), wxT( 'X' ),
aActualConversion );
*aY = StrToIntUnits( GetAndCutWordWithMeasureUnits( &aStr,
aDefaultMeasurementUnit ), wxT( 'Y' ),
aActualConversion );
*aX = StrToIntUnits( GetAndCutWordWithMeasureUnits( &aStr, aDefaultMeasurementUnit ),
wxT( 'X' ), aActualConversion );
*aY = StrToIntUnits( GetAndCutWordWithMeasureUnits( &aStr, aDefaultMeasurementUnit ),
wxT( 'Y' ), aActualConversion );
}
void SetDoublePrecisionPosition( wxString aStr,
const wxString& aDefaultMeasurementUnit,
double* aX,
double* aY,
const wxString& aActualConversion )
void SetDoublePrecisionPosition( wxString aStr, const wxString& aDefaultMeasurementUnit, double* aX,
double* aY, const wxString& aActualConversion )
{
*aX = StrToDoublePrecisionUnits( GetAndCutWordWithMeasureUnits( &aStr,
aDefaultMeasurementUnit ), wxT( 'X' ),
aActualConversion );
*aY = StrToDoublePrecisionUnits( GetAndCutWordWithMeasureUnits( &aStr,
aDefaultMeasurementUnit ), wxT( 'Y' ),
aActualConversion );
*aX = StrToDoublePrecisionUnits(
GetAndCutWordWithMeasureUnits( &aStr, aDefaultMeasurementUnit ), wxT( 'X' ),
aActualConversion );
*aY = StrToDoublePrecisionUnits(
GetAndCutWordWithMeasureUnits( &aStr, aDefaultMeasurementUnit ), wxT( 'Y' ),
aActualConversion );
}
@ -322,22 +316,17 @@ TTEXT_JUSTIFY GetJustifyIdentificator( const wxString& aJustify )
}
void SetTextParameters( XNODE* aNode,
TTEXTVALUE* aTextValue,
const wxString& aDefaultMeasurementUnit,
const wxString& aActualConversion )
void SetTextParameters( XNODE* aNode, TTEXTVALUE* aTextValue,
const wxString& aDefaultMeasurementUnit, const wxString& aActualConversion )
{
XNODE* tNode;
wxString str;
XNODE* tNode;
wxString str;
tNode = FindNode( aNode, wxT( "pt" ) );
if( tNode )
SetPosition( tNode->GetNodeContent(),
aDefaultMeasurementUnit,
&aTextValue->textPositionX,
&aTextValue->textPositionY,
aActualConversion );
SetPosition( tNode->GetNodeContent(), aDefaultMeasurementUnit, &aTextValue->textPositionX,
&aTextValue->textPositionY, aActualConversion );
tNode = FindNode( aNode, wxT( "rotation" ) );
@ -376,9 +365,7 @@ void SetTextParameters( XNODE* aNode,
}
void SetFontProperty( XNODE* aNode,
TTEXTVALUE* aTextValue,
const wxString& aDefaultMeasurementUnit,
void SetFontProperty( XNODE* aNode, TTEXTVALUE* aTextValue, const wxString& aDefaultMeasurementUnit,
const wxString& aActualConversion )
{
wxString n, propValue;
@ -389,6 +376,7 @@ void SetFontProperty( XNODE* aNode,
aNode = aNode->GetParent();
aNode = FindNode( aNode, wxT( "library" ) );
if( aNode )
aNode = FindNode( aNode, wxT( "textStyleDef" ) );
@ -413,6 +401,7 @@ void SetFontProperty( XNODE* aNode,
aNode = FindNode( aNode, wxT( "font" ) );
fontType = FindNodeGetContent( aNode, wxT( "fontType" ) );
if( ( aTextValue->isTrueType && ( fontType != wxT( "TrueType" ) ) ) ||
( !aTextValue->isTrueType && ( fontType != wxT( "Stroke" ) ) ) )
aNode = aNode->GetNext();
@ -425,6 +414,7 @@ void SetFontProperty( XNODE* aNode,
aTextValue->isItalic = ( propValue == wxT( "True" ) );
propValue = FindNodeGetContent( aNode, wxT( "fontWeight" ) );
if( propValue != wxEmptyString )
{
long fontWeight;
@ -437,6 +427,7 @@ void SetFontProperty( XNODE* aNode,
XNODE* lNode;
lNode = FindNode( aNode, wxT( "fontHeight" ) );
if( lNode )
SetHeight( lNode->GetNodeContent(), aDefaultMeasurementUnit,
&aTextValue->textHeight, aActualConversion );
@ -444,12 +435,14 @@ void SetFontProperty( XNODE* aNode,
if( aTextValue->isTrueType )
{
aTextValue->textstrokeWidth = TRUETYPE_THICK_PER_HEIGHT * aTextValue->textHeight;
if( aTextValue->isBold )
aTextValue->textstrokeWidth *= TRUETYPE_BOLD_THICK_MUL;
}
else
{
lNode = FindNode( aNode, wxT( "strokeWidth" ) );
if( lNode )
SetWidth( lNode->GetNodeContent(), aDefaultMeasurementUnit,
&aTextValue->textstrokeWidth, aActualConversion );
@ -518,21 +511,16 @@ void CorrectTextPosition( TTEXTVALUE* aValue )
int posX = 0;
int posY = 0;
if( aValue->justify == LowerLeft ||
aValue->justify == Left ||
aValue->justify == UpperLeft )
if( aValue->justify == LowerLeft || aValue->justify == Left || aValue->justify == UpperLeft )
posX += cl * cm;
else if( aValue->justify == LowerRight ||
aValue->justify == Right ||
else if( aValue->justify == LowerRight || aValue->justify == Right ||
aValue->justify == UpperRight )
posX -= cl * cm;
if( aValue->justify == LowerLeft ||
aValue->justify == LowerCenter ||
if( aValue->justify == LowerLeft || aValue->justify == LowerCenter ||
aValue->justify == LowerRight )
posY -= ch;
else if( aValue->justify == UpperLeft ||
aValue->justify == UpperCenter ||
else if( aValue->justify == UpperLeft || aValue->justify == UpperCenter ||
aValue->justify == UpperRight )
posY += ch;
@ -569,9 +557,10 @@ XNODE* FindNode( XNODE* aChild, const wxString& aTag )
aChild = aChild->GetNext();
}
return NULL;
return nullptr;
}
wxString FindNodeGetContent( XNODE* aChild, const wxString& aTag )
{
wxString str = wxEmptyString;
@ -588,6 +577,7 @@ wxString FindNodeGetContent( XNODE* aChild, const wxString& aTag )
return str;
}
void InitTTextValue( TTEXTVALUE* aTextValue )
{
aTextValue->text = wxEmptyString;

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012 Alexander Lunev <al.lunev@yahoo.com>
* Copyright (C) 2012-2020 KiCad Developers, see CHANGELOG.TXT for contributors.
* Copyright (C) 2012-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -41,10 +41,11 @@
using namespace PCAD2KICAD;
PCAD_PLUGIN::PCAD_PLUGIN()
{
m_board = NULL;
m_props = NULL;
m_board = nullptr;
m_props = nullptr;
}
@ -84,7 +85,7 @@ BOARD* PCAD_PLUGIN::Load( const wxString& aFileName, BOARD* aAppendToMe,
LOCALE_IO toggle; // toggles on, then off, the C locale.
LoadInputFile( aFileName, &xmlDoc );
pcb.ParseBoard( NULL, &xmlDoc, wxT( "PCB" ) );
pcb.ParseBoard( nullptr, &xmlDoc, wxT( "PCB" ) );
pcb.AddToBoard();
return m_board;

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2007, 2008 Lubo Racko <developer@lura.sk>
* Copyright (C) 2007, 2008, 2012-2013 Alexander Lunev <al.lunev@yahoo.com>
* Copyright (C) 2012-2020 KiCad Developers, see CHANGELOG.TXT for contributors.
* Copyright (C) 2012-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -42,6 +42,7 @@
namespace PCAD2KICAD {
PCB_LAYER_ID PCB::GetKiCadLayer( int aPCadLayer ) const
{
auto it = m_LayersMap.find( aPCadLayer );
@ -52,6 +53,7 @@ PCB_LAYER_ID PCB::GetKiCadLayer( int aPCadLayer ) const
return it->second.KiCadLayer;
}
LAYER_TYPE_T PCB::GetLayerType( int aPCadLayer ) const
{
auto it = m_LayersMap.find( aPCadLayer );
@ -62,6 +64,7 @@ LAYER_TYPE_T PCB::GetLayerType( int aPCadLayer ) const
return it->second.layerType;
}
wxString PCB::GetLayerNetNameRef( int aPCadLayer ) const
{
auto it = m_LayersMap.find( aPCadLayer );
@ -72,6 +75,7 @@ wxString PCB::GetLayerNetNameRef( int aPCadLayer ) const
return it->second.netNameRef;
}
PCB::PCB( BOARD* aBoard ) :
PCB_FOOTPRINT( this, aBoard )
{
@ -137,7 +141,7 @@ int PCB::GetNetCode( const wxString& aNetName ) const
XNODE* PCB::FindCompDefName( XNODE* aNode, const wxString& aName ) const
{
XNODE* result = NULL, * lNode;
XNODE* result = nullptr, * lNode;
wxString propValue;
lNode = FindNode( aNode, wxT( "compDef" ) );
@ -151,7 +155,7 @@ XNODE* PCB::FindCompDefName( XNODE* aNode, const wxString& aName ) const
if( propValue == aName )
{
result = lNode;
lNode = NULL;
lNode = nullptr;
}
}
@ -163,10 +167,8 @@ XNODE* PCB::FindCompDefName( XNODE* aNode, const wxString& aName ) const
}
void PCB::SetTextProperty( XNODE* aNode, TTEXTVALUE* aTextValue,
const wxString& aPatGraphRefName,
const wxString& aXmlName,
const wxString& aActualConversion )
void PCB::SetTextProperty( XNODE* aNode, TTEXTVALUE* aTextValue, const wxString& aPatGraphRefName,
const wxString& aXmlName, const wxString& aActualConversion )
{
XNODE* tNode, * t1Node;
wxString n, nnew, pn, propValue, str;
@ -204,7 +206,7 @@ void PCB::SetTextProperty( XNODE* aNode, TTEXTVALUE* aTextValue,
str.Trim( true );
nnew = n; // new file version
n = n + wxT( ' ' ) + str; // old file version
tNode = NULL;
tNode = nullptr;
}
}
}
@ -234,10 +236,8 @@ void PCB::SetTextProperty( XNODE* aNode, TTEXTVALUE* aTextValue,
}
void PCB::DoPCBComponents( XNODE* aNode,
wxXmlDocument* aXmlDoc,
const wxString& aActualConversion,
wxStatusBar* aStatusBar )
void PCB::DoPCBComponents( XNODE* aNode, wxXmlDocument* aXmlDoc, const wxString& aActualConversion,
wxStatusBar* aStatusBar )
{
XNODE* lNode, * tNode, * mNode;
PCB_FOOTPRINT* fp;
@ -250,7 +250,7 @@ void PCB::DoPCBComponents( XNODE* aNode,
while( lNode )
{
fp = NULL;
fp = nullptr;
if( lNode->GetName() == wxT( "pattern" ) )
{
@ -268,6 +268,7 @@ void PCB::DoPCBComponents( XNODE* aNode,
fp = new PCB_FOOTPRINT( this, m_board );
mNode = FindNode( lNode, wxT( "patternGraphicsNameRef" ) );
if( mNode )
mNode->GetAttribute( wxT( "Name" ), &fp->m_patGraphRefName );
@ -346,10 +347,12 @@ void PCB::DoPCBComponents( XNODE* aNode,
fp->m_compRef.Trim( true );
}
tNode = NULL;
tNode = nullptr;
}
else
{
tNode = tNode->GetNext();
}
}
}
@ -462,24 +465,6 @@ int PCB::FindLayer( const wxString& aLayerName ) const
}
/* KiCad layers
* 0 Copper layer
* 1 to 14 Inner layers
* 15 Component layer
* 16 Copper side adhesive layer Technical layers
* 17 Component side adhesive layer
* 18 Copper side Solder paste layer
* 19 Component Solder paste layer
* 20 Copper side Silk screen layer
* 21 Component Silk screen layer
* 22 Copper side Solder mask layer
* 23 Component Solder mask layer
* 24 Draw layer (Used for general drawings)
* 25 Comment layer (Other layer used for general drawings)
* 26 ECO1 layer (Other layer used for general drawings) // BUG
* 26 ECO2 layer (Other layer used for general drawings) // BUG 27
* 27 Edge layer. Items on Edge layer are seen on all layers // BUG 28
*/
void PCB::MapLayer( XNODE* aNode )
{
wxString lName, layerType;
@ -490,27 +475,49 @@ void PCB::MapLayer( XNODE* aNode )
lName = lName.MakeUpper();
if( lName == wxT( "TOP ASSY" ) )
{
KiCadLayer = F_Fab;
}
else if( lName == wxT( "TOP SILK" ) )
{
KiCadLayer = F_SilkS;
}
else if( lName == wxT( "TOP PASTE" ) )
{
KiCadLayer = F_Paste;
}
else if( lName == wxT( "TOP MASK" ) )
{
KiCadLayer = F_Mask;
}
else if( lName == wxT( "TOP" ) )
{
KiCadLayer = F_Cu;
}
else if( lName == wxT( "BOTTOM" ) )
{
KiCadLayer = B_Cu;
}
else if( lName == wxT( "BOT MASK" ) )
{
KiCadLayer = B_Mask;
}
else if( lName == wxT( "BOT PASTE" ) )
{
KiCadLayer = B_Paste;
}
else if( lName == wxT( "BOT SILK" ) )
{
KiCadLayer = B_SilkS;
}
else if( lName == wxT( "BOT ASSY" ) )
{
KiCadLayer = B_Fab;
}
else if( lName == wxT( "BOARD" ) )
{
KiCadLayer = Edge_Cuts;
}
else
{
int layernum = FindLayer( lName );
@ -540,8 +547,10 @@ void PCB::MapLayer( XNODE* aNode )
if( layerType == wxT( "NonSignal" ) )
newlayer.layerType = LAYER_TYPE_NONSIGNAL;
if( layerType == wxT( "Signal" ) )
newlayer.layerType = LAYER_TYPE_SIGNAL;
if( layerType == wxT( "Plane" ) )
newlayer.layerType = LAYER_TYPE_PLANE;
}
@ -560,12 +569,15 @@ int PCB::FindOutlinePoint( const VERTICES_ARRAY* aOutline, wxRealPoint aPoint )
int i;
for( i = 0; i < (int) aOutline->GetCount(); i++ )
{
if( *((*aOutline)[i]) == aPoint )
return i;
}
return -1;
}
/*int cmpFunc( wxRealPoint **first, wxRealPoint **second )
{
return sqrt( pow( (double) aPointA.x - (double) aPointB.x, 2 ) +
@ -573,12 +585,12 @@ int PCB::FindOutlinePoint( const VERTICES_ARRAY* aOutline, wxRealPoint aPoint )
return 0;
}*/
double PCB::GetDistance( const wxRealPoint* aPoint1, const wxRealPoint* aPoint2 ) const
{
return sqrt( ( aPoint1->x - aPoint2->x ) *
( aPoint1->x - aPoint2->x ) +
( aPoint1->y - aPoint2->y ) *
( aPoint1->y - aPoint2->y ) );
return sqrt( ( aPoint1->x - aPoint2->x ) * ( aPoint1->x - aPoint2->x ) +
( aPoint1->y - aPoint2->y ) * ( aPoint1->y - aPoint2->y ) );
}
void PCB::GetBoardOutline( wxXmlDocument* aXmlDoc, const wxString& aActualConversion )
@ -607,6 +619,7 @@ void PCB::GetBoardOutline( wxXmlDocument* aXmlDoc, const wxString& aActualConver
if( GetKiCadLayer( PCadLayer ) == Edge_Cuts )
{
lNode = iNode->GetChildren();
while( lNode )
{
if( lNode->GetName() == wxT( "line" ) )
@ -650,6 +663,7 @@ void PCB::GetBoardOutline( wxXmlDocument* aXmlDoc, const wxString& aActualConver
for( j = i + 2; j < (int) m_BoardOutline.GetCount(); j++ )
{
distance = GetDistance( m_BoardOutline[i], m_BoardOutline[j] );
if( distance < minDistance )
{
minDistance = distance;
@ -672,7 +686,9 @@ void PCB::GetBoardOutline( wxXmlDocument* aXmlDoc, const wxString& aActualConver
}
}
void PCB::ParseBoard( wxStatusBar* aStatusBar, wxXmlDocument* aXmlDoc, const wxString& aActualConversion )
void PCB::ParseBoard( wxStatusBar* aStatusBar, wxXmlDocument* aXmlDoc,
const wxString& aActualConversion )
{
XNODE* aNode;//, *aaNode;
PCB_NET* net;
@ -811,7 +827,7 @@ void PCB::ParseBoard( wxStatusBar* aStatusBar, wxXmlDocument* aXmlDoc, const wxS
// objects
if( aNode->GetName() == wxT( "layerContents" ) )
DoLayerContentsObjects( aNode, NULL, &m_PcbComponents, aStatusBar,
DoLayerContentsObjects( aNode, nullptr, &m_PcbComponents, aStatusBar,
m_DefaultMeasurementUnit, aActualConversion );
aNode = aNode->GetNext();

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2007, 2008 Lubo Racko <developer@lura.sk>
* Copyright (C) 2007, 2008, 2012-2013 Alexander Lunev <al.lunev@yahoo.com>
* Copyright (C) 2012-2020 KiCad Developers, see CHANGELOG.TXT for contributors.
* Copyright (C) 2012-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -44,6 +44,7 @@
namespace PCAD2KICAD {
PCB_FOOTPRINT::PCB_FOOTPRINT( PCB_CALLBACKS* aCallbacks, BOARD* aBoard ) :
PCB_COMPONENT( aCallbacks, aBoard )
{
@ -70,7 +71,7 @@ XNODE* PCB_FOOTPRINT::FindModulePatternDefName( XNODE* aNode, const wxString& aN
XNODE* result, * lNode;
wxString propValue1, propValue2;
result = NULL;
result = nullptr;
lNode = FindNode( aNode, wxT( "patternDef" ) );
while( lNode )
@ -81,11 +82,10 @@ XNODE* PCB_FOOTPRINT::FindModulePatternDefName( XNODE* aNode, const wxString& aN
FindNode( lNode,
wxT( "originalName" ) )->GetAttribute( wxT( "Name" ), &propValue2 );
if( ValidateName( propValue1 ) == aName
|| ValidateName( propValue2 ) == aName )
if( ValidateName( propValue1 ) == aName || ValidateName( propValue2 ) == aName )
{
result = lNode;
lNode = NULL;
lNode = nullptr;
}
}
@ -93,7 +93,7 @@ XNODE* PCB_FOOTPRINT::FindModulePatternDefName( XNODE* aNode, const wxString& aN
lNode = lNode->GetNext();
}
if( result == NULL )
if( result == nullptr )
{
lNode = FindNode( aNode, wxT( "patternDefExtended" ) ); // New file format
@ -106,7 +106,7 @@ XNODE* PCB_FOOTPRINT::FindModulePatternDefName( XNODE* aNode, const wxString& aN
if( ValidateName( propValue1 ) == aName )
{
result = lNode;
lNode = NULL;
lNode = nullptr;
}
}
@ -124,7 +124,7 @@ XNODE* PCB_FOOTPRINT::FindPatternMultilayerSection( XNODE* aNode, wxString* aPat
XNODE* result, * pNode, * lNode;
wxString propValue, patName;
result = NULL;
result = nullptr;
pNode = aNode; // pattern;
lNode = aNode;
@ -148,7 +148,7 @@ XNODE* PCB_FOOTPRINT::FindPatternMultilayerSection( XNODE* aNode, wxString* aPat
pNode = lNode; // pattern;
}
lNode = NULL;
lNode = nullptr;
if( pNode )
lNode = FindNode( pNode, wxT( "multiLayer" ) ); // Old file format
@ -182,7 +182,7 @@ XNODE* PCB_FOOTPRINT::FindPatternMultilayerSection( XNODE* aNode, wxString* aPat
if( lNode )
{
result = FindNode( lNode, wxT( "multiLayer" ) );
lNode = NULL;
lNode = nullptr;
}
}
@ -197,13 +197,17 @@ XNODE* PCB_FOOTPRINT::FindPatternMultilayerSection( XNODE* aNode, wxString* aPat
if( propValue == *aPatGraphRefName )
{
result = FindNode( lNode, wxT( "multiLayer" ) );
lNode = NULL;
lNode = nullptr;
}
else
{
lNode = lNode->GetNext();
}
}
else
{
lNode = lNode->GetNext();
}
}
}
@ -211,16 +215,14 @@ XNODE* PCB_FOOTPRINT::FindPatternMultilayerSection( XNODE* aNode, wxString* aPat
}
void PCB_FOOTPRINT::DoLayerContentsObjects( XNODE* aNode,
PCB_FOOTPRINT* aFootprint,
PCB_COMPONENTS_ARRAY* aList,
wxStatusBar* aStatusBar,
const wxString& aDefaultMeasurementUnit,
const wxString& aActualConversion )
void PCB_FOOTPRINT::DoLayerContentsObjects( XNODE* aNode, PCB_FOOTPRINT* aFootprint,
PCB_COMPONENTS_ARRAY* aList, wxStatusBar* aStatusBar,
const wxString& aDefaultMeasurementUnit,
const wxString& aActualConversion )
{
PCB_ARC* arc;
PCB_POLYGON* polygon;
PCB_POLYGON *plane_layer = NULL;
PCB_POLYGON *plane_layer = nullptr;
PCB_COPPER_POUR* copperPour;
PCB_CUTOUT* cutout;
PCB_PLANE* plane;
@ -234,6 +236,7 @@ void PCB_FOOTPRINT::DoLayerContentsObjects( XNODE* aNode,
long num = 0;
i = 0;
// aStatusBar->SetStatusText( wxT( "Processing LAYER CONTENT OBJECTS " ) );
if( FindNode( aNode, wxT( "layerNumRef" ) ) )
FindNode( aNode, wxT( "layerNumRef" ) )->GetNodeContent().ToLong( &num );
@ -294,9 +297,7 @@ void PCB_FOOTPRINT::DoLayerContentsObjects( XNODE* aNode,
// function CreatePCBModule(). However it is not clear whether the access is
// required when the function DoLayerContentsObjects() is called from
// function ProcessXMLtoPCBLib().
SetFontProperty( tNode,
&aFootprint->m_name,
aDefaultMeasurementUnit,
SetFontProperty( tNode, &aFootprint->m_name, aDefaultMeasurementUnit,
aActualConversion );
}
}
@ -316,15 +317,15 @@ void PCB_FOOTPRINT::DoLayerContentsObjects( XNODE* aNode,
{
plane_layer_polygon = new VERTICES_ARRAY;
wxASSERT( plane_layer );
plane_layer->FormPolygon( lNode, plane_layer_polygon, aDefaultMeasurementUnit, aActualConversion );
plane_layer->FormPolygon( lNode, plane_layer_polygon, aDefaultMeasurementUnit,
aActualConversion );
plane_layer->m_cutouts.Add( plane_layer_polygon );
}
else
{
polygon = new PCB_POLYGON( m_callbacks, m_board, PCadLayer );
if( polygon->Parse( lNode,
aDefaultMeasurementUnit,
aActualConversion ) )
if( polygon->Parse( lNode, aDefaultMeasurementUnit, aActualConversion ) )
aList->Add( polygon );
else
delete polygon;
@ -376,15 +377,15 @@ void PCB_FOOTPRINT::SetName( const wxString& aPin, const wxString& aName )
for( i = 0; i < (int) m_FootprintItems.GetCount(); i++ )
{
if( m_FootprintItems[i]->m_objType == wxT( 'P' ) )
if(( (PCB_PAD*) m_FootprintItems[i] )->m_Number == num )
{
if( ( (PCB_PAD*) m_FootprintItems[i] )->m_Number == num )
( (PCB_PAD*) m_FootprintItems[i] )->m_name.text = aName;
}
}
}
void PCB_FOOTPRINT::Parse( XNODE* aNode, wxStatusBar* aStatusBar,
void PCB_FOOTPRINT::Parse( XNODE* aNode, wxStatusBar* aStatusBar,
const wxString& aDefaultMeasurementUnit,
const wxString& aActualConversion )
{
@ -393,8 +394,7 @@ void PCB_FOOTPRINT::Parse( XNODE* aNode, wxStatusBar* aStatusBar,
PCB_VIA* via;
wxString propValue, str;
FindNode( aNode, wxT( "originalName" ) )->GetAttribute( wxT( "Name" ),
&propValue );
FindNode( aNode, wxT( "originalName" ) )->GetAttribute( wxT( "Name" ), &propValue );
propValue.Trim( false );
m_name.text = propValue;
@ -524,6 +524,7 @@ void PCB_FOOTPRINT::AddToBoard()
ref_text->SetType( FP_TEXT::TEXT_is_REFERENCE );
ref_text->SetPos0( wxPoint( m_name.correctedPositionX, m_name.correctedPositionY ) );
if( m_name.isTrueType )
SetTextSizeFromTrueTypeFontHeight( ref_text, m_name.textHeight );
else
@ -551,6 +552,7 @@ void PCB_FOOTPRINT::AddToBoard()
val_text->SetType( FP_TEXT::TEXT_is_VALUE );
val_text->SetPos0( wxPoint( m_Value.correctedPositionX, m_Value.correctedPositionY ) );
if( m_Value.isTrueType )
SetTextSizeFromTrueTypeFontHeight( val_text, m_Value.textHeight );
else

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2007, 2008 Lubo Racko <developer@lura.sk>
* Copyright (C) 2007, 2008, 2012-2013 Alexander Lunev <al.lunev@yahoo.com>
* Copyright (C) 2012-2020 KiCad Developers, see CHANGELOG.TXT for contributors.
* Copyright (C) 2012-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -38,6 +38,7 @@
namespace PCAD2KICAD {
PCB_PAD::PCB_PAD( PCB_CALLBACKS* aCallbacks, BOARD* aBoard ) :
PCB_COMPONENT( aCallbacks, aBoard )
{
@ -118,6 +119,7 @@ void PCB_PAD::Parse( XNODE* aNode, const wxString& aDefaultUnits,
if( lNode )
{
lNode->GetAttribute( wxT( "Name" ), &propValue );
//propValue.Trim( false );
m_defaultPinDes = propValue;
}
@ -245,6 +247,7 @@ void PCB_PAD::AddToFootprint( FOOTPRINT* aFootprint, int aRotation, bool aEncaps
pad->SetLayerSet( LSET( 3, F_Cu, F_Paste, F_Mask ) );
else
pad->SetLayerSet( LSET( 3, B_Cu, B_Paste, B_Mask ) );
break;
}
}
@ -272,11 +275,17 @@ void PCB_PAD::AddToFootprint( FOOTPRINT* aFootprint, int aRotation, bool aEncaps
pad->SetShape( PAD_SHAPE::CIRCLE );
}
else if( padShapeName == wxT( "Rect" ) )
{
pad->SetShape( PAD_SHAPE::RECT );
}
else if( padShapeName == wxT( "RndRect" ) )
{
pad->SetShape( PAD_SHAPE::ROUNDRECT );
}
else if( padShapeName == wxT( "Polygon" ) )
{
pad->SetShape( PAD_SHAPE::RECT ); // approximation
}
pad->SetSize( wxSize( width, height ) );
pad->SetDelta( wxSize( 0, 0 ) );
@ -291,7 +300,7 @@ void PCB_PAD::AddToFootprint( FOOTPRINT* aFootprint, int aRotation, bool aEncaps
// Set the proper net code
NETINFO_ITEM* netinfo = m_board->FindNet( m_net );
if( netinfo == NULL ) // I believe this should not happen, but just in case
if( netinfo == nullptr ) // I believe this should not happen, but just in case
{
// It is a new net
netinfo = new NETINFO_ITEM( m_board, m_net );

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012-2013 Alexander Lunev <al.lunev@yahoo.com>
* Copyright (C) 2012 KiCad Developers, see CHANGELOG.TXT for contributors.
* Copyright (C) 2012-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -36,11 +36,12 @@ namespace PCAD2KICAD {
static KEYWORD empty_keywords[1] = {};
static const char ACCEL_ASCII_KEYWORD[] = "ACCEL_ASCII";
void LoadInputFile( const wxString& aFileName, wxXmlDocument* aXmlDoc )
void LoadInputFile( const wxString& aFileName, wxXmlDocument* aXmlDoc )
{
char line[sizeof( ACCEL_ASCII_KEYWORD )];
int tok;
XNODE* iNode = NULL, *cNode = NULL;
XNODE* iNode = nullptr, *cNode = nullptr;
wxString str, propValue, content;
wxCSConv conv( wxT( "windows-1251" ) );
@ -80,6 +81,7 @@ void LoadInputFile( const wxString& aFileName, wxXmlDocument* aXmlDoc )
else if( cNode )
{
str = wxString( lexer.CurText(), conv );
if( tok == DSN_STRING )
{
// update attribute
@ -89,7 +91,9 @@ void LoadInputFile( const wxString& aFileName, wxXmlDocument* aXmlDoc )
iNode->AddAttribute( wxT( "Name" ), propValue + wxT( ' ' ) + str );
}
else
{
iNode->AddAttribute( wxT( "Name" ), str );
}
}
else if( str != wxEmptyString )
{
@ -99,9 +103,7 @@ void LoadInputFile( const wxString& aFileName, wxXmlDocument* aXmlDoc )
if( cNode->GetChildren() )
cNode->GetChildren()->SetContent( content );
else
cNode->AddChild( new wxXmlNode( wxXML_TEXT_NODE,
wxEmptyString,
content ) );
cNode->AddChild( new wxXmlNode( wxXML_TEXT_NODE, wxEmptyString, content ) );
}
}
}

View File

@ -57,6 +57,7 @@ PyObject* PYTHON_ACTION_PLUGIN::CallMethod( const char* aMethod, PyObject* aArgl
PyLOCK lock;
PyErr_Clear();
// pFunc is a new reference to the desired method
PyObject* pFunc = PyObject_GetAttrString( m_PyAction, aMethod );
@ -67,8 +68,8 @@ PyObject* PYTHON_ACTION_PLUGIN::CallMethod( const char* aMethod, PyObject* aArgl
if( PyErr_Occurred() )
{
wxMessageBox( PyErrStringWithTraceback(),
_( "Exception on python action plugin code" ),
wxICON_ERROR | wxOK );
_( "Exception on python action plugin code" ),
wxICON_ERROR | wxOK );
}
if( result )
@ -88,7 +89,7 @@ PyObject* PYTHON_ACTION_PLUGIN::CallMethod( const char* aMethod, PyObject* aArgl
Py_XDECREF( pFunc );
}
return NULL;
return nullptr;
}
@ -258,7 +259,7 @@ void PCB_EDIT_FRAME::RunActionPlugin( ACTION_PLUGIN* aActionPlugin )
ACTION_PLUGINS::SetActionRunning( false );
// Get back the undo buffer to fix some modifications
PICKED_ITEMS_LIST* oldBuffer = NULL;
PICKED_ITEMS_LIST* oldBuffer = nullptr;
if( fromEmpty )
{
@ -313,6 +314,7 @@ void PCB_EDIT_FRAME::RunActionPlugin( ACTION_PLUGIN* aActionPlugin )
{
oldBuffer->PushItem( deletedItemsList.GetItemWrapper( i ) );
}
// Find new footprints
for( FOOTPRINT* item : currentPcb->Footprints() )
{
@ -379,12 +381,13 @@ void PCB_EDIT_FRAME::buildActionPluginMenus( ACTION_MENU* actionMenu )
{
wxMenuItem* item;
ACTION_PLUGIN* ap = ACTION_PLUGINS::GetAction( ii );
const wxBitmap& bitmap = ap->iconBitmap.IsOk() ? ap->iconBitmap : KiBitmap( BITMAPS::puzzle_piece );
const wxBitmap& bitmap = ap->iconBitmap.IsOk() ? ap->iconBitmap :
KiBitmap( BITMAPS::puzzle_piece );
item = AddMenuItem( actionMenu, wxID_ANY, ap->GetName(), ap->GetDescription(), bitmap );
Connect( item->GetId(), wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler( PCB_EDIT_FRAME::OnActionPluginMenu ) );
wxCommandEventHandler( PCB_EDIT_FRAME::OnActionPluginMenu ) );
ACTION_PLUGINS::SetActionMenu( ii, item->GetId() );
}
@ -414,11 +417,11 @@ void PCB_EDIT_FRAME::AddActionPluginTools()
else
bitmap = KiScaledBitmap( BITMAPS::puzzle_piece, this );
wxAuiToolBarItem* button = m_mainToolBar->AddTool(
wxID_ANY, wxEmptyString, bitmap, ap->GetName() );
wxAuiToolBarItem* button = m_mainToolBar->AddTool( wxID_ANY, wxEmptyString,
bitmap, ap->GetName() );
Connect( button->GetId(), wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler( PCB_EDIT_FRAME::OnActionPluginButton ) );
wxCommandEventHandler( PCB_EDIT_FRAME::OnActionPluginButton ) );
// Link action plugin to button
ACTION_PLUGINS::SetActionButton( ap, button->GetId() );
@ -459,7 +462,8 @@ std::vector<ACTION_PLUGIN*> PCB_EDIT_FRAME::GetOrderedActionPlugins()
}
bool PCB_EDIT_FRAME::GetActionPluginButtonVisible( const wxString& aPluginPath, bool aPluginDefault )
bool PCB_EDIT_FRAME::GetActionPluginButtonVisible( const wxString& aPluginPath,
bool aPluginDefault )
{
auto& settings = m_settings->m_VisibleActionPlugins;

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2017 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2017-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -39,12 +39,6 @@
class PYTHON_ACTION_PLUGIN : public ACTION_PLUGIN
{
PyObject* m_PyAction;
PyObject* CallMethod( const char* aMethod,
PyObject* aArglist = NULL );
wxString CallRetStrMethod( const char* aMethod,
PyObject* aArglist = NULL );
public:
PYTHON_ACTION_PLUGIN( PyObject* action );
~PYTHON_ACTION_PLUGIN();
@ -56,6 +50,11 @@ public:
wxString GetPluginPath() override;
void Run() override;
void* GetObject() override;
private:
PyObject* m_PyAction;
PyObject* CallMethod( const char* aMethod, PyObject* aArglist = nullptr );
wxString CallRetStrMethod( const char* aMethod, PyObject* aArglist = nullptr );
};

View File

@ -89,7 +89,7 @@ PyObject* PYTHON_FOOTPRINT_WIZARD::CallMethod( const char* aMethod, PyObject* aA
Py_XDECREF( pFunc );
}
return NULL;
return nullptr;
}
@ -127,8 +127,7 @@ wxArrayString PYTHON_FOOTPRINT_WIZARD::CallRetArrayStrMethod( const char* aMet
if( !PyList_Check( result ) )
{
Py_DECREF( result );
ret.Add( wxT(
"PYTHON_FOOTPRINT_WIZARD::CallRetArrayStrMethod, result is not a list" ),
ret.Add( wxT( "PYTHON_FOOTPRINT_WIZARD::CallRetArrayStrMethod, result is not a list" ),
1 );
return ret;
}
@ -172,7 +171,7 @@ int PYTHON_FOOTPRINT_WIZARD::GetNumParameterPages()
PyLOCK lock;
// Time to call the callback
PyObject* result = CallMethod( "GetNumParameterPages", NULL );
PyObject* result = CallMethod( "GetNumParameterPages", nullptr );
if( result )
{
@ -327,7 +326,7 @@ void PYTHON_FOOTPRINT_WIZARD::ResetParameters()
{
PyLOCK lock;
CallMethod( "ResetWizard", NULL );
CallMethod( "ResetWizard", nullptr );
}
@ -339,13 +338,13 @@ FOOTPRINT* PYTHON_FOOTPRINT_WIZARD::GetFootprint( wxString * aMessages )
{
PyLOCK lock;
PyObject* result = CallMethod( "GetFootprint", NULL );
PyObject* result = CallMethod( "GetFootprint", nullptr );
if( aMessages )
*aMessages = CallRetStrMethod( "GetBuildMessages", NULL );
*aMessages = CallRetStrMethod( "GetBuildMessages", nullptr );
if( !result )
return NULL;
return nullptr;
PyObject* obj = PyObject_GetAttrString( result, "this" );

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 NBEE Embedded Systems SL, Miguel Angel Ajo <miguelangel@ajo.es>
* Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2016-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -40,11 +40,6 @@
class PYTHON_FOOTPRINT_WIZARD : public FOOTPRINT_WIZARD
{
PyObject* m_PyWizard;
PyObject* CallMethod( const char* aMethod, PyObject* aArglist = NULL );
wxString CallRetStrMethod( const char* aMethod, PyObject* aArglist = NULL );
wxArrayString CallRetArrayStrMethod( const char* aMethod, PyObject* aArglist = NULL );
public:
PYTHON_FOOTPRINT_WIZARD( PyObject* wizard );
~PYTHON_FOOTPRINT_WIZARD();
@ -58,14 +53,22 @@ public:
wxArrayString GetParameterTypes( int aPage ) override;
wxArrayString GetParameterValues( int aPage ) override;
wxArrayString GetParameterErrors( int aPage ) override;
// must return an empty string or an error description:
wxString SetParameterValues( int aPage, wxArrayString& aValues ) override;
FOOTPRINT* GetFootprint( wxString * aMessages ) override;
void* GetObject() override;
wxArrayString GetParameterHints( int aPage ) override;
wxArrayString GetParameterDesignators( int aPage = 0) override;
wxArrayString GetParameterDesignators( int aPage = 0 ) override;
void ResetParameters() override;
private:
PyObject* CallMethod( const char* aMethod, PyObject* aArglist = nullptr );
wxString CallRetStrMethod( const char* aMethod, PyObject* aArglist = nullptr );
wxArrayString CallRetArrayStrMethod( const char* aMethod, PyObject* aArglist = nullptr );
PyObject* m_PyWizard;
};

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012 NBEE Embedded Systems, Miguel Angel Ajo <miguelangel@nbee.es>
* Copyright (C) 1992-2019 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -52,8 +52,8 @@
/**
* Run a python method from the pcbnew module.
*
* @param aMethodName is the name of the method (like "pcbnew.myfunction" )
* @param aNames will contain the returned string
* @param aMethodName is the name of the method (like "pcbnew.myfunction" ).
* @param aNames will contain the returned string.
*/
static void pcbnewRunPythonMethodWithReturnedString( const char* aMethodName, wxString& aNames )
{
@ -84,13 +84,13 @@ static void pcbnewRunPythonMethodWithReturnedString( const char* aMethodName, wx
if( pobj )
{
PyObject* str = PyDict_GetItemString(localDict, "result" );
const char* str_res = NULL;
const char* str_res = nullptr;
if(str)
{
PyObject* temp_bytes = PyUnicode_AsEncodedString( str, "UTF-8", "strict" );
if( temp_bytes != NULL )
if( temp_bytes != nullptr )
{
str_res = PyBytes_AS_STRING( temp_bytes );
aNames = FROM_UTF8( str_res );
@ -98,7 +98,7 @@ static void pcbnewRunPythonMethodWithReturnedString( const char* aMethodName, wx
}
else
{
wxLogMessage( "cannot encode unicode python string" );
wxLogMessage( "cannot encode Unicode python string" );
}
}
else
@ -151,6 +151,8 @@ void pcbnewGetWizardsBackTrace( wxString& aTrace )
aTrace << "\n**********************************\n";
}
else
{
aTrace += traces[ii] + "\n";
}
}
}

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012 NBEE Embedded Systems, Miguel Angel Ajo <miguelangel@nbee.es>
* Copyright (C) 1992-2017 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -52,8 +52,7 @@
#include <wx/app.h>
static PCB_EDIT_FRAME* s_PcbEditFrame = NULL;
static PCB_EDIT_FRAME* s_PcbEditFrame = nullptr;
static SETTINGS_MANAGER* s_SettingsManager = nullptr;
@ -62,7 +61,7 @@ BOARD* GetBoard()
if( s_PcbEditFrame )
return s_PcbEditFrame->GetBoard();
else
return NULL;
return nullptr;
}
@ -188,7 +187,7 @@ bool SaveBoard( wxString& aFileName, BOARD* aBoard, IO_MGR::PCB_FILE_T aFormat )
aBoard->BuildConnectivity();
aBoard->SynchronizeNetsAndNetClasses();
IO_MGR::Save( aFormat, aFileName, aBoard, NULL );
IO_MGR::Save( aFormat, aFileName, aBoard, nullptr );
wxFileName pro = aFileName;
pro.SetExt( ProjectFileExtension );
@ -267,10 +266,8 @@ bool ExportSpecctraDSN( wxString& aFullFilename )
}
}
bool ExportVRML( const wxString& aFullFileName, double aMMtoWRMLunit,
bool aExport3DFiles, bool aUseRelativePaths,
const wxString& a3D_Subdir,
double aXRef, double aYRef )
bool ExportVRML( const wxString& aFullFileName, double aMMtoWRMLunit, bool aExport3DFiles,
bool aUseRelativePaths, const wxString& a3D_Subdir, double aXRef, double aYRef )
{
if( s_PcbEditFrame )
{

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 NBEE Embedded Systems SL, Miguel Angel Ajo <miguelangel@ajo.es>
* Copyright (C) 2013-2017 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2013-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -48,73 +48,73 @@ BOARD* LoadBoard( wxString& aFileName );
SETTINGS_MANAGER* GetSettingsManager();
/**
* Constructs a default BOARD with a tempoary (no filename) project
* @return the created board
* Construct a default BOARD with a temporary (no filename) project.
*
* @return the created board.
*/
BOARD* CreateEmptyBoard();
// Boards can be saved only as .kicad_pcb file format,
// so no option to choose the file format.
bool SaveBoard( wxString& aFileName, BOARD* aBoard );
bool SaveBoard( wxString& aFileName, BOARD* aBoard );
/**
* will get the nicknames of all of the footprint libraries configured in
* pcbnew in both the project and global library tables
* @return the list of footprint library nicknames, empty on error
* Get the nicknames of all of the footprint libraries configured in
* pcbnew in both the project and global library tables.
*
* @return the list of footprint library nicknames, empty on error.
*/
wxArrayString GetFootprintLibraries();
/**
* will get the names of all of the footprints available in a footprint library
* @param aNickName is the nickname specifying which footprint library to fetch
* from
* @return the list of footprint names, empty on error
* Get the names of all of the footprints available in a footprint library.
*
* @param aNickName is the nickname specifying which footprint library to fetch from.
* @return the list of footprint names, empty on error.
*/
wxArrayString GetFootprints( const wxString& aNickName );
/**
* will export the current BOARD to a specctra dsn file.
* See http://www.autotraxeda.com/docs/SPECCTRA/SPECCTRA.pdf for the
* specification.
* Will export the current BOARD to a specctra dsn file.
*
* See http://www.autotraxeda.com/docs/SPECCTRA/SPECCTRA.pdf for the specification.
*
* @return true if OK
*/
bool ExportSpecctraDSN( wxString& aFullFilename );
/**
* will export the current BOARD to a VRML (wrl) file.
* Export the current BOARD to a VRML (wrl) file.
*
* See ExportVRML_File in pcb_edit_frame.h for detailed documentation.
* @return true if OK
* @return true if OK.
*/
bool ExportVRML( const wxString& aFullFileName, double aMMtoWRMLunit,
bool aExport3DFiles, bool aUseRelativePaths,
const wxString& a3D_Subdir,
double aXRef, double aYRef );
bool ExportVRML( const wxString& aFullFileName, double aMMtoWRMLunit, bool aExport3DFiles,
bool aUseRelativePaths, const wxString& a3D_Subdir, double aXRef, double aYRef );
/**
* will import a specctra *.ses file and use it to relocate MODULEs and
* to replace all vias and tracks in an existing and loaded BOARD.
* See http://www.autotraxeda.com/docs/SPECCTRA/SPECCTRA.pdf for the
* specification.
* Import a specctra *.ses file and use it to relocate MODULEs and to replace all vias and
* tracks in an existing and loaded #BOARD.
*
* See http://www.autotraxeda.com/docs/SPECCTRA/SPECCTRA.pdf for the specification.
*
* @return true if OK
*/
bool ImportSpecctraSES( wxString& aFullFilename );
/**
* Function ExportFootprintsToLibrary
* Save footprints in a library:
* @param aStoreInNewLib:
* true : save footprints in a existing lib. Existing footprints will be kept
* or updated.
* This lib should be in fp lib table, and is type is .pretty
* false: save footprints in a new lib. It it is an existing lib,
* previous footprints will be removed
*
* @param aLibName:
* optional library name to create, stops dialog call.
* must be called with aStoreInNewLib as true
* @param aStoreInNewLib set to true to save footprints in a existing lib. Existing footprints
* will be kept or updated. This lib should be in fp lib table, and is
* type is .pretty. Set to false to save footprints in a new lib. If it
* is an existing lib, previous footprints will be removed.
*
* @param aLibName is the optional library name to create, stops dialog call. Must be called
* with \a aStoreInNewLib as true.
*/
bool ExportFootprintsToLibrary( bool aStoreInNewLib, const wxString& aLibName = wxEmptyString,
wxString* aLibPath = NULL );
wxString* aLibPath = nullptr );
/**
* Update the board display after modifying it by a python script
@ -124,7 +124,7 @@ bool ExportFootprintsToLibrary( bool aStoreInNewLib, const wxString& aLibName =
* Could be deprecated because modifying a board (especially deleting items) outside
* a action plugin can crash Pcbnew.
*/
void Refresh();
void Refresh();
/**
* Update the layer manager and other widgets from the board setup
@ -135,7 +135,8 @@ void Refresh();
void UpdateUserInterface();
/**
* Returns the currently selected user unit value for the interface
* Return the currently selected user unit value for the interface.
*
* @return 0 = Inches, 1=mm, -1 if the frame isn't set
*/
int GetUserUnits();
@ -146,16 +147,16 @@ int GetUserUnits();
bool IsActionRunning();
/**
* Runs the DRC check on the given board and writes the results to a report file.
* Run the DRC check on the given board and writes the results to a report file.
* Requires that the project for the board be loaded, and note that unlike the DRC dialog
* this does not attempt to fill zones, so zones must be valid before calling.
*
* @param aBoard is a valid loaded board
* @param aFileName is the full path and name of the report file to write
* @param aUnits is the units to use in the report
* @param aBoard is a valid loaded board.
* @param aFileName is the full path and name of the report file to write.
* @param aUnits is the units to use in the report.
* @param aReportAllTrackErrors controls whether all errors or just the first error is reported
* for each track
* @return true if successful, false if not
* for each track.
* @return true if successful, false if not.
*/
bool WriteDRCReport( BOARD* aBoard, const wxString& aFileName, EDA_UNITS aUnits,
bool aReportAllTrackErrors );

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012 NBEE Embedded Systems, Miguel Angel Ajo <miguelangel@nbee.es>
* Copyright (C) 1992-2017 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -139,21 +139,22 @@
%{
// called from pcbnew/swig/pcbnew_footprint_wizards.cpp
FOOTPRINT* PyFootprint_to_FOOTPRINT(PyObject *obj0)
FOOTPRINT* PyFootprint_to_FOOTPRINT( PyObject *obj0 )
{
void* argp;
int res1 = SWIG_ConvertPtr(obj0, &argp,SWIGTYPE_p_FOOTPRINT, 0 | 0 );
int res1 = SWIG_ConvertPtr( obj0, &argp,SWIGTYPE_p_FOOTPRINT, 0 | 0 );
if (!SWIG_IsOK(res1))
if( !SWIG_IsOK( res1 ) )
{
SWIG_exception_fail(SWIG_ArgError(res1), "Converting object to FOOTPRINT*");
SWIG_exception_fail( SWIG_ArgError( res1 ), "Converting object to FOOTPRINT*" );
}
return ( FOOTPRINT *) argp;
fail:
return NULL;
return nullptr;
}
%}

View File

@ -2,7 +2,7 @@
* KiRouter - a push-and-(sometimes-)shove PCB router
*
* Copyright (C) 2013-2017 CERN
* Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2016-2021 KiCad Developers, see AUTHORS.txt for contributors.
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software: you can redistribute it and/or modify it
@ -81,7 +81,7 @@ static TOOL_ACTION ACT_AmplDecrease( "pcbnew.LengthTuner.AmplDecrease",
LENGTH_TUNER_TOOL::LENGTH_TUNER_TOOL() :
TOOL_BASE( "pcbnew.LengthTuner" )
{
// set the initial tune mode for the settings dialog,
// set the initial tune mode for the settings dialog,
// in case the dialog is opened before the tool is activated the first time
m_lastTuneMode = PNS::ROUTER_MODE::PNS_MODE_TUNE_SINGLE;
}
@ -113,6 +113,7 @@ bool LENGTH_TUNER_TOOL::Init()
return true;
}
void LENGTH_TUNER_TOOL::Reset( RESET_REASON aReason )
{
if( aReason == RUN )
@ -166,12 +167,12 @@ void LENGTH_TUNER_TOOL::performTuning()
PNS_TUNE_STATUS_POPUP statusPopup( frame() );
statusPopup.Popup();
m_router->Move( end, NULL );
m_router->Move( end, nullptr );
updateStatusPopup( statusPopup );
auto setCursor =
[&]()
{
auto setCursor =
[&]()
{
frame()->GetCanvas()->SetCurrentCursor( KICURSOR::ARROW );
};
@ -189,12 +190,12 @@ void LENGTH_TUNER_TOOL::performTuning()
else if( evt->IsMotion() )
{
end = evt->Position();
m_router->Move( end, NULL );
m_router->Move( end, nullptr );
updateStatusPopup( statusPopup );
}
else if( evt->IsClick( BUT_LEFT ) )
{
if( m_router->FixRoute( evt->Position(), NULL ) )
if( m_router->FixRoute( evt->Position(), nullptr ) )
break;
}
else if( evt->IsClick( BUT_RIGHT ) )
@ -203,31 +204,31 @@ void LENGTH_TUNER_TOOL::performTuning()
}
else if( evt->IsAction( &ACT_EndTuning ) )
{
if( m_router->FixRoute( end, NULL ) )
if( m_router->FixRoute( end, nullptr ) )
break;
}
else if( evt->IsAction( &ACT_AmplDecrease ) )
{
placer->AmplitudeStep( -1 );
m_router->Move( end, NULL );
m_router->Move( end, nullptr );
updateStatusPopup( statusPopup );
}
else if( evt->IsAction( &ACT_AmplIncrease ) )
{
placer->AmplitudeStep( 1 );
m_router->Move( end, NULL );
m_router->Move( end, nullptr );
updateStatusPopup( statusPopup );
}
else if(evt->IsAction( &ACT_SpacingDecrease ) )
{
placer->SpacingStep( -1 );
m_router->Move( end, NULL );
m_router->Move( end, nullptr );
updateStatusPopup( statusPopup );
}
else if( evt->IsAction( &ACT_SpacingIncrease ) )
{
placer->SpacingStep( 1 );
m_router->Move( end, NULL );
m_router->Move( end, nullptr );
updateStatusPopup( statusPopup );
}
else if( evt->IsAction( &PCB_ACTIONS::lengthTunerSettingsDialog ) )
@ -253,10 +254,12 @@ void LENGTH_TUNER_TOOL::setTransitions()
{
Go( &LENGTH_TUNER_TOOL::MainLoop, PCB_ACTIONS::routerTuneSingleTrace.MakeEvent() );
Go( &LENGTH_TUNER_TOOL::MainLoop, PCB_ACTIONS::routerTuneDiffPair.MakeEvent() );
Go( &LENGTH_TUNER_TOOL::MainLoop, PCB_ACTIONS::routerTuneDiffPairSkew.MakeEvent() );
Go( &LENGTH_TUNER_TOOL::MainLoop,
PCB_ACTIONS::routerTuneDiffPairSkew.MakeEvent() );
// in case tool is inactive, otherwise the event is handled in the tool loop
Go( &LENGTH_TUNER_TOOL::meanderSettingsDialog, PCB_ACTIONS::lengthTunerSettingsDialog.MakeEvent() );
Go( &LENGTH_TUNER_TOOL::meanderSettingsDialog,
PCB_ACTIONS::lengthTunerSettingsDialog.MakeEvent() );
}
@ -274,9 +277,9 @@ int LENGTH_TUNER_TOOL::MainLoop( const TOOL_EVENT& aEvent )
controls()->ShowCursor( true );
auto setCursor =
[&]()
{
auto setCursor =
[&]()
{
frame()->GetCanvas()->SetCurrentCursor( KICURSOR::ARROW );
};
@ -332,6 +335,7 @@ int LENGTH_TUNER_TOOL::MainLoop( const TOOL_EVENT& aEvent )
return 0;
}
int LENGTH_TUNER_TOOL::meanderSettingsDialog( const TOOL_EVENT& aEvent )
{
PNS::MEANDER_PLACER_BASE* placer = static_cast<PNS::MEANDER_PLACER_BASE*>( m_router->Placer() );

View File

@ -2,7 +2,7 @@
* KiRouter - a push-and-(sometimes-)shove PCB router
*
* Copyright (C) 2013-2014 CERN
* Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2016-2021 KiCad Developers, see AUTHORS.txt for contributors.
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software: you can redistribute it and/or modify it
@ -33,9 +33,10 @@ ROUTING_SETTINGS& ALGO_BASE::Settings() const
LOGGER* ALGO_BASE::Logger()
{
return NULL;
return nullptr;
}
const BOX2I& ALGO_BASE::VisibleViewArea() const
{
return m_router->VisibleViewArea();

View File

@ -2,7 +2,7 @@
* KiRouter - a push-and-(sometimes-)shove PCB router
*
* Copyright (C) 2013-2015 CERN
* Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2016-2021 KiCad Developers, see AUTHORS.txt for contributors.
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software: you can redistribute it and/or modify it
@ -33,6 +33,7 @@ namespace PNS {
class LINE;
DP_PRIMITIVE_PAIR::DP_PRIMITIVE_PAIR( ITEM* aPrimP, ITEM* aPrimN )
{
m_primP = aPrimP->Clone();
@ -54,13 +55,13 @@ DP_PRIMITIVE_PAIR::DP_PRIMITIVE_PAIR( const VECTOR2I& aAnchorP, const VECTOR2I&
{
m_anchorP = aAnchorP;
m_anchorN = aAnchorN;
m_primP = m_primN = NULL;
m_primP = m_primN = nullptr;
}
DP_PRIMITIVE_PAIR::DP_PRIMITIVE_PAIR( const DP_PRIMITIVE_PAIR& aOther )
{
m_primP = m_primN = NULL;
m_primP = m_primN = nullptr;
if( aOther.m_primP )
m_primP = aOther.m_primP->Clone();
@ -114,6 +115,7 @@ DIRECTION_45 DP_PRIMITIVE_PAIR::anchorDirection( const ITEM* aItem, const VECTOR
return DIRECTION_45( aItem->Anchor( 1 ) - aItem->Anchor( 0 ) );
}
void DP_PRIMITIVE_PAIR::CursorOrientation( const VECTOR2I& aCursorPos, VECTOR2I& aMidpoint,
VECTOR2I& aDirection ) const
{
@ -200,10 +202,13 @@ void DP_GATEWAY::Reverse()
}
bool DIFF_PAIR::BuildInitial( const DP_GATEWAY& aEntry, const DP_GATEWAY &aTarget, bool aPrefDiagonal )
bool DIFF_PAIR::BuildInitial( const DP_GATEWAY& aEntry, const DP_GATEWAY &aTarget,
bool aPrefDiagonal )
{
SHAPE_LINE_CHAIN p = DIRECTION_45().BuildInitialTrace ( aEntry.AnchorP(), aTarget.AnchorP(), aPrefDiagonal );
SHAPE_LINE_CHAIN n = DIRECTION_45().BuildInitialTrace ( aEntry.AnchorN(), aTarget.AnchorN(), aPrefDiagonal );
SHAPE_LINE_CHAIN p = DIRECTION_45().BuildInitialTrace ( aEntry.AnchorP(), aTarget.AnchorP(),
aPrefDiagonal );
SHAPE_LINE_CHAIN n = DIRECTION_45().BuildInitialTrace ( aEntry.AnchorN(), aTarget.AnchorN(),
aPrefDiagonal );
int mask = aEntry.AllowedAngles() | DIRECTION_45::ANG_STRAIGHT | DIRECTION_45::ANG_OBTUSE;
@ -275,7 +280,9 @@ bool DIFF_PAIR::CheckConnectionAngle( const DIFF_PAIR& aOther, int aAllowedAngle
}
if( m_n.SegmentCount() == 0 || aOther.m_n.SegmentCount() == 0 )
{
checkN = true;
}
else
{
DIRECTION_45 n0( m_n.CSegment( -1 ) );
@ -294,8 +301,8 @@ const DIFF_PAIR DP_GATEWAY::Entry() const
}
void DP_GATEWAYS::BuildOrthoProjections( DP_GATEWAYS& aEntries,
const VECTOR2I& aCursorPos, int aOrthoScore )
void DP_GATEWAYS::BuildOrthoProjections( DP_GATEWAYS& aEntries, const VECTOR2I& aCursorPos,
int aOrthoScore )
{
for( const DP_GATEWAY& g : aEntries.Gateways() )
{
@ -309,7 +316,6 @@ void DP_GATEWAYS::BuildOrthoProjections( DP_GATEWAYS& aEntries,
int dist_s = ( proj_s - aCursorPos ).EuclideanNorm();
int dist_d = ( proj_d - aCursorPos ).EuclideanNorm();
VECTOR2I proj = ( dist_s < dist_d ? proj_s : proj_d );
DP_GATEWAYS targets( m_gap );
@ -329,8 +335,8 @@ void DP_GATEWAYS::BuildOrthoProjections( DP_GATEWAYS& aEntries,
}
bool DP_GATEWAYS::FitGateways( DP_GATEWAYS& aEntry, DP_GATEWAYS& aTarget,
bool aPrefDiagonal, DIFF_PAIR& aDp )
bool DP_GATEWAYS::FitGateways( DP_GATEWAYS& aEntry, DP_GATEWAYS& aTarget, bool aPrefDiagonal,
DIFF_PAIR& aDp )
{
DP_CANDIDATE best;
@ -355,7 +361,8 @@ bool DP_GATEWAYS::FitGateways( DP_GATEWAYS& aEntry, DP_GATEWAYS& aTarget,
DIFF_PAIR l( m_gap );
if( l.BuildInitial( g_entry, g_target, aPrefDiagonal ^ ( attempt ? true : false ) ) )
if( l.BuildInitial( g_entry, g_target,
aPrefDiagonal ^ ( attempt ? true : false ) ) )
{
best.p = l.CP();
best.n = l.CN();
@ -389,11 +396,13 @@ bool DP_GATEWAYS::checkDiagonalAlignment( const VECTOR2I& a, const VECTOR2I& b )
void DP_GATEWAYS::FilterByOrientation ( int aAngleMask, DIRECTION_45 aRefOrientation )
{
m_gateways.erase(
std::remove_if( m_gateways.begin(), m_gateways.end(), [aAngleMask, aRefOrientation]( const DP_GATEWAY& dp) {
DIRECTION_45 orient( dp.AnchorP() - dp.AnchorN() );
return ( orient.Angle( aRefOrientation ) & aAngleMask );
} ), m_gateways.end()
);
std::remove_if( m_gateways.begin(), m_gateways.end(),
[aAngleMask, aRefOrientation]( const DP_GATEWAY& dp)
{
DIRECTION_45 orient( dp.AnchorP() - dp.AnchorN() );
return ( orient.Angle( aRefOrientation ) & aAngleMask );
} ), m_gateways.end()
);
}
static VECTOR2I makeGapVector( VECTOR2I dir, int length )
@ -419,9 +428,9 @@ void DP_GATEWAYS::BuildFromPrimitivePair( const DP_PRIMITIVE_PAIR& aPair, bool a
VECTOR2I p0_p, p0_n;
int orthoFanDistance;
int diagFanDistance;
const SHAPE* shP = NULL;
const SHAPE* shP = nullptr;
if( aPair.PrimP() == NULL )
if( aPair.PrimP() == nullptr )
{
BuildGeneric( aPair.AnchorP(), aPair.AnchorN(), true );
return;
@ -445,7 +454,7 @@ void DP_GATEWAYS::BuildFromPrimitivePair( const DP_PRIMITIVE_PAIR& aPair, bool a
majorDirection = ( p0_p - p0_n ).Perpendicular();
if( shP == NULL )
if( shP == nullptr )
return;
switch( shP->Type() )
@ -555,8 +564,8 @@ void DP_GATEWAYS::BuildForCursor( const VECTOR2I& aCursorPos )
if( m_fitVias )
BuildGeneric( aCursorPos + dir, aCursorPos - dir, true, true );
else
m_gateways.emplace_back( aCursorPos + dir,
aCursorPos - dir, attempt ? true : false );
m_gateways.emplace_back( aCursorPos + dir, aCursorPos - dir,
attempt ? true : false );
}
}
@ -569,8 +578,10 @@ void DP_GATEWAYS::buildEntries( const VECTOR2I& p0_p, const VECTOR2I& p0_n )
{
if( !g.HasEntryLines() )
{
SHAPE_LINE_CHAIN lead_p = DIRECTION_45().BuildInitialTrace ( g.AnchorP(), p0_p, g.IsDiagonal() ).Reverse();
SHAPE_LINE_CHAIN lead_n = DIRECTION_45().BuildInitialTrace ( g.AnchorN(), p0_n, g.IsDiagonal() ).Reverse();
SHAPE_LINE_CHAIN lead_p = DIRECTION_45().BuildInitialTrace ( g.AnchorP(), p0_p,
g.IsDiagonal() ).Reverse();
SHAPE_LINE_CHAIN lead_n = DIRECTION_45().BuildInitialTrace ( g.AnchorN(), p0_n,
g.IsDiagonal() ).Reverse();
g.SetEntryLines( lead_p, lead_n );
}
}
@ -628,7 +639,8 @@ void DP_GATEWAYS::buildDpContinuation( const DP_PRIMITIVE_PAIR& aPair, bool aIsD
}
void DP_GATEWAYS::BuildGeneric( const VECTOR2I& p0_p, const VECTOR2I& p0_n, bool aBuildEntries, bool aViaMode )
void DP_GATEWAYS::BuildGeneric( const VECTOR2I& p0_p, const VECTOR2I& p0_n, bool aBuildEntries,
bool aViaMode )
{
SEG st_p[2], st_n[2];
SEG d_n[2], d_p[2];
@ -659,7 +671,8 @@ void DP_GATEWAYS::BuildGeneric( const VECTOR2I& p0_p, const VECTOR2I& p0_n, bool
if( !aViaMode )
{
m_gateways.emplace_back( m - dir, m + dir, diagColl, DIRECTION_45::ANG_RIGHT, prio );
m_gateways.emplace_back( m - dir, m + dir, diagColl, DIRECTION_45::ANG_RIGHT,
prio );
dir = makeGapVector( p0_n - p0_p, 2 * m_gap );
m_gateways.emplace_back( p0_p - dir, p0_p - dir + dir.Perpendicular(), diagColl );
@ -681,6 +694,7 @@ void DP_GATEWAYS::BuildGeneric( const VECTOR2I& p0_p, const VECTOR2I& p0_n, bool
if( d_n[i].Collinear( d_p[j] ) )
ips[0] = OPT_VECTOR2I();
if( st_p[i].Collinear( st_p[j] ) )
ips[1] = OPT_VECTOR2I();
@ -698,7 +712,8 @@ void DP_GATEWAYS::BuildGeneric( const VECTOR2I& p0_p, const VECTOR2I& p0_n, bool
VECTOR2I g_p( ( p0_p - m ).Resize( ceil( (double) m_gap * M_SQRT1_2 ) ) );
VECTOR2I g_n( ( p0_n - m ).Resize( ceil( (double) m_gap * M_SQRT1_2 ) ) );
m_gateways.emplace_back( m + g_p, m + g_n, k == 0 ? true : false, DIRECTION_45::ANG_OBTUSE, prio );
m_gateways.emplace_back( m + g_p, m + g_n, k == 0 ? true : false,
DIRECTION_45::ANG_OBTUSE, prio );
}
}
}
@ -742,7 +757,9 @@ void DP_GATEWAYS::BuildGeneric( const VECTOR2I& p0_p, const VECTOR2I& p0_n, bool
DP_PRIMITIVE_PAIR DIFF_PAIR::EndingPrimitives()
{
if( m_hasVias )
{
return DP_PRIMITIVE_PAIR( &m_via_p, &m_via_n );
}
else
{
const LINE lP( PLine() );
@ -826,7 +843,8 @@ void DIFF_PAIR::CoupledSegmentPairs( COUPLED_SEGMENTS_VEC& aPairs ) const
int64_t dist = std::abs( sp.Distance( sn ) - m_width );
if( sp.ApproxParallel( sn ) && m_gapConstraint.Matches( dist ) && commonParallelProjection( sp, sn, p_clip, n_clip ) )
if( sp.ApproxParallel( sn ) && m_gapConstraint.Matches( dist ) &&
commonParallelProjection( sp, sn, p_clip, n_clip ) )
{
const COUPLED_SEGMENTS spair( p_clip, sp, i, n_clip, sn, j );
aPairs.push_back( spair );
@ -852,7 +870,7 @@ int64_t DIFF_PAIR::CoupledLength( const SHAPE_LINE_CHAIN& aP, const SHAPE_LINE_C
int64_t dist = std::abs( sp.Distance(sn) - m_width );
if( sp.ApproxParallel( sn ) && m_gapConstraint.Matches( dist ) &&
commonParallelProjection( sp, sn, p_clip, n_clip ) )
commonParallelProjection( sp, sn, p_clip, n_clip ) )
total += p_clip.Length();
}
}
@ -868,6 +886,7 @@ double DIFF_PAIR::CoupledLength() const
CoupledSegmentPairs( pairs );
double l = 0.0;
for( unsigned int i = 0; i < pairs.size(); i++ )
l += pairs[i].coupledP.Length();
@ -901,7 +920,7 @@ int DIFF_PAIR::CoupledLength ( const SEG& aP, const SEG& aN ) const
int64_t dist = std::abs( aP.Distance( aN ) - m_width );
if( aP.ApproxParallel( aN ) && m_gapConstraint.Matches( dist ) &&
commonParallelProjection ( aP, aN, p_clip, n_clip ) )
commonParallelProjection ( aP, aN, p_clip, n_clip ) )
return p_clip.Length();
return 0;

View File

@ -2,7 +2,7 @@
* KiRouter - a push-and-(sometimes-)shove PCB router
*
* Copyright (C) 2013-2015 CERN
* Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2016-2021 KiCad Developers, see AUTHORS.txt for contributors.
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software: you can redistribute it and/or modify it
@ -36,24 +36,18 @@ namespace PNS {
class DIFF_PAIR;
/**
* DP_GATEWAY
*
* Defines a "gateway" for routing a differential pair - e.g. a pair of points (anchors) with certain
* orientation, spacing and (optionally) predefined entry paths. The routing algorithm connects such
* gateways with parallel lines, thus creating a difrerential pair.
**/
class DP_GATEWAY {
* Define a "gateway" for routing a differential pair - e.g. a pair of points (anchors) with
* certain orientation, spacing and (optionally) predefined entry paths. The routing algorithm
* connects such gateways with parallel lines, thus creating a differential pair.
*/
class DP_GATEWAY
{
public:
DP_GATEWAY( const VECTOR2I& aAnchorP,
const VECTOR2I& aAnchorN,
bool aIsDiagonal,
int aAllowedEntryAngles = DIRECTION_45::ANG_OBTUSE,
int aPriority = 0 )
: m_anchorP( aAnchorP ),
m_anchorN( aAnchorN ),
m_isDiagonal( aIsDiagonal ),
m_allowedEntryAngles( aAllowedEntryAngles ),
m_priority( aPriority )
DP_GATEWAY( const VECTOR2I& aAnchorP, const VECTOR2I& aAnchorN, bool aIsDiagonal,
int aAllowedEntryAngles = DIRECTION_45::ANG_OBTUSE, int aPriority = 0 ) :
m_anchorP( aAnchorP ),
m_anchorN( aAnchorN ), m_isDiagonal( aIsDiagonal ),
m_allowedEntryAngles( aAllowedEntryAngles ), m_priority( aPriority )
{
m_hasEntryLines = false;
}
@ -63,9 +57,7 @@ public:
}
/**
* Function IsDiagonal()
*
* @return true, if the gateway anchors lie on a diagonal line
* @return true if the gateway anchors lie on a diagonal line.
*/
bool IsDiagonal() const
{
@ -77,17 +69,12 @@ public:
const VECTOR2I& AnchorN() const { return m_anchorN; }
/**
* Function AllowedAngles()
*
* @return a mask of 45-degree entry directoins allowed for the
* gateway.
*/
* @return a mask of 45-degree entry directions allowed for the gateway.
*/
int AllowedAngles () const { return m_allowedEntryAngles; }
/**
* Function Priority()
*
* @return priority/score value for gateway matching
* @return priority/score value for gateway matching.
*/
int Priority() const
{
@ -127,15 +114,13 @@ private:
};
/**
* DP_PRIMITIVE_PAIR
*
* Stores staring/ending primitives (pads, vias or segments) for a differential pair.
**/
* Store starting/ending primitives (pads, vias or segments) for a differential pair.
*/
class DP_PRIMITIVE_PAIR
{
public:
DP_PRIMITIVE_PAIR():
m_primP( NULL ), m_primN( NULL ) {};
m_primP( nullptr ), m_primN( nullptr ) {};
DP_PRIMITIVE_PAIR( const DP_PRIMITIVE_PAIR& aOther );
DP_PRIMITIVE_PAIR( ITEM* aPrimP, ITEM* aPrimN );
@ -159,7 +144,8 @@ public:
DIRECTION_45 DirN() const;
void CursorOrientation( const VECTOR2I& aCursorPos, VECTOR2I& aMidpoint, VECTOR2I& aDirection ) const;
void CursorOrientation( const VECTOR2I& aCursorPos, VECTOR2I& aMidpoint,
VECTOR2I& aDirection ) const;
void dump()
{
@ -176,86 +162,75 @@ private:
};
/**
* DP_GATEWAYS
*
* A set of gateways calculated for the cursor or starting/ending primitive pair.
**/
*/
class DP_GATEWAYS
{
public:
DP_GATEWAYS( int aGap ):
m_gap( aGap ),
m_viaGap( aGap )
{
// Do not leave uninitialized members, and keep static analyser quiet:
m_viaDiameter = 0;
m_fitVias = true;
}
public:
DP_GATEWAYS( int aGap ):
m_gap( aGap ),
m_viaGap( aGap )
{
// Do not leave uninitialized members, and keep static analyzer quiet:
m_viaDiameter = 0;
m_fitVias = true;
}
void Clear()
{
m_gateways.clear();
}
void Clear() { m_gateways.clear(); }
void SetFitVias( bool aEnable, int aDiameter = 0, int aViaGap = -1 )
{
m_fitVias = aEnable;
m_viaDiameter = aDiameter;
void SetFitVias( bool aEnable, int aDiameter = 0, int aViaGap = -1 )
{
m_fitVias = aEnable;
m_viaDiameter = aDiameter;
if( aViaGap < 0 )
m_viaGap = m_gap;
else
m_viaGap = aViaGap;
}
if( aViaGap < 0 )
m_viaGap = m_gap;
else
m_viaGap = aViaGap;
}
void BuildForCursor( const VECTOR2I& aCursorPos );
void BuildOrthoProjections( DP_GATEWAYS &aEntries, const VECTOR2I& aCursorPos, int aOrthoScore );
void BuildGeneric( const VECTOR2I& p0_p, const VECTOR2I& p0_n, bool aBuildEntries = false, bool aViaMode = false );
void BuildFromPrimitivePair( const DP_PRIMITIVE_PAIR& aPair, bool aPreferDiagonal );
void BuildForCursor( const VECTOR2I& aCursorPos );
void BuildOrthoProjections( DP_GATEWAYS& aEntries, const VECTOR2I& aCursorPos,
int aOrthoScore );
void BuildGeneric( const VECTOR2I& p0_p, const VECTOR2I& p0_n, bool aBuildEntries = false,
bool aViaMode = false );
void BuildFromPrimitivePair( const DP_PRIMITIVE_PAIR& aPair, bool aPreferDiagonal );
bool FitGateways( DP_GATEWAYS& aEntry, DP_GATEWAYS& aTarget, bool aPrefDiagonal, DIFF_PAIR& aDp );
bool FitGateways( DP_GATEWAYS& aEntry, DP_GATEWAYS& aTarget, bool aPrefDiagonal,
DIFF_PAIR& aDp );
std::vector<DP_GATEWAY>& Gateways()
{
return m_gateways;
}
std::vector<DP_GATEWAY>& Gateways() { return m_gateways; }
const std::vector<DP_GATEWAY>& CGateways() const
{
return m_gateways;
}
const std::vector<DP_GATEWAY>& CGateways() const { return m_gateways; }
void FilterByOrientation( int aAngleMask, DIRECTION_45 aRefOrientation );
void FilterByOrientation( int aAngleMask, DIRECTION_45 aRefOrientation );
private:
struct DP_CANDIDATE
{
SHAPE_LINE_CHAIN p, n;
VECTOR2I gw_p, gw_n;
int score;
};
private:
struct DP_CANDIDATE
{
SHAPE_LINE_CHAIN p, n;
VECTOR2I gw_p, gw_n;
int score;
};
bool checkDiagonalAlignment( const VECTOR2I& a, const VECTOR2I& b ) const;
void buildDpContinuation( const DP_PRIMITIVE_PAIR& aPair, bool aIsDiagonal );
void buildEntries( const VECTOR2I& p0_p, const VECTOR2I& p0_n );
bool checkDiagonalAlignment( const VECTOR2I& a, const VECTOR2I& b ) const;
void buildDpContinuation( const DP_PRIMITIVE_PAIR& aPair, bool aIsDiagonal );
void buildEntries( const VECTOR2I& p0_p, const VECTOR2I& p0_n );
int m_gap;
int m_viaGap;
int m_viaDiameter;
bool m_fitVias;
int m_gap;
int m_viaGap;
int m_viaDiameter;
bool m_fitVias;
std::vector<DP_GATEWAY> m_gateways;
std::vector<DP_GATEWAY> m_gateways;
};
/**
* DIFF_PAIR
*
* Basic class for a differential pair. Stores two PNS_LINEs (for positive and negative nets,
* respectively), the gap and coupling constraints.
**/
*/
class DIFF_PAIR : public LINK_HOLDER
{
public:
@ -341,7 +316,7 @@ public:
m_p = aLineP.CLine();
m_n = aLineN.CLine();
// Do not leave uninitialized members, and keep static analyser quiet:
// Do not leave uninitialized members, and keep static analyzer quiet:
m_width = 0;
m_gap = 0;
m_viaGap = 0;
@ -354,7 +329,11 @@ public:
return aItem && ITEM::DIFF_PAIR_T == aItem->Kind();
}
DIFF_PAIR* Clone() const override { assert( false ); return NULL; }
DIFF_PAIR* Clone() const override
{
assert( false );
return nullptr;
}
virtual void ClearLinks() override
{

View File

@ -2,7 +2,7 @@
* KiRouter - a push-and-(sometimes-)shove PCB router
*
* Copyright (C) 2013-2015 CERN
* Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2016-2021 KiCad Developers, see AUTHORS.txt for contributors.
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software: you can redistribute it and/or modify it
@ -40,10 +40,10 @@ DIFF_PAIR_PLACER::DIFF_PAIR_PLACER( ROUTER* aRouter ) :
m_netP = 0;
m_netN = 0;
m_iteration = 0;
m_world = NULL;
m_shove = NULL;
m_currentNode = NULL;
m_lastNode = NULL;
m_world = nullptr;
m_shove = nullptr;
m_currentNode = nullptr;
m_lastNode = nullptr;
m_placingVia = false;
m_viaDiameter = 0;
m_viaDrill = 0;
@ -53,7 +53,7 @@ DIFF_PAIR_PLACER::DIFF_PAIR_PLACER( ROUTER* aRouter ) :
m_startsOnVia = false;
m_orthoMode = false;
m_snapOnTarget = false;
m_currentEndItem = NULL;
m_currentEndItem = nullptr;
m_currentMode = RM_MarkObstacles;
m_currentTraceOk = false;
m_idle = true;
@ -71,6 +71,7 @@ void DIFF_PAIR_PLACER::setWorld( NODE* aWorld )
m_world = aWorld;
}
const VIA DIFF_PAIR_PLACER::makeVia( const VECTOR2I& aP, int aNet )
{
const LAYER_RANGE layers( m_sizes.GetLayerTop(), m_sizes.GetLayerBottom() );
@ -87,7 +88,7 @@ void DIFF_PAIR_PLACER::SetOrthoMode ( bool aOrthoMode )
m_orthoMode = aOrthoMode;
if( !m_idle )
Move( m_currentEnd, NULL );
Move( m_currentEnd, nullptr );
}
@ -96,7 +97,7 @@ bool DIFF_PAIR_PLACER::ToggleVia( bool aEnabled )
m_placingVia = aEnabled;
if( !m_idle )
Move( m_currentEnd, NULL );
Move( m_currentEnd, nullptr );
return true;
}
@ -121,7 +122,9 @@ bool DIFF_PAIR_PLACER::propagateDpHeadForces ( const VECTOR2I& aP, VECTOR2I& aNe
VIA virtHead = makeVia( aP, -1 );
if( m_placingVia )
{
virtHead.SetDiameter( viaGap() + 2 * virtHead.Diameter() );
}
else
{
virtHead.SetLayer( m_currentLayer );
@ -186,8 +189,8 @@ bool DIFF_PAIR_PLACER::propagateDpHeadForces ( const VECTOR2I& aP, VECTOR2I& aNe
}
bool DIFF_PAIR_PLACER::attemptWalk( NODE* aNode, DIFF_PAIR* aCurrent,
DIFF_PAIR& aWalk, bool aPFirst, bool aWindCw, bool aSolidsOnly )
bool DIFF_PAIR_PLACER::attemptWalk( NODE* aNode, DIFF_PAIR* aCurrent, DIFF_PAIR& aWalk,
bool aPFirst, bool aWindCw, bool aSolidsOnly )
{
WALKAROUND walkaround( aNode, Router() );
WALKAROUND::WALKAROUND_STATUS wf1;
@ -393,7 +396,7 @@ void DIFF_PAIR_PLACER::FlipPosture()
m_startDiagonal = !m_startDiagonal;
if( !m_idle )
Move( m_currentEnd, NULL );
Move( m_currentEnd, nullptr );
}
@ -423,7 +426,7 @@ bool DIFF_PAIR_PLACER::SetLayer( int aLayer )
m_currentLayer = aLayer;
m_start = *m_prevPair;
initPlacement();
Move( m_currentEnd, NULL );
Move( m_currentEnd, nullptr );
return true;
}
@ -494,6 +497,7 @@ bool DIFF_PAIR_PLACER::FindDpPrimitivePair( NODE* aWorld, const VECTOR2I& aP, IT
"from an existing differential pair make sure you are "
"at the end." );
}
return false;
}
@ -508,6 +512,7 @@ bool DIFF_PAIR_PLACER::FindDpPrimitivePair( NODE* aWorld, const VECTOR2I& aP, IT
if( item->Kind() == aItem->Kind() )
{
OPT_VECTOR2I anchor = getDanglingAnchor( aWorld, item );
if( !anchor )
continue;
@ -547,6 +552,7 @@ bool DIFF_PAIR_PLACER::FindDpPrimitivePair( NODE* aWorld, const VECTOR2I& aP, IT
"for coupled net \"%s\"." ),
aWorld->GetRuleResolver()->NetName( coupledNet ) );
}
return false;
}
@ -598,7 +604,7 @@ void DIFF_PAIR_PLACER::initPlacement()
{
m_idle = false;
m_orthoMode = false;
m_currentEndItem = NULL;
m_currentEndItem = nullptr;
m_startDiagonal = m_initialDiagonal;
NODE* world = Router()->GetWorld();
@ -608,14 +614,14 @@ void DIFF_PAIR_PLACER::initPlacement()
setWorld( rootNode );
m_lastNode = NULL;
m_lastNode = nullptr;
m_currentNode = rootNode;
m_currentMode = Settings().Mode();
if( m_shove )
delete m_shove;
m_shove = NULL;
m_shove = nullptr;
if( m_currentMode == RM_Shove || m_currentMode == RM_Smart )
{
@ -666,10 +672,10 @@ bool DIFF_PAIR_PLACER::routeHead( const VECTOR2I& aP )
{
gwsTarget.BuildForCursor( fp );
}
// close to the initial segment extension line -> keep straight part only, project as close
// as possible to the cursor
else
{
// close to the initial segment extension line -> keep straight part only, project
// as close as possible to the cursor.
gwsTarget.BuildForCursor( fpProj );
gwsTarget.FilterByOrientation( DIRECTION_45::ANG_STRAIGHT | DIRECTION_45::ANG_HALF_FULL,
DIRECTION_45( dirV ) );
@ -709,14 +715,14 @@ bool DIFF_PAIR_PLACER::Move( const VECTOR2I& aP , ITEM* aEndItem )
m_fitOk = false;
delete m_lastNode;
m_lastNode = NULL;
m_lastNode = nullptr;
bool retval = route( aP );
NODE* latestNode = m_currentNode;
m_lastNode = latestNode->Branch();
assert( m_lastNode != NULL );
assert( m_lastNode != nullptr );
m_currentEnd = aP;
updateLeadingRatLine();
@ -818,8 +824,7 @@ bool DIFF_PAIR_PLACER::AbortPlacement()
bool DIFF_PAIR_PLACER::HasPlacedAnything() const
{
return m_currentTrace.CP().SegmentCount() > 0 ||
m_currentTrace.CN().SegmentCount() > 0;
return m_currentTrace.CP().SegmentCount() > 0 || m_currentTrace.CN().SegmentCount() > 0;
}
@ -828,8 +833,8 @@ bool DIFF_PAIR_PLACER::CommitPlacement()
if( m_lastNode )
Router()->CommitRouting( m_lastNode );
m_lastNode = NULL;
m_currentNode = NULL;
m_lastNode = nullptr;
m_currentNode = nullptr;
return true;
}

View File

@ -2,7 +2,7 @@
* KiRouter - a push-and-(sometimes-)shove PCB router
*
* Copyright (C) 2013-2014 CERN
* Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2016-2021 KiCad Developers, see AUTHORS.txt for contributors.
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software: you can redistribute it and/or modify it
@ -36,14 +36,14 @@ namespace PNS {
DP_MEANDER_PLACER::DP_MEANDER_PLACER( ROUTER* aRouter ) :
MEANDER_PLACER_BASE( aRouter )
{
m_world = NULL;
m_currentNode = NULL;
m_world = nullptr;
m_currentNode = nullptr;
m_padToDieP = 0;
m_padToDieN = 0;
// Init temporary variables (do not leave uninitialized members)
m_initialSegment = NULL;
m_initialSegment = nullptr;
m_lastLength = 0;
m_lastStatus = TOO_SHORT;
}
@ -88,16 +88,16 @@ bool DP_MEANDER_PLACER::Start( const VECTOR2I& aP, ITEM* aStartItem )
if( !topo.AssembleDiffPair( m_initialSegment, m_originPair ) )
{
Router()->SetFailureReason( _( "Unable to find complementary differential pair "
"net for length tuning. Make sure the names of the nets belonging "
"to a differential pair end with either _N/_P or +/-." ) );
"net for length tuning. Make sure the names of the nets "
"belonging to a differential pair end with either _N/_P "
"or +/-." ) );
return false;
}
if( m_originPair.Gap() < 0 )
m_originPair.SetGap( Router()->Sizes().DiffPairGap() );
if( !m_originPair.PLine().SegmentCount() ||
!m_originPair.NLine().SegmentCount() )
if( !m_originPair.PLine().SegmentCount() || !m_originPair.NLine().SegmentCount() )
return false;
SOLID* padA = nullptr;
@ -274,7 +274,8 @@ bool DP_MEANDER_PLACER::Move( const VECTOR2I& aP, ITEM* aEndItem )
m_lastLength += std::max( tunedP.Length(), tunedN.Length() );
int comp = compareWithTolerance( m_lastLength - m_settings.m_targetLength, 0, m_settings.m_lengthTolerance );
int comp = compareWithTolerance( m_lastLength - m_settings.m_targetLength, 0,
m_settings.m_lengthTolerance );
if( comp > 0 )
m_lastStatus = TOO_LONG;
@ -323,8 +324,7 @@ bool DP_MEANDER_PLACER::AbortPlacement()
bool DP_MEANDER_PLACER::HasPlacedAnything() const
{
return m_originPair.CP().SegmentCount() > 0 ||
m_originPair.CN().SegmentCount() > 0;
return m_originPair.CP().SegmentCount() > 0 || m_originPair.CN().SegmentCount() > 0;
}
@ -333,7 +333,7 @@ bool DP_MEANDER_PLACER::CommitPlacement()
if( m_currentNode )
Router()->CommitRouting( m_currentNode );
m_currentNode = NULL;
m_currentNode = nullptr;
return true;
}

View File

@ -2,7 +2,7 @@
* KiRouter - a push-and-(sometimes-)shove PCB router
*
* Copyright (C) 2013-2014 CERN
* Copyright (C) 2016-2019 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2016-2021 KiCad Developers, see AUTHORS.txt for contributors.
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software: you can redistribute it and/or modify it
@ -34,8 +34,8 @@ DRAGGER::DRAGGER( ROUTER* aRouter ) :
m_initialVia( {} ),
m_draggedVia( {} )
{
m_world = NULL;
m_lastNode = NULL;
m_world = nullptr;
m_lastNode = nullptr;
m_mode = DM_SEGMENT;
m_draggedSegmentIndex = 0;
m_dragStatus = false;
@ -211,7 +211,7 @@ bool DRAGGER::Start( const VECTOR2I& aP, ITEM_SET& aPrimitives )
ITEM* startItem = aPrimitives[0];
m_lastNode = NULL;
m_lastNode = nullptr;
m_draggedItems.Clear();
m_currentMode = Settings().Mode();
m_freeAngleMode = (m_mode & DM_FREE_ANGLE);
@ -229,7 +229,8 @@ bool DRAGGER::Start( const VECTOR2I& aP, ITEM_SET& aPrimitives )
startItem->Unmark( MK_LOCKED );
PNS_DBG( Dbg(), Message, wxString::Format( "StartDragging: item %p [kind %d]", startItem, (int) startItem->Kind() ) );
PNS_DBG( Dbg(), Message, wxString::Format( "StartDragging: item %p [kind %d]",
startItem, (int) startItem->Kind() ) );
switch( startItem->Kind() )
{
@ -411,7 +412,8 @@ bool DRAGGER::dragViaWalkaround( const VIA_HANDLE& aHandle, NODE* aNode, const V
LINE draggedLine( *l );
LINE walkLine( *l );
draggedLine.DragCorner( viaTargetPos, origLine.CLine().Find( aHandle.pos ), m_freeAngleMode );
draggedLine.DragCorner( viaTargetPos, origLine.CLine().Find( aHandle.pos ),
m_freeAngleMode );
draggedLine.ClearLinks();
if ( m_world->CheckColliding( &draggedLine ) )
@ -526,7 +528,8 @@ bool DRAGGER::tryWalkaround( NODE* aNode, LINE& aOrig, LINE& aWalk )
bool DRAGGER::dragWalkaround( const VECTOR2I& aP )
{
bool ok = false;
// fixme: rewrite using shared_ptr...
// fixme: rewrite using shared_ptr...
if( m_lastNode )
{
delete m_lastNode;
@ -569,7 +572,8 @@ bool DRAGGER::dragWalkaround( const VECTOR2I& aP )
m_lastNode->Remove( origLine );
optimizeAndUpdateDraggedLine( draggedWalk, origLine, aP );
}
break;
break;
}
case DM_VIA: // fixme...
{
@ -591,7 +595,7 @@ bool DRAGGER::dragShove( const VECTOR2I& aP )
if( m_lastNode )
{
delete m_lastNode;
m_lastNode = NULL;
m_lastNode = nullptr;
}
switch( m_mode )
@ -614,7 +618,9 @@ bool DRAGGER::dragShove( const VECTOR2I& aP )
SHOVE::SHOVE_STATUS st = m_shove->ShoveLines( dragged );
if( st == SHOVE::SH_OK )
{
ok = true;
}
else if( st == SHOVE::SH_HEAD_MODIFIED )
{
dragged = m_shove->NewHead();

View File

@ -2,7 +2,7 @@
* KiRouter - a push-and-(sometimes-)shove PCB router
*
* Copyright (C) 2013-2014 CERN
* Copyright (C) 2016-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2016-2021 KiCad Developers, see AUTHORS.txt for contributors.
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software: you can redistribute it and/or modify it
@ -71,7 +71,7 @@ void INDEX::Replace( ITEM* aOldItem, ITEM* aNewItem )
INDEX::NET_ITEMS_LIST* INDEX::GetItemsForNet( int aNet )
{
if( m_netMap.find( aNet ) == m_netMap.end() )
return NULL;
return nullptr;
return &m_netMap[aNet];
}

View File

@ -75,8 +75,8 @@ public:
m_net = UnusedNet;
m_movable = true;
m_kind = aKind;
m_parent = NULL;
m_owner = NULL;
m_parent = nullptr;
m_owner = nullptr;
m_marker = 0;
m_rank = -1;
m_routable = true;

View File

@ -2,7 +2,7 @@
* KiRouter - a push-and-(sometimes-)shove PCB router
*
* Copyright (C) 2013-2014 CERN
* Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2016-2021 KiCad Developers, see AUTHORS.txt for contributors.
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software: you can redistribute it and/or modify it
@ -29,11 +29,8 @@
namespace PNS {
/**
* ITEM_SET
*
* Holds a list of board items, that can be filtered against net, kinds,
* layers, etc.
**/
* Hold a list of board items, that can be filtered against net, kinds, layers, etc.
*/
class LINE;
class ITEM_SET
@ -95,7 +92,7 @@ public:
typedef std::vector<ENTRY> ENTRIES;
ITEM_SET( ITEM* aInitialItem = NULL, bool aBecomeOwner = false )
ITEM_SET( ITEM* aInitialItem = nullptr, bool aBecomeOwner = false )
{
if( aInitialItem )
m_items.emplace_back( ENTRY( aInitialItem, aBecomeOwner ) );
@ -224,7 +221,7 @@ public:
}
}
return NULL;
return nullptr;
}
private:

View File

@ -34,11 +34,11 @@
namespace PNS {
/**
* Represents a 2D point on a given set of layers and belonging to a certain net, that links
* A 2D point on a given set of layers and belonging to a certain net, that links
* together a number of board items.
*
* A hash table of joints is used by the router to follow connectivity between the items.
**/
*/
class JOINT : public ITEM
{
public:
@ -92,7 +92,7 @@ public:
ITEM* Clone( ) const override
{
assert( false );
return NULL;
return nullptr;
}
///< Return true if the joint is a trivial line corner, connecting two
@ -159,7 +159,7 @@ public:
LINKED_ITEM* NextSegment( ITEM* aCurrent ) const
{
if( !IsLineCorner() )
return NULL;
return nullptr;
return static_cast<LINKED_ITEM*>( m_linkedItems[m_linkedItems[0] == aCurrent ? 1 : 0] );
}
@ -172,7 +172,7 @@ public:
return static_cast<VIA*>( item );
}
return NULL;
return nullptr;
}

Some files were not shown because too many files have changed in this diff Show More