Hi Dyda,
This is a question I thought quite a bit about, but eventually came down on the side of not providing as a function. The problem with trying to save restraints for application to a new model is that any solution I could think of was always going to be very fragile - if the new target model isn't identically laid out (same chain IDs, same numbering, etc. etc.) then results would be super unpredictable... and coming up with something that is robust to all eventualities would be quite the challenge.
That being said, it's not too difficult to come up with a bespoke solution using a little bit of scripting in the Python console (Tools/General/Shell - you could also put it into a .py file that you could run in ChimeraX by simply opening it). ISOLDE doesn't currently provide the functionality to apply simple distance restraints with a command, but you can get functionally-equivalent "adaptive" distance restraints using the "isolde add single distance" command. The below script will loop over all currently-enabled simple distance restraints in your model, and create a .cxc command-script to make the equivalent adaptive restraints in a group called "metal coordination restraints". If you need to adjust these later, you can choose this group in the "Manage/Release Adaptive Restraints" GUI panel (there's a drop-down menu for this at top right), or add the argument `groupName "metal coordination restraints"` to any `isolde adjust distances` command. If you want to tweak the script (e.g. to only save restraints from a selection of atoms), keep in mind that ISOLDE pre-creates a bunch of simple distance restraints that are disabled by default, so you'll always want to filter on only the currently-enabled ones.
To use the resultant command script, just make sure your target model is open as model #1, then just open the .cxc file.
from chimerax.isolde import session_extensions as sx
drm = sx.get_distance_restraint_mgr(session.isolde.selected_model)
restraints = drm.all_restraints[drm.all_restraints.enableds]
with open('isolde_restraints.cxc', 'wt') as f:
for r in restraints:
astrings = [f'/{a.residue.chain_id}:{a.residue.number}@{
a.name}' for a in r.atoms]
print(f'isolde restrain single distance #1{astrings[0]}|#1{astrings[1]} {r.target-0.001} {r.target+0.001} strength {r.spring_constant/10} wellHalfWidth {1/r.target} confidence 2 group "metal coordination restraints"', file=f)
(note: the `{r.target-0.001} {r.target+0.001}` defines a "tolerance" region in Angstroms around the target distance where no force is applied. You can set the tolerance to strictly zero by changing this to simply `{r.target} {r.target}`, but doing so uncovered a minor bug in my code that makes satisfied restraints always disappear (their colours get driven down to [0,0,0,0]... I'll have to figure out why that is).