[pns] Make the placer algo draw debugging stuff by relying on a new PNS_DEBUG_DECORATOR, this removes a reversed dependency b/w PNS_ROUTER and PNS_ALGO Tom: some rework of the patch

This commit is contained in:
Christian Gagneraud 2016-08-15 17:16:48 +02:00 committed by Maciej Suminski
parent e9a2cb0642
commit 7e0caf7abe
15 changed files with 185 additions and 60 deletions

View File

@ -19,6 +19,7 @@
*/
#include "pns_algo_base.h"
#include "pns_debug_decorator.h"
#include "pns_router.h"
PNS_ROUTING_SETTINGS& PNS_ALGO_BASE::Settings() const

View File

@ -21,12 +21,11 @@
#ifndef __PNS_ALGO_BASE_H
#define __PNS_ALGO_BASE_H
#include <wx/wx.h> // for wxString
#include "pns_routing_settings.h"
class PNS_ROUTER;
class PNS_LOGGER;
class PNS_DEBUG_DECORATOR;
/**
* Class PNS_ALGO_BASE
@ -55,7 +54,23 @@ public:
///> Returns the logger object, allowing to dump geometry to a file.
virtual PNS_LOGGER* Logger();
/**
* Function SetDebugDecorator
*
* Assign a debug decorator allowing this algo to draw extra graphics for visual debugging
*/
void SetDebugDecorator( PNS_DEBUG_DECORATOR *aDecorator )
{
m_debugDecorator = aDecorator;
}
PNS_DEBUG_DECORATOR *Dbg() const
{
return m_debugDecorator;
}
private:
PNS_DEBUG_DECORATOR *m_debugDecorator;
PNS_ROUTER* m_router;
};

View File

@ -35,6 +35,7 @@
#include "pns_diff_pair_placer.h"
#include "pns_solid.h"
#include "pns_topology.h"
#include "pns_debug_decorator.h"
using boost::optional;
@ -826,12 +827,12 @@ void PNS_DIFF_PAIR_PLACER::updateLeadingRatLine()
if( topo.LeadingRatLine( &m_currentTrace.PLine(), ratLineP ) )
{
Router()->DisplayDebugLine( ratLineP, 1, 10000 );
Dbg()->AddLine( ratLineP, 1, 10000 );
}
if( topo.LeadingRatLine ( &m_currentTrace.NLine(), ratLineN ) )
{
Router()->DisplayDebugLine( ratLineN, 3, 10000 );
Dbg()->AddLine( ratLineN, 3, 10000 );
}
}

View File

@ -207,13 +207,13 @@ bool PNS_DP_MEANDER_PLACER::Move( const VECTOR2I& aP, PNS_ITEM* aEndItem )
for( const PNS_ITEM* item : m_tunedPathP.CItems() )
{
if( const PNS_LINE* l = dyn_cast<const PNS_LINE*>( item ) )
Router()->DisplayDebugLine( l->CLine(), 5, 10000 );
Dbg()->AddLine( l->CLine(), 5, 10000 );
}
for( const PNS_ITEM* item : m_tunedPathN.CItems() )
{
if( const PNS_LINE* l = dyn_cast<const PNS_LINE*>( item ) )
Router()->DisplayDebugLine( l->CLine(), 5, 10000 );
Dbg()->AddLine( l->CLine(), 5, 10000 );
}
int curIndexP = 0, curIndexN = 0;
@ -222,7 +222,7 @@ bool PNS_DP_MEANDER_PLACER::Move( const VECTOR2I& aP, PNS_ITEM* aEndItem )
{
SEG base = baselineSegment( sp );
DrawDebugSeg( base, 3 );
Dbg()->AddSegment( base, 3 );
while( sp.indexP >= curIndexP )
{

View File

@ -33,11 +33,9 @@
#include "pns_meander.h"
#include "pns_meander_placer_base.h"
#include "pns_diff_pair.h"
#include "pns_debug_decorator.h"
class PNS_ROUTER;
class PNS_SHOVE;
class PNS_OPTIMIZER;
class PNS_ROUTER_BASE;
/**
* Class PNS_DP_MEANDER_PLACER

View File

@ -1,7 +1,7 @@
/*
* KiRouter - a push-and-(sometimes-)shove PCB router
*
* Copyright (C) 2013-2014 CERN
* Copyright (C) 2013-2016 CERN
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software: you can redistribute it and/or modify it
@ -56,6 +56,7 @@
#include "pns_node.h"
#include "pns_topology.h"
#include "pns_router.h"
#include "pns_debug_decorator.h"
#include "router_preview_item.h"
class PNS_PCBNEW_RULE_RESOLVER : public PNS_RULE_RESOLVER
@ -248,11 +249,8 @@ bool PNS_PCBNEW_RULE_RESOLVER::DpNetPair( PNS_ITEM* aItem, int& aNetP, int& aNet
wxString netNameP = aItem->Parent()->GetNet()->GetNetname();
wxString netNameN, netNameCoupled, netNameBase;
bool refIsP = false;
int r = matchDpSuffix ( netNameP, netNameCoupled, netNameBase );
printf("matchDpSuffix %d\n", r);
if( r == 0 )
return false;
else if( r == 1 )
@ -281,22 +279,140 @@ bool PNS_PCBNEW_RULE_RESOLVER::DpNetPair( PNS_ITEM* aItem, int& aNetP, int& aNet
return true;
}
class PNS_PCBNEW_DEBUG_DECORATOR: public PNS_DEBUG_DECORATOR
{
public:
PNS_PCBNEW_DEBUG_DECORATOR( KIGFX::VIEW *aView = NULL ): PNS_DEBUG_DECORATOR(),
m_view( NULL ), m_items( NULL )
{
SetView ( aView );
}
~PNS_PCBNEW_DEBUG_DECORATOR()
{
Clear();
}
void SetView( KIGFX::VIEW *aView )
{
Clear();
delete m_items;
m_items = NULL;
m_view = aView;
if ( m_view == NULL )
return;
m_items = new KIGFX::VIEW_GROUP( m_view );
m_items->SetLayer( ITEM_GAL_LAYER( GP_OVERLAY ) );
m_view->Add( m_items );
m_items->ViewSetVisible( true );
}
void AddPoint( VECTOR2I aP, int aColor ) override
{
SHAPE_LINE_CHAIN l;
l.Append( aP - VECTOR2I( -50000, -50000 ) );
l.Append( aP + VECTOR2I( -50000, -50000 ) );
AddLine ( l, aColor, 10000 );
l.Clear();
l.Append( aP - VECTOR2I( 50000, -50000 ) );
l.Append( aP + VECTOR2I( 50000, -50000 ) );
AddLine( l, aColor, 10000 );
}
void AddBox( BOX2I aB, int aColor ) override
{
SHAPE_LINE_CHAIN l;
VECTOR2I o = aB.GetOrigin();
VECTOR2I s = aB.GetSize();
l.Append( o );
l.Append( o.x + s.x, o.y );
l.Append( o.x + s.x, o.y + s.y );
l.Append( o.x, o.y + s.y );
l.Append( o );
AddLine( l, aColor, 10000 );
}
void AddSegment( SEG aS, int aColor ) override
{
SHAPE_LINE_CHAIN l;
l.Append( aS.A );
l.Append( aS.B );
AddLine( l, aColor, 10000 );
}
void AddDirections( VECTOR2D aP, int aMask, int aColor ) override
{
BOX2I b( aP - VECTOR2I( 10000, 10000 ), VECTOR2I( 20000, 20000 ) );
AddBox( b, aColor );
for( int i = 0; i < 8; i++ )
{
if( ( 1 << i ) & aMask )
{
VECTOR2I v = DIRECTION_45( ( DIRECTION_45::Directions ) i ).ToVector() * 100000;
AddSegment( SEG( aP, aP + v ), aColor );
}
}
}
void AddLine( const SHAPE_LINE_CHAIN& aLine, int aType, int aWidth ) override
{
ROUTER_PREVIEW_ITEM* pitem = new ROUTER_PREVIEW_ITEM( NULL, m_items );
pitem->Line( aLine, aWidth, aType );
m_items->Add( pitem ); // Should not be needed, as m_items has been passed as a parent group in alloc;
pitem->ViewSetVisible( true );
m_items->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY | KIGFX::VIEW_ITEM::APPEARANCE );
}
void Clear() override
{
if (m_view && m_items)
{
m_items->FreeItems();
m_items->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
}
}
private:
KIGFX::VIEW* m_view;
KIGFX::VIEW_GROUP* m_items;
};
PNS_DEBUG_DECORATOR* PNS_KICAD_IFACE::GetDebugDecorator()
{
return m_debugDecorator;
}
PNS_KICAD_IFACE::PNS_KICAD_IFACE ()
{
m_ruleResolver = nullptr;
m_board = NULL;
m_frame = NULL;
m_view = NULL;
m_board = nullptr;
m_frame = nullptr;
m_view = nullptr;
m_previewItems = nullptr;
m_world = nullptr;
m_router = nullptr;
m_debugDecorator = nullptr;
}
PNS_KICAD_IFACE::~PNS_KICAD_IFACE ()
{
if( m_ruleResolver )
delete m_ruleResolver;
if( m_debugDecorator )
delete m_debugDecorator;
}
@ -607,6 +723,9 @@ void PNS_KICAD_IFACE::SyncWorld( PNS_NODE *aWorld )
else if( type == PCB_VIA_T )
item = syncVia( static_cast<VIA*>( t ) );
if( t->IsLocked() )
item->Mark ( MK_LOCKED );
if( item )
aWorld->Add( item );
}
@ -634,10 +753,15 @@ void PNS_KICAD_IFACE::EraseView()
m_previewItems->FreeItems();
m_previewItems->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
}
if(m_debugDecorator)
m_debugDecorator->Clear();
}
void PNS_KICAD_IFACE::DisplayItem( const PNS_ITEM* aItem, int aColor, int aClearance )
{
printf("DisplayItem %p\n", aItem);
ROUTER_PREVIEW_ITEM* pitem = new ROUTER_PREVIEW_ITEM( aItem, m_previewItems );
if( aColor >= 0 )
@ -738,6 +862,7 @@ void PNS_KICAD_IFACE::Commit()
void PNS_KICAD_IFACE::SetView ( KIGFX::VIEW *aView )
{
printf("SetView %p\n", aView);
if( m_previewItems )
{
m_previewItems->FreeItems();
@ -749,6 +874,12 @@ void PNS_KICAD_IFACE::SetView ( KIGFX::VIEW *aView )
m_previewItems->SetLayer( ITEM_GAL_LAYER( GP_OVERLAY ) );
m_view->Add( m_previewItems );
m_previewItems->ViewSetVisible( true );
if( m_debugDecorator )
delete m_debugDecorator;
m_debugDecorator = new PNS_PCBNEW_DEBUG_DECORATOR();
m_debugDecorator->SetView ( m_view );
}
void PNS_KICAD_IFACE::UpdateNet ( int aNetCode )

View File

@ -17,7 +17,7 @@
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __PNS_KICAD_IFACE_H
#define __PNS_KICAD_IFACE_H
@ -26,6 +26,7 @@
#include "pns_router.h"
class PNS_PCBNEW_RULE_RESOLVER;
class PNS_PCBNEW_DEBUG_DECORATOR;
class BOARD;
@ -55,10 +56,12 @@ public:
void UpdateNet ( int aNetCode );
PNS_RULE_RESOLVER* GetRuleResolver();
PNS_DEBUG_DECORATOR* GetDebugDecorator();
private:
PNS_PCBNEW_RULE_RESOLVER* m_ruleResolver;
PNS_PCBNEW_DEBUG_DECORATOR* m_debugDecorator;
PNS_ITEM* syncPad( D_PAD* aPad );
PNS_ITEM* syncTrack( TRACK* aTrack );

View File

@ -29,6 +29,7 @@
#include "pns_utils.h"
#include "pns_router.h"
#include "pns_topology.h"
#include "pns_debug_decorator.h"
#include <class_board_item.h>
@ -1026,7 +1027,7 @@ void PNS_LINE_PLACER::updateLeadingRatLine()
PNS_TOPOLOGY topo( m_lastNode );
if( topo.LeadingRatLine( &current, ratLine ) )
Router()->DisplayDebugLine( ratLine, 5, 10000 );
Dbg()->AddLine( ratLine, 5, 10000 );
}

View File

@ -27,6 +27,7 @@
#include "pns_topology.h"
#include "pns_meander_placer.h"
#include "pns_router.h"
#include "pns_debug_decorator.h"
PNS_MEANDER_PLACER::PNS_MEANDER_PLACER( PNS_ROUTER* aRouter ) :
@ -149,7 +150,7 @@ bool PNS_MEANDER_PLACER::doMove( const VECTOR2I& aP, PNS_ITEM* aEndItem, int aTa
{
if( const PNS_LINE* l = dyn_cast<const PNS_LINE*>( item ) )
{
Router()->DisplayDebugLine( l->CLine(), 5, 30000 );
Dbg()->AddLine( l->CLine(), 5, 30000 );
}
}

View File

@ -28,6 +28,7 @@
#include "pns_meander_skew_placer.h"
#include "pns_router.h"
#include "pns_debug_decorator.h"
PNS_MEANDER_SKEW_PLACER::PNS_MEANDER_SKEW_PLACER ( PNS_ROUTER* aRouter ) :
@ -130,13 +131,13 @@ bool PNS_MEANDER_SKEW_PLACER::Move( const VECTOR2I& aP, PNS_ITEM* aEndItem )
for( const PNS_ITEM* item : m_tunedPathP.CItems() )
{
if( const PNS_LINE* l = dyn_cast<const PNS_LINE*>( item ) )
Router()->DisplayDebugLine( l->CLine(), 5, 10000 );
Dbg()->AddLine( l->CLine(), 5, 10000 );
}
for( const PNS_ITEM* item : m_tunedPathN.CItems() )
{
if( const PNS_LINE* l = dyn_cast<const PNS_LINE*>( item ) )
Router()->DisplayDebugLine( l->CLine(), 4, 10000 );
Dbg()->AddLine( l->CLine(), 4, 10000 );
}
return doMove( aP, aEndItem, m_coupledLength + m_settings.m_targetSkew );
@ -168,4 +169,3 @@ const wxString PNS_MEANDER_SKEW_PLACER::TuningInfo() const
return status;
}

View File

@ -298,7 +298,7 @@ int LINE_RESTRICTIONS::allowedAngles( PNS_NODE* aWorld, const PNS_LINE* aLine, c
}
}
DrawDebugDirs( aP, outputMask, 3 );
//DrawDebugDirs( aP, outputMask, 3 );
return 0xff;
}

View File

@ -206,6 +206,7 @@ bool PNS_ROUTER::StartDragging( const VECTOR2I& aP, PNS_ITEM* aStartItem )
m_dragger = new PNS_DRAGGER( this );
m_dragger->SetWorld( m_world );
m_dragger->SetDebugDecorator ( m_iface->GetDebugDecorator () );
if( m_dragger->Start ( aP, aStartItem ) )
m_state = DRAG_SEGMENT;
@ -245,6 +246,7 @@ bool PNS_ROUTER::StartRouting( const VECTOR2I& aP, PNS_ITEM* aStartItem, int aLa
m_placer->UpdateSizes ( m_sizes );
m_placer->SetLayer( aLayer );
m_placer->SetDebugDecorator ( m_iface->GetDebugDecorator () );
bool rv = m_placer->Start( aP, aStartItem );
@ -263,28 +265,6 @@ void PNS_ROUTER::DisplayItems( const PNS_ITEMSET& aItems )
m_iface->DisplayItem( item );
}
void PNS_ROUTER::DisplayDebugLine( const SHAPE_LINE_CHAIN& aLine, int aType, int aWidth )
{
/* ROUTER_PREVIEW_ITEM* pitem = new ROUTER_PREVIEW_ITEM( NULL, m_previewItems );
pitem->Line( aLine, aWidth, aType );
m_previewItems->Add( pitem );
pitem->ViewSetVisible( true );
m_previewItems->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY | KIGFX::VIEW_ITEM::APPEARANCE );*/
}
void PNS_ROUTER::DisplayDebugPoint( const VECTOR2I aPos, int aType )
{
/* ROUTER_PREVIEW_ITEM* pitem = new ROUTER_PREVIEW_ITEM( NULL, m_previewItems );
pitem->Point( aPos, aType );
m_previewItems->Add( pitem );
pitem->ViewSetVisible( true );
m_previewItems->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY | KIGFX::VIEW_ITEM::APPEARANCE );*/
}
void PNS_ROUTER::Move( const VECTOR2I& aP, PNS_ITEM* endItem )
{
m_currentEnd = aP;

View File

@ -35,12 +35,8 @@
#include "pns_itemset.h"
#include "pns_node.h"
class BOARD;
class BOARD_ITEM;
class D_PAD;
class TRACK;
class VIA;
class GRID_HELPER;
class PNS_DEBUG_DECORATOR;
class PNS_NODE;
class PNS_DIFF_PAIR_PLACER;
class PNS_PLACEMENT_ALGO;
@ -95,6 +91,8 @@ enum PNS_ROUTER_MODE {
virtual void UpdateNet ( int aNetCode ) = 0;
virtual PNS_RULE_RESOLVER* GetRuleResolver() = 0;
virtual PNS_DEBUG_DECORATOR* GetDebugDecorator() = 0;
};
class PNS_ROUTER
@ -140,12 +138,7 @@ public:
void DisplayItem( const PNS_ITEM* aItem, int aColor = -1, int aClearance = -1 );
void DisplayItems( const PNS_ITEMSET& aItems );
void DisplayDebugLine( const SHAPE_LINE_CHAIN& aLine, int aType = 0, int aWidth = 0 );
void DisplayDebugPoint( const VECTOR2I aPos, int aType = 0 );
void DisplayDebugBox( const BOX2I& aBox, int aType = 0, int aWidth = 0 );
void DeleteTraces( PNS_ITEM *aStartItem, bool aWholeTrack );
void SwitchLayer( int layer );
void ToggleViaPlacement();
@ -278,7 +271,6 @@ private:
VECTOR2I m_currentEnd;
RouterState m_state;
//BOARD* m_board;
PNS_NODE* m_world;
PNS_NODE* m_lastNode;
PNS_PLACEMENT_ALGO * m_placer;

View File

@ -163,7 +163,7 @@ SHAPE_RECT ApproximateSegmentAsRect( const SHAPE_SEGMENT& aSeg )
std::abs( p1.x - p0.x ), std::abs( p1.y - p0.y ) );
}
#if 0
void DrawDebugPoint( VECTOR2I aP, int aColor )
{
SHAPE_LINE_CHAIN l;
@ -223,7 +223,7 @@ void DrawDebugDirs( VECTOR2D aP, int aMask, int aColor )
}
}
}
#endif
OPT_BOX2I ChangedArea( const PNS_ITEM* aItemA, const PNS_ITEM* aItemB )
{

View File

@ -52,11 +52,13 @@ const SHAPE_LINE_CHAIN ConvexHull( const SHAPE_CONVEX& convex, int aClearance );
SHAPE_RECT ApproximateSegmentAsRect( const SHAPE_SEGMENT& aSeg );
#if 0
void DrawDebugPoint( VECTOR2I aP, int aColor );
void DrawDebugBox( BOX2I aB, int aColor );
void DrawDebugSeg( SEG aS, int aColor );
void DrawDebugDirs( VECTOR2D aP, int aMask, int aColor );
#endif
OPT_BOX2I ChangedArea( const PNS_ITEM* aItemA, const PNS_ITEM* aItemB );
#endif // __PNS_UTILS_H