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:
Jeff Young 2019-07-16 20:15:07 +01:00
parent ae0bdb96e5
commit 8d79661996
6 changed files with 147 additions and 222 deletions

View File

@ -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

View File

@ -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>
@ -76,16 +192,11 @@ void SCH_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
return;
if( strcmp( idcmd, "$NET:" ) == 0 )
{
if( IsCurrentTool( EE_ACTIONS::highlightNetCursor ) )
{
m_SelectedNetName = FROM_UTF8( text );
GetToolManager()->RunAction( EE_ACTIONS::updateNetHighlighting, true );
SetStatusText( _( "Selected net: " ) + UnescapeString( m_SelectedNetName ) );
GetToolManager()->RunAction( EE_ACTIONS::updateNetHighlighting, true );
}
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 );
}
}

View File

@ -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

View File

@ -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;
}

View File

@ -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
};

View File

@ -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,6 +203,11 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
for( auto mod : pcb->Modules() )
for ( auto mod_pad : mod->Pads() )
merge_area( mod_pad );
}
else
{
renderSettings->SetHighlight( false );
}
if( bbox.GetWidth() > 0 && bbox.GetHeight() > 0 )
{
@ -219,16 +215,13 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
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 );
// 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() );
}
}
else
{
renderSettings->SetHighlight( false );
}
view->UpdateAllLayersColor();
// Ensure the display is refreshed, because in some installs the refresh is done only