From c99cdb69ec6a84007dcf29383fed32cd00cd57c1 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Sat, 2 Apr 2016 00:15:04 +0300 Subject: [PATCH] Added new curve path segment variables. --HG-- branch : develop --- ChangeLog.txt | 1 + src/libs/ifc/ifcdef.cpp | 4 ++- src/libs/ifc/ifcdef.h | 1 + src/libs/vpatterndb/variables/vcurveangle.cpp | 23 +++++++++++++++-- src/libs/vpatterndb/variables/vcurveangle.h | 3 +++ .../vpatterndb/variables/vcurvelength.cpp | 13 ++++++++++ src/libs/vpatterndb/variables/vcurvelength.h | 3 +++ src/libs/vpatterndb/vcontainer.cpp | 23 ++++++++++++++++- src/libs/vpatterndb/vcontainer.h | 5 +++- src/libs/vpatterndb/vtranslatevars.cpp | 25 ++++++++++--------- .../toolcurve/vtoolcubicbezierpath.cpp | 4 +-- .../drawTools/toolcurve/vtoolsplinepath.cpp | 4 +-- .../ValentinaTest/tst_measurementregexp.cpp | 1 + 13 files changed, 89 insertions(+), 21 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index 9d35c42bb..5eb0bd41f 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,4 +1,5 @@ # Version 0.5.0 +- Added new curve path segment variables. - Toggle ScrollHandDrag mode by clicking a middle mouse button. - Added horizontal scrolling by pressiong Shift + mouse wheel. - [#366] Update 'Point from Distance and Angle' tool to read distance and angle between points. diff --git a/src/libs/ifc/ifcdef.cpp b/src/libs/ifc/ifcdef.cpp index dc05e7ca5..dcbd260be 100644 --- a/src/libs/ifc/ifcdef.cpp +++ b/src/libs/ifc/ifcdef.cpp @@ -160,6 +160,7 @@ const QString angle1Spl_ = angle1_V + spl_; const QString angle2Spl_ = angle2_V + spl_; const QString angle1SplPath = angle1_V + splPath; const QString angle2SplPath = angle2_V + splPath; +const QString seg_ = QStringLiteral("Seg_"); const QStringList builInVariables = QStringList() << line_ << angleLine_ @@ -175,4 +176,5 @@ const QStringList builInVariables = QStringList() << line_ << angle1Spl_ << angle2Spl_ << angle1SplPath - << angle2SplPath; + << angle2SplPath + << seg_; diff --git a/src/libs/ifc/ifcdef.h b/src/libs/ifc/ifcdef.h index 108fa1a23..a88c39d3f 100644 --- a/src/libs/ifc/ifcdef.h +++ b/src/libs/ifc/ifcdef.h @@ -167,6 +167,7 @@ extern const QString angle1Spl_; extern const QString angle2Spl_; extern const QString angle1SplPath; extern const QString angle2SplPath; +extern const QString seg_; extern const QStringList builInVariables; diff --git a/src/libs/vpatterndb/variables/vcurveangle.cpp b/src/libs/vpatterndb/variables/vcurveangle.cpp index ec90ba6f7..d2ae6ac96 100644 --- a/src/libs/vpatterndb/variables/vcurveangle.cpp +++ b/src/libs/vpatterndb/variables/vcurveangle.cpp @@ -28,6 +28,7 @@ #include "vcurveangle.h" #include "../vgeometry/vabstractcurve.h" +#include "../vgeometry/vspline.h" //--------------------------------------------------------------------------------------------------------------------- VCurveAngle::VCurveAngle() @@ -45,12 +46,30 @@ VCurveAngle::VCurveAngle(const quint32 &id, const quint32 &parentId, const VAbst if (angle == CurveAngle::StartAngle) { SetValue(curve->GetStartAngle()); - SetName(QString(angle1_V+"%1").arg(curve->name())); + SetName(angle1_V + curve->name()); } else { SetValue(curve->GetEndAngle()); - SetName(QString(angle2_V+"%1").arg(curve->name())); + SetName(angle2_V + curve->name()); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +VCurveAngle::VCurveAngle(const quint32 &id, const quint32 &parentId, const QString &baseCurveName, const VSpline &spl, + CurveAngle angle, qint32 segment) + :VCurveVariable(id, parentId) +{ + SetType(VarType::CurveAngle); + if (angle == CurveAngle::StartAngle) + { + SetValue(spl.GetStartAngle()); + SetName(angle1_V + baseCurveName + QLatin1String("_") + seg_ + QString().setNum(segment)); + } + else + { + SetValue(spl.GetEndAngle()); + SetName(angle2_V + baseCurveName + QLatin1String("_") + seg_ + QString().setNum(segment)); } } diff --git a/src/libs/vpatterndb/variables/vcurveangle.h b/src/libs/vpatterndb/variables/vcurveangle.h index 53cdacfc6..0cd66195a 100644 --- a/src/libs/vpatterndb/variables/vcurveangle.h +++ b/src/libs/vpatterndb/variables/vcurveangle.h @@ -32,6 +32,7 @@ #include "../vpatterndb/variables/vcurvevariable.h" class VAbstractCurve; +class VSpline; enum class CurveAngle : char { StartAngle, EndAngle }; @@ -40,6 +41,8 @@ class VCurveAngle : public VCurveVariable public: VCurveAngle(); VCurveAngle(const quint32 &id, const quint32 &parentId, const VAbstractCurve *curve, CurveAngle angle); + VCurveAngle(const quint32 &id, const quint32 &parentId, const QString &baseCurveName, const VSpline &spl, + CurveAngle angle, qint32 segment); VCurveAngle(const VCurveAngle &var); VCurveAngle &operator=(const VCurveAngle &var); virtual ~VCurveAngle() Q_DECL_OVERRIDE; diff --git a/src/libs/vpatterndb/variables/vcurvelength.cpp b/src/libs/vpatterndb/variables/vcurvelength.cpp index 14529e786..f382b7017 100644 --- a/src/libs/vpatterndb/variables/vcurvelength.cpp +++ b/src/libs/vpatterndb/variables/vcurvelength.cpp @@ -28,6 +28,7 @@ #include "vcurvelength.h" #include "../vgeometry/vabstractcurve.h" +#include "../vgeometry/vspline.h" //--------------------------------------------------------------------------------------------------------------------- VCurveLength::VCurveLength() @@ -46,6 +47,18 @@ VCurveLength::VCurveLength(const quint32 &id, const quint32 &parentId, const VAb SetValue(FromPixel(curve->GetLength(), patternUnit)); } +//--------------------------------------------------------------------------------------------------------------------- +VCurveLength::VCurveLength(const quint32 &id, const quint32 &parentId, const QString &baseCurveName, const VSpline &spl, + Unit patternUnit, qint32 segment) + :VCurveVariable(id, parentId) +{ + SCASSERT(not baseCurveName.isEmpty()) + + SetType(VarType::CurveLength); + SetName(baseCurveName + QLatin1String("_") + seg_ + QString().setNum(segment)); + SetValue(FromPixel(spl.GetLength(), patternUnit)); +} + //--------------------------------------------------------------------------------------------------------------------- VCurveLength::VCurveLength(const VCurveLength &var) :VCurveVariable(var) diff --git a/src/libs/vpatterndb/variables/vcurvelength.h b/src/libs/vpatterndb/variables/vcurvelength.h index adba697e4..01e4e2e28 100644 --- a/src/libs/vpatterndb/variables/vcurvelength.h +++ b/src/libs/vpatterndb/variables/vcurvelength.h @@ -33,12 +33,15 @@ #include "../ifc/ifcdef.h" class VAbstractCurve; +class VSpline; class VCurveLength : public VCurveVariable { public: VCurveLength(); VCurveLength(const quint32 &id, const quint32 &parentId, const VAbstractCurve *curve, Unit patternUnit); + VCurveLength(const quint32 &id, const quint32 &parentId, const QString &baseCurveName, const VSpline &spl, + Unit patternUnit, qint32 segment); VCurveLength(const VCurveLength &var); VCurveLength &operator=(const VCurveLength &var); virtual ~VCurveLength() Q_DECL_OVERRIDE; diff --git a/src/libs/vpatterndb/vcontainer.cpp b/src/libs/vpatterndb/vcontainer.cpp index a20b104b0..29d084499 100644 --- a/src/libs/vpatterndb/vcontainer.cpp +++ b/src/libs/vpatterndb/vcontainer.cpp @@ -379,7 +379,7 @@ void VContainer::AddArc(const QSharedPointer &arc, const quint32 &id, cons } //--------------------------------------------------------------------------------------------------------------------- -void VContainer::AddCurve(const QSharedPointer &curve, const quint32 &id, const quint32 &parentId) +void VContainer::AddCurve(const QSharedPointer &curve, const quint32 &id, quint32 parentId) { const GOType curveType = curve->getType(); if (curveType != GOType::Spline && curveType != GOType::SplinePath && @@ -399,6 +399,27 @@ void VContainer::AddCurve(const QSharedPointer &curve, const qui AddVariable(endAngle->GetName(), endAngle); } +//--------------------------------------------------------------------------------------------------------------------- +void VContainer::AddCurveWithSegments(const QSharedPointer &curve, const quint32 &id, + quint32 parentId) +{ + AddCurve(curve, id, parentId); + + for (qint32 i = 1; i <= curve->CountSubSpl(); ++i) + { + const VSpline spl = curve->GetSpline(i); + + VCurveLength *length = new VCurveLength(id, parentId, curve->name(), spl, *GetPatternUnit(), i); + AddVariable(length->GetName(), length); + + VCurveAngle *startAngle = new VCurveAngle(id, parentId, curve->name(), spl, CurveAngle::StartAngle, i); + AddVariable(startAngle->GetName(), startAngle); + + VCurveAngle *endAngle = new VCurveAngle(id, parentId, curve->name(), spl, CurveAngle::EndAngle, i); + AddVariable(endAngle->GetName(), endAngle); + } +} + //--------------------------------------------------------------------------------------------------------------------- /** * @brief AddObject add object to container diff --git a/src/libs/vpatterndb/vcontainer.h b/src/libs/vpatterndb/vcontainer.h index acce78262..00b411359 100644 --- a/src/libs/vpatterndb/vcontainer.h +++ b/src/libs/vpatterndb/vcontainer.h @@ -34,6 +34,7 @@ #include "../vgeometry/vgobject.h" #include "../ifc/exception/vexceptionbadid.h" #include "../vgeometry/vabstractcurve.h" +#include "../vgeometry/vabstractcubicbezierpath.h" #include "vtranslatevars.h" #include @@ -122,7 +123,9 @@ public: void AddLine(const quint32 &firstPointId, const quint32 &secondPointId); void AddArc(const QSharedPointer &arc, const quint32 &arcId, const quint32 &parentId = 0); void AddCurve(const QSharedPointer &curve, const quint32 &id, - const quint32 &parentId = NULL_ID); + quint32 parentId = NULL_ID); + void AddCurveWithSegments(const QSharedPointer &curve, const quint32 &id, + quint32 parentId = NULL_ID); template void AddVariable(const QString& name, T *var); diff --git a/src/libs/vpatterndb/vtranslatevars.cpp b/src/libs/vpatterndb/vtranslatevars.cpp index fdbc344fe..858a32d77 100644 --- a/src/libs/vpatterndb/vtranslatevars.cpp +++ b/src/libs/vpatterndb/vtranslatevars.cpp @@ -366,20 +366,21 @@ void VTranslateVars::InitPatternMakingSystems() //--------------------------------------------------------------------------------------------------------------------- void VTranslateVars::InitVariables() { - variables.insert(line_, translate("VTranslateVars", "Line_", "Left symbol _ in name")); - variables.insert(angleLine_, translate("VTranslateVars", "AngleLine_", "Left symbol _ in name")); - variables.insert(arc_, translate("VTranslateVars", "Arc_", "Left symbol _ in name")); - variables.insert(spl_, translate("VTranslateVars", "Spl_", "Left symbol _ in name")); - variables.insert(splPath, translate("VTranslateVars", "SplPath", "Do not add symbol _ to the end of name")); - variables.insert(radiusArc_, translate("VTranslateVars", "RadiusArc_", "Left symbol _ in name")); - variables.insert(angle1Arc_, translate("VTranslateVars", "Angle1Arc_", "Left symbol _ in name")); - variables.insert(angle2Arc_, translate("VTranslateVars", "Angle2Arc_", "Left symbol _ in name")); - variables.insert(angle1Spl_, translate("VTranslateVars", "Angle1Spl_", "Left symbol _ in name")); - variables.insert(angle2Spl_, translate("VTranslateVars", "Angle2Spl_", "Left symbol _ in name")); + variables.insert(line_, translate("VTranslateVars", "Line_", "Left symbol _ in the name")); + variables.insert(angleLine_, translate("VTranslateVars", "AngleLine_", "Left symbol _ in the name")); + variables.insert(arc_, translate("VTranslateVars", "Arc_", "Left symbol _ in the name")); + variables.insert(spl_, translate("VTranslateVars", "Spl_", "Left symbol _ in the name")); + variables.insert(splPath, translate("VTranslateVars", "SplPath", "Do not add symbol _ to the end of the name")); + variables.insert(radiusArc_, translate("VTranslateVars", "RadiusArc_", "Left symbol _ in the name")); + variables.insert(angle1Arc_, translate("VTranslateVars", "Angle1Arc_", "Left symbol _ in the name")); + variables.insert(angle2Arc_, translate("VTranslateVars", "Angle2Arc_", "Left symbol _ in the name")); + variables.insert(angle1Spl_, translate("VTranslateVars", "Angle1Spl_", "Left symbol _ in the name")); + variables.insert(angle2Spl_, translate("VTranslateVars", "Angle2Spl_", "Left symbol _ in the name")); variables.insert(angle1SplPath, translate("VTranslateVars", "Angle1SplPath", - "Do not add symbol _ to the end of name")); + "Do not add symbol _ to the end of the name")); variables.insert(angle2SplPath, translate("VTranslateVars", "Angle2SplPath", - "Do not add symbol _ to the end of name")); + "Do not add symbol _ to the end of the name")); + variables.insert(seg_, translate("VTranslateVars", "Seg_", "Segment. Left symbol _ in the name")); } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vtools/tools/drawTools/toolcurve/vtoolcubicbezierpath.cpp b/src/libs/vtools/tools/drawTools/toolcurve/vtoolcubicbezierpath.cpp index b25052264..19f56c3f7 100644 --- a/src/libs/vtools/tools/drawTools/toolcurve/vtoolcubicbezierpath.cpp +++ b/src/libs/vtools/tools/drawTools/toolcurve/vtoolcubicbezierpath.cpp @@ -92,12 +92,12 @@ VToolCubicBezierPath *VToolCubicBezierPath::Create(const quint32 _id, VCubicBezi if (typeCreation == Source::FromGui) { id = data->AddGObject(path); - data->AddCurve(data->GeometricObject(id), id); + data->AddCurveWithSegments(data->GeometricObject(id), id); } else { data->UpdateGObject(id, path); - data->AddCurve(data->GeometricObject(id), id); + data->AddCurveWithSegments(data->GeometricObject(id), id); if (parse != Document::FullParse) { doc->UpdateToolData(id, data); diff --git a/src/libs/vtools/tools/drawTools/toolcurve/vtoolsplinepath.cpp b/src/libs/vtools/tools/drawTools/toolcurve/vtoolsplinepath.cpp index 4aab51ac2..17dc867dd 100644 --- a/src/libs/vtools/tools/drawTools/toolcurve/vtoolsplinepath.cpp +++ b/src/libs/vtools/tools/drawTools/toolcurve/vtoolsplinepath.cpp @@ -166,12 +166,12 @@ VToolSplinePath* VToolSplinePath::Create(const quint32 _id, VSplinePath *path, c if (typeCreation == Source::FromGui) { id = data->AddGObject(path); - data->AddCurve(data->GeometricObject(id), id); + data->AddCurveWithSegments(data->GeometricObject(id), id); } else { data->UpdateGObject(id, path); - data->AddCurve(data->GeometricObject(id), id); + data->AddCurveWithSegments(data->GeometricObject(id), id); if (parse != Document::FullParse) { doc->UpdateToolData(id, data); diff --git a/src/test/ValentinaTest/tst_measurementregexp.cpp b/src/test/ValentinaTest/tst_measurementregexp.cpp index ea040a686..ba0e006ab 100644 --- a/src/test/ValentinaTest/tst_measurementregexp.cpp +++ b/src/test/ValentinaTest/tst_measurementregexp.cpp @@ -648,6 +648,7 @@ void TST_MeasurementRegExp::CheckUnderlineExists() const data.insert(angle2Spl_, true); data.insert(angle1SplPath, false); data.insert(angle2SplPath, false); + data.insert(seg_, true); //Catch case when new internal variable appears. QCOMPARE(data.size(), builInVariables.size());