kicad/eeschema/cross-probing.cpp

148 lines
3.8 KiB
C++
Raw Normal View History

/**
* @file eeschema/cross-probing.cpp
*/
2007-10-08 16:14:16 +00:00
#include "fctsys.h"
#include "appl_wxstruct.h"
#include "macros.h"
2007-10-08 16:14:16 +00:00
#include "eda_dde.h"
#include "wxEeschemaStruct.h"
2007-10-08 16:14:16 +00:00
#include "general.h"
#include "eeschema_id.h"
2007-10-08 16:14:16 +00:00
#include "protos.h"
#include "lib_draw_item.h"
#include "lib_pin.h"
#include "sch_component.h"
2007-10-08 16:14:16 +00:00
/**
* Read a remote command sent by Pcbnew (via a socket connection) ,
* so when user selects a module or pin in Pcbnew,
* Deschema shows that same component or pin.
2007-10-08 16:14:16 +00:00
* The cursor is put on the item
* port KICAD_SCH_PORT_SERVICE_NUMBER (currently 4243)
* @param cmdline = received command from Pcbnew
2007-10-08 16:14:16 +00:00
* commands are:
* $PART: "reference" put cursor on component
* $PART: "reference" $REF: "ref" put cursor on reference component
* $PART: "reference" $VAL: "value" put cursor on value component
* $PART: "reference" $PAD: "pin name" put cursor on the component pin
*/
void RemoteCommand( const char* cmdline )
2007-10-08 16:14:16 +00:00
{
char line[1024];
char* idcmd;
char* text;
wxString part_ref, msg;
SCH_EDIT_FRAME* frame;
frame = (SCH_EDIT_FRAME*)wxGetApp().GetTopWindow();
2007-10-08 16:14:16 +00:00
strncpy( line, cmdline, sizeof(line) - 1 );
idcmd = strtok( line, " \n\r" );
text = strtok( NULL, "\"\n\r" );
2007-10-08 16:14:16 +00:00
if( (idcmd == NULL) || (text == NULL) )
return;
if( strcmp( idcmd, "$PART:" ) != 0 )
return;
part_ref = FROM_UTF8( text );
2007-10-08 16:14:16 +00:00
/* look for a complement */
idcmd = strtok( NULL, " \n\r" );
2007-10-08 16:14:16 +00:00
if( idcmd == NULL ) // component only
{
frame->FindComponentAndItem( part_ref, true, 0, wxEmptyString, false );
return;
}
text = strtok( NULL, "\"\n\r" );
2007-10-08 16:14:16 +00:00
if( text == NULL )
return;
msg = FROM_UTF8( text );
2007-10-08 16:14:16 +00:00
if( strcmp( idcmd, "$REF:" ) == 0 )
{
frame->FindComponentAndItem( part_ref, true, 2, msg, false );
}
else if( strcmp( idcmd, "$VAL:" ) == 0 )
{
frame->FindComponentAndItem( part_ref, true, 3, msg, false );
}
else if( strcmp( idcmd, "$PAD:" ) == 0 )
{
frame->FindComponentAndItem( part_ref, true, 1, msg, false );
}
else
frame->FindComponentAndItem( part_ref, true, 0, wxEmptyString, false );
}
/** Send a remote command to Eeschema via a socket,
2007-10-08 16:14:16 +00:00
* @param objectToSync = item to be located on board (footprint, pad or text)
* @param LibItem = component in lib if objectToSync is a sub item of a component
2007-10-08 16:14:16 +00:00
* Commands are
* $PART: reference put cursor on footprint anchor
* $PIN: number $PART: reference put cursor on the footprint pad
*/
void SCH_EDIT_FRAME::SendMessageToPCBNEW( EDA_ITEM* objectToSync, SCH_COMPONENT* LibItem )
2007-10-08 16:14:16 +00:00
{
2007-10-09 13:10:58 +00:00
if( objectToSync == NULL )
return;
2007-10-08 16:14:16 +00:00
LIB_PIN* Pin = NULL;
char Line[1024];
2007-10-08 16:14:16 +00:00
/* Cross probing to Pcbnew if a pin or a component is found */
2007-10-08 16:14:16 +00:00
switch( objectToSync->Type() )
{
case SCH_FIELD_T:
case LIB_FIELD_T:
{
if( LibItem == NULL )
break;
sprintf( Line, "$PART: %s", TO_UTF8( LibItem->GetField( REFERENCE )->m_Text ) );
SendCommand( MSG_TO_PCB, Line );
}
break;
2007-10-08 16:14:16 +00:00
case SCH_COMPONENT_T:
2008-03-20 01:50:21 +00:00
LibItem = (SCH_COMPONENT*) objectToSync;
sprintf( Line, "$PART: %s", TO_UTF8( LibItem->GetField( REFERENCE )->m_Text ) );
2007-10-08 16:14:16 +00:00
SendCommand( MSG_TO_PCB, Line );
break;
case LIB_PIN_T:
2007-10-09 13:10:58 +00:00
if( LibItem == NULL )
break;
2008-02-19 07:06:58 +00:00
Pin = (LIB_PIN*) objectToSync;
if( Pin->GetNumber() )
2007-10-08 16:14:16 +00:00
{
wxString pinnum;
Pin->ReturnPinStringNum( pinnum );
sprintf( Line, "$PIN: %s $PART: %s", TO_UTF8( pinnum ),
TO_UTF8( LibItem->GetField( REFERENCE )->m_Text ) );
2007-10-08 16:14:16 +00:00
}
2007-10-09 13:10:58 +00:00
else
{
sprintf( Line, "$PART: %s", TO_UTF8( LibItem->GetField( REFERENCE )->m_Text ) );
}
2007-10-09 13:10:58 +00:00
SendCommand( MSG_TO_PCB, Line );
break;
2007-10-08 16:14:16 +00:00
default:
break;
}
}