I have 2 mxd's.
mxdA and mxdB
They both show different data, but are both in the same coordinate system.
I want to be able to sync mxdB with mxdA, so that if I pan / zoom in mxdA, I can then, with a single button press, view the same extent in mxdB.
I know that this is possible using a Viewer window (where a 2nd data frame is used rather than a 2nd mxd), however there is a memory leak present where a Viewer window is used alongside an editing session with snapping turned on (NIM103256) which causes our session to crash after <1 hour of editing.
I know that another option could be to use production mapping views, but these seem to be limited to both mxd's having the same datasets, and once you have opened mxdB and linked it to a view, you are then unable to update the view file using mxdA because it is locked by mxdB. This is not practical for us as it would mean closing and re-opening mxdB many times every day (50+)
I'm hoping that there is a way using python where I can calculate the center point of the active dataframe in mxdA and then pan/zoom mxdB (which is already open) to the same location. I can then create a button as an ESRI Add-in to do this automatically.
Calculating the center point is simple enough
<SPAN class="pln">mxd </SPAN><SPAN class="pun">=</SPAN><SPAN class="pln"> arcpy</SPAN><SPAN class="pun">.</SPAN><SPAN class="pln">mapping</SPAN><SPAN class="pun">.</SPAN><SPAN class="typ">MapDocument</SPAN><SPAN class="pun">(</SPAN><SPAN class="str">"Current"</SPAN><SPAN class="pun">)</SPAN><SPAN class="pln">
df </SPAN><SPAN class="pun">=</SPAN><SPAN class="pln"> arcpy</SPAN><SPAN class="pun">.</SPAN><SPAN class="pln">mapping</SPAN><SPAN class="pun">.</SPAN><SPAN class="typ">ListDataFrames</SPAN><SPAN class="pun">(</SPAN><SPAN class="pln">mxd</SPAN><SPAN class="pun">,</SPAN><SPAN class="pln"> </SPAN><SPAN class="str">"Layers"</SPAN><SPAN class="pun">)[</SPAN><SPAN class="lit">0</SPAN><SPAN class="pun">]</SPAN><SPAN class="pln">
</SPAN><SPAN class="com">
# Calculate the centre X coordinate</SPAN><SPAN class="pln">
x </SPAN><SPAN class="pun">=</SPAN><SPAN class="pln"> </SPAN><SPAN class="pun">(</SPAN><SPAN class="pln">df</SPAN><SPAN class="pun">.</SPAN><SPAN class="pln">extent</SPAN><SPAN class="pun">.</SPAN><SPAN class="typ">XMax</SPAN><SPAN class="pln"> </SPAN><SPAN class="pun">+</SPAN><SPAN class="pln"> df</SPAN><SPAN class="pun">.</SPAN><SPAN class="pln">extent</SPAN><SPAN class="pun">.</SPAN><SPAN class="typ">XMin</SPAN><SPAN class="pun">)/</SPAN><SPAN class="lit">2</SPAN><SPAN class="pln">
#</SPAN><SPAN class="com">Calculate the centre Y coordinate</SPAN><SPAN class="pln">
y </SPAN><SPAN class="pun">=</SPAN><SPAN class="pln"> </SPAN><SPAN class="pun">(</SPAN><SPAN class="pln">df</SPAN><SPAN class="pun">.</SPAN><SPAN class="pln">extent</SPAN><SPAN class="pun">.</SPAN><SPAN class="typ">YMax</SPAN><SPAN class="pln"> </SPAN><SPAN class="pun">+</SPAN><SPAN class="pln"> df</SPAN><SPAN class="pun">.</SPAN><SPAN class="pln">extent</SPAN><SPAN class="pun">.</SPAN><SPAN class="typ">YMin</SPAN><SPAN class="pun">)/</SPAN><SPAN class="lit">2</SPAN>
But I'm struggling with passing this center point information to mxdB to get it to pan. Is this even possible without using ArcObjects?
EDIT:
I have written some code that can be run in mxdB which will update mxdB based on the extent of mxdA. However, I need to be able to run the code in mxdA and for it to update the extent of mxdB (as mxdB is a fixed mxd, whereas the name and file path of mxdA could change).
<SPAN class="kwd">import</SPAN><SPAN class="pln"> arcpy
</SPAN><SPAN class="com">#define mxdA</SPAN><SPAN class="pln">
mxd </SPAN><SPAN class="pun">=</SPAN><SPAN class="pln"> arcpy</SPAN><SPAN class="pun">.</SPAN><SPAN class="pln">mapping</SPAN><SPAN class="pun">.</SPAN><SPAN class="typ">MapDocument</SPAN><SPAN class="pun">(</SPAN><SPAN class="pln">r</SPAN><SPAN class="str">"C:\Testing\Scratch\mxdA.mxd"</SPAN><SPAN class="pun">)</SPAN><SPAN class="pln">
</SPAN><SPAN class="com">#define the dataframe from mxdA</SPAN><SPAN class="pln">
df </SPAN><SPAN class="pun">=</SPAN><SPAN class="pln"> arcpy</SPAN><SPAN class="pun">.</SPAN><SPAN class="pln">mapping</SPAN><SPAN class="pun">.</SPAN><SPAN class="typ">ListDataFrames</SPAN><SPAN class="pun">(</SPAN><SPAN class="pln">mxd</SPAN><SPAN class="pun">,</SPAN><SPAN class="pln"> </SPAN><SPAN class="str">"Layers"</SPAN><SPAN class="pun">)[</SPAN><SPAN class="lit">0</SPAN><SPAN class="pun">]</SPAN><SPAN class="pln">
</SPAN><SPAN class="com">#define mxdB</SPAN><SPAN class="pln">
mxd2 </SPAN><SPAN class="pun">=</SPAN><SPAN class="pln"> arcpy</SPAN><SPAN class="pun">.</SPAN><SPAN class="pln">mapping</SPAN><SPAN class="pun">.</SPAN><SPAN class="typ">MapDocument</SPAN><SPAN class="pun">(</SPAN><SPAN class="str">"Current"</SPAN><SPAN class="pun">)</SPAN><SPAN class="pln">
</SPAN><SPAN class="com">#define the dataframe from mxdB</SPAN><SPAN class="pln">
df2 </SPAN><SPAN class="pun">=</SPAN><SPAN class="pln"> arcpy</SPAN><SPAN class="pun">.</SPAN><SPAN class="pln">mapping</SPAN><SPAN class="pun">.</SPAN><SPAN class="typ">ListDataFrames</SPAN><SPAN class="pun">(</SPAN><SPAN class="pln">mxd2</SPAN><SPAN class="pun">,</SPAN><SPAN class="str">"Layers"</SPAN><SPAN class="pun">)[</SPAN><SPAN class="lit">0</SPAN><SPAN class="pun">]</SPAN><SPAN class="pln">
</SPAN><SPAN class="com">#set 'newextent' to be the extent of the dataframe in mxdA</SPAN><SPAN class="pln">
newextent </SPAN><SPAN class="pun">=</SPAN><SPAN class="pln"> df</SPAN><SPAN class="pun">.</SPAN><SPAN class="pln">extent
</SPAN><SPAN class="com">#set the extent of the dataframe in mxdB to be the same as that of mxdA</SPAN><SPAN class="pln">
df2</SPAN><SPAN class="pun">.</SPAN><SPAN class="pln">extent </SPAN><SPAN class="pun">=</SPAN><SPAN class="pln"> newextent
</SPAN><SPAN class="com">#refresh the view in mxdB</SPAN><SPAN class="pln">
arcpy</SPAN><SPAN class="pun">.</SPAN><SPAN class="typ">RefreshActiveView</SPAN><SPAN class="pun">()</SPAN>
I am using ArcGIS (Advanced) 10.2.2
Many thanks
Dan