Microstation ConnectSDK I cannot modify existing text in textblock

Hello, I am scanning a file for text and pass the MSElementDescr to my function for modification.  I have tried a number of methods from the examples file.  I can ADD text, but my ability to modify the existing simple text string seems to be lacking something.  Is there an element add needed, or am I using the incorrect process for modifying existing text?  I am fairly new to programming for Microstation, are there any books explaining how to program for Microstation using Visual Studio 2017 in c++?

Public void getText(MSElementDescr *elm) {

ElementHandle eh(elm,false);
EditElementHandle eeh(elm, true, true, 0);

TextBlockPtr textBlock = TextHandlerBase::GetFirstTextPartValue(eh);
CaretPtr searchStart =textBlock->CreateStartCaret();
CaretPtr searchEnd = textBlock->CreateEndCaret();
ITextQueryCP textQueryHandler = eh.GetITextQuery();

if (!textQueryHandler || !textQueryHandler->IsTextElement(eh)) {
return;
}


ITextEditP textEdit = eh.GetITextEdit();
ITextPartIdPtr textPart;
TextBlockPtr textBlock = textEdit->GetTextPart(eh, *textPart);

if (!textBlock.IsNull() && !textBlock->IsEmpty())
{
WString strW = textBlock->ToString();
 CaretPtr startCaret = textBlock->CreateStartCaret();
  CaretPtr endCaret = textBlock->CreateEndCaret();
   WString originalString = textBlock->ToString();


if (0 == originalString.compare(L"TEXT_TO_MATCH"))

{
std::wostringstream oss;
oss << "this is a test";
textBlock->ReplaceText(oss.str().c_str(), *textBlock->CreateStartCaret(), *textBlock->CreateEndCaret());//CHANGES TEXT IN TEXTBLOCK, BUT NOT IN DESIGN FILE
textBlock->PerformLayout();//DESPERATE TEST TO SEE IF IT WOULD UPDATE FILE... BUT NO
textEdit->ReplaceTextPart(eeh, *textPart, *textBlock);

//THESE REMAIN FROM MY FAILED TESTS BELOW
//ElementRefP erp = eeh.GetElementRef();
//MSElementCP msecp = eeh.GetElementCP();


//eeh.ReplaceInModel(erp); //doesn't work
//eeh.ReplaceElement(msecp); doesn't work
//textBlock->AppendText(oss.str().c_str());//doesn't work
//eeh.AddToModel();//will add element to file, keeps old element this works.
}

}

}

Parents
  • I am scanning a file for text and pass the MSElementDescr to my function

    Here's a MicroStationAPI way to enumerate elements in a model.  The enumeration gives you an immutable ElementHandle.  If you want to modify it, construct an EditElementHandle from it. 

    You may want to test the element first, using ITextQuery.IsTextElement (ElementHandleRC el), as you have done in your code above.  Look in the IncrementText example to see how to implement that test.

    From the MicroStationAPI help about TextBlock: To create a free-standing text element from a TextBlock, use TextHandlerBase::CreateElement.  That creates a new EditElementHandle, which you then add to the DGN model.

     
    Regards, Jon Summers
    LA Solutions

Reply
  • I am scanning a file for text and pass the MSElementDescr to my function

    Here's a MicroStationAPI way to enumerate elements in a model.  The enumeration gives you an immutable ElementHandle.  If you want to modify it, construct an EditElementHandle from it. 

    You may want to test the element first, using ITextQuery.IsTextElement (ElementHandleRC el), as you have done in your code above.  Look in the IncrementText example to see how to implement that test.

    From the MicroStationAPI help about TextBlock: To create a free-standing text element from a TextBlock, use TextHandlerBase::CreateElement.  That creates a new EditElementHandle, which you then add to the DGN model.

     
    Regards, Jon Summers
    LA Solutions

Children
No Data