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. }
}
I've created a new version of the ModifyTextTool example. It has two key-ins: CHANGECASE and CHANGETEXT.
Both commands behave the same idiosyncratic way as the original example: the text element isn't replaced, but a new text element is created with the substitution.
ModifyTextTool.zip
Regards, Jon Summers LA Solutions
Hello Jon,
"the text element isn't replaced, but a new text element is created with the substitution. "
I have no problems "adding" the text to my file... my whole problem is to simply alter the existing text string characters. My text strings contain MSLINKS that need to remain in place, so I want to modify the existing string from stringY to stringX but not delete, or add.
CaretPtr caretStart = textBlock->CreateStartCaret();
CaretPtr caretEnd = textBlock->CreateEndCaret();
textBlock->ReplaceText(changeText.c_str(), *caretStart, *caretEnd)
changing the variable "changeText shows as altered text in my textBlock, but not in my design file. textBlock->ToString() shows the correct value, but no change in the design file.
Is is possible to simply change the existing string by not adding or deleting?
Thanks for your efforts.
John
I've published an article about an example ReplaceTextTool.
It adds some commands to replace text, rather than copy text as in the SDK example. In particular, it shows how to extract text from a TextBlock, and how to update the text in a TextBlock.
TextBlock
Answer Verified By: John Schenk
Thanks SOOOO much Jon, this is exactly what I needed!!!!!!
Please use the 'This Answered My Question' button to mark this thread as answered.