Convert symbol/module cross-probing to a selection model.
Net/net cross-probing stays a highlight model. Fixes: lp:1836600 * https://bugs.launchpad.net/kicad/+bug/1836600
This commit is contained in:
parent
ae0bdb96e5
commit
8d79661996
|
@ -145,7 +145,6 @@ set( EESCHEMA_SRCS
|
||||||
erc.cpp
|
erc.cpp
|
||||||
fields_grid_table.cpp
|
fields_grid_table.cpp
|
||||||
files-io.cpp
|
files-io.cpp
|
||||||
find.cpp
|
|
||||||
generate_alias_info.cpp
|
generate_alias_info.cpp
|
||||||
getpart.cpp
|
getpart.cpp
|
||||||
hierarch.cpp
|
hierarch.cpp
|
||||||
|
|
|
@ -44,6 +44,122 @@
|
||||||
#include <tools/ee_actions.h>
|
#include <tools/ee_actions.h>
|
||||||
#include <tools/sch_editor_control.h>
|
#include <tools/sch_editor_control.h>
|
||||||
|
|
||||||
|
|
||||||
|
SCH_ITEM* SCH_EDIT_FRAME::FindComponentAndItem( const wxString& aReference,
|
||||||
|
bool aSearchHierarchy,
|
||||||
|
SCH_SEARCH_T aSearchType,
|
||||||
|
const wxString& aSearchText )
|
||||||
|
{
|
||||||
|
SCH_SHEET_PATH* sheetWithComponentFound = NULL;
|
||||||
|
SCH_ITEM* item = NULL;
|
||||||
|
SCH_COMPONENT* Component = NULL;
|
||||||
|
wxPoint pos;
|
||||||
|
bool notFound = true;
|
||||||
|
LIB_PIN* pin = nullptr;
|
||||||
|
SCH_SHEET_LIST sheetList( g_RootSheet );
|
||||||
|
EDA_ITEM* foundItem = nullptr;
|
||||||
|
|
||||||
|
if( !aSearchHierarchy )
|
||||||
|
sheetList.push_back( *g_CurrentSheet );
|
||||||
|
else
|
||||||
|
sheetList.BuildSheetList( g_RootSheet );
|
||||||
|
|
||||||
|
for( SCH_SHEET_PATH& sheet : sheetList)
|
||||||
|
{
|
||||||
|
for( item = sheet.LastDrawList(); item && notFound; item = item->Next() )
|
||||||
|
{
|
||||||
|
if( item->Type() != SCH_COMPONENT_T )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SCH_COMPONENT* pSch = (SCH_COMPONENT*) item;
|
||||||
|
|
||||||
|
if( aReference.CmpNoCase( pSch->GetRef( &sheet ) ) == 0 )
|
||||||
|
{
|
||||||
|
Component = pSch;
|
||||||
|
sheetWithComponentFound = &sheet;
|
||||||
|
|
||||||
|
if( aSearchType == HIGHLIGHT_PIN )
|
||||||
|
{
|
||||||
|
pos = pSch->GetPosition(); // temporary: will be changed if the pin is found.
|
||||||
|
pin = pSch->GetPin( aSearchText );
|
||||||
|
|
||||||
|
if( pin )
|
||||||
|
{
|
||||||
|
notFound = false;
|
||||||
|
pos += pin->GetPosition();
|
||||||
|
foundItem = Component;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
notFound = false;
|
||||||
|
pos = pSch->GetPosition();
|
||||||
|
foundItem = Component;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( notFound == false )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( Component )
|
||||||
|
{
|
||||||
|
if( *sheetWithComponentFound != *g_CurrentSheet )
|
||||||
|
{
|
||||||
|
sheetWithComponentFound->LastScreen()->SetZoom( GetScreen()->GetZoom() );
|
||||||
|
*g_CurrentSheet = *sheetWithComponentFound;
|
||||||
|
DisplayCurrentSheet();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPoint delta;
|
||||||
|
pos -= Component->GetPosition();
|
||||||
|
delta = Component->GetTransform().TransformCoordinate( pos );
|
||||||
|
pos = delta + Component->GetPosition();
|
||||||
|
|
||||||
|
GetCanvas()->GetViewControls()->SetCrossHairCursorPosition( pos, false );
|
||||||
|
CenterScreen( pos, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print diag */
|
||||||
|
wxString msg_item;
|
||||||
|
wxString msg;
|
||||||
|
|
||||||
|
if( aSearchType == HIGHLIGHT_PIN )
|
||||||
|
msg_item.Printf( _( "pin %s" ), aSearchText );
|
||||||
|
else
|
||||||
|
msg_item = _( "component" );
|
||||||
|
|
||||||
|
if( Component )
|
||||||
|
{
|
||||||
|
if( !notFound )
|
||||||
|
msg.Printf( _( "%s %s found" ), aReference, msg_item );
|
||||||
|
else
|
||||||
|
msg.Printf( _( "%s found but %s not found" ), aReference, msg_item );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
msg.Printf( _( "Component %s not found" ), aReference );
|
||||||
|
|
||||||
|
SetStatusText( msg );
|
||||||
|
|
||||||
|
// Clear any existing highlighting
|
||||||
|
GetToolManager()->RunAction( EE_ACTIONS::clearSelection, true );
|
||||||
|
GetCanvas()->GetView()->HighlightItem( nullptr, nullptr );
|
||||||
|
|
||||||
|
if( foundItem )
|
||||||
|
{
|
||||||
|
if( aSearchType == SELECT_COMPONENT )
|
||||||
|
GetToolManager()->RunAction( EE_ACTIONS::addItemToSel, true, foundItem );
|
||||||
|
else
|
||||||
|
GetCanvas()->GetView()->HighlightItem( foundItem, pin );
|
||||||
|
}
|
||||||
|
|
||||||
|
GetCanvas()->Refresh();
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute a remote command sent by Pcbnew via a socket connection.
|
* Execute a remote command sent by Pcbnew via a socket connection.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -77,15 +193,10 @@ void SCH_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
|
||||||
|
|
||||||
if( strcmp( idcmd, "$NET:" ) == 0 )
|
if( strcmp( idcmd, "$NET:" ) == 0 )
|
||||||
{
|
{
|
||||||
if( IsCurrentTool( EE_ACTIONS::highlightNetCursor ) )
|
m_SelectedNetName = FROM_UTF8( text );
|
||||||
{
|
GetToolManager()->RunAction( EE_ACTIONS::updateNetHighlighting, true );
|
||||||
m_SelectedNetName = FROM_UTF8( text );
|
|
||||||
|
|
||||||
SetStatusText( _( "Selected net: " ) + UnescapeString( m_SelectedNetName ) );
|
|
||||||
|
|
||||||
GetToolManager()->RunAction( EE_ACTIONS::updateNetHighlighting, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
SetStatusText( _( "Selected net: " ) + UnescapeString( m_SelectedNetName ) );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +225,7 @@ void SCH_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
|
||||||
if( idcmd == NULL ) // Highlight component only (from Cvpcb or Pcbnew)
|
if( idcmd == NULL ) // Highlight component only (from Cvpcb or Pcbnew)
|
||||||
{
|
{
|
||||||
// Highlight component part_ref, or clear Highlight, if part_ref is not existing
|
// Highlight component part_ref, or clear Highlight, if part_ref is not existing
|
||||||
FindComponentAndItem( part_ref, true, FIND_COMPONENT_ONLY, wxEmptyString );
|
FindComponentAndItem( part_ref, true, SELECT_COMPONENT, wxEmptyString );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,21 +240,21 @@ void SCH_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
|
||||||
{
|
{
|
||||||
// Highlighting the reference itself isn't actually that useful, and it's harder to
|
// Highlighting the reference itself isn't actually that useful, and it's harder to
|
||||||
// see. Highlight the parent and display the message.
|
// see. Highlight the parent and display the message.
|
||||||
FindComponentAndItem( part_ref, true, FIND_COMPONENT_ONLY, msg );
|
FindComponentAndItem( part_ref, true, SELECT_COMPONENT, msg );
|
||||||
}
|
}
|
||||||
else if( strcmp( idcmd, "$VAL:" ) == 0 )
|
else if( strcmp( idcmd, "$VAL:" ) == 0 )
|
||||||
{
|
{
|
||||||
// Highlighting the value itself isn't actually that useful, and it's harder to see.
|
// Highlighting the value itself isn't actually that useful, and it's harder to see.
|
||||||
// Highlight the parent and display the message.
|
// Highlight the parent and display the message.
|
||||||
FindComponentAndItem( part_ref, true, FIND_COMPONENT_ONLY, msg );
|
FindComponentAndItem( part_ref, true, SELECT_COMPONENT, msg );
|
||||||
}
|
}
|
||||||
else if( strcmp( idcmd, "$PAD:" ) == 0 )
|
else if( strcmp( idcmd, "$PAD:" ) == 0 )
|
||||||
{
|
{
|
||||||
FindComponentAndItem( part_ref, true, FIND_PIN, msg );
|
FindComponentAndItem( part_ref, true, HIGHLIGHT_PIN, msg );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FindComponentAndItem( part_ref, true, FIND_COMPONENT_ONLY, wxEmptyString );
|
FindComponentAndItem( part_ref, true, SELECT_COMPONENT, wxEmptyString );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1036,7 +1036,7 @@ void DIALOG_FIELDS_EDITOR_GLOBAL::OnTableCellClick( wxGridEvent& event )
|
||||||
if( refs.size() == 1 )
|
if( refs.size() == 1 )
|
||||||
{
|
{
|
||||||
m_parent->FindComponentAndItem( refs[0].GetRef() + refs[0].GetRefNumber(),
|
m_parent->FindComponentAndItem( refs[0].GetRef() + refs[0].GetRefNumber(),
|
||||||
true, FIND_COMPONENT_ONLY, wxEmptyString );
|
true, HIGHLIGHT_COMPONENT, wxEmptyString );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -1,176 +0,0 @@
|
||||||
/*
|
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
|
|
||||||
* Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
|
|
||||||
* Copyright (C) 2004-2019 KiCad Developers, see change_log.txt for contributors.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* 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 <fctsys.h>
|
|
||||||
#include <pgm_base.h>
|
|
||||||
#include <kicad_string.h>
|
|
||||||
#include <sch_edit_frame.h>
|
|
||||||
#include <base_units.h>
|
|
||||||
#include <trace_helpers.h>
|
|
||||||
#include <sch_view.h>
|
|
||||||
#include <general.h>
|
|
||||||
#include <class_library.h>
|
|
||||||
#include <lib_pin.h>
|
|
||||||
#include <sch_component.h>
|
|
||||||
#include <sch_sheet.h>
|
|
||||||
#include <sch_sheet_path.h>
|
|
||||||
|
|
||||||
|
|
||||||
SCH_ITEM* SCH_EDIT_FRAME::FindComponentAndItem( const wxString& aReference,
|
|
||||||
bool aSearchHierarchy,
|
|
||||||
SCH_SEARCH_T aSearchType,
|
|
||||||
const wxString& aSearchText )
|
|
||||||
{
|
|
||||||
SCH_SHEET_PATH* sheet = NULL;
|
|
||||||
SCH_SHEET_PATH* sheetWithComponentFound = NULL;
|
|
||||||
SCH_ITEM* item = NULL;
|
|
||||||
SCH_COMPONENT* Component = NULL;
|
|
||||||
wxPoint pos;
|
|
||||||
bool notFound = true;
|
|
||||||
LIB_PIN* pin = nullptr;
|
|
||||||
SCH_SHEET_LIST sheetList( g_RootSheet );
|
|
||||||
EDA_ITEM* foundItem = nullptr;
|
|
||||||
|
|
||||||
if( !aSearchHierarchy )
|
|
||||||
sheetList.push_back( *g_CurrentSheet );
|
|
||||||
else
|
|
||||||
sheetList.BuildSheetList( g_RootSheet );
|
|
||||||
|
|
||||||
for( SCH_SHEET_PATHS_ITER it = sheetList.begin(); it != sheetList.end(); ++it )
|
|
||||||
{
|
|
||||||
sheet = &(*it);
|
|
||||||
item = (*it).LastDrawList();
|
|
||||||
|
|
||||||
for( ; ( item != NULL ) && ( notFound == true ); item = item->Next() )
|
|
||||||
{
|
|
||||||
if( item->Type() != SCH_COMPONENT_T )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
SCH_COMPONENT* pSch = (SCH_COMPONENT*) item;
|
|
||||||
|
|
||||||
if( aReference.CmpNoCase( pSch->GetRef( sheet ) ) == 0 )
|
|
||||||
{
|
|
||||||
Component = pSch;
|
|
||||||
sheetWithComponentFound = sheet;
|
|
||||||
|
|
||||||
switch( aSearchType )
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
case FIND_COMPONENT_ONLY: // Find component only
|
|
||||||
notFound = false;
|
|
||||||
pos = pSch->GetPosition();
|
|
||||||
foundItem = Component;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FIND_PIN: // find a pin
|
|
||||||
pos = pSch->GetPosition(); // temporary: will be changed if the pin is found.
|
|
||||||
pin = pSch->GetPin( aSearchText );
|
|
||||||
|
|
||||||
if( pin == NULL )
|
|
||||||
break;
|
|
||||||
|
|
||||||
notFound = false;
|
|
||||||
pos += pin->GetPosition();
|
|
||||||
foundItem = Component;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FIND_REFERENCE: // find reference
|
|
||||||
notFound = false;
|
|
||||||
pos = pSch->GetField( REFERENCE )->GetPosition();
|
|
||||||
foundItem = pSch->GetField( REFERENCE );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FIND_VALUE: // find value
|
|
||||||
pos = pSch->GetPosition();
|
|
||||||
|
|
||||||
if( aSearchText.CmpNoCase( pSch->GetField( VALUE )->GetShownText() ) != 0 )
|
|
||||||
break;
|
|
||||||
|
|
||||||
notFound = false;
|
|
||||||
pos = pSch->GetField( VALUE )->GetPosition();
|
|
||||||
foundItem = pSch->GetField( VALUE );
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( notFound == false )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( Component )
|
|
||||||
{
|
|
||||||
sheet = sheetWithComponentFound;
|
|
||||||
|
|
||||||
if( *sheet != *g_CurrentSheet )
|
|
||||||
{
|
|
||||||
sheet->LastScreen()->SetZoom( GetScreen()->GetZoom() );
|
|
||||||
*g_CurrentSheet = *sheet;
|
|
||||||
DisplayCurrentSheet();
|
|
||||||
}
|
|
||||||
|
|
||||||
wxPoint delta;
|
|
||||||
pos -= Component->GetPosition();
|
|
||||||
delta = Component->GetTransform().TransformCoordinate( pos );
|
|
||||||
pos = delta + Component->GetPosition();
|
|
||||||
|
|
||||||
GetCanvas()->GetViewControls()->SetCrossHairCursorPosition( pos, false );
|
|
||||||
CenterScreen( pos, false );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print diag */
|
|
||||||
wxString msg_item;
|
|
||||||
wxString msg;
|
|
||||||
|
|
||||||
switch( aSearchType )
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
case FIND_COMPONENT_ONLY: msg_item = _( "component" ); break;
|
|
||||||
case FIND_PIN: msg_item.Printf( _( "pin %s" ), aSearchText ); break;
|
|
||||||
case FIND_REFERENCE: msg_item.Printf( _( "reference %s" ), aSearchText ); break;
|
|
||||||
case FIND_VALUE: msg_item.Printf( _( "value %s" ), aSearchText ); break;
|
|
||||||
case FIND_FIELD: msg_item.Printf( _( "field %s" ), aSearchText ); break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( Component )
|
|
||||||
{
|
|
||||||
if( !notFound )
|
|
||||||
msg.Printf( _( "%s %s found" ), aReference, msg_item );
|
|
||||||
else
|
|
||||||
msg.Printf( _( "%s found but %s not found" ), aReference, msg_item );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
msg.Printf( _( "Component %s not found" ), aReference );
|
|
||||||
|
|
||||||
SetStatusText( msg );
|
|
||||||
|
|
||||||
// highlight selection if foundItem is not null, or clear any highlighted selection
|
|
||||||
GetCanvas()->GetView()->HighlightItem( foundItem, pin );
|
|
||||||
GetCanvas()->Refresh();
|
|
||||||
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
|
|
|
@ -89,11 +89,9 @@ enum ANNOTATE_OPTION_T {
|
||||||
|
|
||||||
/// Schematic search type used by the socket link with Pcbnew
|
/// Schematic search type used by the socket link with Pcbnew
|
||||||
enum SCH_SEARCH_T {
|
enum SCH_SEARCH_T {
|
||||||
FIND_COMPONENT_ONLY, ///< Find a component in the schematic.
|
HIGHLIGHT_PIN,
|
||||||
FIND_PIN, ///< Find a component pin in the schematic.
|
HIGHLIGHT_COMPONENT,
|
||||||
FIND_REFERENCE, ///< Find an item by it's reference designator.
|
SELECT_COMPONENT
|
||||||
FIND_VALUE, ///< Find an item by it's value field.
|
|
||||||
FIND_FIELD ///< Find a component field.
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -169,20 +169,13 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOX2I bbox = { { 0, 0 }, { 0, 0 } };
|
||||||
|
|
||||||
if( module )
|
if( module )
|
||||||
{
|
{
|
||||||
renderSettings->SetHighlight( true, -1, true );
|
m_toolManager->RunAction( PCB_ACTIONS::selectionClear, true );
|
||||||
|
m_toolManager->RunAction( PCB_ACTIONS::selectItem, true, (void*) module );
|
||||||
for( MODULE* mod : pcb->Modules() )
|
bbox = module->GetBoundingBox();
|
||||||
{
|
|
||||||
mod->ClearHighlighted();
|
|
||||||
mod->RunOnChildren( []( BOARD_ITEM* child ) { child->ClearHighlighted(); } );
|
|
||||||
}
|
|
||||||
|
|
||||||
module->SetHighlighted();
|
|
||||||
module->RunOnChildren( []( BOARD_ITEM* child ) { child->SetHighlighted(); } );
|
|
||||||
|
|
||||||
view->SetCenter( VECTOR2D( module->GetPosition() ) );
|
|
||||||
}
|
}
|
||||||
else if( netcode > 0 )
|
else if( netcode > 0 )
|
||||||
{
|
{
|
||||||
|
@ -190,8 +183,6 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
|
||||||
|
|
||||||
pcb->SetHighLightNet( netcode );
|
pcb->SetHighLightNet( netcode );
|
||||||
|
|
||||||
BOX2I bbox;
|
|
||||||
|
|
||||||
auto merge_area = [netcode, &bbox]( BOARD_CONNECTED_ITEM* aItem )
|
auto merge_area = [netcode, &bbox]( BOARD_CONNECTED_ITEM* aItem )
|
||||||
{
|
{
|
||||||
if( aItem->GetNetCode() == netcode )
|
if( aItem->GetNetCode() == netcode )
|
||||||
|
@ -212,24 +203,26 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
|
||||||
for( auto mod : pcb->Modules() )
|
for( auto mod : pcb->Modules() )
|
||||||
for ( auto mod_pad : mod->Pads() )
|
for ( auto mod_pad : mod->Pads() )
|
||||||
merge_area( mod_pad );
|
merge_area( mod_pad );
|
||||||
|
|
||||||
if( bbox.GetWidth() > 0 && bbox.GetHeight() > 0 )
|
|
||||||
{
|
|
||||||
auto bbSize = bbox.Inflate( bbox.GetWidth() * 0.2f ).GetSize();
|
|
||||||
auto screenSize = view->ToWorld( GetCanvas()->GetClientSize(), false );
|
|
||||||
double ratio = std::max( fabs( bbSize.x / screenSize.x ),
|
|
||||||
fabs( bbSize.y / screenSize.y ) );
|
|
||||||
double scale = view->GetScale() / ratio;
|
|
||||||
|
|
||||||
view->SetScale( scale );
|
|
||||||
view->SetCenter( bbox.Centre() );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
renderSettings->SetHighlight( false );
|
renderSettings->SetHighlight( false );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( bbox.GetWidth() > 0 && bbox.GetHeight() > 0 )
|
||||||
|
{
|
||||||
|
auto bbSize = bbox.Inflate( bbox.GetWidth() * 0.2f ).GetSize();
|
||||||
|
auto screenSize = view->ToWorld( GetCanvas()->GetClientSize(), false );
|
||||||
|
double ratio = std::max( fabs( bbSize.x / screenSize.x ),
|
||||||
|
fabs( bbSize.y / screenSize.y ) );
|
||||||
|
|
||||||
|
// Try not to zoom on every cross-probe; it gets very noisy
|
||||||
|
if( ratio < 0.1 || ratio > 1.0 )
|
||||||
|
view->SetScale( view->GetScale() / ratio );
|
||||||
|
|
||||||
|
view->SetCenter( bbox.Centre() );
|
||||||
|
}
|
||||||
|
|
||||||
view->UpdateAllLayersColor();
|
view->UpdateAllLayersColor();
|
||||||
// Ensure the display is refreshed, because in some installs the refresh is done only
|
// Ensure the display is refreshed, because in some installs the refresh is done only
|
||||||
// when the gal canvas has the focus, and that is not the case when crossprobing from
|
// when the gal canvas has the focus, and that is not the case when crossprobing from
|
||||||
|
|
Loading…
Reference in New Issue