70 const std::vector<EDA_ITEM*>& aItems,
86 std::map<VECTOR2I, std::vector<WireEndpoint>> pinPosToWires;
89 struct OriginalWireEndpoints
94 std::map<SCH_LINE*, OriginalWireEndpoints> originalWireEndpoints;
102 std::set<VECTOR2I> selectedSheetPinPositions;
111 selectedSheetPinPositions.insert(
pin->GetPosition() );
121 if( selectedSheetPinPositions.count( line->
GetStartPoint() ) )
124 if( selectedSheetPinPositions.count( line->
GetEndPoint() ) )
137 for(
int ii = 0; ii < 2; ++ii )
147 std::set<EDA_ITEM*> unique_items( drag_items.begin(), drag_items.end() );
153 for(
EDA_ITEM* dragItem : unique_items )
155 if( dragItem->GetParent() && dragItem->GetParent()->IsSelected() )
166 - item->GetPosition();
177 VECTOR2I br_delta = aGrid.
AlignGrid( bottomRight, aSelectionGrid ) - bottomRight;
180 std::map<SCH_SHEET_PIN*, VECTOR2I> originalPinPositions;
181 std::map<SCH_SHEET_PIN*, EDA_ITEMS> pinDragItems;
185 originalPinPositions[
pin] =
pin->GetPosition();
204 pin->SetStoredPos(
pin->GetPosition() );
212 bool canDragWires =
true;
215 auto it = pinPosToWires.find( originalPos );
217 if( it != pinPosToWires.end() && !it->second.empty() )
219 WireEndpoint& we = it->second[0];
222 targetPos = we.wire->GetStartPoint();
224 targetPos = we.wire->GetEndPoint();
235 auto origIt = originalWireEndpoints.find( wire );
237 if( origIt == originalWireEndpoints.end() )
240 VECTOR2I otherEnd = ( origIt->second.start == originalPos )
242 : origIt->second.start;
244 if( selectedSheetPinPositions.find( otherEnd )
245 == selectedSheetPinPositions.end() )
247 canDragWires =
false;
252 if( !canDragWires && !pinDragItems[
pin].
empty() )
255 targetPos =
VECTOR2I( pinPos.
x, originalPos.
y );
259 targetPos = aGrid.
AlignGrid( pinPos, aSelectionGrid );
264 VECTOR2I totalDelta = targetPos - originalPos;
271 if( dragItem->GetParent() && dragItem->GetParent()->IsSelected() )
274 if( totalDelta !=
VECTOR2I( 0, 0 ) )
287 for(
const VECTOR2I& point : connections )
291 std::map<VECTOR2I, int> shifts;
295 for(
const VECTOR2I& conn : connections )
301 if( shifts[gridpt] > max_count )
303 most_common = gridpt;
304 max_count = shifts[most_common];
308 if( most_common !=
VECTOR2I( 0, 0 ) )
312 for(
EDA_ITEM* dragItem : drag_items )
314 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.