Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct
Arrow label positioning code, label shoots off into hyperspace, has anyone done this before?
enjoysmath last edited by enjoysmath
Here is the relevant code, short and sweet:
def updateTextPosition(self): from geom_tools import mag2D from PyQt5.QtGui import QTransform src = self.sourcePoint() tar = self.targetPoint() if src and tar: dx = src.posDelta() dy = tar.posDelta() #c = self.pointCenter() x = src.pos() #- c y = tar.pos() # - c #dc = c - self.lastPointCenter() if x != y: x0 = x - dx y0 = y - dy magx = mag2D(x0) magy = mag2D(y0) T = QTransform(x.x(), y.x(), x.y(), y.y(), 0, 0) #dc.x(), dc.y()) for label in self.allLabels(): p = label.pos() #- c u = QPointF.dotProduct(x0, p) v = QPointF.dotProduct(y0, p) if abs(magx) > 0: u /= magx if abs(magy) > 0: v /= magy p = QPointF(u, v) label.setPos(T.map(p))
As you can see I've also tried keeping the positioning relative to the arrow's control-point center.
self.sourcePoint() returns the controlpoint that touches the node at the source end of the arrow and likewise for self.targetPoint().
So all I'm trying to do is do a properly proportioned transform of each labels text.
Before I did it by storing text-positioning info for each of the labels, very inelegant and that is now buggy, so I'm coming up with a simpler solution.
Both the labels and the control points are parented by self (Arrow).
"Hyperspace" is a good description and it whitesout the QGraphicsScene.
def updateTextPosition(self): line = self.labelPosLine() line0 = self.lastLabelPosLine() p = line.p1() q = line.p2() p0 = line0.p1() q0 = line0.p2() dv = ((p-p0) + (q - q0))/2 for label in self.allLabels(): label.setPos(label.pos() + dv)
Averaging looks okay but is not quite right! The arrow will sometimes swap sides when you rotate an arrow around one of its ends 180 degrees.
enjoysmath last edited by
Yeah, I know I'm doing it wrong. Just now discovered. I will post a solution to this.