void UBGraphicsRuler::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if (!mResizing && !mRotating) { QGraphicsItem::mouseMoveEvent(event); } else { if (mResizing) { QPointF delta = event->pos() - event->lastPos(); if (rect().width() + delta.x() < sMinLength) delta.setX(sMinLength - rect().width()); if (rect().width() + delta.x() > sMaxLength) delta.setX(sMaxLength - rect().width()); setRect(QRectF(rect().topLeft(), QSizeF(rect().width() + delta.x(), rect().height()))); } else { QLineF currentLine(rotationCenter(), event->pos()); QLineF lastLine(rotationCenter(), event->lastPos()); rotateAroundCenter(currentLine.angleTo(lastLine)); } event->accept(); } }
void UBGraphicsRuler::paintRotationCenter(QPainter *painter) { painter->drawArc( rotationCenter().x() - sRotationRadius, rotationCenter().y() - sRotationRadius, 2 * sRotationRadius, 2 * sRotationRadius, 270 * sDegreeToQtAngleUnit, 90 * sDegreeToQtAngleUnit); }
void UBGraphicsRuler::rotateAroundCenter(qreal angle) { QTransform transform; transform.translate(rotationCenter().x(), rotationCenter().y()); transform.rotate(angle); transform.translate(- rotationCenter().x(), - rotationCenter().y()); setTransform(transform, true); }
void UBGraphicsRuler::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { if (mResizing) { mResizing = false; event->accept(); } else if (mRotating) { mRotating = false; updateResizeCursor(); update(QRectF(rotationCenter(), QSizeF(sRotationRadius, sRotationRadius))); event->accept(); } else if (closeButtonRect().contains(event->pos())) { hide(); emit hidden(); event->accept(); } else { QGraphicsItem::mouseReleaseEvent(event); } if (scene()) scene()->setModified(true); }
void doArcball( double * _viewMatrix, double const * _rotationCenter, double const * _projectionMatrix, double const * _initialViewMatrix, //double const * _currentViewMatrix, double const * _initialMouse, double const * _currentMouse, bool screenSpaceRadius, double radius) { Eigen::Map<Eigen::Vector3d const> rotationCenter(_rotationCenter); Eigen::Map<Eigen::Matrix4d const> initialViewMatrix(_initialViewMatrix); //Eigen::Map<Eigen::Matrix4d const> currentViewMatrix(_currentViewMatrix); Eigen::Map<Eigen::Matrix4d const> projectionMatrix(_projectionMatrix); Eigen::Map<Eigen::Matrix4d> viewMatrix(_viewMatrix); Eigen::Vector2d initialMouse(_initialMouse); Eigen::Vector2d currentMouse(_currentMouse); Eigen::Quaterniond q; Eigen::Vector3d Pa, Pc; if (screenSpaceRadius) { double aspectRatio = projectionMatrix(1, 1) / projectionMatrix(0, 0); initialMouse(0) *= aspectRatio; currentMouse(0) *= aspectRatio; Pa = mapToSphere(initialMouse, radius); Pc = mapToSphere(currentMouse, radius); q.setFromTwoVectors(Pa - rotationCenter, Pc - rotationCenter); } else { Pa = mapToSphere(projectionMatrix.inverse(), initialMouse, rotationCenter, radius); Pc = mapToSphere(projectionMatrix.inverse(), currentMouse, rotationCenter, radius); Eigen::Vector3d a = Pa - rotationCenter, b = Pc - rotationCenter; #if 0 std::cout << "Mouse Initial Radius = " << sqrt(a.dot(a)) << " Current Radius = " << sqrt(b.dot(b)) << std::endl; #endif q.setFromTwoVectors(a, b); } Eigen::Matrix4d qMat4; qMat4.setIdentity(); qMat4.topLeftCorner<3, 3>() = q.toRotationMatrix(); Eigen::Matrix4d translate; translate.setIdentity(); translate.topRightCorner<3, 1>() = -rotationCenter; Eigen::Matrix4d invTranslate; invTranslate.setIdentity(); invTranslate.topRightCorner<3, 1>() = rotationCenter; viewMatrix = invTranslate * qMat4 * translate * initialViewMatrix; }
void UBGraphicsTriangle::rotateAroundCenter(qreal angle) { qreal oldAngle = this->angle; this->angle = angle; QTransform transform; rotateAroundCenter(transform, rotationCenter()); setTransform(transform, true); this->angle = oldAngle + angle; // We have to store absolute value for FLIP case }
void UBGraphicsTriangle::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if (!mResizing1 && !mResizing2 && !mRotating) { QGraphicsItem::mouseMoveEvent(event); } else { QPoint currPos = sceneTransform().inverted().map(event->screenPos()); if (mResizing1) { if (mOrientation == TopLeft || mOrientation == BottomLeft) { int deltaX = currPos.x() - lastPos.x(); if (lastRect.width() + deltaX < sMinWidth) deltaX = sMinWidth - lastRect.width(); setRect(QRectF(lastRect.left(), lastRect.top(), lastRect.width() + deltaX, lastRect.height()), mOrientation); } else { int deltaX = lastPos.x() - currPos.x(); if (lastRect.width() + deltaX < sMinWidth) deltaX = sMinWidth - lastRect.width(); setRect(QRectF(lastRect.left() - deltaX, lastRect.top(), lastRect.width() + deltaX, lastRect.height()), mOrientation); } } //-----------------------------------------------// if (mResizing2) { if (mOrientation == BottomRight || mOrientation == BottomLeft) { int deltaY = lastPos.y() - currPos.y(); if (lastRect.height() + deltaY < sMinHeight) deltaY = sMinHeight - lastRect.height(); setRect(QRectF(lastRect.left(), lastRect.top() - deltaY, lastRect.width(), lastRect.height() + deltaY), mOrientation); } else { int deltaY = currPos.y() - lastPos.y(); if (lastRect.height() + deltaY < sMinHeight) deltaY = sMinHeight - lastRect.height(); setRect(QRectF(lastRect.left(), lastRect.top(), lastRect.width(), lastRect.height() + deltaY), mOrientation); } } //-----------------------------------------------// if (mRotating) { QLineF currentLine(rotationCenter(), event->pos()); QLineF lastLine(rotationCenter(), event->lastPos()); rotateAroundCenter(currentLine.angleTo(lastLine)); } //-----------------------------------------------// event->accept(); } }
void UBGraphicsTriangle::paintGraduations(QPainter *painter) { qreal kx = (mOrientation == TopLeft || mOrientation == BottomLeft) ? 1 : -1; qreal ky = (mOrientation == BottomLeft || mOrientation == BottomRight) ? 1 : -1; painter->save(); painter->setFont(font()); QFontMetricsF fontMetrics(painter->font()); for (int millimeters = 0; millimeters < (rect().width() - sLeftEdgeMargin - sRoundingRadius) / sPixelsPerMillimeter; millimeters++) { int graduationX = rotationCenter().x() + kx * sPixelsPerMillimeter * millimeters; int graduationHeight = (0 == millimeters % UBGeometryUtils::millimetersPerCentimeter) ? UBGeometryUtils::centimeterGraduationHeight : ((0 == millimeters % UBGeometryUtils::millimetersPerHalfCentimeter) ? UBGeometryUtils::halfCentimeterGraduationHeight : UBGeometryUtils::millimeterGraduationHeight); // Check that grad. line inside triangle qreal dx = (kx > 0) ? rect().width() - graduationX : graduationX - rect().x(); qreal lineY = rotationCenter().y() - ky * rect().height()/rect().width() * dx; if (mOrientation == BottomLeft || mOrientation == BottomRight) { if (lineY >= rotationCenter().y() - ky * graduationHeight) break; } else { if (lineY <= rotationCenter().y() - ky * graduationHeight) break; } painter->drawLine(QLine(graduationX, rotationCenter().y(), graduationX, rotationCenter().y() - ky * graduationHeight)); if (0 == millimeters % UBGeometryUtils::millimetersPerCentimeter) { QString text = QString("%1").arg((int)(millimeters / UBGeometryUtils::millimetersPerCentimeter)); int textXRight = graduationX + fontMetrics.width(text) / 2; qreal textWidth = fontMetrics.width(text); qreal textHeight = fontMetrics.tightBoundingRect(text).height() + 5; int textY = (ky > 0) ? rotationCenter().y() - 5 - UBGeometryUtils::centimeterGraduationHeight - textHeight : rotationCenter().y() + 5 + UBGeometryUtils::centimeterGraduationHeight; bool bText = false; switch(mOrientation) { case BottomLeft: dx = rect().width() - textXRight; lineY = rotationCenter().y() - rect().height()/rect().width() * dx; bText = lineY <= textY; break; case TopLeft: dx = rect().width() - textXRight; lineY = rotationCenter().y() + rect().height()/rect().width() * dx; bText = lineY >= textY + textHeight; break; case TopRight: dx = textXRight - textWidth - rect().left(); lineY = rotationCenter().y() + rect().height()/rect().width() * dx; bText = lineY >= textY + textHeight; break; case BottomRight: dx = textXRight - textWidth - rect().left(); lineY = rotationCenter().y() - rect().height()/rect().width() * dx; bText = lineY <= textY; break; } if (bText) painter->drawText( QRectF(graduationX - textWidth / 2, textY, textWidth, textHeight), Qt::AlignVCenter, text); } } painter->restore(); }
void UBGraphicsRuler::paintGraduations(QPainter *painter) { painter->save(); painter->setFont(font()); QFontMetricsF fontMetrics(painter->font()); for (int millimeters = 0; millimeters < (rect().width() - sLeftEdgeMargin - sRoundingRadius) / sPixelsPerMillimeter; millimeters++) { int graduationX = rotationCenter().x() + sPixelsPerMillimeter * millimeters; int graduationHeight = (0 == millimeters % UBGeometryUtils::millimetersPerCentimeter) ? UBGeometryUtils::centimeterGraduationHeight : ((0 == millimeters % UBGeometryUtils::millimetersPerHalfCentimeter) ? UBGeometryUtils::halfCentimeterGraduationHeight : UBGeometryUtils::millimeterGraduationHeight); painter->drawLine(QLine(graduationX, rotationCenter().y(), graduationX, rotationCenter().y() + graduationHeight)); painter->drawLine(QLine(graduationX, rotationCenter().y() + rect().height(), graduationX, rotationCenter().y() + rect().height() - graduationHeight)); if (0 == millimeters % UBGeometryUtils::millimetersPerCentimeter) { QString text = QString("%1").arg((int)(millimeters / UBGeometryUtils::millimetersPerCentimeter)); if (graduationX + fontMetrics.width(text) / 2 < rect().right()) { qreal textWidth = fontMetrics.width(text); qreal textHeight = fontMetrics.tightBoundingRect(text).height() + 5; painter->drawText( QRectF(graduationX - textWidth / 2, rect().top() + 5 + UBGeometryUtils::centimeterGraduationHeight, textWidth, textHeight), Qt::AlignVCenter, text); painter->drawText( QRectF(graduationX - textWidth / 2, rect().bottom() - 5 - UBGeometryUtils::centimeterGraduationHeight - textHeight, textWidth, textHeight), Qt::AlignVCenter, text); } } } painter->restore(); }