/// <summary> /// Applies a revised edit (as noted on a prior call to <see cref="AddUpdate"/>). /// </summary> void ApplyRevision() { UpdateOperation uop; // If we already have an update context, it means we're applying a revision in an attempt // to fix a rollforward problem. if (m_CurrentUpdate == null) { uop = new UpdateOperation(m_Revisions); m_CurrentUpdate = new UpdateEditingContext(uop); } else { // Undo the previous recalculation m_CurrentUpdate.RevertChanges(); // Include the latest revision uop = m_CurrentUpdate.UpdateSource; foreach (RevisedEdit rev in m_Revisions) uop.AddRevisedEdit(rev); } m_Revisions = null; try { // Serialize the edit to a string BEFORE we apply the changes (otherwise we'll end // up serializing the modified values) string editString = uop.GetEditString(); // Apply changes, then rework the map model to account for the update uop.ApplyChanges(); m_CurrentUpdate.Recalculate(); // Update topology uop.MapModel.CleanEdit(); // Save the update as part of the working session uop.Session.SaveEditString(uop, editString); m_CurrentUpdate = null; m_NumUpdate++; } catch (RollforwardException rex) { // Remember the problem edit m_Problem = rex.Problem; // The spatial index may be missing stuff (since the recalc exited early) CadastralMapModel model = uop.MapModel; model.EnsureFeaturesAreIndexed(); // Update topology and cleanup any junk model.CleanEdit(); // Re-center on the problem edit if it's off-screen ISpatialDisplay display = base.ActiveDisplay; IPosition newCenter = m_Problem.GetRecenter(display.Extent); if (newCenter != null) display.Center = newCenter; MessageBox.Show("Cannot re-work geometry due to edit " + m_Problem.EditSequence, "Problem", MessageBoxButtons.OK, MessageBoxIcon.Warning); } catch (Exception ex) { MessageBox.Show(ex.StackTrace, ex.Message); m_CurrentUpdate.RevertChanges(); m_CurrentUpdate = null; } }