Thanks for the confirmation Jeremy.
I'll shed a bit of light on why I need this functionality and also waffle on a bit about my current project and what I am using the Revit API to achieve.
The company I work for manufactures panelised structural roof and wall systems for the construction industry. Part of the service we offer is to take the design documents provided for a building and prepare a full set of manufacturing shop details and on-site assembly instructions specific to our products. This is currently all done manually in 2D AutoCAD with the manufacturing data interpreted and entered manually into our manufacturing systems. It is very labor intensive and prone to error. In terms of complexity and functionality required, it is similar to, but more difficult than structural steelwork detailing.
I have the task of developing a suite of add-in applications that take a building modeled in Revit and slice up the walls and roofs into customised product components according to our manufacturing and design parameters. I then must automatically prepare the shop drawings and export the manufacturing data for all components of the building. There are typically many thousands of such components and all have to comply with very complex and context-sensitive panelisation constraints and component selections. The built-in Revit functionality such as curtain walls and component parts could handle some of the work, but there are significant short-falls and show stoppers with each method and so I have needed to re-invent the wheel for many things while leveraging standard Revit functionality in unusual ways as much as possible. I'm over one hundred thousand lines of code into this at this point and there is much further to go.
Now within all that mess I need to maintain hierarchies of dependant Revit Elements. This is all pretty straight forward except for the issue of deleted elements. If a user deletes a parent element, I want to detect this in the updater and also remove its children and when a child element is deleted I want to either roll-back the change or re-instate a new element in its place. Because I am using UniqueIds exclusively for storage and tracking and only ever deal with ElementIds for live processing I am unable to determine exactly what relationships (if any) a deleted element has and then act accordingly.
In earlier versions of my application it wasn't a strong requirement to support work-sharing so I got around this problem by using a dedicated element dependency tree stored as a singleton DataStorageElement which simply contained the integer values of the ElementIds. Although not ideal and a little clunky to work with, it works fine and has gotten me this far. But now that I need work-sharing it needs to be replaced.
I could use the unsupported method to extract the ElementId directly from a UniqueId ( int.Parse(uid.Substring(uid.Length - 8, 8), NumberStyles.HexNumber) ) but again work-sharing will break it.
Storing the ElementIds natively into the Entities or as an element parameter won't work either as although they will stay synchonised while work-sharing, they will be set to InvalidElementId before I can read them.
The only thing I can see working is to periodically sweep through all elements in the model using idling events looking for orphans and missing children, not very efficient and with the complexity levels these models will be operating at it would be quite laggy.
As I see it, providing a list of ElementIds for deleted elements is pointless because anyone following the guideline of only storing UniqueIds can't do anything with them. Replacing the deleted ElementId collection within the UpdaterData object with the equivalent UniqueId strings makes much more sense. I just want to know whether the deleted Element is one that I'm interested in, providing the UniqueId will solve that nicely and increase the usefulness of the API for work-sharing.
I think I'll have to ditch the work-sharing support again until something changes.