diff --git a/src/app/valentina/xml/vpattern.cpp b/src/app/valentina/xml/vpattern.cpp index 74660b9b0..23e55eb8d 100644 --- a/src/app/valentina/xml/vpattern.cpp +++ b/src/app/valentina/xml/vpattern.cpp @@ -527,7 +527,7 @@ void VPattern::ParseDrawMode(const QDomNode &node, const Document &parse, const { scene = sceneDetail; } - QStringList tags = QStringList() << TagPoint << TagLine << TagSpline << TagArc << TagTools; + const QStringList tags = QStringList() << TagPoint << TagLine << TagSpline << TagArc << TagTools << TagOperation; const QDomNodeList nodeList = node.childNodes(); const qint32 num = nodeList.size(); for (qint32 i = 0; i < num; ++i) @@ -557,6 +557,10 @@ void VPattern::ParseDrawMode(const QDomNode &node, const Document &parse, const qCDebug(vXML, "Tag tools."); ParseToolsElement(scene, domElement, parse, domElement.attribute(AttrType, "")); break; + case 5: // TagOperation + qCDebug(vXML, "Tag operation."); + ParseOperationElement(scene, domElement, parse, domElement.attribute(AttrType, "")); + break; default: VException e(tr("Wrong tag name '%1'.").arg(domElement.tagName())); throw e; @@ -596,7 +600,7 @@ void VPattern::ParseDetailElement(const QDomElement &domElement, const Document { if (element.tagName() == VToolDetail::TagNode) { - const quint32 id = GetParametrUInt(element, VToolDetail::AttrIdObject, NULL_ID_STR); + const quint32 id = GetParametrUInt(element, AttrIdObject, NULL_ID_STR); const qreal mx = qApp->toPixel(GetParametrDouble(element, AttrMx, "0.0")); const qreal my = qApp->toPixel(GetParametrDouble(element, AttrMy, "0.0")); const bool reverse = GetParametrUInt(element, VToolDetail::AttrReverse, "0"); @@ -2400,6 +2404,49 @@ void VPattern::ParseToolArcWithLength(VMainGraphicsScene *scene, QDomElement &do } } +//--------------------------------------------------------------------------------------------------------------------- +void VPattern::ParseToolRotation(VMainGraphicsScene *scene, QDomElement &domElement, const Document &parse) +{ + SCASSERT(scene != nullptr); + Q_ASSERT_X(domElement.isNull() == false, Q_FUNC_INFO, "domElement is null"); + + try + { + quint32 id = NULL_ID; + + ToolsCommonAttributes(domElement, id); + const quint32 center = GetParametrUInt(domElement, AttrCenter, NULL_ID_STR); + const QString angle = GetParametrString(domElement, AttrAngle, "10"); + QString a = angle;//need for saving fixed formula; + const QString suffix = GetParametrString(domElement, AttrSuffix, ""); + + QVector source; + QVector destination; + VToolRotation::ExtractData(this, domElement, source, destination); + + VToolRotation::Create(id, center, a, suffix, source, destination, scene, this, data, parse, Source::FromFile); + //Rewrite attribute formula. Need for situation when we have wrong formula. + if (a != angle) + { + SetAttribute(domElement, AttrAngle, a); + modified = true; + haveLiteChange(); + } + } + catch (const VExceptionBadId &e) + { + VExceptionObjectError excep(tr("Error creating or updating operation of rotation"), domElement); + excep.AddMoreInformation(e.ErrorMessage()); + throw excep; + } + catch (qmu::QmuParserError &e) + { + VExceptionObjectError excep(tr("Error creating or updating operation of rotation"), domElement); + excep.AddMoreInformation(QString("Message: " + e.GetMsg() + "\n"+ "Expression: " + e.GetExpr())); + throw excep; + } +} + //--------------------------------------------------------------------------------------------------------------------- qreal VPattern::EvalFormula(VContainer *data, const QString &formula, bool *ok) const { @@ -2643,6 +2690,27 @@ void VPattern::ParseToolsElement(VMainGraphicsScene *scene, const QDomElement &d } } +//--------------------------------------------------------------------------------------------------------------------- +void VPattern::ParseOperationElement(VMainGraphicsScene *scene, QDomElement &domElement, const Document &parse, + const QString &type) +{ + SCASSERT(scene != nullptr); + Q_ASSERT_X(not domElement.isNull(), Q_FUNC_INFO, "domElement is null"); + Q_ASSERT_X(not type.isEmpty(), Q_FUNC_INFO, "type of operation is empty"); + + const QStringList opers = QStringList() << VToolRotation::ToolType; /*0*/ + + switch (opers.indexOf(type)) + { + case 0: //VToolRotation::ToolType + ParseToolRotation(scene, domElement, parse); + break; + default: + VException e(tr("Unknown operation type '%1'.").arg(type)); + throw e; + } +} + //--------------------------------------------------------------------------------------------------------------------- /** * @brief ParseIncrementsElement parse increments tag. diff --git a/src/app/valentina/xml/vpattern.h b/src/app/valentina/xml/vpattern.h index a08c7b362..604da69ff 100644 --- a/src/app/valentina/xml/vpattern.h +++ b/src/app/valentina/xml/vpattern.h @@ -125,6 +125,8 @@ private: const Document &parse, const QString& type); void ParseToolsElement(VMainGraphicsScene *scene, const QDomElement& domElement, const Document &parse, const QString& type); + void ParseOperationElement(VMainGraphicsScene *scene, QDomElement &domElement, const Document &parse, + const QString& type); void ParseIncrementsElement(const QDomNode& node); void PrepareForParse(const Document &parse); void ToolsCommonAttributes(const QDomElement &domElement, quint32 &id); @@ -185,6 +187,8 @@ private: void ParseNodeArc(const QDomElement &domElement, const Document &parse); void ParseToolArcWithLength(VMainGraphicsScene *scene, QDomElement &domElement, const Document &parse); + void ParseToolRotation(VMainGraphicsScene *scene, QDomElement &domElement, const Document &parse); + qreal EvalFormula(VContainer *data, const QString &formula, bool *ok) const; QDomElement MakeEmptyIncrement(const QString &name); diff --git a/src/libs/ifc/schema/pattern/v0.3.1.xsd b/src/libs/ifc/schema/pattern/v0.3.1.xsd index 17a0d72f1..d5af28adf 100644 --- a/src/libs/ifc/schema/pattern/v0.3.1.xsd +++ b/src/libs/ifc/schema/pattern/v0.3.1.xsd @@ -201,6 +201,7 @@ + diff --git a/src/libs/ifc/xml/vabstractpattern.cpp b/src/libs/ifc/xml/vabstractpattern.cpp index ca528a4ab..4b495c1e4 100644 --- a/src/libs/ifc/xml/vabstractpattern.cpp +++ b/src/libs/ifc/xml/vabstractpattern.cpp @@ -54,6 +54,7 @@ const QString VAbstractPattern::TagLine = QStringLiteral("line"); const QString VAbstractPattern::TagSpline = QStringLiteral("spline"); const QString VAbstractPattern::TagArc = QStringLiteral("arc"); const QString VAbstractPattern::TagTools = QStringLiteral("tools"); +const QString VAbstractPattern::TagOperation = QStringLiteral("operation"); const QString VAbstractPattern::TagGradation = QStringLiteral("gradation"); const QString VAbstractPattern::TagHeights = QStringLiteral("heights"); const QString VAbstractPattern::TagSizes = QStringLiteral("sizes"); diff --git a/src/libs/ifc/xml/vabstractpattern.h b/src/libs/ifc/xml/vabstractpattern.h index e50e98cd5..8bc3444fc 100644 --- a/src/libs/ifc/xml/vabstractpattern.h +++ b/src/libs/ifc/xml/vabstractpattern.h @@ -148,6 +148,7 @@ public: static const QString TagSpline; static const QString TagArc; static const QString TagTools; + static const QString TagOperation; static const QString TagGradation; static const QString TagHeights; static const QString TagSizes; diff --git a/src/libs/vtools/tools/drawTools/operation/vtoolrotation.cpp b/src/libs/vtools/tools/drawTools/operation/vtoolrotation.cpp index 5095a80cf..c4858e135 100644 --- a/src/libs/vtools/tools/drawTools/operation/vtoolrotation.cpp +++ b/src/libs/vtools/tools/drawTools/operation/vtoolrotation.cpp @@ -40,7 +40,7 @@ #include "../vwidgets/vsimplecurve.h" #include "../../../undocommands/label/rotationmovelabel.h" -const QString VToolRotation::TagName = QStringLiteral("operation"); +const QString VToolRotation::ToolType = QStringLiteral("rotation"); const QString VToolRotation::TagItem = QStringLiteral("item"); const QString VToolRotation::TagSource = QStringLiteral("source"); const QString VToolRotation::TagDestination = QStringLiteral("destination"); @@ -308,13 +308,56 @@ VToolRotation *VToolRotation::Create(const quint32 _id, const quint32 &origin, Q } //--------------------------------------------------------------------------------------------------------------------- -QString VToolRotation::getTagName() const +void VToolRotation::ExtractData(VAbstractPattern *doc, const QDomElement &domElement, QVector &source, + QVector &destination) { - return VToolRotation::TagName; + SCASSERT(doc != nullptr) + const QDomNodeList nodeList = domElement.childNodes(); + for (qint32 i = 0; i < nodeList.size(); ++i) + { + const QDomElement dataElement = nodeList.at(i).toElement(); + if (not dataElement.isNull() && dataElement.tagName() == TagSource) + { + source.clear(); + const QDomNodeList srcList = dataElement.childNodes(); + for (qint32 j = 0; j < srcList.size(); ++j) + { + const QDomElement element = srcList.at(j).toElement(); + if (not element.isNull()) + { + source.append(doc->GetParametrUInt(element, AttrIdObject, NULL_ID_STR)); + } + } + } + + if (not dataElement.isNull() && dataElement.tagName() == TagDestination) + { + destination.clear(); + const QDomNodeList srcList = dataElement.childNodes(); + for (qint32 j = 0; j < srcList.size(); ++j) + { + const QDomElement element = srcList.at(j).toElement(); + if (not element.isNull()) + { + DestinationItem d; + d.id = doc->GetParametrUInt(element, AttrIdObject, NULL_ID_STR); + d.mx = qApp->toPixel(doc->GetParametrDouble(element, AttrMx, "0.0")); + d.my = qApp->toPixel(doc->GetParametrDouble(element, AttrMy, "0.0")); + destination.append(d); + } + } + } + } } //--------------------------------------------------------------------------------------------------------------------- -void VToolRotation::setEnabled(bool enabled) +QString VToolRotation::getTagName() const +{ + return VAbstractPattern::TagOperation; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VToolRotation::SetEnabled(bool enabled) { this->setEnabled(enabled); } @@ -585,7 +628,7 @@ void VToolRotation::paint(QPainter *painter, const QStyleOptionGraphicsItem *opt void VToolRotation::Disable(bool disable, const QString &namePP) { enabled = !CorrectDisable(disable, namePP); - setEnabled(enabled); + SetEnabled(enabled); QMapIterator i(rObjects); while (i.hasNext()) @@ -661,6 +704,7 @@ void VToolRotation::SaveOptions(QDomElement &tag, QSharedPointer &obj) { VDrawTool::SaveOptions(tag, obj); + doc->SetAttribute(tag, AttrType, ToolType); doc->SetAttribute(tag, AttrCenter, QString().setNum(origPointId)); doc->SetAttribute(tag, AttrAngle, angle); doc->SetAttribute(tag, AttrSuffix, suffix); diff --git a/src/libs/vtools/tools/drawTools/operation/vtoolrotation.h b/src/libs/vtools/tools/drawTools/operation/vtoolrotation.h index 823aae5df..1bbd57034 100644 --- a/src/libs/vtools/tools/drawTools/operation/vtoolrotation.h +++ b/src/libs/vtools/tools/drawTools/operation/vtoolrotation.h @@ -56,8 +56,9 @@ public: const QVector &source, const QVector &destination, VMainGraphicsScene *scene, VAbstractPattern *doc, VContainer *data, const Document &parse, const Source &typeCreation); - // cppcheck-suppress duplInheritedMember - static const QString TagName; + static void ExtractData(VAbstractPattern *doc, const QDomElement &domElement, QVector &source, + QVector &destination); + static const QString ToolType; static const QString TagItem; static const QString TagSource; static const QString TagDestination; @@ -65,7 +66,7 @@ public: enum { Type = UserType + static_cast(Tool::Rotation)}; virtual QString getTagName() const Q_DECL_OVERRIDE; - void setEnabled(bool enabled); + void SetEnabled(bool enabled); QString Suffix() const; diff --git a/src/libs/vtools/tools/vtooldetail.cpp b/src/libs/vtools/tools/vtooldetail.cpp index 25cdede3c..b94a046c2 100644 --- a/src/libs/vtools/tools/vtooldetail.cpp +++ b/src/libs/vtools/tools/vtooldetail.cpp @@ -54,7 +54,6 @@ const QString VToolDetail::TagNode = QStringLiteral("node"); const QString VToolDetail::AttrSupplement = QStringLiteral("supplement"); const QString VToolDetail::AttrClosed = QStringLiteral("closed"); const QString VToolDetail::AttrWidth = QStringLiteral("width"); -const QString VToolDetail::AttrIdObject = QStringLiteral("idObject"); const QString VToolDetail::AttrNodeType = QStringLiteral("nodeType"); const QString VToolDetail::AttrReverse = QStringLiteral("reverse"); diff --git a/src/libs/vtools/tools/vtooldetail.h b/src/libs/vtools/tools/vtooldetail.h index 1b507b562..18bdccc05 100644 --- a/src/libs/vtools/tools/vtooldetail.h +++ b/src/libs/vtools/tools/vtooldetail.h @@ -69,7 +69,6 @@ public: static const QString AttrSupplement; static const QString AttrClosed; static const QString AttrWidth; - static const QString AttrIdObject; static const QString AttrNodeType; static const QString AttrReverse; static const QString NodeTypeContour; diff --git a/src/libs/vtools/tools/vtooluniondetails.cpp b/src/libs/vtools/tools/vtooluniondetails.cpp index 7f3f72baf..8e06df24c 100644 --- a/src/libs/vtools/tools/vtooluniondetails.cpp +++ b/src/libs/vtools/tools/vtooluniondetails.cpp @@ -738,7 +738,7 @@ QVector VToolUnionDetails::GetDetailFromFile(VAbstractPattern *doc, con { if (element.tagName() == VToolUnionDetails::TagNode) { - quint32 id = doc->GetParametrUInt(element, VToolDetail::AttrIdObject, NULL_ID_STR); + quint32 id = doc->GetParametrUInt(element, AttrIdObject, NULL_ID_STR); qreal mx = qApp->toPixel(doc->GetParametrDouble(element, AttrMx, "0.0")); qreal my = qApp->toPixel(doc->GetParametrDouble(element, AttrMy, "0.0")); const bool reversed = doc->GetParametrUInt(element, VToolDetail::AttrReverse, "0");