EESchema schematic item hit test improvements.
* Merge LocateAnyPin() and LocatePinEnd() into single method and move to SCH_SCREEN object.
This commit is contained in:
parent
f34926be10
commit
a9a96c0e51
|
@ -753,7 +753,7 @@ bool IsJunctionNeeded( SCH_EDIT_FRAME* frame, wxPoint& pos )
|
||||||
if( PickStruct( pos, frame->GetScreen(), WIREITEM | WIRE_BUS_ENDPOINTS_ONLY ) )
|
if( PickStruct( pos, frame->GetScreen(), WIREITEM | WIRE_BUS_ENDPOINTS_ONLY ) )
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if( frame->LocatePinEnd( frame->GetScreen()->GetDrawItems(), pos ) )
|
if( frame->GetScreen()->GetPin( pos, NULL, true ) )
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -156,7 +156,7 @@ SCH_ITEM* SCH_EDIT_FRAME::SchematicGeneralLocateAndDisplay( const wxPoint& refpo
|
||||||
|
|
||||||
if( DrawStruct ) // We have found a wire: Search for a connected pin at the same location
|
if( DrawStruct ) // We have found a wire: Search for a connected pin at the same location
|
||||||
{
|
{
|
||||||
Pin = LocateAnyPin( (SCH_ITEM*) m_CurrentSheet->LastDrawList(), refpoint, &LibItem );
|
Pin = GetScreen()->GetPin( refpoint, &LibItem );
|
||||||
|
|
||||||
if( Pin )
|
if( Pin )
|
||||||
{
|
{
|
||||||
|
@ -192,7 +192,7 @@ SCH_ITEM* SCH_EDIT_FRAME::SchematicGeneralLocateAndDisplay( const wxPoint& refpo
|
||||||
}
|
}
|
||||||
|
|
||||||
/* search for a pin */
|
/* search for a pin */
|
||||||
Pin = LocateAnyPin( (SCH_ITEM*) m_CurrentSheet->LastDrawList(), refpoint, &LibItem );
|
Pin = GetScreen()->GetPin( refpoint, &LibItem );
|
||||||
|
|
||||||
if( Pin )
|
if( Pin )
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include "gr_basic.h"
|
#include "gr_basic.h"
|
||||||
#include "sch_item_struct.h"
|
#include "sch_item_struct.h"
|
||||||
#include "wxEeschemaStruct.h"
|
#include "wxEeschemaStruct.h"
|
||||||
|
#include "class_sch_screen.h"
|
||||||
|
|
||||||
#include "general.h"
|
#include "general.h"
|
||||||
#include "protos.h"
|
#include "protos.h"
|
||||||
|
@ -49,37 +50,3 @@ void SCH_EDIT_FRAME::TestDanglingEnds( SCH_ITEM* aDrawList, wxDC* aDC )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test if point pos is on a pin end.
|
|
||||||
*
|
|
||||||
* @param DrawList = List of SCH_ITEMs to check.
|
|
||||||
* @param pos - Position of pin end to locate.
|
|
||||||
* @return a LIB_PIN pointer to the located pin or NULL if no pin was found.
|
|
||||||
*/
|
|
||||||
LIB_PIN* SCH_EDIT_FRAME::LocatePinEnd( SCH_ITEM* DrawList, const wxPoint& pos )
|
|
||||||
{
|
|
||||||
SCH_COMPONENT* DrawLibItem;
|
|
||||||
LIB_PIN* Pin;
|
|
||||||
wxPoint pinpos;
|
|
||||||
|
|
||||||
Pin = LocateAnyPin( DrawList, pos, &DrawLibItem );
|
|
||||||
|
|
||||||
if( !Pin )
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
pinpos = Pin->GetPosition();
|
|
||||||
|
|
||||||
if( DrawLibItem == NULL )
|
|
||||||
NEGATE( pinpos.y ); // In libraries Y axis is bottom to top
|
|
||||||
// and in schematic Y axis is top to bottom
|
|
||||||
|
|
||||||
else // calculate the pin position in schematic
|
|
||||||
pinpos = DrawLibItem->GetTransform().TransformCoordinate( pinpos ) + DrawLibItem->m_Pos;
|
|
||||||
|
|
||||||
if( pos == pinpos )
|
|
||||||
return Pin;
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ static bool MarkConnected( SCH_EDIT_FRAME* frame, SCH_ITEM* ListStruct, SCH_LINE
|
||||||
#define SEGM ( (SCH_LINE*) Struct )
|
#define SEGM ( (SCH_LINE*) Struct )
|
||||||
if( segment->IsEndPoint( SEGM->m_Start ) )
|
if( segment->IsEndPoint( SEGM->m_Start ) )
|
||||||
{
|
{
|
||||||
if( !frame->LocatePinEnd( ListStruct, SEGM->m_Start ) )
|
if( !frame->GetScreen()->GetPin( SEGM->m_Start, NULL, true ) )
|
||||||
{
|
{
|
||||||
Struct->m_Flags |= CANDIDATE;
|
Struct->m_Flags |= CANDIDATE;
|
||||||
MarkConnected( frame, ListStruct, SEGM );
|
MarkConnected( frame, ListStruct, SEGM );
|
||||||
|
@ -59,7 +59,7 @@ static bool MarkConnected( SCH_EDIT_FRAME* frame, SCH_ITEM* ListStruct, SCH_LINE
|
||||||
}
|
}
|
||||||
if( segment->IsEndPoint( SEGM->m_End ) )
|
if( segment->IsEndPoint( SEGM->m_End ) )
|
||||||
{
|
{
|
||||||
if( !frame->LocatePinEnd( ListStruct, SEGM->m_End ) )
|
if( !frame->GetScreen()->GetPin( SEGM->m_End, NULL, true ) )
|
||||||
{
|
{
|
||||||
Struct->m_Flags |= CANDIDATE;
|
Struct->m_Flags |= CANDIDATE;
|
||||||
MarkConnected( frame, ListStruct, SEGM );
|
MarkConnected( frame, ListStruct, SEGM );
|
||||||
|
|
|
@ -689,9 +689,10 @@ void SCH_EDIT_FRAME::OnHotKey( wxDC* DC, int hotkey, EDA_ITEM* DrawStruct )
|
||||||
break;
|
break;
|
||||||
if( DrawStruct->Type() == SCH_SHEET_T )
|
if( DrawStruct->Type() == SCH_SHEET_T )
|
||||||
{
|
{
|
||||||
|
SCH_SHEET* sheet = (SCH_SHEET*) DrawStruct;
|
||||||
// If it's a sheet, then check if a pinsheet is under the cursor
|
// If it's a sheet, then check if a pinsheet is under the cursor
|
||||||
SCH_SHEET_PIN* slabel = LocateSheetLabel( (SCH_SHEET*) DrawStruct,
|
SCH_SHEET_PIN* slabel = sheet->GetLabel( GetScreen()->m_Curseur );
|
||||||
GetScreen()->m_Curseur );
|
|
||||||
if( slabel )
|
if( slabel )
|
||||||
DrawStruct = slabel;
|
DrawStruct = slabel;
|
||||||
}
|
}
|
||||||
|
@ -707,8 +708,7 @@ void SCH_EDIT_FRAME::OnHotKey( wxDC* DC, int hotkey, EDA_ITEM* DrawStruct )
|
||||||
if( HK_Descr->m_Idcommand == HK_COPY_COMPONENT_OR_LABEL )
|
if( HK_Descr->m_Idcommand == HK_COPY_COMPONENT_OR_LABEL )
|
||||||
{
|
{
|
||||||
GetScreen()->SetCurItem( (SCH_ITEM*) DrawStruct );
|
GetScreen()->SetCurItem( (SCH_ITEM*) DrawStruct );
|
||||||
wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED,
|
wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED, HK_Descr->m_IdMenuEvent );
|
||||||
HK_Descr->m_IdMenuEvent );
|
|
||||||
wxPostEvent( this, event );
|
wxPostEvent( this, event );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -324,38 +324,6 @@ bool SnapPoint2( const wxPoint& aPosRef, int SearchMask, SCH_ITEM* DrawList )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SCH_SHEET_PIN* LocateSheetLabel( SCH_SHEET* Sheet, const wxPoint& pos )
|
|
||||||
{
|
|
||||||
return Sheet->GetLabel( pos );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LIB_PIN* LocateAnyPin( SCH_ITEM* DrawList, const wxPoint& RefPos, SCH_COMPONENT** libpart )
|
|
||||||
{
|
|
||||||
SCH_ITEM* item;
|
|
||||||
SCH_COMPONENT* component = NULL;
|
|
||||||
LIB_PIN* pin = NULL;
|
|
||||||
|
|
||||||
for( item = DrawList; item != NULL; item = item->Next() )
|
|
||||||
{
|
|
||||||
if( item->Type() != SCH_COMPONENT_T )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
component = (SCH_COMPONENT*) item;
|
|
||||||
|
|
||||||
pin = (LIB_PIN*) component->GetDrawItem( RefPos, LIB_PIN_T );
|
|
||||||
|
|
||||||
if( pin )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( libpart )
|
|
||||||
*libpart = component;
|
|
||||||
|
|
||||||
return pin;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
SCH_SHEET_PIN* LocateAnyPinSheet( const wxPoint& RefPos, SCH_ITEM* DrawList )
|
SCH_SHEET_PIN* LocateAnyPinSheet( const wxPoint& RefPos, SCH_ITEM* DrawList )
|
||||||
{
|
{
|
||||||
SCH_ITEM* DrawStruct;
|
SCH_ITEM* DrawStruct;
|
||||||
|
@ -366,7 +334,8 @@ SCH_SHEET_PIN* LocateAnyPinSheet( const wxPoint& RefPos, SCH_ITEM* DrawList )
|
||||||
if( DrawStruct->Type() != SCH_SHEET_T )
|
if( DrawStruct->Type() != SCH_SHEET_T )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
PinSheet = LocateSheetLabel( (SCH_SHEET*) DrawStruct, RefPos );
|
SCH_SHEET* sheet = (SCH_SHEET*) DrawStruct;
|
||||||
|
PinSheet = sheet->GetLabel( RefPos );
|
||||||
|
|
||||||
if( PinSheet )
|
if( PinSheet )
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -70,8 +70,9 @@ bool SCH_EDIT_FRAME::OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu )
|
||||||
|
|
||||||
if( DrawStruct && (DrawStruct->Type() == SCH_SHEET_T) )
|
if( DrawStruct && (DrawStruct->Type() == SCH_SHEET_T) )
|
||||||
{
|
{
|
||||||
SCH_SHEET_PIN* slabel;
|
SCH_SHEET* sheet = (SCH_SHEET*) DrawStruct;
|
||||||
slabel = LocateSheetLabel( (SCH_SHEET*) DrawStruct, GetScreen()->m_Curseur );
|
SCH_SHEET_PIN* slabel = sheet->GetLabel( GetScreen()->m_Curseur );
|
||||||
|
|
||||||
if( slabel )
|
if( slabel )
|
||||||
DrawStruct = slabel;
|
DrawStruct = slabel;
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,11 +116,6 @@ SCH_COMPONENT* LocateSmallestComponent( SCH_SCREEN* Screen );
|
||||||
*/
|
*/
|
||||||
SCH_ITEM* PickStruct( const wxPoint& refpos, SCH_SCREEN* screen, int SearchMask );
|
SCH_ITEM* PickStruct( const wxPoint& refpos, SCH_SCREEN* screen, int SearchMask );
|
||||||
|
|
||||||
SCH_SHEET_PIN* LocateSheetLabel( SCH_SHEET* Sheet, const wxPoint& pos );
|
|
||||||
LIB_PIN* LocateAnyPin( SCH_ITEM* DrawList,
|
|
||||||
const wxPoint& RefPos,
|
|
||||||
SCH_COMPONENT** libpart = NULL );
|
|
||||||
|
|
||||||
SCH_SHEET_PIN* LocateAnyPinSheet( const wxPoint& RefPos, SCH_ITEM* DrawList );
|
SCH_SHEET_PIN* LocateAnyPinSheet( const wxPoint& RefPos, SCH_ITEM* DrawList );
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -378,7 +378,8 @@ void SCH_SCREEN::ClearDrawingState()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LIB_PIN* SCH_SCREEN::GetPin( const wxPoint& aPosition, SCH_COMPONENT** aComponent )
|
LIB_PIN* SCH_SCREEN::GetPin( const wxPoint& aPosition, SCH_COMPONENT** aComponent,
|
||||||
|
bool aEndPointOnly )
|
||||||
{
|
{
|
||||||
SCH_ITEM* item;
|
SCH_ITEM* item;
|
||||||
SCH_COMPONENT* component = NULL;
|
SCH_COMPONENT* component = NULL;
|
||||||
|
@ -397,6 +398,9 @@ LIB_PIN* SCH_SCREEN::GetPin( const wxPoint& aPosition, SCH_COMPONENT** aComponen
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( pin && aEndPointOnly && ( component->GetPinPhysicalPosition( pin ) != aPosition ) )
|
||||||
|
pin = NULL;
|
||||||
|
|
||||||
if( aComponent )
|
if( aComponent )
|
||||||
*aComponent = component;
|
*aComponent = component;
|
||||||
|
|
||||||
|
|
|
@ -128,7 +128,17 @@ public:
|
||||||
|
|
||||||
int CountConnectedItems( const wxPoint& aPos, bool aTestJunctions ) const;
|
int CountConnectedItems( const wxPoint& aPos, bool aTestJunctions ) const;
|
||||||
|
|
||||||
LIB_PIN* GetPin( const wxPoint& aPosition, SCH_COMPONENT** aComponent = NULL );
|
/**
|
||||||
|
* Function GetPin
|
||||||
|
* test the screen for a component pin item at \a aPosition.
|
||||||
|
* @param aPosition Position to test.
|
||||||
|
* @param aComponent The component if a pin was found, otherwise NULL.
|
||||||
|
* @param aEndPointOnly Set to true to test if \a aPosition is the connection
|
||||||
|
* point of the pin.
|
||||||
|
* @return The pin item if found, otherwise NULL.
|
||||||
|
*/
|
||||||
|
LIB_PIN* GetPin( const wxPoint& aPosition, SCH_COMPONENT** aComponent = NULL,
|
||||||
|
bool aEndPointOnly = false );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function ClearAnnotation
|
* Function ClearAnnotation
|
||||||
|
|
|
@ -668,7 +668,6 @@ public:
|
||||||
void RepeatDrawItem( wxDC* DC );
|
void RepeatDrawItem( wxDC* DC );
|
||||||
|
|
||||||
void TestDanglingEnds( SCH_ITEM* DrawList, wxDC* DC );
|
void TestDanglingEnds( SCH_ITEM* DrawList, wxDC* DC );
|
||||||
LIB_PIN* LocatePinEnd( SCH_ITEM* DrawList, const wxPoint& pos );
|
|
||||||
|
|
||||||
// ERC:
|
// ERC:
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue