diff --git a/ChangeLog.txt b/ChangeLog.txt index 544c9fd27..9a3b40447 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,3 +1,6 @@ +# Valentina 0.7.48 (unreleased) +- [smart-pattern/valentina#129] Incorrect behavior of empty arc and elliptical arc. + # Version 0.7.47 May 13, 2021 - [smart-pattern/valentina#118] Incorrect seam allowance. - [smart-pattern/valentina#119] Improve tool Point of intersection curves. diff --git a/src/app/tape/mapplication.cpp b/src/app/tape/mapplication.cpp index 584921b69..6727c3d93 100644 --- a/src/app/tape/mapplication.cpp +++ b/src/app/tape/mapplication.cpp @@ -117,6 +117,7 @@ inline void noisyFailureMsgHandler(QtMsgType type, const QMessageLogContext &con } # endif +# if QT_VERSION < QT_VERSION_CHECK(5, 9, 0) // Hide Qt bug 'Assertion when reading an icns file' // https://bugreports.qt.io/browse/QTBUG-45537 // Remove after Qt fix will be released @@ -124,6 +125,13 @@ inline void noisyFailureMsgHandler(QtMsgType type, const QMessageLogContext &con { type = QtDebugMsg; } +# endif + + // Hide anything that starts with QMacCGContext + if ((type == QtWarningMsg) && msg.contains(QStringLiteral("QMacCGContext::"))) + { + type = QtDebugMsg; + } // See issue #568 if (msg.contains(QStringLiteral("Error receiving trust for a CA certificate"))) diff --git a/src/app/valentina/core/vapplication.cpp b/src/app/valentina/core/vapplication.cpp index 307922161..f5456f2b7 100644 --- a/src/app/valentina/core/vapplication.cpp +++ b/src/app/valentina/core/vapplication.cpp @@ -136,6 +136,7 @@ inline void noisyFailureMsgHandler(QtMsgType type, const QMessageLogContext &con } # endif +# if QT_VERSION < QT_VERSION_CHECK(5, 9, 0) // Hide Qt bug 'Assertion when reading an icns file' // https://bugreports.qt.io/browse/QTBUG-45537 // Remove after Qt fix will be released @@ -143,6 +144,13 @@ inline void noisyFailureMsgHandler(QtMsgType type, const QMessageLogContext &con { type = QtDebugMsg; } +# endif + + // Hide anything that starts with QMacCGContext + if ((type == QtWarningMsg) && msg.contains(QStringLiteral("QMacCGContext::"))) + { + type = QtDebugMsg; + } // See issue #568 if (msg.contains(QStringLiteral("Error receiving trust for a CA certificate"))) diff --git a/src/libs/vgeometry/varc.cpp b/src/libs/vgeometry/varc.cpp index 545b2f98f..9ec997da1 100644 --- a/src/libs/vgeometry/varc.cpp +++ b/src/libs/vgeometry/varc.cpp @@ -263,6 +263,11 @@ QPointF VArc::GetP2 () const */ QVector VArc::GetPoints() const { + if (qFuzzyIsNull(GetRadius())) + { + return {GetCenter().toQPointF()}; + } + QVector points; QVector sectionAngle; diff --git a/src/libs/vgeometry/vellipticalarc.cpp b/src/libs/vgeometry/vellipticalarc.cpp index a616055cd..42deedbd7 100644 --- a/src/libs/vgeometry/vellipticalarc.cpp +++ b/src/libs/vgeometry/vellipticalarc.cpp @@ -493,12 +493,23 @@ qreal VEllipticalArc::MaxLength() const //--------------------------------------------------------------------------------------------------------------------- QPointF VEllipticalArc::GetP(qreal angle) const { + if (qFuzzyIsNull(GetRadius1()) && qFuzzyIsNull(GetRadius2())) + { + return GetCenter().toQPointF(); + } + QLineF line(0, 0, 100, 0); line.setAngle(angle); - const qreal a = line.p2().x() / GetRadius1(); - const qreal b = line.p2().y() / GetRadius2(); + const qreal a = not qFuzzyIsNull(GetRadius1()) ? line.p2().x() / GetRadius1() : 0; + const qreal b = not qFuzzyIsNull(GetRadius2()) ? line.p2().y() / GetRadius2() : 0; const qreal k = qSqrt(a*a + b*b); + + if (qFuzzyIsNull(k)) + { + return GetCenter().toQPointF(); + } + QPointF p(line.p2().x() / k, line.p2().y() / k); QLineF line2(QPointF(), p); @@ -565,6 +576,13 @@ void VEllipticalArc::SetFormulaRadius1(const QString &formula, qreal value) d->radius1 = value; } +//--------------------------------------------------------------------------------------------------------------------- +void VEllipticalArc::SetRadius1(qreal value) +{ + d->formulaRadius1 = QString::number(value); + d->radius1 = value; +} + //--------------------------------------------------------------------------------------------------------------------- void VEllipticalArc::SetFormulaRadius2(const QString &formula, qreal value) { @@ -572,6 +590,13 @@ void VEllipticalArc::SetFormulaRadius2(const QString &formula, qreal value) d->radius2 = value; } +//--------------------------------------------------------------------------------------------------------------------- +void VEllipticalArc::SetRadius2(qreal value) +{ + d->formulaRadius2 = QString::number(value); + d->radius2 = value; +} + //--------------------------------------------------------------------------------------------------------------------- void VEllipticalArc::SetFormulaRotationAngle(const QString &formula, qreal value) { @@ -579,6 +604,13 @@ void VEllipticalArc::SetFormulaRotationAngle(const QString &formula, qreal value d->rotationAngle = value; } +//--------------------------------------------------------------------------------------------------------------------- +void VEllipticalArc::SetRotationAngle(qreal value) +{ + d->formulaRotationAngle = QString::number(value); + d->rotationAngle = value; +} + //--------------------------------------------------------------------------------------------------------------------- /** * @brief GetRadius1 return elliptical arc major radius. diff --git a/src/libs/vgeometry/vellipticalarc.h b/src/libs/vgeometry/vellipticalarc.h index 481afcfaf..088a1c261 100644 --- a/src/libs/vgeometry/vellipticalarc.h +++ b/src/libs/vgeometry/vellipticalarc.h @@ -75,14 +75,17 @@ public: QString GetFormulaRotationAngle () const; void SetFormulaRotationAngle (const QString &formula, qreal value); + void SetRotationAngle(qreal value); qreal GetRotationAngle() const; QString GetFormulaRadius1 () const; void SetFormulaRadius1 (const QString &formula, qreal value); + void SetRadius1 (qreal value); qreal GetRadius1 () const; QString GetFormulaRadius2 () const; void SetFormulaRadius2 (const QString &formula, qreal value); + void SetRadius2 (qreal value); qreal GetRadius2 () const; virtual qreal GetLength () const override; diff --git a/src/test/ValentinaTest/tst_varc.cpp b/src/test/ValentinaTest/tst_varc.cpp index 0ef8b1a7e..58d4e8730 100644 --- a/src/test/ValentinaTest/tst_varc.cpp +++ b/src/test/ValentinaTest/tst_varc.cpp @@ -456,3 +456,12 @@ void TST_VArc::TestCurveIntersectAxis() Comparison(intersectionPoint, crosPoint, accuracyPointOnLine); } + +//--------------------------------------------------------------------------------------------------------------------- +void TST_VArc::EmptyArc() +{ + VArc empty; + + Comparison(empty.GetPoints(), {QPointF()}); + QCOMPARE(empty.GetLength(), 0.); +} diff --git a/src/test/ValentinaTest/tst_varc.h b/src/test/ValentinaTest/tst_varc.h index f83655bf6..0d7854bab 100644 --- a/src/test/ValentinaTest/tst_varc.h +++ b/src/test/ValentinaTest/tst_varc.h @@ -50,6 +50,7 @@ private slots: void TestCutArc(); void TestCurveIntersectAxis_data(); void TestCurveIntersectAxis(); + void EmptyArc(); }; #endif // TST_VARC_H diff --git a/src/test/ValentinaTest/tst_vellipticalarc.cpp b/src/test/ValentinaTest/tst_vellipticalarc.cpp index 938b00033..4e967a811 100644 --- a/src/test/ValentinaTest/tst_vellipticalarc.cpp +++ b/src/test/ValentinaTest/tst_vellipticalarc.cpp @@ -577,3 +577,29 @@ void TST_VEllipticalArc::TestFlip() QCOMPARE(elArc.GetRadius1(), res.GetRadius1()); QCOMPARE(elArc.GetRadius2(), res.GetRadius2()); } + +//--------------------------------------------------------------------------------------------------------------------- +void TST_VEllipticalArc::EmptyArc_data() +{ + QTest::addColumn("radius1"); + QTest::addColumn("radius2"); + QTest::addColumn("length"); + + QTest::newRow("Empty elArc") << 0. << 0. << 0.; + QTest::newRow("Radius1 correct") << 50. << 0. << 50.*4; + QTest::newRow("Radius2 correct") << 0. << 30. << 30.*4; +} + +//--------------------------------------------------------------------------------------------------------------------- +void TST_VEllipticalArc::EmptyArc() +{ + QFETCH(qreal, radius1); + QFETCH(qreal, radius2); + QFETCH(qreal, length); + + VEllipticalArc empty; + empty.SetRadius1(radius1); + empty.SetRadius2(radius2); + + QCOMPARE(empty.GetLength(), length); +} diff --git a/src/test/ValentinaTest/tst_vellipticalarc.h b/src/test/ValentinaTest/tst_vellipticalarc.h index 99f4486dc..74730a43b 100644 --- a/src/test/ValentinaTest/tst_vellipticalarc.h +++ b/src/test/ValentinaTest/tst_vellipticalarc.h @@ -55,6 +55,8 @@ private slots: void TestRotation(); void TestFlip_data(); void TestFlip(); + void EmptyArc_data(); + void EmptyArc(); private: Q_DISABLE_COPY(TST_VEllipticalArc)