[TD]fix initial balloon placement on rotated view (fix #16234)

This commit is contained in:
wandererfan
2024-09-03 18:01:47 -04:00
committed by Yorik van Havre
parent f9b0ab73b4
commit 44b7c8e34b

View File

@@ -34,6 +34,7 @@
#include <App/Document.h>
#include <Base/Console.h>
#include <Base/Parameter.h>
#include <Base/Tools.h>
#include <Gui/Command.h>
#include <Gui/Document.h>
#include <Gui/Selection.h>
@@ -533,7 +534,6 @@ QGIView* QGSPage::addDrawViewImage(TechDraw::DrawViewImage* imageFeat)
QGIView* QGSPage::addViewBalloon(TechDraw::DrawViewBalloon* balloonFeat)
{
// Base::Console().Message("QGSP::addViewBalloon(%s)\n", balloonFeat->getNameInDocument());
auto vBalloon(new QGIViewBalloon);
addItem(vBalloon);
@@ -552,7 +552,6 @@ QGIView* QGSPage::addViewBalloon(TechDraw::DrawViewBalloon* balloonFeat)
void QGSPage::addBalloonToParent(QGIViewBalloon* balloon, QGIView* parent)
{
// Base::Console().Message("QGSP::addBalloonToParent()\n");
assert(balloon);
assert(parent);//blow up if we don't have Dimension or Parent
QPointF posRef(0., 0.);
@@ -562,10 +561,9 @@ void QGSPage::addBalloonToParent(QGIViewBalloon* balloon, QGIView* parent)
balloon->setZValue(ZVALUE::DIMENSION);
}
//origin is in scene coordinates from QGViewPage
// origin is in scene coordinates from QGVPage widget
void QGSPage::createBalloon(QPointF origin, DrawView* parent)
{
// Base::Console().Message("QGSP::createBalloon(%s)\n", DrawUtil::formatVector(origin).c_str());
std::string featName = getDrawPage()->getDocument()->getUniqueObjectName("Balloon");
std::string pageName = getDrawPage()->getNameInDocument();
@@ -584,18 +582,20 @@ void QGSPage::createBalloon(QPointF origin, DrawView* parent)
Command::doCommand(Command::Doc,
"App.activeDocument().%s.SourceView = (App.activeDocument().%s)",
featName.c_str(), parent->getNameInDocument());
// convert from scene coords to parent DrawView's coords, unscaled, unrotated
QGIView* qgParent = getQGIVByName(parent->getNameInDocument());
//convert from scene coords to qgParent coords and unscale
QPointF parentOrigin = qgParent->mapFromScene(origin) / parent->getScale();
auto parentOrigin = DU::toVector3d(qgParent->mapFromScene(origin)); // from scene to view
parentOrigin = Rez::appX(parentOrigin) / parent->getScale(); // unrez & unscale
parentOrigin = DrawUtil::invertY(parentOrigin); // +Y up
auto parentRotationDeg = parent->Rotation.getValue();
parentOrigin.RotateZ(Base::toRadians(-parentRotationDeg)); // unrotated
balloon->setOrigin(parentOrigin);
//convert origin to App side coords
QPointF appOrigin = Rez::appPt(parentOrigin);
appOrigin = DrawUtil::invertY(appOrigin);
balloon->OriginX.setValue(appOrigin.x());
balloon->OriginY.setValue(appOrigin.y());
double textOffset = 20.0 / parent->getScale();
balloon->X.setValue(appOrigin.x() + textOffset);
balloon->Y.setValue(appOrigin.y() + textOffset);
balloon->setPosition(parentOrigin.x + textOffset,
parentOrigin.y + textOffset);
int idx = getDrawPage()->getNextBalloonIndex();
balloon->Text.setValue(std::to_string(idx).c_str());