Grid Anchors: don't anchor from graphic lines when moving connectables

Fixes: https://gitlab.com/kicad/code/kicad/-/issues/13672
This commit is contained in:
Mike Williams 2023-08-21 10:32:44 -04:00
parent 55a7b9e6bf
commit 8b79ab708a
1 changed files with 26 additions and 7 deletions

View File

@ -78,14 +78,22 @@ VECTOR2I EE_GRID_HELPER::BestDragOrigin( const VECTOR2I& aMousePos, GRID_HELPER_
{ {
clearAnchors(); clearAnchors();
// Text anchors are often off the connectivity grid. For now, this means // If we're working with any connectable objects, skip non-connectable objects
// we can only consider anchors from text objects if they are the only thing // since they are often off-grid, e.g. text anchors
// selected. bool hasConnectables = false;
bool includeText = ( aItems.Size() == 1
|| aItems.OnlyContains( { SCH_TEXT_T, SCH_TEXTBOX_T, SCH_FIELD_T } ) );
for( EDA_ITEM* item : aItems ) for( EDA_ITEM* item : aItems )
computeAnchors( static_cast<SCH_ITEM*>( item ), aMousePos, true, includeText ); {
GRID_HELPER_GRIDS grid = GetItemGrid( static_cast<SCH_ITEM*>( item ) );
if( grid == GRID_CONNECTABLE || grid == GRID_WIRES )
{
hasConnectables = true;
break;
}
}
for( EDA_ITEM* item : aItems )
computeAnchors( static_cast<SCH_ITEM*>( item ), aMousePos, true, !hasConnectables );
double worldScale = m_toolMgr->GetView()->GetGAL()->GetWorldScale(); double worldScale = m_toolMgr->GetView()->GetGAL()->GetWorldScale();
double lineSnapMinCornerDistance = 50.0 / worldScale; double lineSnapMinCornerDistance = 50.0 / worldScale;
@ -392,6 +400,9 @@ GRID_HELPER_GRIDS EE_GRID_HELPER::GetItemGrid( const SCH_ITEM* aItem )
void EE_GRID_HELPER::computeAnchors( SCH_ITEM *aItem, const VECTOR2I &aRefPos, bool aFrom, void EE_GRID_HELPER::computeAnchors( SCH_ITEM *aItem, const VECTOR2I &aRefPos, bool aFrom,
bool aIncludeText ) bool aIncludeText )
{ {
bool isGraphicLine =
aItem->Type() == SCH_LINE_T && static_cast<SCH_LINE*>( aItem )->IsGraphicLine();
switch( aItem->Type() ) switch( aItem->Type() )
{ {
case SCH_TEXT_T: case SCH_TEXT_T:
@ -412,6 +423,12 @@ void EE_GRID_HELPER::computeAnchors( SCH_ITEM *aItem, const VECTOR2I &aRefPos, b
case SCH_JUNCTION_T: case SCH_JUNCTION_T:
case SCH_NO_CONNECT_T: case SCH_NO_CONNECT_T:
case SCH_LINE_T: case SCH_LINE_T:
// Don't add anchors for graphic lines unless we're including text,
// they may be on a non-connectable grid
if( isGraphicLine && !aIncludeText )
break;
KI_FALLTHROUGH;
case SCH_GLOBAL_LABEL_T: case SCH_GLOBAL_LABEL_T:
case SCH_HIER_LABEL_T: case SCH_HIER_LABEL_T:
case SCH_LABEL_T: case SCH_LABEL_T:
@ -431,7 +448,9 @@ void EE_GRID_HELPER::computeAnchors( SCH_ITEM *aItem, const VECTOR2I &aRefPos, b
break; break;
} }
if( aItem->Type() == SCH_LINE_T ) // Don't add anchors for graphic lines unless we're including text,
// they may be on a non-connectable grid
if( aItem->Type() == SCH_LINE_T && ( aIncludeText || !isGraphicLine ) )
{ {
SCH_LINE* line = static_cast<SCH_LINE*>( aItem ); SCH_LINE* line = static_cast<SCH_LINE*>( aItem );
VECTOR2I pt = Align( aRefPos ); VECTOR2I pt = Align( aRefPos );