diff --git a/eeschema/CMakeLists.txt b/eeschema/CMakeLists.txt index 44ecc428d9..d0291dfe43 100644 --- a/eeschema/CMakeLists.txt +++ b/eeschema/CMakeLists.txt @@ -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 diff --git a/eeschema/cross-probing.cpp b/eeschema/cross-probing.cpp index 99e32173f1..af9c48fdca 100644 --- a/eeschema/cross-probing.cpp +++ b/eeschema/cross-probing.cpp @@ -44,6 +44,122 @@ #include #include + +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. *

@@ -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 ); } } diff --git a/eeschema/dialogs/dialog_fields_editor_global.cpp b/eeschema/dialogs/dialog_fields_editor_global.cpp index 7c6635f76d..233e71a4b4 100644 --- a/eeschema/dialogs/dialog_fields_editor_global.cpp +++ b/eeschema/dialogs/dialog_fields_editor_global.cpp @@ -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 diff --git a/eeschema/find.cpp b/eeschema/find.cpp deleted file mode 100644 index b8ff73bf48..0000000000 --- a/eeschema/find.cpp +++ /dev/null @@ -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 - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -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; -} - diff --git a/eeschema/sch_edit_frame.h b/eeschema/sch_edit_frame.h index 3209babf13..df5e453716 100644 --- a/eeschema/sch_edit_frame.h +++ b/eeschema/sch_edit_frame.h @@ -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 }; diff --git a/pcbnew/cross-probing.cpp b/pcbnew/cross-probing.cpp index a43f262fa3..d700c264fd 100644 --- a/pcbnew/cross-probing.cpp +++ b/pcbnew/cross-probing.cpp @@ -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