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).
I was wondering if you ever figured out how to replace a tag's value in your design file. I am can update the value of the tag but get an error when using the ReplaceInModel API - I am writing in C#.
MessageBox1.Text = MessageBox1.Text + "current tag value: " + tagEl.GetTagValue().ToString() + "\n"; tagEl.SetTagValue(chStr); TextQueryOptions textQueryOptions = new TextQueryOptions { ShouldIncludeEmptyParts = false, ShouldRequireFieldSupport = false }; TextPartIdCollection textParts = tagEl.GetTextPartIds(textQueryOptions); TextPartId textPart = textParts[0]; TextBlock txtBlock = tagEl.GetTextPart(textPart); //Check for change via a text block, it shows the value was changed, so I thought //that maybe I could just use the ReplaceText for the text block MessageBox1.Text = MessageBox1.Text + "txtBlock value: " + txtBlock.ToString() + "\n"; Caret startCaret = txtBlock.CreateStartCaret(); Caret endCaret = txtBlock.CreateEndCaret(); txtBlock.ReplaceText(chStr, startCaret, endCaret); tagEl.ReplaceTextPart(textPart, txtBlock);
I would love to know how you got around this issue!!
Thank you,
Donna
Did you ever figure out how to ReplaceInModel?
// Replace tag text in model string chStr = ""; //assign string TextEdit textEdit = tagEl.AsTextEdit(); TextPartIdCollection textParts = textEdit.GetTextPartIds(new TextQueryOptions()); if (textParts.Count >= 1) { TextBlock textBlock = textEdit.GetTextPart(textParts[0]); //Go thru textParts array to look for text you want to replace textBlock.ReplaceText(chStr, textBlock.CreateStartCaret(), textBlock.CreateEndCaret()); if (TextReplaceStatus.Success == textEdit.ReplaceTextPart(textParts[0], textBlock)) textEdit.ReplaceInModel(tagEl); textBlock.Dispose(); } textParts.Dispose(); textEdit.Dispose();
I hope helps!
Code is C# - you can add code to get the text you want to replace and add to the Text Block of the tag.
I had to dig through the API's, but I did figure it out.
Donna Rodrick
Thank you so much! It worked for me.