Code formatting.

This commit is contained in:
Maciej Suminski 2015-02-18 17:53:46 +01:00
parent 112adccbcb
commit 4fb9bce354
100 changed files with 3005 additions and 4238 deletions

View File

@ -29,35 +29,37 @@
#include <wx_status_popup.h> #include <wx_status_popup.h>
#include <wxPcbStruct.h> #include <wxPcbStruct.h>
WX_STATUS_POPUP::WX_STATUS_POPUP ( PCB_EDIT_FRAME *parent ) : WX_STATUS_POPUP::WX_STATUS_POPUP( PCB_EDIT_FRAME* aParent ) :
wxPopupWindow ( parent ) wxPopupWindow( aParent )
{ {
m_panel = new wxPanel( this, wxID_ANY ); m_panel = new wxPanel( this, wxID_ANY );
m_panel->SetBackgroundColour( *wxLIGHT_GREY ); m_panel->SetBackgroundColour( *wxLIGHT_GREY );
m_topSizer = new wxBoxSizer( wxVERTICAL ); m_topSizer = new wxBoxSizer( wxVERTICAL );
m_panel->SetSizer( m_topSizer ); m_panel->SetSizer( m_topSizer );
} }
void WX_STATUS_POPUP::updateSize() void WX_STATUS_POPUP::updateSize()
{ {
m_topSizer->Fit( m_panel ); m_topSizer->Fit( m_panel );
SetClientSize( m_panel->GetSize() ); SetClientSize( m_panel->GetSize() );
} }
WX_STATUS_POPUP::~WX_STATUS_POPUP() WX_STATUS_POPUP::~WX_STATUS_POPUP()
{ {
} }
void WX_STATUS_POPUP::Popup(wxWindow *focus)
void WX_STATUS_POPUP::Popup( wxWindow* )
{ {
Show( true ); Show( true );
Raise(); Raise();
} }
void WX_STATUS_POPUP::Move( const wxPoint& aWhere ) void WX_STATUS_POPUP::Move( const wxPoint& aWhere )
{ {
SetPosition ( aWhere ); SetPosition ( aWhere );
} }

View File

@ -50,6 +50,7 @@ WX_UNIT_BINDER::~WX_UNIT_BINDER()
{ {
} }
void WX_UNIT_BINDER::SetValue( int aValue ) void WX_UNIT_BINDER::SetValue( int aValue )
{ {
wxString s = StringFromValue( m_units, aValue, false ); wxString s = StringFromValue( m_units, aValue, false );
@ -59,6 +60,7 @@ void WX_UNIT_BINDER::SetValue( int aValue )
m_unitLabel->SetLabel( GetAbbreviatedUnitsLabel( m_units ) ); m_unitLabel->SetLabel( GetAbbreviatedUnitsLabel( m_units ) );
} }
int WX_UNIT_BINDER::GetValue() const int WX_UNIT_BINDER::GetValue() const
{ {
wxString s = m_textCtrl->GetValue(); wxString s = m_textCtrl->GetValue();
@ -66,6 +68,7 @@ int WX_UNIT_BINDER::GetValue() const
return ValueFromString( m_units, s ); return ValueFromString( m_units, s );
} }
void WX_UNIT_BINDER::Enable( bool aEnable ) void WX_UNIT_BINDER::Enable( bool aEnable )
{ {
m_textCtrl->Enable( aEnable ); m_textCtrl->Enable( aEnable );

View File

@ -257,7 +257,6 @@ public:
return cnt; return cnt;
} }
/** /**
* Function Collect * Function Collect
* scans an EDA_ITEM using this class's Inspector method, which does * scans an EDA_ITEM using this class's Inspector method, which does

View File

@ -50,7 +50,7 @@ public:
/** /**
* Function GetSize() * Function GetSize()
* Returns information about number of vertices stored. * Returns information about number of vertices stored.
* @param Number of vertices. * @return Number of vertices.
*/ */
inline unsigned int GetSize() const inline unsigned int GetSize() const
{ {

View File

@ -320,7 +320,6 @@ private:
int m_index; int m_index;
}; };
inline VECTOR2I SEG::LineProject( const VECTOR2I& aP ) const inline VECTOR2I SEG::LineProject( const VECTOR2I& aP ) const
{ {
VECTOR2I d = B - A; VECTOR2I d = B - A;
@ -337,7 +336,6 @@ inline VECTOR2I SEG::LineProject( const VECTOR2I& aP ) const
return A + VECTOR2I( xp, yp ); return A + VECTOR2I( xp, yp );
} }
inline int SEG::LineDistance( const VECTOR2I& aP, bool aDetermineSide ) const inline int SEG::LineDistance( const VECTOR2I& aP, bool aDetermineSide ) const
{ {
ecoord p = A.y - B.y; ecoord p = A.y - B.y;
@ -376,7 +374,6 @@ inline const VECTOR2I SEG::NearestPoint( const VECTOR2I& aP ) const
return A + VECTOR2I( xp, yp ); return A + VECTOR2I( xp, yp );
} }
inline std::ostream& operator<<( std::ostream& aStream, const SEG& aSeg ) inline std::ostream& operator<<( std::ostream& aStream, const SEG& aSeg )
{ {
aStream << "[ " << aSeg.A << " - " << aSeg.B << " ]"; aStream << "[ " << aSeg.A << " - " << aSeg.B << " ]";

View File

@ -85,7 +85,6 @@ public:
HIDDEN = 0x02 /// Item is temporarily hidden (e.g. being used by a tool). Overrides VISIBLE flag. HIDDEN = 0x02 /// Item is temporarily hidden (e.g. being used by a tool). Overrides VISIBLE flag.
}; };
VIEW_ITEM() : m_view( NULL ), m_flags( VISIBLE ), m_requiredUpdate( ALL ), VIEW_ITEM() : m_view( NULL ), m_flags( VISIBLE ), m_requiredUpdate( ALL ),
m_groups( NULL ), m_groupsSize( 0 ) {} m_groups( NULL ), m_groupsSize( 0 ) {}
@ -148,6 +147,7 @@ public:
m_flags |= VISIBLE; m_flags |= VISIBLE;
else else
m_flags &= ~VISIBLE; m_flags &= ~VISIBLE;
ViewUpdate( APPEARANCE | COLOR ); ViewUpdate( APPEARANCE | COLOR );
} }
} }

View File

@ -41,10 +41,10 @@ class PCB_EDIT_FRAME;
class WX_STATUS_POPUP: public wxPopupWindow class WX_STATUS_POPUP: public wxPopupWindow
{ {
public: public:
WX_STATUS_POPUP ( PCB_EDIT_FRAME *parent ); WX_STATUS_POPUP( PCB_EDIT_FRAME* aParent );
virtual ~WX_STATUS_POPUP(); virtual ~WX_STATUS_POPUP();
virtual void Popup(wxWindow *focus = NULL); virtual void Popup(wxWindow* aFocus = NULL);
virtual void Move( const wxPoint &aWhere ); virtual void Move( const wxPoint &aWhere );
protected: protected:

View File

@ -815,12 +815,14 @@ void MODULE::RunOnChildren( boost::function<void (BOARD_ITEM*)> aFunction )
} }
} }
const BOX2I MODULE::ViewBBox() const const BOX2I MODULE::ViewBBox() const
{ {
return BOX2I( VECTOR2I( GetFootprintRect().GetOrigin() ), return BOX2I( VECTOR2I( GetFootprintRect().GetOrigin() ),
VECTOR2I( GetFootprintRect().GetSize() ) ); VECTOR2I( GetFootprintRect().GetSize() ) );
} }
void MODULE::ViewUpdate( int aUpdateFlags ) void MODULE::ViewUpdate( int aUpdateFlags )
{ {
if( !m_view ) if( !m_view )
@ -1115,6 +1117,7 @@ void MODULE::SetOrientation( double newangle )
CalculateBoundingBox(); CalculateBoundingBox();
} }
double MODULE::PadCoverageRatio() const double MODULE::PadCoverageRatio() const
{ {
double padArea = 0.0; double padArea = 0.0;

View File

@ -263,6 +263,7 @@ public:
} }
bool PadsLocked() const { return ( m_ModuleStatus & MODULE_PADS_LOCKED ); } bool PadsLocked() const { return ( m_ModuleStatus & MODULE_PADS_LOCKED ); }
void SetPadsLocked( bool aPadsLocked ) void SetPadsLocked( bool aPadsLocked )
{ {
if( aPadsLocked ) if( aPadsLocked )

View File

@ -31,7 +31,6 @@ DIALOG_PNS_DIFF_PAIR_DIMENSIONS::DIALOG_PNS_DIFF_PAIR_DIMENSIONS( wxWindow* aPar
m_traceGap( this, m_traceGapText, m_traceGapUnit ), m_traceGap( this, m_traceGapText, m_traceGapUnit ),
m_viaGap( this, m_viaGapText, m_viaGapUnit ), m_viaGap( this, m_viaGapText, m_viaGapUnit ),
m_sizes( aSizes ) m_sizes( aSizes )
{ {
m_traceWidth.SetValue( aSizes.DiffPairWidth() ); m_traceWidth.SetValue( aSizes.DiffPairWidth() );
m_traceGap.SetValue( aSizes.DiffPairGap() ); m_traceGap.SetValue( aSizes.DiffPairGap() );
@ -41,9 +40,9 @@ DIALOG_PNS_DIFF_PAIR_DIMENSIONS::DIALOG_PNS_DIFF_PAIR_DIMENSIONS( wxWindow* aPar
updateCheckbox(); updateCheckbox();
} }
void DIALOG_PNS_DIFF_PAIR_DIMENSIONS::updateCheckbox() void DIALOG_PNS_DIFF_PAIR_DIMENSIONS::updateCheckbox()
{ {
printf("Checked: %d", m_viaTraceGapEqual->GetValue());
if( m_viaTraceGapEqual->GetValue() ) if( m_viaTraceGapEqual->GetValue() )
{ {
m_sizes.SetDiffPairViaGapSameAsTraceGap( true ); m_sizes.SetDiffPairViaGapSameAsTraceGap( true );
@ -58,6 +57,7 @@ void DIALOG_PNS_DIFF_PAIR_DIMENSIONS::updateCheckbox()
} }
} }
void DIALOG_PNS_DIFF_PAIR_DIMENSIONS::OnClose( wxCloseEvent& aEvent ) void DIALOG_PNS_DIFF_PAIR_DIMENSIONS::OnClose( wxCloseEvent& aEvent )
{ {
// Do nothing, it is result of ESC pressing // Do nothing, it is result of ESC pressing
@ -83,6 +83,7 @@ void DIALOG_PNS_DIFF_PAIR_DIMENSIONS::OnCancelClick( wxCommandEvent& aEvent )
EndModal( 0 ); EndModal( 0 );
} }
void DIALOG_PNS_DIFF_PAIR_DIMENSIONS::OnViaTraceGapEqualCheck( wxCommandEvent& event ) void DIALOG_PNS_DIFF_PAIR_DIMENSIONS::OnViaTraceGapEqualCheck( wxCommandEvent& event )
{ {
event.Skip(); event.Skip();

View File

@ -41,7 +41,6 @@ class DIALOG_PNS_DIFF_PAIR_DIMENSIONS : public DIALOG_PNS_DIFF_PAIR_DIMENSIONS_B
virtual void OnCancelClick( wxCommandEvent& aEvent ); virtual void OnCancelClick( wxCommandEvent& aEvent );
virtual void OnViaTraceGapEqualCheck( wxCommandEvent& event ); virtual void OnViaTraceGapEqualCheck( wxCommandEvent& event );
private: private:
void updateCheckbox(); void updateCheckbox();

View File

@ -34,7 +34,6 @@ DIALOG_PNS_LENGTH_TUNING_SETTINGS::DIALOG_PNS_LENGTH_TUNING_SETTINGS( wxWindow*
m_settings( aSettings ), m_settings( aSettings ),
m_mode( aMode ) m_mode( aMode )
{ {
m_miterStyle->Enable( false ); m_miterStyle->Enable( false );
m_radiusText->Enable( aMode != PNS_MODE_TUNE_DIFF_PAIR ); m_radiusText->Enable( aMode != PNS_MODE_TUNE_DIFF_PAIR );
//m_minAmpl.Enable ( aMode != PNS_MODE_TUNE_DIFF_PAIR_SKEW ); //m_minAmpl.Enable ( aMode != PNS_MODE_TUNE_DIFF_PAIR_SKEW );
@ -45,7 +44,6 @@ DIALOG_PNS_LENGTH_TUNING_SETTINGS::DIALOG_PNS_LENGTH_TUNING_SETTINGS( wxWindow*
m_spacing.SetValue( m_settings.m_spacing ); m_spacing.SetValue( m_settings.m_spacing );
m_radiusText->SetValue( wxString::Format( wxT( "%i" ), m_settings.m_cornerRadiusPercentage ) ); m_radiusText->SetValue( wxString::Format( wxT( "%i" ), m_settings.m_cornerRadiusPercentage ) );
m_miterStyle->SetSelection( m_settings.m_cornerType == PNS_MEANDER_SETTINGS::ROUND ? 1 : 0 ); m_miterStyle->SetSelection( m_settings.m_cornerType == PNS_MEANDER_SETTINGS::ROUND ? 1 : 0 );
switch( aMode ) switch( aMode )
@ -54,14 +52,12 @@ DIALOG_PNS_LENGTH_TUNING_SETTINGS::DIALOG_PNS_LENGTH_TUNING_SETTINGS( wxWindow*
SetTitle( _( "Single track length tuning" ) ); SetTitle( _( "Single track length tuning" ) );
m_legend->SetBitmap( KiBitmap( tune_single_track_length_legend_xpm ) ); m_legend->SetBitmap( KiBitmap( tune_single_track_length_legend_xpm ) );
m_targetLength.SetValue( m_settings.m_targetLength ); m_targetLength.SetValue( m_settings.m_targetLength );
break; break;
case PNS_MODE_TUNE_DIFF_PAIR: case PNS_MODE_TUNE_DIFF_PAIR:
SetTitle( _( "Differential pair length tuning" ) ); SetTitle( _( "Differential pair length tuning" ) );
m_legend->SetBitmap( KiBitmap( tune_diff_pair_length_legend_xpm ) ); m_legend->SetBitmap( KiBitmap( tune_diff_pair_length_legend_xpm ) );
m_targetLength.SetValue( m_settings.m_targetLength ); m_targetLength.SetValue( m_settings.m_targetLength );
break; break;
case PNS_MODE_TUNE_DIFF_PAIR_SKEW: case PNS_MODE_TUNE_DIFF_PAIR_SKEW:
@ -90,7 +86,6 @@ void DIALOG_PNS_LENGTH_TUNING_SETTINGS::OnClose( wxCloseEvent& aEvent )
void DIALOG_PNS_LENGTH_TUNING_SETTINGS::OnOkClick( wxCommandEvent& aEvent ) void DIALOG_PNS_LENGTH_TUNING_SETTINGS::OnOkClick( wxCommandEvent& aEvent )
{ {
// fixme: use validators and TransferDataFromWindow // fixme: use validators and TransferDataFromWindow
m_settings.m_minAmplitude = m_minAmpl.GetValue(); m_settings.m_minAmplitude = m_minAmpl.GetValue();
m_settings.m_maxAmplitude = m_maxAmpl.GetValue(); m_settings.m_maxAmplitude = m_maxAmpl.GetValue();
@ -106,11 +101,8 @@ void DIALOG_PNS_LENGTH_TUNING_SETTINGS::OnOkClick( wxCommandEvent& aEvent )
if( m_settings.m_maxAmplitude < m_settings.m_minAmplitude ) if( m_settings.m_maxAmplitude < m_settings.m_minAmplitude )
m_settings.m_maxAmplitude = m_settings.m_maxAmplitude; m_settings.m_maxAmplitude = m_settings.m_maxAmplitude;
m_settings.m_cornerType = m_miterStyle->GetSelection() ? PNS_MEANDER_SETTINGS::CHAMFER : PNS_MEANDER_SETTINGS::ROUND; m_settings.m_cornerType = m_miterStyle->GetSelection() ? PNS_MEANDER_SETTINGS::CHAMFER : PNS_MEANDER_SETTINGS::ROUND;
EndModal( 1 ); EndModal( 1 );
} }

View File

@ -43,7 +43,6 @@ class DIALOG_PNS_LENGTH_TUNING_SETTINGS : public DIALOG_PNS_LENGTH_TUNING_SETTIN
virtual void OnCancelClick( wxCommandEvent& aEvent ); virtual void OnCancelClick( wxCommandEvent& aEvent );
private: private:
WX_UNIT_BINDER m_minAmpl; WX_UNIT_BINDER m_minAmpl;
WX_UNIT_BINDER m_maxAmpl; WX_UNIT_BINDER m_maxAmpl;
WX_UNIT_BINDER m_spacing; WX_UNIT_BINDER m_spacing;

File diff suppressed because it is too large Load Diff

View File

@ -39,7 +39,6 @@ class DIALOG_TRACK_VIA_SIZE : public DIALOG_TRACK_VIA_SIZE_BASE
DIALOG_TRACK_VIA_SIZE( wxWindow* aParent, BOARD_DESIGN_SETTINGS& aSettings ); DIALOG_TRACK_VIA_SIZE( wxWindow* aParent, BOARD_DESIGN_SETTINGS& aSettings );
protected: protected:
WX_UNIT_BINDER m_trackWidth; WX_UNIT_BINDER m_trackWidth;
WX_UNIT_BINDER m_viaDiameter; WX_UNIT_BINDER m_viaDiameter;
WX_UNIT_BINDER m_viaDrill; WX_UNIT_BINDER m_viaDrill;

View File

@ -515,7 +515,6 @@ void PCB_EDIT_FRAME::ReCreateMenuBar()
_( "Configure Interactive Routing." ), _( "Configure Interactive Routing." ),
KiBitmap( add_tracks_xpm ) ); // fixme: icon KiBitmap( add_tracks_xpm ) ); // fixme: icon
//--- dimensions submenu ------------------------------------------------------ //--- dimensions submenu ------------------------------------------------------
wxMenu* dimensionsMenu = new wxMenu; wxMenu* dimensionsMenu = new wxMenu;

View File

@ -70,7 +70,6 @@
#include <tool/tool_dispatcher.h> #include <tool/tool_dispatcher.h>
#include <tools/common_actions.h> #include <tools/common_actions.h>
#include <scripting/python_console_frame.h> #include <scripting/python_console_frame.h>
#if defined(KICAD_SCRIPTING) || defined(KICAD_SCRIPTING_WXPYTHON) #if defined(KICAD_SCRIPTING) || defined(KICAD_SCRIPTING_WXPYTHON)

View File

@ -49,7 +49,6 @@ enum pcbnew_ids
ID_MENU_DIFF_PAIR_DIMENSIONS, ID_MENU_DIFF_PAIR_DIMENSIONS,
ID_MENU_INTERACTIVE_ROUTER_SETTINGS, ID_MENU_INTERACTIVE_ROUTER_SETTINGS,
ID_PCB_MASK_CLEARANCE, ID_PCB_MASK_CLEARANCE,
ID_PCB_LAYERS_SETUP, ID_PCB_LAYERS_SETUP,

View File

@ -1,7 +1,7 @@
/* /*
* KiRouter - a push-and-(sometimes-)shove PCB router * KiRouter - a push-and-(sometimes-)shove PCB router
* *
* Copyright (C) 2013-2014 CERN * Copyright (C) 2013-2015 CERN
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch> * Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
* *
* This program is free software: you can redistribute it and/or modify it * This program is free software: you can redistribute it and/or modify it
@ -320,7 +320,8 @@ private:
* Function construct() * Function construct()
* Calculates the direction from a vector. If the vector's angle is not a multiple of 45 * Calculates the direction from a vector. If the vector's angle is not a multiple of 45
* degrees, the direction is rounded to the nearest octant. * degrees, the direction is rounded to the nearest octant.
* @param aVec our vector */ * @param aVec our vector
*/
void construct_( const VECTOR2I& aVec ) void construct_( const VECTOR2I& aVec )
{ {
m_dir = UNDEFINED; m_dir = UNDEFINED;
@ -347,32 +348,6 @@ private:
m_dir = (Directions) dir; m_dir = (Directions) dir;
return; return;
if( aVec.y < 0 )
{
if( aVec.x > 0 )
m_dir = NE;
else if( aVec.x < 0 )
m_dir = NW;
else
m_dir = N;
}
else if( aVec.y == 0 )
{
if( aVec.x > 0 )
m_dir = E;
else
m_dir = W;
}
else // aVec.y>0
{
if( aVec.x > 0 )
m_dir = SE;
else if( aVec.x < 0 )
m_dir = SW;
else
m_dir = S;
}
} }
///> our actual direction ///> our actual direction

View File

@ -106,6 +106,7 @@ LENGTH_TUNER_TOOL::~LENGTH_TUNER_TOOL()
delete m_router; delete m_router;
} }
void LENGTH_TUNER_TOOL::Reset( RESET_REASON aReason ) void LENGTH_TUNER_TOOL::Reset( RESET_REASON aReason )
{ {
PNS_TOOL_BASE::Reset( aReason ); PNS_TOOL_BASE::Reset( aReason );
@ -147,6 +148,7 @@ void LENGTH_TUNER_TOOL::handleCommonEvents( const TOOL_EVENT& aEvent )
} }
} }
void LENGTH_TUNER_TOOL::performTuning() void LENGTH_TUNER_TOOL::performTuning()
{ {
bool saveUndoBuffer = true; bool saveUndoBuffer = true;
@ -177,7 +179,6 @@ void LENGTH_TUNER_TOOL::performTuning()
placer->UpdateSettings( m_savedMeanderSettings ); placer->UpdateSettings( m_savedMeanderSettings );
while( OPT_TOOL_EVENT evt = Wait() ) while( OPT_TOOL_EVENT evt = Wait() )
{ {
if( evt->IsCancel() || evt->IsActivate() ) if( evt->IsCancel() || evt->IsActivate() )
@ -209,16 +210,24 @@ void LENGTH_TUNER_TOOL::performTuning()
{ {
if( m_router->FixRoute( end, NULL ) ) if( m_router->FixRoute( end, NULL ) )
break; break;
} else if (evt->IsAction ( &ACT_AmplDecrease ) ) { }
else if( evt->IsAction( &ACT_AmplDecrease ) )
{
placer->AmplitudeStep( -1 ); placer->AmplitudeStep( -1 );
m_router->Move( end, NULL ); m_router->Move( end, NULL );
} else if (evt->IsAction ( &ACT_AmplIncrease ) ) { }
else if( evt->IsAction( &ACT_AmplIncrease ) )
{
placer->AmplitudeStep( 1 ); placer->AmplitudeStep( 1 );
m_router->Move( end, NULL ); m_router->Move( end, NULL );
} else if (evt->IsAction ( &ACT_SpacingDecrease ) ) { }
else if(evt->IsAction( &ACT_SpacingDecrease ) )
{
placer->SpacingStep( -1 ); placer->SpacingStep( -1 );
m_router->Move( end, NULL ); m_router->Move( end, NULL );
} else if (evt->IsAction ( &ACT_SpacingIncrease ) ) { }
else if( evt->IsAction( &ACT_SpacingIncrease ) )
{
placer->SpacingStep( 1 ); placer->SpacingStep( 1 );
m_router->Move( end, NULL ); m_router->Move( end, NULL );
} }
@ -244,21 +253,23 @@ void LENGTH_TUNER_TOOL::performTuning()
m_ctls->SetAutoPan( false ); m_ctls->SetAutoPan( false );
m_ctls->ForceCursorPosition( false ); m_ctls->ForceCursorPosition( false );
highlightNet( false ); highlightNet( false );
} }
int LENGTH_TUNER_TOOL::TuneSingleTrace( const TOOL_EVENT& aEvent ) int LENGTH_TUNER_TOOL::TuneSingleTrace( const TOOL_EVENT& aEvent )
{ {
m_frame->SetToolID( ID_TRACK_BUTT, wxCURSOR_PENCIL, _( "Tune Trace Length" ) ); m_frame->SetToolID( ID_TRACK_BUTT, wxCURSOR_PENCIL, _( "Tune Trace Length" ) );
return mainLoop( PNS_MODE_TUNE_SINGLE ); return mainLoop( PNS_MODE_TUNE_SINGLE );
} }
int LENGTH_TUNER_TOOL::TuneDiffPair( const TOOL_EVENT& aEvent ) int LENGTH_TUNER_TOOL::TuneDiffPair( const TOOL_EVENT& aEvent )
{ {
m_frame->SetToolID( ID_TRACK_BUTT, wxCURSOR_PENCIL, _( "Tune Diff Pair Length" ) ); m_frame->SetToolID( ID_TRACK_BUTT, wxCURSOR_PENCIL, _( "Tune Diff Pair Length" ) );
return mainLoop( PNS_MODE_TUNE_DIFF_PAIR ); return mainLoop( PNS_MODE_TUNE_DIFF_PAIR );
} }
int LENGTH_TUNER_TOOL::TuneDiffPairSkew( const TOOL_EVENT& aEvent ) int LENGTH_TUNER_TOOL::TuneDiffPairSkew( const TOOL_EVENT& aEvent )
{ {
m_frame->SetToolID( ID_TRACK_BUTT, wxCURSOR_PENCIL, _( "Tune Diff Pair Skew" ) ); m_frame->SetToolID( ID_TRACK_BUTT, wxCURSOR_PENCIL, _( "Tune Diff Pair Skew" ) );

View File

@ -41,10 +41,9 @@ public:
int ClearMeanders( const TOOL_EVENT& aEvent ); int ClearMeanders( const TOOL_EVENT& aEvent );
private: private:
void performTuning( ); void performTuning( );
int mainLoop( PNS_ROUTER_MODE aMode ); int mainLoop( PNS_ROUTER_MODE aMode );
void handleCommonEvents( const TOOL_EVENT& evt ); void handleCommonEvents( const TOOL_EVENT& aEvent );
PNS_MEANDER_SETTINGS m_savedMeanderSettings; PNS_MEANDER_SETTINGS m_savedMeanderSettings;
}; };

View File

@ -33,8 +33,7 @@ class PNS_LOGGER;
* *
* Base class for all P&S algorithms (shoving, walkaround, line placement, dragging, etc.) * Base class for all P&S algorithms (shoving, walkaround, line placement, dragging, etc.)
* Holds a bunch of objects commonly used by all algorithms (P&S settings, parent router instance, logging) * Holds a bunch of objects commonly used by all algorithms (P&S settings, parent router instance, logging)
**/ */
class PNS_ALGO_BASE class PNS_ALGO_BASE
{ {
public: public:
@ -56,7 +55,6 @@ public:
///> Returns the logger object, allowing to dump geometry to a file. ///> Returns the logger object, allowing to dump geometry to a file.
virtual PNS_LOGGER* Logger(); virtual PNS_LOGGER* Logger();
private: private:
PNS_ROUTER* m_router; PNS_ROUTER* m_router;
}; };

View File

@ -48,12 +48,14 @@ PNS_DP_PRIMITIVE_PAIR::PNS_DP_PRIMITIVE_PAIR ( PNS_ITEM *aPrimP, PNS_ITEM *aPrim
m_anchorN = m_primN->Anchor( 0 ); m_anchorN = m_primN->Anchor( 0 );
} }
void PNS_DP_PRIMITIVE_PAIR::SetAnchors( const VECTOR2I& aAnchorP, const VECTOR2I& aAnchorN ) void PNS_DP_PRIMITIVE_PAIR::SetAnchors( const VECTOR2I& aAnchorP, const VECTOR2I& aAnchorN )
{ {
m_anchorP = aAnchorP; m_anchorP = aAnchorP;
m_anchorN = aAnchorN; m_anchorN = aAnchorN;
} }
PNS_DP_PRIMITIVE_PAIR::PNS_DP_PRIMITIVE_PAIR( const VECTOR2I& aAnchorP, const VECTOR2I& aAnchorN ) PNS_DP_PRIMITIVE_PAIR::PNS_DP_PRIMITIVE_PAIR( const VECTOR2I& aAnchorP, const VECTOR2I& aAnchorN )
{ {
m_anchorP = aAnchorP; m_anchorP = aAnchorP;
@ -61,6 +63,7 @@ PNS_DP_PRIMITIVE_PAIR::PNS_DP_PRIMITIVE_PAIR ( const VECTOR2I& aAnchorP, const V
m_primP = m_primN = NULL; m_primP = m_primN = NULL;
} }
PNS_DP_PRIMITIVE_PAIR::PNS_DP_PRIMITIVE_PAIR( const PNS_DP_PRIMITIVE_PAIR& aOther ) PNS_DP_PRIMITIVE_PAIR::PNS_DP_PRIMITIVE_PAIR( const PNS_DP_PRIMITIVE_PAIR& aOther )
{ {
if( aOther.m_primP ) if( aOther.m_primP )
@ -72,6 +75,7 @@ PNS_DP_PRIMITIVE_PAIR::PNS_DP_PRIMITIVE_PAIR ( const PNS_DP_PRIMITIVE_PAIR& aOth
m_anchorN = aOther.m_anchorN; m_anchorN = aOther.m_anchorN;
} }
PNS_DP_PRIMITIVE_PAIR& PNS_DP_PRIMITIVE_PAIR::operator=( const PNS_DP_PRIMITIVE_PAIR& aOther ) PNS_DP_PRIMITIVE_PAIR& PNS_DP_PRIMITIVE_PAIR::operator=( const PNS_DP_PRIMITIVE_PAIR& aOther )
{ {
if( aOther.m_primP ) if( aOther.m_primP )
@ -92,6 +96,7 @@ PNS_DP_PRIMITIVE_PAIR::~PNS_DP_PRIMITIVE_PAIR()
delete m_primN; delete m_primN;
} }
bool PNS_DP_PRIMITIVE_PAIR::Directional() const bool PNS_DP_PRIMITIVE_PAIR::Directional() const
{ {
if( !m_primP ) if( !m_primP )
@ -100,6 +105,7 @@ bool PNS_DP_PRIMITIVE_PAIR::Directional() const
return m_primP->OfKind( PNS_ITEM::SEGMENT ); return m_primP->OfKind( PNS_ITEM::SEGMENT );
} }
DIRECTION_45 PNS_DP_PRIMITIVE_PAIR::anchorDirection( PNS_ITEM* aItem, const VECTOR2I& aP ) const DIRECTION_45 PNS_DP_PRIMITIVE_PAIR::anchorDirection( PNS_ITEM* aItem, const VECTOR2I& aP ) const
{ {
if( !aItem->OfKind ( PNS_ITEM::SEGMENT ) ) if( !aItem->OfKind ( PNS_ITEM::SEGMENT ) )
@ -113,16 +119,19 @@ DIRECTION_45 PNS_DP_PRIMITIVE_PAIR::anchorDirection ( PNS_ITEM *aItem, const VEC
return DIRECTION_45( s->Seg().B - s->Seg().A ); return DIRECTION_45( s->Seg().B - s->Seg().A );
} }
DIRECTION_45 PNS_DP_PRIMITIVE_PAIR::DirP() const DIRECTION_45 PNS_DP_PRIMITIVE_PAIR::DirP() const
{ {
return anchorDirection( m_primP, m_anchorP ); return anchorDirection( m_primP, m_anchorP );
} }
DIRECTION_45 PNS_DP_PRIMITIVE_PAIR::DirN() const DIRECTION_45 PNS_DP_PRIMITIVE_PAIR::DirN() const
{ {
return anchorDirection( m_primN, m_anchorN ); return anchorDirection( m_primN, m_anchorN );
} }
static void drawGw( VECTOR2I p, int color ) static void drawGw( VECTOR2I p, int color )
{ {
SHAPE_LINE_CHAIN l; SHAPE_LINE_CHAIN l;
@ -138,8 +147,6 @@ static void drawGw ( VECTOR2I p, int color )
l.Append( p + VECTOR2I( 50000, -50000 ) ); l.Append( p + VECTOR2I( 50000, -50000 ) );
// PNS_ROUTER::GetInstance()->DisplayDebugLine ( l, color, 10000 ); // PNS_ROUTER::GetInstance()->DisplayDebugLine ( l, color, 10000 );
} }
@ -149,29 +156,35 @@ static DIRECTION_45::AngleType angle ( const VECTOR2I &a, const VECTOR2I &b )
DIRECTION_45 dir_b( b ); DIRECTION_45 dir_b( b );
return dir_a.Angle( dir_b ); return dir_a.Angle( dir_b );
} }
static bool checkGap( const SHAPE_LINE_CHAIN &p, const SHAPE_LINE_CHAIN &n, int gap ) static bool checkGap( const SHAPE_LINE_CHAIN &p, const SHAPE_LINE_CHAIN &n, int gap )
{ {
int i, j; int i, j;
for( i = 0; i < p.SegmentCount(); i++ ) for( i = 0; i < p.SegmentCount(); i++ )
{
for( j = 0; j < n.SegmentCount() ; j++ ) for( j = 0; j < n.SegmentCount() ; j++ )
{ {
int dist = p.CSegment( i ).Distance( n.CSegment( j ) ); int dist = p.CSegment( i ).Distance( n.CSegment( j ) );
if( dist < gap - 100 ) if( dist < gap - 100 )
return false; return false;
} }
}
return true; return true;
} }
void PNS_DP_GATEWAY::Reverse() void PNS_DP_GATEWAY::Reverse()
{ {
m_entryN = m_entryN.Reverse(); m_entryN = m_entryN.Reverse();
m_entryP = m_entryP.Reverse(); m_entryP = m_entryP.Reverse();
} }
bool PNS_DIFF_PAIR::BuildInitial( PNS_DP_GATEWAY& aEntry, PNS_DP_GATEWAY &aTarget, bool aPrefDiagonal ) bool PNS_DIFF_PAIR::BuildInitial( PNS_DP_GATEWAY& aEntry, PNS_DP_GATEWAY &aTarget, bool aPrefDiagonal )
{ {
SHAPE_LINE_CHAIN p = DIRECTION_45().BuildInitialTrace ( aEntry.AnchorP(), aTarget.AnchorP(), aPrefDiagonal ); SHAPE_LINE_CHAIN p = DIRECTION_45().BuildInitialTrace ( aEntry.AnchorP(), aTarget.AnchorP(), aPrefDiagonal );
@ -196,11 +209,14 @@ bool PNS_DIFF_PAIR::BuildInitial ( PNS_DP_GATEWAY& aEntry, PNS_DP_GATEWAY &aTarg
{ {
if( !aEntry.Entry().CheckConnectionAngle( *this, mask ) ) if( !aEntry.Entry().CheckConnectionAngle( *this, mask ) )
return false; return false;
sum_p = aEntry.Entry().CP(); sum_p = aEntry.Entry().CP();
sum_n = aEntry.Entry().CN(); sum_n = aEntry.Entry().CN();
sum_p.Append( p ); sum_p.Append( p );
sum_n.Append( n ); sum_n.Append( n );
} else { }
else
{
sum_p = p; sum_p = p;
sum_n = n; sum_n = n;
} }
@ -220,7 +236,6 @@ bool PNS_DIFF_PAIR::BuildInitial ( PNS_DP_GATEWAY& aEntry, PNS_DP_GATEWAY &aTarg
sum_p.Append( t.Entry().CP() ); sum_p.Append( t.Entry().CP() );
sum_n.Append( t.Entry().CN() ); sum_n.Append( t.Entry().CN() );
} }
m_p = sum_p; m_p = sum_p;
@ -229,39 +244,43 @@ bool PNS_DIFF_PAIR::BuildInitial ( PNS_DP_GATEWAY& aEntry, PNS_DP_GATEWAY &aTarg
return true; return true;
} }
bool PNS_DIFF_PAIR::CheckConnectionAngle ( const PNS_DIFF_PAIR &aOther, int allowedAngles ) const
bool PNS_DIFF_PAIR::CheckConnectionAngle( const PNS_DIFF_PAIR& aOther, int aAllowedAngles ) const
{ {
bool checkP, checkN; bool checkP, checkN;
if( m_p.SegmentCount() == 0 || aOther.m_p.SegmentCount() == 0 ) if( m_p.SegmentCount() == 0 || aOther.m_p.SegmentCount() == 0 )
checkP = true; checkP = true;
else { else
{
DIRECTION_45 p0( m_p.CSegment( -1 ) ); DIRECTION_45 p0( m_p.CSegment( -1 ) );
DIRECTION_45 p1( aOther.m_p.CSegment( 0 ) ); DIRECTION_45 p1( aOther.m_p.CSegment( 0 ) );
checkP = (p0.Angle(p1) & allowedAngles) != 0; checkP = ( p0.Angle( p1 ) & aAllowedAngles ) != 0;
} }
if( m_n.SegmentCount() == 0 || aOther.m_n.SegmentCount() == 0 ) if( m_n.SegmentCount() == 0 || aOther.m_n.SegmentCount() == 0 )
checkN = true; checkN = true;
else { else
{
DIRECTION_45 n0( m_n.CSegment( -1 ) ); DIRECTION_45 n0( m_n.CSegment( -1 ) );
DIRECTION_45 n1( aOther.m_n.CSegment( 0 ) ); DIRECTION_45 n1( aOther.m_n.CSegment( 0 ) );
checkN = (n0.Angle(n1) & allowedAngles) != 0; checkN = ( n0.Angle( n1 ) & aAllowedAngles ) != 0;
} }
return checkP && checkN; return checkP && checkN;
} }
const PNS_DIFF_PAIR PNS_DP_GATEWAY::Entry() const const PNS_DIFF_PAIR PNS_DP_GATEWAY::Entry() const
{ {
return PNS_DIFF_PAIR( m_entryP, m_entryN, 0 ); return PNS_DIFF_PAIR( m_entryP, m_entryN, 0 );
} }
void PNS_DP_GATEWAYS::BuildOrthoProjections ( PNS_DP_GATEWAYS& aEntries, const VECTOR2I& aCursorPos, int aOrthoScore )
void PNS_DP_GATEWAYS::BuildOrthoProjections( PNS_DP_GATEWAYS& aEntries,
const VECTOR2I& aCursorPos, int aOrthoScore )
{ {
BOOST_FOREACH( PNS_DP_GATEWAY g, aEntries.Gateways() ) BOOST_FOREACH( PNS_DP_GATEWAY g, aEntries.Gateways() )
{ {
@ -270,7 +289,6 @@ void PNS_DP_GATEWAYS::BuildOrthoProjections ( PNS_DP_GATEWAYS& aEntries, const V
SEG guide( midpoint, midpoint + dir ); SEG guide( midpoint, midpoint + dir );
VECTOR2I proj = guide.LineProject( aCursorPos ); VECTOR2I proj = guide.LineProject( aCursorPos );
PNS_DP_GATEWAYS targets( m_gap ); PNS_DP_GATEWAYS targets( m_gap );
targets.m_viaGap = m_viaGap; targets.m_viaGap = m_viaGap;
@ -288,7 +306,8 @@ void PNS_DP_GATEWAYS::BuildOrthoProjections ( PNS_DP_GATEWAYS& aEntries, const V
} }
bool PNS_DP_GATEWAYS::FitGateways ( PNS_DP_GATEWAYS& aEntry, PNS_DP_GATEWAYS& aTarget, bool aPrefDiagonal, PNS_DIFF_PAIR& aDp ) bool PNS_DP_GATEWAYS::FitGateways( PNS_DP_GATEWAYS& aEntry, PNS_DP_GATEWAYS& aTarget,
bool aPrefDiagonal, PNS_DIFF_PAIR& aDp )
{ {
std::vector<DP_CANDIDATE> candidates; std::vector<DP_CANDIDATE> candidates;
@ -306,7 +325,6 @@ bool PNS_DP_GATEWAYS::FitGateways ( PNS_DP_GATEWAYS& aEntry, PNS_DP_GATEWAYS& a
score +=g_entry.Priority(); score +=g_entry.Priority();
score +=g_target.Priority(); score +=g_target.Priority();
DP_CANDIDATE c; DP_CANDIDATE c;
c.score = score; c.score = score;
c.p = l.CP(); c.p = l.CP();
@ -341,6 +359,7 @@ bool PNS_DP_GATEWAYS::FitGateways ( PNS_DP_GATEWAYS& aEntry, PNS_DP_GATEWAYS& a
return false; return false;
} }
bool PNS_DP_GATEWAYS::checkDiagonalAlignment( const VECTOR2I& a, const VECTOR2I& b ) const bool PNS_DP_GATEWAYS::checkDiagonalAlignment( const VECTOR2I& a, const VECTOR2I& b ) const
{ {
VECTOR2I dir ( std::abs (a.x - b.x), std::abs ( a.y - b.y )); VECTOR2I dir ( std::abs (a.x - b.x), std::abs ( a.y - b.y ));
@ -372,7 +391,9 @@ void PNS_DP_GATEWAYS::BuildFromPrimitivePair( PNS_DP_PRIMITIVE_PAIR aPair, bool
shP = aPair.PrimP()->Shape(); shP = aPair.PrimP()->Shape();
} else if ( aPair.PrimP()->OfKind ( PNS_ITEM::SEGMENT ) && aPair.PrimN()->OfKind ( PNS_ITEM::SEGMENT ) ) { }
else if( aPair.PrimP()->OfKind( PNS_ITEM::SEGMENT ) && aPair.PrimN()->OfKind( PNS_ITEM::SEGMENT ) )
{
buildDpContinuation( aPair, aPreferDiagonal ); buildDpContinuation( aPair, aPreferDiagonal );
return; return;
@ -420,13 +441,14 @@ void PNS_DP_GATEWAYS::BuildFromPrimitivePair( PNS_DP_PRIMITIVE_PAIR aPair, bool
if( k == 0 ) if( k == 0 )
{ {
dir = majorDirection.Resize( orthoFanDistance ); dir = majorDirection.Resize( orthoFanDistance );
int d = ( padDist - m_gap ) / 2; int d = ( padDist - m_gap ) / 2;
dp = dir.Resize( d ); dp = dir.Resize( d );
dv = ( p0_n - p0_p ).Resize( d ); dv = ( p0_n - p0_p ).Resize( d );
} else { }
else
{
dir = majorDirection.Resize( diagFanDistance ); dir = majorDirection.Resize( diagFanDistance );
int d = ( padDist - m_gap ) / 2; int d = ( padDist - m_gap ) / 2;
dp = dir.Resize( d ); dp = dir.Resize( d );
@ -466,13 +488,13 @@ void PNS_DP_GATEWAYS::BuildForCursor( const VECTOR2I& aCursorPos )
{ {
VECTOR2I dir; VECTOR2I dir;
if( !attempt ) if( !attempt )
{ {
dir = VECTOR2I( gap, gap ).Resize( gap / 2 ); dir = VECTOR2I( gap, gap ).Resize( gap / 2 );
if( i % 2 == 0 ) if( i % 2 == 0 )
dir.x = -dir.x; dir.x = -dir.x;
if( i / 2 == 0 ) if( i / 2 == 0 )
dir.y = -dir.y; dir.y = -dir.y;
} }
@ -487,7 +509,8 @@ void PNS_DP_GATEWAYS::BuildForCursor( const VECTOR2I& aCursorPos )
if( m_fitVias ) if( m_fitVias )
BuildGeneric( aCursorPos + dir, aCursorPos - dir, true, true ); BuildGeneric( aCursorPos + dir, aCursorPos - dir, true, true );
else else
m_gateways.push_back( PNS_DP_GATEWAY( aCursorPos + dir, aCursorPos - dir, attempt ? true : false ) ); m_gateways.push_back( PNS_DP_GATEWAY( aCursorPos + dir,
aCursorPos - dir, attempt ? true : false ) );
drawGw ( aCursorPos + dir, 2 ); drawGw ( aCursorPos + dir, 2 );
drawGw ( aCursorPos - dir, 3 ); drawGw ( aCursorPos - dir, 3 );
@ -542,7 +565,6 @@ void PNS_DP_GATEWAYS::buildDpContinuation ( PNS_DP_PRIMITIVE_PAIR aPair, bool aI
t2 = aPair.AnchorN() + dP.Left().ToVector().Resize( gap ); t2 = aPair.AnchorN() + dP.Left().ToVector().Resize( gap );
} }
PNS_DP_GATEWAY gwL( t2, aPair.AnchorN(), !aIsDiagonal ); PNS_DP_GATEWAY gwL( t2, aPair.AnchorN(), !aIsDiagonal );
SHAPE_LINE_CHAIN ep = dP.BuildInitialTrace( aPair.AnchorP(), t2, !aIsDiagonal ); SHAPE_LINE_CHAIN ep = dP.BuildInitialTrace( aPair.AnchorP(), t2, !aIsDiagonal );
@ -602,8 +624,8 @@ void PNS_DP_GATEWAYS::BuildGeneric( const VECTOR2I& p0_p, const VECTOR2I& p0_n,
} }
} }
for( int i = 0; i < 2; i++ ) for( int i = 0; i < 2; i++ )
{
for( int j = 0; j < 2; j++ ) for( int j = 0; j < 2; j++ )
{ {
OPT_VECTOR2I ips[2], m; OPT_VECTOR2I ips[2], m;
@ -654,7 +676,7 @@ void PNS_DP_GATEWAYS::BuildGeneric( const VECTOR2I& p0_p, const VECTOR2I& p0_n,
if( angle( g_p, g_n ) != DIRECTION_45::ANG_ACUTE ) if( angle( g_p, g_n ) != DIRECTION_45::ANG_ACUTE )
m_gateways.push_back( PNS_DP_GATEWAY( *m + g_p, *m + g_n, true ) ); m_gateways.push_back( PNS_DP_GATEWAY( *m + g_p, *m + g_n, true ) );
}
} }
} }
} }
@ -678,10 +700,12 @@ PNS_DP_PRIMITIVE_PAIR PNS_DIFF_PAIR::EndingPrimitives()
PNS_DP_PRIMITIVE_PAIR dpair( &sP, &sN ); PNS_DP_PRIMITIVE_PAIR dpair( &sP, &sN );
dpair.SetAnchors( sP.Seg().B, sN.Seg().B ); dpair.SetAnchors( sP.Seg().B, sN.Seg().B );
return dpair; return dpair;
} }
} }
bool commonParallelProjection( SEG n, SEG p, SEG &pClip, SEG& nClip ) bool commonParallelProjection( SEG n, SEG p, SEG &pClip, SEG& nClip )
{ {
SEG n_proj_p( p.LineProject( n.A ), p.LineProject( n.B ) ); SEG n_proj_p( p.LineProject( n.A ), p.LineProject( n.B ) );
@ -698,14 +722,12 @@ bool commonParallelProjection ( SEG n, SEG p, SEG &pClip, SEG& nClip )
if( tproj_b < tproj_a ) if( tproj_b < tproj_a )
std::swap( tproj_b, tproj_a ); std::swap( tproj_b, tproj_a );
if( t_b <= tproj_a ) if( t_b <= tproj_a )
return false; return false;
if( t_a >= tproj_b ) if( t_a >= tproj_b )
return false; return false;
int64_t t[4] = { 0, p.TCoef( p.B ), p.TCoef( n_proj_p.A ), p.TCoef( n_proj_p.B ) }; int64_t t[4] = { 0, p.TCoef( p.B ), p.TCoef( n_proj_p.A ), p.TCoef( n_proj_p.B ) };
std::vector<int64_t> tv( t, t + 4 ); std::vector<int64_t> tv( t, t + 4 );
std::sort( tv.begin(), tv.end() ); // fixme: awful and disgusting way of finding 2 midpoints std::sort( tv.begin(), tv.end() ); // fixme: awful and disgusting way of finding 2 midpoints
@ -723,14 +745,15 @@ bool commonParallelProjection ( SEG n, SEG p, SEG &pClip, SEG& nClip )
nClip.B = n.LineProject( pClip.B ); nClip.B = n.LineProject( pClip.B );
return true; return true;
} }
double PNS_DIFF_PAIR::Skew() const double PNS_DIFF_PAIR::Skew() const
{ {
return m_p.Length() - m_n.Length(); return m_p.Length() - m_n.Length();
} }
void PNS_DIFF_PAIR::CoupledSegmentPairs( COUPLED_SEGMENTS_VEC& aPairs ) const void PNS_DIFF_PAIR::CoupledSegmentPairs( COUPLED_SEGMENTS_VEC& aPairs ) const
{ {
SHAPE_LINE_CHAIN p( m_p ); SHAPE_LINE_CHAIN p( m_p );
@ -759,6 +782,7 @@ void PNS_DIFF_PAIR::CoupledSegmentPairs ( COUPLED_SEGMENTS_VEC& aPairs ) const
} }
} }
int64_t PNS_DIFF_PAIR::CoupledLength( const SHAPE_LINE_CHAIN& aP, const SHAPE_LINE_CHAIN& aN ) const int64_t PNS_DIFF_PAIR::CoupledLength( const SHAPE_LINE_CHAIN& aP, const SHAPE_LINE_CHAIN& aN ) const
{ {
int64_t total = 0; int64_t total = 0;
@ -774,15 +798,16 @@ int64_t PNS_DIFF_PAIR::CoupledLength ( const SHAPE_LINE_CHAIN& aP, const SHAPE_L
int64_t dist = std::abs( sp.Distance(sn) - m_width ); 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 ) )
total += p_clip.Length(); total += p_clip.Length();
} }
} }
return total; return total;
} }
double PNS_DIFF_PAIR::CoupledLength() const double PNS_DIFF_PAIR::CoupledLength() const
{ {
COUPLED_SEGMENTS_VEC pairs; COUPLED_SEGMENTS_VEC pairs;
@ -796,14 +821,18 @@ double PNS_DIFF_PAIR::CoupledLength() const
return l; return l;
} }
double PNS_DIFF_PAIR::CoupledLengthFactor() const double PNS_DIFF_PAIR::CoupledLengthFactor() const
{ {
double t = TotalLength(); double t = TotalLength();
if( t == 0.0 ) if( t == 0.0 )
return 0.0; return 0.0;
return CoupledLength() / t; return CoupledLength() / t;
} }
double PNS_DIFF_PAIR::TotalLength() const double PNS_DIFF_PAIR::TotalLength() const
{ {
double lenP = m_p.Length(); double lenP = m_p.Length();
@ -812,14 +841,15 @@ double PNS_DIFF_PAIR::TotalLength() const
return (lenN + lenP ) / 2.0; return (lenN + lenP ) / 2.0;
} }
int PNS_DIFF_PAIR::CoupledLength ( const SEG& aP, const SEG& aN ) const int PNS_DIFF_PAIR::CoupledLength ( const SEG& aP, const SEG& aN ) const
{ {
SEG p_clip, n_clip; SEG p_clip, n_clip;
int64_t dist = std::abs( aP.Distance( aN ) - m_width ); 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 )) if( aP.ApproxParallel( aN ) && m_gapConstraint.Matches( dist ) &&
commonParallelProjection ( aP, aN, p_clip, n_clip ) )
return p_clip.Length(); return p_clip.Length();
return 0; return 0;
} }

View File

@ -59,7 +59,6 @@ public:
~PNS_DP_GATEWAY() ~PNS_DP_GATEWAY()
{ {
} }
/** /**
@ -67,13 +66,13 @@ public:
* *
* @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 bool IsDiagonal() const
{ {
return m_isDiagonal; return m_isDiagonal;
} }
const VECTOR2I& AnchorP() const { return m_anchorP; } const VECTOR2I& AnchorP() const { return m_anchorP; }
const VECTOR2I& AnchorN() const { return m_anchorN; } const VECTOR2I& AnchorN() const { return m_anchorN; }
/** /**
@ -118,7 +117,6 @@ public:
} }
private: private:
SHAPE_LINE_CHAIN m_entryP, m_entryN; SHAPE_LINE_CHAIN m_entryP, m_entryN;
bool m_hasEntryLines; bool m_hasEntryLines;
VECTOR2I m_anchorP, m_anchorN; VECTOR2I m_anchorP, m_anchorN;
@ -134,7 +132,6 @@ private:
**/ **/
class PNS_DP_PRIMITIVE_PAIR class PNS_DP_PRIMITIVE_PAIR
{ {
public: public:
PNS_DP_PRIMITIVE_PAIR(): PNS_DP_PRIMITIVE_PAIR():
m_primP( NULL ), m_primN( NULL ) {}; m_primP( NULL ), m_primN( NULL ) {};
@ -161,10 +158,10 @@ public:
DIRECTION_45 DirN() const; DIRECTION_45 DirN() const;
private: private:
DIRECTION_45 anchorDirection( PNS_ITEM* aItem, const VECTOR2I& aP ) const; DIRECTION_45 anchorDirection( PNS_ITEM* aItem, const VECTOR2I& aP ) const;
PNS_ITEM *m_primP, *m_primN; PNS_ITEM* m_primP;
PNS_ITEM* m_primN;
VECTOR2I m_anchorP, m_anchorN; VECTOR2I m_anchorP, m_anchorN;
}; };

View File

@ -62,31 +62,38 @@ void PNS_DIFF_PAIR_PLACER::setWorld ( PNS_NODE* aWorld )
m_world = aWorld; m_world = aWorld;
} }
const PNS_VIA PNS_DIFF_PAIR_PLACER::makeVia( const VECTOR2I& aP, int aNet ) const PNS_VIA PNS_DIFF_PAIR_PLACER::makeVia( const VECTOR2I& aP, int aNet )
{ {
const PNS_LAYERSET layers( m_sizes.GetLayerTop(), m_sizes.GetLayerBottom() ); const PNS_LAYERSET layers( m_sizes.GetLayerTop(), m_sizes.GetLayerBottom() );
PNS_VIA v( aP, layers, m_sizes.ViaDiameter(), m_sizes.ViaDrill(), -1, m_sizes.ViaType() ); PNS_VIA v( aP, layers, m_sizes.ViaDiameter(), m_sizes.ViaDrill(), -1, m_sizes.ViaType() );
v.SetNet( aNet ); v.SetNet( aNet );
return v; return v;
} }
void PNS_DIFF_PAIR_PLACER::SetOrthoMode ( bool aOrthoMode ) void PNS_DIFF_PAIR_PLACER::SetOrthoMode ( bool aOrthoMode )
{ {
m_orthoMode = aOrthoMode; m_orthoMode = aOrthoMode;
if( !m_idle ) if( !m_idle )
Move( m_currentEnd, NULL ); Move( m_currentEnd, NULL );
} }
bool PNS_DIFF_PAIR_PLACER::ToggleVia( bool aEnabled ) bool PNS_DIFF_PAIR_PLACER::ToggleVia( bool aEnabled )
{ {
m_placingVia = aEnabled; m_placingVia = aEnabled;
if( !m_idle ) if( !m_idle )
Move( m_currentEnd, NULL ); Move( m_currentEnd, NULL );
return true; return true;
} }
bool PNS_DIFF_PAIR_PLACER::rhMarkObstacles( const VECTOR2I& aP ) bool PNS_DIFF_PAIR_PLACER::rhMarkObstacles( const VECTOR2I& aP )
{ {
if( !routeHead( aP ) ) if( !routeHead( aP ) )
@ -99,6 +106,7 @@ bool PNS_DIFF_PAIR_PLACER::rhMarkObstacles( const VECTOR2I& aP )
return m_fitOk; return m_fitOk;
} }
bool PNS_DIFF_PAIR_PLACER::propagateDpHeadForces ( const VECTOR2I& aP, VECTOR2I& aNewP ) bool PNS_DIFF_PAIR_PLACER::propagateDpHeadForces ( const VECTOR2I& aP, VECTOR2I& aNewP )
{ {
PNS_VIA virtHead = makeVia( aP, -1 ); PNS_VIA virtHead = makeVia( aP, -1 );
@ -115,12 +123,12 @@ bool PNS_DIFF_PAIR_PLACER::propagateDpHeadForces ( const VECTOR2I& aP, VECTOR2I&
VECTOR2I force; VECTOR2I force;
bool solidsOnly = true; bool solidsOnly = true;
if( m_currentMode == RM_MarkObstacles ) if( m_currentMode == RM_MarkObstacles )
{ {
aNewP = aP; aNewP = aP;
return true; return true;
} else if (m_currentMode == RM_Walkaround ) }
else if( m_currentMode == RM_Walkaround )
{ {
solidsOnly = false; solidsOnly = false;
} }
@ -162,14 +170,14 @@ bool PNS_DIFF_PAIR_PLACER::attemptWalk ( PNS_NODE *aNode, PNS_DIFF_PAIR *aCurren
//Router()->DisplayDebugLine( aCurrent->CP(), 4, 10000 ); //Router()->DisplayDebugLine( aCurrent->CP(), 4, 10000 );
//Router()->DisplayDebugLine( aCurrent->CN(), 5, 10000 ); //Router()->DisplayDebugLine( aCurrent->CN(), 5, 10000 );
do { do
{
PNS_LINE preWalk = ( currentIsP ? cur.PLine() : cur.NLine() ); PNS_LINE preWalk = ( currentIsP ? cur.PLine() : cur.NLine() );
PNS_LINE preShove = ( currentIsP ? cur.NLine() : cur.PLine() ); PNS_LINE preShove = ( currentIsP ? cur.NLine() : cur.PLine() );
PNS_LINE postWalk; PNS_LINE postWalk;
if( !aNode->CheckColliding ( &preWalk, mask ) ) if( !aNode->CheckColliding ( &preWalk, mask ) )
{ {
currentIsP = !currentIsP; currentIsP = !currentIsP;
if( !aNode->CheckColliding( &preShove, mask ) ) if( !aNode->CheckColliding( &preShove, mask ) )
@ -197,7 +205,6 @@ bool PNS_DIFF_PAIR_PLACER::attemptWalk ( PNS_NODE *aNode, PNS_DIFF_PAIR *aCurren
postWalk.Line().Simplify(); postWalk.Line().Simplify();
postShove.Line().Simplify(); postShove.Line().Simplify();
cur.SetShape( postWalk.CLine(), postShove.CLine(), !currentIsP ); cur.SetShape( postWalk.CLine(), postShove.CLine(), !currentIsP );
currentIsP = !currentIsP; currentIsP = !currentIsP;
@ -205,21 +212,20 @@ bool PNS_DIFF_PAIR_PLACER::attemptWalk ( PNS_NODE *aNode, PNS_DIFF_PAIR *aCurren
if( !aNode->CheckColliding( &postShove, mask ) ) if( !aNode->CheckColliding( &postShove, mask ) )
break; break;
iter++; iter++;
} while (iter < 3); }
while( iter < 3 );
if( iter == 3 ) if( iter == 3 )
return false; return false;
aWalk.SetShape( cur.CP(), cur.CN() ); aWalk.SetShape( cur.CP(), cur.CN() );
Router()->GetClearanceFunc()->OverrideClearance( false ); Router()->GetClearanceFunc()->OverrideClearance( false );
return true; return true;
} }
bool PNS_DIFF_PAIR_PLACER::tryWalkDp( PNS_NODE* aNode, PNS_DIFF_PAIR &aPair, bool aSolidsOnly ) bool PNS_DIFF_PAIR_PLACER::tryWalkDp( PNS_NODE* aNode, PNS_DIFF_PAIR &aPair, bool aSolidsOnly )
{ {
PNS_DIFF_PAIR best; PNS_DIFF_PAIR best;
@ -256,14 +262,15 @@ bool PNS_DIFF_PAIR_PLACER::tryWalkDp ( PNS_NODE* aNode, PNS_DIFF_PAIR &aPair, bo
PNS_OPTIMIZER optimizer( m_currentNode ); PNS_OPTIMIZER optimizer( m_currentNode );
aPair.SetShape( best ); aPair.SetShape( best );
optimizer.Optimize( &aPair ); optimizer.Optimize( &aPair );
return true; return true;
} }
return false; return false;
} }
bool PNS_DIFF_PAIR_PLACER::rhWalkOnly( const VECTOR2I& aP ) bool PNS_DIFF_PAIR_PLACER::rhWalkOnly( const VECTOR2I& aP )
{ {
if( !routeHead ( aP ) ) if( !routeHead ( aP ) )
@ -292,6 +299,7 @@ bool PNS_DIFF_PAIR_PLACER::route ( const VECTOR2I& aP )
return false; return false;
} }
bool PNS_DIFF_PAIR_PLACER::rhShoveOnly( const VECTOR2I& aP ) bool PNS_DIFF_PAIR_PLACER::rhShoveOnly( const VECTOR2I& aP )
{ {
m_currentNode = m_shove->CurrentNode(); m_currentNode = m_shove->CurrentNode();
@ -332,7 +340,6 @@ bool PNS_DIFF_PAIR_PLACER::rhShoveOnly ( const VECTOR2I& aP )
} }
const PNS_ITEMSET PNS_DIFF_PAIR_PLACER::Traces() const PNS_ITEMSET PNS_DIFF_PAIR_PLACER::Traces()
{ {
PNS_ITEMSET t; PNS_ITEMSET t;
@ -372,7 +379,9 @@ bool PNS_DIFF_PAIR_PLACER::SetLayer( int aLayer )
return false; return false;
else if( !m_prevPair ) else if( !m_prevPair )
return false; return false;
else if( m_prevPair->PrimP() || ( m_prevPair->PrimP()->OfKind( PNS_ITEM::VIA ) && m_prevPair->PrimP()->Layers().Overlaps( aLayer ) ) ) { else if( m_prevPair->PrimP() || ( m_prevPair->PrimP()->OfKind( PNS_ITEM::VIA ) &&
m_prevPair->PrimP()->Layers().Overlaps( aLayer ) ) )
{
m_currentLayer = aLayer; m_currentLayer = aLayer;
m_start = *m_prevPair; m_start = *m_prevPair;
initPlacement( false ); initPlacement( false );
@ -383,34 +392,41 @@ bool PNS_DIFF_PAIR_PLACER::SetLayer( int aLayer )
return false; return false;
} }
int PNS_DIFF_PAIR_PLACER::matchDpSuffix( wxString aNetName, wxString& aComplementNet, wxString& aBaseDpName ) int PNS_DIFF_PAIR_PLACER::matchDpSuffix( wxString aNetName, wxString& aComplementNet, wxString& aBaseDpName )
{ {
int rv = 0; int rv = 0;
if( aNetName.EndsWith( "+" ) ) if( aNetName.EndsWith( "+" ) )
{ {
aComplementNet = "-"; aComplementNet = "-";
rv = 1; rv = 1;
} else if (aNetName.EndsWith("_P")) }
else if( aNetName.EndsWith( "_P" ) )
{ {
aComplementNet = "_N"; aComplementNet = "_N";
rv = 1; rv = 1;
} else if (aNetName.EndsWith("-")) }
else if( aNetName.EndsWith( "-" ) )
{ {
aComplementNet = "+"; aComplementNet = "+";
rv = -1; rv = -1;
} else if (aNetName.EndsWith("_N")) }
else if( aNetName.EndsWith( "_N" ) )
{ {
aComplementNet = "_P"; aComplementNet = "_P";
rv = -1; rv = -1;
} }
if (rv != 0) { if( rv != 0 )
{
aBaseDpName = aNetName.Left( aNetName.Length() - aComplementNet.Length() ); aBaseDpName = aNetName.Left( aNetName.Length() - aComplementNet.Length() );
} }
return rv; return rv;
} }
OPT_VECTOR2I PNS_DIFF_PAIR_PLACER::getDanglingAnchor( PNS_NODE* aNode, PNS_ITEM* aItem ) OPT_VECTOR2I PNS_DIFF_PAIR_PLACER::getDanglingAnchor( PNS_NODE* aNode, PNS_ITEM* aItem )
{ {
switch( aItem->Kind() ) switch( aItem->Kind() )
@ -433,22 +449,22 @@ OPT_VECTOR2I PNS_DIFF_PAIR_PLACER::getDanglingAnchor ( PNS_NODE *aNode, PNS_ITEM
else else
return OPT_VECTOR2I(); return OPT_VECTOR2I();
} }
default: default:
return OPT_VECTOR2I(); return OPT_VECTOR2I();
break; break;
} }
} }
bool PNS_DIFF_PAIR_PLACER::findDpPrimitivePair( const VECTOR2I& aP, PNS_ITEM* aItem, PNS_DP_PRIMITIVE_PAIR& aPair ) bool PNS_DIFF_PAIR_PLACER::findDpPrimitivePair( const VECTOR2I& aP, PNS_ITEM* aItem, PNS_DP_PRIMITIVE_PAIR& aPair )
{ {
if( !aItem || !aItem->Parent() || !aItem->Parent()->GetNet() ) if( !aItem || !aItem->Parent() || !aItem->Parent()->GetNet() )
return false; return false;
wxString netNameP = aItem->Parent()->GetNet()->GetNetname(); wxString netNameP = aItem->Parent()->GetNet()->GetNetname();
wxString netNameN, netNameBase; wxString netNameN, netNameBase;
BOARD* brd = Router()->GetBoard(); BOARD* brd = Router()->GetBoard();
PNS_ITEM *primRef = NULL, *primP = NULL, *primN = NULL; PNS_ITEM *primRef = NULL, *primP = NULL, *primN = NULL;
@ -465,7 +481,9 @@ bool PNS_DIFF_PAIR_PLACER::findDpPrimitivePair ( const VECTOR2I& aP, PNS_ITEM *a
{ {
primRef = primP = static_cast<PNS_SOLID*>( aItem ); primRef = primP = static_cast<PNS_SOLID*>( aItem );
netNameN = netNameBase + suffix; netNameN = netNameBase + suffix;
} else { }
else
{
primRef = primN = static_cast<PNS_SOLID*>( aItem ); primRef = primN = static_cast<PNS_SOLID*>( aItem );
netNameN = netNameP; netNameN = netNameP;
netNameP = netNameBase + suffix; netNameP = netNameBase + suffix;
@ -511,7 +529,9 @@ bool PNS_DIFF_PAIR_PLACER::findDpPrimitivePair ( const VECTOR2I& aP, PNS_ITEM *a
{ {
aPair = PNS_DP_PRIMITIVE_PAIR ( item, primRef ); aPair = PNS_DP_PRIMITIVE_PAIR ( item, primRef );
aPair.SetAnchors( *anchor, *refAnchor ); aPair.SetAnchors( *anchor, *refAnchor );
} else { }
else
{
aPair = PNS_DP_PRIMITIVE_PAIR( primRef, item ); aPair = PNS_DP_PRIMITIVE_PAIR( primRef, item );
aPair.SetAnchors( *refAnchor, *anchor ); aPair.SetAnchors( *refAnchor, *anchor );
} }
@ -528,11 +548,13 @@ int PNS_DIFF_PAIR_PLACER::viaGap() const
return m_sizes.DiffPairViaGap(); return m_sizes.DiffPairViaGap();
} }
int PNS_DIFF_PAIR_PLACER::gap() const int PNS_DIFF_PAIR_PLACER::gap() const
{ {
return m_sizes.DiffPairGap() + m_sizes.DiffPairWidth(); return m_sizes.DiffPairGap() + m_sizes.DiffPairWidth();
} }
bool PNS_DIFF_PAIR_PLACER::Start( const VECTOR2I& aP, PNS_ITEM* aStartItem ) bool PNS_DIFF_PAIR_PLACER::Start( const VECTOR2I& aP, PNS_ITEM* aStartItem )
{ {
VECTOR2I p( aP ); VECTOR2I p( aP );
@ -573,6 +595,7 @@ bool PNS_DIFF_PAIR_PLACER::Start( const VECTOR2I& aP, PNS_ITEM* aStartItem )
return true; return true;
} }
void PNS_DIFF_PAIR_PLACER::initPlacement( bool aSplitSeg ) void PNS_DIFF_PAIR_PLACER::initPlacement( bool aSplitSeg )
{ {
m_idle = false; m_idle = false;
@ -612,7 +635,6 @@ bool PNS_DIFF_PAIR_PLACER::routeHead( const VECTOR2I& aP )
PNS_DP_GATEWAYS gwsEntry( gap() ); PNS_DP_GATEWAYS gwsEntry( gap() );
PNS_DP_GATEWAYS gwsTarget( gap() ); PNS_DP_GATEWAYS gwsTarget( gap() );
if( !m_prevPair ) if( !m_prevPair )
m_prevPair = m_start; m_prevPair = m_start;
@ -640,7 +662,6 @@ bool PNS_DIFF_PAIR_PLACER::routeHead( const VECTOR2I& aP )
m_currentTrace.SetGap( gap() ); m_currentTrace.SetGap( gap() );
m_currentTrace.SetLayer( m_currentLayer ); m_currentTrace.SetLayer( m_currentLayer );
if ( gwsEntry.FitGateways( gwsEntry, gwsTarget, m_startDiagonal, m_currentTrace ) ) if ( gwsEntry.FitGateways( gwsEntry, gwsTarget, m_startDiagonal, m_currentTrace ) )
{ {
m_currentTrace.SetNets( m_netP, m_netN ); m_currentTrace.SetNets( m_netP, m_netN );
@ -652,13 +673,14 @@ bool PNS_DIFF_PAIR_PLACER::routeHead( const VECTOR2I& aP )
m_currentTrace.AppendVias ( makeVia ( m_currentTrace.CP().CPoint(-1), m_netP ), m_currentTrace.AppendVias ( makeVia ( m_currentTrace.CP().CPoint(-1), m_netP ),
makeVia ( m_currentTrace.CN().CPoint(-1), m_netN ) ); makeVia ( m_currentTrace.CN().CPoint(-1), m_netN ) );
} }
return true; return true;
} }
return false; return false;
} }
bool PNS_DIFF_PAIR_PLACER::Move( const VECTOR2I& aP , PNS_ITEM* aEndItem ) bool PNS_DIFF_PAIR_PLACER::Move( const VECTOR2I& aP , PNS_ITEM* aEndItem )
{ {
m_currentEndItem = aEndItem; m_currentEndItem = aEndItem;
@ -681,9 +703,11 @@ bool PNS_DIFF_PAIR_PLACER::Move(const VECTOR2I& aP , PNS_ITEM* aEndItem )
return true; return true;
} }
void PNS_DIFF_PAIR_PLACER::UpdateSizes( const PNS_SIZES_SETTINGS& aSizes ) void PNS_DIFF_PAIR_PLACER::UpdateSizes( const PNS_SIZES_SETTINGS& aSizes )
{ {
m_sizes = aSizes; m_sizes = aSizes;
if( !m_idle ) if( !m_idle )
{ {
initPlacement(); initPlacement();
@ -691,6 +715,7 @@ void PNS_DIFF_PAIR_PLACER::UpdateSizes( const PNS_SIZES_SETTINGS& aSizes )
} }
} }
bool PNS_DIFF_PAIR_PLACER::FixRoute( const VECTOR2I& aP, PNS_ITEM* aEndItem ) bool PNS_DIFF_PAIR_PLACER::FixRoute( const VECTOR2I& aP, PNS_ITEM* aEndItem )
{ {
if( !m_fitOk ) if( !m_fitOk )
@ -747,7 +772,9 @@ bool PNS_DIFF_PAIR_PLACER::FixRoute( const VECTOR2I& aP, PNS_ITEM* aEndItem )
{ {
m_idle = true; m_idle = true;
return true; return true;
} else { }
else
{
initPlacement(); initPlacement();
return false; return false;
} }
@ -760,6 +787,7 @@ void PNS_DIFF_PAIR_PLACER::GetModifiedNets( std::vector<int> &aNets ) const
aNets.push_back( m_netN ); aNets.push_back( m_netN );
} }
void PNS_DIFF_PAIR_PLACER::updateLeadingRatLine() void PNS_DIFF_PAIR_PLACER::updateLeadingRatLine()
{ {
SHAPE_LINE_CHAIN ratLineN, ratLineP; SHAPE_LINE_CHAIN ratLineN, ratLineP;
@ -774,5 +802,4 @@ void PNS_DIFF_PAIR_PLACER::updateLeadingRatLine()
{ {
Router()->DisplayDebugLine( ratLineN, 3, 10000 ); Router()->DisplayDebugLine( ratLineN, 3, 10000 );
} }
} }

View File

@ -164,8 +164,8 @@ public:
void SetOrthoMode( bool aOrthoMode ); void SetOrthoMode( bool aOrthoMode );
void GetModifiedNets( std::vector<int>& aNets ) const; void GetModifiedNets( std::vector<int>& aNets ) const;
private:
private:
int viaGap() const; int viaGap() const;
int gap() const; int gap() const;
@ -251,7 +251,6 @@ private:
PNS_DP_PRIMITIVE_PAIR m_start; PNS_DP_PRIMITIVE_PAIR m_start;
boost::optional<PNS_DP_PRIMITIVE_PAIR> m_prevPair; boost::optional<PNS_DP_PRIMITIVE_PAIR> m_prevPair;
///> current algorithm iteration ///> current algorithm iteration
int m_iteration; int m_iteration;

View File

@ -34,11 +34,8 @@
#include "pns_router.h" #include "pns_router.h"
#include "pns_utils.h" #include "pns_utils.h"
using boost::optional; using boost::optional;
PNS_DP_MEANDER_PLACER::PNS_DP_MEANDER_PLACER( PNS_ROUTER* aRouter ) : PNS_DP_MEANDER_PLACER::PNS_DP_MEANDER_PLACER( PNS_ROUTER* aRouter ) :
PNS_MEANDER_PLACER_BASE( aRouter ) PNS_MEANDER_PLACER_BASE( aRouter )
{ {
@ -49,24 +46,28 @@ PNS_DP_MEANDER_PLACER::PNS_DP_MEANDER_PLACER( PNS_ROUTER* aRouter ) :
PNS_DP_MEANDER_PLACER::~PNS_DP_MEANDER_PLACER() PNS_DP_MEANDER_PLACER::~PNS_DP_MEANDER_PLACER()
{ {
} }
const PNS_LINE PNS_DP_MEANDER_PLACER::Trace() const const PNS_LINE PNS_DP_MEANDER_PLACER::Trace() const
{ {
return m_currentTraceP; return m_currentTraceP;
} }
PNS_NODE* PNS_DP_MEANDER_PLACER::CurrentNode( bool aLoopsRemoved ) const PNS_NODE* PNS_DP_MEANDER_PLACER::CurrentNode( bool aLoopsRemoved ) const
{ {
if( !m_currentNode ) if( !m_currentNode )
return m_world; return m_world;
return m_currentNode; return m_currentNode;
} }
bool PNS_DP_MEANDER_PLACER::Start( const VECTOR2I& aP, PNS_ITEM* aStartItem ) bool PNS_DP_MEANDER_PLACER::Start( const VECTOR2I& aP, PNS_ITEM* aStartItem )
{ {
VECTOR2I p; VECTOR2I p;
if( !aStartItem || !aStartItem->OfKind( PNS_ITEM::SEGMENT ) ) if( !aStartItem || !aStartItem->OfKind( PNS_ITEM::SEGMENT ) )
{ {
Router()->SetFailureReason( _( "Please select a track whose length you want to tune." ) ); Router()->SetFailureReason( _( "Please select a track whose length you want to tune." ) );
@ -92,7 +93,6 @@ bool PNS_DP_MEANDER_PLACER::Start( const VECTOR2I& aP, PNS_ITEM* aStartItem )
return false; return false;
} }
m_originPair.SetGap( Router()->Sizes().DiffPairGap() ); m_originPair.SetGap( Router()->Sizes().DiffPairGap() );
if( !m_originPair.PLine().SegmentCount() || if( !m_originPair.PLine().SegmentCount() ||
@ -123,6 +123,7 @@ void PNS_DP_MEANDER_PLACER::release()
#endif #endif
} }
int PNS_DP_MEANDER_PLACER::origPathLength() const int PNS_DP_MEANDER_PLACER::origPathLength() const
{ {
int totalP = 0; int totalP = 0;
@ -134,16 +135,17 @@ int PNS_DP_MEANDER_PLACER::origPathLength () const
totalP += l->CLine().Length(); totalP += l->CLine().Length();
} }
BOOST_FOREACH( const PNS_ITEM* item, m_tunedPathN.CItems() ) BOOST_FOREACH( const PNS_ITEM* item, m_tunedPathN.CItems() )
{ {
if( const PNS_LINE* l = dyn_cast<const PNS_LINE*>( item ) ) if( const PNS_LINE* l = dyn_cast<const PNS_LINE*>( item ) )
totalN += l->CLine().Length(); totalN += l->CLine().Length();
} }
return std::max( totalP, totalN ); return std::max( totalP, totalN );
} }
const SEG PNS_DP_MEANDER_PLACER::baselineSegment( const PNS_DIFF_PAIR::COUPLED_SEGMENTS& aCoupledSegs ) const SEG PNS_DP_MEANDER_PLACER::baselineSegment( const PNS_DIFF_PAIR::COUPLED_SEGMENTS& aCoupledSegs )
{ {
const VECTOR2I a( ( aCoupledSegs.coupledP.A + aCoupledSegs.coupledN.A ) / 2 ); const VECTOR2I a( ( aCoupledSegs.coupledP.A + aCoupledSegs.coupledN.A ) / 2 );
@ -228,7 +230,6 @@ PNS_MEANDER_PLACER_BASE::TUNING_STATUS PNS_DP_MEANDER_PLACER::tuneLineLength ( P
#endif #endif
bool pairOrientation( const PNS_DIFF_PAIR::COUPLED_SEGMENTS& aPair ) bool pairOrientation( const PNS_DIFF_PAIR::COUPLED_SEGMENTS& aPair )
{ {
VECTOR2I midp = ( aPair.coupledP.A + aPair.coupledN.A ) / 2; VECTOR2I midp = ( aPair.coupledP.A + aPair.coupledN.A ) / 2;
@ -238,11 +239,9 @@ bool pairOrientation( const PNS_DIFF_PAIR::COUPLED_SEGMENTS& aPair )
return aPair.coupledP.Side( midp ) > 0; return aPair.coupledP.Side( midp ) > 0;
} }
bool PNS_DP_MEANDER_PLACER::Move( const VECTOR2I& aP, PNS_ITEM* aEndItem ) bool PNS_DP_MEANDER_PLACER::Move( const VECTOR2I& aP, PNS_ITEM* aEndItem )
{ {
// return false; // return false;
if( m_currentNode ) if( m_currentNode )
@ -281,15 +280,12 @@ bool PNS_DP_MEANDER_PLACER::Move( const VECTOR2I& aP, PNS_ITEM* aEndItem )
if( !pairOrientation( m_coupledSegments[0] ) ) if( !pairOrientation( m_coupledSegments[0] ) )
offset *= -1; offset *= -1;
m_result.SetBaselineOffset( offset ); m_result.SetBaselineOffset( offset );
BOOST_FOREACH( const PNS_ITEM* item, m_tunedPathP.CItems() ) BOOST_FOREACH( const PNS_ITEM* item, m_tunedPathP.CItems() )
{ {
if( const PNS_LINE* l = dyn_cast<const PNS_LINE*>( item ) ) if( const PNS_LINE* l = dyn_cast<const PNS_LINE*>( item ) )
Router()->DisplayDebugLine( l->CLine(), 5, 10000 ); Router()->DisplayDebugLine( l->CLine(), 5, 10000 );
} }
BOOST_FOREACH( const PNS_ITEM* item, m_tunedPathN.CItems() ) BOOST_FOREACH( const PNS_ITEM* item, m_tunedPathN.CItems() )
@ -298,7 +294,6 @@ bool PNS_DP_MEANDER_PLACER::Move( const VECTOR2I& aP, PNS_ITEM* aEndItem )
Router()->DisplayDebugLine( l->CLine(), 5, 10000 ); Router()->DisplayDebugLine( l->CLine(), 5, 10000 );
} }
BOOST_FOREACH( const PNS_DIFF_PAIR::COUPLED_SEGMENTS& sp, m_coupledSegments ) BOOST_FOREACH( const PNS_DIFF_PAIR::COUPLED_SEGMENTS& sp, m_coupledSegments )
{ {
SEG base = baselineSegment( sp ); SEG base = baselineSegment( sp );
@ -314,12 +309,13 @@ bool PNS_DP_MEANDER_PLACER::Move( const VECTOR2I& aP, PNS_ITEM* aEndItem )
m_lastStatus = TUNED; m_lastStatus = TUNED;
if (dpLen - m_settings.m_targetLength > m_settings.m_lengthTollerance) if( dpLen - m_settings.m_targetLength > m_settings.m_lengthTolerance )
{ {
m_lastStatus = TOO_LONG; m_lastStatus = TOO_LONG;
m_lastLength = dpLen; m_lastLength = dpLen;
} else { }
else
{
m_lastLength = dpLen - std::max( tunedP.Length(), tunedN.Length() ); m_lastLength = dpLen - std::max( tunedP.Length(), tunedN.Length() );
tuneLineLength( m_result, m_settings.m_targetLength - dpLen ); tuneLineLength( m_result, m_settings.m_targetLength - dpLen );
} }
@ -340,7 +336,7 @@ bool PNS_DP_MEANDER_PLACER::Move( const VECTOR2I& aP, PNS_ITEM* aEndItem )
m_lastLength += std::max( tunedP.Length(), tunedN.Length() ); m_lastLength += std::max( tunedP.Length(), tunedN.Length() );
int comp = compareWithTollerance( m_lastLength - m_settings.m_targetLength, 0, m_settings.m_lengthTollerance ); int comp = compareWithTolerance( m_lastLength - m_settings.m_targetLength, 0, m_settings.m_lengthTolerance );
if( comp > 0 ) if( comp > 0 )
m_lastStatus = TOO_LONG; m_lastStatus = TOO_LONG;
@ -348,7 +344,6 @@ bool PNS_DP_MEANDER_PLACER::Move( const VECTOR2I& aP, PNS_ITEM* aEndItem )
m_lastStatus = TOO_SHORT; m_lastStatus = TOO_SHORT;
else else
m_lastStatus = TUNED; m_lastStatus = TUNED;
} }
m_finalShapeP.Clear(); m_finalShapeP.Clear();
@ -380,6 +375,7 @@ bool PNS_DP_MEANDER_PLACER::FixRoute( const VECTOR2I& aP, PNS_ITEM* aEndItem )
return true; return true;
} }
bool PNS_DP_MEANDER_PLACER::CheckFit( PNS_MEANDER_SHAPE* aShape ) bool PNS_DP_MEANDER_PLACER::CheckFit( PNS_MEANDER_SHAPE* aShape )
{ {
PNS_LINE l1( m_originPair.PLine(), aShape->CLine( 0 ) ); PNS_LINE l1( m_originPair.PLine(), aShape->CLine( 0 ) );
@ -400,7 +396,6 @@ bool PNS_DP_MEANDER_PLACER::CheckFit ( PNS_MEANDER_SHAPE *aShape )
const PNS_ITEMSET PNS_DP_MEANDER_PLACER::Traces() const PNS_ITEMSET PNS_DP_MEANDER_PLACER::Traces()
{ {
m_currentTraceP = PNS_LINE( m_originPair.PLine(), m_finalShapeP ); m_currentTraceP = PNS_LINE( m_originPair.PLine(), m_finalShapeP );
m_currentTraceN = PNS_LINE( m_originPair.NLine(), m_finalShapeN ); m_currentTraceN = PNS_LINE( m_originPair.NLine(), m_finalShapeN );
@ -412,21 +407,25 @@ const PNS_ITEMSET PNS_DP_MEANDER_PLACER::Traces()
return traces; return traces;
} }
const VECTOR2I& PNS_DP_MEANDER_PLACER::CurrentEnd() const const VECTOR2I& PNS_DP_MEANDER_PLACER::CurrentEnd() const
{ {
return m_currentEnd; return m_currentEnd;
} }
int PNS_DP_MEANDER_PLACER::CurrentNet() const int PNS_DP_MEANDER_PLACER::CurrentNet() const
{ {
return m_initialSegment->Net(); return m_initialSegment->Net();
} }
int PNS_DP_MEANDER_PLACER::CurrentLayer() const int PNS_DP_MEANDER_PLACER::CurrentLayer() const
{ {
return m_initialSegment->Layers().Start(); return m_initialSegment->Layers().Start();
} }
const wxString PNS_DP_MEANDER_PLACER::TuningInfo() const const wxString PNS_DP_MEANDER_PLACER::TuningInfo() const
{ {
wxString status; wxString status;
@ -453,6 +452,7 @@ const wxString PNS_DP_MEANDER_PLACER::TuningInfo() const
return status; return status;
} }
PNS_DP_MEANDER_PLACER::TUNING_STATUS PNS_DP_MEANDER_PLACER::TuningStatus() const PNS_DP_MEANDER_PLACER::TUNING_STATUS PNS_DP_MEANDER_PLACER::TuningStatus() const
{ {
return m_lastStatus; return m_lastStatus;

View File

@ -48,7 +48,6 @@ class PNS_ROUTER_BASE;
class PNS_DP_MEANDER_PLACER : public PNS_MEANDER_PLACER_BASE class PNS_DP_MEANDER_PLACER : public PNS_MEANDER_PLACER_BASE
{ {
public: public:
PNS_DP_MEANDER_PLACER( PNS_ROUTER* aRouter ); PNS_DP_MEANDER_PLACER( PNS_ROUTER* aRouter );
~PNS_DP_MEANDER_PLACER(); ~PNS_DP_MEANDER_PLACER();
@ -96,7 +95,6 @@ public:
int CurrentNet() const; int CurrentNet() const;
int CurrentLayer() const; int CurrentLayer() const;
int totalLength(); int totalLength();
const wxString TuningInfo() const; const wxString TuningInfo() const;
@ -110,8 +108,6 @@ private:
void meanderSegment ( const SEG& aBase ); void meanderSegment ( const SEG& aBase );
// void addMeander ( PNS_MEANDER *aM ); // void addMeander ( PNS_MEANDER *aM );
// void addCorner ( const VECTOR2I& aP ); // void addCorner ( const VECTOR2I& aP );

View File

@ -160,7 +160,6 @@ PNS_INDEX::PNS_INDEX()
memset( m_subIndices, 0, sizeof( m_subIndices ) ); memset( m_subIndices, 0, sizeof( m_subIndices ) );
} }
PNS_INDEX::ITEM_SHAPE_INDEX* PNS_INDEX::getSubindex( const PNS_ITEM* aItem ) PNS_INDEX::ITEM_SHAPE_INDEX* PNS_INDEX::getSubindex( const PNS_ITEM* aItem )
{ {
int idx_n = -1; int idx_n = -1;
@ -201,7 +200,6 @@ PNS_INDEX::ITEM_SHAPE_INDEX* PNS_INDEX::getSubindex( const PNS_ITEM* aItem )
return m_subIndices[idx_n]; return m_subIndices[idx_n];
} }
void PNS_INDEX::Add( PNS_ITEM* aItem ) void PNS_INDEX::Add( PNS_ITEM* aItem )
{ {
ITEM_SHAPE_INDEX* idx = getSubindex( aItem ); ITEM_SHAPE_INDEX* idx = getSubindex( aItem );
@ -216,7 +214,6 @@ void PNS_INDEX::Add( PNS_ITEM* aItem )
} }
} }
void PNS_INDEX::Remove( PNS_ITEM* aItem ) void PNS_INDEX::Remove( PNS_ITEM* aItem )
{ {
ITEM_SHAPE_INDEX* idx = getSubindex( aItem ); ITEM_SHAPE_INDEX* idx = getSubindex( aItem );
@ -230,14 +227,12 @@ void PNS_INDEX::Remove( PNS_ITEM* aItem )
m_netMap[net].remove( aItem ); m_netMap[net].remove( aItem );
} }
void PNS_INDEX::Replace( PNS_ITEM* aOldItem, PNS_ITEM* aNewItem ) void PNS_INDEX::Replace( PNS_ITEM* aOldItem, PNS_ITEM* aNewItem )
{ {
Remove( aOldItem ); Remove( aOldItem );
Add( aNewItem ); Add( aNewItem );
} }
template<class Visitor> template<class Visitor>
int PNS_INDEX::querySingle( int index, const SHAPE* aShape, int aMinDistance, Visitor& aVisitor ) int PNS_INDEX::querySingle( int index, const SHAPE* aShape, int aMinDistance, Visitor& aVisitor )
{ {
@ -247,7 +242,6 @@ int PNS_INDEX::querySingle( int index, const SHAPE* aShape, int aMinDistance, Vi
return m_subIndices[index]->Query( aShape, aMinDistance, aVisitor, false ); return m_subIndices[index]->Query( aShape, aMinDistance, aVisitor, false );
} }
template<class Visitor> template<class Visitor>
int PNS_INDEX::Query( const PNS_ITEM* aItem, int aMinDistance, Visitor& aVisitor ) int PNS_INDEX::Query( const PNS_ITEM* aItem, int aMinDistance, Visitor& aVisitor )
{ {
@ -281,7 +275,6 @@ int PNS_INDEX::Query( const PNS_ITEM* aItem, int aMinDistance, Visitor& aVisitor
return total; return total;
} }
template<class Visitor> template<class Visitor>
int PNS_INDEX::Query( const SHAPE* aShape, int aMinDistance, Visitor& aVisitor ) int PNS_INDEX::Query( const SHAPE* aShape, int aMinDistance, Visitor& aVisitor )
{ {
@ -293,7 +286,6 @@ int PNS_INDEX::Query( const SHAPE* aShape, int aMinDistance, Visitor& aVisitor )
return total; return total;
} }
void PNS_INDEX::Clear() void PNS_INDEX::Clear()
{ {
for( int i = 0; i < MaxSubIndices; ++i ) for( int i = 0; i < MaxSubIndices; ++i )
@ -307,13 +299,11 @@ void PNS_INDEX::Clear()
} }
} }
PNS_INDEX::~PNS_INDEX() PNS_INDEX::~PNS_INDEX()
{ {
Clear(); Clear();
} }
PNS_INDEX::NET_ITEMS_LIST* PNS_INDEX::GetItemsForNet( int aNet ) PNS_INDEX::NET_ITEMS_LIST* PNS_INDEX::GetItemsForNet( int aNet )
{ {
if( m_netMap.find( aNet ) == m_netMap.end() ) if( m_netMap.find( aNet ) == m_netMap.end() )

View File

@ -29,6 +29,7 @@ PNS_ITEMSET::PNS_ITEMSET( PNS_ITEM* aInitialItem ) :
m_items.push_back( aInitialItem ); m_items.push_back( aInitialItem );
} }
PNS_ITEMSET::~PNS_ITEMSET() PNS_ITEMSET::~PNS_ITEMSET()
{ {
if( m_owner ) if( m_owner )
@ -38,6 +39,7 @@ PNS_ITEMSET::~PNS_ITEMSET()
} }
} }
PNS_ITEMSET& PNS_ITEMSET::FilterLayers( int aStart, int aEnd, bool aInvert ) PNS_ITEMSET& PNS_ITEMSET::FilterLayers( int aStart, int aEnd, bool aInvert )
{ {
ITEMS newItems; ITEMS newItems;
@ -74,6 +76,7 @@ PNS_ITEMSET& PNS_ITEMSET::FilterKinds( int aKindMask, bool aInvert )
return *this; return *this;
} }
PNS_ITEMSET& PNS_ITEMSET::FilterMarker( int aMarker, bool aInvert ) PNS_ITEMSET& PNS_ITEMSET::FilterMarker( int aMarker, bool aInvert )
{ {
ITEMS newItems; ITEMS newItems;
@ -105,6 +108,7 @@ PNS_ITEMSET& PNS_ITEMSET::FilterNet( int aNet, bool aInvert )
return *this; return *this;
} }
PNS_ITEMSET& PNS_ITEMSET::ExcludeItem( const PNS_ITEM* aItem ) PNS_ITEMSET& PNS_ITEMSET::ExcludeItem( const PNS_ITEM* aItem )
{ {
ITEMS newItems; ITEMS newItems;

View File

@ -209,15 +209,11 @@ private:
PNS_ITEMSET m_linkedItems; PNS_ITEMSET m_linkedItems;
}; };
inline bool operator==( PNS_JOINT::HASH_TAG const& aP1, PNS_JOINT::HASH_TAG const& aP2 )
// hash function & comparison operator for boost::unordered_map<>
inline bool operator==( PNS_JOINT::HASH_TAG const& aP1,
PNS_JOINT::HASH_TAG const& aP2 )
{ {
return aP1.pos == aP2.pos && aP1.net == aP2.net; return aP1.pos == aP2.pos && aP1.net == aP2.net;
} }
inline std::size_t hash_value( PNS_JOINT::HASH_TAG const& aP ) inline std::size_t hash_value( PNS_JOINT::HASH_TAG const& aP )
{ {
std::size_t seed = 0; std::size_t seed = 0;

View File

@ -348,7 +348,6 @@ SHAPE_LINE_CHAIN dragCornerInternal( const SHAPE_LINE_CHAIN& aOrigin, const VECT
{ {
optional<SHAPE_LINE_CHAIN> picked; optional<SHAPE_LINE_CHAIN> picked;
int i; int i;
int d = 2; int d = 2;
if( aOrigin.CSegment( -1 ).Length() > 100000 * 30 ) // fixme: constant/parameter? if( aOrigin.CSegment( -1 ).Length() > 100000 * 30 ) // fixme: constant/parameter?
@ -785,6 +784,7 @@ void PNS_LINE::ClearSegmentLinks()
m_segmentRefs = NULL; m_segmentRefs = NULL;
} }
static void extendBox( BOX2I& aBox, bool& aDefined, const VECTOR2I& aP ) static void extendBox( BOX2I& aBox, bool& aDefined, const VECTOR2I& aP )
{ {
if( aDefined ) if( aDefined )
@ -795,12 +795,12 @@ static void extendBox( BOX2I& aBox, bool &aDefined, const VECTOR2I& aP )
} }
} }
OPT_BOX2I PNS_LINE::ChangedArea( const PNS_LINE* aOther ) const OPT_BOX2I PNS_LINE::ChangedArea( const PNS_LINE* aOther ) const
{ {
BOX2I area; BOX2I area;
bool areaDefined = false; bool areaDefined = false;
int i_start = -1; int i_start = -1;
int i_end_self = -1, i_end_other = -1; int i_end_self = -1, i_end_other = -1;
@ -818,11 +818,13 @@ OPT_BOX2I PNS_LINE::ChangedArea ( const PNS_LINE *aOther ) const
{ {
const VECTOR2I p1 = self.CPoint( i ); const VECTOR2I p1 = self.CPoint( i );
const VECTOR2I p2 = other.CPoint( i ); const VECTOR2I p2 = other.CPoint( i );
if( p1 != p2 ) if( p1 != p2 )
{ {
if( i != n - 1 ) if( i != n - 1 )
{ {
SEG s = self.CSegment( i ); SEG s = self.CSegment( i );
if( !s.Contains( p2 ) ) if( !s.Contains( p2 ) )
{ {
i_start = i; i_start = i;
@ -832,15 +834,14 @@ OPT_BOX2I PNS_LINE::ChangedArea ( const PNS_LINE *aOther ) const
i_start = i; i_start = i;
break; break;
} }
} }
} }
for( int i = 0; i < n; i++ ) for( int i = 0; i < n; i++ )
{ {
const VECTOR2I p1 = self.CPoint( np_self - 1 - i ); const VECTOR2I p1 = self.CPoint( np_self - 1 - i );
const VECTOR2I p2 = other.CPoint( np_other - 1 - i ); const VECTOR2I p2 = other.CPoint( np_other - 1 - i );
if( p1 != p2 ) if( p1 != p2 )
{ {
i_end_self = np_self - 1 - i; i_end_self = np_self - 1 - i;

View File

@ -732,9 +732,12 @@ bool PNS_LINE_PLACER::SetLayer( int aLayer )
{ {
m_currentLayer = aLayer; m_currentLayer = aLayer;
return true; return true;
} else if( m_chainedPlacement ) { }
else if( m_chainedPlacement )
{
return false; return false;
} else if( !m_startItem || ( m_startItem->OfKind( PNS_ITEM::VIA ) && m_startItem->Layers().Overlaps( aLayer ) ) ) { }
else if( !m_startItem || ( m_startItem->OfKind( PNS_ITEM::VIA ) && m_startItem->Layers().Overlaps( aLayer ) ) ) {
m_currentLayer = aLayer; m_currentLayer = aLayer;
m_splitSeg = false; m_splitSeg = false;
initPlacement ( m_splitSeg ); initPlacement ( m_splitSeg );
@ -745,6 +748,7 @@ bool PNS_LINE_PLACER::SetLayer( int aLayer )
return false; return false;
} }
bool PNS_LINE_PLACER::Start( const VECTOR2I& aP, PNS_ITEM* aStartItem ) bool PNS_LINE_PLACER::Start( const VECTOR2I& aP, PNS_ITEM* aStartItem )
{ {
VECTOR2I p( aP ); VECTOR2I p( aP );
@ -1017,9 +1021,11 @@ void PNS_LINE_PLACER::updateLeadingRatLine()
Router()->DisplayDebugLine( ratLine, 5, 10000 ); Router()->DisplayDebugLine( ratLine, 5, 10000 );
} }
void PNS_LINE_PLACER::SetOrthoMode( bool aOrthoMode ) void PNS_LINE_PLACER::SetOrthoMode( bool aOrthoMode )
{ {
m_orthoMode = aOrthoMode; m_orthoMode = aOrthoMode;
if( !m_idle ) if( !m_idle )
Move( m_currentEnd, NULL ); Move( m_currentEnd, NULL );
} }
@ -1042,6 +1048,7 @@ const SHAPE_LINE_CHAIN PNS_LINE_PLACER::buildInitialLine ( const VECTOR2I& aP )
return l; return l;
} }
void PNS_LINE_PLACER::GetModifiedNets( std::vector<int>& aNets ) const void PNS_LINE_PLACER::GetModifiedNets( std::vector<int>& aNets ) const
{ {
aNets.push_back( m_currentNet ); aNets.push_back( m_currentNet );

View File

@ -40,7 +40,6 @@ class PNS_VIA;
class PNS_SIZES_SETTINGS; class PNS_SIZES_SETTINGS;
/** /**
* Class PNS_LINE_PLACER * Class PNS_LINE_PLACER
* *
@ -96,7 +95,6 @@ public:
*/ */
bool SetLayer( int aLayer ); bool SetLayer( int aLayer );
/** /**
* Function Head() * Function Head()
* *
@ -348,6 +346,7 @@ private:
bool rhMarkObstacles( const VECTOR2I& aP, PNS_LINE& aNewHead ); bool rhMarkObstacles( const VECTOR2I& aP, PNS_LINE& aNewHead );
const PNS_VIA makeVia ( const VECTOR2I& aP ); const PNS_VIA makeVia ( const VECTOR2I& aP );
const SHAPE_LINE_CHAIN buildInitialLine( const VECTOR2I& aP ); const SHAPE_LINE_CHAIN buildInitialLine( const VECTOR2I& aP );
///> current routing direction ///> current routing direction

View File

@ -178,6 +178,7 @@ void PNS_LOGGER::dumpShape( const SHAPE* aSh )
} }
} }
void PNS_LOGGER::Save( const std::string& aFilename ) void PNS_LOGGER::Save( const std::string& aFilename )
{ {
EndGroup(); EndGroup();

View File

@ -75,7 +75,6 @@ void PNS_MEANDERED_LINE::MeanderSegment( const SEG &aBase, int aBaseIndex )
if( remaining > 3.0 * thr ) if( remaining > 3.0 * thr )
{ {
if( !turning ) if( !turning )
{ {
for( int i = 0; i < 2; i++ ) for( int i = 0; i < 2; i++ )
@ -106,7 +105,6 @@ void PNS_MEANDERED_LINE::MeanderSegment( const SEG &aBase, int aBaseIndex )
} }
} }
} }
} else { } else {
bool rv = m->Fit( MT_CHECK_FINISH, aBase, m_last, side ); bool rv = m->Fit( MT_CHECK_FINISH, aBase, m_last, side );
@ -124,7 +122,6 @@ void PNS_MEANDERED_LINE::MeanderSegment( const SEG &aBase, int aBaseIndex )
side = !side; side = !side;
} }
} else if( started ) } else if( started )
{ {
bool rv = m->Fit( MT_FINISH, aBase, m_last, side ); bool rv = m->Fit( MT_FINISH, aBase, m_last, side );
@ -142,7 +139,6 @@ void PNS_MEANDERED_LINE::MeanderSegment( const SEG &aBase, int aBaseIndex )
if( remaining < Settings( ).m_step ) if( remaining < Settings( ).m_step )
break; break;
if( fail ) if( fail )
{ {
PNS_MEANDER_SHAPE tmp( m_placer, m_width, m_dual ); PNS_MEANDER_SHAPE tmp( m_placer, m_width, m_dual );
@ -174,6 +170,7 @@ int PNS_MEANDER_SHAPE::cornerRadius( ) const
return cr; return cr;
} }
int PNS_MEANDER_SHAPE::spacing( ) const int PNS_MEANDER_SHAPE::spacing( ) const
{ {
if ( !m_dual ) if ( !m_dual )
@ -186,7 +183,7 @@ int PNS_MEANDER_SHAPE::spacing( ) const
} }
SHAPE_LINE_CHAIN PNS_MEANDER_SHAPE::circleQuad( VECTOR2D aP, VECTOR2D aDir, bool side ) SHAPE_LINE_CHAIN PNS_MEANDER_SHAPE::circleQuad( VECTOR2D aP, VECTOR2D aDir, bool aSide )
{ {
SHAPE_LINE_CHAIN lc; SHAPE_LINE_CHAIN lc;
@ -205,12 +202,14 @@ SHAPE_LINE_CHAIN PNS_MEANDER_SHAPE::circleQuad( VECTOR2D aP, VECTOR2D aDir, bool
{ {
VECTOR2D p; VECTOR2D p;
double alpha = (double) i / (double) ( ArcSegments - 1 ) * M_PI / 2.0; double alpha = (double) i / (double) ( ArcSegments - 1 ) * M_PI / 2.0;
p = aP + dir_u * cos( alpha ) + dir_v * ( side ? -1.0 : 1.0 ) * ( 1.0 - sin( alpha ) ); p = aP + dir_u * cos( alpha ) + dir_v * ( aSide ? -1.0 : 1.0 ) * ( 1.0 - sin( alpha ) );
lc.Append( ( int ) p.x, ( int ) p.y ); lc.Append( ( int ) p.x, ( int ) p.y );
} }
return lc; return lc;
} }
VECTOR2I PNS_MEANDER_SHAPE::reflect( VECTOR2I p, const SEG& line ) VECTOR2I PNS_MEANDER_SHAPE::reflect( VECTOR2I p, const SEG& line )
{ {
typedef int64_t ecoord; typedef int64_t ecoord;
@ -229,6 +228,7 @@ VECTOR2I PNS_MEANDER_SHAPE::reflect( VECTOR2I p, const SEG& line )
return 2 * c - p; return 2 * c - p;
} }
void PNS_MEANDER_SHAPE::start( SHAPE_LINE_CHAIN* aTarget, const VECTOR2D& aWhere, const VECTOR2D& aDir ) void PNS_MEANDER_SHAPE::start( SHAPE_LINE_CHAIN* aTarget, const VECTOR2D& aWhere, const VECTOR2D& aDir )
{ {
m_currentTarget = aTarget; m_currentTarget = aTarget;
@ -238,17 +238,20 @@ void PNS_MEANDER_SHAPE::start( SHAPE_LINE_CHAIN* aTarget, const VECTOR2D& aWhere
m_currentPos = aWhere; m_currentPos = aWhere;
} }
void PNS_MEANDER_SHAPE::forward( int aLength ) void PNS_MEANDER_SHAPE::forward( int aLength )
{ {
m_currentPos += m_currentDir.Resize( aLength ); m_currentPos += m_currentDir.Resize( aLength );
m_currentTarget->Append( m_currentPos ); m_currentTarget->Append( m_currentPos );
} }
void PNS_MEANDER_SHAPE::turn( int aAngle ) void PNS_MEANDER_SHAPE::turn( int aAngle )
{ {
m_currentDir = m_currentDir.Rotate( (double) aAngle * M_PI / 180.0 ); m_currentDir = m_currentDir.Rotate( (double) aAngle * M_PI / 180.0 );
} }
void PNS_MEANDER_SHAPE::arc( int aRadius, bool aSide ) void PNS_MEANDER_SHAPE::arc( int aRadius, bool aSide )
{ {
if( aRadius <= 0 ) if( aRadius <= 0 )
@ -265,6 +268,7 @@ void PNS_MEANDER_SHAPE::arc( int aRadius, bool aSide )
m_currentTarget->Append ( arc ); m_currentTarget->Append ( arc );
} }
void PNS_MEANDER_SHAPE::uShape( int aSides, int aCorner, int aTop ) void PNS_MEANDER_SHAPE::uShape( int aSides, int aCorner, int aTop )
{ {
forward( aSides ); forward( aSides );
@ -274,7 +278,9 @@ void PNS_MEANDER_SHAPE::uShape ( int aSides, int aCorner, int aTop )
forward( aSides ); forward( aSides );
} }
SHAPE_LINE_CHAIN PNS_MEANDER_SHAPE::genMeanderShape ( VECTOR2D aP, VECTOR2D aDir, bool aSide, PNS_MEANDER_TYPE aType, int aAmpl, int aBaselineOffset )
SHAPE_LINE_CHAIN PNS_MEANDER_SHAPE::genMeanderShape( VECTOR2D aP, VECTOR2D aDir,
bool aSide, PNS_MEANDER_TYPE aType, int aAmpl, int aBaselineOffset )
{ {
const PNS_MEANDER_SETTINGS& st = Settings(); const PNS_MEANDER_SETTINGS& st = Settings();
int cr = cornerRadius(); int cr = cornerRadius();
@ -297,7 +303,6 @@ SHAPE_LINE_CHAIN PNS_MEANDER_SHAPE::genMeanderShape ( VECTOR2D aP, VECTOR2D aDir
cr = spc / 2; cr = spc / 2;
} }
SHAPE_LINE_CHAIN lc; SHAPE_LINE_CHAIN lc;
start( &lc, aP + dir_v_b, aDir ); start( &lc, aP + dir_v_b, aDir );
@ -332,13 +337,11 @@ SHAPE_LINE_CHAIN PNS_MEANDER_SHAPE::genMeanderShape ( VECTOR2D aP, VECTOR2D aDir
case MT_TURN: case MT_TURN:
{ {
start( &lc, aP - dir_u_b, aDir ); start( &lc, aP - dir_u_b, aDir );
turn( 90 ); turn( 90 );
forward( std::abs( offset ) ); forward( std::abs( offset ) );
uShape ( aAmpl - cr, cr + offset, spc - 2 * cr ); uShape ( aAmpl - cr, cr + offset, spc - 2 * cr );
forward( std::abs( offset ) ); forward( std::abs( offset ) );
break; break;
} }
@ -358,6 +361,7 @@ SHAPE_LINE_CHAIN PNS_MEANDER_SHAPE::genMeanderShape ( VECTOR2D aP, VECTOR2D aDir
if( aSide ) if( aSide )
{ {
SEG axis ( aP, aP + aDir ); SEG axis ( aP, aP + aDir );
for( int i = 0; i < lc.PointCount(); i++ ) for( int i = 0; i < lc.PointCount(); i++ )
lc.Point( i ) = reflect( lc.CPoint( i ), axis ); lc.Point( i ) = reflect( lc.CPoint( i ), axis );
} }
@ -365,6 +369,7 @@ SHAPE_LINE_CHAIN PNS_MEANDER_SHAPE::genMeanderShape ( VECTOR2D aP, VECTOR2D aDir
return lc; return lc;
} }
bool PNS_MEANDERED_LINE::CheckSelfIntersections( PNS_MEANDER_SHAPE* aShape, int aClearance ) bool PNS_MEANDERED_LINE::CheckSelfIntersections( PNS_MEANDER_SHAPE* aShape, int aClearance )
{ {
for( int i = m_meanders.size() - 1; i >= 0; i-- ) for( int i = m_meanders.size() - 1; i >= 0; i-- )
@ -390,6 +395,7 @@ bool PNS_MEANDERED_LINE::CheckSelfIntersections ( PNS_MEANDER_SHAPE *aShape, int
return true; return true;
} }
bool PNS_MEANDER_SHAPE::Fit( PNS_MEANDER_TYPE aType, const SEG& aSeg, const VECTOR2I& aP, bool aSide ) bool PNS_MEANDER_SHAPE::Fit( PNS_MEANDER_TYPE aType, const SEG& aSeg, const VECTOR2I& aP, bool aSide )
{ {
const PNS_MEANDER_SETTINGS& st = Settings(); const PNS_MEANDER_SETTINGS& st = Settings();
@ -402,7 +408,9 @@ bool PNS_MEANDER_SHAPE::Fit ( PNS_MEANDER_TYPE aType, const SEG& aSeg, const VEC
prim1 = MT_START; prim1 = MT_START;
prim2 = MT_TURN; prim2 = MT_TURN;
checkMode = true; checkMode = true;
} else if (aType == MT_CHECK_FINISH ) { }
else if( aType == MT_CHECK_FINISH )
{
prim1 = MT_TURN; prim1 = MT_TURN;
prim2 = MT_FINISH; prim2 = MT_FINISH;
checkMode = true; checkMode = true;
@ -439,7 +447,6 @@ bool PNS_MEANDER_SHAPE::Fit ( PNS_MEANDER_TYPE aType, const SEG& aSeg, const VEC
return true; return true;
} else } else
return false; return false;
} }
int minAmpl = st.m_minAmplitude; int minAmpl = st.m_minAmplitude;
@ -457,7 +464,9 @@ bool PNS_MEANDER_SHAPE::Fit ( PNS_MEANDER_TYPE aType, const SEG& aSeg, const VEC
{ {
m_shapes[0] = genMeanderShape( aP, aSeg.B - aSeg.A, aSide, aType, ampl, m_baselineOffset ); m_shapes[0] = genMeanderShape( aP, aSeg.B - aSeg.A, aSide, aType, ampl, m_baselineOffset );
m_shapes[1] = genMeanderShape( aP, aSeg.B - aSeg.A, aSide, aType, ampl, -m_baselineOffset ); m_shapes[1] = genMeanderShape( aP, aSeg.B - aSeg.A, aSide, aType, ampl, -m_baselineOffset );
} else { }
else
{
m_shapes[0] = genMeanderShape( aP, aSeg.B - aSeg.A, aSide, aType, ampl, 0 ); m_shapes[0] = genMeanderShape( aP, aSeg.B - aSeg.A, aSide, aType, ampl, 0 );
} }
@ -476,18 +485,18 @@ bool PNS_MEANDER_SHAPE::Fit ( PNS_MEANDER_TYPE aType, const SEG& aSeg, const VEC
return false; return false;
} }
void PNS_MEANDER_SHAPE::Recalculate() void PNS_MEANDER_SHAPE::Recalculate()
{ {
m_shapes[0] = genMeanderShape( m_p0, m_baseSeg.B - m_baseSeg.A, m_side, m_type, m_amplitude, m_dual ? m_baselineOffset : 0 ); m_shapes[0] = genMeanderShape( m_p0, m_baseSeg.B - m_baseSeg.A, m_side, m_type, m_amplitude, m_dual ? m_baselineOffset : 0 );
if( m_dual ) if( m_dual )
m_shapes[1] = genMeanderShape( m_p0, m_baseSeg.B - m_baseSeg.A, m_side, m_type, m_amplitude, -m_baselineOffset ); m_shapes[1] = genMeanderShape( m_p0, m_baseSeg.B - m_baseSeg.A, m_side, m_type, m_amplitude, -m_baselineOffset );
updateBaseSegment(); updateBaseSegment();
} }
void PNS_MEANDER_SHAPE::Resize( int aAmpl ) void PNS_MEANDER_SHAPE::Resize( int aAmpl )
{ {
if( aAmpl < 0 ) if( aAmpl < 0 )
@ -498,6 +507,7 @@ void PNS_MEANDER_SHAPE::Resize ( int aAmpl )
Recalculate(); Recalculate();
} }
void PNS_MEANDER_SHAPE::MakeEmpty() void PNS_MEANDER_SHAPE::MakeEmpty()
{ {
updateBaseSegment(); updateBaseSegment();
@ -510,8 +520,6 @@ void PNS_MEANDER_SHAPE::MakeEmpty()
if( m_dual ) if( m_dual )
m_shapes[1] = genMeanderShape( m_p0, dir, m_side, m_type, 0, -m_baselineOffset ); m_shapes[1] = genMeanderShape( m_p0, dir, m_side, m_type, 0, -m_baselineOffset );
} }
@ -525,6 +533,7 @@ void PNS_MEANDERED_LINE::AddCorner ( const VECTOR2I& aA, const VECTOR2I& aB )
m_meanders.push_back( m ); m_meanders.push_back( m );
} }
void PNS_MEANDER_SHAPE::MakeCorner( VECTOR2I aP1, VECTOR2I aP2 ) void PNS_MEANDER_SHAPE::MakeCorner( VECTOR2I aP1, VECTOR2I aP2 )
{ {
SetType( MT_CORNER ); SetType( MT_CORNER );
@ -534,9 +543,9 @@ void PNS_MEANDER_SHAPE::MakeCorner ( VECTOR2I aP1, VECTOR2I aP2 )
m_shapes[1].Append( aP2 ); m_shapes[1].Append( aP2 );
m_clippedBaseSeg.A = aP1; m_clippedBaseSeg.A = aP1;
m_clippedBaseSeg.B = aP1; m_clippedBaseSeg.B = aP1;
} }
void PNS_MEANDERED_LINE::AddMeander( PNS_MEANDER_SHAPE* aShape ) void PNS_MEANDERED_LINE::AddMeander( PNS_MEANDER_SHAPE* aShape )
{ {
m_last = aShape->BaseSegment().B; m_last = aShape->BaseSegment().B;
@ -554,16 +563,19 @@ void PNS_MEANDERED_LINE::Clear( )
m_meanders.clear( ); m_meanders.clear( );
} }
int PNS_MEANDER_SHAPE::BaselineLength() const int PNS_MEANDER_SHAPE::BaselineLength() const
{ {
return m_clippedBaseSeg.Length(); return m_clippedBaseSeg.Length();
} }
int PNS_MEANDER_SHAPE::MaxTunableLength() const int PNS_MEANDER_SHAPE::MaxTunableLength() const
{ {
return CLine( 0 ).Length(); return CLine( 0 ).Length();
} }
void PNS_MEANDER_SHAPE::updateBaseSegment( ) void PNS_MEANDER_SHAPE::updateBaseSegment( )
{ {
if( m_dual ) if( m_dual )
@ -573,7 +585,9 @@ void PNS_MEANDER_SHAPE::updateBaseSegment( )
m_clippedBaseSeg.A = m_baseSeg.LineProject( midpA ); m_clippedBaseSeg.A = m_baseSeg.LineProject( midpA );
m_clippedBaseSeg.B = m_baseSeg.LineProject( midpB ); m_clippedBaseSeg.B = m_baseSeg.LineProject( midpB );
} else { }
else
{
m_clippedBaseSeg.A = m_baseSeg.LineProject( CLine( 0 ).CPoint( 0 ) ); m_clippedBaseSeg.A = m_baseSeg.LineProject( CLine( 0 ).CPoint( 0 ) );
m_clippedBaseSeg.B = m_baseSeg.LineProject( CLine( 0 ).CPoint( -1 ) ); m_clippedBaseSeg.B = m_baseSeg.LineProject( CLine( 0 ).CPoint( -1 ) );
} }

View File

@ -65,7 +65,7 @@ public:
m_targetSkew = 0; m_targetSkew = 0;
m_cornerType = ROUND; m_cornerType = ROUND;
m_cornerRadiusPercentage = 100; m_cornerRadiusPercentage = 100;
m_lengthTollerance = 100000; m_lengthTolerance = 100000;
m_cornerArcSegments = 8; m_cornerArcSegments = 8;
} }
@ -84,7 +84,7 @@ public:
///> rounding percentage (0 - 100) ///> rounding percentage (0 - 100)
int m_cornerRadiusPercentage; int m_cornerRadiusPercentage;
///> allowable tuning error ///> allowable tuning error
int m_lengthTollerance; int m_lengthTolerance;
///> number of line segments for arc approximation ///> number of line segments for arc approximation
int m_cornerArcSegments; int m_cornerArcSegments;
///> target skew value for diff pair de-skewing ///> target skew value for diff pair de-skewing
@ -101,7 +101,6 @@ class PNS_MEANDERED_LINE;
class PNS_MEANDER_SHAPE class PNS_MEANDER_SHAPE
{ {
public: public:
/** /**
* Constructor * Constructor
* *
@ -116,7 +115,6 @@ class PNS_MEANDER_SHAPE
m_width( aWidth ), m_width( aWidth ),
m_baselineOffset( 0 ) m_baselineOffset( 0 )
{ {
} }
/** /**
@ -271,7 +269,7 @@ class PNS_MEANDER_SHAPE
* Function BaselineLength() * Function BaselineLength()
* *
* @return length of the base segment for the meander (i.e. * @return length of the base segment for the meander (i.e.
* the minimim tuned length. * the minimum tuned length.
*/ */
int BaselineLength() const; int BaselineLength() const;
@ -326,10 +324,10 @@ class PNS_MEANDER_SHAPE
void uShape( int aSides, int aCorner, int aTop ); void uShape( int aSides, int aCorner, int aTop );
///> generates a 90-degree circular arc ///> generates a 90-degree circular arc
SHAPE_LINE_CHAIN circleQuad ( VECTOR2D aP, VECTOR2D aDir, bool side ); SHAPE_LINE_CHAIN circleQuad( VECTOR2D aP, VECTOR2D aDir, bool aSide );
///> reflects a point onto other side of a given segment ///> reflects a point onto other side of a given segment
VECTOR2I reflect ( VECTOR2I p, const SEG& line ); VECTOR2I reflect( VECTOR2I aP, const SEG& aLine );
///> produces a meander shape of given type ///> produces a meander shape of given type
SHAPE_LINE_CHAIN genMeanderShape( VECTOR2D aP, VECTOR2D aDir, bool aSide, PNS_MEANDER_TYPE aType, int aAmpl, int aBaselineOffset = 0 ); SHAPE_LINE_CHAIN genMeanderShape( VECTOR2D aP, VECTOR2D aDir, bool aSide, PNS_MEANDER_TYPE aType, int aAmpl, int aBaselineOffset = 0 );
@ -387,7 +385,6 @@ class PNS_MEANDERED_LINE
public: public:
PNS_MEANDERED_LINE() PNS_MEANDERED_LINE()
{ {
} }
/** /**
@ -400,7 +397,6 @@ class PNS_MEANDERED_LINE
m_placer( aPlacer ), m_placer( aPlacer ),
m_dual( aIsDual ) m_dual( aIsDual )
{ {
} }
/** /**
@ -464,7 +460,6 @@ class PNS_MEANDERED_LINE
return m_meanders; return m_meanders;
} }
/** /**
* Function CheckSelfIntersections() * Function CheckSelfIntersections()
* *
@ -484,7 +479,6 @@ class PNS_MEANDERED_LINE
const PNS_MEANDER_SETTINGS& Settings() const; const PNS_MEANDER_SETTINGS& Settings() const;
private: private:
VECTOR2I m_last; VECTOR2I m_last;
PNS_MEANDER_PLACER_BASE* m_placer; PNS_MEANDER_PLACER_BASE* m_placer;

View File

@ -43,9 +43,9 @@ PNS_MEANDER_PLACER::PNS_MEANDER_PLACER( PNS_ROUTER* aRouter ) :
PNS_MEANDER_PLACER::~PNS_MEANDER_PLACER() PNS_MEANDER_PLACER::~PNS_MEANDER_PLACER()
{ {
} }
PNS_NODE* PNS_MEANDER_PLACER::CurrentNode( bool aLoopsRemoved ) const PNS_NODE* PNS_MEANDER_PLACER::CurrentNode( bool aLoopsRemoved ) const
{ {
if( !m_currentNode ) if( !m_currentNode )
@ -54,6 +54,7 @@ PNS_NODE* PNS_MEANDER_PLACER::CurrentNode( bool aLoopsRemoved ) const
return m_currentNode; return m_currentNode;
} }
bool PNS_MEANDER_PLACER::Start( const VECTOR2I& aP, PNS_ITEM* aStartItem ) bool PNS_MEANDER_PLACER::Start( const VECTOR2I& aP, PNS_ITEM* aStartItem )
{ {
VECTOR2I p; VECTOR2I p;
@ -101,11 +102,13 @@ int PNS_MEANDER_PLACER::origPathLength( ) const
return total; return total;
} }
bool PNS_MEANDER_PLACER::Move( const VECTOR2I& aP, PNS_ITEM* aEndItem ) bool PNS_MEANDER_PLACER::Move( const VECTOR2I& aP, PNS_ITEM* aEndItem )
{ {
return doMove( aP, aEndItem, m_settings.m_targetLength ); return doMove( aP, aEndItem, m_settings.m_targetLength );
} }
bool PNS_MEANDER_PLACER::doMove( const VECTOR2I& aP, PNS_ITEM* aEndItem, int aTargetLength ) bool PNS_MEANDER_PLACER::doMove( const VECTOR2I& aP, PNS_ITEM* aEndItem, int aTargetLength )
{ {
SHAPE_LINE_CHAIN pre, tuned, post; SHAPE_LINE_CHAIN pre, tuned, post;
@ -134,7 +137,7 @@ bool PNS_MEANDER_PLACER::doMove( const VECTOR2I& aP, PNS_ITEM* aEndItem, int aTa
m_lastLength = lineLen; m_lastLength = lineLen;
m_lastStatus = TUNED; m_lastStatus = TUNED;
if( compareWithTollerance ( lineLen, aTargetLength, m_settings.m_lengthTollerance ) > 0 ) if( compareWithTolerance( lineLen, aTargetLength, m_settings.m_lengthTolerance ) > 0 )
{ {
m_lastStatus = TOO_LONG; m_lastStatus = TOO_LONG;
} else { } else {
@ -164,7 +167,7 @@ bool PNS_MEANDER_PLACER::doMove( const VECTOR2I& aP, PNS_ITEM* aEndItem, int aTa
m_lastLength += tuned.Length(); m_lastLength += tuned.Length();
int comp = compareWithTollerance( m_lastLength - aTargetLength, 0, m_settings.m_lengthTollerance ); int comp = compareWithTolerance( m_lastLength - aTargetLength, 0, m_settings.m_lengthTolerance );
if( comp > 0 ) if( comp > 0 )
m_lastStatus = TOO_LONG; m_lastStatus = TOO_LONG;
@ -172,7 +175,6 @@ bool PNS_MEANDER_PLACER::doMove( const VECTOR2I& aP, PNS_ITEM* aEndItem, int aTa
m_lastStatus = TOO_SHORT; m_lastStatus = TOO_SHORT;
else else
m_lastStatus = TUNED; m_lastStatus = TUNED;
} }
m_finalShape.Clear(); m_finalShape.Clear();
@ -194,6 +196,7 @@ bool PNS_MEANDER_PLACER::FixRoute( const VECTOR2I& aP, PNS_ITEM* aEndItem )
return true; return true;
} }
bool PNS_MEANDER_PLACER::CheckFit( PNS_MEANDER_SHAPE* aShape ) bool PNS_MEANDER_PLACER::CheckFit( PNS_MEANDER_SHAPE* aShape )
{ {
PNS_LINE l( *m_originLine, aShape->CLine( 0 ) ); PNS_LINE l( *m_originLine, aShape->CLine( 0 ) );
@ -214,16 +217,19 @@ const PNS_ITEMSET PNS_MEANDER_PLACER::Traces()
return PNS_ITEMSET( &m_currentTrace ); return PNS_ITEMSET( &m_currentTrace );
} }
const VECTOR2I& PNS_MEANDER_PLACER::CurrentEnd() const const VECTOR2I& PNS_MEANDER_PLACER::CurrentEnd() const
{ {
return m_currentEnd; return m_currentEnd;
} }
int PNS_MEANDER_PLACER::CurrentNet() const int PNS_MEANDER_PLACER::CurrentNet() const
{ {
return m_initialSegment->Net(); return m_initialSegment->Net();
} }
int PNS_MEANDER_PLACER::CurrentLayer() const int PNS_MEANDER_PLACER::CurrentLayer() const
{ {
return m_initialSegment->Layers().Start(); return m_initialSegment->Layers().Start();
@ -256,6 +262,7 @@ const wxString PNS_MEANDER_PLACER::TuningInfo( ) const
return status; return status;
} }
PNS_MEANDER_PLACER::TUNING_STATUS PNS_MEANDER_PLACER::TuningStatus() const PNS_MEANDER_PLACER::TUNING_STATUS PNS_MEANDER_PLACER::TuningStatus() const
{ {
return m_lastStatus; return m_lastStatus;

View File

@ -25,13 +25,13 @@
PNS_MEANDER_PLACER_BASE::PNS_MEANDER_PLACER_BASE( PNS_ROUTER* aRouter ) : PNS_MEANDER_PLACER_BASE::PNS_MEANDER_PLACER_BASE( PNS_ROUTER* aRouter ) :
PNS_PLACEMENT_ALGO( aRouter ) PNS_PLACEMENT_ALGO( aRouter )
{ {
}
};
PNS_MEANDER_PLACER_BASE::~PNS_MEANDER_PLACER_BASE() PNS_MEANDER_PLACER_BASE::~PNS_MEANDER_PLACER_BASE()
{ {
}
};
void PNS_MEANDER_PLACER_BASE::AmplitudeStep( int aSign ) void PNS_MEANDER_PLACER_BASE::AmplitudeStep( int aSign )
{ {
@ -41,6 +41,7 @@ void PNS_MEANDER_PLACER_BASE::AmplitudeStep( int aSign )
m_settings.m_maxAmplitude = a; m_settings.m_maxAmplitude = a;
} }
void PNS_MEANDER_PLACER_BASE::SpacingStep( int aSign ) void PNS_MEANDER_PLACER_BASE::SpacingStep( int aSign )
{ {
int s = m_settings.m_spacing + aSign * m_settings.m_step; int s = m_settings.m_spacing + aSign * m_settings.m_step;
@ -49,11 +50,13 @@ void PNS_MEANDER_PLACER_BASE::SpacingStep( int aSign )
m_settings.m_spacing = s; m_settings.m_spacing = s;
} }
void PNS_MEANDER_PLACER_BASE::UpdateSettings( const PNS_MEANDER_SETTINGS& aSettings ) void PNS_MEANDER_PLACER_BASE::UpdateSettings( const PNS_MEANDER_SETTINGS& aSettings )
{ {
m_settings = aSettings; m_settings = aSettings;
} }
void PNS_MEANDER_PLACER_BASE::cutTunedLine( const SHAPE_LINE_CHAIN& aOrigin, void PNS_MEANDER_PLACER_BASE::cutTunedLine( const SHAPE_LINE_CHAIN& aOrigin,
const VECTOR2I& aTuneStart, const VECTOR2I& aTuneStart,
const VECTOR2I& aCursorPos, const VECTOR2I& aCursorPos,
@ -84,6 +87,7 @@ void PNS_MEANDER_PLACER_BASE::cutTunedLine( const SHAPE_LINE_CHAIN& aOrigin,
aTuned.Simplify(); aTuned.Simplify();
} }
void PNS_MEANDER_PLACER_BASE::tuneLineLength( PNS_MEANDERED_LINE& aTuned, int aElongation ) void PNS_MEANDER_PLACER_BASE::tuneLineLength( PNS_MEANDERED_LINE& aTuned, int aElongation )
{ {
int remaining = aElongation; int remaining = aElongation;
@ -147,20 +151,21 @@ void PNS_MEANDER_PLACER_BASE::tuneLineLength( PNS_MEANDERED_LINE& aTuned, int aE
m->Resize( std::max( m->Amplitude() - balance / 2, m_settings.m_minAmplitude ) ); m->Resize( std::max( m->Amplitude() - balance / 2, m_settings.m_minAmplitude ) );
} }
} }
}
}
}
}
const PNS_MEANDER_SETTINGS& PNS_MEANDER_PLACER_BASE::MeanderSettings() const const PNS_MEANDER_SETTINGS& PNS_MEANDER_PLACER_BASE::MeanderSettings() const
{ {
return m_settings; return m_settings;
} }
int PNS_MEANDER_PLACER_BASE::compareWithTollerance ( int aValue, int aExpected, int aTollerance ) const
int PNS_MEANDER_PLACER_BASE::compareWithTolerance( int aValue, int aExpected, int aTolerance ) const
{ {
if( aValue < aExpected - aTollerance ) if( aValue < aExpected - aTolerance )
return -1; return -1;
else if( aValue > aExpected + aTollerance ) else if( aValue > aExpected + aTolerance )
return 1; return 1;
else else
return 0; return 0;

View File

@ -118,8 +118,6 @@ public:
return false; return false;
} }
protected: protected:
/** /**
@ -150,11 +148,11 @@ protected:
void tuneLineLength( PNS_MEANDERED_LINE& aTuned, int aElongation ); void tuneLineLength( PNS_MEANDERED_LINE& aTuned, int aElongation );
/** /**
* Function compareWithTollerance() * Function compareWithTolerance()
* *
* Compares aValue against aExpected with given tollerance. * Compares aValue against aExpected with given tolerance.
*/ */
int compareWithTollerance ( int aValue, int aExpected, int aTollerance = 0 ) const; int compareWithTolerance ( int aValue, int aExpected, int aTolerance = 0 ) const;
///> width of the meandered trace(s) ///> width of the meandered trace(s)
int m_currentWidth; int m_currentWidth;

View File

@ -38,11 +38,12 @@ PNS_MEANDER_SKEW_PLACER::PNS_MEANDER_SKEW_PLACER ( PNS_ROUTER* aRouter ) :
{ {
} }
PNS_MEANDER_SKEW_PLACER::~PNS_MEANDER_SKEW_PLACER( ) PNS_MEANDER_SKEW_PLACER::~PNS_MEANDER_SKEW_PLACER( )
{ {
} }
bool PNS_MEANDER_SKEW_PLACER::Start( const VECTOR2I& aP, PNS_ITEM* aStartItem ) bool PNS_MEANDER_SKEW_PLACER::Start( const VECTOR2I& aP, PNS_ITEM* aStartItem )
{ {
VECTOR2I p; VECTOR2I p;
@ -75,7 +76,6 @@ bool PNS_MEANDER_SKEW_PLACER::Start( const VECTOR2I& aP, PNS_ITEM* aStartItem )
return false; return false;
} }
m_originPair.SetGap ( Router()->Sizes().DiffPairGap() ); m_originPair.SetGap ( Router()->Sizes().DiffPairGap() );
if( !m_originPair.PLine().SegmentCount() || if( !m_originPair.PLine().SegmentCount() ||
@ -104,6 +104,7 @@ int PNS_MEANDER_SKEW_PLACER::origPathLength( ) const
return itemsetLength ( m_tunedPath ); return itemsetLength ( m_tunedPath );
} }
int PNS_MEANDER_SKEW_PLACER::itemsetLength( const PNS_ITEMSET& aSet ) const int PNS_MEANDER_SKEW_PLACER::itemsetLength( const PNS_ITEMSET& aSet ) const
{ {
int total = 0; int total = 0;
@ -118,11 +119,13 @@ int PNS_MEANDER_SKEW_PLACER::itemsetLength( const PNS_ITEMSET& aSet ) const
return total; return total;
} }
int PNS_MEANDER_SKEW_PLACER::currentSkew() const int PNS_MEANDER_SKEW_PLACER::currentSkew() const
{ {
return m_lastLength - m_coupledLength; return m_lastLength - m_coupledLength;
} }
bool PNS_MEANDER_SKEW_PLACER::Move( const VECTOR2I& aP, PNS_ITEM* aEndItem ) bool PNS_MEANDER_SKEW_PLACER::Move( const VECTOR2I& aP, PNS_ITEM* aEndItem )
{ {
return doMove( aP, aEndItem, m_coupledLength + m_settings.m_targetSkew ); return doMove( aP, aEndItem, m_coupledLength + m_settings.m_targetSkew );

View File

@ -37,7 +37,6 @@ class PNS_ROUTER_BASE;
class PNS_MEANDER_SKEW_PLACER : public PNS_MEANDER_PLACER class PNS_MEANDER_SKEW_PLACER : public PNS_MEANDER_PLACER
{ {
public: public:
PNS_MEANDER_SKEW_PLACER( PNS_ROUTER* aRouter ); PNS_MEANDER_SKEW_PLACER( PNS_ROUTER* aRouter );
~PNS_MEANDER_SKEW_PLACER(); ~PNS_MEANDER_SKEW_PLACER();

View File

@ -723,6 +723,7 @@ void PNS_NODE::Remove( PNS_ITEM* aItem )
} }
} }
void PNS_NODE::Remove( PNS_LINE& aLine ) void PNS_NODE::Remove( PNS_LINE& aLine )
{ {
removeLine( &aLine ); removeLine( &aLine );
@ -865,8 +866,6 @@ void PNS_NODE::MapConnectivity ( PNS_JOINT* aStart, std::vector<PNS_JOINT*>& aFo
#endif #endif
int PNS_NODE::FindLinesBetweenJoints( PNS_JOINT& aA, PNS_JOINT& aB, std::vector<PNS_LINE*>& aLines ) int PNS_NODE::FindLinesBetweenJoints( PNS_JOINT& aA, PNS_JOINT& aB, std::vector<PNS_LINE*>& aLines )
{ {
BOOST_FOREACH( PNS_ITEM* item, aA.LinkList() ) BOOST_FOREACH( PNS_ITEM* item, aA.LinkList() )

View File

@ -55,7 +55,6 @@ public:
virtual ~PNS_CLEARANCE_FUNC() {} virtual ~PNS_CLEARANCE_FUNC() {}
virtual int operator()( const PNS_ITEM* aA, const PNS_ITEM* aB ) = 0; virtual int operator()( const PNS_ITEM* aA, const PNS_ITEM* aB ) = 0;
virtual void OverrideClearance (bool aEnable, int aNetA = 0, int aNetB = 0, int aClearance = 0) = 0; virtual void OverrideClearance (bool aEnable, int aNetA = 0, int aNetB = 0, int aClearance = 0) = 0;
}; };
class PNS_PCBNEW_CLEARANCE_FUNC : public PNS_CLEARANCE_FUNC class PNS_PCBNEW_CLEARANCE_FUNC : public PNS_CLEARANCE_FUNC

View File

@ -101,14 +101,14 @@ void PNS_COST_ESTIMATOR::Replace( PNS_LINE& aOldLine, PNS_LINE& aNewLine )
bool PNS_COST_ESTIMATOR::IsBetter( PNS_COST_ESTIMATOR& aOther, bool PNS_COST_ESTIMATOR::IsBetter( PNS_COST_ESTIMATOR& aOther,
double aLengthTollerance, double aLengthTolerance,
double aCornerTollerance ) const double aCornerTolerance ) const
{ {
if( aOther.m_cornerCost < m_cornerCost && aOther.m_lengthCost < m_lengthCost ) if( aOther.m_cornerCost < m_cornerCost && aOther.m_lengthCost < m_lengthCost )
return true; return true;
else if( aOther.m_cornerCost < m_cornerCost * aCornerTollerance && else if( aOther.m_cornerCost < m_cornerCost * aCornerTolerance &&
aOther.m_lengthCost < m_lengthCost * aLengthTollerance ) aOther.m_lengthCost < m_lengthCost * aLengthTolerance )
return true; return true;
return false; return false;
@ -224,6 +224,7 @@ void PNS_OPTIMIZER::ClearCache( bool aStaticOnly )
} }
} }
class LINE_RESTRICTIONS class LINE_RESTRICTIONS
{ {
public: public:
@ -234,7 +235,6 @@ class LINE_RESTRICTIONS
bool Check ( int aVertex1, int aVertex2, const SHAPE_LINE_CHAIN& aReplacement ); bool Check ( int aVertex1, int aVertex2, const SHAPE_LINE_CHAIN& aReplacement );
void Dump(); void Dump();
private: private:
int allowedAngles( PNS_NODE* aWorld, const PNS_LINE* aLine, const VECTOR2I& aP, bool aFirst ); int allowedAngles( PNS_NODE* aWorld, const PNS_LINE* aLine, const VECTOR2I& aP, bool aFirst );
@ -244,7 +244,6 @@ class LINE_RESTRICTIONS
restricted( aRestricted ), restricted( aRestricted ),
allowedAngles( aAllowedAngles ) allowedAngles( aAllowedAngles )
{ {
} }
bool restricted; bool restricted;
@ -254,6 +253,7 @@ class LINE_RESTRICTIONS
std::vector<RVERTEX> m_rs; std::vector<RVERTEX> m_rs;
}; };
// fixme: use later // fixme: use later
int LINE_RESTRICTIONS::allowedAngles( PNS_NODE* aWorld, const PNS_LINE* aLine, const VECTOR2I& aP, bool aFirst ) int LINE_RESTRICTIONS::allowedAngles( PNS_NODE* aWorld, const PNS_LINE* aLine, const VECTOR2I& aP, bool aFirst )
{ {
@ -262,7 +262,6 @@ int LINE_RESTRICTIONS::allowedAngles ( PNS_NODE *aWorld, const PNS_LINE *aLine,
if( !jt ) if( !jt )
return 0xff; return 0xff;
DIRECTION_45 dirs [8]; DIRECTION_45 dirs [8];
int n_dirs = 0; int n_dirs = 0;
@ -282,14 +281,13 @@ int LINE_RESTRICTIONS::allowedAngles ( PNS_NODE *aWorld, const PNS_LINE *aLine,
} }
} }
const int angleMask = DIRECTION_45::ANG_OBTUSE | DIRECTION_45::ANG_HALF_FULL | DIRECTION_45::ANG_STRAIGHT; const int angleMask = DIRECTION_45::ANG_OBTUSE | DIRECTION_45::ANG_HALF_FULL | DIRECTION_45::ANG_STRAIGHT;
int outputMask = 0xff; int outputMask = 0xff;
for( int d = 0; d < 8; d++ ) for( int d = 0; d < 8; d++ )
{ {
DIRECTION_45 refDir( ( DIRECTION_45::Directions ) d ); DIRECTION_45 refDir( ( DIRECTION_45::Directions ) d );
for( int i = 0; i < n_dirs; i++ ) for( int i = 0; i < n_dirs; i++ )
{ {
if( !(refDir.Angle( dirs[i] ) & angleMask ) ) if( !(refDir.Angle( dirs[i] ) & angleMask ) )
@ -330,23 +328,30 @@ void LINE_RESTRICTIONS::Build( PNS_NODE *aWorld, PNS_LINE *aOriginLine, const SH
{ {
const SEG& sp = l.CSegment( i ); const SEG& sp = l.CSegment( i );
r.allowedAngles = DIRECTION_45( sp ).Mask(); r.allowedAngles = DIRECTION_45( sp ).Mask();
} else if (exiting) { }
else if( exiting )
{
const SEG& sp = l.CSegment( i - 1 ); const SEG& sp = l.CSegment( i - 1 );
r.allowedAngles = DIRECTION_45( sp ).Mask(); r.allowedAngles = DIRECTION_45( sp ).Mask();
} else { }
else
{
r.allowedAngles = ( !aRestrictedArea.Contains( v ) ) ? 0 : 0xff; r.allowedAngles = ( !aRestrictedArea.Contains( v ) ) ? 0 : 0xff;
r.restricted = r.allowedAngles ? false : true; r.restricted = r.allowedAngles ? false : true;
} }
} }
v_prev = v; v_prev = v;
m_rs.push_back( r ); m_rs.push_back( r );
} }
} }
void LINE_RESTRICTIONS::Dump() void LINE_RESTRICTIONS::Dump()
{ {
} }
bool LINE_RESTRICTIONS::Check( int aVertex1, int aVertex2, const SHAPE_LINE_CHAIN& aReplacement ) bool LINE_RESTRICTIONS::Check( int aVertex1, int aVertex2, const SHAPE_LINE_CHAIN& aReplacement )
{ {
if( m_rs.empty( ) ) if( m_rs.empty( ) )
@ -361,18 +366,17 @@ bool LINE_RESTRICTIONS::Check ( int aVertex1, int aVertex2, const SHAPE_LINE_CHA
int m1 = DIRECTION_45( aReplacement.CSegment( 0 ) ).Mask(); int m1 = DIRECTION_45( aReplacement.CSegment( 0 ) ).Mask();
int m2; int m2;
if( aReplacement.SegmentCount() == 1 ) if( aReplacement.SegmentCount() == 1 )
m2 = m1; m2 = m1;
else else
m2 = DIRECTION_45( aReplacement.CSegment( 1 ) ).Mask(); m2 = DIRECTION_45( aReplacement.CSegment( 1 ) ).Mask();
return ( ( v1.allowedAngles & m1 ) != 0 ) && return ( ( v1.allowedAngles & m1 ) != 0 ) &&
( ( v2.allowedAngles & m2 ) != 0 ); ( ( v2.allowedAngles & m2 ) != 0 );
} }
bool PNS_OPTIMIZER::checkColliding( PNS_ITEM* aItem, bool aUpdateCache ) bool PNS_OPTIMIZER::checkColliding( PNS_ITEM* aItem, bool aUpdateCache )
{ {
CACHE_VISITOR v( aItem, m_world, m_collisionKindMask ); CACHE_VISITOR v( aItem, m_world, m_collisionKindMask );
@ -464,7 +468,6 @@ bool PNS_OPTIMIZER::mergeObtuse( PNS_LINE* aLine )
s2opt = SEG( ip, s2.B ); s2opt = SEG( ip, s2.B );
} }
if( DIRECTION_45( s1opt ).IsObtuse( DIRECTION_45( s2opt ) ) ) if( DIRECTION_45( s1opt ).IsObtuse( DIRECTION_45( s2opt ) ) )
{ {
SHAPE_LINE_CHAIN opt_path; SHAPE_LINE_CHAIN opt_path;
@ -928,7 +931,9 @@ bool PNS_OPTIMIZER::fanoutCleanup( PNS_LINE* aLine )
if(endPad) if(endPad)
{ {
endMatch = endPad->OfKind( PNS_ITEM::VIA | PNS_ITEM::SOLID ); endMatch = endPad->OfKind( PNS_ITEM::VIA | PNS_ITEM::SOLID );
} else { }
else
{
endMatch = aLine->EndsWithVia(); endMatch = aLine->EndsWithVia();
} }
@ -951,6 +956,7 @@ bool PNS_OPTIMIZER::fanoutCleanup( PNS_LINE* aLine )
return false; return false;
} }
int findCoupledVertices( const VECTOR2I& aVertex, const SEG& aOrigSeg, const SHAPE_LINE_CHAIN& aCoupled, PNS_DIFF_PAIR* aPair, int* aIndices ) int findCoupledVertices( const VECTOR2I& aVertex, const SEG& aOrigSeg, const SHAPE_LINE_CHAIN& aCoupled, PNS_DIFF_PAIR* aPair, int* aIndices )
{ {
int count = 0; int count = 0;
@ -959,7 +965,6 @@ int findCoupledVertices ( const VECTOR2I& aVertex, const SEG& aOrigSeg, const SH
SEG s = aCoupled.CSegment( i ); SEG s = aCoupled.CSegment( i );
VECTOR2I projOverCoupled = s.LineProject ( aVertex ); VECTOR2I projOverCoupled = s.LineProject ( aVertex );
if( s.ApproxParallel ( aOrigSeg ) ) if( s.ApproxParallel ( aOrigSeg ) )
{ {
int64_t dist = ( projOverCoupled - aVertex ).EuclideanNorm() - aPair->Width(); int64_t dist = ( projOverCoupled - aVertex ).EuclideanNorm() - aPair->Width();
@ -975,6 +980,7 @@ int findCoupledVertices ( const VECTOR2I& aVertex, const SEG& aOrigSeg, const SH
return count; return count;
} }
bool verifyDpBypass( PNS_NODE* aNode, PNS_DIFF_PAIR* aPair, bool aRefIsP, const SHAPE_LINE_CHAIN& aNewRef, const SHAPE_LINE_CHAIN& aNewCoupled ) bool verifyDpBypass( PNS_NODE* aNode, PNS_DIFF_PAIR* aPair, bool aRefIsP, const SHAPE_LINE_CHAIN& aNewRef, const SHAPE_LINE_CHAIN& aNewCoupled )
{ {
PNS_LINE refLine ( aRefIsP ? aPair->PLine() : aPair->NLine(), aNewRef ); PNS_LINE refLine ( aRefIsP ? aPair->PLine() : aPair->NLine(), aNewRef );
@ -992,6 +998,7 @@ bool verifyDpBypass ( PNS_NODE *aNode, PNS_DIFF_PAIR *aPair, bool aRefIsP, const
return true; return true;
} }
bool coupledBypass( PNS_NODE* aNode, PNS_DIFF_PAIR* aPair, bool aRefIsP, const SHAPE_LINE_CHAIN& aRef, const SHAPE_LINE_CHAIN& aRefBypass, const SHAPE_LINE_CHAIN& aCoupled, SHAPE_LINE_CHAIN& aNewCoupled ) bool coupledBypass( PNS_NODE* aNode, PNS_DIFF_PAIR* aPair, bool aRefIsP, const SHAPE_LINE_CHAIN& aRef, const SHAPE_LINE_CHAIN& aRefBypass, const SHAPE_LINE_CHAIN& aCoupled, SHAPE_LINE_CHAIN& aNewCoupled )
{ {
int vStartIdx[1024]; // fixme: possible overflow int vStartIdx[1024]; // fixme: possible overflow
@ -1005,9 +1012,11 @@ bool coupledBypass ( PNS_NODE *aNode, PNS_DIFF_PAIR *aPair, bool aRefIsP, const
int si, ei; int si, ei;
for( int i=0; i< nStarts; i++ ) for( int i=0; i< nStarts; i++ )
{
for( int j = 1; j < aCoupled.PointCount() - 1; j++ ) for( int j = 1; j < aCoupled.PointCount() - 1; j++ )
{ {
int delta = std::abs ( vStartIdx[i] - j ); int delta = std::abs ( vStartIdx[i] - j );
if( delta > 1 ) if( delta > 1 )
{ {
const VECTOR2I& vs = aCoupled.CPoint( vStartIdx[i] ); const VECTOR2I& vs = aCoupled.CPoint( vStartIdx[i] );
@ -1033,6 +1042,7 @@ bool coupledBypass ( PNS_NODE *aNode, PNS_DIFF_PAIR *aPair, bool aRefIsP, const
} }
} }
} }
}
if( found ) if( found )
@ -1041,6 +1051,7 @@ bool coupledBypass ( PNS_NODE *aNode, PNS_DIFF_PAIR *aPair, bool aRefIsP, const
return found; return found;
} }
bool checkDpColliding( PNS_NODE* aNode, PNS_DIFF_PAIR* aPair, bool aIsP, const SHAPE_LINE_CHAIN& aPath ) bool checkDpColliding( PNS_NODE* aNode, PNS_DIFF_PAIR* aPair, bool aIsP, const SHAPE_LINE_CHAIN& aPath )
{ {
PNS_LINE tmp ( aIsP ? aPair->PLine() : aPair->NLine(), aPath ); PNS_LINE tmp ( aIsP ? aPair->PLine() : aPair->NLine(), aPath );
@ -1076,7 +1087,6 @@ bool PNS_OPTIMIZER::mergeDpStep( PNS_DIFF_PAIR *aPair, bool aTryP, int step )
SHAPE_LINE_CHAIN newCoup; SHAPE_LINE_CHAIN newCoup;
int64_t deltaCoupled = -1, deltaUni = -1; int64_t deltaCoupled = -1, deltaUni = -1;
newRef = currentPath; newRef = currentPath;
newRef.Replace( s1.Index(), s2.Index(), bypass ); newRef.Replace( s1.Index(), s2.Index(), bypass );
@ -1111,6 +1121,7 @@ bool PNS_OPTIMIZER::mergeDpStep( PNS_DIFF_PAIR *aPair, bool aTryP, int step )
return false; return false;
} }
bool PNS_OPTIMIZER::mergeDpSegments( PNS_DIFF_PAIR* aPair ) bool PNS_OPTIMIZER::mergeDpSegments( PNS_DIFF_PAIR* aPair )
{ {
int step_p = aPair->CP().SegmentCount() - 2; int step_p = aPair->CP().SegmentCount() - 2;
@ -1151,9 +1162,8 @@ bool PNS_OPTIMIZER::mergeDpSegments( PNS_DIFF_PAIR *aPair )
return true; return true;
} }
bool PNS_OPTIMIZER::Optimize( PNS_DIFF_PAIR* aPair ) bool PNS_OPTIMIZER::Optimize( PNS_DIFF_PAIR* aPair )
{ {
return mergeDpSegments( aPair ); return mergeDpSegments( aPair );
} }

View File

@ -62,7 +62,7 @@ public:
void Remove( PNS_LINE& aLine ); void Remove( PNS_LINE& aLine );
void Replace( PNS_LINE& aOldLine, PNS_LINE& aNewLine ); void Replace( PNS_LINE& aOldLine, PNS_LINE& aNewLine );
bool IsBetter( PNS_COST_ESTIMATOR& aOther, double aLengthTollerance, bool IsBetter( PNS_COST_ESTIMATOR& aOther, double aLengthTolerance,
double aCornerTollerace ) const; double aCornerTollerace ) const;
double GetLengthCost() const { return m_lengthCost; } double GetLengthCost() const { return m_lengthCost; }

View File

@ -148,7 +148,6 @@ public:
*/ */
virtual void FlipPosture() virtual void FlipPosture()
{ {
} }
/** /**
@ -160,7 +159,6 @@ public:
*/ */
virtual void UpdateSizes( const PNS_SIZES_SETTINGS& aSizes ) virtual void UpdateSizes( const PNS_SIZES_SETTINGS& aSizes )
{ {
} }
/** /**
@ -172,7 +170,6 @@ public:
*/ */
virtual void SetOrthoMode ( bool aOrthoMode ) virtual void SetOrthoMode ( bool aOrthoMode )
{ {
} }
/** /**
@ -182,7 +179,6 @@ public:
*/ */
virtual void GetModifiedNets( std::vector<int> &aNets ) const virtual void GetModifiedNets( std::vector<int> &aNets ) const
{ {
} }
}; };

View File

@ -49,8 +49,6 @@
#include "pns_meander_skew_placer.h" #include "pns_meander_skew_placer.h"
#include "pns_dp_meander_placer.h" #include "pns_dp_meander_placer.h"
#include <router/router_preview_item.h> #include <router/router_preview_item.h>
#include <class_board.h> #include <class_board.h>
@ -87,11 +85,12 @@ PNS_PCBNEW_CLEARANCE_FUNC::PNS_PCBNEW_CLEARANCE_FUNC( BOARD* aBoard )
m_defaultClearance = 254000; // aBoard->m_NetClasses.Find ("Default clearance")->GetClearance(); m_defaultClearance = 254000; // aBoard->m_NetClasses.Find ("Default clearance")->GetClearance();
} }
PNS_PCBNEW_CLEARANCE_FUNC::~PNS_PCBNEW_CLEARANCE_FUNC() PNS_PCBNEW_CLEARANCE_FUNC::~PNS_PCBNEW_CLEARANCE_FUNC()
{ {
} }
int PNS_PCBNEW_CLEARANCE_FUNC::localPadClearance( const PNS_ITEM* aItem ) const int PNS_PCBNEW_CLEARANCE_FUNC::localPadClearance( const PNS_ITEM* aItem ) const
{ {
if( !aItem->Parent() || aItem->Parent()->Type() != PCB_PAD_T ) if( !aItem->Parent() || aItem->Parent()->Type() != PCB_PAD_T )
@ -101,6 +100,7 @@ int PNS_PCBNEW_CLEARANCE_FUNC::localPadClearance( const PNS_ITEM* aItem ) const
return pad->GetLocalClearance(); return pad->GetLocalClearance();
} }
int PNS_PCBNEW_CLEARANCE_FUNC::operator()( const PNS_ITEM* aA, const PNS_ITEM* aB ) int PNS_PCBNEW_CLEARANCE_FUNC::operator()( const PNS_ITEM* aA, const PNS_ITEM* aB )
{ {
int net_a = aA->Net(); int net_a = aA->Net();
@ -123,7 +123,8 @@ int PNS_PCBNEW_CLEARANCE_FUNC::operator()( const PNS_ITEM* aA, const PNS_ITEM* a
cl_b = std::max( cl_b, pad_b ); cl_b = std::max( cl_b, pad_b );
return std::max( cl_a, cl_b ); return std::max( cl_a, cl_b );
}; }
// fixme: ugly hack to make the optimizer respect gap width for currently routed differential pair. // fixme: ugly hack to make the optimizer respect gap width for currently routed differential pair.
void PNS_PCBNEW_CLEARANCE_FUNC::OverrideClearance( bool aEnable, int aNetA, int aNetB , int aClearance ) void PNS_PCBNEW_CLEARANCE_FUNC::OverrideClearance( bool aEnable, int aNetA, int aNetB , int aClearance )
@ -249,6 +250,7 @@ PNS_ITEM* PNS_ROUTER::syncTrack( TRACK* aTrack )
if( aTrack->GetFlags( ) & DP_COUPLED ) if( aTrack->GetFlags( ) & DP_COUPLED )
s->Mark ( MK_DP_COUPLED ); s->Mark ( MK_DP_COUPLED );
s->SetWidth( aTrack->GetWidth() ); s->SetWidth( aTrack->GetWidth() );
s->SetLayers( PNS_LAYERSET( aTrack->GetLayer() ) ); s->SetLayers( PNS_LAYERSET( aTrack->GetLayer() ) );
s->SetParent( aTrack ); s->SetParent( aTrack );
@ -280,6 +282,7 @@ void PNS_ROUTER::SetBoard( BOARD* aBoard )
TRACE( 1, "m_board = %p\n", m_board ); TRACE( 1, "m_board = %p\n", m_board );
} }
void PNS_ROUTER::SyncWorld() void PNS_ROUTER::SyncWorld()
{ {
if( !m_board ) if( !m_board )
@ -524,11 +527,13 @@ bool PNS_ROUTER::StartRouting( const VECTOR2I& aP, PNS_ITEM* aStartItem, int aLa
return rv; return rv;
} }
BOARD* PNS_ROUTER::GetBoard() BOARD* PNS_ROUTER::GetBoard()
{ {
return m_board; return m_board;
} }
void PNS_ROUTER::eraseView() void PNS_ROUTER::eraseView()
{ {
BOOST_FOREACH( BOARD_ITEM* item, m_hiddenItems ) BOOST_FOREACH( BOARD_ITEM* item, m_hiddenItems )
@ -710,7 +715,6 @@ void PNS_ROUTER::movePlacing( const VECTOR2I& aP, PNS_ITEM* aEndItem )
m_placer->Move( aP, aEndItem ); m_placer->Move( aP, aEndItem );
PNS_ITEMSET current = m_placer->Traces(); PNS_ITEMSET current = m_placer->Traces();
BOOST_FOREACH( const PNS_ITEM* item, current.CItems() ) BOOST_FOREACH( const PNS_ITEM* item, current.CItems() )
{ {
if( !item->OfKind( PNS_ITEM::LINE ) ) if( !item->OfKind( PNS_ITEM::LINE ) )
@ -723,7 +727,6 @@ void PNS_ROUTER::movePlacing( const VECTOR2I& aP, PNS_ITEM* aEndItem )
DisplayItem( &l->Via() ); DisplayItem( &l->Via() );
} }
//PNS_ITEMSET tmp( &current ); //PNS_ITEMSET tmp( &current );
updateView( m_placer->CurrentNode( true ), current ); updateView( m_placer->CurrentNode( true ), current );
@ -844,7 +847,6 @@ void PNS_ROUTER::StopRouting()
} }
} }
if( !RoutingInProgress() ) if( !RoutingInProgress() )
return; return;
@ -932,13 +934,16 @@ void PNS_ROUTER::DumpLog()
logger->Save( "/tmp/shove.log" ); logger->Save( "/tmp/shove.log" );
} }
bool PNS_ROUTER::IsPlacingVia() const bool PNS_ROUTER::IsPlacingVia() const
{ {
if( !m_placer ) if( !m_placer )
return NULL; return NULL;
return m_placer->IsPlacingVia(); return m_placer->IsPlacingVia();
} }
void PNS_ROUTER::SetOrthoMode( bool aEnable ) void PNS_ROUTER::SetOrthoMode( bool aEnable )
{ {
if( !m_placer ) if( !m_placer )
@ -947,9 +952,8 @@ void PNS_ROUTER::SetOrthoMode( bool aEnable )
m_placer->SetOrthoMode( aEnable ); m_placer->SetOrthoMode( aEnable );
} }
void PNS_ROUTER::SetMode( PNS_ROUTER_MODE aMode ) void PNS_ROUTER::SetMode( PNS_ROUTER_MODE aMode )
{ {
m_mode = aMode; m_mode = aMode;
} }

View File

@ -277,7 +277,6 @@ private:
wxString m_toolStatusbarName; wxString m_toolStatusbarName;
wxString m_failureReason; wxString m_failureReason;
}; };
#endif #endif

View File

@ -137,7 +137,6 @@ private:
PNS_MODE m_routingMode; PNS_MODE m_routingMode;
PNS_OPTIMIZATION_EFFORT m_optimizerEffort; PNS_OPTIMIZATION_EFFORT m_optimizerEffort;
int m_walkaroundIterationLimit; int m_walkaroundIterationLimit;
int m_shoveIterationLimit; int m_shoveIterationLimit;
TIME_LIMIT m_shoveTimeLimit; TIME_LIMIT m_shoveTimeLimit;

View File

@ -46,7 +46,6 @@ void PNS_SHOVE::replaceItems ( PNS_ITEM *aOld, PNS_ITEM *aNew )
{ {
OPT_BOX2I changed_area = ChangedArea( aOld, aNew ); OPT_BOX2I changed_area = ChangedArea( aOld, aNew );
if( changed_area ) if( changed_area )
{ {
assert( !changed_area->Contains( VECTOR2I( 0, 0 ) ) ); assert( !changed_area->Contains( VECTOR2I( 0, 0 ) ) );
@ -66,6 +65,7 @@ int PNS_SHOVE::getClearance( PNS_ITEM *aA, PNS_ITEM *aB ) const
return m_currentNode->GetClearance( aA, aB ); return m_currentNode->GetClearance( aA, aB );
} }
static void sanityCheck( PNS_LINE* aOld, PNS_LINE* aNew ) static void sanityCheck( PNS_LINE* aOld, PNS_LINE* aNew )
{ {
assert( aOld->CPoint( 0 ) == aNew->CPoint( 0 ) ); assert( aOld->CPoint( 0 ) == aNew->CPoint( 0 ) );
@ -99,6 +99,7 @@ PNS_LINE* PNS_SHOVE::assembleLine( const PNS_SEGMENT* aSeg, int* aIndex )
return l; return l;
} }
// A dumb function that checks if the shoved line is shoved the right way, e.g. // A dumb function that checks if the shoved line is shoved the right way, e.g.
// visually "outwards" of the line/via applying pressure on it. Unfortunately there's no // visually "outwards" of the line/via applying pressure on it. Unfortunately there's no
// mathematical concept of orientation of an open curve, so we use some primitive heuristics: // mathematical concept of orientation of an open curve, so we use some primitive heuristics:
@ -351,8 +352,6 @@ PNS_SHOVE::SHOVE_STATUS PNS_SHOVE::onCollidingLine( PNS_LINE* aCurrent, PNS_LINE
SHOVE_STATUS rv = ProcessSingleLine( aCurrent, aObstacle, shovedLine ); SHOVE_STATUS rv = ProcessSingleLine( aCurrent, aObstacle, shovedLine );
if( rv == SH_OK ) if( rv == SH_OK )
{ {
if( shovedLine->Marker() & MK_HEAD ) if( shovedLine->Marker() & MK_HEAD )
@ -499,7 +498,6 @@ bool PNS_SHOVE::pushSpringback( PNS_NODE* aNode, const PNS_ITEMSET& aHeadItems,
if( !m_nodeStack.empty() ) if( !m_nodeStack.empty() )
prev_area = m_nodeStack.back().m_affectedArea; prev_area = m_nodeStack.back().m_affectedArea;
st.m_node = aNode; st.m_node = aNode;
st.m_cost = aCost; st.m_cost = aCost;
st.m_headItems = aHeadItems; st.m_headItems = aHeadItems;
@ -574,7 +572,6 @@ PNS_SHOVE::SHOVE_STATUS PNS_SHOVE::pushVia( PNS_VIA* aVia, const VECTOR2I& aForc
if( aVia->Marker() & MK_HEAD ) if( aVia->Marker() & MK_HEAD )
m_draggedViaHeadSet.Add( clone ( lp.second ) ); m_draggedViaHeadSet.Add( clone ( lp.second ) );
} }
} }
@ -955,6 +952,7 @@ PNS_SHOVE::SHOVE_STATUS PNS_SHOVE::shoveMainLoop()
return st; return st;
} }
OPT_BOX2I PNS_SHOVE::totalAffectedArea() const OPT_BOX2I PNS_SHOVE::totalAffectedArea() const
{ {
OPT_BOX2I area; OPT_BOX2I area;
@ -1047,7 +1045,6 @@ PNS_SHOVE::SHOVE_STATUS PNS_SHOVE::ShoveLines( const PNS_LINE& aCurrentHead )
} }
PNS_SHOVE::SHOVE_STATUS PNS_SHOVE::ShoveMultiLines( const PNS_ITEMSET& aHeadSet ) PNS_SHOVE::SHOVE_STATUS PNS_SHOVE::ShoveMultiLines( const PNS_ITEMSET& aHeadSet )
{ {
SHOVE_STATUS st = SH_OK; SHOVE_STATUS st = SH_OK;
@ -1067,7 +1064,6 @@ PNS_SHOVE::SHOVE_STATUS PNS_SHOVE::ShoveMultiLines( const PNS_ITEMSET& aHeadSet
headSet.Add( clone( headOrig ) ); headSet.Add( clone( headOrig ) );
} }
m_lineStack.clear(); m_lineStack.clear();
m_optimizerQueue.clear(); m_optimizerQueue.clear();
m_logger.Clear(); m_logger.Clear();
@ -1128,12 +1124,12 @@ PNS_SHOVE::SHOVE_STATUS PNS_SHOVE::ShoveMultiLines( const PNS_ITEMSET& aHeadSet
return st; return st;
} }
PNS_SHOVE::SHOVE_STATUS PNS_SHOVE::ShoveDraggingVia( PNS_VIA* aVia, const VECTOR2I& aWhere, PNS_SHOVE::SHOVE_STATUS PNS_SHOVE::ShoveDraggingVia( PNS_VIA* aVia, const VECTOR2I& aWhere,
PNS_VIA** aNewVia ) PNS_VIA** aNewVia )
{ {
SHOVE_STATUS st = SH_OK; SHOVE_STATUS st = SH_OK;
m_lineStack.clear(); m_lineStack.clear();
m_optimizerQueue.clear(); m_optimizerQueue.clear();
m_newHead = OPT_LINE(); m_newHead = OPT_LINE();
@ -1223,7 +1219,6 @@ void PNS_SHOVE::runOptimizer( PNS_NODE* aNode, PNS_LINE* aHead )
break; break;
} }
if( Settings().SmartPads() ) if( Settings().SmartPads() )
optFlags |= PNS_OPTIMIZER::SMART_PADS ; optFlags |= PNS_OPTIMIZER::SMART_PADS ;
@ -1254,6 +1249,7 @@ void PNS_SHOVE::runOptimizer( PNS_NODE* aNode, PNS_LINE* aHead )
} }
} }
PNS_NODE* PNS_SHOVE::CurrentNode() PNS_NODE* PNS_SHOVE::CurrentNode()
{ {
return m_nodeStack.empty() ? m_root : m_nodeStack.back().m_node; return m_nodeStack.empty() ? m_root : m_nodeStack.back().m_node;

View File

@ -117,7 +117,6 @@ private:
OPT_BOX2I totalAffectedArea() const; OPT_BOX2I totalAffectedArea() const;
void unwindStack( PNS_SEGMENT* aSeg ); void unwindStack( PNS_SEGMENT* aSeg );
void unwindStack( PNS_ITEM* aItem ); void unwindStack( PNS_ITEM* aItem );
@ -140,7 +139,6 @@ private:
OPT_BOX2I m_affectedAreaSum; OPT_BOX2I m_affectedAreaSum;
SHOVE_STATUS shoveIteration( int aIter ); SHOVE_STATUS shoveIteration( int aIter );
SHOVE_STATUS shoveMainLoop(); SHOVE_STATUS shoveMainLoop();

View File

@ -66,6 +66,7 @@ int PNS_SIZES_SETTINGS::inheritTrackWidth( PNS_ITEM* aItem )
return ( mval == INT_MAX ? 0 : mval ); return ( mval == INT_MAX ? 0 : mval );
} }
void PNS_SIZES_SETTINGS::Init( BOARD* aBoard, PNS_ITEM* aStartItem, int aNet ) void PNS_SIZES_SETTINGS::Init( BOARD* aBoard, PNS_ITEM* aStartItem, int aNet )
{ {
BOARD_DESIGN_SETTINGS &bds = aBoard->GetDesignSettings(); BOARD_DESIGN_SETTINGS &bds = aBoard->GetDesignSettings();
@ -121,11 +122,13 @@ void PNS_SIZES_SETTINGS::Init( BOARD* aBoard, PNS_ITEM* aStartItem, int aNet )
m_layerPairs.clear(); m_layerPairs.clear();
} }
void PNS_SIZES_SETTINGS::ClearLayerPairs() void PNS_SIZES_SETTINGS::ClearLayerPairs()
{ {
m_layerPairs.clear(); m_layerPairs.clear();
} }
void PNS_SIZES_SETTINGS::AddLayerPair( int aL1, int aL2 ) void PNS_SIZES_SETTINGS::AddLayerPair( int aL1, int aL2 )
{ {
int top = std::min( aL1, aL2 ); int top = std::min( aL1, aL2 );
@ -135,6 +138,7 @@ void PNS_SIZES_SETTINGS::AddLayerPair( int aL1, int aL2 )
m_layerPairs[top] = bottom; m_layerPairs[top] = bottom;
} }
void PNS_SIZES_SETTINGS::ImportCurrent( BOARD_DESIGN_SETTINGS& aSettings ) void PNS_SIZES_SETTINGS::ImportCurrent( BOARD_DESIGN_SETTINGS& aSettings )
{ {
m_trackWidth = aSettings.GetCurrentTrackWidth(); m_trackWidth = aSettings.GetCurrentTrackWidth();
@ -142,6 +146,7 @@ void PNS_SIZES_SETTINGS::ImportCurrent( BOARD_DESIGN_SETTINGS& aSettings )
m_viaDrill = aSettings.GetCurrentViaDrill(); m_viaDrill = aSettings.GetCurrentViaDrill();
} }
int PNS_SIZES_SETTINGS::GetLayerTop() const int PNS_SIZES_SETTINGS::GetLayerTop() const
{ {
if( m_layerPairs.empty() ) if( m_layerPairs.empty() )
@ -150,6 +155,7 @@ int PNS_SIZES_SETTINGS::GetLayerTop() const
return m_layerPairs.begin()->first; return m_layerPairs.begin()->first;
} }
int PNS_SIZES_SETTINGS::GetLayerBottom() const int PNS_SIZES_SETTINGS::GetLayerBottom() const
{ {
if( m_layerPairs.empty() ) if( m_layerPairs.empty() )

View File

@ -95,6 +95,7 @@ void PNS_TOOL_BASE::Reset( RESET_REASON aReason )
m_router->SetView( getView() ); m_router->SetView( getView() );
} }
PNS_ITEM* PNS_TOOL_BASE::pickSingleItem( const VECTOR2I& aWhere, int aNet, int aLayer ) PNS_ITEM* PNS_TOOL_BASE::pickSingleItem( const VECTOR2I& aWhere, int aNet, int aLayer )
{ {
int tl = getView()->GetTopLayer(); int tl = getView()->GetTopLayer();
@ -178,6 +179,7 @@ void PNS_TOOL_BASE::highlightNet( bool aEnabled, int aNetcode )
getView()->UpdateAllLayersColor(); getView()->UpdateAllLayersColor();
} }
void PNS_TOOL_BASE::updateStartItem( TOOL_EVENT& aEvent ) void PNS_TOOL_BASE::updateStartItem( TOOL_EVENT& aEvent )
{ {
int tl = getView()->GetTopLayer(); int tl = getView()->GetTopLayer();
@ -227,6 +229,7 @@ void PNS_TOOL_BASE::updateStartItem( TOOL_EVENT& aEvent )
} }
} }
void PNS_TOOL_BASE::updateEndItem( TOOL_EVENT& aEvent ) void PNS_TOOL_BASE::updateEndItem( TOOL_EVENT& aEvent )
{ {
VECTOR2I mp = m_ctls->GetMousePosition(); VECTOR2I mp = m_ctls->GetMousePosition();

View File

@ -32,7 +32,6 @@
bool PNS_TOPOLOGY::SimplifyLine( PNS_LINE* aLine ) bool PNS_TOPOLOGY::SimplifyLine( PNS_LINE* aLine )
{ {
if( !aLine->LinkedSegments() || !aLine->SegmentCount() ) if( !aLine->LinkedSegments() || !aLine->SegmentCount() )
return false; return false;
@ -54,6 +53,7 @@ bool PNS_TOPOLOGY::SimplifyLine ( PNS_LINE *aLine )
return false; return false;
} }
const PNS_TOPOLOGY::JOINT_SET PNS_TOPOLOGY::ConnectedJoints( PNS_JOINT* aStart ) const PNS_TOPOLOGY::JOINT_SET PNS_TOPOLOGY::ConnectedJoints( PNS_JOINT* aStart )
{ {
std::deque<PNS_JOINT*> searchQueue; std::deque<PNS_JOINT*> searchQueue;
@ -108,7 +108,9 @@ bool PNS_TOPOLOGY::LeadingRatLine( const PNS_LINE *aTrack, SHAPE_LINE_CHAIN& aRa
if( ( !track.EndsWithVia() && jt->LinkCount() >= 2 ) || ( track.EndsWithVia() && jt->LinkCount() >= 3 ) ) // we got something connected if( ( !track.EndsWithVia() && jt->LinkCount() >= 2 ) || ( track.EndsWithVia() && jt->LinkCount() >= 3 ) ) // we got something connected
{ {
end = jt->Pos(); end = jt->Pos();
} else { }
else
{
int anchor; int anchor;
PNS_TOPOLOGY topo( tmpNode.get() ); PNS_TOPOLOGY topo( tmpNode.get() );
@ -208,16 +210,20 @@ bool PNS_TOPOLOGY::followTrivialPath ( PNS_LINE *aLine, bool aLeft, PNS_ITEMSET&
{ {
aSet.Prepend( via ); aSet.Prepend( via );
aSet.Prepend( l ); aSet.Prepend( l );
} else { }
else
{
aSet.Add( via ); aSet.Add( via );
aSet.Add( l ); aSet.Add( l );
} }
return followTrivialPath( l, aLeft, aSet, aVisited ); return followTrivialPath( l, aLeft, aSet, aVisited );
} }
return false; return false;
} }
const PNS_ITEMSET PNS_TOPOLOGY::AssembleTrivialPath( PNS_SEGMENT* aStart ) const PNS_ITEMSET PNS_TOPOLOGY::AssembleTrivialPath( PNS_SEGMENT* aStart )
{ {
PNS_ITEMSET path; PNS_ITEMSET path;
@ -233,38 +239,46 @@ const PNS_ITEMSET PNS_TOPOLOGY::AssembleTrivialPath ( PNS_SEGMENT *aStart )
return path; return path;
} }
const PNS_ITEMSET PNS_TOPOLOGY::ConnectedItems( PNS_JOINT* aStart, int aKindMask ) const PNS_ITEMSET PNS_TOPOLOGY::ConnectedItems( PNS_JOINT* aStart, int aKindMask )
{ {
return PNS_ITEMSET(); return PNS_ITEMSET();
} }
const PNS_ITEMSET PNS_TOPOLOGY::ConnectedItems( PNS_ITEM* aStart, int aKindMask ) const PNS_ITEMSET PNS_TOPOLOGY::ConnectedItems( PNS_ITEM* aStart, int aKindMask )
{ {
return PNS_ITEMSET(); return PNS_ITEMSET();
} }
int PNS_TOPOLOGY::MatchDpSuffix( wxString aNetName, wxString& aComplementNet, wxString& aBaseDpName ) int PNS_TOPOLOGY::MatchDpSuffix( wxString aNetName, wxString& aComplementNet, wxString& aBaseDpName )
{ {
int rv = 0; int rv = 0;
if( aNetName.EndsWith( "+" ) ) if( aNetName.EndsWith( "+" ) )
{ {
aComplementNet = "-"; aComplementNet = "-";
rv = 1; rv = 1;
} else if (aNetName.EndsWith("_P")) }
else if( aNetName.EndsWith( "_P" ) )
{ {
aComplementNet = "_N"; aComplementNet = "_N";
rv = 1; rv = 1;
} else if (aNetName.EndsWith("-")) }
else if( aNetName.EndsWith( "-" ) )
{ {
aComplementNet = "+"; aComplementNet = "+";
rv = -1; rv = -1;
} else if (aNetName.EndsWith("_N")) }
else if( aNetName.EndsWith( "_N" ) )
{ {
aComplementNet = "_P"; aComplementNet = "_P";
rv = -1; rv = -1;
} }
if (rv != 0) { if( rv != 0 )
{
aBaseDpName = aNetName.Left( aNetName.Length() - aComplementNet.Length() ); aBaseDpName = aNetName.Left( aNetName.Length() - aComplementNet.Length() );
aComplementNet = aBaseDpName + aComplementNet; aComplementNet = aBaseDpName + aComplementNet;
} }
@ -356,5 +370,6 @@ bool PNS_TOPOLOGY::AssembleDiffPair ( PNS_ITEM *aStart, PNS_DIFF_PAIR& aPair )
aPair = PNS_DIFF_PAIR( *lp, *ln ); aPair = PNS_DIFF_PAIR( *lp, *ln );
aPair.SetWidth( lp->Width() ); aPair.SetWidth( lp->Width() );
aPair.SetLayers( lp->Layers() ); aPair.SetLayers( lp->Layers() );
return true; return true;
} }

View File

@ -52,8 +52,6 @@ class PNS_TOPOLOGY
const PNS_ITEMSET ConnectedItems( PNS_ITEM* aStart, int aKindMask = PNS_ITEM::ANY ); const PNS_ITEMSET ConnectedItems( PNS_ITEM* aStart, int aKindMask = PNS_ITEM::ANY );
int64_t ShortestConnectionLength( PNS_ITEM* aFrom, PNS_ITEM* aTo ); int64_t ShortestConnectionLength( PNS_ITEM* aFrom, PNS_ITEM* aTo );
const PNS_ITEMSET AssembleTrivialPath( PNS_SEGMENT* aStart ); const PNS_ITEMSET AssembleTrivialPath( PNS_SEGMENT* aStart );
const PNS_DIFF_PAIR AssembleDiffPair( PNS_SEGMENT* aStart ); const PNS_DIFF_PAIR AssembleDiffPair( PNS_SEGMENT* aStart );
@ -63,10 +61,7 @@ class PNS_TOPOLOGY
const PNS_LINE DpCoupledLine( PNS_LINE* aLine ); const PNS_LINE DpCoupledLine( PNS_LINE* aLine );
bool AssembleDiffPair( PNS_ITEM* aStart, PNS_DIFF_PAIR& aPair ); bool AssembleDiffPair( PNS_ITEM* aStart, PNS_DIFF_PAIR& aPair );
private: private:
bool followTrivialPath( PNS_LINE* aLine, bool aLeft, PNS_ITEMSET& aSet, std::set<PNS_ITEM*>& aVisited ); bool followTrivialPath( PNS_LINE* aLine, bool aLeft, PNS_ITEMSET& aSet, std::set<PNS_ITEM*>& aVisited );
PNS_NODE *m_world; PNS_NODE *m_world;

View File

@ -22,22 +22,22 @@
#include "pns_router.h" #include "pns_router.h"
#include "pns_meander_placer.h" #include "pns_meander_placer.h"
PNS_TUNE_STATUS_POPUP::PNS_TUNE_STATUS_POPUP ( PCB_EDIT_FRAME *parent ) : PNS_TUNE_STATUS_POPUP::PNS_TUNE_STATUS_POPUP( PCB_EDIT_FRAME* aParent ) :
WX_STATUS_POPUP ( parent ) WX_STATUS_POPUP( aParent )
{ {
m_panel->SetBackgroundColour( wxColour( 64, 64, 64 ) ); m_panel->SetBackgroundColour( wxColour( 64, 64, 64 ) );
m_statusLine = new wxStaticText( m_panel, wxID_ANY, m_statusLine = new wxStaticText( m_panel, wxID_ANY, wxT( "Status text 1\n" ) ) ;
wxT("Status text 1\n") ) ;
m_topSizer->Add( m_statusLine, 1, wxALL | wxEXPAND, 5 ); m_topSizer->Add( m_statusLine, 1, wxALL | wxEXPAND, 5 );
updateSize(); updateSize();
} }
PNS_TUNE_STATUS_POPUP::~PNS_TUNE_STATUS_POPUP() PNS_TUNE_STATUS_POPUP::~PNS_TUNE_STATUS_POPUP()
{ {
} }
void PNS_TUNE_STATUS_POPUP::Update( PNS_ROUTER* aRouter ) void PNS_TUNE_STATUS_POPUP::Update( PNS_ROUTER* aRouter )
{ {
PNS_MEANDER_PLACER_BASE* placer = dynamic_cast<PNS_MEANDER_PLACER_BASE*>( aRouter->Placer() ); PNS_MEANDER_PLACER_BASE* placer = dynamic_cast<PNS_MEANDER_PLACER_BASE*>( aRouter->Placer() );

View File

@ -32,10 +32,9 @@ class PNS_ROUTER;
class PNS_TUNE_STATUS_POPUP : public WX_STATUS_POPUP class PNS_TUNE_STATUS_POPUP : public WX_STATUS_POPUP
{ {
public: public:
PNS_TUNE_STATUS_POPUP ( PCB_EDIT_FRAME *parent ); PNS_TUNE_STATUS_POPUP( PCB_EDIT_FRAME* aParent );
~PNS_TUNE_STATUS_POPUP(); ~PNS_TUNE_STATUS_POPUP();
void Update( PNS_ROUTER* aRouter ); void Update( PNS_ROUTER* aRouter );
private: private:

View File

@ -93,29 +93,31 @@ SHAPE_RECT ApproximateSegmentAsRect( const SHAPE_SEGMENT& aSeg )
std::abs( p1.x - p0.x ), std::abs( p1.y - p0.y ) ); std::abs( p1.x - p0.x ), std::abs( p1.y - p0.y ) );
} }
void DrawDebugPoint ( VECTOR2I p, int color )
void DrawDebugPoint( VECTOR2I aP, int aColor )
{ {
SHAPE_LINE_CHAIN l; SHAPE_LINE_CHAIN l;
l.Append ( p - VECTOR2I(-50000, -50000) ); l.Append( aP - VECTOR2I( -50000, -50000 ) );
l.Append ( p + VECTOR2I(-50000, -50000) ); l.Append( aP + VECTOR2I( -50000, -50000 ) );
//printf("router @ %p\n", PNS_ROUTER::GetInstance()); //printf("router @ %p\n", PNS_ROUTER::GetInstance());
PNS_ROUTER::GetInstance()->DisplayDebugLine ( l, color, 10000 ); PNS_ROUTER::GetInstance()->DisplayDebugLine ( l, aColor, 10000 );
l.Clear(); l.Clear();
l.Append ( p - VECTOR2I(50000, -50000) ); l.Append( aP - VECTOR2I( 50000, -50000 ) );
l.Append ( p + VECTOR2I(50000, -50000) ); l.Append( aP + VECTOR2I( 50000, -50000 ) );
PNS_ROUTER::GetInstance()->DisplayDebugLine ( l, color, 10000 ); PNS_ROUTER::GetInstance()->DisplayDebugLine( l, aColor, 10000 );
} }
void DrawDebugBox ( BOX2I b, int color )
void DrawDebugBox( BOX2I aB, int aColor )
{ {
SHAPE_LINE_CHAIN l; SHAPE_LINE_CHAIN l;
VECTOR2I o = b.GetOrigin(); VECTOR2I o = aB.GetOrigin();
VECTOR2I s = b.GetSize(); VECTOR2I s = aB.GetSize();
l.Append( o ); l.Append( o );
l.Append( o.x + s.x, o.y ); l.Append( o.x + s.x, o.y );
@ -124,33 +126,33 @@ void DrawDebugBox ( BOX2I b, int color )
l.Append( o ); l.Append( o );
//printf("router @ %p\n", PNS_ROUTER::GetInstance()); //printf("router @ %p\n", PNS_ROUTER::GetInstance());
PNS_ROUTER::GetInstance()->DisplayDebugLine ( l, color, 10000 ); PNS_ROUTER::GetInstance()->DisplayDebugLine( l, aColor, 10000 );
} }
void DrawDebugSeg ( SEG s, int color )
void DrawDebugSeg( SEG aS, int aColor )
{ {
SHAPE_LINE_CHAIN l; SHAPE_LINE_CHAIN l;
l.Append ( s.A ); l.Append( aS.A );
l.Append ( s.B ); l.Append( aS.B );
PNS_ROUTER::GetInstance()->DisplayDebugLine ( l, color, 10000 ); PNS_ROUTER::GetInstance()->DisplayDebugLine( l, aColor, 10000 );
} }
void DrawDebugDirs ( VECTOR2D p, int mask, int color )
{
BOX2I b ( p - VECTOR2I ( 10000, 10000 ), VECTOR2I ( 20000, 20000 ) );
DrawDebugBox ( b, color ); void DrawDebugDirs( VECTOR2D aP, int aMask, int aColor )
{
BOX2I b( aP - VECTOR2I( 10000, 10000 ), VECTOR2I( 20000, 20000 ) );
DrawDebugBox( b, aColor );
for( int i = 0; i < 8; i++ ) for( int i = 0; i < 8; i++ )
{ {
if ( (1<<i) & mask ) if( ( 1 << i ) & aMask )
{ {
VECTOR2I v = DIRECTION_45( ( DIRECTION_45::Directions ) i ).ToVector() * 100000; VECTOR2I v = DIRECTION_45( ( DIRECTION_45::Directions ) i ).ToVector() * 100000;
DrawDebugSeg ( SEG (p, p+v), color ); DrawDebugSeg( SEG( aP, aP + v ), aColor );
} }
} }
} }
@ -163,12 +165,14 @@ OPT_BOX2I ChangedArea ( const PNS_ITEM *aItemA, const PNS_ITEM *aItemB )
const PNS_VIA* vb = static_cast<const PNS_VIA*>( aItemB ); const PNS_VIA* vb = static_cast<const PNS_VIA*>( aItemB );
return va->ChangedArea( vb ); return va->ChangedArea( vb );
} else if ( aItemA->OfKind ( PNS_ITEM::LINE ) && aItemB->OfKind ( PNS_ITEM::LINE ) ) }
else if( aItemA->OfKind( PNS_ITEM::LINE ) && aItemB->OfKind( PNS_ITEM::LINE ) )
{ {
const PNS_LINE* la = static_cast<const PNS_LINE*> ( aItemA ); const PNS_LINE* la = static_cast<const PNS_LINE*> ( aItemA );
const PNS_LINE* lb = static_cast<const PNS_LINE*> ( aItemB ); const PNS_LINE* lb = static_cast<const PNS_LINE*> ( aItemB );
return la->ChangedArea( lb ); return la->ChangedArea( lb );
} }
return OPT_BOX2I(); return OPT_BOX2I();
} }

View File

@ -41,10 +41,10 @@ const SHAPE_LINE_CHAIN SegmentHull ( const SHAPE_SEGMENT& aSeg, int aClearance,
SHAPE_RECT ApproximateSegmentAsRect( const SHAPE_SEGMENT& aSeg ); SHAPE_RECT ApproximateSegmentAsRect( const SHAPE_SEGMENT& aSeg );
void DrawDebugPoint ( VECTOR2I p, int color ); void DrawDebugPoint( VECTOR2I aP, int aColor );
void DrawDebugBox ( BOX2I b, int color ); void DrawDebugBox( BOX2I aB, int aColor );
void DrawDebugSeg ( SEG s, int color ); void DrawDebugSeg( SEG aS, int aColor );
void DrawDebugDirs ( VECTOR2D p, int mask, int color ); void DrawDebugDirs( VECTOR2D aP, int aMask, int aColor );
OPT_BOX2I ChangedArea( const PNS_ITEM* aItemA, const PNS_ITEM* aItemB ); OPT_BOX2I ChangedArea( const PNS_ITEM* aItemA, const PNS_ITEM* aItemB );

View File

@ -96,6 +96,7 @@ PNS_VIA* PNS_VIA::Clone ( ) const
return v; return v;
} }
OPT_BOX2I PNS_VIA::ChangedArea ( const PNS_VIA* aOther ) const OPT_BOX2I PNS_VIA::ChangedArea ( const PNS_VIA* aOther ) const
{ {
if ( aOther->Pos() != Pos() ) if ( aOther->Pos() != Pos() )

View File

@ -151,9 +151,7 @@ PNS_WALKAROUND::WALKAROUND_STATUS PNS_WALKAROUND::Route( const PNS_LINE& aInitia
s_cw = m_forceCw ? IN_PROGRESS : STUCK; s_cw = m_forceCw ? IN_PROGRESS : STUCK;
s_ccw = m_forceCw ? STUCK : IN_PROGRESS; s_ccw = m_forceCw ? STUCK : IN_PROGRESS;
m_forceSingleDirection = true; m_forceSingleDirection = true;
} else { } else {
m_forceSingleDirection = false; m_forceSingleDirection = false;
} }
@ -253,7 +251,5 @@ PNS_WALKAROUND::WALKAROUND_STATUS PNS_WALKAROUND::Route( const PNS_LINE& aInitia
PNS_OPTIMIZER::Optimize( &aWalkPath, PNS_OPTIMIZER::MERGE_OBTUSE, m_world ); PNS_OPTIMIZER::Optimize( &aWalkPath, PNS_OPTIMIZER::MERGE_OBTUSE, m_world );
} }
return st; return st;
} }

View File

@ -23,10 +23,10 @@
template <class T> class RANGED_NUM { template <class T> class RANGED_NUM {
public: public:
RANGED_NUM ( T aValue = 0, T aTollerancePlus = 0, T aTolleranceMinus = 0) : RANGED_NUM( T aValue = 0, T aTolerancePlus = 0, T aToleranceMinus = 0 ) :
m_value( aValue ), m_value( aValue ),
m_tollerancePlus ( aTollerancePlus ), m_tolerancePlus( aTolerancePlus ),
m_tolleranceMinus ( aTolleranceMinus ) m_toleranceMinus( aToleranceMinus )
{} {}
operator T() operator T()
@ -42,12 +42,11 @@ template <class T> class RANGED_NUM {
bool Matches( const T& aOther ) const bool Matches( const T& aOther ) const
{ {
return ( aOther >= m_value - m_tolleranceMinus && aOther <= m_value + m_tollerancePlus ); return ( aOther >= m_value - m_toleranceMinus && aOther <= m_value + m_tolerancePlus );
} }
private: private:
T m_value, m_tollerancePlus, m_tolleranceMinus; T m_value, m_tolerancePlus, m_toleranceMinus;
}; };
#endif #endif

View File

@ -274,7 +274,7 @@ ROUTER_TOOL::~ROUTER_TOOL()
void ROUTER_TOOL::Reset( RESET_REASON aReason ) void ROUTER_TOOL::Reset( RESET_REASON aReason )
{ {
printf("RESET\n"); //printf("RESET\n");
if( m_router ) if( m_router )
delete m_router; delete m_router;
@ -299,6 +299,7 @@ void ROUTER_TOOL::Reset( RESET_REASON aReason )
Go( &ROUTER_TOOL::TuneSingleTrace, COMMON_ACTIONS::routerActivateTuneSingleTrace.MakeEvent() ); Go( &ROUTER_TOOL::TuneSingleTrace, COMMON_ACTIONS::routerActivateTuneSingleTrace.MakeEvent() );
} }
int ROUTER_TOOL::getDefaultWidth( int aNetCode ) int ROUTER_TOOL::getDefaultWidth( int aNetCode )
{ {
int w, d1, d2; int w, d1, d2;
@ -479,7 +480,6 @@ void ROUTER_TOOL::handleCommonEvents( TOOL_EVENT& aEvent )
else if( aEvent.IsAction( &COMMON_ACTIONS::trackViaSizeChanged ) ) else if( aEvent.IsAction( &COMMON_ACTIONS::trackViaSizeChanged ) )
{ {
PNS_SIZES_SETTINGS sizes( m_savedSizes ); PNS_SIZES_SETTINGS sizes( m_savedSizes );
sizes.ImportCurrent( m_board->GetDesignSettings() ); sizes.ImportCurrent( m_board->GetDesignSettings() );
m_router->UpdateSizes( sizes ); m_router->UpdateSizes( sizes );
@ -581,6 +581,7 @@ void ROUTER_TOOL::updateEndItem( TOOL_EVENT& aEvent )
TRACE( 0, "%s, layer : %d", m_endItem->KindStr().c_str() % m_endItem->Layers().Start() ); TRACE( 0, "%s, layer : %d", m_endItem->KindStr().c_str() % m_endItem->Layers().Start() );
} }
int ROUTER_TOOL::getStartLayer( const PNS_ITEM* aItem ) int ROUTER_TOOL::getStartLayer( const PNS_ITEM* aItem )
{ {
int tl = getView()->GetTopLayer(); int tl = getView()->GetTopLayer();
@ -597,6 +598,8 @@ int ROUTER_TOOL::getStartLayer( const PNS_ITEM* aItem )
return tl; return tl;
} }
void ROUTER_TOOL::switchLayerOnViaPlacement() void ROUTER_TOOL::switchLayerOnViaPlacement()
{ {
int al = m_frame->GetActiveLayer(); int al = m_frame->GetActiveLayer();
@ -616,6 +619,7 @@ void ROUTER_TOOL::switchLayerOnViaPlacement()
} }
} }
bool ROUTER_TOOL::onViaCommand( VIATYPE_T aType ) bool ROUTER_TOOL::onViaCommand( VIATYPE_T aType )
{ {
BOARD_DESIGN_SETTINGS& bds = m_board->GetDesignSettings(); BOARD_DESIGN_SETTINGS& bds = m_board->GetDesignSettings();
@ -651,7 +655,6 @@ bool ROUTER_TOOL::onViaCommand( VIATYPE_T aType )
return false; return false;
} }
sizes.SetViaType ( aType ); sizes.SetViaType ( aType );
m_router->ToggleViaPlacement( ); m_router->ToggleViaPlacement( );
m_router->UpdateSizes( sizes ); m_router->UpdateSizes( sizes );
@ -697,7 +700,6 @@ void ROUTER_TOOL::performRouting()
return; return;
} }
m_tuneStatusPopup = new PNS_TUNE_STATUS_POPUP( m_frame ); m_tuneStatusPopup = new PNS_TUNE_STATUS_POPUP( m_frame );
m_tuneStatusPopup->Popup(); m_tuneStatusPopup->Popup();
@ -715,14 +717,12 @@ void ROUTER_TOOL::performRouting()
} }
else if( evt->IsMotion() ) else if( evt->IsMotion() )
{ {
wxPoint p = wxGetMousePosition(); wxPoint p = wxGetMousePosition();
p.x += 20; p.x += 20;
p.y += 20; p.y += 20;
m_tuneStatusPopup->Update( m_router ); m_tuneStatusPopup->Update( m_router );
m_tuneStatusPopup->Move( p ); m_tuneStatusPopup->Move( p );
updateEndItem( *evt ); updateEndItem( *evt );
m_router->SetOrthoMode( evt->Modifier ( MD_CTRL ) ); m_router->SetOrthoMode( evt->Modifier ( MD_CTRL ) );
m_router->Move( m_endSnapPoint, m_endItem ); m_router->Move( m_endSnapPoint, m_endItem );
@ -796,24 +796,28 @@ void ROUTER_TOOL::performRouting()
highlightNet( false ); highlightNet( false );
} }
int ROUTER_TOOL::RouteSingleTrace( TOOL_EVENT& aEvent ) int ROUTER_TOOL::RouteSingleTrace( TOOL_EVENT& aEvent )
{ {
m_frame->SetToolID( ID_TRACK_BUTT, wxCURSOR_PENCIL, _( "Route Track" ) ); m_frame->SetToolID( ID_TRACK_BUTT, wxCURSOR_PENCIL, _( "Route Track" ) );
return mainLoop( PNS_MODE_ROUTE_SINGLE ); return mainLoop( PNS_MODE_ROUTE_SINGLE );
} }
int ROUTER_TOOL::RouteDiffPair( TOOL_EVENT& aEvent ) int ROUTER_TOOL::RouteDiffPair( TOOL_EVENT& aEvent )
{ {
m_frame->SetToolID( ID_TRACK_BUTT, wxCURSOR_PENCIL, _( "Router Differential Pair" ) ); m_frame->SetToolID( ID_TRACK_BUTT, wxCURSOR_PENCIL, _( "Router Differential Pair" ) );
return mainLoop( PNS_MODE_ROUTE_DIFF_PAIR ); return mainLoop( PNS_MODE_ROUTE_DIFF_PAIR );
} }
int ROUTER_TOOL::TuneSingleTrace( TOOL_EVENT& aEvent ) int ROUTER_TOOL::TuneSingleTrace( TOOL_EVENT& aEvent )
{ {
m_frame->SetToolID( ID_TRACK_BUTT, wxCURSOR_PENCIL, _( "Tune Track Length" ) ); m_frame->SetToolID( ID_TRACK_BUTT, wxCURSOR_PENCIL, _( "Tune Track Length" ) );
return mainLoop( PNS_MODE_TUNE_SINGLE ); return mainLoop( PNS_MODE_TUNE_SINGLE );
} }
int ROUTER_TOOL::mainLoop( PNS_ROUTER_MODE aMode ) int ROUTER_TOOL::mainLoop( PNS_ROUTER_MODE aMode )
{ {
PCB_EDIT_FRAME* frame = getEditFrame<PCB_EDIT_FRAME>(); PCB_EDIT_FRAME* frame = getEditFrame<PCB_EDIT_FRAME>();
@ -875,6 +879,7 @@ int ROUTER_TOOL::mainLoop( PNS_ROUTER_MODE aMode )
return 0; return 0;
} }
int ROUTER_TOOL::InlineDrag( TOOL_EVENT& aEvent ) int ROUTER_TOOL::InlineDrag( TOOL_EVENT& aEvent )
{ {
return 0; return 0;
@ -919,6 +924,7 @@ int ROUTER_TOOL::InlineDrag ( TOOL_EVENT& aEvent )
} }
void ROUTER_TOOL::performDragging() void ROUTER_TOOL::performDragging()
{ {
PCB_EDIT_FRAME* frame = getEditFrame<PCB_EDIT_FRAME>(); PCB_EDIT_FRAME* frame = getEditFrame<PCB_EDIT_FRAME>();

View File

@ -57,7 +57,6 @@ void ROUTER_PREVIEW_ITEM::Update( const PNS_ITEM* aItem )
{ {
m_originLayer = aItem->Layers().Start(); m_originLayer = aItem->Layers().Start();
if( aItem->OfKind ( PNS_ITEM::LINE ) ) if( aItem->OfKind ( PNS_ITEM::LINE ) )
{ {
const PNS_LINE* l=static_cast<const PNS_LINE*>( aItem ); const PNS_LINE* l=static_cast<const PNS_LINE*>( aItem );

View File

@ -99,7 +99,7 @@ bool EDIT_TOOL::invokeInlineRouter()
if( track || via ) if( track || via )
{ {
printf("Calling interactive drag\n"); //printf("Calling interactive drag\n");
m_toolMgr->RunAction( COMMON_ACTIONS::routerInlineDrag, true ); m_toolMgr->RunAction( COMMON_ACTIONS::routerInlineDrag, true );
return true; return true;
} }
@ -187,11 +187,8 @@ int EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
m_cursor = grid.Align( evt->Position() ); m_cursor = grid.Align( evt->Position() );
isDragAndDrop = evt->IsDrag( BUT_LEFT ); isDragAndDrop = evt->IsDrag( BUT_LEFT );
if( m_dragging ) if( m_dragging )
{ {
m_cursor = grid.BestSnapAnchor( evt->Position(), selection.Item<BOARD_ITEM>( 0 ) ); m_cursor = grid.BestSnapAnchor( evt->Position(), selection.Item<BOARD_ITEM>( 0 ) );
getViewControls()->ForceCursorPosition ( true, m_cursor ); getViewControls()->ForceCursorPosition ( true, m_cursor );
@ -225,7 +222,6 @@ int EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
VECTOR2I origin; VECTOR2I origin;
if( evt->IsDrag( BUT_LEFT ) ) if( evt->IsDrag( BUT_LEFT ) )
mousePos = evt->DragOrigin(); mousePos = evt->DragOrigin();
@ -249,9 +245,7 @@ int EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
{ {
m_offset = static_cast<BOARD_ITEM*>( selection.items.GetPickedItem( 0 ) )->GetPosition() - m_offset = static_cast<BOARD_ITEM*>( selection.items.GetPickedItem( 0 ) )->GetPosition() -
wxPoint( origin.x, origin.y ); wxPoint( origin.x, origin.y );
getViewControls()->ForceCursorPosition( true, origin ); getViewControls()->ForceCursorPosition( true, origin );
} }
controls->SetAutoPan( true ); controls->SetAutoPan( true );
@ -543,7 +537,6 @@ void EDIT_TOOL::remove( BOARD_ITEM* aItem )
if( m_editModules ) if( m_editModules )
{ {
MODULE* module = static_cast<MODULE*>( aItem->GetParent() ); MODULE* module = static_cast<MODULE*>( aItem->GetParent() );
module->SetLastEditTime(); module->SetLastEditTime();
board->m_Status_Pcb = 0; // it is done in the legacy view board->m_Status_Pcb = 0; // it is done in the legacy view
@ -569,6 +562,7 @@ void EDIT_TOOL::remove( BOARD_ITEM* aItem )
DisplayError( getEditFrame<PCB_BASE_FRAME>(), _( "Cannot delete the only remaining pad of the module (modules on PCB must have at least one pad)." ) ); DisplayError( getEditFrame<PCB_BASE_FRAME>(), _( "Cannot delete the only remaining pad of the module (modules on PCB must have at least one pad)." ) );
return; return;
} }
getView()->Remove( aItem ); getView()->Remove( aItem );
board->Remove( aItem ); board->Remove( aItem );
} }
@ -707,6 +701,7 @@ void EDIT_TOOL::processChanges( const PICKED_ITEMS_LIST* aList )
} }
} }
int EDIT_TOOL::editFootprintInFpEditor( const TOOL_EVENT& aEvent ) int EDIT_TOOL::editFootprintInFpEditor( const TOOL_EVENT& aEvent )
{ {
MODULE *mod = uniqueSelected<MODULE>(); MODULE *mod = uniqueSelected<MODULE>();

View File

@ -43,23 +43,25 @@
GRID_HELPER::GRID_HELPER( PCB_BASE_FRAME* aFrame ) : GRID_HELPER::GRID_HELPER( PCB_BASE_FRAME* aFrame ) :
m_frame( aFrame ) m_frame( aFrame )
{ {
} }
GRID_HELPER::~GRID_HELPER() GRID_HELPER::~GRID_HELPER()
{ {
} }
void GRID_HELPER::SetGrid( int aSize ) void GRID_HELPER::SetGrid( int aSize )
{ {
assert( false ); assert( false );
} }
void GRID_HELPER::SetOrigin( const VECTOR2I& aOrigin ) void GRID_HELPER::SetOrigin( const VECTOR2I& aOrigin )
{ {
} }
VECTOR2I GRID_HELPER::GetGrid() VECTOR2I GRID_HELPER::GetGrid()
{ {
PCB_SCREEN* screen = m_frame->GetScreen(); PCB_SCREEN* screen = m_frame->GetScreen();
@ -69,11 +71,13 @@ VECTOR2I GRID_HELPER::GetGrid ()
return VECTOR2I ( KiROUND( size.x ), KiROUND( size.y ) ); return VECTOR2I ( KiROUND( size.x ), KiROUND( size.y ) );
} }
VECTOR2I GRID_HELPER::GetOrigin() VECTOR2I GRID_HELPER::GetOrigin()
{ {
return VECTOR2I( 0, 0 ); return VECTOR2I( 0, 0 );
} }
void GRID_HELPER::SetAuxAxes( bool aEnable, const VECTOR2I aOrigin, bool aEnableDiagonal ) void GRID_HELPER::SetAuxAxes( bool aEnable, const VECTOR2I aOrigin, bool aEnableDiagonal )
{ {
if( aEnable ) if( aEnable )
@ -84,6 +88,7 @@ void GRID_HELPER::SetAuxAxes ( bool aEnable, const VECTOR2I aOrigin, bool aEnabl
m_diagonalAuxAxesEnable = aEnable; m_diagonalAuxAxesEnable = aEnable;
} }
VECTOR2I GRID_HELPER::Align( const VECTOR2I& aPoint ) VECTOR2I GRID_HELPER::Align( const VECTOR2I& aPoint )
{ {
const VECTOR2D gridOffset( GetOrigin () ); const VECTOR2D gridOffset( GetOrigin () );
@ -104,6 +109,7 @@ VECTOR2I GRID_HELPER::Align ( const VECTOR2I& aPoint )
return nearest; return nearest;
} }
VECTOR2I GRID_HELPER::BestDragOrigin( const VECTOR2I &aMousePos, BOARD_ITEM* aItem ) VECTOR2I GRID_HELPER::BestDragOrigin( const VECTOR2I &aMousePos, BOARD_ITEM* aItem )
{ {
clearAnchors(); clearAnchors();
@ -144,6 +150,7 @@ VECTOR2I GRID_HELPER::BestDragOrigin ( const VECTOR2I &aMousePos, BOARD_ITEM *aI
return best ? best->pos : aMousePos; return best ? best->pos : aMousePos;
} }
std::set<BOARD_ITEM*> GRID_HELPER::queryVisible( const BOX2I& aArea ) std::set<BOARD_ITEM*> GRID_HELPER::queryVisible( const BOX2I& aArea )
{ {
std::set<BOARD_ITEM*> items; std::set<BOARD_ITEM*> items;
@ -163,6 +170,7 @@ std::set<BOARD_ITEM *> GRID_HELPER::queryVisible ( const BOX2I& aArea )
return items; return items;
} }
VECTOR2I GRID_HELPER::BestSnapAnchor( const VECTOR2I &aOrigin, BOARD_ITEM* aDraggedItem ) VECTOR2I GRID_HELPER::BestSnapAnchor( const VECTOR2I &aOrigin, BOARD_ITEM* aDraggedItem )
{ {
double worldScale = m_frame->GetGalCanvas()->GetGAL()->GetWorldScale(); double worldScale = m_frame->GetGalCanvas()->GetGAL()->GetWorldScale();
@ -193,11 +201,11 @@ VECTOR2I GRID_HELPER::BestSnapAnchor ( const VECTOR2I &aOrigin, BOARD_ITEM *aDra
return nearestGrid; return nearestGrid;
} }
void GRID_HELPER::computeAnchors( BOARD_ITEM* aItem, const VECTOR2I& aRefPos ) void GRID_HELPER::computeAnchors( BOARD_ITEM* aItem, const VECTOR2I& aRefPos )
{ {
VECTOR2I origin; VECTOR2I origin;
switch( aItem->Type() ) switch( aItem->Type() )
{ {
case PCB_MODULE_T: case PCB_MODULE_T:
@ -219,7 +227,6 @@ void GRID_HELPER::computeAnchors ( BOARD_ITEM *aItem, const VECTOR2I& aRefPos )
VECTOR2I end = dseg->GetEnd(); VECTOR2I end = dseg->GetEnd();
//LAYER_ID layer = dseg->GetLayer(); //LAYER_ID layer = dseg->GetLayer();
switch( dseg->GetShape() ) switch( dseg->GetShape() )
{ {
case S_CIRCLE: case S_CIRCLE:
@ -301,12 +308,11 @@ void GRID_HELPER::computeAnchors ( BOARD_ITEM *aItem, const VECTOR2I& aRefPos )
addAnchor( aItem->GetPosition(), ORIGIN, aItem ); addAnchor( aItem->GetPosition(), ORIGIN, aItem );
default: default:
break; break;
} }
} }
GRID_HELPER::ANCHOR* GRID_HELPER::nearestAnchor( VECTOR2I aPos, int aFlags, LSET aMatchLayers ) GRID_HELPER::ANCHOR* GRID_HELPER::nearestAnchor( VECTOR2I aPos, int aFlags, LSET aMatchLayers )
{ {
double minDist = std::numeric_limits<double>::max(); double minDist = std::numeric_limits<double>::max();
@ -330,5 +336,4 @@ GRID_HELPER::ANCHOR* GRID_HELPER::nearestAnchor ( VECTOR2I aPos, int aFlags, LSE
} }
return best; return best;
} }

View File

@ -54,7 +54,6 @@ public:
VECTOR2I BestSnapAnchor ( const VECTOR2I &aOrigin, BOARD_ITEM* aDraggedItem ); VECTOR2I BestSnapAnchor ( const VECTOR2I &aOrigin, BOARD_ITEM* aDraggedItem );
private: private:
enum ANCHOR_FLAGS { enum ANCHOR_FLAGS {
CORNER = 0x1, CORNER = 0x1,
OUTLINE = 0x2, OUTLINE = 0x2,

View File

@ -36,7 +36,6 @@
#include <class_pcb_text.h> #include <class_pcb_text.h>
#include <class_drawsegment.h> #include <class_drawsegment.h>
#include <wxPcbStruct.h> #include <wxPcbStruct.h>
#include <collectors.h> #include <collectors.h>
#include <confirm.h> #include <confirm.h>
@ -295,7 +294,6 @@ bool SELECTION_TOOL::selectCursor( const VECTOR2I& aWhere, bool aOnDrag )
return true; return true;
default: default:
// Apply some ugly heuristics to avoid disambiguation menus whenever possible // Apply some ugly heuristics to avoid disambiguation menus whenever possible
guessSelectionCandidates( collector ); guessSelectionCandidates( collector );
@ -414,6 +412,7 @@ void SELECTION_TOOL::setTransitions()
Go( &SELECTION_TOOL::findMove, COMMON_ACTIONS::findMove.MakeEvent() ); Go( &SELECTION_TOOL::findMove, COMMON_ACTIONS::findMove.MakeEvent() );
} }
SELECTION_LOCK_FLAGS SELECTION_TOOL::CheckLock() SELECTION_LOCK_FLAGS SELECTION_TOOL::CheckLock()
{ {
if( !m_locked || m_editModules ) if( !m_locked || m_editModules )
@ -521,6 +520,7 @@ void SELECTION_TOOL::findCallback( BOARD_ITEM* aItem )
{ {
clearSelection(); clearSelection();
select( aItem ); select( aItem );
getView()->SetCenter( VECTOR2D( aItem->GetPosition() ) );
// Inform other potentially interested tools // Inform other potentially interested tools
m_toolMgr->ProcessEvent( SelectedEvent ); m_toolMgr->ProcessEvent( SelectedEvent );
@ -742,6 +742,7 @@ bool SELECTION_TOOL::selectable( const BOARD_ITEM* aItem ) const
case PCB_MODULE_TEXT_T: case PCB_MODULE_TEXT_T:
if( m_multiple && !m_editModules ) if( m_multiple && !m_editModules )
return false; return false;
return aItem->ViewIsVisible() && board->IsLayerVisible( aItem->GetLayer() ); return aItem->ViewIsVisible() && board->IsLayerVisible( aItem->GetLayer() );
// These are not selectable // These are not selectable
@ -897,6 +898,7 @@ void SELECTION_TOOL::highlightNet( const VECTOR2I& aPoint )
} }
} }
static double calcArea( BOARD_ITEM* aItem ) static double calcArea( BOARD_ITEM* aItem )
{ {
switch( aItem -> Type() ) switch( aItem -> Type() )
@ -915,6 +917,7 @@ static double calcArea ( BOARD_ITEM *aItem )
} }
} }
static double calcMinArea( GENERAL_COLLECTOR& aCollector, KICAD_T aType ) static double calcMinArea( GENERAL_COLLECTOR& aCollector, KICAD_T aType )
{ {
double best = std::numeric_limits<double>::max(); double best = std::numeric_limits<double>::max();
@ -933,6 +936,7 @@ static double calcMinArea ( GENERAL_COLLECTOR& aCollector, KICAD_T aType )
return best; return best;
} }
static double calcMaxArea( GENERAL_COLLECTOR& aCollector, KICAD_T aType ) static double calcMaxArea( GENERAL_COLLECTOR& aCollector, KICAD_T aType )
{ {
double best = 0.0; double best = 0.0;
@ -948,6 +952,7 @@ static double calcMaxArea ( GENERAL_COLLECTOR& aCollector, KICAD_T aType )
return best; return best;
} }
double calcRatio( double a, double b ) double calcRatio( double a, double b )
{ {
if ( a == 0.0 && b == 0.0 ) if ( a == 0.0 && b == 0.0 )
@ -958,6 +963,7 @@ double calcRatio ( double a, double b )
return a / b; return a / b;
} }
// todo: explain the selection heuristics // todo: explain the selection heuristics
void SELECTION_TOOL::guessSelectionCandidates( GENERAL_COLLECTOR& aCollector ) const void SELECTION_TOOL::guessSelectionCandidates( GENERAL_COLLECTOR& aCollector ) const
{ {
@ -1012,10 +1018,11 @@ void SELECTION_TOOL::guessSelectionCandidates( GENERAL_COLLECTOR& aCollector ) c
if( item->Type() == PCB_MODULE_T && areaRatio < textToFootprintMinRatio ) if( item->Type() == PCB_MODULE_T && areaRatio < textToFootprintMinRatio )
{ {
printf("rejectModuleN\n"); //printf("rejectModuleN\n");
rejected.insert( item ); rejected.insert( item );
} }
switch( item->Type() ) switch( item->Type() )
{ {
case PCB_TRACE_T: case PCB_TRACE_T:
@ -1025,7 +1032,7 @@ void SELECTION_TOOL::guessSelectionCandidates( GENERAL_COLLECTOR& aCollector ) c
case PCB_MODULE_T: case PCB_MODULE_T:
if( areaRatio > textToFeatureMinRatio ) if( areaRatio > textToFeatureMinRatio )
{ {
printf("t after moduleRejected\n"); //printf("t after moduleRejected\n");
rejected.insert( txt ); rejected.insert( txt );
} }
break; break;
@ -1041,7 +1048,6 @@ void SELECTION_TOOL::guessSelectionCandidates( GENERAL_COLLECTOR& aCollector ) c
double minArea = calcMinArea( aCollector, PCB_MODULE_T ); double minArea = calcMinArea( aCollector, PCB_MODULE_T );
double maxArea = calcMaxArea( aCollector, PCB_MODULE_T ); double maxArea = calcMaxArea( aCollector, PCB_MODULE_T );
if( calcRatio( minArea, maxArea ) <= footprintAreaRatio ) if( calcRatio( minArea, maxArea ) <= footprintAreaRatio )
{ {
for( int i = 0; i < aCollector.GetCount(); ++i ) for( int i = 0; i < aCollector.GetCount(); ++i )
@ -1051,7 +1057,7 @@ void SELECTION_TOOL::guessSelectionCandidates( GENERAL_COLLECTOR& aCollector ) c
if( normalizedArea > footprintAreaRatio ) if( normalizedArea > footprintAreaRatio )
{ {
printf("rejectModule1\n"); //printf("rejectModule1\n");
rejected.insert( mod ); rejected.insert( mod );
} }
@ -1062,6 +1068,7 @@ void SELECTION_TOOL::guessSelectionCandidates( GENERAL_COLLECTOR& aCollector ) c
if( aCollector.CountType ( PCB_PAD_T ) > 0 ) if( aCollector.CountType ( PCB_PAD_T ) > 0 )
{ {
for( int i = 0; i < aCollector.GetCount(); ++i ) for( int i = 0; i < aCollector.GetCount(); ++i )
{
if ( D_PAD* pad = dyn_cast<D_PAD*>( aCollector[i] ) ) if ( D_PAD* pad = dyn_cast<D_PAD*>( aCollector[i] ) )
{ {
double ratio = pad->GetParent()->PadCoverageRatio(); double ratio = pad->GetParent()->PadCoverageRatio();
@ -1070,10 +1077,12 @@ void SELECTION_TOOL::guessSelectionCandidates( GENERAL_COLLECTOR& aCollector ) c
rejected.insert( pad->GetParent() ); rejected.insert( pad->GetParent() );
} }
} }
}
if( aCollector.CountType( PCB_VIA_T ) > 0 ) if( aCollector.CountType( PCB_VIA_T ) > 0 )
{ {
for( int i = 0; i < aCollector.GetCount(); ++i ) for( int i = 0; i < aCollector.GetCount(); ++i )
{
if( VIA* via = dyn_cast<VIA*>( aCollector[i] ) ) if( VIA* via = dyn_cast<VIA*>( aCollector[i] ) )
{ {
double viaArea = calcArea( via ); double viaArea = calcArea( via );
@ -1102,6 +1111,7 @@ void SELECTION_TOOL::guessSelectionCandidates( GENERAL_COLLECTOR& aCollector ) c
} }
} }
} }
}
int nTracks = aCollector.CountType ( PCB_TRACE_T ); int nTracks = aCollector.CountType ( PCB_TRACE_T );
@ -1124,14 +1134,18 @@ void SELECTION_TOOL::guessSelectionCandidates( GENERAL_COLLECTOR& aCollector ) c
} }
if( maxLength > 0.0 && minLength/maxLength < trackTrackLengthRatio && nTracks > 1 ) if( maxLength > 0.0 && minLength/maxLength < trackTrackLengthRatio && nTracks > 1 )
{
for( int i = 0; i < aCollector.GetCount(); ++i ) for( int i = 0; i < aCollector.GetCount(); ++i )
{
if( TRACK* track = dyn_cast<TRACK*>( aCollector[i] ) ) if( TRACK* track = dyn_cast<TRACK*>( aCollector[i] ) )
{ {
double ratio = std::max( (double) track->GetWidth(), track->GetLength()) / maxLength; double ratio = std::max( (double) track->GetWidth(), track->GetLength()) / maxLength;
if( ratio > trackTrackLengthRatio ) if( ratio > trackTrackLengthRatio )
rejected.insert( track) ; rejected.insert( track) ;
} }
}
}
for( int j = 0; j < aCollector.GetCount(); ++j ) for( int j = 0; j < aCollector.GetCount(); ++j )
{ {
@ -1141,28 +1155,28 @@ void SELECTION_TOOL::guessSelectionCandidates( GENERAL_COLLECTOR& aCollector ) c
if( ratio < modulePadMinCoverRatio ) if( ratio < modulePadMinCoverRatio )
{ {
printf("rejectModule\n"); //printf("rejectModule\n");
rejected.insert( mod ); rejected.insert( mod );
} }
} }
} }
} }
BOOST_FOREACH( BOARD_ITEM* item, rejected ) BOOST_FOREACH( BOARD_ITEM* item, rejected )
{ {
aCollector.Remove( item ); aCollector.Remove( item );
} }
printf("Post-selection: %d\n", aCollector.GetCount() );
//printf("Post-selection: %d\n", aCollector.GetCount() );
} }
bool SELECTION_TOOL::SanitizeSelection() bool SELECTION_TOOL::SanitizeSelection()
{ {
std::set<BOARD_ITEM*> rejected; std::set<BOARD_ITEM*> rejected;
if( !m_editModules ) if( !m_editModules )
{ {
for( unsigned int i = 0; i < m_selection.items.GetCount(); ++i ) for( unsigned int i = 0; i < m_selection.items.GetCount(); ++i )
{ {
BOARD_ITEM* item = m_selection.Item<BOARD_ITEM>( i ); BOARD_ITEM* item = m_selection.Item<BOARD_ITEM>( i );
@ -1185,8 +1199,8 @@ bool SELECTION_TOOL::SanitizeSelection()
while( !rejected.empty () ) while( !rejected.empty () )
{ {
BOARD_ITEM* item = *rejected.begin(); BOARD_ITEM* item = *rejected.begin();
int itemIdx = m_selection.items.FindItem( item ); int itemIdx = m_selection.items.FindItem( item );
if( itemIdx >= 0 ) if( itemIdx >= 0 )
m_selection.items.RemovePicker( itemIdx ); m_selection.items.RemovePicker( itemIdx );
@ -1196,6 +1210,7 @@ bool SELECTION_TOOL::SanitizeSelection()
return true; return true;
} }
void SELECTION_TOOL::generateMenu() void SELECTION_TOOL::generateMenu()
{ {
// Create a copy of the master context menu // Create a copy of the master context menu
@ -1225,7 +1240,6 @@ void SELECTION::clear()
} }
const TOOL_EVENT SELECTION_TOOL::SelectedEvent( TC_MESSAGE, TA_ACTION, "pcbnew.InteractiveSelection.selected" ); const TOOL_EVENT SELECTION_TOOL::SelectedEvent( TC_MESSAGE, TA_ACTION, "pcbnew.InteractiveSelection.selected" );
const TOOL_EVENT SELECTION_TOOL::UnselectedEvent( TC_MESSAGE, TA_ACTION, "pcbnew.InteractiveSelection.unselected" ); const TOOL_EVENT SELECTION_TOOL::UnselectedEvent( TC_MESSAGE, TA_ACTION, "pcbnew.InteractiveSelection.unselected" );
const TOOL_EVENT SELECTION_TOOL::ClearedEvent( TC_MESSAGE, TA_ACTION, "pcbnew.InteractiveSelection.cleared" ); const TOOL_EVENT SELECTION_TOOL::ClearedEvent( TC_MESSAGE, TA_ACTION, "pcbnew.InteractiveSelection.cleared" );

View File

@ -1,3 +1,27 @@
/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2015 CERN
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* 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 Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <io_mgr.h> #include <io_mgr.h>
#include <tool/tool_manager.h> #include <tool/tool_manager.h>

View File

@ -486,7 +486,6 @@ void PCB_EDIT_FRAME::Exchange_Module( MODULE* aOldModule,
m_toolManager->RunAction( COMMON_ACTIONS::selectionClear, true ); m_toolManager->RunAction( COMMON_ACTIONS::selectionClear, true );
GetGalCanvas()->ForceRefresh(); GetGalCanvas()->ForceRefresh();
} }
} }
else else