diff --git a/pcbnew/cross-probing.cpp b/pcbnew/cross-probing.cpp index 66bd126a40..208c865cff 100644 --- a/pcbnew/cross-probing.cpp +++ b/pcbnew/cross-probing.cpp @@ -1,185 +1,185 @@ -/*****************************************************************/ -/* Cross probing function: handle communication to/from eeschema */ -/*****************************************************************/ - -/* cross-probing.cpp */ - -#include "fctsys.h" - -#include "common.h" -#include "pcbnew.h" -#include "eda_dde.h" - -#include "id.h" -#include "collectors.h" - -#include "protos.h" - - -/*******************************************/ -void RemoteCommand( const char* cmdline ) -/*******************************************/ - -/** Read a remote command send by eeschema via a socket, - * port KICAD_PCB_PORT_SERVICE_NUMBER (currently 4242) - * @param cmdline = received command from eeschema - * Commands are - * $PART: "reference" put cursor on component - * $PIN: "pin name" $PART: "reference" put cursor on the footprint pin - */ -{ - char line[1024]; - wxString msg; - char* idcmd; - char* text; - MODULE* module = 0; - WinEDA_PcbFrame* frame = EDA_Appl->m_PcbFrame; - - strncpy( line, cmdline, sizeof(line) - 1 ); - - idcmd = strtok( line, " \n\r" ); - text = strtok( NULL, " \n\r" ); - if( (idcmd == NULL) || (text == NULL) ) - return; - - if( strcmp( idcmd, "$PART:" ) == 0 ) - { - msg = CONV_FROM_UTF8( text ); - - module = ReturnModule( frame->m_Pcb, msg ); - - msg.Printf( _( "Locate module %s %s" ), msg.GetData(), - module ? wxT( "Ok" ) : wxT( "not found" ) ); - - frame->Affiche_Message( msg ); - if( module ) - { - wxClientDC dc( frame->DrawPanel ); - - frame->DrawPanel->PrepareGraphicContext( &dc ); - frame->DrawPanel->CursorOff( &dc ); - frame->GetScreen()->m_Curseur = module->m_Pos; - frame->DrawPanel->CursorOn( &dc ); - } - } - - if( idcmd && strcmp( idcmd, "$PIN:" ) == 0 ) - { - wxString pinName, modName; - D_PAD* pad = NULL; - int netcode = -1; - - pinName = CONV_FROM_UTF8( text ); - - text = strtok( NULL, " \n\r" ); - if( text && strcmp( text, "$PART:" ) == 0 ) - text = strtok( NULL, "\n\r" ); - - wxClientDC dc( frame->DrawPanel ); - - frame->DrawPanel->PrepareGraphicContext( &dc ); - - modName = CONV_FROM_UTF8( text ); - module = ReturnModule( frame->m_Pcb, modName ); - if( module ) - pad = ReturnPad( module, pinName ); - - if( pad ) - netcode = pad->m_NetCode; - - if( netcode > 0 ) /* hightlighted the net selected net*/ - { - if( g_HightLigt_Status ) /* erase the old hightlighted net */ - frame->Hight_Light( &dc ); - - g_HightLigth_NetCode = netcode; - frame->Hight_Light( &dc ); /* hightlighted the new one */ - - frame->DrawPanel->CursorOff( &dc ); - frame->GetScreen()->m_Curseur = pad->m_Pos; - frame->DrawPanel->CursorOn( &dc ); - } - - if( module == NULL ) - msg.Printf( _( "module %s not found" ), text ); - else if( pad == NULL ) - msg.Printf( _( "Pin %s (module %s) not found" ), pinName.GetData(), modName.GetData() ); - else - msg.Printf( _( "Locate Pin %s (module %s)" ), pinName.GetData(), modName.GetData() ); - - frame->Affiche_Message( msg ); - } - - if( module ) // if found, center the module on screen. - frame->Recadre_Trace( false ); -} - - -// see wxstruct.h -/**************************************************************************/ -void WinEDA_PcbFrame::SendMessageToEESCHEMA( BOARD_ITEM* objectToSync ) -/**************************************************************************/ -/** Send a remote command to eeschema via a socket, - * @param objectToSync = item to be located on schematic (module, pin or text) - * Commands are - * $PART: "reference" put cursor on component anchor - * $PART: "reference" $PAD: "pad number" put cursor on the component pin - * $PART: "reference" $REF: "reference" put cursor on the component ref - * $PART: "reference" $VAL: "value" put cursor on the component value - */ -{ - char cmd[1024]; - const char* text_key; - MODULE* module = NULL; - D_PAD* pad; - TEXTE_MODULE* text_mod; - wxString msg; - - if( objectToSync == NULL ) - return; - - switch( objectToSync->Type() ) - { - case TYPEMODULE: - module = (MODULE*) objectToSync; - sprintf( cmd, "$PART: \"%s\"", - CONV_TO_UTF8( module->m_Reference->m_Text ) ); - break; - - case TYPEPAD: - module = (MODULE*) objectToSync->m_Parent; - pad = (D_PAD*) objectToSync; - msg = pad->ReturnStringPadName(); - sprintf( cmd, "$PART: \"%s\" $PAD: \"%s\"", - CONV_TO_UTF8( module->m_Reference->m_Text ), - CONV_TO_UTF8( msg ) ); - break; - - case TYPETEXTEMODULE: - #define REFERENCE 0 - #define VALUE 1 - module = (MODULE*) objectToSync->m_Parent; - text_mod = (TEXTE_MODULE*) objectToSync; - if( text_mod->m_Type == REFERENCE ) - text_key = "$REF:"; - else if( text_mod->m_Type == VALUE ) - text_key = "$VAL:"; - else - break; - - sprintf( cmd, "$PART: \"%s\" %s \"%s\"", - CONV_TO_UTF8( module->m_Reference->m_Text ), - text_key, - CONV_TO_UTF8( text_mod->m_Text ) ); - break; - - default: - break; - } - - if( module ) - { - SendCommand( MSG_TO_SCH, cmd ); - } -} - +/*****************************************************************/ +/* Cross probing function: handle communication to/from eeschema */ +/*****************************************************************/ + +/* cross-probing.cpp */ + +#include "fctsys.h" + +#include "common.h" +#include "pcbnew.h" +#include "eda_dde.h" + +#include "id.h" +#include "collectors.h" + +#include "protos.h" + + +/*******************************************/ +void RemoteCommand( const char* cmdline ) +/*******************************************/ + +/** Read a remote command send by eeschema via a socket, + * port KICAD_PCB_PORT_SERVICE_NUMBER (currently 4242) + * @param cmdline = received command from eeschema + * Commands are + * $PART: "reference" put cursor on component + * $PIN: "pin name" $PART: "reference" put cursor on the footprint pin + */ +{ + char line[1024]; + wxString msg; + char* idcmd; + char* text; + MODULE* module = 0; + WinEDA_PcbFrame* frame = EDA_Appl->m_PcbFrame; + + strncpy( line, cmdline, sizeof(line) - 1 ); + + idcmd = strtok( line, " \n\r" ); + text = strtok( NULL, " \n\r" ); + if( (idcmd == NULL) || (text == NULL) ) + return; + + if( strcmp( idcmd, "$PART:" ) == 0 ) + { + msg = CONV_FROM_UTF8( text ); + + module = ReturnModule( frame->m_Pcb, msg ); + + msg.Printf( _( "Locate module %s %s" ), msg.GetData(), + module ? wxT( "Ok" ) : wxT( "not found" ) ); + + frame->Affiche_Message( msg ); + if( module ) + { + wxClientDC dc( frame->DrawPanel ); + + frame->DrawPanel->PrepareGraphicContext( &dc ); + frame->DrawPanel->CursorOff( &dc ); + frame->GetScreen()->m_Curseur = module->m_Pos; + frame->DrawPanel->CursorOn( &dc ); + } + } + + if( idcmd && strcmp( idcmd, "$PIN:" ) == 0 ) + { + wxString pinName, modName; + D_PAD* pad = NULL; + int netcode = -1; + + pinName = CONV_FROM_UTF8( text ); + + text = strtok( NULL, " \n\r" ); + if( text && strcmp( text, "$PART:" ) == 0 ) + text = strtok( NULL, "\n\r" ); + + wxClientDC dc( frame->DrawPanel ); + + frame->DrawPanel->PrepareGraphicContext( &dc ); + + modName = CONV_FROM_UTF8( text ); + module = ReturnModule( frame->m_Pcb, modName ); + if( module ) + pad = ReturnPad( module, pinName ); + + if( pad ) + netcode = pad->m_NetCode; + + if( netcode > 0 ) /* hightlighted the net selected net*/ + { + if( g_HightLigt_Status ) /* erase the old hightlighted net */ + frame->Hight_Light( &dc ); + + g_HightLigth_NetCode = netcode; + frame->Hight_Light( &dc ); /* hightlighted the new one */ + + frame->DrawPanel->CursorOff( &dc ); + frame->GetScreen()->m_Curseur = pad->m_Pos; + frame->DrawPanel->CursorOn( &dc ); + } + + if( module == NULL ) + msg.Printf( _( "module %s not found" ), text ); + else if( pad == NULL ) + msg.Printf( _( "Pin %s (module %s) not found" ), pinName.GetData(), modName.GetData() ); + else + msg.Printf( _( "Locate Pin %s (module %s)" ), pinName.GetData(), modName.GetData() ); + + frame->Affiche_Message( msg ); + } + + if( module ) // if found, center the module on screen. + frame->Recadre_Trace( false ); +} + + +// see wxstruct.h +/**************************************************************************/ +void WinEDA_PcbFrame::SendMessageToEESCHEMA( BOARD_ITEM* objectToSync ) +/**************************************************************************/ +/** Send a remote command to eeschema via a socket, + * @param objectToSync = item to be located on schematic (module, pin or text) + * Commands are + * $PART: "reference" put cursor on component anchor + * $PART: "reference" $PAD: "pad number" put cursor on the component pin + * $PART: "reference" $REF: "reference" put cursor on the component ref + * $PART: "reference" $VAL: "value" put cursor on the component value + */ +{ + char cmd[1024]; + const char* text_key; + MODULE* module = NULL; + D_PAD* pad; + TEXTE_MODULE* text_mod; + wxString msg; + + if( objectToSync == NULL ) + return; + + switch( objectToSync->Type() ) + { + case TYPEMODULE: + module = (MODULE*) objectToSync; + sprintf( cmd, "$PART: \"%s\"", + CONV_TO_UTF8( module->m_Reference->m_Text ) ); + break; + + case TYPEPAD: + module = (MODULE*) objectToSync->m_Parent; + pad = (D_PAD*) objectToSync; + msg = pad->ReturnStringPadName(); + sprintf( cmd, "$PART: \"%s\" $PAD: \"%s\"", + CONV_TO_UTF8( module->m_Reference->m_Text ), + CONV_TO_UTF8( msg ) ); + break; + + case TYPETEXTEMODULE: + #define REFERENCE 0 + #define VALUE 1 + module = (MODULE*) objectToSync->m_Parent; + text_mod = (TEXTE_MODULE*) objectToSync; + if( text_mod->m_Type == REFERENCE ) + text_key = "$REF:"; + else if( text_mod->m_Type == VALUE ) + text_key = "$VAL:"; + else + break; + + sprintf( cmd, "$PART: \"%s\" %s \"%s\"", + CONV_TO_UTF8( module->m_Reference->m_Text ), + text_key, + CONV_TO_UTF8( text_mod->m_Text ) ); + break; + + default: + break; + } + + if( module ) + { + SendCommand( MSG_TO_SCH, cmd ); + } +} +