[CONNECT C#] - Issue with TagElement.ReplaceInModel(null)

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).

Parents
  • 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

  • // 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

Reply Children
No Data