Hide temporarily ratsnest when it is too complex for real-time calculation

This commit is contained in:
Maciej Suminski 2017-08-01 15:20:40 +02:00
parent 1ac34b44bf
commit f303bf2999
6 changed files with 87 additions and 14 deletions

View File

@ -275,7 +275,12 @@ void CONNECTIVITY_DATA::ComputeDynamicRatsnest( const std::vector<BOARD_ITEM*>&
void CONNECTIVITY_DATA::ClearDynamicRatsnest()
{
m_connAlgo->ForEachAnchor( [] (CN_ANCHOR_PTR anchor ) { anchor->SetNoLine( false ); } );
HideDynamicRatsnest();
}
void CONNECTIVITY_DATA::HideDynamicRatsnest()
{
m_dynamicConnectivity.reset();
m_dynamicRatsnest.clear();
}

View File

@ -164,11 +164,16 @@ public:
/**
* Function ClearDynamicRatsnest()
* Erases the temporary dynamic ratsnest (i.e. the ratsnest lines that)
* pcbnew displays when moving an item/set of items
* Erases the temporary dynamic ratsnest (i.e. the ratsnest lines that
* pcbnew displays when moving an item/set of items)
*/
void ClearDynamicRatsnest();
/**
* Hides the temporary dynamic ratsnest lines.
*/
void HideDynamicRatsnest();
/**
* Function ComputeDynamicRatsnest()
* Calculates the temporary dynamic ratsnest (i.e. the ratsnest lines that)

View File

@ -375,6 +375,13 @@ bool PCB_DRAW_PANEL_GAL::SwitchBackend( GAL_TYPE aGalType )
}
void PCB_DRAW_PANEL_GAL::RedrawRatsnest()
{
if( m_ratsnest )
m_view->Update( m_ratsnest.get() );
}
void PCB_DRAW_PANEL_GAL::setDefaultLayerDeps()
{
// caching makes no sense for Cairo and other software renderers

View File

@ -99,6 +99,9 @@ public:
bool SwitchBackend( GAL_TYPE aGalType ) override;
///> Forces refresh of the ratsnest visual representation
void RedrawRatsnest();
protected:
///> Reassigns layer order to the initial settings.
void setDefaultLayerOrder();

View File

@ -39,7 +39,7 @@
#include <wxPcbStruct.h>
#include <class_board.h>
#include <class_zone.h>
#include <class_draw_panel_gal.h>
#include <pcb_draw_panel_gal.h>
#include <class_module.h>
#include <class_mire.h>
#include <connectivity.h>
@ -53,6 +53,7 @@
#include <view/view_group.h>
#include <view/view_controls.h>
#include <origin_viewitem.h>
#include <profile.h>
#include <tools/tool_event_utils.h>
@ -239,6 +240,7 @@ PCB_EDITOR_CONTROL::PCB_EDITOR_CONTROL() :
m_placeOrigin.reset( new KIGFX::ORIGIN_VIEWITEM( KIGFX::COLOR4D( 0.8, 0.0, 0.0, 1.0 ),
KIGFX::ORIGIN_VIEWITEM::CIRCLE_CROSS ) );
m_probingSchToPcb = false;
m_slowRatsnest = false;
}
@ -309,6 +311,10 @@ bool PCB_EDITOR_CONTROL::Init()
menu.AddMenu( zoneMenu.get(), false, toolActiveFunctor( DRAWING_TOOL::MODE::ZONE ) );
}
m_ratsnestTimer.SetOwner( this );
Connect( m_ratsnestTimer.GetId(), wxEVT_TIMER,
wxTimerEventHandler( PCB_EDITOR_CONTROL::ratsnestTimer ), NULL, this );
return true;
}
@ -1138,21 +1144,32 @@ int PCB_EDITOR_CONTROL::UpdateSelectionRatsnest( const TOOL_EVENT& aEvent )
{
auto selectionTool = m_toolMgr->GetTool<SELECTION_TOOL>();
auto& selection = selectionTool->GetSelection();
auto connectivity = getModel<BOARD>()->GetConnectivity();
if( selection.Empty() )
{
getModel<BOARD>()->GetConnectivity()->ClearDynamicRatsnest();
connectivity->ClearDynamicRatsnest();
}
else if( m_slowRatsnest )
{
// Compute ratsnest only when user stops dragging for a moment
connectivity->HideDynamicRatsnest();
m_ratsnestTimer.Start( 40 );
}
else
{
auto connectivity = getModel<BOARD>()->GetConnectivity();
std::vector<BOARD_ITEM*> items;
items.reserve( selection.Size() );
// Check how much time doest it take to calculate ratsnest
PROF_COUNTER counter;
calculateSelectionRatsnest();
counter.Stop();
for( auto item : selection )
items.push_back( static_cast<BOARD_ITEM*>( item ) );
connectivity->ComputeDynamicRatsnest( items );
// If it is too slow, then switch to 'slow ratsnest' mode when
// ratsnest is calculated when user stops dragging items for a moment
if( counter.msecs() > 10 )
{
m_slowRatsnest = true;
connectivity->HideDynamicRatsnest();
}
}
return 0;
@ -1162,11 +1179,35 @@ int PCB_EDITOR_CONTROL::UpdateSelectionRatsnest( const TOOL_EVENT& aEvent )
int PCB_EDITOR_CONTROL::HideSelectionRatsnest( const TOOL_EVENT& aEvent )
{
getModel<BOARD>()->GetConnectivity()->ClearDynamicRatsnest();
m_slowRatsnest = false;
return 0;
}
void PCB_EDITOR_CONTROL::ratsnestTimer( wxTimerEvent& aEvent )
{
m_ratsnestTimer.Stop();
calculateSelectionRatsnest();
static_cast<PCB_DRAW_PANEL_GAL*>( m_frame->GetGalCanvas() )->RedrawRatsnest();
m_frame->GetGalCanvas()->Refresh();
}
void PCB_EDITOR_CONTROL::calculateSelectionRatsnest()
{
auto selectionTool = m_toolMgr->GetTool<SELECTION_TOOL>();
auto& selection = selectionTool->GetSelection();
auto connectivity = getModel<BOARD>()->GetConnectivity();
std::vector<BOARD_ITEM*> items;
items.reserve( selection.Size() );
for( auto item : selection )
items.push_back( static_cast<BOARD_ITEM*>( item ) );
connectivity->ComputeDynamicRatsnest( items );
}
void PCB_EDITOR_CONTROL::setTransitions()
{
// Track & via size control

View File

@ -38,7 +38,7 @@ class PCB_EDIT_FRAME;
*
* Handles actions specific to the board editor in pcbnew.
*/
class PCB_EDITOR_CONTROL : public PCB_TOOL
class PCB_EDITOR_CONTROL : public wxEvtHandler, public PCB_TOOL
{
public:
PCB_EDITOR_CONTROL();
@ -111,10 +111,16 @@ public:
///> Shows local ratsnest of a component
int ShowLocalRatsnest( const TOOL_EVENT& aEvent );
private:
///> Event handler to recalculate dynamic ratsnest
void ratsnestTimer( wxTimerEvent& aEvent );
///> Recalculates dynamic ratsnest for the current selection
void calculateSelectionRatsnest();
///> Sets up handlers for various events.
void setTransitions() override;
private:
///> Pointer to the currently used edit frame.
PCB_EDIT_FRAME* m_frame;
@ -124,6 +130,12 @@ private:
///> Flag to ignore a single crossprobe message from eeschema.
bool m_probingSchToPcb;
///> Flag to indicate whether the current selection ratsnest is slow to calculate.
bool m_slowRatsnest;
///> Timer that start ratsnest calculation when it is slow to compute.
wxTimer m_ratsnestTimer;
///> How to modify a property for selected items.
enum MODIFY_MODE { ON, OFF, TOGGLE };