If Vertex Groups and Shape Keys don't address the problem, it is straight-forward to make a script. I'm not sure I understand your constraints but they seem to be:
- locations of verts of the initial object are stored
- indices and vert-count are unchanged
- coordinates can change.
- you want to be able to restore those verts in your modified object which are currently selected.
Rather than writing a script + ui for this, i'd first explore the code needed. I'm going to assume you aren't talking about thousands of vertices, if you do need larger meshes then optimization would help speed up the 'overwrite'
As usual many approaches are possible, i'd start with the one that requires least effort to understand and write. Start a new .blend
with a dummy object to represent a simplified version of the objects you are trying to work with in your production files. Get a hang of whether this method works for you or not.
The clone mesh
This makes a mesh clone of your original object, gives it a fake user. The fake user flag tells blender not to delete the Mesh when it has no direct users.
clone.py
import bpy
mode_set = bpy.ops.object.mode_set
ob = bpy.context.active_object
mode_set(mode = 'OBJECT')
clone_mesh = ob.data.copy()
clone_mesh.name = ob.name + '_clone'
clone_mesh.use_fake_user = True
mode_set(mode = 'EDIT') # place originally active object back to edit
This finds the clone and updates the active_object's selected vertices using the previously cloned mesh data.
restore_from_clone.py
import bpy
meshes = bpy.data.meshes
mode_set = bpy.ops.object.mode_set
ob = bpy.context.active_object
mode_set(mode = 'OBJECT') # updates the list of selected verts too
clone_mesh = meshes.get(ob.name + '_clone')
clone_verts = clone_mesh.vertices
for v in ob.data.vertices:
if v.select:
v.co = clone_verts[v.index].co
mode_set(mode = 'EDIT')
Usage without UI:
- The top one you run once, at the start. While your base object is active.
- The second script is what you run whenever you want to restore the selected vertices.
Ui version
Here's a small UI version of that script. You can either pick a directory using the selector or paste it in manually. Even if you pick a file from the FileBrowser it will strip the path to just be a Folder/Directory.
It appears in the Misc panel:

if you have the Suzanne Object selected it can clone the object and make a hidden mesh, or look in the directory provided for a Suzanne.json
, which it can load as the clone mesh.
- clone: Clones the Object's mesh as a hidden mesh called
<object_name>_clone
- restore: Restores the locations of the vertices currently selected
- changed: Selects only those vertices which changed their locations
- import: Tries to import a hidden mesh. The currently selected object's name is used to find the json:
directory/<object_name>.json
- export: Makes a
<object_name>.json
in the directory pointed at.