Hello guys! I have a question.
I want to do following:
Before I was working with V8I implementation, here everything worked fine :
I iterate through said cell descriptor. Whenever I found element with type TEXT_ELM, I changed its font size.
For extraction I used:
mdlText_extract(to extract TextSize from element). Change parameters in extracted TextSize structure. Recreate element with new font size, using mdlText_createW(myElement,myElement,NULL,NULL,NULL,&extractedSize,NULL,NULL,modelRef)
And all worked fine. However, in CONNECT it doesn´t work as expected. I managed it to work, so it changes the font size, but styling and transform suddenly disappears, so I´ve decided to check the new way with EditElementHandle and TextBlock API.
What I tried to do was (simple test to replace existing text) :
ElementHandle eh(out,modelRefP); //out is my MSElement extracted from MSElementDescr iteration i talked before EditElementHandle eeh(out, modelRefP); // Check if the selection is a Text element. ITextQueryCP textQuery = eh.GetITextQuery(); if (!textQuery || !textQuery->IsTextElement(eh)) return 1; // Extract the TextBlock from the Text element. ITextPartIdPtr textPart; TextBlockPtr textBlock = textQuery->GetTextPart(eh, *textPart); if (textBlock.IsNull() || textBlock->IsEmpty()) return 1; // Get the string from the Text block. WString str = textBlock->ToString(); if (str.empty()) return 1; RunPropertiesPtr runPropP = textBlock->GetRunPropertiesForAdd().Clone(); DPoint2d fontSize = runPropP->GetFontSize(); fontSize.x = 20; fontSize.y = 20; runPropP->SetFontSize(fontSize); textBlock->SetRunPropertiesForAdd(*runPropP); CaretPtr searchStart = textBlock->CreateStartCaret(); CaretPtr end = textBlock->CreateEndCaret(); textBlock->Remove(*searchStart,*end); EditElementHandle eeh2; textBlock->AppendText(L"Test"); TextBlockToElementResult res2 = TextHandlerBase::CreateElement(eeh2, nullptr, *textBlock);
My idea was to remove and re-enter same text with different properties, because I couldn´t find a way to do it without that (maybe there is some? Remapping doesn´t involve font size) and changing the RunProperties affects only actions that happen after it is set...
And, as you maybe expected, nothing happens, the text is same. I know that you can call AddToModel (then it appears in model, but the original is still same). I also saw ReplaceInModel function, but the elements have no ElementRef yet.
I´ve tried this (with a little hope):
*out = *eeh2.getElementP();
But i got segfault during the iteration of next elements
Do you guys know how to approach something like this?
Lubo B said:Retrieve element descriptor
Stop! Forget element descriptors — they are so 20th century. Work with ElementHandles and EditElementHandles when writing C++ for CONNECT.
ElementHandle
EditElementHandle
Those are smart pointers that encapsulate an element descriptor and manage its lifetime, so you don't have to.
Lubo B said:I´ve tried this (with a little hope):*out = *eeh2.getElementP();
Use the ChildElemIter.
Regards, Jon Summers LA Solutions