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
|
||||
fields_grid_table.cpp
|
||||
files-io.cpp
|
||||
find.cpp
|
||||
generate_alias_info.cpp
|
||||
getpart.cpp
|
||||
hierarch.cpp
|
||||
|
|
|
@ -44,6 +44,122 @@
|
|||
#include <tools/ee_actions.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.
|
||||
* <p>
|
||||
|
@ -77,15 +193,10 @@ void SCH_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
|
|||
|
||||
if( strcmp( idcmd, "$NET:" ) == 0 )
|
||||
{
|
||||
if( IsCurrentTool( EE_ACTIONS::highlightNetCursor ) )
|
||||
{
|
||||
m_SelectedNetName = FROM_UTF8( text );
|
||||
|
||||
SetStatusText( _( "Selected net: " ) + UnescapeString( m_SelectedNetName ) );
|
||||
|
||||
GetToolManager()->RunAction( EE_ACTIONS::updateNetHighlighting, true );
|
||||
}
|
||||
m_SelectedNetName = FROM_UTF8( text );
|
||||
GetToolManager()->RunAction( EE_ACTIONS::updateNetHighlighting, true );
|
||||
|
||||
SetStatusText( _( "Selected net: " ) + UnescapeString( m_SelectedNetName ) );
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -114,7 +225,7 @@ void SCH_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
|
|||
if( idcmd == NULL ) // Highlight component only (from Cvpcb or Pcbnew)
|
||||
{
|
||||
// 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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
// 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 )
|
||||
{
|
||||
// Highlighting the value itself isn't actually that useful, and it's harder to 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, "$PAD:" ) == 0 )
|
||||
{
|
||||
FindComponentAndItem( part_ref, true, FIND_PIN, msg );
|
||||
FindComponentAndItem( part_ref, true, HIGHLIGHT_PIN, msg );
|
||||
}
|
||||
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 )
|
||||
{
|
||||
m_parent->FindComponentAndItem( refs[0].GetRef() + refs[0].GetRefNumber(),
|
||||
true, FIND_COMPONENT_ONLY, wxEmptyString );
|
||||
true, HIGHLIGHT_COMPONENT, wxEmptyString );
|
||||
}
|
||||
}
|
||||
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
|
||||
enum SCH_SEARCH_T {
|
||||
FIND_COMPONENT_ONLY, ///< Find a component in the schematic.
|
||||
FIND_PIN, ///< Find a component pin in the schematic.
|
||||
FIND_REFERENCE, ///< Find an item by it's reference designator.
|
||||
FIND_VALUE, ///< Find an item by it's value field.
|
||||
FIND_FIELD ///< Find a component field.
|
||||
HIGHLIGHT_PIN,
|
||||
HIGHLIGHT_COMPONENT,
|
||||
SELECT_COMPONENT
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -169,20 +169,13 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
|
|||
return;
|
||||
}
|
||||
|
||||
BOX2I bbox = { { 0, 0 }, { 0, 0 } };
|
||||
|
||||
if( module )
|
||||
{
|
||||
renderSettings->SetHighlight( true, -1, true );
|
||||
|
||||
for( MODULE* mod : pcb->Modules() )
|
||||
{
|
||||
mod->ClearHighlighted();
|
||||
mod->RunOnChildren( []( BOARD_ITEM* child ) { child->ClearHighlighted(); } );
|
||||
}
|
||||
|
||||
module->SetHighlighted();
|
||||
module->RunOnChildren( []( BOARD_ITEM* child ) { child->SetHighlighted(); } );
|
||||
|
||||
view->SetCenter( VECTOR2D( module->GetPosition() ) );
|
||||
m_toolManager->RunAction( PCB_ACTIONS::selectionClear, true );
|
||||
m_toolManager->RunAction( PCB_ACTIONS::selectItem, true, (void*) module );
|
||||
bbox = module->GetBoundingBox();
|
||||
}
|
||||
else if( netcode > 0 )
|
||||
{
|
||||
|
@ -190,8 +183,6 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
|
|||
|
||||
pcb->SetHighLightNet( netcode );
|
||||
|
||||
BOX2I bbox;
|
||||
|
||||
auto merge_area = [netcode, &bbox]( BOARD_CONNECTED_ITEM* aItem )
|
||||
{
|
||||
if( aItem->GetNetCode() == netcode )
|
||||
|
@ -212,24 +203,26 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
|
|||
for( auto mod : pcb->Modules() )
|
||||
for ( auto mod_pad : mod->Pads() )
|
||||
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
|
||||
{
|
||||
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();
|
||||
// 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
|
||||
|
|
Loading…
Reference in New Issue