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. }
}
Hi John,
please (it seems I have to ask everybody) read and follow this forum best practices!
John Schenk said:but my ability to modify the existing simple text string seems to be lacking something
Did you search this forum for similar discussions? How to edit text using C++ API was discussed several times.
John Schenk said:EditElementHandle eeh(elm, true, true, 0);
I am not sure whether 0 is right.
To use explicit ISessionMgr::GetActiveDgnModelP() is better in my opinion.
John Schenk said://eeh.ReplaceInModel(erp); //doesn't work
EditElementHandle::ReplaceInModel() method is (I think) the only correct method how to update element existing in DGN file.
But your code does not tell too much. What value is returned by the method?
John Schenk said:I am fairly new to programming for Microstation, are there any books explaining how to program for Microstation using Visual Studio 2017 in c++?
Please respect the rule "one post = one topic" and do not merge more problems into one discussion. But anyway...
There is no official book for MicroStation developers.
The best sources are MicroStationAPI help file, combined with examples delivered with MicroStation SDK.
Plus, Bentley Developer Portal lists a few more sources (e.g. MicroStation Programming blog is not bad).
Personally, I think one from the best sources is this forum, because typical problems were discussed here already.
With regards,
Jan
Bentley Accredited Developer: iTwin Platform - AssociateLabyrinth Technology | dev.notes() | cad.point