66 const std::vector<EDA_ITEM*>& aItems,
82 std::map<VECTOR2I, std::vector<WireEndpoint>> pinPosToWires;
85 struct OriginalWireEndpoints
90 std::map<SCH_LINE*, OriginalWireEndpoints> originalWireEndpoints;
98 std::set<VECTOR2I> selectedSheetPinPositions;
107 selectedSheetPinPositions.insert(
pin->GetPosition() );
117 if( selectedSheetPinPositions.count( line->
GetStartPoint() ) )
120 if( selectedSheetPinPositions.count( line->
GetEndPoint() ) )
133 for(
int ii = 0; ii < 2; ++ii )
143 std::set<EDA_ITEM*> unique_items( drag_items.begin(), drag_items.end() );
149 for(
EDA_ITEM* dragItem : unique_items )
151 if( dragItem->GetParent() && dragItem->GetParent()->IsSelected() )
162 - item->GetPosition();
173 VECTOR2I br_delta = aGrid.
AlignGrid( bottomRight, aSelectionGrid ) - bottomRight;
176 std::map<SCH_SHEET_PIN*, VECTOR2I> originalPinPositions;
177 std::map<SCH_SHEET_PIN*, EDA_ITEMS> pinDragItems;
181 originalPinPositions[
pin] =
pin->GetPosition();
200 pin->SetStoredPos(
pin->GetPosition() );
208 bool canDragWires =
true;
211 auto it = pinPosToWires.find( originalPos );
213 if( it != pinPosToWires.end() && !it->second.empty() )
215 WireEndpoint& we = it->second[0];
218 targetPos = we.wire->GetStartPoint();
220 targetPos = we.wire->GetEndPoint();
231 auto origIt = originalWireEndpoints.find( wire );
233 if( origIt == originalWireEndpoints.end() )
236 VECTOR2I otherEnd = ( origIt->second.start == originalPos )
238 : origIt->second.start;
240 if( selectedSheetPinPositions.find( otherEnd )
241 == selectedSheetPinPositions.end() )
243 canDragWires =
false;
248 if( !canDragWires && !pinDragItems[
pin].
empty() )
251 targetPos =
VECTOR2I( pinPos.
x, originalPos.
y );
255 targetPos = aGrid.
AlignGrid( pinPos, aSelectionGrid );
260 VECTOR2I totalDelta = targetPos - originalPos;
267 if( dragItem->GetParent() && dragItem->GetParent()->IsSelected() )
270 if( totalDelta !=
VECTOR2I( 0, 0 ) )
283 for(
const VECTOR2I& point : connections )
287 std::map<VECTOR2I, int> shifts;
291 for(
const VECTOR2I& conn : connections )
297 if( shifts[gridpt] > max_count )
299 most_common = gridpt;
300 max_count = shifts[most_common];
304 if( most_common !=
VECTOR2I( 0, 0 ) )
308 for(
EDA_ITEM* dragItem : drag_items )
310 if( dragItem->GetParent() && dragItem->GetParent()->IsSelected() )
void AlignSchematicItemsToGrid(SCH_SCREEN *aScreen, const std::vector< EDA_ITEM * > &aItems, EE_GRID_HELPER &aGrid, GRID_HELPER_GRIDS aSelectionGrid, const SCH_ALIGNMENT_CALLBACKS &aCallbacks)
Align a set of schematic items to the grid.