I'm trying to update the URL for Engineering Links in a collection of DGN files. The problem is that I seam to be creating duplicates of the TAG when writing the updated element back into the model.
After processing a file, following the engineering link still takes you to the old address and not the new one.
/// <summary> /// Scans model looking for tag elements processing them withScans model looking for tag elements, processing them with /// <see cref="TagElementProcessor(Element, DgnModelRef)"/> /// </summary> /// <param name="model">The model to scan</param> private void UpdateEngineeringLinks(DgnModel model) { var criteria = new ScanCriteria(); var elementTypes = new MSElementType[] { MSElementType.Tag }; criteria.AddElementTypes(elementTypes); criteria.SetModelRef(model); var status = criteria.Scan(TagElementProcessor); } /// <summary> /// Call back method for UpdateEngineeringLinks model scan. <see cref="Bentley.DgnPlatformNET.ScanDelegate"/> /// <para> /// If the element is an internet url tag, get the current value and then use <see cref="UpdateValue(string, out bool)"/> /// to perform a replace of the matching part. Then if updated, set as the new value for the tag. /// </para> /// </summary> /// <param name="el">The current element that matches the scan criteria</param> /// <param name="modelRef">The model</param> /// <returns></returns> public StatusInt TagElementProcessor(Element el, DgnModelRef modelRef) { if(el.ElementType == MSElementType.Tag) { var model = modelRef.GetDgnModel(); if (model.IsReadOnly) { return StatusInt.Error; } TagElement tagElement = (TagElement)el; if(tagElement.TagSetName.Equals( "internet", StringComparison.InvariantCultureIgnoreCase) && tagElement.TagName.Equals("url", StringComparison.InvariantCultureIgnoreCase)) { var oldValue = tagElement.GetTagValue().ToString(); var newValue = UpdateValue(oldValue, out bool updated); if (updated) { LogDetails.AppendLine($"Updating Engineering link {tagElement.TagName} from '{oldValue}' to '{newValue}'"); tagElement.SetTagValue(newValue); tagElement.ReplaceInModel(null); } else { LogDetails.AppendLine($"Skipping Engineering link {tagElement.TagName} with value '{oldValue}'"); } return StatusInt.Success; } } return StatusInt.Error; }
Am I missing something? (easily done given the poor quality of the API documentation).
Thank you so much! It worked for me.