The easiest way is to use both sub-programming and work offsets ... G54 - G59.
First ... make a good part, good program in one vise ... using say G54 as the part location work offset.
Once you have a good part made ... let's say that part was made with program # O1234.
Now create a new main program ... let's call it program # O0001 ... that looks something like this :
G54 ( set work offset to G54 )
M98 P1234 ( call program and O1234 and execute it ... using G54 offsets )
G55 ( set work offset to G55 )
M98 P1234 ( run program O1234 again, this time using the G55 offsets )
Now change your main program ... O1234 ... into a sub program by removing any work offset command ... we're putting them in the new main program ... and ending the program with an M99 ( return to the main program ) ... instead of an M30 ( program end ).
The above is not the most "tool efficient" ... as you make one complete part at each location ... the best way is to incorporate the above for each tool sequence ... but if you accomplish the above and understand it ... you're well on your way.
Hope this spurs your creative energy ... and helps in some small way ...
Check out Real World Machine Shop Software at