@ -55,6 +55,7 @@
# include <tools/zone_filler_tool.h>
# include <tools/board_inspection_tool.h>
# include <kiplatform/ui.h>
# include <advanced_config.h>
// wxWidgets spends *far* too long calcuating column widths (most of it, believe it or
// not, in repeatedly creating/destroying a wxDC to do the measurement in).
@ -400,6 +401,38 @@ void DIALOG_DRC::UpdateData()
}
/**
* @ brief Checks if two board items are overlapping .
*
* This function determines if the selected marker item and the unselected marker item
* are overlapping based on their positions . Overlapping is defined by their positions being
* equal or by the distance between them being less than a specified minimum difference .
*
* @ param aSelectedMarkerItem Pointer to the selected board item .
* @ param aUnSelectedMarkerItem Pointer to the unselected board item .
* @ return true if the items are overlapping , false otherwise .
*/
bool IsOverlapping ( BOARD_ITEM * aSelectedMarkerItem , BOARD_ITEM * aUnSelectedMarkerItem )
{
double selectedItemX = ( double ) aSelectedMarkerItem - > GetX ( ) / PCB_IU_PER_MM ;
double selectedItemY = ( double ) aSelectedMarkerItem - > GetY ( ) / PCB_IU_PER_MM ;
double unSelectedItemX = ( double ) aUnSelectedMarkerItem - > GetX ( ) / PCB_IU_PER_MM ;
double unSelectedItemY = ( double ) aUnSelectedMarkerItem - > GetY ( ) / PCB_IU_PER_MM ;
double xDiff = selectedItemX > unSelectedItemX ? selectedItemX - unSelectedItemX
: unSelectedItemX - selectedItemX ;
double yDiff = selectedItemY > unSelectedItemY ? selectedItemY - unSelectedItemY
: unSelectedItemY - selectedItemY ;
double minimumMarkerSeparationDistance =
ADVANCED_CFG : : GetCfg ( ) . m_MinimumMarkerSeparationDistance ;
return ( selectedItemX = = unSelectedItemX & & selectedItemY = = unSelectedItemY )
| | ( xDiff < minimumMarkerSeparationDistance & & yDiff < minimumMarkerSeparationDistance )
| | ( xDiff < minimumMarkerSeparationDistance & & selectedItemY = = unSelectedItemY )
| | ( yDiff < minimumMarkerSeparationDistance & & selectedItemX = = unSelectedItemX ) ;
}
void DIALOG_DRC : : OnDRCItemSelected ( wxDataViewEvent & aEvent )
{
BOARD * board = m_frame - > GetBoard ( ) ;
@ -596,7 +629,25 @@ void DIALOG_DRC::OnDRCItemSelected( wxDataViewEvent& aEvent )
}
else
{
m_frame - > FocusOnItem ( item , principalLayer ) ;
if ( item - > Type ( ) = = PCB_MARKER_T )
{
std : : vector < BOARD_ITEM * > items ;
for ( BOARD_ITEM * boardMarkerItem : board - > Markers ( ) )
{
if ( item - > m_Uuid ! = boardMarkerItem - > m_Uuid & & IsOverlapping ( item , boardMarkerItem ) )
{
items . push_back ( boardMarkerItem ) ;
}
}
items . push_back ( item ) ;
m_frame - > FocusOnItems ( items , principalLayer ) ;
}
else
{
m_frame - > FocusOnItem ( item , principalLayer ) ;
}
}
aEvent . Skip ( ) ;