Completed generation of recipe.

--HG--
branch : feature
This commit is contained in:
Roman Telezhynskyi 2019-07-11 13:47:55 +03:00
parent 6ed74b2dd0
commit 965cf34c15
8 changed files with 1013 additions and 88 deletions

View File

@ -10,7 +10,8 @@ HEADERS += \
$$PWD/vexceptionterminatedposition.h \
$$PWD/vexceptionwrongid.h \
$$PWD/vexceptionundo.h \
$$PWD/vexceptioninvalidnotch.h
$$PWD/vexceptioninvalidnotch.h \
$$PWD/vexceptioninvalidhistory.h
SOURCES += \
$$PWD/vexceptionobjecterror.cpp \
@ -21,4 +22,5 @@ SOURCES += \
$$PWD/vexceptionterminatedposition.cpp \
$$PWD/vexceptionwrongid.cpp \
$$PWD/vexceptionundo.cpp \
$$PWD/vexceptioninvalidnotch.cpp
$$PWD/vexceptioninvalidnotch.cpp \
$$PWD/vexceptioninvalidhistory.cpp

View File

@ -0,0 +1,49 @@
/************************************************************************
**
** @file vexceptioninvalidhistory.cpp
** @author Roman Telezhynskyi <dismine(at)gmail.com>
** @date 10 7, 2019
**
** @brief
** @copyright
** This source code is part of the Valentina project, a pattern making
** program, whose allow create and modeling patterns of clothing.
** Copyright (C) 2019 Valentina project
** <https://bitbucket.org/dismine/valentina> All Rights Reserved.
**
** Valentina is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** Valentina is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with Valentina. If not, see <http://www.gnu.org/licenses/>.
**
*************************************************************************/
#include "vexceptioninvalidhistory.h"
//---------------------------------------------------------------------------------------------------------------------
VExceptionInvalidHistory::VExceptionInvalidHistory(const QString &error)
:VException(error)
{}
//---------------------------------------------------------------------------------------------------------------------
VExceptionInvalidHistory::VExceptionInvalidHistory(const VExceptionInvalidHistory &e)
:VException(e)
{}
//---------------------------------------------------------------------------------------------------------------------
VExceptionInvalidHistory &VExceptionInvalidHistory::operator=(const VExceptionInvalidHistory &e)
{
if ( &e == this )
{
return *this;
}
VException::operator=(e);
return *this;
}

View File

@ -0,0 +1,47 @@
/************************************************************************
**
** @file vexceptioninvalidhistory.h
** @author Roman Telezhynskyi <dismine(at)gmail.com>
** @date 10 7, 2019
**
** @brief
** @copyright
** This source code is part of the Valentina project, a pattern making
** program, whose allow create and modeling patterns of clothing.
** Copyright (C) 2019 Valentina project
** <https://bitbucket.org/dismine/valentina> All Rights Reserved.
**
** Valentina is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** Valentina is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with Valentina. If not, see <http://www.gnu.org/licenses/>.
**
*************************************************************************/
#ifndef VEXCEPTIONINVALIDHISTORY_H
#define VEXCEPTIONINVALIDHISTORY_H
#include "vexception.h"
class VExceptionInvalidHistory : public VException
{
public:
explicit VExceptionInvalidHistory(const QString &error);
VExceptionInvalidHistory(const VExceptionInvalidHistory &e);
VExceptionInvalidHistory &operator=(const VExceptionInvalidHistory &e);
virtual ~VExceptionInvalidHistory() V_NOEXCEPT_EXPR (true) Q_DECL_EQ_DEFAULT;
Q_NORETURN virtual void raise() const override { throw *this; }
Q_REQUIRED_RESULT virtual VExceptionInvalidHistory *clone() const override
{ return new VExceptionInvalidHistory(*this); }
};
#endif // VEXCEPTIONINVALIDHISTORY_H

View File

@ -30,30 +30,32 @@
#include "../vmisc/projectversion.h"
#include "../vmisc/vabstractapplication.h"
#include "../ifc/xml/vabstractpattern.h"
#include "../ifc/exception/vexceptioninvalidhistory.h"
#include "../vpatterndb/vcontainer.h"
#include "../vgeometry/vpointf.h"
#include "../vgeometry/vcubicbezier.h"
#include "../vgeometry/vsplinepath.h"
#include "../vgeometry/vcubicbezierpath.h"
#include "../vtools/tools/drawTools/drawtools.h"
namespace
{
Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagRecipe, (QLatin1String("recipe")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagPrerequisite, (QLatin1String("prerequisite")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagValentina, (QLatin1String("valentina")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagDescription, (QLatin1String("description")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagNotes, (QLatin1String("notes")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagMeasurements, (QLatin1String("measurements")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagMeasurement, (QLatin1String("measurement")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagIncrements, (QLatin1String("increments")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagIncrement, (QLatin1String("increment")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagPreviewCalculations, (QLatin1String("previewCalculations")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, TagContent, (QLatin1String("content")))
#define TagStep QStringLiteral("step")
Q_GLOBAL_STATIC_WITH_ARGS(const QString, AttrRecipeVersion, (QLatin1String("version")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, AttrDescription, (QLatin1String("description")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, AttrFullName, (QLatin1String("fullName")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, AttrFormula, (QLatin1String("formula")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, AttrValue, (QLatin1String("value")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, AttrIncrementSeparator, (QLatin1String("separator")))
Q_GLOBAL_STATIC_WITH_ARGS(const QString, RecipeFormatVersion, (QLatin1String("0.1")))
#define AttrLabel QStringLiteral("label")
#define AttrLengthValue QStringLiteral("lengthValue")
#define AttrAngleValue QStringLiteral("angleValue")
#define AttrAngle1Value QStringLiteral("angle1Value")
#define AttrAngle2Value QStringLiteral("angle2Value")
#define AttrLength1Value QStringLiteral("length1Value")
#define AttrLength2Value QStringLiteral("length2Value")
#define AttrRadiusValue QStringLiteral("radiusValue")
#define AttrC1RadiusValue QStringLiteral("c1RadiusValue")
#define AttrC2RadiusValue QStringLiteral("c2RadiusValue")
#define AttrCRadiusValue QStringLiteral("cRadiusValue")
#define AttrRadius1Value QStringLiteral("radius1Value")
#define AttrRadius2Value QStringLiteral("radius2Value")
#define AttrRotationAngleValue QStringLiteral("rotationAngleValue")
//---------------------------------------------------------------------------------------------------------------------
inline QString FileComment()
@ -61,21 +63,35 @@ inline QString FileComment()
return QStringLiteral("Recipe created with Valentina v%1 (https://valentinaproject.bitbucket.io/).")
.arg(APP_VERSION_STR);
}
//---------------------------------------------------------------------------------------------------------------------
template <typename T>
T *GetPatternTool(quint32 id)
{
T* tool = qobject_cast<T*>(VAbstractPattern::getTool(id));
if (not tool)
{
throw VExceptionInvalidHistory(QObject::tr("Cannot cast tool with id '%1'.").arg(id));
}
return tool;
}
}
//---------------------------------------------------------------------------------------------------------------------
VPatternRecipe::VPatternRecipe(VContainer *data, VAbstractPattern *pattern, QObject *parent)
: VDomDocument(parent)
: VDomDocument(parent),
m_data(data),
m_pattern(pattern)
{
SCASSERT(data != nullptr)
SCASSERT(pattern != nullptr)
QDomElement recipeElement = createElement(*TagRecipe);
QDomElement recipeElement = createElement(QStringLiteral("recipe"));
recipeElement.appendChild(createComment(FileComment()));
SetAttribute(recipeElement, *AttrRecipeVersion, *RecipeFormatVersion);
SetAttribute(recipeElement, QStringLiteral("version"), QStringLiteral("0.1"));
appendChild(Prerequisite(data, pattern));
appendChild(Content(data, pattern));
recipeElement.appendChild(Prerequisite());
recipeElement.appendChild(Content());
appendChild(recipeElement);
insertBefore(createProcessingInstruction(QStringLiteral("xml"),
@ -83,7 +99,7 @@ VPatternRecipe::VPatternRecipe(VContainer *data, VAbstractPattern *pattern, QObj
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Prerequisite(VContainer *data, VAbstractPattern *pattern)
QDomElement VPatternRecipe::Prerequisite()
{
/*
<prerequisite>
@ -98,25 +114,25 @@ QDomElement VPatternRecipe::Prerequisite(VContainer *data, VAbstractPattern *pat
</previewCalculations>
</prerequisite>
*/
QDomElement prerequisiteElement = createElement(*TagPrerequisite);
QDomElement prerequisiteElement = createElement(QStringLiteral("prerequisite"));
prerequisiteElement.appendChild(CreateElementWithText(*TagValentina, APP_VERSION_STR));
prerequisiteElement.appendChild(CreateElementWithText(TagUnit, UnitsToStr(qApp->patternUnit())));
prerequisiteElement.appendChild(CreateElementWithText(*TagDescription, pattern->GetDescription()));
prerequisiteElement.appendChild(CreateElementWithText(*TagNotes, pattern->GetNotes()));
prerequisiteElement.appendChild(Measurements(data));
prerequisiteElement.appendChild(Increments(data));
prerequisiteElement.appendChild(PreviewCalculations(data));
prerequisiteElement.appendChild(CreateElementWithText(QStringLiteral("valentina"), APP_VERSION_STR));
prerequisiteElement.appendChild(CreateElementWithText(QStringLiteral("unit"), UnitsToStr(qApp->patternUnit())));
prerequisiteElement.appendChild(CreateElementWithText(QStringLiteral("description"), m_pattern->GetDescription()));
prerequisiteElement.appendChild(CreateElementWithText(QStringLiteral("notes"), m_pattern->GetNotes()));
prerequisiteElement.appendChild(Measurements());
prerequisiteElement.appendChild(Increments());
prerequisiteElement.appendChild(PreviewCalculations());
return prerequisiteElement;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Measurements(VContainer *data)
QDomElement VPatternRecipe::Measurements()
{
QDomElement measurements = createElement(*TagMeasurements);
QDomElement measurements = createElement(QStringLiteral("measurements"));
QList<QSharedPointer<VMeasurement>> patternMeasurements = data->DataMeasurements().values();
QList<QSharedPointer<VMeasurement>> patternMeasurements = m_data->DataMeasurements().values();
// Resore order
std::sort(patternMeasurements.begin(), patternMeasurements.end(),
@ -139,23 +155,23 @@ QDomElement VPatternRecipe::Measurement(const QSharedPointer<VMeasurement> &m)
* <m description="" full_name="Обхват талии" name="@От" value="65"/>
* </measurements>
*/
QDomElement measurement = createElement(*TagMeasurement);
QDomElement measurement = createElement(QStringLiteral("measurement"));
SetAttribute(measurement, *AttrDescription, m->GetDescription());
SetAttribute(measurement, *AttrFullName, m->GetGuiText());
SetAttribute(measurement, AttrName, m->GetName());
SetAttribute(measurement, *AttrFormula, m->GetFormula()); // TODO: localize
SetAttribute(measurement, *AttrValue, *m->GetValue());
SetAttribute(measurement, QStringLiteral("description"), m->GetDescription());
SetAttribute(measurement, QStringLiteral("fullName"), m->GetGuiText());
SetAttribute(measurement, QStringLiteral("name"), m->GetName());
SetAttribute(measurement, QStringLiteral("formula"), m->GetFormula()); // TODO: localize
SetAttribute(measurement, QStringLiteral("value"), *m->GetValue());
return measurement;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Increments(VContainer *data)
QDomElement VPatternRecipe::Increments()
{
QDomElement increments = createElement(*TagIncrements);
QDomElement increments = createElement(QStringLiteral("increments"));
QList<QSharedPointer<VIncrement>> patternIncrements = data->DataIncrements().values();
QList<QSharedPointer<VIncrement>> patternIncrements = m_data->DataIncrements().values();
// Resore order
std::sort(patternIncrements.begin(), patternIncrements.end(),
@ -174,40 +190,11 @@ QDomElement VPatternRecipe::Increments(VContainer *data)
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Increment(const QSharedPointer<VIncrement> &incr)
QDomElement VPatternRecipe::PreviewCalculations()
{
QDomElement measurement = createElement(*TagIncrement);
QDomElement previewCalculations = createElement(QStringLiteral("previewCalculations"));
SetAttribute(measurement, *AttrDescription, incr->GetDescription());
SetAttribute(measurement, AttrName, incr->GetName());
if (incr->GetType() != VarType::IncrementSeparator)
{
SetAttribute(measurement, *AttrFormula, incr->GetFormula()); // TODO: localize
SetAttribute(measurement, *AttrValue, *incr->GetValue());
}
else
{
SetAttribute(measurement, *AttrIncrementSeparator, true);
}
return measurement;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Content(VContainer *data, VAbstractPattern *pattern)
{
QDomElement content = createElement(*TagContent);
return content;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::PreviewCalculations(VContainer *data)
{
QDomElement previewCalculations = createElement(*TagPreviewCalculations);
QList<QSharedPointer<VIncrement>> patternIncrements = data->DataIncrements().values();
QList<QSharedPointer<VIncrement>> patternIncrements = m_data->DataIncrements().values();
// Resore order
std::sort(patternIncrements.begin(), patternIncrements.end(),
@ -224,3 +211,774 @@ QDomElement VPatternRecipe::PreviewCalculations(VContainer *data)
return previewCalculations;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Increment(const QSharedPointer<VIncrement> &incr)
{
QDomElement measurement = createElement(QStringLiteral("increment"));
SetAttribute(measurement, QStringLiteral("description"), incr->GetDescription());
SetAttribute(measurement, QStringLiteral("name"), incr->GetName());
if (incr->GetType() != VarType::IncrementSeparator)
{
SetAttribute(measurement, QStringLiteral("formula"), incr->GetFormula()); // TODO: localize
SetAttribute(measurement, QStringLiteral("value"), *incr->GetValue());
}
else
{
SetAttribute(measurement, QStringLiteral("separator"), true);
}
return measurement;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Content()
{
QDomElement content = createElement(QStringLiteral("content"));
const QDomNodeList draws = m_pattern->documentElement().elementsByTagName(VAbstractPattern::TagDraw);
for (int i=0; i < draws.size(); ++i)
{
QDomElement draw = draws.at(i).toElement();
if (draw.isNull())
{
throw VExceptionInvalidHistory(tr("Invalid tag %1").arg(VAbstractPattern::TagDraw));
}
content.appendChild(Draft(draw));
}
return content;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Draft(const QDomElement &draft)
{
QDomElement recipeDraft = createElement(QStringLiteral("draft"));
const QString draftName = draft.attribute(QStringLiteral("name"));
SetAttribute(recipeDraft, QStringLiteral("name"), draftName);
QVector<VToolRecord> *history = m_pattern->getHistory();
for (auto &record : *history)
{
if (record.getNameDraw() == draftName)
{
QDomElement step = Step(record);
if (not step.isNull())
{
recipeDraft.appendChild(step);
}
}
}
return recipeDraft;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Step(const VToolRecord &tool)
{
// This check helps to find missed tools in the switch
Q_STATIC_ASSERT_X(static_cast<int>(Tool::LAST_ONE_DO_NOT_USE) == 55, "Not all tools were used in history.");
const QDomElement domElem = m_pattern->elementById(tool.getId());
if (not domElem.isElement())
{
throw VExceptionInvalidHistory(tr("Can't find element by id '%1'").arg(tool.getId()));
}
try
{
QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Wswitch-default")
switch (tool.getTypeTool())
{
case Tool::Arrow:
case Tool::SinglePoint:
case Tool::DoublePoint:
case Tool::LinePoint:
case Tool::AbstractSpline:
case Tool::Cut:
case Tool::Midpoint:// Same as Tool::AlongLine, but tool will never has such type
case Tool::ArcIntersectAxis:// Same as Tool::CurveIntersectAxis, but tool will never has such type
case Tool::LAST_ONE_DO_NOT_USE:
Q_UNREACHABLE(); //-V501
break;
case Tool::BasePoint:
return BasePoint(tool);
case Tool::EndLine:
return EndLine(tool);
case Tool::Line:
return Line(tool);
case Tool::AlongLine:
return AlongLine(tool);
case Tool::ShoulderPoint:
return ShoulderPoint(tool);
case Tool::Normal:
return Normal(tool);
case Tool::Bisector:
return Bisector(tool);
case Tool::LineIntersect:
return LineIntersect(tool);
case Tool::Spline:
return Spline(tool);
case Tool::CubicBezier:
return CubicBezier(tool);
case Tool::Arc:
return Arc(tool);
case Tool::ArcWithLength:
return ArcWithLength(tool);
case Tool::SplinePath:
return SplinePath(tool);
case Tool::CubicBezierPath:
return CubicBezierPath(tool);
case Tool::PointOfContact:
return PointOfContact(tool);
case Tool::Height:
return Height(tool);
case Tool::Triangle:
return Triangle(tool);
case Tool::PointOfIntersection:
return PointOfIntersection(tool);
case Tool::CutArc:
return CutArc(tool);
case Tool::CutSpline:
return CutSpline(tool);
case Tool::CutSplinePath:
return CutSplinePath(tool);
case Tool::LineIntersectAxis:
return LineIntersectAxis(tool);
case Tool::CurveIntersectAxis:
return CurveIntersectAxis(tool);
case Tool::PointOfIntersectionArcs:
return PointOfIntersectionArcs(tool);
case Tool::PointOfIntersectionCircles:
return PointOfIntersectionCircles(tool);
case Tool::PointOfIntersectionCurves:
return PointOfIntersectionCurves(tool);
case Tool::PointFromCircleAndTangent:
return PointFromCircleAndTangent(tool);
case Tool::PointFromArcAndTangent:
return PointFromArcAndTangent(tool);
case Tool::TrueDarts:
return TrueDarts(tool);
case Tool::EllipticalArc:
return EllipticalArc(tool);
//Because "history" not only show history of pattern, but help restore current data for each pattern's
//piece, we need add record about details and nodes, but don't show them.
case Tool::Piece:
case Tool::UnionDetails:
case Tool::NodeArc:
case Tool::NodeElArc:
case Tool::NodePoint:
case Tool::NodeSpline:
case Tool::NodeSplinePath:
case Tool::Group:
case Tool::Rotation:
case Tool::FlippingByLine:
case Tool::FlippingByAxis:
case Tool::Move:
case Tool::PiecePath:
case Tool::Pin:
case Tool::PlaceLabel:
case Tool::InsertNode:
case Tool::DuplicateDetail:
return QDomElement();
}
QT_WARNING_POP
}
catch (const VExceptionBadId &e)
{
throw VExceptionInvalidHistory(e.ErrorMessage());
}
throw VExceptionInvalidHistory(tr("Can't create history record for the tool."));
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::BasePoint(const VToolRecord &record)
{
VToolBasePoint *tool = GetPatternTool<VToolBasePoint>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::EndLine(const VToolRecord &record)
{
VToolEndLine *tool = GetPatternTool<VToolEndLine>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrBasePoint, tool->BasePointName());
Formula(step, tool->GetFormulaLength(), AttrLength, AttrLengthValue);
Formula(step, tool->GetFormulaAngle(), AttrAngle, AttrAngleValue);
LineAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Line(const VToolRecord &record)
{
VToolLine *tool = GetPatternTool<VToolLine>(record.getId());
QDomElement step = createElement(TagStep);
SetAttribute(step, AttrType, QStringLiteral("segment"));
SetAttribute(step, AttrFirstPoint, tool->FirstPointName());
SetAttribute(step, AttrSecondPoint, tool->SecondPointName());
LineAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::AlongLine(const VToolRecord &record)
{
VToolAlongLine *tool = GetPatternTool<VToolAlongLine>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrBasePoint, tool->BasePointName());
SetAttribute(step, AttrSecondPoint, tool->SecondPointName());
Formula(step, tool->GetFormulaLength(), AttrLength, AttrLengthValue);
LineAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::ShoulderPoint(const VToolRecord &record)
{
VToolShoulderPoint *tool = GetPatternTool<VToolShoulderPoint>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrP1Line, tool->BasePointName());
SetAttribute(step, AttrP2Line, tool->SecondPointName());
SetAttribute(step, AttrPShoulder, tool->ShoulderPointName());
Formula(step, tool->GetFormulaLength(), AttrLength, AttrLengthValue);
LineAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Normal(const VToolRecord &record)
{
VToolNormal *tool = GetPatternTool<VToolNormal>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrFirstPoint, tool->BasePointName());
SetAttribute(step, AttrSecondPoint, tool->SecondPointName());
Formula(step, tool->GetFormulaLength(), AttrLength, AttrLengthValue);
SetAttribute(step, AttrAngle, tool->GetAngle());
LineAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Bisector(const VToolRecord &record)
{
VToolBisector *tool = GetPatternTool<VToolBisector>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrFirstPoint, tool->FirstPointName());
SetAttribute(step, AttrSecondPoint, tool->BasePointName());
SetAttribute(step, AttrSecondPoint, tool->ThirdPointName());
Formula(step, tool->GetFormulaLength(), AttrLength, AttrLengthValue);
LineAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::LineIntersect(const VToolRecord &record)
{
VToolLineIntersect *tool = GetPatternTool<VToolLineIntersect>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrP1Line1, tool->Line1P1Name());
SetAttribute(step, AttrP1Line2, tool->Line1P2Name());
SetAttribute(step, AttrP1Line2, tool->Line2P1Name());
SetAttribute(step, AttrP2Line2, tool->Line2P2Name());
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Spline(const VToolRecord &record)
{
VToolSpline *tool = GetPatternTool<VToolSpline>(record.getId());
VSpline spl = tool->getSpline();
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrPoint1, spl.GetP1().name());
SetAttribute(step, AttrPoint4, spl.GetP4().name());
SetAttribute(step, AttrAngle1, spl.GetStartAngleFormula());
SetAttribute(step, AttrAngle1Value, spl.GetStartAngle());
SetAttribute(step, AttrAngle2, spl.GetEndAngleFormula());
SetAttribute(step, AttrAngle2Value, spl.GetEndAngle());
SetAttribute(step, AttrLength1, spl.GetC1LengthFormula());
SetAttribute(step, AttrLength1Value, spl.GetC1Length());
SetAttribute(step, AttrLength2, spl.GetC2LengthFormula());
SetAttribute(step, AttrLength2Value, spl.GetC2Length());
CurveAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::CubicBezier(const VToolRecord &record)
{
VToolCubicBezier *tool = GetPatternTool<VToolCubicBezier>(record.getId());
VCubicBezier spl = tool->getSpline();
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrPoint1, spl.GetP1().name());
SetAttribute(step, AttrPoint2, spl.GetP2().name());
SetAttribute(step, AttrPoint3, spl.GetP3().name());
SetAttribute(step, AttrPoint4, spl.GetP4().name());
CurveAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Arc(const VToolRecord &record)
{
VToolArc *tool = GetPatternTool<VToolArc>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrCenter, tool->CenterPointName());
Formula(step, tool->GetFormulaRadius(), AttrRadius, AttrRadiusValue);
Formula(step, tool->GetFormulaF1(), AttrAngle1, AttrAngle1Value);
Formula(step, tool->GetFormulaF2(), AttrAngle2, AttrAngle2Value);
CurveAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::ArcWithLength(const VToolRecord &record)
{
VToolArcWithLength *tool = GetPatternTool<VToolArcWithLength>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrCenter, tool->CenterPointName());
Formula(step, tool->GetFormulaRadius(), AttrRadius, AttrRadiusValue);
Formula(step, tool->GetFormulaF1(), AttrAngle1, AttrAngle1Value);
Formula(step, tool->GetFormulaLength(), AttrLength, AttrLengthValue);
CurveAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::SplinePath(const VToolRecord &record)
{
VToolSplinePath *tool = GetPatternTool<VToolSplinePath>(record.getId());
VSplinePath spl = tool->getSplinePath();
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
QDomElement nodes = createElement(QStringLiteral("nodes"));
QVector<VSplinePoint> path = spl.GetSplinePath();
if (path.isEmpty())
{
throw VExceptionInvalidHistory(QObject::tr("Empty list of nodes for tool with id '%1'.").arg(record.getId()));
}
for (auto &pathNode : path)
{
QDomElement node = createElement(QStringLiteral("node"));
SetAttribute(node, AttrPSpline, pathNode.P().name());
SetAttribute(node, AttrAngle1, pathNode.Angle1Formula());
SetAttribute(node, AttrAngle1Value, pathNode.Angle1());
SetAttribute(node, AttrAngle2, pathNode.Angle2Formula());
SetAttribute(node, AttrAngle2Value, pathNode.Angle2());
SetAttribute(node, AttrLength1, pathNode.Length1Formula());
SetAttribute(node, AttrLength1Value, pathNode.Length1());
SetAttribute(node, AttrLength2, pathNode.Length2Formula());
SetAttribute(node, AttrLength2Value, pathNode.Length2());
nodes.appendChild(node);
}
step.appendChild(nodes);
CurveAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::CubicBezierPath(const VToolRecord &record)
{
VToolCubicBezierPath *tool = GetPatternTool<VToolCubicBezierPath>(record.getId());
VCubicBezierPath spl = tool->getSplinePath();
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
QDomElement nodes = createElement(QStringLiteral("nodes"));
QVector<VSplinePoint> path = spl.GetSplinePath();
if (path.isEmpty())
{
throw VExceptionInvalidHistory(QObject::tr("Empty list of nodes for tool with id '%1'.").arg(record.getId()));
}
for (auto &pathNode : path)
{
QDomElement node = createElement(QStringLiteral("node"));
SetAttribute(node, AttrPSpline, pathNode.P().name());
nodes.appendChild(node);
}
step.appendChild(nodes);
CurveAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::PointOfContact(const VToolRecord &record)
{
VToolPointOfContact *tool = GetPatternTool<VToolPointOfContact>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrCenter, tool->ArcCenterPointName());
SetAttribute(step, AttrFirstPoint, tool->FirstPointName());
SetAttribute(step, AttrSecondPoint, tool->SecondPointName());
Formula(step, tool->getArcRadius(), AttrRadius, AttrRadiusValue);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Height(const VToolRecord &record)
{
VToolHeight *tool = GetPatternTool<VToolHeight>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrBasePoint, tool->BasePointName());
SetAttribute(step, AttrP1Line, tool->FirstLinePointName());
SetAttribute(step, AttrP2Line, tool->SecondLinePointName());
LineAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::Triangle(const VToolRecord &record)
{
VToolTriangle *tool = GetPatternTool<VToolTriangle>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrAxisP1, tool->AxisP1Name());
SetAttribute(step, AttrAxisP2, tool->AxisP2Name());
SetAttribute(step, AttrFirstPoint, tool->FirstPointName());
SetAttribute(step, AttrSecondPoint, tool->SecondPointName());
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::PointOfIntersection(const VToolRecord &record)
{
VToolPointOfIntersection *tool = GetPatternTool<VToolPointOfIntersection>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrFirstPoint, tool->FirstPointName());
SetAttribute(step, AttrSecondPoint, tool->SecondPointName());
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::CutArc(const VToolRecord &record)
{
VToolCutArc *tool = GetPatternTool<VToolCutArc>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
Formula(step, tool->GetFormula(), AttrLength, AttrLengthValue);
SetAttribute(step, AttrArc, tool->CurveName());
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::CutSpline(const VToolRecord &record)
{
VToolCutSpline *tool = GetPatternTool<VToolCutSpline>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
Formula(step, tool->GetFormula(), AttrLength, AttrLengthValue);
SetAttribute(step, VToolCutSpline::AttrSpline, tool->CurveName());
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::CutSplinePath(const VToolRecord &record)
{
VToolCutSplinePath *tool = GetPatternTool<VToolCutSplinePath>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
Formula(step, tool->GetFormula(), AttrLength, AttrLengthValue);
SetAttribute(step, VToolCutSplinePath::AttrSplinePath, tool->CurveName());
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::LineIntersectAxis(const VToolRecord &record)
{
VToolLineIntersectAxis *tool = GetPatternTool<VToolLineIntersectAxis>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrBasePoint, tool->BasePointName());
SetAttribute(step, AttrP1Line, tool->FirstLinePoint());
SetAttribute(step, AttrP2Line, tool->SecondLinePoint());
Formula(step, tool->GetFormulaAngle(), AttrAngle, AttrAngleValue);
LineAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::CurveIntersectAxis(const VToolRecord &record)
{
VToolCurveIntersectAxis *tool = GetPatternTool<VToolCurveIntersectAxis>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrBasePoint, tool->BasePointName());
SetAttribute(step, AttrCurve, tool->CurveName());
Formula(step, tool->GetFormulaAngle(), AttrAngle, AttrAngleValue);
LineAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::PointOfIntersectionArcs(const VToolRecord &record)
{
VToolPointOfIntersectionArcs *tool = GetPatternTool<VToolPointOfIntersectionArcs>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrFirstArc, tool->FirstArcName());
SetAttribute(step, AttrSecondArc, tool->FirstArcName());
SetAttribute(step, AttrCrossPoint, static_cast<int>(tool->GetCrossCirclesPoint()));
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::PointOfIntersectionCircles(const VToolRecord &record)
{
VToolPointOfIntersectionCircles *tool = GetPatternTool<VToolPointOfIntersectionCircles>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrC1Center, tool->FirstCircleCenterPointName());
SetAttribute(step, AttrC2Center, tool->SecondCircleCenterPointName());
Formula(step, tool->GetFirstCircleRadius(), AttrC1Radius, AttrC1RadiusValue);
Formula(step, tool->GetSecondCircleRadius(), AttrC2Radius, AttrC2RadiusValue);
SetAttribute(step, AttrCrossPoint, static_cast<int>(tool->GetCrossCirclesPoint()));
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::PointOfIntersectionCurves(const VToolRecord &record)
{
VToolPointOfIntersectionCurves *tool = GetPatternTool<VToolPointOfIntersectionCurves>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrCurve1, tool->FirstCurveName());
SetAttribute(step, AttrCurve2, tool->FirstCurveName());
SetAttribute(step, AttrVCrossPoint, static_cast<int>(tool->GetVCrossPoint()));
SetAttribute(step, AttrHCrossPoint, static_cast<int>(tool->GetHCrossPoint()));
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::PointFromCircleAndTangent(const VToolRecord &record)
{
VToolPointFromCircleAndTangent *tool = GetPatternTool<VToolPointFromCircleAndTangent>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrCCenter, tool->CircleCenterPointName());
SetAttribute(step, AttrTangent, tool->TangentPointName());
Formula(step, tool->GetCircleRadius(), AttrCRadius, AttrCRadiusValue);
SetAttribute(step, AttrCrossPoint, static_cast<int>(tool->GetCrossCirclesPoint()));
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::PointFromArcAndTangent(const VToolRecord &record)
{
VToolPointFromArcAndTangent *tool = GetPatternTool<VToolPointFromArcAndTangent>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrArc, tool->ArcName());
SetAttribute(step, AttrTangent, tool->TangentPointName());
SetAttribute(step, AttrCrossPoint, static_cast<int>(tool->GetCrossCirclesPoint()));
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::TrueDarts(const VToolRecord &record)
{
VToolTrueDarts *tool = GetPatternTool<VToolTrueDarts>(record.getId());
QDomElement step = createElement(TagStep);
SetAttribute(step, AttrType, VToolTrueDarts::ToolType);
SetAttribute(step, AttrPoint1, tool->nameP1());
SetAttribute(step, AttrPoint2, tool->nameP2());
SetAttribute(step, AttrBaseLineP1, tool->BaseLineP1Name());
SetAttribute(step, AttrBaseLineP2, tool->BaseLineP2Name());
SetAttribute(step, AttrDartP1, tool->DartP1Name());
SetAttribute(step, AttrDartP2, tool->DartP2Name());
SetAttribute(step, AttrDartP3, tool->DartP3Name());
return step;
}
//---------------------------------------------------------------------------------------------------------------------
QDomElement VPatternRecipe::EllipticalArc(const VToolRecord &record)
{
VToolEllipticalArc *tool = GetPatternTool<VToolEllipticalArc>(record.getId());
QDomElement step = createElement(TagStep);
ToolAttributes(step, tool);
SetAttribute(step, AttrCenter, tool->CenterPointName());
Formula(step, tool->GetFormulaRadius1(), AttrRadius1, AttrRadius1Value);
Formula(step, tool->GetFormulaRadius2(), AttrRadius2, AttrRadius2Value);
Formula(step, tool->GetFormulaF1(), AttrAngle1, AttrAngle1Value);
Formula(step, tool->GetFormulaF2(), AttrAngle2, AttrAngle2Value);
Formula(step, tool->GetFormulaRotationAngle(), AttrRotationAngle, AttrRotationAngleValue);
CurveAttributes(step, tool);
return step;
}
//---------------------------------------------------------------------------------------------------------------------
inline void VPatternRecipe::Formula(QDomElement &step, const VFormula &formula, const QString &formulaStr,
const QString &formulaValue)
{
if (formula.error())
{
throw VExceptionInvalidHistory(QObject::tr("Invalid formula '%1' for tool with id '%2'. %3.")
.arg(formula.GetFormula(FormulaType::FromSystem))
.arg(formula.getToolId())
.arg(formula.Reason()));
}
SetAttribute(step, formulaStr, formula.GetFormula(FormulaType::FromSystem));
SetAttribute(step, formulaValue, formula.getDoubleValue());
}
//---------------------------------------------------------------------------------------------------------------------
template<typename T>
inline void VPatternRecipe::LineAttributes(QDomElement &step, T *tool)
{
SetAttribute(step, AttrLineColor, tool->GetLineColor());
SetAttribute(step, AttrTypeLine, tool->getLineType());
}
//---------------------------------------------------------------------------------------------------------------------
template<typename T>
void VPatternRecipe::CurveAttributes(QDomElement &step, T *tool)
{
SetAttribute(step, AttrLineColor, tool->GetLineColor());
SetAttribute(step, AttrPenStyle, tool->GetPenStyle());
SetAttribute(step, AttrAScale, tool->GetApproximationScale());
SetAttribute(step, AttrDuplicate, tool->GetDuplicate());
}
//---------------------------------------------------------------------------------------------------------------------
template<typename T>
inline void VPatternRecipe::ToolAttributes(QDomElement &step, T *tool)
{
SetAttribute(step, AttrType, T::ToolType);
SetAttribute(step, AttrLabel, tool->name());
}

View File

@ -28,14 +28,14 @@
#ifndef VPATTERNRECIPE_H
#define VPATTERNRECIPE_H
#include <QDomElement>
#include "../ifc/xml/vdomdocument.h"
class VContainer;
class VAbstractPattern;
class VMeasurement;
class VIncrement;
class VToolRecord;
class VFormula;
class VPatternRecipe : public VDomDocument
{
@ -47,17 +47,64 @@ public:
private:
Q_DISABLE_COPY(VPatternRecipe)
QDomElement Prerequisite(VContainer *data, VAbstractPattern *pattern);
VContainer *m_data;
VAbstractPattern *m_pattern;
QDomElement Measurements(VContainer *data);
QDomElement Prerequisite();
QDomElement Measurements();
QDomElement Measurement(const QSharedPointer<VMeasurement> &m);
QDomElement Increments(VContainer *data);
QDomElement PreviewCalculations(VContainer *data);
QDomElement Increments();
QDomElement PreviewCalculations();
QDomElement Increment(const QSharedPointer<VIncrement> &incr);
QDomElement Content(VContainer *data, VAbstractPattern *pattern);
QDomElement Content();
QDomElement Draft(const QDomElement &draft);
QDomElement Step(const VToolRecord &tool);
QDomElement BasePoint(const VToolRecord &record);
QDomElement EndLine(const VToolRecord &record);
QDomElement Line(const VToolRecord &record);
QDomElement AlongLine(const VToolRecord &record);
QDomElement ShoulderPoint(const VToolRecord &record);
QDomElement Normal(const VToolRecord &record);
QDomElement Bisector(const VToolRecord &record);
QDomElement LineIntersect(const VToolRecord &record);
QDomElement Spline(const VToolRecord &record);
QDomElement CubicBezier(const VToolRecord &record);
QDomElement Arc(const VToolRecord &record);
QDomElement ArcWithLength(const VToolRecord &record);
QDomElement SplinePath(const VToolRecord &record);
QDomElement CubicBezierPath(const VToolRecord &record);
QDomElement PointOfContact(const VToolRecord &record);
QDomElement Height(const VToolRecord &record);
QDomElement Triangle(const VToolRecord &record);
QDomElement PointOfIntersection(const VToolRecord &record);
QDomElement CutArc(const VToolRecord &record);
QDomElement CutSpline(const VToolRecord &record);
QDomElement CutSplinePath(const VToolRecord &record);
QDomElement LineIntersectAxis(const VToolRecord &record);
QDomElement CurveIntersectAxis(const VToolRecord &record);
QDomElement PointOfIntersectionArcs(const VToolRecord &record);
QDomElement PointOfIntersectionCircles(const VToolRecord &record);
QDomElement PointOfIntersectionCurves(const VToolRecord &record);
QDomElement PointFromCircleAndTangent(const VToolRecord &record);
QDomElement PointFromArcAndTangent(const VToolRecord &record);
QDomElement TrueDarts(const VToolRecord &record);
QDomElement EllipticalArc(const VToolRecord &record);
void Formula(QDomElement &step, const VFormula &formula, const QString &formulaStr, const QString &formulaValue);
template <typename T>
void ToolAttributes(QDomElement &step, T* tool);
template <typename T>
void LineAttributes(QDomElement &step, T* tool);
template <typename T>
void CurveAttributes(QDomElement &step, T* tool);
};
#endif // VPATTERNRECIPE_H

View File

@ -36,7 +36,13 @@
#include <QString>
#include <QtGlobal>
enum class FormulaType : char{ToUser, FromUser};
enum class FormulaType : char
{
ToUser = 0,
FromUser = 1,
ToSystem = FromUser,
FromSystem = ToUser
};
class VContainer;
class VFormulaData;
@ -55,7 +61,7 @@ public:
bool operator!=(const VFormula &formula) const;
QString GetFormula(FormulaType type = FormulaType::ToUser) const;
void SetFormula(const QString &value, FormulaType type = FormulaType::ToUser);
void SetFormula(const QString &value, FormulaType type = FormulaType::FromSystem);
QString getStringValue() const;
qreal getDoubleValue() const;

View File

@ -487,6 +487,18 @@ QString VAbstractSpline::name() const
return ObjectName<VAbstractCurve>(m_id);
}
//---------------------------------------------------------------------------------------------------------------------
qreal VAbstractSpline::GetApproximationScale() const
{
return VAbstractTool::data.GeometricObject<VAbstractCurve>(m_id)->GetApproximationScale();
}
//---------------------------------------------------------------------------------------------------------------------
quint32 VAbstractSpline::GetDuplicate() const
{
return VAbstractTool::data.GeometricObject<VAbstractCurve>(m_id)->GetDuplicate();
}
//---------------------------------------------------------------------------------------------------------------------
void VAbstractSpline::GroupVisibility(quint32 object, bool visible)
{

View File

@ -90,6 +90,10 @@ public:
QString name() const;
qreal GetApproximationScale() const;
quint32 GetDuplicate() const;
virtual void GroupVisibility(quint32 object, bool visible) override;
public slots:
virtual void FullUpdateFromFile () override;