The tool Cut Spline now supports Cubic Bezier curve.
--HG-- branch : feature
This commit is contained in:
parent
53250a4dc4
commit
2548697a9e
|
@ -30,6 +30,7 @@
|
||||||
#include "../vgeometry/vpointf.h"
|
#include "../vgeometry/vpointf.h"
|
||||||
|
|
||||||
#include <QPainterPath>
|
#include <QPainterPath>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
VAbstractCubicBezier::VAbstractCubicBezier(const GOType &type, const quint32 &idObject, const Draw &mode)
|
VAbstractCubicBezier::VAbstractCubicBezier(const GOType &type, const quint32 &idObject, const Draw &mode)
|
||||||
|
@ -59,6 +60,76 @@ VAbstractCubicBezier::~VAbstractCubicBezier()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* @brief CutSpline cut spline.
|
||||||
|
* @param length length first spline
|
||||||
|
* @param spl1p2 second point of first spline
|
||||||
|
* @param spl1p3 third point of first spline
|
||||||
|
* @param spl2p2 second point of second spline
|
||||||
|
* @param spl2p3 third point of second spline
|
||||||
|
* @return point of cutting. This point is forth point of first spline and first point of second spline.
|
||||||
|
*/
|
||||||
|
QPointF VAbstractCubicBezier::CutSpline(qreal length, QPointF &spl1p2, QPointF &spl1p3, QPointF &spl2p2,
|
||||||
|
QPointF &spl2p3) const
|
||||||
|
{
|
||||||
|
//Always need return two splines, so we must correct wrong length.
|
||||||
|
if (length < GetLength()*0.02)
|
||||||
|
{
|
||||||
|
length = GetLength()*0.02;
|
||||||
|
}
|
||||||
|
else if ( length > GetLength()*0.98)
|
||||||
|
{
|
||||||
|
length = GetLength()*0.98;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Very stupid way find correct value of t.
|
||||||
|
// Better first compare with t = 0.5. Find length of spline.
|
||||||
|
// If length larger, take t = 0.75 and so on.
|
||||||
|
// If length less, take t = 0.25 and so on.
|
||||||
|
qreal parT = 0;
|
||||||
|
qreal step = 0.001;
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
parT = parT + step;
|
||||||
|
qreal splLength = LengthT(parT);
|
||||||
|
if (splLength >= length || parT > 1)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QLineF seg1_2 ( GetP1 ().toQPointF(), GetControlPoint1 () );
|
||||||
|
seg1_2.setLength(seg1_2.length () * parT);
|
||||||
|
QPointF p12 = seg1_2.p2();
|
||||||
|
|
||||||
|
QLineF seg2_3 ( GetControlPoint1(), GetControlPoint2 () );
|
||||||
|
seg2_3.setLength(seg2_3.length () * parT);
|
||||||
|
QPointF p23 = seg2_3.p2();
|
||||||
|
|
||||||
|
QLineF seg12_23 ( p12, p23 );
|
||||||
|
seg12_23.setLength(seg12_23.length () * parT);
|
||||||
|
QPointF p123 = seg12_23.p2();
|
||||||
|
|
||||||
|
QLineF seg3_4 ( GetControlPoint2 (), GetP4 ().toQPointF() );
|
||||||
|
seg3_4.setLength(seg3_4.length () * parT);
|
||||||
|
QPointF p34 = seg3_4.p2();
|
||||||
|
|
||||||
|
QLineF seg23_34 ( p23, p34 );
|
||||||
|
seg23_34.setLength(seg23_34.length () * parT);
|
||||||
|
QPointF p234 = seg23_34.p2();
|
||||||
|
|
||||||
|
QLineF seg123_234 ( p123, p234 );
|
||||||
|
seg123_234.setLength(seg123_234.length () * parT);
|
||||||
|
QPointF p1234 = seg123_234.p2();
|
||||||
|
|
||||||
|
spl1p2 = p12;
|
||||||
|
spl1p3 = p123;
|
||||||
|
spl2p2 = p234;
|
||||||
|
spl2p3 = p34;
|
||||||
|
return p1234;
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void VAbstractCubicBezier::CreateName()
|
void VAbstractCubicBezier::CreateName()
|
||||||
{
|
{
|
||||||
|
@ -439,3 +510,38 @@ qreal VAbstractCubicBezier::LengthBezier(const QPointF &p1, const QPointF &p2, c
|
||||||
}
|
}
|
||||||
return splinePath.length();
|
return splinePath.length();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
qreal VAbstractCubicBezier::LengthT(qreal t) const
|
||||||
|
{
|
||||||
|
if (t < 0 || t > 1)
|
||||||
|
{
|
||||||
|
qDebug()<<"Wrong value t.";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
QLineF seg1_2 ( GetP1 ().toQPointF(), GetControlPoint1 () );
|
||||||
|
seg1_2.setLength(seg1_2.length () * t);
|
||||||
|
const QPointF p12 = seg1_2.p2();
|
||||||
|
|
||||||
|
QLineF seg2_3 ( GetControlPoint1 (), GetControlPoint2 () );
|
||||||
|
seg2_3.setLength(seg2_3.length () * t);
|
||||||
|
const QPointF p23 = seg2_3.p2();
|
||||||
|
|
||||||
|
QLineF seg12_23 ( p12, p23 );
|
||||||
|
seg12_23.setLength(seg12_23.length () * t);
|
||||||
|
const QPointF p123 = seg12_23.p2();
|
||||||
|
|
||||||
|
QLineF seg3_4 ( GetControlPoint2 (), GetP4 ().toQPointF() );
|
||||||
|
seg3_4.setLength(seg3_4.length () * t);
|
||||||
|
const QPointF p34 = seg3_4.p2();
|
||||||
|
|
||||||
|
QLineF seg23_34 ( p23, p34 );
|
||||||
|
seg23_34.setLength(seg23_34.length () * t);
|
||||||
|
const QPointF p234 = seg23_34.p2();
|
||||||
|
|
||||||
|
QLineF seg123_234 ( p123, p234 );
|
||||||
|
seg123_234.setLength(seg123_234.length () * t);
|
||||||
|
const QPointF p1234 = seg123_234.p2();
|
||||||
|
|
||||||
|
return LengthBezier ( GetP1().toQPointF(), p12, p123, p1234);
|
||||||
|
}
|
||||||
|
|
|
@ -44,6 +44,8 @@ public:
|
||||||
virtual VPointF GetP1 () const =0;
|
virtual VPointF GetP1 () const =0;
|
||||||
virtual VPointF GetP4 () const =0;
|
virtual VPointF GetP4 () const =0;
|
||||||
|
|
||||||
|
QPointF CutSpline ( qreal length, QPointF &spl1p2, QPointF &spl1p3, QPointF &spl2p2, QPointF &spl2p3) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void CreateName() Q_DECL_OVERRIDE;
|
virtual void CreateName() Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
@ -53,6 +55,12 @@ protected:
|
||||||
static QVector<QPointF> GetCubicBezierPoints(const QPointF &p1, const QPointF &p2, const QPointF &p3,
|
static QVector<QPointF> GetCubicBezierPoints(const QPointF &p1, const QPointF &p2, const QPointF &p3,
|
||||||
const QPointF &p4);
|
const QPointF &p4);
|
||||||
static qreal LengthBezier(const QPointF &p1, const QPointF &p2, const QPointF &p3, const QPointF &p4);
|
static qreal LengthBezier(const QPointF &p1, const QPointF &p2, const QPointF &p3, const QPointF &p4);
|
||||||
|
|
||||||
|
virtual QPointF GetControlPoint1() const =0;
|
||||||
|
virtual QPointF GetControlPoint2() const =0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
qreal LengthT(qreal t) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // VABSTRACTCUBICBEZIER_H
|
#endif // VABSTRACTCUBICBEZIER_H
|
||||||
|
|
|
@ -145,3 +145,15 @@ QVector<QPointF> VCubicBezier::GetPoints() const
|
||||||
{
|
{
|
||||||
return GetCubicBezierPoints(GetP1().toQPointF(), GetP2().toQPointF(), GetP3().toQPointF(), GetP4().toQPointF());
|
return GetCubicBezierPoints(GetP1().toQPointF(), GetP2().toQPointF(), GetP3().toQPointF(), GetP4().toQPointF());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QPointF VCubicBezier::GetControlPoint1() const
|
||||||
|
{
|
||||||
|
return GetP2().toQPointF();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QPointF VCubicBezier::GetControlPoint2() const
|
||||||
|
{
|
||||||
|
return GetP3().toQPointF();
|
||||||
|
}
|
||||||
|
|
|
@ -61,6 +61,10 @@ public:
|
||||||
virtual qreal GetLength() const Q_DECL_OVERRIDE;
|
virtual qreal GetLength() const Q_DECL_OVERRIDE;
|
||||||
virtual QVector<QPointF> GetPoints() const Q_DECL_OVERRIDE;
|
virtual QVector<QPointF> GetPoints() const Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual QPointF GetControlPoint1() const Q_DECL_OVERRIDE;
|
||||||
|
virtual QPointF GetControlPoint2() const Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QSharedDataPointer<VCubicBezierData> d;
|
QSharedDataPointer<VCubicBezierData> d;
|
||||||
};
|
};
|
||||||
|
|
|
@ -125,111 +125,6 @@ qreal VSpline::GetLength () const
|
||||||
return LengthBezier ( GetP1().toQPointF(), GetP2(), GetP3(), GetP4().toQPointF());
|
return LengthBezier ( GetP1().toQPointF(), GetP2(), GetP3(), GetP4().toQPointF());
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
|
||||||
qreal VSpline::LengthT(qreal t) const
|
|
||||||
{
|
|
||||||
if (t < 0 || t > 1)
|
|
||||||
{
|
|
||||||
qDebug()<<"Wrong value t.";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
QLineF seg1_2 ( GetP1 ().toQPointF(), GetP2 () );
|
|
||||||
seg1_2.setLength(seg1_2.length () * t);
|
|
||||||
QPointF p12 = seg1_2.p2();
|
|
||||||
|
|
||||||
QLineF seg2_3 ( GetP2 (), GetP3 () );
|
|
||||||
seg2_3.setLength(seg2_3.length () * t);
|
|
||||||
QPointF p23 = seg2_3.p2();
|
|
||||||
|
|
||||||
QLineF seg12_23 ( p12, p23 );
|
|
||||||
seg12_23.setLength(seg12_23.length () * t);
|
|
||||||
QPointF p123 = seg12_23.p2();
|
|
||||||
|
|
||||||
QLineF seg3_4 ( GetP3 (), GetP4 ().toQPointF() );
|
|
||||||
seg3_4.setLength(seg3_4.length () * t);
|
|
||||||
QPointF p34 = seg3_4.p2();
|
|
||||||
|
|
||||||
QLineF seg23_34 ( p23, p34 );
|
|
||||||
seg23_34.setLength(seg23_34.length () * t);
|
|
||||||
QPointF p234 = seg23_34.p2();
|
|
||||||
|
|
||||||
QLineF seg123_234 ( p123, p234 );
|
|
||||||
seg123_234.setLength(seg123_234.length () * t);
|
|
||||||
QPointF p1234 = seg123_234.p2();
|
|
||||||
|
|
||||||
return LengthBezier ( GetP1().toQPointF(), p12, p123, p1234);
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
* @brief CutSpline cut spline. GetPointP1() of base spline will return first point for first spline, GetPointP4()
|
|
||||||
* of base spline will return forth point of second spline.
|
|
||||||
* @param length length first spline
|
|
||||||
* @param spl1p2 second point of first spline
|
|
||||||
* @param spl1p3 third point of first spline
|
|
||||||
* @param spl2p2 second point of second spline
|
|
||||||
* @param spl2p3 third point of second spline
|
|
||||||
* @return point of cutting. This point is forth point of first spline and first point of second spline.
|
|
||||||
*/
|
|
||||||
QPointF VSpline::CutSpline ( qreal length, QPointF &spl1p2, QPointF &spl1p3, QPointF &spl2p2, QPointF &spl2p3 ) const
|
|
||||||
{
|
|
||||||
//Always need return two splines, so we must correct wrong length.
|
|
||||||
if (length < GetLength()*0.02)
|
|
||||||
{
|
|
||||||
length = GetLength()*0.02;
|
|
||||||
}
|
|
||||||
else if ( length > GetLength()*0.98)
|
|
||||||
{
|
|
||||||
length = GetLength()*0.98;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Very stupid way find correct value of t.
|
|
||||||
// Better first compare with t = 0.5. Find length of spline.
|
|
||||||
// If length larger, take t = 0.75 and so on.
|
|
||||||
// If length less, take t = 0.25 and so on.
|
|
||||||
qreal parT = 0;
|
|
||||||
qreal step = 0.001;
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
parT = parT + step;
|
|
||||||
qreal splLength = LengthT(parT);
|
|
||||||
if (splLength >= length || parT > 1)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QLineF seg1_2 ( GetP1 ().toQPointF(), GetP2 () );
|
|
||||||
seg1_2.setLength(seg1_2.length () * parT);
|
|
||||||
QPointF p12 = seg1_2.p2();
|
|
||||||
|
|
||||||
QLineF seg2_3 ( GetP2 (), GetP3 () );
|
|
||||||
seg2_3.setLength(seg2_3.length () * parT);
|
|
||||||
QPointF p23 = seg2_3.p2();
|
|
||||||
|
|
||||||
QLineF seg12_23 ( p12, p23 );
|
|
||||||
seg12_23.setLength(seg12_23.length () * parT);
|
|
||||||
QPointF p123 = seg12_23.p2();
|
|
||||||
|
|
||||||
QLineF seg3_4 ( GetP3 (), GetP4 ().toQPointF() );
|
|
||||||
seg3_4.setLength(seg3_4.length () * parT);
|
|
||||||
QPointF p34 = seg3_4.p2();
|
|
||||||
|
|
||||||
QLineF seg23_34 ( p23, p34 );
|
|
||||||
seg23_34.setLength(seg23_34.length () * parT);
|
|
||||||
QPointF p234 = seg23_34.p2();
|
|
||||||
|
|
||||||
QLineF seg123_234 ( p123, p234 );
|
|
||||||
seg123_234.setLength(seg123_234.length () * parT);
|
|
||||||
QPointF p1234 = seg123_234.p2();
|
|
||||||
|
|
||||||
spl1p2 = p12;
|
|
||||||
spl1p3 = p123;
|
|
||||||
spl2p2 = p234;
|
|
||||||
spl2p3 = p34;
|
|
||||||
return p1234;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
QPointF VSpline::CutSpline(qreal length, VSpline &spl1, VSpline &spl2) const
|
QPointF VSpline::CutSpline(qreal length, VSpline &spl1, VSpline &spl2) const
|
||||||
{
|
{
|
||||||
|
@ -237,7 +132,7 @@ QPointF VSpline::CutSpline(qreal length, VSpline &spl1, VSpline &spl2) const
|
||||||
QPointF spl1p3;
|
QPointF spl1p3;
|
||||||
QPointF spl2p2;
|
QPointF spl2p2;
|
||||||
QPointF spl2p3;
|
QPointF spl2p3;
|
||||||
QPointF cutPoint = CutSpline (length, spl1p2, spl1p3, spl2p2, spl2p3 );
|
const QPointF cutPoint = CutSpline (length, spl1p2, spl1p3, spl2p2, spl2p3 );
|
||||||
|
|
||||||
spl1 = VSpline(GetP1(), spl1p2, spl1p3, cutPoint);
|
spl1 = VSpline(GetP1(), spl1p2, spl1p3, cutPoint);
|
||||||
spl2 = VSpline(cutPoint, spl2p2, spl2p3, GetP4());
|
spl2 = VSpline(cutPoint, spl2p2, spl2p3, GetP4());
|
||||||
|
@ -598,3 +493,15 @@ qreal VSpline::ParamT (const QPointF &pBt) const
|
||||||
|
|
||||||
return tx;
|
return tx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QPointF VSpline::GetControlPoint1() const
|
||||||
|
{
|
||||||
|
return GetP2 ();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QPointF VSpline::GetControlPoint2() const
|
||||||
|
{
|
||||||
|
return GetP3 ();
|
||||||
|
}
|
||||||
|
|
|
@ -86,14 +86,19 @@ public:
|
||||||
qreal GetKasm1() const;
|
qreal GetKasm1() const;
|
||||||
qreal GetKasm2() const;
|
qreal GetKasm2() const;
|
||||||
qreal GetKcurve() const;
|
qreal GetKcurve() const;
|
||||||
qreal LengthT(qreal t) const;
|
|
||||||
QPointF CutSpline ( qreal length, QPointF &spl1p2, QPointF &spl1p3, QPointF &spl2p2, QPointF &spl2p3) const;
|
using VAbstractCubicBezier::CutSpline;
|
||||||
QPointF CutSpline ( qreal length, VSpline &spl1, VSpline &spl2) const;
|
QPointF CutSpline ( qreal length, VSpline &spl1, VSpline &spl2) const;
|
||||||
|
|
||||||
virtual QVector<QPointF> GetPoints () const Q_DECL_OVERRIDE;
|
virtual QVector<QPointF> GetPoints () const Q_DECL_OVERRIDE;
|
||||||
// cppcheck-suppress unusedFunction
|
// cppcheck-suppress unusedFunction
|
||||||
static QVector<QPointF> SplinePoints(const QPointF &p1, const QPointF &p4, qreal angle1, qreal angle2, qreal kAsm1,
|
static QVector<QPointF> SplinePoints(const QPointF &p1, const QPointF &p4, qreal angle1, qreal angle2, qreal kAsm1,
|
||||||
qreal kAsm2, qreal kCurve);
|
qreal kAsm2, qreal kCurve);
|
||||||
qreal ParamT(const QPointF &pBt) const;
|
qreal ParamT(const QPointF &pBt) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual QPointF GetControlPoint1() const Q_DECL_OVERRIDE;
|
||||||
|
virtual QPointF GetControlPoint2() const Q_DECL_OVERRIDE;
|
||||||
private:
|
private:
|
||||||
QSharedDataPointer<VSplineData> d;
|
QSharedDataPointer<VSplineData> d;
|
||||||
QVector<qreal> CalcT(qreal curveCoord1, qreal curveCoord2, qreal curveCoord3, qreal curveCoord4,
|
QVector<qreal> CalcT(qreal curveCoord1, qreal curveCoord2, qreal curveCoord3, qreal curveCoord4,
|
||||||
|
|
|
@ -61,7 +61,7 @@ DialogCutSpline::DialogCutSpline(const VContainer *data, const quint32 &toolId,
|
||||||
flagFormula = false;
|
flagFormula = false;
|
||||||
CheckState();
|
CheckState();
|
||||||
|
|
||||||
FillComboBoxSplines(ui->comboBoxSpline, FillComboBox::NoChildren, ch1, ch2);
|
FillComboBoxSimpleSplines(ui->comboBoxSpline, FillComboBox::NoChildren, ch1, ch2);
|
||||||
FillComboBoxLineColors(ui->comboBoxColor);
|
FillComboBoxLineColors(ui->comboBoxColor);
|
||||||
|
|
||||||
connect(ui->toolButtonExprLength, &QPushButton::clicked, this, &DialogCutSpline::FXLength);
|
connect(ui->toolButtonExprLength, &QPushButton::clicked, this, &DialogCutSpline::FXLength);
|
||||||
|
|
|
@ -128,27 +128,91 @@ void DialogTool::FillComboBoxPoints(QComboBox *box, FillComboBox rule, const qui
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void DialogTool::FillComboBoxArcs(QComboBox *box, FillComboBox rule, const quint32 &ch1, const quint32 &ch2) const
|
void DialogTool::FillComboBoxArcs(QComboBox *box, FillComboBox rule, const quint32 &ch1, const quint32 &ch2) const
|
||||||
{
|
{
|
||||||
FillCombo<VArc>(box, GOType::Arc, rule, ch1, ch2);
|
FillCombo<VAbstractCurve>(box, GOType::Arc, rule, ch1, ch2);
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void DialogTool::FillComboBoxSplines(QComboBox *box, FillComboBox rule, const quint32 &ch1, const quint32 &ch2) const
|
void DialogTool::FillComboBoxSplines(QComboBox *box, FillComboBox rule, const quint32 &ch1, const quint32 &ch2) const
|
||||||
{
|
{
|
||||||
FillCombo<VSpline>(box, GOType::Spline, rule, ch1, ch2);
|
FillCombo<VAbstractCurve>(box, GOType::Spline, rule, ch1, ch2);
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void DialogTool::FillComboBoxSplinesPath(QComboBox *box, FillComboBox rule, const quint32 &ch1,
|
void DialogTool::FillComboBoxSplinesPath(QComboBox *box, FillComboBox rule, const quint32 &ch1,
|
||||||
const quint32 &ch2) const
|
const quint32 &ch2) const
|
||||||
{
|
{
|
||||||
FillCombo<VSplinePath>(box, GOType::SplinePath, rule, ch1, ch2);
|
FillCombo<VAbstractCurve>(box, GOType::SplinePath, rule, ch1, ch2);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogTool::FillComboBoxSimpleSplines(QComboBox *box, FillComboBox rule, const quint32 &ch1,
|
||||||
|
const quint32 &ch2) const
|
||||||
|
{
|
||||||
|
SCASSERT(box != nullptr);
|
||||||
|
box->blockSignals(true);
|
||||||
|
|
||||||
|
const auto objs = data->DataGObjects();
|
||||||
|
QHash<quint32, QSharedPointer<VGObject> >::const_iterator i;
|
||||||
|
QMap<QString, quint32> list;
|
||||||
|
for (i = objs->constBegin(); i != objs->constEnd(); ++i)
|
||||||
|
{
|
||||||
|
if (rule == FillComboBox::NoChildren)
|
||||||
|
{
|
||||||
|
if (i.key() != toolId && i.key() != ch1 && i.key() != ch2)
|
||||||
|
{
|
||||||
|
QSharedPointer<VGObject> obj = i.value();
|
||||||
|
if ((obj->getType() == GOType::Spline || obj->getType() == GOType::CubicBezier) &&
|
||||||
|
obj->getMode() == Draw::Calculation)
|
||||||
|
{
|
||||||
|
const auto curve = data->GeometricObject<VAbstractCurve>(i.key());
|
||||||
|
|
||||||
|
QString newName = curve->name();
|
||||||
|
int bias = 0;
|
||||||
|
if (qApp->TrVars()->VariablesToUser(newName, 0, curve->name(), bias))
|
||||||
|
{
|
||||||
|
list[newName] = i.key();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
list[curve->name()] = i.key();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (i.key() != toolId)
|
||||||
|
{
|
||||||
|
QSharedPointer<VGObject> obj = i.value();
|
||||||
|
if ((obj->getType() == GOType::Spline || obj->getType() == GOType::CubicBezier) &&
|
||||||
|
obj->getMode() == Draw::Calculation)
|
||||||
|
{
|
||||||
|
const auto curve = data->GeometricObject<VAbstractCurve>(i.key());
|
||||||
|
|
||||||
|
QString newName = curve->name();
|
||||||
|
int bias = 0;
|
||||||
|
if (qApp->TrVars()->VariablesToUser(newName, 0, curve->name(), bias))
|
||||||
|
{
|
||||||
|
list[newName] = i.key();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
list[curve->name()] = i.key();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FillList(box, list);
|
||||||
|
|
||||||
|
box->blockSignals(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void DialogTool::FillComboBoxCurves(QComboBox *box) const
|
void DialogTool::FillComboBoxCurves(QComboBox *box) const
|
||||||
{
|
{
|
||||||
SCASSERT(box != nullptr);
|
SCASSERT(box != nullptr);
|
||||||
const QHash<quint32, QSharedPointer<VGObject> > *objs = data->DataGObjects();
|
const auto objs = data->DataGObjects();
|
||||||
QMap<QString, quint32> list;
|
QMap<QString, quint32> list;
|
||||||
QHash<quint32, QSharedPointer<VGObject> >::const_iterator i;
|
QHash<quint32, QSharedPointer<VGObject> >::const_iterator i;
|
||||||
for (i = objs->constBegin(); i != objs->constEnd(); ++i)
|
for (i = objs->constBegin(); i != objs->constEnd(); ++i)
|
||||||
|
@ -157,9 +221,10 @@ void DialogTool::FillComboBoxCurves(QComboBox *box) const
|
||||||
{
|
{
|
||||||
QSharedPointer<VGObject> obj = i.value();
|
QSharedPointer<VGObject> obj = i.value();
|
||||||
if ((obj->getType() == GOType::Arc || obj->getType() == GOType::Spline ||
|
if ((obj->getType() == GOType::Arc || obj->getType() == GOType::Spline ||
|
||||||
obj->getType() == GOType::SplinePath) && obj->getMode() == Draw::Calculation)
|
obj->getType() == GOType::SplinePath || obj->getType() == GOType::CubicBezier) &&
|
||||||
|
obj->getMode() == Draw::Calculation)
|
||||||
{
|
{
|
||||||
const QSharedPointer<VAbstractCurve> curve = data->GeometricObject<VAbstractCurve>(i.key());
|
const auto curve = data->GeometricObject<VAbstractCurve>(i.key());
|
||||||
|
|
||||||
QString newName = curve->name();
|
QString newName = curve->name();
|
||||||
int bias = 0;
|
int bias = 0;
|
||||||
|
|
|
@ -192,6 +192,8 @@ protected:
|
||||||
const quint32 &ch1 = NULL_ID, const quint32 &ch2 = NULL_ID)const;
|
const quint32 &ch1 = NULL_ID, const quint32 &ch2 = NULL_ID)const;
|
||||||
void FillComboBoxSplinesPath(QComboBox *box, FillComboBox rule = FillComboBox::Whole,
|
void FillComboBoxSplinesPath(QComboBox *box, FillComboBox rule = FillComboBox::Whole,
|
||||||
const quint32 &ch1 = NULL_ID, const quint32 &ch2 = NULL_ID)const;
|
const quint32 &ch1 = NULL_ID, const quint32 &ch2 = NULL_ID)const;
|
||||||
|
void FillComboBoxSimpleSplines(QComboBox *box, FillComboBox rule = FillComboBox::Whole,
|
||||||
|
const quint32 &ch1 = NULL_ID, const quint32 &ch2 = NULL_ID)const;
|
||||||
void FillComboBoxCurves(QComboBox *box)const;
|
void FillComboBoxCurves(QComboBox *box)const;
|
||||||
void FillComboBoxTypeLine(QComboBox *box, const QMap<QString, QIcon> &stylesPics) const;
|
void FillComboBoxTypeLine(QComboBox *box, const QMap<QString, QIcon> &stylesPics) const;
|
||||||
void FillComboBoxLineColors(QComboBox *box)const;
|
void FillComboBoxLineColors(QComboBox *box)const;
|
||||||
|
|
|
@ -120,7 +120,7 @@ VToolCutSpline* VToolCutSpline::Create(const quint32 _id, const QString &pointNa
|
||||||
VMainGraphicsScene *scene, VAbstractPattern *doc, VContainer *data,
|
VMainGraphicsScene *scene, VAbstractPattern *doc, VContainer *data,
|
||||||
const Document &parse, const Source &typeCreation)
|
const Document &parse, const Source &typeCreation)
|
||||||
{
|
{
|
||||||
const QSharedPointer<VSpline> spl = data->GeometricObject<VSpline>(splineId);
|
const auto spl = data->GeometricObject<VAbstractCubicBezier>(splineId);
|
||||||
|
|
||||||
const qreal result = CheckFormula(_id, formula, data);
|
const qreal result = CheckFormula(_id, formula, data);
|
||||||
|
|
||||||
|
|
|
@ -53,14 +53,20 @@ void VisToolCutSpline::RefreshGeometry()
|
||||||
{
|
{
|
||||||
if (object1Id > NULL_ID)
|
if (object1Id > NULL_ID)
|
||||||
{
|
{
|
||||||
const QSharedPointer<VSpline> spl = Visualization::data->GeometricObject<VSpline>(object1Id);
|
const auto spl = Visualization::data->GeometricObject<VAbstractCubicBezier>(object1Id);
|
||||||
DrawPath(this, spl->GetPath(PathDirection::Show), supportColor, Qt::SolidLine, Qt::RoundCap);
|
DrawPath(this, spl->GetPath(PathDirection::Show), supportColor, Qt::SolidLine, Qt::RoundCap);
|
||||||
|
|
||||||
if (qFuzzyCompare(1 + length, 1 + 0) == false)
|
if (qFuzzyCompare(1 + length, 1 + 0) == false)
|
||||||
{
|
{
|
||||||
VSpline sp1;
|
QPointF spl1p2;
|
||||||
VSpline sp2;
|
QPointF spl1p3;
|
||||||
QPointF p = spl->CutSpline(length, sp1, sp2);
|
QPointF spl2p2;
|
||||||
|
QPointF spl2p3;
|
||||||
|
const QPointF p = spl->CutSpline (length, spl1p2, spl1p3, spl2p2, spl2p3 );
|
||||||
|
|
||||||
|
const VSpline sp1 = VSpline(spl->GetP1(), spl1p2, spl1p3, p);
|
||||||
|
const VSpline sp2 = VSpline(p, spl2p2, spl2p3, spl->GetP4());
|
||||||
|
|
||||||
DrawPoint(point, p, mainColor);
|
DrawPoint(point, p, mainColor);
|
||||||
|
|
||||||
DrawPath(spl1, sp1.GetPath(PathDirection::Show), Qt::darkGreen, Qt::SolidLine, Qt::RoundCap);
|
DrawPath(spl1, sp1.GetPath(PathDirection::Show), Qt::darkGreen, Qt::SolidLine, Qt::RoundCap);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user