Push schematic get connection code into schematic screen object.
This commit is contained in:
parent
14e3507e16
commit
ce983218f8
|
@ -25,7 +25,6 @@ set(EESCHEMA_SRCS
|
||||||
cross-probing.cpp
|
cross-probing.cpp
|
||||||
dangling_ends.cpp
|
dangling_ends.cpp
|
||||||
database.cpp
|
database.cpp
|
||||||
delete.cpp
|
|
||||||
delsheet.cpp
|
delsheet.cpp
|
||||||
dialogs/dialog_color_config.cpp
|
dialogs/dialog_color_config.cpp
|
||||||
dialogs/dialog_plot_schematic_DXF.cpp
|
dialogs/dialog_plot_schematic_DXF.cpp
|
||||||
|
|
|
@ -1,217 +0,0 @@
|
||||||
/************************************/
|
|
||||||
/* delete.cpp */
|
|
||||||
/************************************/
|
|
||||||
|
|
||||||
#include "fctsys.h"
|
|
||||||
#include "gr_basic.h"
|
|
||||||
#include "common.h"
|
|
||||||
#include "class_sch_screen.h"
|
|
||||||
#include "wxEeschemaStruct.h"
|
|
||||||
|
|
||||||
#include "general.h"
|
|
||||||
#include "protos.h"
|
|
||||||
#include "sch_marker.h"
|
|
||||||
#include "sch_junction.h"
|
|
||||||
#include "sch_line.h"
|
|
||||||
#include "sch_sheet.h"
|
|
||||||
#include "sch_text.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Delete a connection, i.e wires or bus connected
|
|
||||||
* stop on a node (more than 2 wires (bus) connected)
|
|
||||||
*/
|
|
||||||
void SCH_EDIT_FRAME::DeleteConnection( bool DeleteFullConnection )
|
|
||||||
{
|
|
||||||
SCH_ITEM* item;
|
|
||||||
EDA_ITEM* tmp;
|
|
||||||
EDA_ITEMS list;
|
|
||||||
PICKED_ITEMS_LIST pickList;
|
|
||||||
SCH_SCREEN* screen = GetScreen();
|
|
||||||
wxPoint pos = screen->GetCrossHairPosition();
|
|
||||||
|
|
||||||
// Clear flags member for all items.
|
|
||||||
screen->ClearDrawingState();
|
|
||||||
screen->BreakSegmentsOnJunctions();
|
|
||||||
|
|
||||||
if( screen->GetNode( pos, list ) == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
for( size_t i = 0; i < list.size(); i++ )
|
|
||||||
{
|
|
||||||
item = (SCH_ITEM*) list[ i ];
|
|
||||||
item->SetFlags( SELECTEDNODE | STRUCT_DELETED );
|
|
||||||
|
|
||||||
/* Put this structure in the picked list: */
|
|
||||||
ITEM_PICKER picker( item, UR_DELETED );
|
|
||||||
pickList.PushItem( picker );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Mark all wires, junctions, .. connected to one of the item to delete
|
|
||||||
*/
|
|
||||||
if( DeleteFullConnection )
|
|
||||||
{
|
|
||||||
SCH_LINE* segment;
|
|
||||||
|
|
||||||
for( item = screen->GetDrawItems(); item != NULL; item = item->Next() )
|
|
||||||
{
|
|
||||||
if( !(item->GetFlags() & SELECTEDNODE) )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if( item->Type() != SCH_LINE_T )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
screen->MarkConnections( (SCH_LINE*) item );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Search all removable wires (i.e wire with one new dangling end )
|
|
||||||
for( item = screen->GetDrawItems(); item != NULL; item = item->Next() )
|
|
||||||
{
|
|
||||||
bool noconnect = false;
|
|
||||||
|
|
||||||
if( item->GetFlags() & STRUCT_DELETED )
|
|
||||||
continue; // Already seen
|
|
||||||
|
|
||||||
if( !(item->GetFlags() & CANDIDATE) )
|
|
||||||
continue; // Already seen
|
|
||||||
|
|
||||||
if( item->Type() != SCH_LINE_T )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
item->SetFlags( SKIP_STRUCT );
|
|
||||||
|
|
||||||
segment = (SCH_LINE*) item;
|
|
||||||
|
|
||||||
/* Test the SEGM->m_Start point: if this point was connected to
|
|
||||||
* an STRUCT_DELETED wire, and now is not connected, the wire can
|
|
||||||
* be deleted */
|
|
||||||
SCH_LINE* testSegment = NULL;
|
|
||||||
|
|
||||||
for( tmp = screen->GetDrawItems(); tmp != NULL; tmp = tmp->Next() )
|
|
||||||
{
|
|
||||||
if( ( tmp->GetFlags() & STRUCT_DELETED ) == 0 )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if( tmp->Type() != SCH_LINE_T )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
testSegment = (SCH_LINE*) tmp;
|
|
||||||
|
|
||||||
if( testSegment->IsEndPoint( segment->m_Start ) )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( testSegment && !screen->CountConnectedItems( segment->m_Start, true ) )
|
|
||||||
noconnect = true;
|
|
||||||
|
|
||||||
/* Test the SEGM->m_End point: if this point was connected to
|
|
||||||
* an STRUCT_DELETED wire, and now is not connected, the wire
|
|
||||||
* can be deleted */
|
|
||||||
for( tmp = screen->GetDrawItems(); tmp != NULL; tmp = tmp->Next() )
|
|
||||||
{
|
|
||||||
if( ( tmp->GetFlags() & STRUCT_DELETED ) == 0 )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if( tmp->Type() != SCH_LINE_T )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if( testSegment->IsEndPoint( segment->m_End ) )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( tmp && !screen->CountConnectedItems( segment->m_End, true ) )
|
|
||||||
noconnect = true;
|
|
||||||
|
|
||||||
item->ClearFlags( SKIP_STRUCT );
|
|
||||||
|
|
||||||
if( noconnect )
|
|
||||||
{
|
|
||||||
item->SetFlags( STRUCT_DELETED );
|
|
||||||
/* Put this structure in the picked list: */
|
|
||||||
ITEM_PICKER picker( item, UR_DELETED );
|
|
||||||
pickList.PushItem( picker );
|
|
||||||
|
|
||||||
item = screen->GetDrawItems();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete redundant junctions (junctions which connect < 3 end wires
|
|
||||||
// and no pin are removed)
|
|
||||||
for( item = screen->GetDrawItems(); item != NULL; item = item->Next() )
|
|
||||||
{
|
|
||||||
if( item->GetFlags() & STRUCT_DELETED )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if( !(item->GetFlags() & CANDIDATE) )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if( item->Type() != SCH_JUNCTION_T )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
SCH_JUNCTION* junction = (SCH_JUNCTION*) item;
|
|
||||||
|
|
||||||
if( screen->CountConnectedItems( junction->m_Pos, false ) <= 2 )
|
|
||||||
{
|
|
||||||
item->SetFlags( STRUCT_DELETED );
|
|
||||||
|
|
||||||
/* Put this structure in the picked list: */
|
|
||||||
ITEM_PICKER picker( item, UR_DELETED );
|
|
||||||
pickList.PushItem( picker );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for( item = screen->GetDrawItems(); item != NULL; item = item->Next() )
|
|
||||||
{
|
|
||||||
if( item->GetFlags() & STRUCT_DELETED )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if( item->Type() != SCH_LABEL_T )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
tmp = screen->GetWireOrBus( ( (SCH_TEXT*) item )->m_Pos );
|
|
||||||
|
|
||||||
if( tmp && tmp->GetFlags() & STRUCT_DELETED )
|
|
||||||
{
|
|
||||||
item->SetFlags( STRUCT_DELETED );
|
|
||||||
|
|
||||||
/* Put this structure in the picked list: */
|
|
||||||
ITEM_PICKER picker( item, UR_DELETED );
|
|
||||||
pickList.PushItem( picker );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
screen->ClearDrawingState();
|
|
||||||
|
|
||||||
if( pickList.GetCount() )
|
|
||||||
{
|
|
||||||
DeleteItemsInList( DrawPanel, pickList );
|
|
||||||
OnModify();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool SCH_EDIT_FRAME::DeleteItemAtCrossHair( wxDC* DC )
|
|
||||||
{
|
|
||||||
SCH_ITEM* item;
|
|
||||||
SCH_SCREEN* screen = GetScreen();
|
|
||||||
|
|
||||||
item = LocateItem( screen->GetCrossHairPosition(), SCH_COLLECTOR::ParentItems );
|
|
||||||
|
|
||||||
if( item )
|
|
||||||
{
|
|
||||||
bool itemHasConnections = item->IsConnectable();
|
|
||||||
|
|
||||||
GetScreen()->SetCurItem( NULL );
|
|
||||||
SetRepeatItem( NULL );
|
|
||||||
DeleteItem( item );
|
|
||||||
|
|
||||||
if( itemHasConnections )
|
|
||||||
screen->TestDanglingEnds( DrawPanel, DC );
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
|
@ -1044,6 +1044,165 @@ bool SCH_SCREEN::SetComponentFootprint( SCH_SHEET_PATH* aSheetPath, const wxStri
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int SCH_SCREEN::GetConnection( const wxPoint& aPosition, PICKED_ITEMS_LIST& aList,
|
||||||
|
bool aFullConnection )
|
||||||
|
{
|
||||||
|
SCH_ITEM* item;
|
||||||
|
EDA_ITEM* tmp;
|
||||||
|
EDA_ITEMS list;
|
||||||
|
|
||||||
|
// Clear flags member for all items.
|
||||||
|
ClearDrawingState();
|
||||||
|
BreakSegmentsOnJunctions();
|
||||||
|
|
||||||
|
if( GetNode( aPosition, list ) == 0 )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for( size_t i = 0; i < list.size(); i++ )
|
||||||
|
{
|
||||||
|
item = (SCH_ITEM*) list[ i ];
|
||||||
|
item->SetFlags( SELECTEDNODE | STRUCT_DELETED );
|
||||||
|
|
||||||
|
/* Put this structure in the picked list: */
|
||||||
|
ITEM_PICKER picker( item, UR_DELETED );
|
||||||
|
aList.PushItem( picker );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark all wires, junctions, .. connected to the item(s) found.
|
||||||
|
if( aFullConnection )
|
||||||
|
{
|
||||||
|
SCH_LINE* segment;
|
||||||
|
|
||||||
|
for( item = GetDrawItems(); item != NULL; item = item->Next() )
|
||||||
|
{
|
||||||
|
if( !(item->GetFlags() & SELECTEDNODE) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( item->Type() != SCH_LINE_T )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
MarkConnections( (SCH_LINE*) item );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search all attached wires (i.e wire with one new dangling end )
|
||||||
|
for( item = GetDrawItems(); item != NULL; item = item->Next() )
|
||||||
|
{
|
||||||
|
bool noconnect = false;
|
||||||
|
|
||||||
|
if( item->GetFlags() & STRUCT_DELETED )
|
||||||
|
continue; // Already seen
|
||||||
|
|
||||||
|
if( !(item->GetFlags() & CANDIDATE) )
|
||||||
|
continue; // Already seen
|
||||||
|
|
||||||
|
if( item->Type() != SCH_LINE_T )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
item->SetFlags( SKIP_STRUCT );
|
||||||
|
|
||||||
|
segment = (SCH_LINE*) item;
|
||||||
|
|
||||||
|
/* If the wire start point is connected to a wire that has already been found
|
||||||
|
* and now is not connected, add the wire to the list. */
|
||||||
|
SCH_LINE* testSegment = NULL;
|
||||||
|
|
||||||
|
for( tmp = GetDrawItems(); tmp != NULL; tmp = tmp->Next() )
|
||||||
|
{
|
||||||
|
if( ( tmp->GetFlags() & STRUCT_DELETED ) == 0 )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( tmp->Type() != SCH_LINE_T )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
testSegment = (SCH_LINE*) tmp;
|
||||||
|
|
||||||
|
if( testSegment->IsEndPoint( segment->m_Start ) )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( testSegment && !CountConnectedItems( segment->m_Start, true ) )
|
||||||
|
noconnect = true;
|
||||||
|
|
||||||
|
/* If the wire end point is connected to a wire that has already been found
|
||||||
|
* and now is not connected, add the wire to the list. */
|
||||||
|
for( tmp = GetDrawItems(); tmp != NULL; tmp = tmp->Next() )
|
||||||
|
{
|
||||||
|
if( ( tmp->GetFlags() & STRUCT_DELETED ) == 0 )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( tmp->Type() != SCH_LINE_T )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( testSegment->IsEndPoint( segment->m_End ) )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( tmp && !CountConnectedItems( segment->m_End, true ) )
|
||||||
|
noconnect = true;
|
||||||
|
|
||||||
|
item->ClearFlags( SKIP_STRUCT );
|
||||||
|
|
||||||
|
if( noconnect )
|
||||||
|
{
|
||||||
|
item->SetFlags( STRUCT_DELETED );
|
||||||
|
|
||||||
|
ITEM_PICKER picker( item, UR_DELETED );
|
||||||
|
aList.PushItem( picker );
|
||||||
|
|
||||||
|
item = GetDrawItems();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get redundant junctions (junctions which connect < 3 end wires
|
||||||
|
// and no pin)
|
||||||
|
for( item = GetDrawItems(); item != NULL; item = item->Next() )
|
||||||
|
{
|
||||||
|
if( item->GetFlags() & STRUCT_DELETED )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( !(item->GetFlags() & CANDIDATE) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( item->Type() != SCH_JUNCTION_T )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SCH_JUNCTION* junction = (SCH_JUNCTION*) item;
|
||||||
|
|
||||||
|
if( CountConnectedItems( junction->m_Pos, false ) <= 2 )
|
||||||
|
{
|
||||||
|
item->SetFlags( STRUCT_DELETED );
|
||||||
|
|
||||||
|
ITEM_PICKER picker( item, UR_DELETED );
|
||||||
|
aList.PushItem( picker );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for( item = GetDrawItems(); item != NULL; item = item->Next() )
|
||||||
|
{
|
||||||
|
if( item->GetFlags() & STRUCT_DELETED )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( item->Type() != SCH_LABEL_T )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
tmp = GetWireOrBus( ( (SCH_TEXT*) item )->m_Pos );
|
||||||
|
|
||||||
|
if( tmp && tmp->GetFlags() & STRUCT_DELETED )
|
||||||
|
{
|
||||||
|
item->SetFlags( STRUCT_DELETED );
|
||||||
|
|
||||||
|
ITEM_PICKER picker( item, UR_DELETED );
|
||||||
|
aList.PushItem( picker );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ClearDrawingState();
|
||||||
|
|
||||||
|
return aList.GetCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************/
|
/******************************************************************/
|
||||||
/* Class SCH_SCREENS to handle the list of screens in a hierarchy */
|
/* Class SCH_SCREENS to handle the list of screens in a hierarchy */
|
||||||
/******************************************************************/
|
/******************************************************************/
|
||||||
|
|
|
@ -176,7 +176,7 @@ void SCH_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
||||||
case ID_POPUP_SCH_DELETE_NODE:
|
case ID_POPUP_SCH_DELETE_NODE:
|
||||||
case ID_POPUP_SCH_DELETE_CONNECTION:
|
case ID_POPUP_SCH_DELETE_CONNECTION:
|
||||||
DrawPanel->MoveCursorToCrossHair();
|
DrawPanel->MoveCursorToCrossHair();
|
||||||
DeleteConnection( id == ID_POPUP_SCH_DELETE_CONNECTION ? true : false );
|
DeleteConnection( id == ID_POPUP_SCH_DELETE_CONNECTION );
|
||||||
screen->SetCurItem( NULL );
|
screen->SetCurItem( NULL );
|
||||||
m_itemToRepeat = NULL;
|
m_itemToRepeat = NULL;
|
||||||
screen->TestDanglingEnds( DrawPanel, &dc );
|
screen->TestDanglingEnds( DrawPanel, &dc );
|
||||||
|
@ -627,3 +627,43 @@ void SCH_EDIT_FRAME::OnUpdateSelectTool( wxUpdateUIEvent& aEvent )
|
||||||
if( aEvent.GetEventObject() == m_VToolBar )
|
if( aEvent.GetEventObject() == m_VToolBar )
|
||||||
aEvent.Check( GetToolId() == aEvent.GetId() );
|
aEvent.Check( GetToolId() == aEvent.GetId() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_EDIT_FRAME::DeleteConnection( bool aFullConnection )
|
||||||
|
{
|
||||||
|
PICKED_ITEMS_LIST pickList;
|
||||||
|
SCH_SCREEN* screen = GetScreen();
|
||||||
|
wxPoint pos = screen->GetCrossHairPosition();
|
||||||
|
|
||||||
|
if( screen->GetConnection( pos, pickList, aFullConnection ) != 0 )
|
||||||
|
{
|
||||||
|
DeleteItemsInList( DrawPanel, pickList );
|
||||||
|
OnModify();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SCH_EDIT_FRAME::DeleteItemAtCrossHair( wxDC* DC )
|
||||||
|
{
|
||||||
|
SCH_ITEM* item;
|
||||||
|
SCH_SCREEN* screen = GetScreen();
|
||||||
|
|
||||||
|
item = LocateItem( screen->GetCrossHairPosition(), SCH_COLLECTOR::ParentItems );
|
||||||
|
|
||||||
|
if( item )
|
||||||
|
{
|
||||||
|
bool itemHasConnections = item->IsConnectable();
|
||||||
|
|
||||||
|
screen->SetCurItem( NULL );
|
||||||
|
SetRepeatItem( NULL );
|
||||||
|
DeleteItem( item );
|
||||||
|
|
||||||
|
if( itemHasConnections )
|
||||||
|
screen->TestDanglingEnds( DrawPanel, DC );
|
||||||
|
|
||||||
|
OnModify();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
@ -179,13 +179,26 @@ public:
|
||||||
void ReplaceWires( SCH_ITEM* aWireList );
|
void ReplaceWires( SCH_ITEM* aWireList );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Functions MarkConnections
|
* Function MarkConnections
|
||||||
* add all wires and junctions connected to \a aSegment which are not connected any
|
* add all wires and junctions connected to \a aSegment which are not connected any
|
||||||
* component pin to \a aItemList.
|
* component pin to \a aItemList.
|
||||||
* @param aSegment The segment to test for connections.
|
* @param aSegment The segment to test for connections.
|
||||||
*/
|
*/
|
||||||
void MarkConnections( SCH_LINE* aSegment );
|
void MarkConnections( SCH_LINE* aSegment );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Functions GetConnection
|
||||||
|
* adds all of the wires and junctions to \a aList that make up a connection to the
|
||||||
|
* object at \a aPosition.
|
||||||
|
* @param aPosition The position of the first connection object in drawing units.
|
||||||
|
* @param aList The pick list to add the connect item to.
|
||||||
|
* @param aFullConnection If true all the objects that make up this connection are
|
||||||
|
* add to \aList. Otherwise, only the objects up to the first
|
||||||
|
* node are added.
|
||||||
|
* @return The number of items added to \a aList.
|
||||||
|
*/
|
||||||
|
int GetConnection( const wxPoint& aPosition, PICKED_ITEMS_LIST& aList, bool aFullConnection );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function BreakSegment
|
* Function BreakSegment
|
||||||
* checks every wire and bus for a intersection at \a aPoint and break into two segments
|
* checks every wire and bus for a intersection at \a aPoint and break into two segments
|
||||||
|
|
Loading…
Reference in New Issue