Merge branch 'dxf_compatibility' into develop

This commit is contained in:
Roman Telezhynskyi 2022-11-04 15:56:59 +02:00
commit fbe81aac36
187 changed files with 17485 additions and 3892 deletions

View File

@ -6,6 +6,7 @@
- Fix export measurement separator to CSV. - Fix export measurement separator to CSV.
- Fix option Hide labels. - Fix option Hide labels.
- Improve segmenting a curve for calculating a piece path. - Improve segmenting a curve for calculating a piece path.
- [smart-pattern/valentina#184] Fix incorrect seam allowance.
# Valentina 0.7.52 September 12, 2022 # Valentina 0.7.52 September 12, 2022
- Fix crash when default locale is ru. - Fix crash when default locale is ru.

View File

@ -33,6 +33,7 @@
#include "vplayout.h" #include "vplayout.h"
#include "../vlayout/vtextmanager.h" #include "../vlayout/vtextmanager.h"
#include "../vlayout/vlayoutpiecepath.h" #include "../vlayout/vlayoutpiecepath.h"
#include "../vgeometry/vlayoutplacelabel.h"
#include <QIcon> #include <QIcon>
#include <QLoggingCategory> #include <QLoggingCategory>
@ -408,7 +409,8 @@ auto VPPiece::StickyPosition(qreal &dx, qreal &dy) const -> bool
return false; return false;
} }
QVector<QPointF> path = GetMappedExternalContourPoints(); QVector<QPointF> path;
CastTo(GetMappedExternalContourPoints(), path);
QRectF boundingRect = VLayoutPiece::BoundingRect(path); QRectF boundingRect = VLayoutPiece::BoundingRect(path);
const qreal stickyDistance = pieceGap+minStickyDistance; const qreal stickyDistance = pieceGap+minStickyDistance;
QRectF stickyZone = QRectF(boundingRect.topLeft().x()-stickyDistance, boundingRect.topLeft().y()-stickyDistance, QRectF stickyZone = QRectF(boundingRect.topLeft().x()-stickyDistance, boundingRect.topLeft().y()-stickyDistance,
@ -424,7 +426,8 @@ auto VPPiece::StickyPosition(qreal &dx, qreal &dy) const -> bool
continue; continue;
} }
QVector<QPointF> piecePath = piece->GetMappedExternalContourPoints(); QVector<QPointF> piecePath;
CastTo(piece->GetMappedExternalContourPoints(), piecePath);
QRectF pieceBoundingRect = VLayoutPiece::BoundingRect(piecePath); QRectF pieceBoundingRect = VLayoutPiece::BoundingRect(piecePath);
if (stickyZone.intersects(pieceBoundingRect) || pieceBoundingRect.contains(stickyZone) || if (stickyZone.intersects(pieceBoundingRect) || pieceBoundingRect.contains(stickyZone) ||

View File

@ -507,7 +507,8 @@ void VPSheet::ValidateSuperpositionOfPieces() const
} }
const bool oldSuperpositionOfPieces = piece->HasSuperpositionWithPieces(); const bool oldSuperpositionOfPieces = piece->HasSuperpositionWithPieces();
QVector<QPointF> path1 = piece->GetMappedExternalContourPoints(); QVector<QPointF> path1;
CastTo(piece->GetMappedExternalContourPoints(), path1);
bool hasSuperposition = false; bool hasSuperposition = false;
for (const auto &p : pieces) for (const auto &p : pieces)
@ -517,7 +518,8 @@ void VPSheet::ValidateSuperpositionOfPieces() const
continue; continue;
} }
QVector<QPointF> path2 = p->GetMappedExternalContourPoints(); QVector<QPointF> path2;
CastTo(p->GetMappedExternalContourPoints(), path2);
bool superposition = VPPiece::PathsSuperposition(path1, path2); bool superposition = VPPiece::PathsSuperposition(path1, path2);
if (superposition) if (superposition)

View File

@ -42,14 +42,14 @@
#include "../layout/vppiece.h" #include "../layout/vppiece.h"
#include "../layout/vplayout.h" #include "../layout/vplayout.h"
#include "../layout/vpsheet.h" #include "../layout/vpsheet.h"
#include "../vlayout/vtextmanager.h" #include "../vlayout/vtextmanager.h"
#include "../vpapplication.h" #include "../vpapplication.h"
#include "compatibility.h" #include "compatibility.h"
#include "vlayoutpiecepath.h" #include "vlayoutpiecepath.h"
#include "vplacelabelitem.h"
#include "../vgeometry/vlayoutplacelabel.h"
#include "undocommands/vpundopiecemove.h" #include "undocommands/vpundopiecemove.h"
#include "undocommands/vpundomovepieceonsheet.h" #include "undocommands/vpundomovepieceonsheet.h"
@ -494,7 +494,7 @@ void VPGraphicsPiece::PaintSeamLine(QPainter *painter, const VPPiecePtr &piece)
{ {
if (not piece->IsHideMainPath() || not piece->IsSeamAllowance()) if (not piece->IsHideMainPath() || not piece->IsSeamAllowance())
{ {
QVector<QPointF> seamLinePoints = piece->GetMappedContourPoints(); QVector<VLayoutPoint> seamLinePoints = piece->GetMappedContourPoints();
if(!seamLinePoints.isEmpty()) if(!seamLinePoints.isEmpty())
{ {
m_seamLine.moveTo(ConstFirst(seamLinePoints)); m_seamLine.moveTo(ConstFirst(seamLinePoints));
@ -519,7 +519,7 @@ void VPGraphicsPiece::PaintCuttingLine(QPainter *painter, const VPPiecePtr &piec
{ {
if (piece->IsSeamAllowance() && not piece->IsSeamAllowanceBuiltIn()) if (piece->IsSeamAllowance() && not piece->IsSeamAllowanceBuiltIn())
{ {
QVector<QPointF> cuttingLinepoints = piece->GetMappedSeamAllowancePoints(); QVector<VLayoutPoint> cuttingLinepoints = piece->GetMappedSeamAllowancePoints();
if(!cuttingLinepoints.isEmpty()) if(!cuttingLinepoints.isEmpty())
{ {
m_cuttingLine.moveTo(ConstFirst(cuttingLinepoints)); m_cuttingLine.moveTo(ConstFirst(cuttingLinepoints));
@ -617,10 +617,11 @@ void VPGraphicsPiece::PaintPassmarks(QPainter *painter, const VPPiecePtr &piece)
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VPGraphicsPiece::PaintPlaceLabels(QPainter *painter, const VPPiecePtr &piece) void VPGraphicsPiece::PaintPlaceLabels(QPainter *painter, const VPPiecePtr &piece)
{ {
QVector<VLayoutPlaceLabel> placeLabels = piece->GetMappedPlaceLabels(); QVector<VLayoutPlaceLabel> placeLabels = piece->GetPlaceLabels();
for(auto &placeLabel : placeLabels) for(auto &placeLabel : placeLabels)
{ {
QPainterPath path = VPlaceLabelItem::LabelShapePath(placeLabel.shape); QPainterPath path =
VAbstractPiece::LabelShapePath(piece->MapPlaceLabelShape(VAbstractPiece::PlaceLabelShape(placeLabel)));
if (painter != nullptr) if (painter != nullptr)
{ {
@ -708,7 +709,7 @@ void VPGraphicsPiece::GroupMove(const QPointF &pos)
QVector<QPointF> path; QVector<QPointF> path;
if (not p.isNull() && p->StickyPosition(m_stickyTranslateX, m_stickyTranslateY)) if (not p.isNull() && p->StickyPosition(m_stickyTranslateX, m_stickyTranslateY))
{ {
path = p->GetMappedExternalContourPoints(); CastTo(p->GetMappedExternalContourPoints(), path);
QTransform m; QTransform m;
m.translate(m_stickyTranslateX, m_stickyTranslateY); m.translate(m_stickyTranslateX, m_stickyTranslateY);
path = m.map(path); path = m.map(path);

View File

@ -521,7 +521,7 @@ void VPMainGraphicsView::TranslatePiecesOn(qreal dx, qreal dy)
QVector<QPointF> path; QVector<QPointF> path;
if (not p.isNull() && p->StickyPosition(m_stickyTranslateX, m_stickyTranslateY)) if (not p.isNull() && p->StickyPosition(m_stickyTranslateX, m_stickyTranslateY))
{ {
path = p->GetMappedExternalContourPoints(); CastTo(p->GetMappedExternalContourPoints(), path);
QTransform m; QTransform m;
m.translate(m_stickyTranslateX, m_stickyTranslateY); m.translate(m_stickyTranslateX, m_stickyTranslateY);
path = m.map(path); path = m.map(path);

View File

@ -39,6 +39,7 @@
#include "../ifc/exception/vexceptionconversionerror.h" #include "../ifc/exception/vexceptionconversionerror.h"
#include "../vpatterndb/floatItemData/floatitemdef.h" #include "../vpatterndb/floatItemData/floatitemdef.h"
#include "../vgeometry/vgeometrydef.h" #include "../vgeometry/vgeometrydef.h"
#include "../vgeometry/vlayoutplacelabel.h"
#include "../layout/vplayout.h" #include "../layout/vplayout.h"
#include "../layout/vppiece.h" #include "../layout/vppiece.h"
@ -169,20 +170,6 @@ auto StringToRect(const QString &string) -> QRectF
return {}; return {};
} }
//---------------------------------------------------------------------------------------------------------------------
auto StringToMarkerShape(const QString &string) -> PlaceLabelImg
{
PlaceLabelImg shape;
QStringList paths = string.split(ML::itemsSep);
shape.reserve(paths.size());
for (const auto& path : paths)
{
shape.append(StringToPath(path));
}
return shape;
}
} // namespace } // namespace
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -499,7 +486,7 @@ void VPLayoutFileReader::ReadPiece(const VPPiecePtr &piece)
switch (tags.indexOf(name().toString())) switch (tags.indexOf(name().toString()))
{ {
case 0: // seam line case 0: // seam line
piece->SetCountourPoints(StringToPath(readElementText())); ReadSeamLine(piece);
break; break;
case 1: // seam allowance case 1: // seam allowance
ReadSeamAllowance(piece); ReadSeamAllowance(piece);
@ -527,6 +514,50 @@ void VPLayoutFileReader::ReadPiece(const VPPiecePtr &piece)
} }
} }
//---------------------------------------------------------------------------------------------------------------------
VLayoutPoint VPLayoutFileReader::ReadLayoutPoint()
{
AssertRootTag(ML::TagPoint);
VLayoutPoint point;
QXmlStreamAttributes attribs = attributes();
point.setX(ReadAttributeDouble(attribs, ML::AttrX, QChar('0')));
point.setY(ReadAttributeDouble(attribs, ML::AttrY, QChar('0')));
point.SetTurnPoint(ReadAttributeBool(attribs, ML::AttrTurnPoint, falseStr));
point.SetCurvePoint(ReadAttributeBool(attribs, ML::AttrCurvePoint, falseStr));
return point;
}
//---------------------------------------------------------------------------------------------------------------------
auto VPLayoutFileReader::ReadLayoutPoints() -> QVector<VLayoutPoint>
{
QVector<VLayoutPoint> points;
while (readNextStartElement())
{
if (name() == ML::TagPoint)
{
points.append(ReadLayoutPoint());
}
else
{
qCDebug(MLReader, "Ignoring tag %s", qUtf8Printable(name().toString()));
skipCurrentElement();
}
}
return points;
}
//---------------------------------------------------------------------------------------------------------------------
void VPLayoutFileReader::ReadSeamLine(const VPPiecePtr &piece)
{
AssertRootTag(ML::TagSeamLine);
piece->SetCountourPoints(ReadLayoutPoints());
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VPLayoutFileReader::ReadSeamAllowance(const VPPiecePtr &piece) void VPLayoutFileReader::ReadSeamAllowance(const VPPiecePtr &piece)
{ {
@ -537,18 +568,15 @@ void VPLayoutFileReader::ReadSeamAllowance(const VPPiecePtr &piece)
piece->SetSeamAllowance(enabled); piece->SetSeamAllowance(enabled);
bool builtIn = ReadAttributeBool(attribs, ML::AttrBuiltIn, falseStr); bool builtIn = ReadAttributeBool(attribs, ML::AttrBuiltIn, falseStr);
QVector<QPointF> path = StringToPath(readElementText());
if (enabled) if (enabled && not builtIn)
{ {
if (not builtIn) QVector<VLayoutPoint> path = ReadLayoutPoints();
if (path.isEmpty())
{ {
if (path.isEmpty()) throw VException(tr("Error in line %1. Seam allowance is empty.").arg(lineNumber()));
{
throw VException(tr("Error in line %1. Seam allowance is empty.").arg(lineNumber()));
}
piece->SetSeamAllowancePoints(path);
} }
piece->SetSeamAllowancePoints(path);
} }
} }
@ -658,7 +686,7 @@ auto VPLayoutFileReader::ReadInternalPath() -> VLayoutPiecePath
path.SetCutPath(ReadAttributeBool(attribs, ML::AttrCut, falseStr)); path.SetCutPath(ReadAttributeBool(attribs, ML::AttrCut, falseStr));
path.SetPenStyle(LineStyleToPenStyle(ReadAttributeString(attribs, ML::AttrPenStyle, TypeLineLine))); path.SetPenStyle(LineStyleToPenStyle(ReadAttributeString(attribs, ML::AttrPenStyle, TypeLineLine)));
QVector<QPointF> shape = StringToPath(readElementText()); QVector<VLayoutPoint> shape = ReadLayoutPoints();
if (shape.isEmpty()) if (shape.isEmpty())
{ {
throw VException(tr("Error in line %1. Internal path shape is empty.").arg(lineNumber())); throw VException(tr("Error in line %1. Internal path shape is empty.").arg(lineNumber()));
@ -705,19 +733,11 @@ auto VPLayoutFileReader::ReadMarker() -> VLayoutPlaceLabel
QXmlStreamAttributes attribs = attributes(); QXmlStreamAttributes attribs = attributes();
QString matrix = ReadAttributeEmptyString(attribs, ML::AttrTransform); QString matrix = ReadAttributeEmptyString(attribs, ML::AttrTransform);
marker.rotationMatrix = StringToTransfrom(matrix); marker.SetRotationMatrix(StringToTransfrom(matrix));
marker.type = static_cast<PlaceLabelType>(ReadAttributeUInt(attribs, ML::AttrType, QChar('0'))); marker.SetType(static_cast<PlaceLabelType>(ReadAttributeUInt(attribs, ML::AttrType, QChar('0'))));
marker.center = StringToPoint(ReadAttributeEmptyString(attribs, ML::AttrCenter)); marker.SetCenter(StringToPoint(ReadAttributeEmptyString(attribs, ML::AttrCenter)));
marker.box = StringToRect(ReadAttributeEmptyString(attribs, ML::AttrBox)); marker.SetBox(StringToRect(ReadAttributeEmptyString(attribs, ML::AttrBox)));
PlaceLabelImg shape = StringToMarkerShape(readElementText());
if (shape.isEmpty())
{
throw VException(tr("Error in line %1. Marker shape is empty.").arg(lineNumber()));
}
marker.shape = shape;
// cppcheck-suppress unknownMacro // cppcheck-suppress unknownMacro
QT_WARNING_POP QT_WARNING_POP

View File

@ -43,6 +43,7 @@ struct VLayoutPassmark;
struct VLayoutPlaceLabel; struct VLayoutPlaceLabel;
class VLayoutPiecePath; class VLayoutPiecePath;
class VTextManager; class VTextManager;
class VLayoutPoint;
class VPLayoutFileReader : public QXmlStreamReader class VPLayoutFileReader : public QXmlStreamReader
{ {
@ -67,6 +68,9 @@ private:
void ReadSheet(const VPLayoutPtr &layout); void ReadSheet(const VPLayoutPtr &layout);
void ReadPieces(const VPLayoutPtr &layout, const VPSheetPtr &sheet=VPSheetPtr()); void ReadPieces(const VPLayoutPtr &layout, const VPSheetPtr &sheet=VPSheetPtr());
void ReadPiece(const VPPiecePtr &piece); void ReadPiece(const VPPiecePtr &piece);
auto ReadLayoutPoint() -> VLayoutPoint;
auto ReadLayoutPoints() -> QVector<VLayoutPoint>;
void ReadSeamLine(const VPPiecePtr &piece);
void ReadSeamAllowance(const VPPiecePtr &piece); void ReadSeamAllowance(const VPPiecePtr &piece);
void ReadGrainline(const VPPiecePtr &piece); void ReadGrainline(const VPPiecePtr &piece);
void ReadNotches(const VPPiecePtr &piece); void ReadNotches(const VPPiecePtr &piece);
@ -82,6 +86,7 @@ private:
auto ReadLabelLine() -> TextLine; auto ReadLabelLine() -> TextLine;
void ReadWatermark(const VPLayoutPtr &layout); void ReadWatermark(const VPLayoutPtr &layout);
void ReadLayoutMargins(const VPLayoutPtr &layout); void ReadLayoutMargins(const VPLayoutPtr &layout);
void ReadSheetMargins(const VPSheetPtr &sheet); void ReadSheetMargins(const VPSheetPtr &sheet);
auto ReadSize() -> QSizeF; auto ReadSize() -> QSizeF;

View File

@ -35,6 +35,7 @@
#include "../vmisc/projectversion.h" #include "../vmisc/projectversion.h"
#include "../vlayout/vlayoutpiecepath.h" #include "../vlayout/vlayoutpiecepath.h"
#include "../vlayout/vtextmanager.h" #include "../vlayout/vtextmanager.h"
#include "../vgeometry/vlayoutplacelabel.h"
namespace namespace
{ {
@ -93,18 +94,6 @@ auto RectToString(const QRectF &r) -> QString
NumberToString(r.height()); NumberToString(r.height());
} }
//---------------------------------------------------------------------------------------------------------------------
auto MarkerShapeToString(const PlaceLabelImg &shape) -> QString
{
QStringList s;
s.reserve(shape.size());
for (const auto& path : shape)
{
s.append(PathToString(path));
}
return s.join(ML::itemsSep);
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
auto LineToString(const QLineF &line) -> QString auto LineToString(const QLineF &line) -> QString
{ {
@ -284,7 +273,11 @@ void VPLayoutFileWriter::WritePiece(const VPPiecePtr &piece)
[](qreal z) noexcept {return VFuzzyComparePossibleNulls(z, 1.0);}); [](qreal z) noexcept {return VFuzzyComparePossibleNulls(z, 1.0);});
writeStartElement(ML::TagSeamLine); writeStartElement(ML::TagSeamLine);
writeCharacters(PathToString(piece->GetContourPoints())); QVector<VLayoutPoint> contourPoints = piece->GetContourPoints();
for (auto &point : contourPoints)
{
WriteLayoutPoint(point);
}
writeEndElement(); writeEndElement();
writeStartElement(ML::TagSeamAllowance); writeStartElement(ML::TagSeamAllowance);
@ -294,7 +287,11 @@ void VPLayoutFileWriter::WritePiece(const VPPiecePtr &piece)
[](bool builtin) noexcept {return not builtin;}); [](bool builtin) noexcept {return not builtin;});
if (piece->IsSeamAllowance() && not piece->IsSeamAllowanceBuiltIn()) if (piece->IsSeamAllowance() && not piece->IsSeamAllowanceBuiltIn())
{ {
writeCharacters(PathToString(piece->GetSeamAllowancePoints())); QVector<VLayoutPoint> seamAllowancePoints = piece->GetSeamAllowancePoints();
for (auto &point : seamAllowancePoints)
{
WriteLayoutPoint(point);
}
} }
writeEndElement(); writeEndElement();
@ -329,7 +326,13 @@ void VPLayoutFileWriter::WritePiece(const VPPiecePtr &piece)
writeStartElement(ML::TagInternalPath); writeStartElement(ML::TagInternalPath);
SetAttribute(ML::AttrCut, path.IsCutPath()); SetAttribute(ML::AttrCut, path.IsCutPath());
SetAttribute(ML::AttrPenStyle, PenStyleToLineStyle(path.PenStyle())); SetAttribute(ML::AttrPenStyle, PenStyleToLineStyle(path.PenStyle()));
writeCharacters(PathToString(path.Points()));
QVector<VLayoutPoint> points = path.Points();
for (auto &point : points)
{
WriteLayoutPoint(point);
}
writeEndElement(); writeEndElement();
} }
writeEndElement(); writeEndElement();
@ -339,12 +342,10 @@ void VPLayoutFileWriter::WritePiece(const VPPiecePtr &piece)
for (const auto& label : placelabels) for (const auto& label : placelabels)
{ {
writeStartElement(ML::TagMarker); writeStartElement(ML::TagMarker);
SetAttribute(ML::AttrTransform, TransformToString(label.rotationMatrix)); SetAttribute(ML::AttrTransform, TransformToString(label.RotationMatrix()));
SetAttribute(ML::AttrType, static_cast<int>(label.type)); SetAttribute(ML::AttrType, static_cast<int>(label.Type()));
SetAttribute(ML::AttrCenter, PointToString(label.center)); SetAttribute(ML::AttrCenter, PointToString(label.Center()));
SetAttribute(ML::AttrBox, RectToString(label.box)); SetAttribute(ML::AttrBox, RectToString(label.Box()));
writeCharacters(MarkerShapeToString(label.shape));
writeEndElement(); writeEndElement();
} }
writeEndElement(); writeEndElement();
@ -425,3 +426,14 @@ void VPLayoutFileWriter::WriteSize(QSizeF size)
SetAttribute(ML::AttrLength, length); SetAttribute(ML::AttrLength, length);
writeEndElement(); // size writeEndElement(); // size
} }
//---------------------------------------------------------------------------------------------------------------------
auto VPLayoutFileWriter::WriteLayoutPoint(const VLayoutPoint &point) -> void
{
writeStartElement(ML::TagPoint);
SetAttribute(ML::AttrX, point.x());
SetAttribute(ML::AttrY, point.y());
SetAttributeOrRemoveIf<bool>(ML::AttrTurnPoint, point.TurnPoint(), [](bool val) noexcept {return val;});
SetAttributeOrRemoveIf<bool>(ML::AttrCurvePoint, point.CurvePoint(), [](bool val) noexcept {return val;});
writeEndElement();
}

View File

@ -46,6 +46,7 @@ class VPPiece;
class QFile; class QFile;
class QMarginsF; class QMarginsF;
class VTextManager; class VTextManager;
class VLayoutPoint;
class VPLayoutFileWriter : public QXmlStreamWriter class VPLayoutFileWriter : public QXmlStreamWriter
{ {
@ -68,6 +69,7 @@ private:
void WritePiece(const VPPiecePtr &piece); void WritePiece(const VPPiecePtr &piece);
void WriteLabel(const QVector<QPointF> &labelShape, const VTextManager &tm, const QString &tagName); void WriteLabel(const QVector<QPointF> &labelShape, const VTextManager &tm, const QString &tagName);
void WriteLabelLines(const VTextManager &tm); void WriteLabelLines(const VTextManager &tm);
auto WriteLayoutPoint(const VLayoutPoint &point) -> void;
void WriteMargins(const QMarginsF &margins, bool ignore); void WriteMargins(const QMarginsF &margins, bool ignore);
void WriteSize(QSizeF size); void WriteSize(QSizeF size);

View File

@ -60,6 +60,7 @@ const QString TagLines = QStringLiteral("lines"); // NOLINT(cert-e
const QString TagLine = QStringLiteral("line"); // NOLINT(cert-err58-cpp) const QString TagLine = QStringLiteral("line"); // NOLINT(cert-err58-cpp)
const QString TagScale = QStringLiteral("scale"); // NOLINT(cert-err58-cpp) const QString TagScale = QStringLiteral("scale"); // NOLINT(cert-err58-cpp)
const QString TagWatermark = QStringLiteral("watermark"); // NOLINT(cert-err58-cpp) const QString TagWatermark = QStringLiteral("watermark"); // NOLINT(cert-err58-cpp)
const QString TagPoint = QStringLiteral("point"); // NOLINT(cert-err58-cpp)
const QString AttrWarningSuperposition = QStringLiteral("warningSuperposition"); // NOLINT(cert-err58-cpp) const QString AttrWarningSuperposition = QStringLiteral("warningSuperposition"); // NOLINT(cert-err58-cpp)
const QString AttrWarningOutOfBound = QStringLiteral("warningOutOfBound"); // NOLINT(cert-err58-cpp) const QString AttrWarningOutOfBound = QStringLiteral("warningOutOfBound"); // NOLINT(cert-err58-cpp)
@ -108,6 +109,10 @@ const QString AttrShowPreview = QStringLiteral("showPreview"); // NOLIN
const QString AttrPrintScheme = QStringLiteral("printScheme"); // NOLINT(cert-err58-cpp) const QString AttrPrintScheme = QStringLiteral("printScheme"); // NOLINT(cert-err58-cpp)
const QString AttrTileNumber = QStringLiteral("tileNumber"); // NOLINT(cert-err58-cpp) const QString AttrTileNumber = QStringLiteral("tileNumber"); // NOLINT(cert-err58-cpp)
const QString AttrZValue = QStringLiteral("zValue"); // NOLINT(cert-err58-cpp) const QString AttrZValue = QStringLiteral("zValue"); // NOLINT(cert-err58-cpp)
const QString AttrX = QStringLiteral("x"); // NOLINT(cert-err58-cpp)
const QString AttrY = QStringLiteral("y"); // NOLINT(cert-err58-cpp)
const QString AttrTurnPoint = QStringLiteral("turnPoint"); // NOLINT(cert-err58-cpp)
const QString AttrCurvePoint = QStringLiteral("curvePoint"); // NOLINT(cert-err58-cpp)
const QString atFrontStr = QStringLiteral("atFront"); // NOLINT(cert-err58-cpp) const QString atFrontStr = QStringLiteral("atFront"); // NOLINT(cert-err58-cpp)
const QString atRearStr = QStringLiteral("atRear"); // NOLINT(cert-err58-cpp) const QString atRearStr = QStringLiteral("atRear"); // NOLINT(cert-err58-cpp)

View File

@ -65,6 +65,7 @@ extern const QString TagLines;
extern const QString TagLine; extern const QString TagLine;
extern const QString TagScale; extern const QString TagScale;
extern const QString TagWatermark; extern const QString TagWatermark;
extern const QString TagPoint;
extern const QString AttrWarningSuperposition; extern const QString AttrWarningSuperposition;
extern const QString AttrWarningOutOfBound; extern const QString AttrWarningOutOfBound;
@ -113,6 +114,10 @@ extern const QString AttrShowPreview;
extern const QString AttrPrintScheme; extern const QString AttrPrintScheme;
extern const QString AttrTileNumber; extern const QString AttrTileNumber;
extern const QString AttrZValue; extern const QString AttrZValue;
extern const QString AttrX;
extern const QString AttrY;
extern const QString AttrTurnPoint;
extern const QString AttrCurvePoint;
extern const QString atFrontStr; extern const QString atFrontStr;
extern const QString atRearStr; extern const QString atRearStr;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<vit>
<!--Measurements created with Valentina v0.7.50.0 (https://smart-pattern.com.ua/).-->
<version>0.5.1</version>
<read-only>false</read-only>
<notes>Nach Messung wegen Büste am 16.03.2021
Brustumfang : 88 -&gt; 86
Taille: 79 -&gt; 76
Hüfte: 92 -&gt; 94
Halsumfang: 39.5 -&gt; 37</notes>
<unit>cm</unit>
<pm_system>998</pm_system>
<personal>
<customer>Ronan</customer>
<birth-date>1987-04-03</birth-date>
<gender>male</gender>
<email/>
</personal>
<body-measurements>
<m name="waist_natural_circ" value="82"/>
<m name="waist_to_hip_b" value="21"/>
<m name="neck_back_to_waist_b" value="43"/>
<m name="across_chest_f" value="35"/>
<m name="across_back_b" value="35"/>
<m name="neck_back_to_bust_b" value="22.5"/>
<m name="hip_circ" value="94"/>
<m name="hand_circ" value="22"/>
<m name="leg_waist_side_to_floor" value="98.5"/>
<m name="leg_crotch_to_floor" value="77.5"/>
<m name="height_knee" value="48"/>
<m name="height_calf" value="30"/>
<m name="leg_thigh_upper_circ" value="50"/>
<m name="leg_knee_circ" value="35.5"/>
<m name="leg_calf_circ" value="34.5"/>
<m name="leg_knee_circ_bent" value="38.5"/>
<m name="leg_ankle_circ" value="25.5"/>
<m name="leg_ankle_diag_circ" value="32"/>
<m name="height" value="172"/>
<m name="neck_circ" value="37"/>
<m name="bust_circ" value="86"/>
<m name="waist_circ" value="76&#10;"/>
<m name="arm_shoulder_tip_to_wrist" value="58"/>
<m name="arm_wrist_circ" value="16"/>
<m name="head_circ" value="55"/>
<m name="arm_lower_circ" value="26"/>
</body-measurements>
</vit>

View File

@ -0,0 +1,913 @@
<?xml version="1.0" encoding="UTF-8"?>
<pattern labelPrefix="en" passmarkLength="">
<!--Pattern created with Valentina v0.7.52.0 (https://smart-pattern.com.ua/).-->
<version>0.9.2</version>
<unit>cm</unit>
<description>Jeans mit gerader Seitennaht
Müller u. Sohn Zeitschrift Ausgabe 10.20 , Seite 47-50 vom PDf (bzw. 14 - 17 vom Herrenteil)</description>
<notes>17.10.20:
Anpassugen für die Kurzhose -&gt; enger am Saum (-3.5)
Hosenschlitzuntertritt gerade an der oberen Kante</notes>
<patternName>Jeans Selvedge</patternName>
<patternNumber>#4</patternNumber>
<company>CrazyRori</company>
<customer/>
<birthDate>2000-01-01</birthDate>
<email/>
<patternLabel dateFormat="dd/MM/yyyy" timeFormat="hh:mm:ss">
<line alignment="4" bold="true" italic="false" sfIncrement="4" text="%author%"/>
<line alignment="4" bold="false" italic="false" sfIncrement="2" text="%patternName%"/>
<line alignment="4" bold="false" italic="false" sfIncrement="0" text="%patternNumber%"/>
<line alignment="4" bold="false" italic="true" sfIncrement="0" text="%customer%"/>
<line alignment="4" bold="false" italic="true" sfIncrement="0" text="%date%"/>
</patternLabel>
<finalMeasurements>
<finalMeasurment formula="Line_A34_A1" name="Fehlbetrag_Bund"/>
<finalMeasurment description="Soll möglichst = 0 sein" formula="(SplPath_A1b_A97+Spl_A19_A17)*2-#Bu" name="Kontrolle_Konstruktion_Bundumfang"/>
<finalMeasurment description="Muss ca 0.4 - 0.7 sein" formula="(Line_A10_A11+SplPath_A12_A11)-(Line_A22_A24+SplPath_A32_A24)" name="Kontrolle_Konstruktion_Schrittnaht"/>
<finalMeasurment description="sollte max ein paar mm sein" formula="Spl_A12_A93 - Spl_A32_A92" name="Kontrolle_Konstruktion_Innennaht_Kurzhose"/>
<finalMeasurment description="Mehrweite des kompletten Umfangs" formula="(Line_A4_A5+Line_A4_A29)*2-#Hu" name="Kontrolle_Mehrweite_Hüfte"/>
<finalMeasurment description="Mehrweite des kompletten Umfangs" formula="(Line_A109_A110+Line_A109_A111)-leg_thigh_upper_circ" name="Kontrolle_Mehrweite_Oberschenkel"/>
<finalMeasurment description="Mehrweite des kompletten Umfangs" formula="(Line_A86_A87+Line_A86_A88)-leg_calf_circ" name="Kontrolle_Mehrweite_Waden"/>
<finalMeasurment description="Soll &gt; 0 für Bewebungsfreiheit" formula="#Kw - leg_knee_circ_bent" name="Kontrolle_Knie_gebeugt"/>
</finalMeasurements>
<measurements path="../../../../../../../../Стільниця/Помилки/Ronan Le Tiec/Masse_Ronan_v3.vit"/>
<increments>
<increment description="Bundumfang&#10;14.01.2022 von +0.5 zu +1 gewechselt, da bei der letzten Hose etwas zu eng" formula="waist_natural_circ+1" name="#Bu"/>
<increment description="Hüftumfang&#10;&#10;am 08.05.2021 -1 entfernt (vorher 93 cm dann 94)" formula="hip_circ" name="#Hu"/>
<increment description="Knieweite&#10;&#10;01.03.2021 von + 3.5 auf + 5.5 angepasst&#10;08.05.2021 von 5.5 auf 6.5 angepasst" formula="leg_knee_circ+ 6.5" name="#Kw"/>
<increment description="Fussweite&#10;&#10;am 01.05.2021 -&gt; +2 hinzugefügt" formula="leg_ankle_diag_circ +2" name="#Fw"/>
<increment description="Vorderhosenbreite" formula="#Hu/4" name="#Vhbr"/>
<increment description="Vorderhosenspaltdurchmesser" formula="#Hu/20+0.5" name="#Vhsd"/>
<increment description="Hinterhosenbreite&#10;Zugabe 3.5 - 4.5" formula="#Hu/4+3.5" name="#Hhbr"/>
<increment description="Hinterhosenspaltdurchmesser&#10;Zugabe 1.5 - 2.5" formula="#Hu/10+1.5" name="#Hhsd"/>
<increment description="Hosenkürzung&#10;14.01.2022 von 3 zu 1" formula="1" name="#Hk"/>
<increment description="Seitenlänge" formula="leg_waist_side_to_floor - #Hk" name="#Sl"/>
<increment description="Schrittlänge (Vom Boden bis zum Schritt)&#10;" formula="leg_crotch_to_floor - #Hk" name="#Schrl"/>
<increment description="Leibhöhe" formula="#Sl-#Schrl" name="#Lh"/>
<increment description="Oberschenkelhöhe (für die Kontrolle)" formula="leg_crotch_to_floor - 5 - #Hk" name="#Osh"/>
<increment description="Knihöhe (von Boden bis zum Knie)" formula="height_knee - #Hk" name="#Knh"/>
<increment description="Wadenhöhe" formula="height_calf - #Hk" name="#Wh"/>
<increment description="Länge Kurzhose" formula="42" name="#Lkh"/>
<increment description="Bundhöhe" formula="4" name="#Bh"/>
<increment description="Gürtelschlaufenbreite" formula="1.2" name="#Gsb"/>
<increment description="Gürtelschlaufenlänge" formula="11" name="#Gsl"/>
<increment description="Vordertaschenhöhe (Vorher 8.5)" formula="7" name="#Vth"/>
<increment description="Vordertaschenbreite" formula="11" name="#Vtb"/>
<increment description="0 für ohne Umschlag, 1 für mit Umschlag" formula="0" name="#mitUmschlag"/>
<increment description="Saumumschlagbreite&#10;&#10;01.05.2021 von 5 auf 4 geändert, so passt die Länge der Hose genau" formula="4" name="#Sasb"/>
<increment description="Länge des Reissverschlusses (Länge der Metalteile, nicht des Stoffes)" formula="12" name="#Rvl"/>
<increment formula="1" name="#istEinteiligerHosenschlitz"/>
<increment description="Hosenschlitzlänge für 2-teiligen Hosenschlitz, mit Reissverschluss&#10;von 1.5 auf 2 geändert, damit die Zugabe für das Schrägband hier bereits enthalten ist." formula="#Rvl+2" name="#HlRv2t"/>
<increment description="Hosenschlitzlänge für 1-teiligen Hosenschlitz, mit Knöpfen" formula="14" name="#HlKn1t"/>
<increment description="Hosenschlitzlänge" formula="(#istEinteiligerHosenschlitz==0)?#HlRv2t:#HlKn1t" name="#Hl"/>
<increment description="Hosenschlitz Unter- und Übertrittbreite" formula="3.75" name="#HUUB"/>
<increment description="Breite der kleinen Knöpfe vom Hosenschlitz" formula="1.4" name="#HKKnB"/>
<increment description="Breite der Knopflöcher vom Hosenschlitz" formula="#HKKnB+0.3" name="#HKKnLB"/>
<increment description="Breite der großen Knöpfe vom Hosenschlitz" formula="1.7" name="#HGKnB"/>
<increment description="Breite des grossen Knopfloches vom Hosenschlitz" formula="#HGKnB+0.3" name="#HGKnLB"/>
<increment description="Bundfehlbetragabzug&#10;normalerweise 0.5" formula="0.5" name="#Bfa"/>
<increment description="1 für Test, 0 für nicht Test -&gt; hat z.B. einen Einfluss auf den Saum" formula="0" name="#istTest"/>
</increments>
<previewCalculations/>
<draw name="Hose">
<calculation>
<point id="1" mx="-3.6397" my="-0.408989" name="A" showLabel="true" type="single" x="4.44267" y="103.231"/>
<point angle="90" basePoint="1" id="2" length="#Sl" lineColor="black" mx="-3.90408" my="-0.609353" name="A1" showLabel="true" type="endLine" typeLine="none"/>
<point firstPoint="1" id="3" length="#Knh" lineColor="black" mx="-3.18534" my="-0.753101" name="A2" secondPoint="2" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="1" id="4" length="#Schrl" lineColor="black" mx="-3.76033" my="-0.609354" name="A3" secondPoint="2" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="4" id="5" length="#Hu/20+3" lineColor="black" mx="-4.19157" my="-0.7531" name="A4" secondPoint="2" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="0" basePoint="5" id="6" length="#Vhbr" lineColor="black" mx="1.62914" my="-1.48423" name="A5" showLabel="true" type="endLine" typeLine="none"/>
<line firstPoint="1" id="7" lineColor="orange" secondPoint="2" typeLine="dotLine"/>
<point firstPoint="6" id="9" mx="1.62836" my="-2.38867" name="A6" secondPoint="2" showLabel="true" type="pointOfIntersection"/>
<line firstPoint="2" id="10" lineColor="orange" secondPoint="9" typeLine="dotLine"/>
<point firstPoint="6" id="11" mx="-2.42561" my="0.689288" name="A7" secondPoint="4" showLabel="true" type="pointOfIntersection"/>
<line firstPoint="9" id="12" lineColor="orange" secondPoint="11" typeLine="dotLine"/>
<point angle="0" basePoint="6" id="13" length="#Vhsd" lineColor="black" mx="0.515989" my="1.15109" name="A8" showLabel="true" type="endLine" typeLine="none"/>
<point angle="0" basePoint="3" id="15" length="#Kw/2-2" lineColor="black" mx="-3.38751" my="-1.36281" name="A9" showLabel="true" type="endLine" typeLine="none"/>
<point angle="0" basePoint="1" id="17" length="#Fw/2-2" lineColor="black" mx="0.264583" my="0.396875" name="A10" showLabel="true" type="endLine" typeLine="none"/>
<line firstPoint="1" id="18" lineColor="darkBlue" secondPoint="17" typeLine="hair"/>
<line firstPoint="17" id="19" lineColor="orange" secondPoint="15" typeLine="dotLine"/>
<point angle="90" basePoint="17" id="20" length="(#mitUmschlag==1)?#Sasb:0.5" lineColor="black" mx="-3.41982" my="-0.597328" name="A11" showLabel="true" type="endLine" typeLine="none"/>
<line firstPoint="17" id="21" lineColor="darkBlue" secondPoint="20" typeLine="hair"/>
<line firstPoint="15" id="22" lineColor="orange" secondPoint="13" typeLine="dotLine"/>
<point id="23" mx="0.888233" my="0.806253" name="A12" p1Line1="4" p1Line2="13" p2Line1="11" p2Line2="15" showLabel="true" type="lineIntersect"/>
<line firstPoint="4" id="24" lineColor="orange" secondPoint="23" typeLine="dotLine"/>
<spline aScale="10" color="darkBlue" id="25" penStyle="hair" type="pathInteractive">
<pathPoint angle1="63.439" angle2="243.439" length1="0" length2="9.2951" pSpline="23"/>
<pathPoint angle1="81.7129" angle2="261.713" length1="6.53313" length2="6.71593" pSpline="15"/>
<pathPoint angle1="90.8626" angle2="270.863" length1="4.3276" length2="2.65454" pSpline="20"/>
</spline>
<point firstPoint="23" id="26" length="CurrentLength/2" lineColor="black" mx="-1.26966" my="1.59018" name="A13" secondPoint="11" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="11" id="27" length="Line_A13_A7" lineColor="black" mx="-4.37887" my="0.193258" name="A14" secondPoint="6" showLabel="true" type="alongLine" typeLine="none"/>
<line firstPoint="27" id="28" lineColor="orange" secondPoint="23" typeLine="dotLine"/>
<point firstPoint="9" id="29" length="1" lineColor="black" mx="2.08434" my="-0.245183" name="A15" secondPoint="6" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="9" id="30" length="1.5" lineColor="black" mx="-1.6558" my="-3.52387" name="A16" secondPoint="2" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="30" id="31" mx="-2.07096" my="1.98862" name="A17" secondPoint="29" showLabel="true" type="pointOfIntersection"/>
<line firstPoint="31" id="32" lineColor="orange" secondPoint="6" typeLine="dotLine"/>
<point id="33" mx="3.08067" my="-1.1132" name="A18" p1Line1="31" p1Line2="27" p2Line1="6" p2Line2="23" showLabel="true" type="lineIntersect"/>
<line firstPoint="6" id="34" lineColor="orange" secondPoint="33" typeLine="dotLine"/>
<spline aScale="10" color="darkBlue" id="602" penStyle="hair" type="pathInteractive">
<pathPoint angle1="96.9529" angle2="AngleLine_A17_A5" length1="0" length2="2.07556" pSpline="31"/>
<pathPoint angle1="AngleLine_A17_A5-180" angle2="276.953" length1="2.28656" length2="6.04207" pSpline="6"/>
<pathPoint angle1="AngleLine_A14_A12-180" angle2="333.435" length1="1.75929" length2="2.47427" pSpline="23"/>
</spline>
<point firstPoint="2" id="36" length="1.5" lineColor="black" mx="0.580176" my="1.48237" name="A19" secondPoint="9" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="2" id="37" length="#Vth" lineColor="black" mx="-4.17693" my="-0.608751" name="A20" secondPoint="5" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="0" basePoint="37" id="38" length="0.5" lineColor="black" mx="0.767396" my="-1.78198" name="A21" showLabel="true" type="endLine" typeLine="none"/>
<spline aScale="10" angle1="85.7839" angle2="257.788" color="darkBlue" id="39" length1="2.61864" length2="1.97671" penStyle="hair" point1="38" point4="36" type="simpleInteractive"/>
<line firstPoint="37" id="40" lineColor="darkBlue" secondPoint="38" typeLine="hair"/>
<line firstPoint="37" id="41" lineColor="darkBlue" secondPoint="1" typeLine="hair"/>
<line firstPoint="36" id="42" lineColor="orange" secondPoint="31" typeLine="dotLine"/>
<spline aScale="0" angle1="350.332" angle2="188.903" color="darkBlue" id="43" length1="6.03475" length2="4.60692" penStyle="hair" point1="36" point4="31" type="simpleInteractive"/>
<point firstPoint="17" id="46" length="-4" lineColor="black" mx="0.204168" my="0.396875" name="A22" secondPoint="1" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="15" id="47" length="-4" lineColor="black" mx="1.6465" my="-0.462984" name="A23" secondPoint="3" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="90" basePoint="46" id="48" length="(#mitUmschlag==1)?#Sasb:0.5" lineColor="black" mx="2.15477" my="-0.723235" name="A24" showLabel="true" type="endLine" typeLine="none"/>
<line firstPoint="1" id="49" lineColor="orange" secondPoint="46" typeLine="dotLine"/>
<line firstPoint="1" id="50" lineColor="darkRed" secondPoint="46" typeLine="hair"/>
<line firstPoint="46" id="52" lineColor="orange" secondPoint="47" typeLine="dotLine"/>
<line firstPoint="46" id="53" lineColor="darkRed" secondPoint="48" typeLine="hair"/>
<line firstPoint="3" id="54" lineColor="orange" secondPoint="47" typeLine="dotLine"/>
<point firstPoint="5" id="55" length="#Hhbr" lineColor="black" mx="0.663644" my="-4.27609" name="A25" secondPoint="13" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="55" id="56" length="#Hhsd" lineColor="black" mx="0.264583" my="0.396875" name="A26" secondPoint="13" showLabel="true" type="alongLine" typeLine="none"/>
<line firstPoint="5" id="57" lineColor="orange" secondPoint="56" typeLine="dotLine"/>
<line firstPoint="56" id="58" lineColor="orange" secondPoint="47" typeLine="dotLine"/>
<line firstPoint="4" id="59" lineColor="orange" secondPoint="55" typeLine="dotLine"/>
<point angle="180" firstPoint="55" id="60" length="23" lineColor="black" mx="-2.29592" my="-3.83922" name="A27" secondPoint="4" showLabel="true" type="normal" typeLine="none"/>
<line firstPoint="60" id="61" lineColor="orange" secondPoint="55" typeLine="dotLine"/>
<point basePoint="2" id="62" lineColor="black" mx="0.264583" my="0.396875" name="A28" p1Line="60" p2Line="55" showLabel="true" type="height" typeLine="none"/>
<point basePoint="5" id="63" lineColor="black" mx="1.25879" my="-1.18215" name="A29" p1Line="60" p2Line="55" showLabel="true" type="height" typeLine="none"/>
<line firstPoint="5" id="64" lineColor="deeppink" secondPoint="63" typeLine="dashDotLine"/>
<line firstPoint="2" id="65" lineColor="darkRed" secondPoint="62" typeLine="hair"/>
<line firstPoint="62" id="66" lineColor="darkRed" secondPoint="55" typeLine="hair"/>
<point firstPoint="62" id="67" length="7" lineColor="black" mx="3.94898" my="-1.3576" name="A30" secondPoint="55" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="2" id="68" length="3.5" lineColor="black" mx="-3.94616" my="-0.597328" name="A31" secondPoint="5" showLabel="true" type="alongLine" typeLine="none"/>
<line firstPoint="2" id="69" lineColor="darkRed" secondPoint="1" typeLine="hair"/>
<line firstPoint="68" id="70" lineColor="darkRed" secondPoint="67" typeLine="hair"/>
<point firstPoint="47" id="71" length="SplPath_A12_A11_Seg_1-0.7" lineColor="black" mx="0.264583" my="0.338392" name="A32" secondPoint="56" showLabel="true" type="alongLine" typeLine="none"/>
<spline aScale="10" color="darkRed" id="72" penStyle="hair" type="pathInteractive">
<pathPoint angle1="52.9977" angle2="232.998" length1="0" length2="7.32771" pSpline="71"/>
<pathPoint angle1="80.8862" angle2="260.886" length1="6.828" length2="6.71" pSpline="47"/>
<pathPoint angle1="90" angle2="270" length1="5" length2="3.2362" pSpline="48"/>
</spline>
<spline aScale="10" angle1="AngleLine_A25_A28+180" angle2="147.531" color="darkRed" id="73" length1="6.60393" length2="3.55083" penStyle="hair" point1="55" point4="71" type="simpleInteractive"/>
<point firstPoint="62" id="74" length="-Spl_A19_A17" lineColor="black" mx="0.264583" my="0.396875" name="A33" secondPoint="2" showLabel="true" type="alongLine" typeLine="none"/>
<line firstPoint="2" id="75" lineColor="orange" secondPoint="74" typeLine="dotLine"/>
<point firstPoint="74" id="76" length="#Bu/2" lineColor="black" mx="-0.33385" my="1.40137" name="A34" secondPoint="2" showLabel="true" type="alongLine" typeLine="none"/>
<line firstPoint="5" id="78" lineColor="deeppink" secondPoint="6" typeLine="dashDotLine"/>
<point firstPoint="2" id="79" length="CurrentLength/2" lineColor="black" mx="-1.37583" my="-3.20146" name="A35" secondPoint="62" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="AngleLine_A1_A28+270" basePoint="79" id="83" lineColor="cornflowerblue" mx="-0.502709" my="1.32292" name="A39" p1Line="68" p2Line="67" showLabel="true" type="lineIntersectAxis" typeLine="none"/>
<point firstPoint="79" id="85" length="((Line_A34_A1&gt;1)?Line_A34_A1-#Bfa:Line_A34_A1)/6" lineColor="black" mx="-4.33917" my="-1.66687" name="A37" secondPoint="2" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="79" id="86" length="((Line_A34_A1&gt;1)?Line_A34_A1-#Bfa:Line_A34_A1)/6" lineColor="black" mx="1.56104" my="-3.175" name="A36" secondPoint="62" showLabel="true" type="alongLine" typeLine="none"/>
<line firstPoint="85" id="87" lineColor="goldenrod" secondPoint="83" typeLine="dashDotDotLine"/>
<line firstPoint="86" id="88" lineColor="goldenrod" secondPoint="83" typeLine="dashDotDotLine"/>
<operation angle="AngleLine_A37_A39-AngleLine_A36_A39" center="83" id="89" suffix="a" type="rotation">
<source>
<item idObject="67"/>
<item idObject="62"/>
</source>
<destination>
<item idObject="90" mx="3.94898" my="-1.3576"/>
<item idObject="91" mx="0.661458" my="-1.93146"/>
</destination>
</operation>
<line firstPoint="85" id="92" lineColor="mediumseagreen" secondPoint="91" typeLine="dashLine"/>
<line firstPoint="91" id="93" lineColor="mediumseagreen" secondPoint="90" typeLine="dashLine"/>
<line firstPoint="83" id="94" lineColor="mediumseagreen" secondPoint="90" typeLine="dashLine"/>
<point firstPoint="2" id="95" length="CurrentLength/2" lineColor="black" mx="-1.77271" my="-2.83104" name="A38" secondPoint="85" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="85" id="96" length="CurrentLength/2" lineColor="black" mx="-1.87854" my="-3.12208" name="A40" secondPoint="91" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="AngleLine_A1_A28+270" basePoint="95" id="97" lineColor="cornflowerblue" mx="0.264583" my="0.396875" name="A41" p1Line="68" p2Line="83" showLabel="true" type="lineIntersectAxis" typeLine="none"/>
<point angle="AngleLine_A37_A28a+270" basePoint="96" id="98" lineColor="cornflowerblue" mx="0.264583" my="0.396875" name="A42" p1Line="83" p2Line="90" showLabel="true" type="lineIntersectAxis" typeLine="none"/>
<point firstPoint="95" id="99" length="((Line_A34_A1&gt;1)?Line_A34_A1-#Bfa:Line_A34_A1)/6" lineColor="black" mx="-1.87854" my="0.873125" name="A43" secondPoint="2" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="95" id="100" length="((Line_A34_A1&gt;1)?Line_A34_A1-#Bfa:Line_A34_A1)/6" lineColor="black" mx="1.53458" my="0.343955" name="A44" secondPoint="85" showLabel="true" type="alongLine" typeLine="none"/>
<line firstPoint="99" id="101" lineColor="goldenrod" secondPoint="97" typeLine="dashDotLine"/>
<line firstPoint="100" id="102" lineColor="goldenrod" secondPoint="97" typeLine="dashDotLine"/>
<point firstPoint="96" id="103" length="((Line_A34_A1&gt;1)?Line_A34_A1-#Bfa:Line_A34_A1)/6" lineColor="black" mx="2.16958" my="0.3175" name="A45" secondPoint="91" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="96" id="104" length="((Line_A34_A1&gt;1)?Line_A34_A1-#Bfa:Line_A34_A1)/6" lineColor="black" mx="-1.80155" my="1.50813" name="A46" secondPoint="85" showLabel="true" type="alongLine" typeLine="none"/>
<line firstPoint="104" id="105" lineColor="goldenrod" secondPoint="98" typeLine="dashDotLine"/>
<line firstPoint="103" id="106" lineColor="goldenrod" secondPoint="98" typeLine="dashDotLine"/>
<operation angle="360-(AngleLine_A43_A41-AngleLine_A44_A41)" center="97" id="107" suffix="b" type="rotation">
<source>
<item idObject="2"/>
<item idObject="68"/>
</source>
<destination>
<item idObject="108" mx="-3.42783" my="-1.61477"/>
<item idObject="109" mx="-2.91251" my="-1.6461"/>
</destination>
</operation>
<line firstPoint="108" id="110" lineColor="deepskyblue" secondPoint="100" typeLine="dashLine"/>
<line firstPoint="108" id="111" lineColor="deepskyblue" secondPoint="109" typeLine="dashLine"/>
<line firstPoint="109" id="112" lineColor="deepskyblue" secondPoint="97" typeLine="dashLine"/>
<operation angle="AngleLine_A46_A42-AngleLine_A45_A42" center="98" id="113" suffix="c" type="rotation">
<source>
<item idObject="90"/>
<item idObject="91"/>
</source>
<destination>
<item idObject="114" mx="-0.843307" my="-2.44795"/>
<item idObject="115" mx="-1.6208" my="-2.46134"/>
</destination>
</operation>
<line firstPoint="104" id="116" lineColor="violet" secondPoint="115" typeLine="dashLine"/>
<line firstPoint="115" id="117" lineColor="violet" secondPoint="114" typeLine="dashLine"/>
<line firstPoint="114" id="118" lineColor="violet" secondPoint="98" typeLine="dashLine"/>
<line firstPoint="108" id="121" lineColor="deepskyblue" secondPoint="100" typeLine="dotLine"/>
<line firstPoint="100" id="122" lineColor="deepskyblue" secondPoint="85" typeLine="dotLine"/>
<line firstPoint="85" id="123" lineColor="deepskyblue" secondPoint="104" typeLine="dotLine"/>
<line firstPoint="104" id="124" lineColor="deepskyblue" secondPoint="115" typeLine="dotLine"/>
<line firstPoint="109" id="125" lineColor="deepskyblue" secondPoint="97" typeLine="dotLine"/>
<line firstPoint="97" id="126" lineColor="deepskyblue" secondPoint="83" typeLine="dotLine"/>
<line firstPoint="83" id="127" lineColor="deepskyblue" secondPoint="98" typeLine="dotLine"/>
<line firstPoint="98" id="128" lineColor="deepskyblue" secondPoint="114" typeLine="dotLine"/>
<line firstPoint="108" id="129" lineColor="darkviolet" secondPoint="109" typeLine="hair"/>
<line firstPoint="115" id="130" lineColor="violet" secondPoint="114" typeLine="dotLine"/>
<spline aScale="10" color="darkviolet" id="131" penStyle="hair" type="pathInteractive">
<pathPoint angle1="191.994" angle2="AngleLine_A1b_A44" length1="0" length2="0.5" pSpline="108"/>
<pathPoint angle1="((AngleLine_A1b_A44) + AngleLine_A44_A37)/2+180" angle2="13.9555" length1="2.5" length2="2.5" pSpline="100"/>
<pathPoint angle1="((AngleLine_A46_A37-180) + AngleLine_A44_A37)/2+180" angle2="17.55" length1="2.5" length2="2.5" pSpline="85"/>
<pathPoint angle1="((AngleLine_A46_A37-180) + AngleLine_A46_A28ac)/2+180" angle2="20.5807" length1="2.5" length2="2.5" pSpline="104"/>
<pathPoint angle1="AngleLine_A46_A28ac+180" angle2="21.9788" length1="1.5" length2="2.72962" pSpline="115"/>
</spline>
<spline aScale="10" color="darkviolet" id="132" penStyle="hair" type="pathInteractive">
<pathPoint angle1="13.105" angle2="AngleLine_A30ac_A42" length1="0" length2="0.5" pSpline="114"/>
<pathPoint angle1="((AngleLine_A30ac_A42-180) + AngleLine_A39_A42)/2" angle2="191.707" length1="2.5" length2="2.5" pSpline="98"/>
<pathPoint angle1="((AngleLine_A41_A39) + AngleLine_A39_A42)/2" angle2="188.676" length1="2.5" length2="2.5" pSpline="83"/>
<pathPoint angle1="((AngleLine_A41_A39) + ((AngleLine_A31b_A41&gt;180)?AngleLine_A31b_A41-360:AngleLine_A31b_A41))/2" angle2="185.082" length1="2.5" length2="2.5" pSpline="97"/>
<pathPoint angle1="(AngleLine_A31b_A41 &gt;180)?AngleLine_A31b_A41-360:AngleLine_A31b_A41" angle2="183.12" length1="0.5" length2="2.6214" pSpline="109"/>
</spline>
<point firstPoint="37" id="142" length="10" lineColor="black" mx="-4.25308" my="-2.55861" name="A47" secondPoint="3" showLabel="true" type="alongLine" typeLine="none"/>
<spline aScale="0" angle1="263.302" angle2="90.7258" color="black" id="143" length1="1.60457" length2="1.52726" penStyle="hair" point1="38" point4="142" type="simpleInteractive"/>
<point id="144" length="#Vtb" mx="-1.93092" my="-2.30528" name="A48" showLabel="true" spline="43" type="cutSpline"/>
<spline aScale="1.1" angle1="357.471" angle2="268.291" color="darkBlue" id="145" length1="7.90828" length2="5" notes="23.09.2022 :&#10;c1length 9,7659 -&gt; 8&#10;c2length 6,25613 -&gt; 5" penStyle="hair" point1="38" point4="144" type="simpleInteractive"/>
<point id="146" length="Spl_A19_A48+3.5" mx="-1.50871" my="-4.75411" name="A49" showLabel="true" spline="43" type="cutSpline"/>
<point angle="270" basePoint="146" id="147" length="#Lh+3" lineColor="black" mx="0.264583" my="0.396875" name="A50" showLabel="true" type="endLine" typeLine="hair"/>
<point id="148" length="Spl_A19_A48+2" mx="-1.32463" my="-2.02319" name="A51" showLabel="true" spline="43" type="cutSpline"/>
<point id="149" length="2" mx="-5.43528" my="-0.236443" name="A52" showLabel="true" spline="143" type="cutSpline"/>
<spline aScale="0" angle1="270.411" angle2="358.295" color="black" id="150" length1="8.84026" length2="5" penStyle="hair" point1="148" point4="149" type="simpleInteractive"/>
<spline aScale="10" angle1="344.394" angle2="179.167" color="black" id="151" length1="5.55752" length2="13.698" penStyle="hair" point1="142" point4="147" type="simpleInteractive"/>
<operation axisType="1" center="147" id="152" suffix="a1" type="flippingByAxis">
<source>
<item idObject="38"/>
<item idObject="37"/>
<item idObject="145"/>
<item idObject="144"/>
<item idObject="43"/>
<item idObject="151"/>
<item idObject="142"/>
</source>
<destination>
<item idObject="153" mx="0.640732" my="-3.59749"/>
<item idObject="154" mx="0.80517" my="1.8823"/>
<item idObject="155"/>
<item idObject="156" mx="-1.93092" my="-2.30528"/>
<item idObject="157"/>
<item idObject="158"/>
<item idObject="159" mx="-4.25308" my="-2.55861"/>
</destination>
</operation>
<line firstPoint="154" id="160" lineColor="black" secondPoint="159" typeLine="hair"/>
<line firstPoint="153" id="161" lineColor="black" secondPoint="154" typeLine="hair"/>
<point id="192" length="6.5" mx="-2.47979" my="-3.69858" name="A53" showLabel="true" spline="43" type="cutSpline"/>
<point angle="290" basePoint="192" curve="150" id="193" lineColor="black" mx="0.264583" my="0.396875" name="A54" showLabel="true" type="curveIntersectAxis" typeLine="hair"/>
<point firstPoint="192" id="196" length="1.5" lineColor="black" mx="1.21708" my="-1.08479" name="A55" secondPoint="193" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="180" firstPoint="196" id="197" length="6" lineColor="black" mx="-2.64583" my="-1.64042" name="A56" secondPoint="193" showLabel="true" type="normal" typeLine="hair"/>
<point angle="AngleLine_A53_A54" basePoint="197" curve="150" id="198" lineColor="black" mx="-1.74625" my="2.88396" name="A57" showLabel="true" type="curveIntersectAxis" typeLine="hair"/>
<point firstPoint="68" id="253" length="5" lineColor="black" mx="-5.18047" my="-0.934137" name="A58" secondPoint="5" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="67" id="254" length="4.5" lineColor="black" mx="4.07612" my="-0.692135" name="A59" secondPoint="55" showLabel="true" type="alongLine" typeLine="none"/>
<line firstPoint="253" id="255" lineColor="black" secondPoint="254" typeLine="dotLine"/>
<point firstPoint="253" id="256" length="4" lineColor="black" mx="-1.42943" my="-2.50715" name="A60" secondPoint="254" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="256" id="257" length="14.5" lineColor="black" mx="0.264583" my="0.396875" name="A61" secondPoint="254" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="0" firstPoint="257" id="258" length="13" lineColor="black" mx="1.23259" my="-0.450129" name="A62" secondPoint="256" showLabel="true" type="normal" typeLine="none"/>
<point angle="180" firstPoint="256" id="259" length="13" lineColor="black" mx="-3.24445" my="0.336373" name="A63" secondPoint="257" showLabel="true" type="normal" typeLine="none"/>
<line firstPoint="256" id="260" lineColor="black" secondPoint="259" typeLine="dotLine"/>
<line firstPoint="257" id="261" lineColor="black" secondPoint="258" typeLine="dotLine"/>
<point firstPoint="256" id="262" length="CurrentLength/2" lineColor="black" mx="0.264583" my="0.396875" name="A64" secondPoint="257" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="259" id="263" length="CurrentLength/2" lineColor="black" mx="-1.27337" my="-2.33711" name="A65" secondPoint="258" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="0" firstPoint="263" id="264" length="2" lineColor="black" mx="0.264583" my="0.396875" name="A66" secondPoint="259" showLabel="true" type="normal" typeLine="none"/>
<line firstPoint="259" id="265" lineColor="black" secondPoint="258" typeLine="dotLine"/>
<line firstPoint="263" id="266" lineColor="black" secondPoint="264" typeLine="dotLine"/>
<point firstPoint="259" id="267" length="1" lineColor="black" mx="-0.763926" my="1.72789" name="A67" secondPoint="263" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="258" id="268" length="1" lineColor="black" mx="-1.18743" my="2.15139" name="A68" secondPoint="263" showLabel="true" type="alongLine" typeLine="none"/>
<line firstPoint="256" id="269" lineColor="green" secondPoint="267" typeLine="hair"/>
<line firstPoint="267" id="270" lineColor="green" secondPoint="264" typeLine="hair"/>
<line firstPoint="264" id="271" lineColor="green" secondPoint="268" typeLine="hair"/>
<line firstPoint="268" id="272" lineColor="green" secondPoint="257" typeLine="hair"/>
<line firstPoint="256" id="273" lineColor="green" secondPoint="257" typeLine="hair"/>
<point firstPoint="256" id="274" length="CurrentLength/2+1" lineColor="black" mx="-3.00245" my="0.336374" name="A69" secondPoint="259" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="257" id="275" length="CurrentLength/2+1" lineColor="black" mx="1.47459" my="-0.813136" name="A70" secondPoint="258" showLabel="true" type="alongLine" typeLine="none"/>
<line firstPoint="274" id="276" lineColor="black" secondPoint="275" typeLine="dotLine"/>
<point id="277" mx="-0.546686" my="3.80069" name="A71" p1Line1="262" p1Line2="274" p2Line1="264" p2Line2="275" showLabel="true" type="lineIntersect"/>
<point firstPoint="277" id="278" length="1" lineColor="black" mx="-1.57873" my="-3.98683" name="A72" secondPoint="275" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="277" id="279" length="1" lineColor="black" mx="-2.48688" my="-3.71344" name="A73" secondPoint="274" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="278" id="280" length="0.4" lineColor="black" mx="4.91233" my="-2.75167" name="A74" secondPoint="275" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="279" id="281" length="0.3" lineColor="black" mx="-5.18583" my="0.370407" name="A75" secondPoint="274" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="279" id="282" length="CurrentLength/2" lineColor="black" mx="-2.03729" my="2.93687" name="A76" secondPoint="277" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="277" id="283" length="CurrentLength/2" lineColor="black" mx="-2.19604" my="-5.00063" name="A77" secondPoint="278" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="0" firstPoint="283" id="284" length="2" lineColor="black" mx="0.79375" my="2.61937" name="A78" secondPoint="277" showLabel="true" type="normal" typeLine="none"/>
<point angle="0" firstPoint="282" id="285" length="2.5" lineColor="black" mx="-3.04271" my="-3.0427" name="A79" secondPoint="277" showLabel="true" type="normal" typeLine="none"/>
<line firstPoint="285" id="286" lineColor="green" secondPoint="284" typeLine="hair"/>
<point firstPoint="278" id="287" length="CurrentLength/2" lineColor="black" mx="3.09562" my="4.15395" name="A80" secondPoint="280" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="279" id="288" length="CurrentLength/2" lineColor="black" mx="-4.68313" my="-2.67229" name="A81" secondPoint="281" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="0" firstPoint="288" id="289" length="0.5" lineColor="black" mx="-4.7625" my="1.93146" name="A82" secondPoint="281" showLabel="true" type="normal" typeLine="none"/>
<line firstPoint="285" id="290" lineColor="green" secondPoint="289" typeLine="hair"/>
<line firstPoint="289" id="291" lineColor="green" secondPoint="281" typeLine="hair"/>
<point angle="0" firstPoint="287" id="292" length="1" lineColor="black" mx="1.61396" my="-2.46063" name="A83" secondPoint="280" showLabel="true" type="normal" typeLine="none"/>
<line firstPoint="292" id="293" lineColor="green" secondPoint="284" typeLine="hair"/>
<line firstPoint="292" id="294" lineColor="green" secondPoint="280" typeLine="hair"/>
<point id="295" mx="0.264583" my="0.396875" name="A84" p1Line1="257" p1Line2="274" p2Line1="268" p2Line2="275" showLabel="true" type="lineIntersect"/>
<point id="296" mx="0.264583" my="0.396875" name="A85" p1Line1="256" p1Line2="274" p2Line1="267" p2Line2="275" showLabel="true" type="lineIntersect"/>
<line firstPoint="280" id="297" lineColor="green" secondPoint="295" typeLine="hair"/>
<line firstPoint="281" id="298" lineColor="green" secondPoint="296" typeLine="hair"/>
<point firstPoint="1" id="341" length="#Wh" lineColor="black" mx="-4.16418" my="-0.670473" name="A86" secondPoint="2" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="0" basePoint="341" curve="25" id="342" lineColor="black" mx="-4.13602" my="-0.596011" name="A87" showLabel="true" type="curveIntersectAxis" typeLine="none"/>
<point angle="0" basePoint="341" curve="72" id="345" lineColor="black" mx="2.20722" my="-0.547102" name="A88" showLabel="true" type="curveIntersectAxis" typeLine="none"/>
<point firstPoint="31" id="376" length="#Hl" lineColor="black" mx="2.33207" my="2.69483" name="A89" notes="von 1.5 auf 2 geändert, damit die Zugabe für das Schrägband hier bereits enthalten ist." secondPoint="6" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="31" id="513" length="CurrentLength/2" lineColor="black" mx="4.77782" my="-1.60676" name="A100" secondPoint="376" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="0" firstPoint="376" id="377" length="4" lineColor="black" mx="-7.9037" my="-0.659262" name="A90" secondPoint="513" showLabel="true" type="normal" typeLine="none"/>
<point angle="AngleLine_A17_A5-180" basePoint="377" curve="43" id="378" lineColor="black" mx="-2.99017" my="1.00241" name="A94" showLabel="true" type="curveIntersectAxis" typeLine="none"/>
<point firstPoint="376" id="381" length="-1.5" lineColor="cornflowerblue" mx="-1.02303" my="3.16538" name="A95" secondPoint="31" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="0" firstPoint="381" id="382" length="Line_A89_A90" lineColor="black" mx="-3.79668" my="1.39655" name="A96" secondPoint="376" showLabel="true" type="normal" typeLine="none"/>
<line firstPoint="382" id="385" lineColor="cornflowerblue" secondPoint="378" typeLine="hair"/>
<line firstPoint="377" id="392" lineColor="deepskyblue" secondPoint="376" typeLine="hair"/>
<point id="417" length="(Line_A34_A1&gt;1)?(CurrentLength-#Bfa):(CurrentLength)" mx="-6.1178" my="-2.78497" name="A97" showLabel="true" splinePath="131" type="cutSplinePath"/>
<line firstPoint="417" id="418" lineColor="darkviolet" secondPoint="114" typeLine="hair"/>
<operation id="492" p1Line="378" p2Line="382" suffix="a2" type="flippingByLine">
<source>
<item color="cornflowerblue" idObject="43"/>
<item idObject="31"/>
<item idObject="381"/>
</source>
<destination>
<item idObject="493"/>
<item idObject="494" mx="-4.09247" my="0.702107"/>
<item idObject="495" mx="-4.88743" my="1.19789"/>
</destination>
</operation>
<line firstPoint="494" id="496" lineColor="cornflowerblue" secondPoint="495" typeLine="hair"/>
<line firstPoint="495" id="497" lineColor="cornflowerblue" secondPoint="381" typeLine="hair"/>
<point firstPoint="256" id="510" length="1.2" lineColor="black" mx="0.264583" my="0.396875" name="A98" secondPoint="267" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="257" id="511" length="1.2" lineColor="black" mx="0.264583" my="0.396875" name="A99" secondPoint="268" showLabel="true" type="alongLine" typeLine="none"/>
<line firstPoint="510" id="512" lineColor="goldenrod" secondPoint="511" typeLine="dashLine"/>
<point firstPoint="377" id="514" length="0" lineColor="black" mx="-0.40196" my="2.134" name="A101" notes="von 0.5 auf 0 geändert, damit die Zugabe für das Schrägband direkt hier enthalten ist." secondPoint="376" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="AngleLine_A17_A5-180" basePoint="514" curve="43" id="515" lineColor="black" mx="0.324256" my="-2.61663" name="A102" showLabel="true" type="curveIntersectAxis" typeLine="none"/>
<line firstPoint="515" id="518" lineColor="deepskyblue" secondPoint="514" typeLine="hair"/>
<point firstPoint="514" id="519" length="4" lineColor="black" mx="-4.20754" my="-1.15463" name="A103" secondPoint="515" showLabel="true" type="alongLine" typeLine="none"/>
<spline aScale="0" angle1="AngleLine_A102_A101" angle2="AngleLine_A89_A90" color="deepskyblue" id="520" length1="2.57336" length2="2.68044" penStyle="hair" point1="519" point4="376" type="simpleInteractive"/>
<point firstPoint="382" id="524" length="2" lineColor="black" mx="-4.01162" my="-1.69842" name="A104" secondPoint="378" showLabel="true" type="alongLine" typeLine="none"/>
<spline aScale="0" angle1="AngleLine_A90_A94-180+30" angle2="AngleLine_A95a2_A95+180" color="cornflowerblue" id="525" length1="1.79358" length2="1.51786" penStyle="hair" point1="524" point4="381" type="simpleInteractive"/>
<operation id="526" p1Line="378" p2Line="382" suffix="a3" type="flippingByLine">
<source>
<item idObject="525"/>
</source>
<destination>
<item idObject="527"/>
</destination>
</operation>
<point firstPoint="2" id="590" length="#Lkh" lineColor="black" mx="-3.2782" my="-0.739327" name="A105" secondPoint="1" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="0" basePoint="590" curve="25" id="591" lineColor="black" mx="1.06292" my="-3.54066" name="A106" showLabel="true" type="curveIntersectAxis" typeLine="none"/>
<point angle="0" basePoint="590" curve="72" id="594" lineColor="black" mx="4.84107" my="-2.90836" name="A107" showLabel="true" type="curveIntersectAxis" typeLine="none"/>
<line firstPoint="31" id="607" lineColor="cornflowerblue" secondPoint="381" typeLine="hair"/>
<point angle="AngleLine_A17_A5 - 270" basePoint="377" curve="602" id="608" lineColor="black" mx="5.26555" my="0.865239" name="A108" showLabel="true" type="curveIntersectAxis" typeLine="none"/>
<line firstPoint="590" id="617" lineColor="darkRed" secondPoint="594" typeLine="hair"/>
<line firstPoint="590" id="618" lineColor="darkBlue" secondPoint="591" typeLine="hair"/>
<point id="638" mx="0.714375" my="2.80458" name="A91" p1Line1="494" p1Line2="515" p2Line1="31" p2Line2="377" showLabel="true" type="lineIntersect"/>
<line firstPoint="494" id="639" lineColor="cornflowerblue" secondPoint="31" typeLine="hair"/>
<point firstPoint="594" id="641" length="2" lineColor="black" mx="-1.51961" my="2.65681" name="A92" secondPoint="590" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="591" id="642" length="2" lineColor="black" mx="-2.07516" my="1.26854" name="A93" secondPoint="590" showLabel="true" type="alongLine" typeLine="none"/>
<spline aScale="1" angle1="243.439" angle2="78" color="darkBlue" id="643" length1="6" length2="2.5" notes="Angle 2 vorher : 90 und 2 " penStyle="hair" point1="23" point4="642" type="simpleInteractive"/>
<spline aScale="1" angle1="232.998" angle2="78" color="darkRed" id="644" length1="7" length2="3" penStyle="hair" point1="71" point4="641" type="simpleInteractive"/>
<point firstPoint="1" id="852" length="#Osh" lineColor="black" mx="-5.1531" my="0.52435" name="A109" secondPoint="2" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="0" basePoint="852" curve="25" id="853" lineColor="black" mx="0.264583" my="0.396875" name="A110" showLabel="true" type="curveIntersectAxis" typeLine="none"/>
<point angle="0" basePoint="852" curve="72" id="856" lineColor="black" mx="0.264583" my="0.396875" name="A111" showLabel="true" type="curveIntersectAxis" typeLine="none"/>
<line firstPoint="852" id="859" lineColor="goldenrod" secondPoint="856" typeLine="dotLine"/>
<line firstPoint="852" id="860" lineColor="goldenrod" secondPoint="853" typeLine="dotLine"/>
<point firstPoint="590" id="862" length="1.5" lineColor="black" mx="2.32546" my="-5.33774" name="A112" secondPoint="2" showLabel="true" type="alongLine" typeLine="none"/>
<spline aScale="0" angle1="0" angle2="168" color="darkBlue" id="865" length1="4" length2="5" penStyle="hair" point1="862" point4="642" type="simpleInteractive"/>
<spline aScale="0" angle1="0" angle2="168" color="darkRed" id="868" length1="4" length2="5" penStyle="hair" point1="862" point4="641" type="simpleInteractive"/>
</calculation>
<modeling>
<point id="183" idObject="149" inUse="false" mx="-2.95013" my="1.69646" showLabel="true" type="modeling"/>
<spline id="184" idObject="143" inUse="false" type="modelingSpline"/>
<point id="185" idObject="38" inUse="false" mx="0.767396" my="-1.78198" showLabel="true" type="modeling"/>
<spline id="186" idObject="39" inUse="false" type="modelingSpline"/>
<point id="187" idObject="36" inUse="false" mx="0.580176" my="1.48237" showLabel="true" type="modeling"/>
<spline id="188" idObject="43" inUse="false" type="modelingSpline"/>
<point id="189" idObject="148" inUse="false" mx="0.0680086" my="-3.04089" showLabel="true" type="modeling"/>
<spline id="190" idObject="150" inUse="false" type="modelingSpline"/>
<point id="207" idObject="192" inUse="false" mx="-1.61018" my="-2.72026" showLabel="true" type="modeling"/>
<spline id="208" idObject="43" inUse="false" type="modelingSpline"/>
<point id="209" idObject="148" inUse="false" mx="-0.735437" my="-3.46939" showLabel="true" type="modeling"/>
<spline id="210" idObject="150" inUse="false" type="modelingSpline"/>
<point id="211" idObject="193" inUse="false" mx="-1.87541" my="1.43236" showLabel="true" type="modeling"/>
</modeling>
<details>
<detail forbidFlipping="false" forceFlipping="true" hideMainPath="false" id="191" inLayout="false" mx="39.3374" my="44.9867" name="Piece 1" seamAllowance="true" uuid="{2e36ff14-cefe-4668-b6d4-3ff258b767cf}" version="2" width="1">
<data annotation="" foldPosition="" fontSize="10" height="0.879713" letter="" mx="504.575" my="383.907" onFold="false" orientation="" quantity="1" rotation="0" rotationWay="" tilt="" visible="true" width="3.53898">
<line alignment="4" bold="true" italic="false" sfIncrement="6" text="%pLetter%"/>
<line alignment="4" bold="true" italic="false" sfIncrement="2" text="%pName%"/>
<line alignment="4" bold="false" italic="false" sfIncrement="0" text="%wCut% %pQuantity%"/>
<line alignment="4" bold="false" italic="false" sfIncrement="0" text="%userMaterial1%"/>
</data>
<patternInfo fontSize="10" height="1.92131" mx="274.604" my="360.938" rotation="0" visible="true" width="3.00933"/>
<grainline arrows="0" length="3.945" mx="448.516" my="476.644" rotation="90" visible="true"/>
<nodes>
<node idObject="188" reverse="0" type="NodeSpline"/>
<node after="0.7" idObject="189" type="NodePoint"/>
<node idObject="190" reverse="0" type="NodeSpline"/>
<node before="0.7" idObject="183" type="NodePoint"/>
<node idObject="184" reverse="1" type="NodeSpline"/>
<node idObject="185" type="NodePoint"/>
<node idObject="186" reverse="0" type="NodeSpline"/>
<node idObject="187" type="NodePoint"/>
</nodes>
</detail>
</details>
<groups>
<group id="44" name="Vorderhose" visible="false">
<item object="1" tool="1"/>
<item object="3" tool="3"/>
<item object="4" tool="4"/>
<item object="5" tool="5"/>
<item object="6" tool="6"/>
<item object="15" tool="15"/>
<item object="17" tool="17"/>
<item object="18" tool="18"/>
<item object="20" tool="20"/>
<item object="21" tool="21"/>
<item object="23" tool="23"/>
<item object="25" tool="25"/>
<item object="31" tool="31"/>
<item object="35" tool="35"/>
<item object="36" tool="36"/>
<item object="37" tool="37"/>
<item object="38" tool="38"/>
<item object="39" tool="39"/>
<item object="40" tool="40"/>
<item object="41" tool="41"/>
<item object="43" tool="43"/>
<item object="145" tool="145"/>
<item object="144" tool="144"/>
<item object="352" tool="352"/>
<item object="351" tool="351"/>
<item object="342" tool="342"/>
<item object="348" tool="348"/>
<item object="358" tool="358"/>
<item object="356" tool="356"/>
<item object="355" tool="355"/>
<item object="602" tool="602"/>
<item object="591" tool="591"/>
<item object="618" tool="618"/>
<item object="341" tool="341"/>
<item object="590" tool="590"/>
<item object="608" tool="608"/>
<item tool="643"/>
<item tool="642"/>
<item tool="853"/>
<item tool="860"/>
<item tool="862"/>
<item tool="865"/>
</group>
<group id="45" name="Konstruktion" visible="false">
<item object="2" tool="2"/>
<item object="7" tool="7"/>
<item object="9" tool="9"/>
<item object="10" tool="10"/>
<item object="11" tool="11"/>
<item object="12" tool="12"/>
<item object="13" tool="13"/>
<item object="14" tool="14"/>
<item object="16" tool="16"/>
<item object="19" tool="19"/>
<item object="22" tool="22"/>
<item object="24" tool="24"/>
<item object="26" tool="26"/>
<item object="27" tool="27"/>
<item object="28" tool="28"/>
<item object="29" tool="29"/>
<item object="30" tool="30"/>
<item object="33" tool="33"/>
<item object="34" tool="34"/>
<item object="42" tool="42"/>
<item object="5" tool="5"/>
<item object="4" tool="4"/>
<item object="15" tool="15"/>
<item object="3" tool="3"/>
<item object="1" tool="1"/>
<item object="17" tool="17"/>
<item object="49" tool="49"/>
<item object="46" tool="46"/>
<item object="52" tool="52"/>
<item object="54" tool="54"/>
<item object="58" tool="58"/>
<item object="56" tool="56"/>
<item object="55" tool="55"/>
<item object="62" tool="62"/>
<item object="68" tool="68"/>
<item object="67" tool="67"/>
<item object="31" tool="31"/>
<item object="23" tool="23"/>
<item object="71" tool="71"/>
<item object="75" tool="75"/>
<item object="74" tool="74"/>
<item object="57" tool="57"/>
<item object="59" tool="59"/>
<item object="61" tool="61"/>
<item object="60" tool="60"/>
<item object="32" tool="32"/>
</group>
<group id="51" name="Hinterhose" visible="false">
<item object="46" tool="46"/>
<item object="48" tool="48"/>
<item object="50" tool="50"/>
<item object="55" tool="55"/>
<item object="65" tool="65"/>
<item object="66" tool="66"/>
<item object="62" tool="62"/>
<item object="68" tool="68"/>
<item object="67" tool="67"/>
<item object="69" tool="69"/>
<item object="53" tool="53"/>
<item object="70" tool="70"/>
<item object="72" tool="72"/>
<item object="71" tool="71"/>
<item object="73" tool="73"/>
<item object="2" tool="2"/>
<item object="3" tool="3"/>
<item object="1" tool="1"/>
<item object="47" tool="47"/>
<item object="359" tool="359"/>
<item object="354" tool="354"/>
<item object="353" tool="353"/>
<item object="349" tool="349"/>
<item object="345" tool="345"/>
<item object="357" tool="357"/>
<item object="355" tool="355"/>
<item object="617" tool="617"/>
<item object="594" tool="594"/>
<item object="341" tool="341"/>
<item object="590" tool="590"/>
<item tool="644"/>
<item tool="641"/>
<item tool="856"/>
<item tool="859"/>
<item tool="868"/>
<item tool="862"/>
</group>
<group id="77" name="Kontrolle" visible="false">
<item object="64" tool="64"/>
<item object="63" tool="63"/>
<item object="78" tool="78"/>
</group>
<group id="119" name="Passe_Konstruktion" visible="false">
<item object="76" tool="76"/>
<item object="79" tool="79"/>
<item object="83" tool="83"/>
<item object="85" tool="85"/>
<item object="86" tool="86"/>
<item object="87" tool="87"/>
<item object="88" tool="88"/>
<item object="90" tool="89"/>
<item object="91" tool="89"/>
<item object="92" tool="92"/>
<item object="93" tool="93"/>
<item object="94" tool="94"/>
<item object="95" tool="95"/>
<item object="96" tool="96"/>
<item object="97" tool="97"/>
<item object="98" tool="98"/>
<item object="99" tool="99"/>
<item object="100" tool="100"/>
<item object="101" tool="101"/>
<item object="102" tool="102"/>
<item object="103" tool="103"/>
<item object="104" tool="104"/>
<item object="105" tool="105"/>
<item object="106" tool="106"/>
<item object="108" tool="107"/>
<item object="109" tool="107"/>
<item object="110" tool="110"/>
<item object="111" tool="111"/>
<item object="112" tool="112"/>
<item object="114" tool="113"/>
<item object="115" tool="113"/>
<item object="116" tool="116"/>
<item object="117" tool="117"/>
<item object="118" tool="118"/>
</group>
<group id="120" name="Passe" visible="false">
<item object="83" tool="83"/>
<item object="85" tool="85"/>
<item object="97" tool="97"/>
<item object="98" tool="98"/>
<item object="100" tool="100"/>
<item object="104" tool="104"/>
<item object="108" tool="107"/>
<item object="109" tool="107"/>
<item object="114" tool="113"/>
<item object="115" tool="113"/>
<item object="128" tool="128"/>
<item object="127" tool="127"/>
<item object="126" tool="126"/>
<item object="125" tool="125"/>
<item object="124" tool="124"/>
<item object="123" tool="123"/>
<item object="122" tool="122"/>
<item object="121" tool="121"/>
<item object="129" tool="129"/>
<item object="132" tool="132"/>
<item object="130" tool="130"/>
<item object="131" tool="131"/>
<item object="417" tool="417"/>
<item object="418" tool="418"/>
</group>
<group id="162" name="Vordertasche" visible="true">
<item object="142" tool="142"/>
<item object="143" tool="143"/>
<item object="145" tool="145"/>
<item object="147" tool="147"/>
<item object="148" tool="148"/>
<item object="150" tool="150"/>
<item object="151" tool="151"/>
<item object="153" tool="152"/>
<item object="154" tool="152"/>
<item object="155" tool="152"/>
<item object="156" tool="152"/>
<item object="158" tool="152"/>
<item object="159" tool="152"/>
<item object="160" tool="160"/>
<item object="161" tool="161"/>
<item object="157" tool="152"/>
<item object="144" tool="144"/>
<item object="149" tool="149"/>
<item object="192" tool="192"/>
<item object="196" tool="196"/>
<item object="193" tool="193"/>
<item object="197" tool="197"/>
<item object="198" tool="198"/>
<item object="146" tool="146"/>
<item object="39" tool="39"/>
<item object="43" tool="43"/>
<item object="36" tool="36"/>
</group>
<group id="330" name="Gesäßtasche_Konstruktion" visible="false">
<item object="253" tool="253"/>
<item object="254" tool="254"/>
<item object="255" tool="255"/>
<item object="258" tool="258"/>
<item object="259" tool="259"/>
<item object="260" tool="260"/>
<item object="261" tool="261"/>
<item object="263" tool="263"/>
<item object="265" tool="265"/>
<item object="274" tool="274"/>
<item object="275" tool="275"/>
<item object="266" tool="266"/>
<item object="276" tool="276"/>
<item object="283" tool="283"/>
<item object="282" tool="282"/>
<item object="277" tool="277"/>
<item object="287" tool="287"/>
<item object="288" tool="288"/>
<item object="278" tool="278"/>
<item object="279" tool="279"/>
<item object="262" tool="262"/>
<item object="511" tool="511"/>
<item object="512" tool="512"/>
<item object="510" tool="510"/>
</group>
<group id="331" name="Gesäßtasche" visible="false">
<item object="256" tool="256"/>
<item object="257" tool="257"/>
<item object="264" tool="264"/>
<item object="267" tool="267"/>
<item object="268" tool="268"/>
<item object="269" tool="269"/>
<item object="270" tool="270"/>
<item object="271" tool="271"/>
<item object="272" tool="272"/>
<item object="273" tool="273"/>
<item object="280" tool="280"/>
<item object="281" tool="281"/>
<item object="284" tool="284"/>
<item object="285" tool="285"/>
<item object="286" tool="286"/>
<item object="289" tool="289"/>
<item object="290" tool="290"/>
<item object="291" tool="291"/>
<item object="292" tool="292"/>
<item object="293" tool="293"/>
<item object="294" tool="294"/>
<item object="295" tool="295"/>
<item object="296" tool="296"/>
<item object="297" tool="297"/>
<item object="298" tool="298"/>
</group>
<group id="393" name="Hosenschlitz 2-teilig RV" visible="false">
<item object="43" tool="43"/>
<item object="378" tool="378"/>
<item object="382" tool="382"/>
<item object="385" tool="385"/>
<item object="377" tool="377"/>
<item object="376" tool="376"/>
<item object="381" tool="381"/>
<item object="392" tool="392"/>
<item object="398" tool="398"/>
<item object="395" tool="394"/>
<item object="399" tool="399"/>
<item object="396" tool="394"/>
<item object="397" tool="394"/>
<item object="493" tool="492"/>
<item object="494" tool="492"/>
<item object="496" tool="496"/>
<item object="497" tool="497"/>
<item object="495" tool="492"/>
<item object="513" tool="513"/>
<item object="514" tool="514"/>
<item object="527" tool="526"/>
<item object="525" tool="525"/>
<item object="524" tool="524"/>
<item object="515" tool="515"/>
<item object="518" tool="518"/>
<item object="519" tool="519"/>
<item object="520" tool="520"/>
<item object="31" tool="31"/>
<item object="607" tool="607"/>
<item object="639" tool="639"/>
<item object="638" tool="638"/>
</group>
</groups>
</draw>
<draw name="Bund">
<calculation>
<point id="420" mx="-0.398396" my="-3.67571" name="B" showLabel="true" type="single" x="41.4269" y="7.73397"/>
<point angle="0" basePoint="420" id="421" length="#Bu/2+((#istEinteiligerHosenschlitz==0)?Line_A89_A90:(#HUUB-0.5))" lineColor="black" mx="-0.493107" my="-4.4334" name="B1" showLabel="true" type="endLine" typeLine="hair"/>
<point angle="0" firstPoint="421" id="422" length="#Bh" lineColor="black" mx="0.115474" my="2.52168" name="B2" secondPoint="420" showLabel="true" type="normal" typeLine="hair"/>
<point firstPoint="420" id="423" mx="0.264583" my="0.396875" name="B3" secondPoint="422" showLabel="true" type="pointOfIntersection"/>
<line firstPoint="423" id="424" lineColor="black" secondPoint="422" typeLine="hair"/>
<line firstPoint="420" id="425" lineColor="black" secondPoint="423" typeLine="hair"/>
<point firstPoint="420" id="426" length="(#istEinteiligerHosenschlitz==0)?Line_A89_A90:(#HUUB-0.5)" lineColor="black" mx="-0.497589" my="-3.68398" name="B4" secondPoint="421" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="421" id="428" length="SplPath_A1b_A97" lineColor="black" mx="-2.30022" my="-3.12509" name="B6" secondPoint="420" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="428" id="427" length="Spl_A19_A48" lineColor="black" mx="0.858871" my="-3.97144" name="B5" secondPoint="420" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="426" id="429" mx="0.264583" my="0.396875" name="B7" secondPoint="423" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="427" id="430" mx="1.447" my="2.1271" name="B8" secondPoint="423" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="428" id="431" mx="-2.26938" my="1.39701" name="B9" secondPoint="423" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="427" id="446" length="2" lineColor="black" mx="-2.52806" my="-5.19056" name="B10" notes="14.01.2022 von 1 zu 2, weil man ja an der Taschen die Doppelnaht hat, man braucht mehr Abstand" secondPoint="420" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="446" id="447" length="#Gsb" lineColor="black" mx="-2.97855" my="-3.2563" name="B11" secondPoint="420" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="446" id="448" mx="-2.30755" my="2.89446" name="B12" secondPoint="423" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="447" id="449" mx="-3.23949" my="2.07436" name="B13" secondPoint="423" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="428" id="450" length="2" lineColor="black" mx="-1.26379" my="-3.5918" name="B14" secondPoint="421" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="450" id="451" length="#Gsb" lineColor="black" mx="1.15924" my="-3.96457" name="B15" secondPoint="421" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="451" id="452" mx="1.27107" my="2.44713" name="B16" secondPoint="422" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="450" id="453" mx="-0.928292" my="2.63352" name="B17" secondPoint="431" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="421" id="454" length="#Gsb/2" lineColor="black" mx="-2.49394" my="-2.73442" name="B18" secondPoint="420" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="454" id="455" mx="-2.27028" my="1.70158" name="B19" secondPoint="423" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="426" id="481" length="CurrentLength/2" lineColor="black" mx="-2.57557" my="0.0828608" name="B20" secondPoint="429" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="0" firstPoint="481" id="482" length="#HGKnB/2 + #HGKnLB/2" lineColor="black" mx="0.264583" my="0.396875" name="B21" secondPoint="429" showLabel="true" type="normal" typeLine="none"/>
<line firstPoint="426" id="619" lineColor="black" secondPoint="429" typeLine="dotLine"/>
<line firstPoint="447" id="620" lineColor="black" secondPoint="449" typeLine="dotLine"/>
<line firstPoint="446" id="621" lineColor="black" secondPoint="448" typeLine="dotLine"/>
<line firstPoint="450" id="622" lineColor="black" secondPoint="453" typeLine="dotLine"/>
<line firstPoint="451" id="623" lineColor="black" secondPoint="452" typeLine="dotLine"/>
<line firstPoint="454" id="624" lineColor="black" secondPoint="455" typeLine="dotLine"/>
<line firstPoint="426" id="850" lineColor="black" secondPoint="427" typeLine="hair"/>
</calculation>
<modeling/>
<details/>
<groups/>
</draw>
<draw name="Gürtelschlaufen">
<calculation>
<point id="625" mx="-1.87215" my="-1.40548" name="C" showLabel="true" type="single" x="40.1932" y="18.8101"/>
<point angle="270" basePoint="625" id="626" length="#Gsb*2" lineColor="black" mx="-2.09867" my="0.506794" name="C1" showLabel="true" type="endLine" typeLine="hair"/>
<point angle="0" firstPoint="625" id="627" length="#Gsl" lineColor="black" mx="0.814176" my="-0.812229" name="C2" secondPoint="626" showLabel="true" type="normal" typeLine="hair"/>
<point firstPoint="627" id="628" mx="0.264583" my="0.396875" name="C3" secondPoint="626" showLabel="true" type="pointOfIntersection"/>
<line firstPoint="626" id="629" lineColor="black" secondPoint="628" typeLine="hair"/>
<line firstPoint="628" id="630" lineColor="black" secondPoint="627" typeLine="hair"/>
</calculation>
<modeling/>
<details/>
<groups/>
</draw>
<draw name="einteiliger Über- und Untertritt">
<calculation>
<point id="649" mx="-2.237" my="-1.20332" name="D" showLabel="true" type="single" x="60.2053" y="19.523"/>
<point angle="270" basePoint="649" id="650" length="#HlKn1t*2" lineColor="black" mx="-0.694508" my="0.893319" name="D1" showLabel="true" type="endLine" typeLine="hair"/>
<point firstPoint="649" id="651" length="CurrentLength/2" lineColor="black" mx="0.341752" my="-2.40541" name="D2" secondPoint="650" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="651" id="672" length="3" lineColor="black" mx="-0.862307" my="0.793318" name="D2p" notes="14.01.2022 von 2 zu 3" secondPoint="650" showLabel="true" type="alongLine" typeLine="none"/>
<point angle="0" firstPoint="649" id="652" length="3.75" lineColor="black" mx="2.82931" my="-2.40262" name="D3" secondPoint="650" showLabel="true" type="normal" typeLine="none"/>
<point angle="180" firstPoint="650" id="653" length="Line_D_D3" lineColor="black" mx="-0.635" my="2.61937" name="D4" secondPoint="651" showLabel="true" type="normal" typeLine="none"/>
<point firstPoint="652" id="655" mx="0.702452" my="2.58772" name="D5" secondPoint="672" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="655" id="656" length="6" lineColor="black" mx="2.0392" my="-0.441798" name="D6" notes="14.01.2022 von 4 zu 6" secondPoint="652" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="672" id="657" length="2" lineColor="black" mx="0.146187" my="1.93019" name="D7" notes="14.01.2022 von 1.5 zu 1.75&#10;21.09.2022 von 1.75 zu 2" secondPoint="655" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="657" id="658" mx="-0.202604" my="2.40771" name="D8" secondPoint="650" showLabel="true" type="pointOfIntersection"/>
<line firstPoint="658" id="659" lineColor="black" secondPoint="657" typeLine="hair"/>
<spline aScale="0" angle1="90" angle2="270" color="black" id="660" length1="1.5" length2="1.5" penStyle="hair" point1="657" point4="656" type="simpleInteractive"/>
<point angle="0" basePoint="651" curve="660" id="835" lineColor="black" mx="-0.767297" my="0.476253" name="D26" showLabel="true" type="curveIntersectAxis" typeLine="none"/>
<operation axisType="1" center="652" id="661" suffix="d1" type="flippingByAxis">
<source>
<item idObject="657"/>
<item idObject="660"/>
<item idObject="651"/>
<item idObject="658"/>
<item idObject="650"/>
<item idObject="649"/>
<item idObject="835"/>
</source>
<destination>
<item idObject="662" mx="2.74921" my="2.61997"/>
<item idObject="663"/>
<item idObject="664" mx="2.4689" my="-0.642517"/>
<item idObject="665" mx="-0.630139" my="2.83924"/>
<item idObject="666" mx="0.665088" my="1.27398"/>
<item idObject="667" mx="0.264583" my="0.396875"/>
<item idObject="836" mx="-0.332824" my="-1.65877"/>
</destination>
</operation>
<line firstPoint="649" id="668" lineColor="black" secondPoint="667" typeLine="hair"/>
<line firstPoint="650" id="669" lineColor="black" secondPoint="666" typeLine="dotLine"/>
<line firstPoint="665" id="670" lineColor="black" secondPoint="662" typeLine="hair"/>
<line firstPoint="667" id="671" lineColor="black" secondPoint="666" typeLine="hair"/>
<line firstPoint="651" id="673" lineColor="black" secondPoint="664" typeLine="dotLine"/>
<line firstPoint="650" id="674" lineColor="black" secondPoint="658" typeLine="hair"/>
<line firstPoint="665" id="675" lineColor="black" secondPoint="666" typeLine="hair"/>
<point firstPoint="652" id="676" length="0.5" lineColor="black" mx="-0.109418" my="-2.90402" name="D9" secondPoint="649" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="676" id="677" mx="-1.47094" my="1.8854" name="D10" secondPoint="651" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="677" id="678" length="4" lineColor="black" mx="1.9435" my="-1.19673" name="D11" secondPoint="676" showLabel="true" type="alongLine" typeLine="none"/>
<line firstPoint="676" id="679" lineColor="green" secondPoint="678" typeLine="hair"/>
<spline aScale="1" angle1="270" angle2="16" color="green" id="680" length1="3" length2="1.5" penStyle="hair" point1="678" point4="651" type="simpleInteractive"/>
<point firstPoint="649" id="681" length="#HKKnLB/2" lineColor="black" mx="-2.79963" my="-2.86594" name="D12" secondPoint="676" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="681" id="682" length="#HKKnLB" lineColor="black" mx="0.0943491" my="-4.1427" name="D13" secondPoint="652" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="681" id="683" length="CurrentLength/2" lineColor="black" mx="-1.21078" my="-3.14967" name="D14" secondPoint="682" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="683" id="684" mx="-1.97665" my="0.787902" name="D15" secondPoint="651" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="684" id="685" length="((CurrentLength+Line_B4_B20)/4)" lineColor="black" mx="0.0158717" my="-1.78424" name="D16" notes="23.09.2022 angepasst, sodass der Bund-Knopf auch berücksichtigt wird" secondPoint="683" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="684" id="686" length="((CurrentLength+Line_B4_B20)/4)*2" lineColor="black" mx="-0.380662" my="-1.76326" name="D17" notes="23.09.2022 angepasst, sodass der Bund-Knopf auch berücksichtigt wird" secondPoint="683" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="684" id="687" length="((CurrentLength+Line_B4_B20)/4)*3" lineColor="black" mx="-0.870311" my="-1.90128" name="D18" notes="23.09.2022 angepasst, sodass der Bund-Knopf auch berücksichtigt wird" secondPoint="683" showLabel="true" type="alongLine" typeLine="none"/>
<point firstPoint="681" id="688" mx="-1.32427" my="0.198269" name="D19" secondPoint="685" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="682" id="689" mx="-0.728449" my="0.198269" name="D20" secondPoint="685" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="681" id="690" mx="-1.32427" my="-0.0570825" name="D21" secondPoint="686" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="682" id="691" mx="-0.12914" my="0.419505" name="D22" secondPoint="686" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="681" id="692" mx="-2.60102" my="-0.113827" name="D23" secondPoint="687" showLabel="true" type="pointOfIntersection"/>
<point firstPoint="682" id="693" mx="2.46559" my="0.754312" name="D24" secondPoint="687" showLabel="true" type="pointOfIntersection"/>
<line firstPoint="688" id="694" lineColor="black" secondPoint="689" typeLine="hair"/>
<line firstPoint="690" id="695" lineColor="black" secondPoint="691" typeLine="hair"/>
<line firstPoint="692" id="696" lineColor="black" secondPoint="693" typeLine="hair"/>
<point firstPoint="652" id="704" mx="0.213232" my="1.88604" name="D25" secondPoint="651" showLabel="true" type="pointOfIntersection"/>
<operation axisType="1" center="649" id="705" suffix="d2" type="flippingByAxis">
<source>
<item idObject="652"/>
<item idObject="656"/>
<item idObject="660"/>
<item idObject="704"/>
<item idObject="657"/>
<item idObject="653"/>
<item idObject="658"/>
<item idObject="835"/>
</source>
<destination>
<item idObject="706" mx="-2.51115" my="-2.14587"/>
<item idObject="707" mx="-5.48287" my="0.0203572"/>
<item idObject="708"/>
<item idObject="709" mx="-4.30562" my="-0.527435"/>
<item idObject="710" mx="-2.65164" my="0.697775"/>
<item idObject="711" mx="-3.97279" my="1.48966"/>
<item idObject="712" mx="-2.30798" my="2.51041"/>
<item idObject="837" mx="-3.39208" my="1.07938"/>
</destination>
</operation>
<line firstPoint="706" id="713" lineColor="black" secondPoint="707" typeLine="hair"/>
<line firstPoint="706" id="714" lineColor="black" secondPoint="649" typeLine="hair"/>
<line firstPoint="710" id="715" lineColor="black" secondPoint="712" typeLine="hair"/>
<line firstPoint="712" id="716" lineColor="black" secondPoint="650" typeLine="hair"/>
<line firstPoint="712" id="717" lineColor="black" secondPoint="711" typeLine="dotLine"/>
<line firstPoint="711" id="718" lineColor="black" secondPoint="707" typeLine="dotLine"/>
<line firstPoint="709" id="719" lineColor="black" secondPoint="651" typeLine="dotLine"/>
<line firstPoint="656" id="720" lineColor="black" secondPoint="653" typeLine="dotLine"/>
<line firstPoint="656" id="721" lineColor="black" secondPoint="652" typeLine="hair"/>
</calculation>
<modeling/>
<details/>
<groups>
<group id="697" name="Konpflochkonstruktion" visible="true">
<item object="681" tool="681"/>
<item object="682" tool="682"/>
<item object="683" tool="683"/>
<item object="684" tool="684"/>
<item object="685" tool="685"/>
<item object="686" tool="686"/>
<item object="687" tool="687"/>
<item object="688" tool="688"/>
<item object="689" tool="689"/>
<item object="690" tool="690"/>
<item object="691" tool="691"/>
<item object="692" tool="692"/>
<item object="693" tool="693"/>
</group>
<group id="698" name="Knopflöcher" visible="true">
<item object="694" tool="694"/>
<item object="695" tool="695"/>
<item object="696" tool="696"/>
</group>
</groups>
</draw>
</pattern>

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<vit>
<!--Measurements created with Valentina v0.7.50.0 (https://smart-pattern.com.ua/).-->
<version>0.5.1</version>
<read-only>false</read-only>
<notes>Nach Messung wegen Büste am 16.03.2021
Brustumfang : 88 -&gt; 86
Taille: 79 -&gt; 76
Hüfte: 92 -&gt; 94
Halsumfang: 39.5 -&gt; 37</notes>
<unit>cm</unit>
<pm_system>998</pm_system>
<personal>
<customer>Ronan</customer>
<birth-date>1987-04-03</birth-date>
<gender>male</gender>
<email/>
</personal>
<body-measurements>
<m name="waist_natural_circ" value="82"/>
<m name="waist_to_hip_b" value="21"/>
<m name="neck_back_to_waist_b" value="43"/>
<m name="across_chest_f" value="35"/>
<m name="across_back_b" value="35"/>
<m name="neck_back_to_bust_b" value="22.5"/>
<m name="hip_circ" value="94"/>
<m name="hand_circ" value="22"/>
<m name="leg_waist_side_to_floor" value="98.5"/>
<m name="leg_crotch_to_floor" value="77.5"/>
<m name="height_knee" value="48"/>
<m name="height_calf" value="30"/>
<m name="leg_thigh_upper_circ" value="50"/>
<m name="leg_knee_circ" value="35.5"/>
<m name="leg_calf_circ" value="34.5"/>
<m name="leg_knee_circ_bent" value="38.5"/>
<m name="leg_ankle_circ" value="25.5"/>
<m name="leg_ankle_diag_circ" value="32"/>
<m name="height" value="172"/>
<m name="neck_circ" value="37"/>
<m name="bust_circ" value="86"/>
<m name="waist_circ" value="76&#10;"/>
<m name="arm_shoulder_tip_to_wrist" value="58"/>
<m name="arm_wrist_circ" value="16"/>
<m name="head_circ" value="55"/>
<m name="arm_lower_circ" value="26"/>
</body-measurements>
</vit>

View File

@ -67,6 +67,7 @@
<file>schema/pattern/v0.8.13.xsd</file> <file>schema/pattern/v0.8.13.xsd</file>
<file>schema/pattern/v0.9.0.xsd</file> <file>schema/pattern/v0.9.0.xsd</file>
<file>schema/pattern/v0.9.1.xsd</file> <file>schema/pattern/v0.9.1.xsd</file>
<file>schema/pattern/v0.9.2.xsd</file>
<file>schema/multisize_measurements/v0.3.0.xsd</file> <file>schema/multisize_measurements/v0.3.0.xsd</file>
<file>schema/multisize_measurements/v0.4.0.xsd</file> <file>schema/multisize_measurements/v0.4.0.xsd</file>
<file>schema/multisize_measurements/v0.4.1.xsd</file> <file>schema/multisize_measurements/v0.4.1.xsd</file>

View File

@ -0,0 +1,563 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="layout">
<xs:complexType>
<xs:sequence>
<xs:element name="properties">
<xs:complexType>
<xs:sequence>
<xs:element type="units" name="unit"/>
<xs:element type="xs:string" name="title"/>
<xs:element type="xs:string" name="description"/>
<xs:element name="control">
<xs:complexType>
<xs:attribute type="xs:boolean" name="warningSuperposition"/>
<xs:attribute type="xs:boolean" name="warningOutOfBound"/>
<xs:attribute type="xs:boolean" name="stickyEdges"/>
<xs:attribute type="xs:boolean" name="followGrainline"/>
<xs:attribute type="xs:float" name="piecesGap"/>
</xs:complexType>
</xs:element>
<xs:element name="tiles">
<xs:complexType>
<xs:sequence>
<xs:element name="size">
<xs:complexType>
<xs:attribute type="xs:float" name="width" use="required"/>
<xs:attribute type="xs:float" name="length" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="margin">
<xs:complexType>
<xs:attribute type="xs:float" name="top"/>
<xs:attribute type="xs:float" name="right"/>
<xs:attribute type="xs:float" name="bottom"/>
<xs:attribute type="xs:float" name="left"/>
<xs:attribute type="xs:boolean" name="ignoreMargins"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:boolean" name="visible"/>
<xs:attribute type="xs:string" name="matchingMarks"/>
<xs:attribute type="xs:boolean" name="printScheme"/>
<xs:attribute type="xs:boolean" name="tileNumber"/>
</xs:complexType>
</xs:element>
<xs:element name="scale">
<xs:complexType>
<xs:attribute type="LayoutScale" name="xScale"/>
<xs:attribute type="LayoutScale" name="yScale"/>
</xs:complexType>
</xs:element>
<xs:element name="watermark">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:boolean" name="showPreview" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="unplacedPieces">
<xs:complexType>
<xs:sequence>
<xs:element name="piece" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="seamLine">
<xs:complexType>
<xs:sequence>
<xs:element name="point" minOccurs="3" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:double" name="x" use="required"/>
<xs:attribute type="xs:double" name="y" use="required"/>
<xs:attribute type="xs:boolean" name="turnPoint" use="optional"/>
<xs:attribute type="xs:boolean" name="curvePoint" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="seamAllowance">
<xs:complexType>
<xs:sequence>
<xs:element name="point" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:double" name="x" use="required"/>
<xs:attribute type="xs:double" name="y" use="required"/>
<xs:attribute type="xs:boolean" name="turnPoint" use="optional"/>
<xs:attribute type="xs:boolean" name="curvePoint" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:boolean" name="enabled" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element name="grainline">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="PathOrEmpty">
<xs:attribute type="xs:boolean" name="enabled" use="optional"/>
<xs:attribute type="xs:float" name="angle" use="optional"/>
<xs:attribute type="ArrowDirection" name="arrowDirection" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="notches">
<xs:complexType>
<xs:sequence>
<xs:element name="notch" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:boolean" name="builtIn" use="optional"/>
<xs:attribute type="NotchType" name="type" use="optional"/>
<xs:attribute type="LinePath" name="baseLine" use="optional"/>
<xs:attribute type="LinesPath" name="path" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="internalPaths">
<xs:complexType>
<xs:sequence>
<xs:element name="internalPath" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="point" minOccurs="3" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:double" name="x" use="required"/>
<xs:attribute type="xs:double" name="y" use="required"/>
<xs:attribute type="xs:boolean" name="turnPoint" use="optional"/>
<xs:attribute type="xs:boolean" name="curvePoint" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:boolean" name="cut" use="optional"/>
<xs:attribute type="CurvePenStyle" name="penStyle" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="markers">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="marker" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:attribute type="Transformation" name="transform" use="required"/>
<xs:attribute type="MarkerType" name="type" use="required"/>
<xs:attribute type="PointPath" name="center" use="required"/>
<xs:attribute type="RectPath" name="box" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="labels">
<xs:complexType>
<xs:sequence>
<xs:element name="pieceLabel" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="lines">
<xs:complexType>
<xs:sequence>
<xs:element name="line" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:boolean" name="bold" use="optional"/>
<xs:attribute type="xs:boolean" name="italic" use="optional"/>
<xs:attribute type="xs:unsignedInt" name="alignment" use="optional"/>
<xs:attribute type="xs:unsignedInt" name="fontSize" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="font"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="shape" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="patternLabel" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="lines">
<xs:complexType>
<xs:sequence>
<xs:element name="line" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:boolean" name="bold" use="optional"/>
<xs:attribute type="xs:boolean" name="italic" use="optional"/>
<xs:attribute type="xs:unsignedInt" name="alignment" use="optional"/>
<xs:attribute type="xs:unsignedInt" name="fontSize" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="font"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="shape" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="uuid" use="required"/>
<xs:attribute type="xs:string" name="name"/>
<xs:attribute type="xs:boolean" name="mirrored"/>
<xs:attribute type="xs:boolean" name="forbidFlipping"/>
<xs:attribute type="xs:boolean" name="forceFlipping"/>
<xs:attribute type="Transformation" name="transform"/>
<xs:attribute type="xs:string" name="gradationLabel"/>
<xs:attribute type="xs:unsignedInt" name="copyNumber"/>
<xs:attribute type="xs:boolean" name="showSeamline"/>
<xs:attribute type="xs:float" name="xScale"/>
<xs:attribute type="xs:float" name="yScale"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="sheets">
<xs:complexType>
<xs:sequence>
<xs:element name="sheet" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element name="size">
<xs:complexType>
<xs:attribute type="xs:float" name="width" use="required"/>
<xs:attribute type="xs:float" name="length" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="margin">
<xs:complexType>
<xs:attribute type="xs:float" name="top"/>
<xs:attribute type="xs:float" name="right"/>
<xs:attribute type="xs:float" name="bottom"/>
<xs:attribute type="xs:float" name="left"/>
<xs:attribute type="xs:boolean" name="ignoreMargins"/>
</xs:complexType>
</xs:element>
<xs:element name="pieces">
<xs:complexType>
<xs:sequence>
<xs:element name="piece" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="seamLine">
<xs:complexType>
<xs:sequence>
<xs:element name="point" minOccurs="3" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:double" name="x" use="required"/>
<xs:attribute type="xs:double" name="y" use="required"/>
<xs:attribute type="xs:boolean" name="turnPoint" use="optional"/>
<xs:attribute type="xs:boolean" name="curvePoint" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="seamAllowance">
<xs:complexType>
<xs:sequence>
<xs:element name="point" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:double" name="x" use="required"/>
<xs:attribute type="xs:double" name="y" use="required"/>
<xs:attribute type="xs:boolean" name="turnPoint" use="optional"/>
<xs:attribute type="xs:boolean" name="curvePoint" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:boolean" name="enabled" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element name="grainline">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="PathOrEmpty">
<xs:attribute type="xs:boolean" name="enabled" use="optional"/>
<xs:attribute type="xs:float" name="angle" use="optional"/>
<xs:attribute type="ArrowDirection" name="arrowDirection" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="notches">
<xs:complexType>
<xs:sequence>
<xs:element name="notch" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:boolean" name="builtIn" use="optional"/>
<xs:attribute type="NotchType" name="type" use="optional"/>
<xs:attribute type="LinePath" name="baseLine" use="optional"/>
<xs:attribute type="LinesPath" name="path" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="internalPaths">
<xs:complexType>
<xs:sequence>
<xs:element name="internalPath" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="point" minOccurs="2" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:double" name="x" use="required"/>
<xs:attribute type="xs:double" name="y" use="required"/>
<xs:attribute type="xs:boolean" name="turnPoint" use="optional"/>
<xs:attribute type="xs:boolean" name="curvePoint" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:boolean" name="cut" use="optional"/>
<xs:attribute type="CurvePenStyle" name="penStyle" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="markers">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="marker" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:attribute type="Transformation" name="transform" use="required"/>
<xs:attribute type="MarkerType" name="type" use="required"/>
<xs:attribute type="PointPath" name="center" use="required"/>
<xs:attribute type="RectPath" name="box" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="labels">
<xs:complexType>
<xs:sequence>
<xs:element name="pieceLabel" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="lines">
<xs:complexType>
<xs:sequence>
<xs:element name="line" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:boolean" name="bold" use="optional"/>
<xs:attribute type="xs:boolean" name="italic" use="optional"/>
<xs:attribute type="AlignmentType" name="alignment" use="optional"/>
<xs:attribute type="xs:unsignedInt" name="fontSize" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="font"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="PathNotEmpty" name="shape" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="patternLabel" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="lines">
<xs:complexType>
<xs:sequence>
<xs:element name="line" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:boolean" name="bold" use="optional"/>
<xs:attribute type="xs:boolean" name="italic" use="optional"/>
<xs:attribute type="AlignmentType" name="alignment" use="optional"/>
<xs:attribute type="xs:unsignedInt" name="fontSize" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="font"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="PathNotEmpty" name="shape" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="uuid" use="required"/>
<xs:attribute type="xs:string" name="name"/>
<xs:attribute type="xs:boolean" name="mirrored"/>
<xs:attribute type="xs:boolean" name="forbidFlipping"/>
<xs:attribute type="xs:boolean" name="forceFlipping"/>
<xs:attribute type="Transformation" name="transform"/>
<xs:attribute type="xs:string" name="gradationLabel"/>
<xs:attribute type="xs:unsignedInt" name="copyNumber"/>
<xs:attribute type="xs:boolean" name="showSeamline"/>
<xs:attribute type="xs:float" name="xScale"/>
<xs:attribute type="xs:float" name="yScale"/>
<xs:attribute type="xs:float" name="zValue"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="GrainlineType" name="grainlineType"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="formatVersion" name="version" use="required"/>
</xs:complexType>
</xs:element>
<!--Types-->
<xs:simpleType name="formatVersion">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="units">
<xs:restriction base="xs:string">
<xs:enumeration value="mm"/>
<xs:enumeration value="cm"/>
<xs:enumeration value="inch"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="uuid">
<xs:restriction base="xs:string">
<xs:pattern value="|\{[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}\}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ArrowDirection">
<xs:restriction base="xs:string">
<xs:enumeration value="atFront"/>
<xs:enumeration value="atRear"/>
<xs:enumeration value="atBoth"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="NotchType">
<xs:restriction base="xs:unsignedInt">
<xs:enumeration value="0"/>
<!--OneLine-->
<xs:enumeration value="1"/>
<!--TwoLines-->
<xs:enumeration value="2"/>
<!--ThreeLines-->
<xs:enumeration value="3"/>
<!--TMark-->
<xs:enumeration value="4"/>
<!--VMark-->
<xs:enumeration value="5"/>
<!--VMark2-->
<xs:enumeration value="6"/>
<!--UMark-->
<xs:enumeration value="7"/>
<!--BoxMark-->
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="CurvePenStyle">
<xs:restriction base="xs:string">
<xs:enumeration value="hair"/>
<xs:enumeration value="dashLine"/>
<xs:enumeration value="dotLine"/>
<xs:enumeration value="dashDotLine"/>
<xs:enumeration value="dashDotDotLine"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="MarkerType">
<xs:restriction base="xs:unsignedInt">
<xs:enumeration value="0"/><!--Segment-->
<xs:enumeration value="1"/><!--Rectangle-->
<xs:enumeration value="2"/><!--Cross-->
<xs:enumeration value="3"/><!--Tshaped-->
<xs:enumeration value="4"/><!--Doubletree-->
<xs:enumeration value="5"/><!--Corner-->
<xs:enumeration value="6"/><!--Triangle-->
<xs:enumeration value="7"/><!--Hshaped-->
<xs:enumeration value="8"/><!--Button-->
<xs:enumeration value="9"/><!--Circle-->
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="AlignmentType">
<xs:restriction base="xs:unsignedInt">
<xs:enumeration value="0"/><!--default (no aligns)-->
<xs:enumeration value="1"/><!--aligns with the left edge-->
<xs:enumeration value="2"/><!--aligns with the right edge-->
<xs:enumeration value="4"/><!--Centers horizontally in the available space-->
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="Transformation">
<xs:restriction base="xs:string">
<xs:pattern value="([-+]?\d+\.?\d*([eE][-+]?\d+)?;){8,}[-+]?\d+\.?\d*([eE][-+]?\d+)?"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="PathNotEmpty">
<xs:restriction base="xs:string">
<xs:pattern value="([-+]?\d+\.?\d*([eE][-+]?\d+)?,[-+]?\d+\.?\d*([eE][-+]?\d+)?\s){0,}[-+]?\d+\.?\d*([eE][-+]?\d+)?,[-+]?\d+\.?\d*([eE][-+]?\d+)?"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="PathOrEmpty">
<xs:restriction base="xs:string">
<xs:pattern value="|([-+]?\d+\.?\d*([eE][-+]?\d+)?,[-+]?\d+\.?\d*([eE][-+]?\d+)?\s){0,}[-+]?\d+\.?\d*([eE][-+]?\d+)?,[-+]?\d+\.?\d*([eE][-+]?\d+)?"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="LinePath">
<xs:restriction base="xs:string">
<xs:pattern value="[-+]?\d+\.?\d*([eE][-+]?\d+)?,[-+]?\d+\.?\d*([eE][-+]?\d+)?;[-+]?\d+\.?\d*([eE][-+]?\d+)?,[-+]?\d+\.?\d*([eE][-+]?\d+)?"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="LinesPath">
<xs:restriction base="xs:string">
<xs:pattern value="([-+]?\d+\.?\d*([eE][-+]?\d+)?,[-+]?\d+\.?\d*([eE][-+]?\d+)?;[-+]?\d+\.?\d*([eE][-+]?\d+)?,[-+]?\d+\.?\d*([eE][-+]?\d+)?\*){0,}[-+]?\d+\.?\d*([eE][-+]?\d+)?,[-+]?\d+\.?\d*([eE][-+]?\d+)?;[-+]?\d+\.?\d*([eE][-+]?\d+)?,[-+]?\d+\.?\d*([eE][-+]?\d+)?"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="PointPath">
<xs:restriction base="xs:string">
<xs:pattern value="[-+]?\d+\.?\d*([eE][-+]?\d+)?,[-+]?\d+\.?\d*([eE][-+]?\d+)?"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="RectPath">
<xs:restriction base="xs:string">
<xs:pattern value="([-+]?\d+\.?\d*([eE][-+]?\d+)?;){3,}[-+]?\d+\.?\d*([eE][-+]?\d+)?"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="GrainlineType">
<xs:restriction base="xs:string">
<xs:enumeration value="horizontal"/>
<xs:enumeration value="vertical"/>
<xs:enumeration value="notFixed"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="LayoutScale">
<xs:restriction base="xs:float">
<xs:minInclusive value="0.01"/>
<xs:maxInclusive value="3"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>

File diff suppressed because it is too large Load Diff

View File

@ -129,6 +129,7 @@ const QString VAbstractPattern::AttrNodePassmark = QStringLiteral("passmark
const QString VAbstractPattern::AttrNodePassmarkLine = QStringLiteral("passmarkLine"); const QString VAbstractPattern::AttrNodePassmarkLine = QStringLiteral("passmarkLine");
const QString VAbstractPattern::AttrNodePassmarkAngle = QStringLiteral("passmarkAngle"); const QString VAbstractPattern::AttrNodePassmarkAngle = QStringLiteral("passmarkAngle");
const QString VAbstractPattern::AttrNodeShowSecondPassmark = QStringLiteral("showSecondPassmark"); const QString VAbstractPattern::AttrNodeShowSecondPassmark = QStringLiteral("showSecondPassmark");
const QString VAbstractPattern::AttrNodeTurnPoint = QStringLiteral("turnPoint");
const QString VAbstractPattern::AttrSABefore = QStringLiteral("before"); const QString VAbstractPattern::AttrSABefore = QStringLiteral("before");
const QString VAbstractPattern::AttrSAAfter = QStringLiteral("after"); const QString VAbstractPattern::AttrSAAfter = QStringLiteral("after");
const QString VAbstractPattern::AttrStart = QStringLiteral("start"); const QString VAbstractPattern::AttrStart = QStringLiteral("start");
@ -811,6 +812,9 @@ VPieceNode VAbstractPattern::ParseSANode(const QDomElement &domElement)
const QString passmarkLength = const QString passmarkLength =
VDomDocument::GetParametrEmptyString(domElement, VAbstractPattern::AttrPassmarkLength); VDomDocument::GetParametrEmptyString(domElement, VAbstractPattern::AttrPassmarkLength);
const bool turnPoint =
VDomDocument::GetParametrBool(domElement, VAbstractPattern::AttrNodeTurnPoint, trueStr);
const QString t = VDomDocument::GetParametrString(domElement, AttrType, VAbstractPattern::NodePoint); const QString t = VDomDocument::GetParametrString(domElement, AttrType, VAbstractPattern::NodePoint);
Tool tool; Tool tool;
@ -841,8 +845,7 @@ VPieceNode VAbstractPattern::ParseSANode(const QDomElement &domElement)
tool = Tool::NodeElArc; tool = Tool::NodeElArc;
break; break;
default: default:
VException e(QObject::tr("Wrong tag name '%1'.").arg(t)); throw VException(tr("Wrong tag name '%1'.").arg(t));
throw e;
} }
VPieceNode node(id, tool, reverse); VPieceNode node(id, tool, reverse);
node.SetFormulaSABefore(saBefore); node.SetFormulaSABefore(saBefore);
@ -856,6 +859,7 @@ VPieceNode VAbstractPattern::ParseSANode(const QDomElement &domElement)
node.SetPassmarkAngleType(passmarkAngle); node.SetPassmarkAngleType(passmarkAngle);
node.SetManualPassmarkLength(manualPassmarkLength); node.SetManualPassmarkLength(manualPassmarkLength);
node.SetFormulaPassmarkLength(passmarkLength); node.SetFormulaPassmarkLength(passmarkLength);
node.SetTurnPoint(turnPoint);
return node; return node;
} }

View File

@ -324,6 +324,7 @@ public:
static const QString AttrNodePassmarkLine; static const QString AttrNodePassmarkLine;
static const QString AttrNodePassmarkAngle; static const QString AttrNodePassmarkAngle;
static const QString AttrNodeShowSecondPassmark; static const QString AttrNodeShowSecondPassmark;
static const QString AttrNodeTurnPoint;
static const QString AttrSABefore; static const QString AttrSABefore;
static const QString AttrSAAfter; static const QString AttrSAAfter;
static const QString AttrStart; static const QString AttrStart;

View File

@ -28,6 +28,7 @@
#include "vlayoutconverter.h" #include "vlayoutconverter.h"
#include "../exception/vexception.h" #include "../exception/vexception.h"
#include "ifcdef.h" #include "ifcdef.h"
#include "../vlayout/vlayoutpoint.h"
/* /*
* Version rules: * Version rules:
@ -38,12 +39,61 @@
*/ */
const QString VLayoutConverter::LayoutMinVerStr = QStringLiteral("0.1.0"); const QString VLayoutConverter::LayoutMinVerStr = QStringLiteral("0.1.0");
const QString VLayoutConverter::LayoutMaxVerStr = QStringLiteral("0.1.2"); const QString VLayoutConverter::LayoutMaxVerStr = QStringLiteral("0.1.3");
const QString VLayoutConverter::CurrentSchema = QStringLiteral("://schema/layout/v0.1.2.xsd"); const QString VLayoutConverter::CurrentSchema = QStringLiteral("://schema/layout/v0.1.3.xsd");
//VLayoutConverter::LayoutMinVer; // <== DON'T FORGET TO UPDATE TOO!!!! //VLayoutConverter::LayoutMinVer; // <== DON'T FORGET TO UPDATE TOO!!!!
//VLayoutConverter::LayoutMaxVer; // <== DON'T FORGET TO UPDATE TOO!!!! //VLayoutConverter::LayoutMaxVer; // <== DON'T FORGET TO UPDATE TOO!!!!
namespace
{
// The list of all string we use for conversion
// Better to use global variables because repeating QStringLiteral blows up code size
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strPieceTag, (QLatin1String("piece"))) // NOLINT
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strSeamLineTag, (QLatin1String("seamLine"))) // NOLINT
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strSeamAllowanceTag, (QLatin1String("seamAllowance"))) // NOLINT
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strInternalPathsTag, (QLatin1String("internalPaths"))) // NOLINT
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strInternalPathTag, (QLatin1String("internalPath"))) // NOLINT
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strMarkersTag, (QLatin1String("markers"))) // NOLINT
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strMarkerTag, (QLatin1String("marker"))) // NOLINT
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strPointTag, (QLatin1String("point"))) // NOLINT
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strAttrX, (QLatin1String("x"))) // NOLINT
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strAttrY, (QLatin1String("y"))) // NOLINT
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strAttrTurnPoint, (QLatin1String("turnPoint"))) // NOLINT
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strAttrCurvePoint, (QLatin1String("curvePoint"))) // NOLINT
//const QChar groupSep = QLatin1Char(';');
const QChar coordintatesSep = QLatin1Char(',');
const QChar pointsSep = QLatin1Char(' ');
//const QChar itemsSep = QLatin1Char('*');
//---------------------------------------------------------------------------------------------------------------------
auto StringV0_1_2ToPoint(const QString &point) -> QPointF
{
QStringList coordinates = point.split(coordintatesSep);
if (coordinates.count() == 2)
{
return {coordinates.at(0).toDouble(), coordinates.at(1).toDouble()};
}
return {};
}
//---------------------------------------------------------------------------------------------------------------------
auto StringV0_1_2ToPath(const QString &path) -> QVector<QPointF>
{
QVector<QPointF> p;
QStringList points = path.split(pointsSep);
p.reserve(points.size());
for (const auto& point : points)
{
p.append(StringV0_1_2ToPoint(point));
}
return p;
}
} // namespace
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
VLayoutConverter::VLayoutConverter(const QString &fileName) VLayoutConverter::VLayoutConverter(const QString &fileName)
: VAbstractConverter(fileName) : VAbstractConverter(fileName)
@ -90,7 +140,8 @@ auto VLayoutConverter::XSDSchema(unsigned ver) const -> QString
{ {
std::make_pair(FormatVersion(0, 1, 0), QStringLiteral("://schema/layout/v0.1.0.xsd")), std::make_pair(FormatVersion(0, 1, 0), QStringLiteral("://schema/layout/v0.1.0.xsd")),
std::make_pair(FormatVersion(0, 1, 1), QStringLiteral("://schema/layout/v0.1.1.xsd")), std::make_pair(FormatVersion(0, 1, 1), QStringLiteral("://schema/layout/v0.1.1.xsd")),
std::make_pair(FormatVersion(0, 1, 2), CurrentSchema), std::make_pair(FormatVersion(0, 1, 2), QStringLiteral("://schema/layout/v0.1.2.xsd")),
std::make_pair(FormatVersion(0, 1, 3), CurrentSchema),
}; };
if (schemas.contains(ver)) if (schemas.contains(ver))
@ -108,10 +159,11 @@ void VLayoutConverter::ApplyPatches()
{ {
case (FormatVersion(0, 1, 0)): case (FormatVersion(0, 1, 0)):
case (FormatVersion(0, 1, 1)): case (FormatVersion(0, 1, 1)):
ToV0_1_2();
ValidateXML(XSDSchema(FormatVersion(0, 1, 2)));
Q_FALLTHROUGH();
case (FormatVersion(0, 1, 2)): case (FormatVersion(0, 1, 2)):
ToV0_1_3();
ValidateXML(XSDSchema(FormatVersion(0, 1, 3)));
Q_FALLTHROUGH();
case (FormatVersion(0, 1, 3)):
break; break;
default: default:
InvalidVersion(m_ver); InvalidVersion(m_ver);
@ -132,12 +184,78 @@ auto VLayoutConverter::IsReadOnly() const -> bool
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VLayoutConverter::ToV0_1_2() void VLayoutConverter::ConvertPiecesToV0_1_3()
{ {
// TODO. Delete if minimal supported version is 0.1.2 // TODO. Delete if minimal supported version is 0.1.3
Q_STATIC_ASSERT_X(VLayoutConverter::LayoutMinVer < FormatVersion(0, 1, 2), Q_STATIC_ASSERT_X(VLayoutConverter::LayoutMinVer < FormatVersion(0, 1, 3),
"Time to refactor the code."); "Time to refactor the code.");
SetVersion(QStringLiteral("0.1.2")); const QStringList types
{
*strSeamLineTag,
*strSeamAllowanceTag,
*strInternalPathTag
};
for (const auto &tagType : types)
{
QDomNodeList tags = elementsByTagName(tagType);
for (int i=0; i < tags.size(); ++i)
{
QDomElement node = tags.at(i).toElement();
ConvertPathToV0_1_3(node);
}
}
QDomNodeList tags = elementsByTagName(*strMarkerTag);
for (int i=0; i < tags.size(); ++i)
{
QDomElement node = tags.at(i).toElement();
RemoveAllChildren(node);
}
}
//---------------------------------------------------------------------------------------------------------------------
void VLayoutConverter::ConvertPathToV0_1_3(QDomElement &node)
{
QString oldPath = node.text();
if (oldPath.isEmpty())
{
return;
}
RemoveAllChildren(node);
QVector<VLayoutPoint> path;
CastTo(StringV0_1_2ToPath(oldPath), path);
for (auto &point : path)
{
QDomElement pointTag = createElement(*strPointTag);
SetAttribute(pointTag, *strAttrX, point.x());
SetAttribute(pointTag, *strAttrY, point.y());
if (point.TurnPoint())
{
SetAttribute(pointTag, *strAttrTurnPoint, point.TurnPoint());
}
if (point.CurvePoint())
{
SetAttribute(pointTag, *strAttrCurvePoint, point.CurvePoint());
}
node.appendChild(pointTag);
}
}
//---------------------------------------------------------------------------------------------------------------------
void VLayoutConverter::ToV0_1_3()
{
// TODO. Delete if minimal supported version is 0.1.3
Q_STATIC_ASSERT_X(VLayoutConverter::LayoutMinVer < FormatVersion(0, 1, 3),
"Time to refactor the code.");
ConvertPiecesToV0_1_3();
SetVersion(QStringLiteral("0.1.3"));
Save(); Save();
} }

View File

@ -44,7 +44,7 @@ public:
static const QString LayoutMaxVerStr; static const QString LayoutMaxVerStr;
static const QString CurrentSchema; static const QString CurrentSchema;
static Q_DECL_CONSTEXPR const unsigned LayoutMinVer = FormatVersion(0, 1, 0); static Q_DECL_CONSTEXPR const unsigned LayoutMinVer = FormatVersion(0, 1, 0);
static Q_DECL_CONSTEXPR const unsigned LayoutMaxVer = FormatVersion(0, 1, 2); static Q_DECL_CONSTEXPR const unsigned LayoutMaxVer = FormatVersion(0, 1, 3);
protected: protected:
void SetVersion(const QString &version) override; void SetVersion(const QString &version) override;
@ -61,7 +61,11 @@ protected:
auto IsReadOnly() const -> bool override; auto IsReadOnly() const -> bool override;
void ToV0_1_2(); void ConvertPiecesToV0_1_3();
void ConvertPieceToV0_1_3(const QDomElement &piece);
void ConvertPathToV0_1_3(QDomElement &node);
void ToV0_1_3();
private: private:
Q_DISABLE_COPY_MOVE(VLayoutConverter) // NOLINT Q_DISABLE_COPY_MOVE(VLayoutConverter) // NOLINT

View File

@ -60,8 +60,8 @@ class QDomElement;
*/ */
const QString VPatternConverter::PatternMinVerStr = QStringLiteral("0.1.4"); const QString VPatternConverter::PatternMinVerStr = QStringLiteral("0.1.4");
const QString VPatternConverter::PatternMaxVerStr = QStringLiteral("0.9.1"); const QString VPatternConverter::PatternMaxVerStr = QStringLiteral("0.9.2");
const QString VPatternConverter::CurrentSchema = QStringLiteral("://schema/pattern/v0.9.1.xsd"); const QString VPatternConverter::CurrentSchema = QStringLiteral("://schema/pattern/v0.9.2.xsd");
//VPatternConverter::PatternMinVer; // <== DON'T FORGET TO UPDATE TOO!!!! //VPatternConverter::PatternMinVer; // <== DON'T FORGET TO UPDATE TOO!!!!
//VPatternConverter::PatternMaxVer; // <== DON'T FORGET TO UPDATE TOO!!!! //VPatternConverter::PatternMaxVer; // <== DON'T FORGET TO UPDATE TOO!!!!
@ -266,7 +266,8 @@ auto VPatternConverter::XSDSchema(unsigned ver) const -> QString
std::make_pair(FormatVersion(0, 8, 12), QStringLiteral("://schema/pattern/v0.8.12.xsd")), std::make_pair(FormatVersion(0, 8, 12), QStringLiteral("://schema/pattern/v0.8.12.xsd")),
std::make_pair(FormatVersion(0, 8, 13), QStringLiteral("://schema/pattern/v0.8.13.xsd")), std::make_pair(FormatVersion(0, 8, 13), QStringLiteral("://schema/pattern/v0.8.13.xsd")),
std::make_pair(FormatVersion(0, 9, 0), QStringLiteral("://schema/pattern/v0.9.0.xsd")), std::make_pair(FormatVersion(0, 9, 0), QStringLiteral("://schema/pattern/v0.9.0.xsd")),
std::make_pair(FormatVersion(0, 9, 1), CurrentSchema) std::make_pair(FormatVersion(0, 9, 1), QStringLiteral("://schema/pattern/v0.9.1.xsd")),
std::make_pair(FormatVersion(0, 9, 2), CurrentSchema)
}; };
if (schemas.contains(ver)) if (schemas.contains(ver))
@ -374,6 +375,10 @@ void VPatternConverter::ApplyPatches()
ValidateXML(CurrentSchema); ValidateXML(CurrentSchema);
Q_FALLTHROUGH(); Q_FALLTHROUGH();
case (FormatVersion(0, 9, 1)): case (FormatVersion(0, 9, 1)):
ToV0_9_2();
ValidateXML(CurrentSchema);
Q_FALLTHROUGH();
case (FormatVersion(0, 9, 2)):
break; break;
default: default:
InvalidVersion(m_ver); InvalidVersion(m_ver);
@ -391,7 +396,7 @@ void VPatternConverter::DowngradeToCurrentMaxVersion()
bool VPatternConverter::IsReadOnly() const bool VPatternConverter::IsReadOnly() const
{ {
// Check if attribute readOnly was not changed in file format // Check if attribute readOnly was not changed in file format
Q_STATIC_ASSERT_X(VPatternConverter::PatternMaxVer == FormatVersion(0, 9, 1), Q_STATIC_ASSERT_X(VPatternConverter::PatternMaxVer == FormatVersion(0, 9, 2),
"Check attribute readOnly."); "Check attribute readOnly.");
// Possibly in future attribute readOnly will change position etc. // Possibly in future attribute readOnly will change position etc.
@ -562,6 +567,17 @@ void VPatternConverter::ToV0_9_1()
Save(); Save();
} }
//---------------------------------------------------------------------------------------------------------------------
void VPatternConverter::ToV0_9_2()
{
// TODO. Delete if minimal supported version is 0.9.2
Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FormatVersion(0, 9, 2),
"Time to refactor the code.");
SetVersion(QStringLiteral("0.9.2"));
Save();
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VPatternConverter::TagUnitToV0_2_0() void VPatternConverter::TagUnitToV0_2_0()
{ {

View File

@ -53,7 +53,7 @@ public:
static const QString PatternMaxVerStr; static const QString PatternMaxVerStr;
static const QString CurrentSchema; static const QString CurrentSchema;
static Q_DECL_CONSTEXPR const unsigned PatternMinVer = FormatVersion(0, 1, 4); static Q_DECL_CONSTEXPR const unsigned PatternMinVer = FormatVersion(0, 1, 4);
static Q_DECL_CONSTEXPR const unsigned PatternMaxVer = FormatVersion(0, 9, 1); static Q_DECL_CONSTEXPR const unsigned PatternMaxVer = FormatVersion(0, 9, 2);
protected: protected:
void Save() override; void Save() override;
@ -86,6 +86,7 @@ private:
void ToV0_8_8(); void ToV0_8_8();
void ToV0_9_0(); void ToV0_9_0();
void ToV0_9_1(); void ToV0_9_1();
void ToV0_9_2();
void TagUnitToV0_2_0(); void TagUnitToV0_2_0();
void TagIncrementToV0_2_0(); void TagIncrementToV0_2_0();

View File

@ -53,7 +53,9 @@
#endif // QT_VERSION < QT_VERSION_CHECK(5, 5, 0) #endif // QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
#include "dxiface.h" #include "dxiface.h"
#include "../vlayout/vlayoutpiece.h" #include "../vlayout/vlayoutpiece.h"
#include "../vlayout/vlayoutpoint.h"
#include "../vgeometry/vgeometrydef.h" #include "../vgeometry/vgeometrydef.h"
#include "../vgeometry/vlayoutplacelabel.h"
static const qreal AAMATextHeight = 2.5; static const qreal AAMATextHeight = 2.5;
@ -61,8 +63,8 @@ namespace
{ {
Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer0, (UTF8STRING("0"))) // NOLINT Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer0, (UTF8STRING("0"))) // NOLINT
Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer1, (UTF8STRING("1"))) // NOLINT Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer1, (UTF8STRING("1"))) // NOLINT
//Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer2, (UTF8STRING("2"))) // NOLINT Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer2, (UTF8STRING("2"))) // NOLINT
//Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer3, (UTF8STRING("3"))) // NOLINT Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer3, (UTF8STRING("3"))) // NOLINT
Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer4, (UTF8STRING("4"))) // NOLINT Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer4, (UTF8STRING("4"))) // NOLINT
//Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer5, (UTF8STRING("5"))) // NOLINT //Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer5, (UTF8STRING("5"))) // NOLINT
//Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer6, (UTF8STRING("6"))) // NOLINT //Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer6, (UTF8STRING("6"))) // NOLINT
@ -87,9 +89,9 @@ Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer86, (UTF8STRING("86"))) // NOLI
Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer87, (UTF8STRING("87"))) // NOLINT Q_GLOBAL_STATIC_WITH_ARGS(const UTF8STRING, layer87, (UTF8STRING("87"))) // NOLINT
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
auto PieceOutline(const VLayoutPiece &detail) -> QVector<QPointF> auto PieceOutline(const VLayoutPiece &detail) -> QVector<VLayoutPoint>
{ {
QVector<QPointF> outline; QVector<VLayoutPoint> outline;
if (detail.IsSeamAllowance() && not detail.IsSeamAllowanceBuiltIn()) if (detail.IsSeamAllowance() && not detail.IsSeamAllowanceBuiltIn())
{ {
outline = detail.GetMappedSeamAllowancePoints(); outline = detail.GetMappedSeamAllowancePoints();
@ -692,8 +694,7 @@ auto VDxfEngine::ExportToAAMA(const QVector<VLayoutPiece> &details) -> bool
return false; return false;
} }
m_input = QSharedPointer<dx_iface>(new dx_iface(GetFileNameForLocale(), m_version, m_varMeasurement, m_input = QSharedPointer<dx_iface>::create(GetFileNameForLocale(), m_version, m_varMeasurement, m_varInsunits);
m_varInsunits));
m_input->AddAAMAHeaderData(); m_input->AddAAMAHeaderData();
if (m_version > DRW::AC1009) if (m_version > DRW::AC1009)
{ {
@ -705,7 +706,8 @@ auto VDxfEngine::ExportToAAMA(const QVector<VLayoutPiece> &details) -> bool
for(auto detail : details) for(auto detail : details)
{ {
auto *detailBlock = new dx_ifaceBlock();
auto detailBlock = QSharedPointer<dx_ifaceBlock>::create();
QString blockName = detail.GetName(); QString blockName = detail.GetName();
if (m_version <= DRW::AC1009) if (m_version <= DRW::AC1009)
@ -726,80 +728,98 @@ auto VDxfEngine::ExportToAAMA(const QVector<VLayoutPiece> &details) -> bool
ExportPieceText(detailBlock, detail); ExportPieceText(detailBlock, detail);
ExportAAMADrill(detailBlock, detail); ExportAAMADrill(detailBlock, detail);
m_input->AddBlock(detailBlock); m_input->AddBlock(detailBlock.get());
auto *insert = new DRW_Insert(); QScopedPointer<DRW_Insert> insert(new DRW_Insert());
insert->name = blockName.toStdString(); insert->name = blockName.toStdString();
insert->layer = *layer1; insert->layer = *layer1;
m_input->AddEntity(insert); m_input->AddEntity(insert.take());
} }
return m_input->fileExport(m_binary); return m_input->fileExport(m_binary);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VDxfEngine::ExportAAMAOutline(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail) void VDxfEngine::ExportAAMAOutline(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail)
{ {
DRW_Entity *e = AAMAPolygon(PieceOutline(detail), *layer1, true); QVector<VLayoutPoint> points = PieceOutline(detail);
if (e)
if (DRW_Entity *e = AAMAPolygon(points, *layer1, true))
{ {
detailBlock->ent.push_back(e); detailBlock->ent.push_back(e);
} }
ExportTurnPoints(detailBlock, points);
ExportCurvePoints(detailBlock, points);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VDxfEngine::ExportAAMADraw(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail) void VDxfEngine::ExportAAMADraw(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail)
{ {
if (detail.IsSeamAllowance() && not detail.IsHideMainPath() && not detail.IsSeamAllowanceBuiltIn()) if (detail.IsSeamAllowance() && not detail.IsHideMainPath() && not detail.IsSeamAllowanceBuiltIn())
{ {
QVector<VLayoutPoint> points = detail.GetMappedContourPoints();
if (DRW_Entity *e = AAMAPolygon(detail.GetMappedContourPoints(), *layer8, true)) if (DRW_Entity *e = AAMAPolygon(detail.GetMappedContourPoints(), *layer8, true))
{ {
detailBlock->ent.push_back(e); detailBlock->ent.push_back(e);
} }
ExportTurnPoints(detailBlock, points);
ExportCurvePoints(detailBlock, points);
} }
const QVector<QVector<QPointF>> drawIntCut = detail.MappedInternalPathsForCut(false); const QVector<QVector<VLayoutPoint>> drawIntLine = detail.MappedInternalPathsForCut(false);
for(const auto &intCut : drawIntCut) for(const auto &intLine : drawIntLine)
{ {
if (DRW_Entity *e = AAMAPolygon(intCut, *layer8, false)) if (DRW_Entity *e = AAMAPolygon(intLine, *layer8, false))
{ {
detailBlock->ent.push_back(e); detailBlock->ent.push_back(e);
} }
ExportTurnPoints(detailBlock, intLine);
ExportCurvePoints(detailBlock, intLine);
} }
const QVector<VLayoutPlaceLabel> labels = detail.GetMappedPlaceLabels(); const QVector<VLayoutPlaceLabel> labels = detail.GetPlaceLabels();
for(const auto &label : labels) for(const auto &label : labels)
{ {
if (label.type != PlaceLabelType::Doubletree && label.type != PlaceLabelType::Button if (label.Type() != PlaceLabelType::Doubletree && label.Type() != PlaceLabelType::Button
&& label.type != PlaceLabelType::Circle) && label.Type() != PlaceLabelType::Circle)
{ {
for(const auto &p : qAsConst(label.shape)) PlaceLabelImg shape = detail.MapPlaceLabelShape(VAbstractPiece::PlaceLabelShape(label));
for(const auto &points : shape)
{ {
if (DRW_Entity *e = AAMAPolygon(p, *layer8, false)) if (DRW_Entity *e = AAMAPolygon(points, *layer8, false))
{ {
detailBlock->ent.push_back(e); detailBlock->ent.push_back(e);
} }
ExportTurnPoints(detailBlock, points);
ExportCurvePoints(detailBlock, points);
} }
} }
} }
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VDxfEngine::ExportAAMAIntcut(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail) void VDxfEngine::ExportAAMAIntcut(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail)
{ {
QVector<QVector<QPointF>> drawIntCut = detail.MappedInternalPathsForCut(true); QVector<QVector<VLayoutPoint>> drawIntCut = detail.MappedInternalPathsForCut(true);
for(auto &intCut : drawIntCut) for(auto &intCut : drawIntCut)
{ {
if (DRW_Entity *e = AAMAPolygon(intCut, *layer11, false)) if (DRW_Entity *e = AAMAPolygon(intCut, *layer11, false))
{ {
detailBlock->ent.push_back(e); detailBlock->ent.push_back(e);
} }
ExportTurnPoints(detailBlock, intCut);
ExportCurvePoints(detailBlock, intCut);
} }
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VDxfEngine::ExportAAMANotch(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail) void VDxfEngine::ExportAAMANotch(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail)
{ {
if (detail.IsSeamAllowance()) if (detail.IsSeamAllowance())
{ {
@ -818,7 +838,7 @@ void VDxfEngine::ExportAAMANotch(dx_ifaceBlock *detailBlock, const VLayoutPiece
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VDxfEngine::ExportAAMAGrainline(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail) void VDxfEngine::ExportAAMAGrainline(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail)
{ {
const QVector<QPointF> grainline = detail.GetMappedGrainline(); const QVector<QPointF> grainline = detail.GetMappedGrainline();
if (grainline.count() > 1) if (grainline.count() > 1)
@ -831,7 +851,7 @@ void VDxfEngine::ExportAAMAGrainline(dx_ifaceBlock *detailBlock, const VLayoutPi
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VDxfEngine::ExportPieceText(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail) void VDxfEngine::ExportPieceText(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail)
{ {
const QStringList list = detail.GetPieceText(); const QStringList list = detail.GetPieceText();
const QPointF startPos = detail.GetPieceTextPosition(); const QPointF startPos = detail.GetPieceTextPosition();
@ -863,22 +883,17 @@ void VDxfEngine::ExportStyleSystemText(const QSharedPointer<dx_iface> &input, co
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VDxfEngine::ExportAAMADrill(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail) void VDxfEngine::ExportAAMADrill(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail)
{ {
const QVector<VLayoutPlaceLabel> labels = detail.GetMappedPlaceLabels(); const QVector<VLayoutPlaceLabel> labels = detail.GetPlaceLabels();
for(const auto &label : labels) for(const auto &label : labels)
{ {
if (label.type == PlaceLabelType::Doubletree || label.type == PlaceLabelType::Button if (label.Type() == PlaceLabelType::Doubletree || label.Type() == PlaceLabelType::Button
|| label.type == PlaceLabelType::Circle) || label.Type() == PlaceLabelType::Circle)
{ {
const QPointF center = detail.GetMatrix().map(label.center); const QPointF center = detail.GetMatrix().map(label.Center());
auto *point = new DRW_Point(); detailBlock->ent.push_back(AAMAPoint(center, *layer13));
point->basePoint = DRW_Coord(FromPixel(center.x(), m_varInsunits),
FromPixel(GetSize().height() - center.y(), m_varInsunits), 0);
point->layer = *layer13;
detailBlock->ent.push_back(point);
} }
} }
} }
@ -906,7 +921,7 @@ auto VDxfEngine::ExportToASTM(const QVector<VLayoutPiece> &details) -> bool
for(auto detail : details) for(auto detail : details)
{ {
auto *detailBlock = new dx_ifaceBlock(); auto detailBlock = QSharedPointer<dx_ifaceBlock>::create();
QString blockName = detail.GetName(); QString blockName = detail.GetName();
if (m_version <= DRW::AC1009) if (m_version <= DRW::AC1009)
@ -929,44 +944,45 @@ auto VDxfEngine::ExportToASTM(const QVector<VLayoutPiece> &details) -> bool
ExportASTMDrill(detailBlock, detail); ExportASTMDrill(detailBlock, detail);
ExportASTMAnnotationText(detailBlock, detail); ExportASTMAnnotationText(detailBlock, detail);
m_input->AddBlock(detailBlock); m_input->AddBlock(detailBlock.get());
auto *insert = new DRW_Insert(); QScopedPointer<DRW_Insert> insert(new DRW_Insert());
insert->name = blockName.toStdString(); insert->name = blockName.toStdString();
insert->layer = *layer1; insert->layer = *layer1;
m_input->AddEntity(insert); m_input->AddEntity(insert.take());
} }
return m_input->fileExport(m_binary); return m_input->fileExport(m_binary);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VDxfEngine::ExportASTMPieceBoundary(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail) void VDxfEngine::ExportASTMPieceBoundary(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail)
{ {
QVector<QPointF> pieceBoundary = PieceOutline(detail); QVector<VLayoutPoint> pieceBoundary = PieceOutline(detail);
// Piece boundary // Piece boundary
DRW_Entity *e = AAMAPolygon(pieceBoundary, *layer1, true); if (DRW_Entity *e = AAMAPolygon(pieceBoundary, *layer1, true))
if (e)
{ {
detailBlock->ent.push_back(e); detailBlock->ent.push_back(e);
} }
ExportTurnPoints(detailBlock, pieceBoundary);
ExportCurvePoints(detailBlock, pieceBoundary);
// Piece boundary quality validation curves // Piece boundary quality validation curves
DRW_Entity *q = AAMAPolygon(pieceBoundary, *layer84, true); if (DRW_Entity *q = AAMAPolygon(pieceBoundary, *layer84, true))
if (q)
{ {
detailBlock->ent.push_back(q); detailBlock->ent.push_back(q);
} }
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VDxfEngine::ExportASTMSewLine(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail) void VDxfEngine::ExportASTMSewLine(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail)
{ {
if (detail.IsSeamAllowance() && not detail.IsHideMainPath() && not detail.IsSeamAllowanceBuiltIn()) if (detail.IsSeamAllowance() && not detail.IsHideMainPath() && not detail.IsSeamAllowanceBuiltIn())
{ {
QVector<QPointF> sewLine = detail.GetMappedContourPoints(); QVector<VLayoutPoint> sewLine = detail.GetMappedContourPoints();
// Sew lines // Sew lines
if (DRW_Entity *e = AAMAPolygon(sewLine, *layer14, true)) if (DRW_Entity *e = AAMAPolygon(sewLine, *layer14, true))
@ -974,6 +990,9 @@ void VDxfEngine::ExportASTMSewLine(dx_ifaceBlock *detailBlock, const VLayoutPiec
detailBlock->ent.push_back(e); detailBlock->ent.push_back(e);
} }
ExportTurnPoints(detailBlock, sewLine);
ExportCurvePoints(detailBlock, sewLine);
// Sew lines quality validation curves // Sew lines quality validation curves
if (DRW_Entity *e = AAMAPolygon(sewLine, *layer87, true)) if (DRW_Entity *e = AAMAPolygon(sewLine, *layer87, true))
{ {
@ -983,31 +1002,35 @@ void VDxfEngine::ExportASTMSewLine(dx_ifaceBlock *detailBlock, const VLayoutPiec
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VDxfEngine::ExportASTMInternalLine(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail) void VDxfEngine::ExportASTMInternalLine(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail)
{ {
const QVector<QVector<QPointF>> drawIntCut = detail.MappedInternalPathsForCut(false); const QVector<QVector<VLayoutPoint>> drawIntLine = detail.MappedInternalPathsForCut(false);
for(const auto &intCut : drawIntCut) for(const auto &intLine : drawIntLine)
{ {
// Internal line // Internal line
if (DRW_Entity *e = AAMAPolygon(intCut, *layer8, false)) if (DRW_Entity *e = AAMAPolygon(intLine, *layer8, false))
{ {
detailBlock->ent.push_back(e); detailBlock->ent.push_back(e);
} }
ExportTurnPoints(detailBlock, intLine);
ExportCurvePoints(detailBlock, intLine);
// Internal lines quality validation curves // Internal lines quality validation curves
if (DRW_Entity *e = AAMAPolygon(intCut, *layer85, false)) if (DRW_Entity *e = AAMAPolygon(intLine, *layer85, false))
{ {
detailBlock->ent.push_back(e); detailBlock->ent.push_back(e);
} }
} }
const QVector<VLayoutPlaceLabel> labels = detail.GetMappedPlaceLabels(); const QVector<VLayoutPlaceLabel> labels = detail.GetPlaceLabels();
for(const auto &label : labels) for(const auto &label : labels)
{ {
if (label.type != PlaceLabelType::Doubletree && label.type != PlaceLabelType::Button if (label.Type() != PlaceLabelType::Doubletree && label.Type() != PlaceLabelType::Button
&& label.type != PlaceLabelType::Circle) && label.Type() != PlaceLabelType::Circle)
{ {
for(const auto &p : qAsConst(label.shape)) PlaceLabelImg shape = detail.MapPlaceLabelShape(VAbstractPiece::PlaceLabelShape(label));
for(const auto &p : shape)
{ {
// Internal line (placelabel) // Internal line (placelabel)
if (DRW_Entity *e = AAMAPolygon(p, *layer8, false)) if (DRW_Entity *e = AAMAPolygon(p, *layer8, false))
@ -1015,6 +1038,9 @@ void VDxfEngine::ExportASTMInternalLine(dx_ifaceBlock *detailBlock, const VLayou
detailBlock->ent.push_back(e); detailBlock->ent.push_back(e);
} }
ExportTurnPoints(detailBlock, p);
ExportCurvePoints(detailBlock, p);
// Internal lines quality validation curves // Internal lines quality validation curves
if (DRW_Entity *e = AAMAPolygon(p, *layer85, false)) if (DRW_Entity *e = AAMAPolygon(p, *layer85, false))
{ {
@ -1026,9 +1052,9 @@ void VDxfEngine::ExportASTMInternalLine(dx_ifaceBlock *detailBlock, const VLayou
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VDxfEngine::ExportASTMInternalCutout(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail) void VDxfEngine::ExportASTMInternalCutout(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail)
{ {
QVector<QVector<QPointF>> drawIntCut = detail.MappedInternalPathsForCut(true); QVector<QVector<VLayoutPoint>> drawIntCut = detail.MappedInternalPathsForCut(true);
for(auto &intCut : drawIntCut) for(auto &intCut : drawIntCut)
{ {
// Internal cutout // Internal cutout
@ -1037,6 +1063,9 @@ void VDxfEngine::ExportASTMInternalCutout(dx_ifaceBlock *detailBlock, const VLay
detailBlock->ent.push_back(e); detailBlock->ent.push_back(e);
} }
ExportTurnPoints(detailBlock, intCut);
ExportCurvePoints(detailBlock, intCut);
// Internal cutouts quality validation curves // Internal cutouts quality validation curves
if (DRW_Entity *e = AAMAPolygon(intCut, *layer86, false)) if (DRW_Entity *e = AAMAPolygon(intCut, *layer86, false))
{ {
@ -1046,7 +1075,7 @@ void VDxfEngine::ExportASTMInternalCutout(dx_ifaceBlock *detailBlock, const VLay
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VDxfEngine::ExportASTMAnnotationText(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail) void VDxfEngine::ExportASTMAnnotationText(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail)
{ {
QString name = detail.GetName(); QString name = detail.GetName();
QPointF textPos = detail.VLayoutPiece::DetailBoundingRect().center(); QPointF textPos = detail.VLayoutPiece::DetailBoundingRect().center();
@ -1056,22 +1085,17 @@ void VDxfEngine::ExportASTMAnnotationText(dx_ifaceBlock *detailBlock, const VLay
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VDxfEngine::ExportASTMDrill(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail) void VDxfEngine::ExportASTMDrill(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail)
{ {
const QVector<VLayoutPlaceLabel> labels = detail.GetMappedPlaceLabels(); const QVector<VLayoutPlaceLabel> labels = detail.GetPlaceLabels();
for(const auto &label : labels) for(const auto &label : labels)
{ {
if (label.type == PlaceLabelType::Doubletree || label.type == PlaceLabelType::Button if (label.Type() == PlaceLabelType::Doubletree || label.Type() == PlaceLabelType::Button
|| label.type == PlaceLabelType::Circle) || label.Type() == PlaceLabelType::Circle)
{ {
const QPointF center = detail.GetMatrix().map(label.center); const QPointF center = detail.GetMatrix().map(label.Center());
auto *point = new DRW_Point(); detailBlock->ent.push_back(AAMAPoint(center, *layer13));
point->basePoint = DRW_Coord(FromPixel(center.x(), m_varInsunits),
FromPixel(GetSize().height() - center.y(), m_varInsunits), 0);
point->layer = *layer13;
detailBlock->ent.push_back(point);
// TODO. Investigate drill category // TODO. Investigate drill category
// QPointF pos(center.x(), center.y() - ToPixel(AAMATextHeight, varInsunits)); // QPointF pos(center.x(), center.y() - ToPixel(AAMATextHeight, varInsunits));
@ -1081,7 +1105,7 @@ void VDxfEngine::ExportASTMDrill(dx_ifaceBlock *detailBlock, const VLayoutPiece
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VDxfEngine::ExportASTMNotch(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail) void VDxfEngine::ExportASTMNotch(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail)
{ {
if (detail.IsSeamAllowance()) if (detail.IsSeamAllowance())
{ {
@ -1141,7 +1165,34 @@ void VDxfEngine::ExportASTMNotch(dx_ifaceBlock *detailBlock, const VLayoutPiece
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
auto VDxfEngine::AAMAPolygon(const QVector<QPointF> &polygon, const UTF8STRING &layer, bool forceClosed) -> DRW_Entity * void VDxfEngine::ExportTurnPoints(const QSharedPointer<dx_ifaceBlock> &detailBlock,
const QVector<VLayoutPoint> &points) const
{
for(const auto &p : qAsConst(points))
{
if (p.TurnPoint())
{
detailBlock->ent.push_back(AAMAPoint(p, *layer2));
}
}
}
//---------------------------------------------------------------------------------------------------------------------
void VDxfEngine::ExportCurvePoints(const QSharedPointer<dx_ifaceBlock> &detailBlock,
const QVector<VLayoutPoint> &points) const
{
for(const auto &p : qAsConst(points))
{
if (p.CurvePoint() && not p.TurnPoint())
{
detailBlock->ent.push_back(AAMAPoint(p, *layer3));
}
}
}
//---------------------------------------------------------------------------------------------------------------------
auto VDxfEngine::AAMAPolygon(const QVector<VLayoutPoint> &polygon, const UTF8STRING &layer,
bool forceClosed) -> DRW_Entity *
{ {
if (polygon.isEmpty()) if (polygon.isEmpty())
{ {
@ -1186,6 +1237,16 @@ auto VDxfEngine::AAMAText(const QPointF &pos, const QString &text, const UTF8STR
return textLine; return textLine;
} }
//---------------------------------------------------------------------------------------------------------------------
auto VDxfEngine::AAMAPoint(const QPointF &pos, const UTF8STRING &layer) const -> DRW_Point *
{
auto *point = new DRW_Point();
point->basePoint = DRW_Coord(FromPixel(pos.x(), m_varInsunits),
FromPixel(GetSize().height() - pos.y(), m_varInsunits), 0);
point->layer = layer;
return point;
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
auto VDxfEngine::FromUnicodeToCodec(const QString &str, QTextCodec *codec) -> std::string auto VDxfEngine::FromUnicodeToCodec(const QString &str, QTextCodec *codec) -> std::string
{ {
@ -1203,8 +1264,9 @@ auto VDxfEngine::GetFileNameForLocale() const -> std::string
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
template<class P, class V> template<class P, class V, class C>
auto VDxfEngine::CreateAAMAPolygon(const QVector<QPointF> &polygon, const UTF8STRING &layer, bool forceClosed) -> P * auto VDxfEngine::CreateAAMAPolygon(const QVector<C> &polygon, const UTF8STRING &layer,
bool forceClosed) -> P *
{ {
auto *poly = new P(); auto *poly = new P();
poly->layer = layer; poly->layer = layer;
@ -1221,7 +1283,7 @@ auto VDxfEngine::CreateAAMAPolygon(const QVector<QPointF> &polygon, const UTF8ST
} }
} }
for (auto p : polygon) for (const auto &p : polygon)
{ {
poly->addVertex(V(FromPixel(p.x(), m_varInsunits), poly->addVertex(V(FromPixel(p.x(), m_varInsunits),
FromPixel(GetSize().height() - p.y(), m_varInsunits))); FromPixel(GetSize().height() - p.y(), m_varInsunits)));

View File

@ -49,6 +49,8 @@ class DRW_Text;
class VLayoutPiece; class VLayoutPiece;
class DRW_Entity; class DRW_Entity;
class dx_ifaceBlock; class dx_ifaceBlock;
class VLayoutPoint;
class DRW_Point;
class VDxfEngine final : public QPaintEngine class VDxfEngine final : public QPaintEngine
{ {
@ -123,31 +125,37 @@ private:
Q_REQUIRED_RESULT auto ToPixel(double val, const VarInsunits &unit) const -> double; Q_REQUIRED_RESULT auto ToPixel(double val, const VarInsunits &unit) const -> double;
auto ExportToAAMA(const QVector<VLayoutPiece> &details) -> bool; auto ExportToAAMA(const QVector<VLayoutPiece> &details) -> bool;
void ExportAAMAOutline(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail); void ExportAAMAOutline(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail);
void ExportAAMADraw(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail); void ExportAAMADraw(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail);
void ExportAAMAIntcut(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail); void ExportAAMAIntcut(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail);
void ExportAAMANotch(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail); void ExportAAMANotch(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail);
void ExportAAMAGrainline(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail); void ExportAAMAGrainline(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail);
void ExportPieceText(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail); void ExportPieceText(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail);
void ExportStyleSystemText(const QSharedPointer<dx_iface> &input, const QVector<VLayoutPiece> &details); void ExportStyleSystemText(const QSharedPointer<dx_iface> &input, const QVector<VLayoutPiece> &details);
void ExportAAMADrill(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail); void ExportAAMADrill(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail);
auto ExportToASTM(const QVector<VLayoutPiece> &details) -> bool; auto ExportToASTM(const QVector<VLayoutPiece> &details) -> bool;
void ExportASTMPieceBoundary(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail); void ExportASTMPieceBoundary(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail);
void ExportASTMSewLine(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail); void ExportASTMSewLine(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail);
void ExportASTMInternalLine(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail); void ExportASTMInternalLine(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail);
void ExportASTMInternalCutout(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail); void ExportASTMInternalCutout(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail);
void ExportASTMAnnotationText(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail); void ExportASTMAnnotationText(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail);
void ExportASTMDrill(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail); void ExportASTMDrill(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail);
void ExportASTMNotch(dx_ifaceBlock *detailBlock, const VLayoutPiece &detail); void ExportASTMNotch(const QSharedPointer<dx_ifaceBlock> &detailBlock, const VLayoutPiece &detail);
Q_REQUIRED_RESULT auto AAMAPolygon(const QVector<QPointF> &polygon, const UTF8STRING &layer, void ExportTurnPoints(const QSharedPointer<dx_ifaceBlock> &detailBlock,
const QVector<VLayoutPoint> &points) const;
void ExportCurvePoints(const QSharedPointer<dx_ifaceBlock> &detailBlock,
const QVector<VLayoutPoint> &points) const;
Q_REQUIRED_RESULT auto AAMAPolygon(const QVector<VLayoutPoint> &polygon, const UTF8STRING &layer,
bool forceClosed) -> DRW_Entity *; bool forceClosed) -> DRW_Entity *;
Q_REQUIRED_RESULT auto AAMALine(const QLineF &line, const UTF8STRING &layer) -> DRW_Entity *; Q_REQUIRED_RESULT auto AAMALine(const QLineF &line, const UTF8STRING &layer) -> DRW_Entity *;
Q_REQUIRED_RESULT auto AAMAText(const QPointF &pos, const QString &text, const UTF8STRING &layer) -> DRW_Entity *; Q_REQUIRED_RESULT auto AAMAText(const QPointF &pos, const QString &text, const UTF8STRING &layer) -> DRW_Entity *;
Q_REQUIRED_RESULT auto AAMAPoint(const QPointF &pos, const UTF8STRING &layer) const -> DRW_Point *;
template<class P, class V> template<class P, class V, class C>
Q_REQUIRED_RESULT auto CreateAAMAPolygon(const QVector<QPointF> &polygon, const UTF8STRING &layer, Q_REQUIRED_RESULT auto CreateAAMAPolygon(const QVector<C> &polygon, const UTF8STRING &layer,
bool forceClosed) -> P *; bool forceClosed) -> P *;
static auto FromUnicodeToCodec(const QString &str, QTextCodec *codec) -> std::string; static auto FromUnicodeToCodec(const QString &str, QTextCodec *codec) -> std::string;

View File

@ -6,6 +6,7 @@ SOURCES += \
$$PWD/vgobject.cpp \ $$PWD/vgobject.cpp \
$$PWD/vabstractcurve.cpp \ $$PWD/vabstractcurve.cpp \
$$PWD/varc.cpp \ $$PWD/varc.cpp \
$$PWD/vlayoutplacelabel.cpp \
$$PWD/vpointf.cpp \ $$PWD/vpointf.cpp \
$$PWD/vspline.cpp \ $$PWD/vspline.cpp \
$$PWD/vsplinepath.cpp \ $$PWD/vsplinepath.cpp \
@ -28,6 +29,7 @@ HEADERS += \
$$PWD/vabstractcurve.h \ $$PWD/vabstractcurve.h \
$$PWD/varc.h \ $$PWD/varc.h \
$$PWD/varc_p.h \ $$PWD/varc_p.h \
$$PWD/vlayoutplacelabel.h \
$$PWD/vpointf.h \ $$PWD/vpointf.h \
$$PWD/vpointf_p.h \ $$PWD/vpointf_p.h \
$$PWD/vspline.h \ $$PWD/vspline.h \

View File

@ -93,64 +93,3 @@ QDataStream &operator>>(QDataStream &dataStream, VLayoutPassmark &data)
return dataStream; return dataStream;
} }
const quint32 VLayoutPlaceLabel::streamHeader = 0xB282E284; // CRC-32Q string "VLayoutPlaceLabel"
const quint16 VLayoutPlaceLabel::classVersion = 1;
// Friend functions
//---------------------------------------------------------------------------------------------------------------------
QDataStream& operator<<(QDataStream &dataStream, const VLayoutPlaceLabel &data)
{
dataStream << VLayoutPlaceLabel::streamHeader << VLayoutPlaceLabel::classVersion;
// Added in classVersion = 1
dataStream << data.center;
dataStream << data.type;
dataStream << data.shape;
dataStream << data.rotationMatrix;
dataStream << data.box;
// Added in classVersion = 2
return dataStream;
}
//---------------------------------------------------------------------------------------------------------------------
QDataStream& operator>>(QDataStream &dataStream, VLayoutPlaceLabel &data)
{
quint32 actualStreamHeader = 0;
dataStream >> actualStreamHeader;
if (actualStreamHeader != VLayoutPlaceLabel::streamHeader)
{
QString message = QCoreApplication::tr("VLayoutPlaceLabel prefix mismatch error: actualStreamHeader = 0x%1 and "
"streamHeader = 0x%2")
.arg(actualStreamHeader, 8, 0x10, QChar('0'))
.arg(VLayoutPlaceLabel::streamHeader, 8, 0x10, QChar('0'));
throw VException(message);
}
quint16 actualClassVersion = 0;
dataStream >> actualClassVersion;
if (actualClassVersion > VLayoutPlaceLabel::classVersion)
{
QString message = QCoreApplication::tr("VLayoutPlaceLabel compatibility error: actualClassVersion = %1 and "
"classVersion = %2")
.arg(actualClassVersion).arg(VLayoutPlaceLabel::classVersion);
throw VException(message);
}
dataStream >> data.center;
dataStream >> data.type;
dataStream >> data.shape;
dataStream >> data.rotationMatrix;
dataStream >> data.box;
// if (actualClassVersion >= 2)
// {
// }
return dataStream;
}

View File

@ -64,24 +64,6 @@ enum class PlaceLabelType : quint8
Circle = 9 Circle = 9
}; };
typedef QVector<QPolygonF> PlaceLabelImg;
struct VLayoutPlaceLabel
{
QPointF center{};
PlaceLabelType type{PlaceLabelType::Button};
PlaceLabelImg shape{};
QTransform rotationMatrix{};
QRectF box{};
friend QDataStream& operator<<(QDataStream& dataStream, const VLayoutPlaceLabel& data);
friend QDataStream& operator>>(QDataStream& dataStream, VLayoutPlaceLabel& data);
private:
static const quint32 streamHeader;
static const quint16 classVersion;
};
Q_DECLARE_METATYPE(VLayoutPlaceLabel)
struct VLayoutPassmark struct VLayoutPassmark
{ {
QVector<QLineF> lines{}; QVector<QLineF> lines{};

View File

@ -0,0 +1,104 @@
/************************************************************************
**
** @file vlayoutplacelabel.cpp
** @author Roman Telezhynskyi <dismine(at)gmail.com>
** @date 12 10, 2022
**
** @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) 2022 Valentina project
** <https://gitlab.com/smart-pattern/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 "vlayoutplacelabel.h"
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
# include "../vmisc/vdatastreamenum.h"
#endif
#include "../ifc/exception/vexception.h"
//---------------------------------------------------------------------------------------------------------------------
VLayoutPlaceLabel::VLayoutPlaceLabel(const VPlaceLabelItem &item)
: m_center(item.toQPointF()),
m_type(item.GetLabelType()),
m_rotationMatrix(item.RotationMatrix()),
m_box(item.Box())
{}
// Friend functions
//---------------------------------------------------------------------------------------------------------------------
auto operator<<(QDataStream &dataStream, const VLayoutPlaceLabel &data) -> QDataStream&
{
dataStream << VLayoutPlaceLabel::streamHeader << VLayoutPlaceLabel::classVersion;
// Added in classVersion = 1
dataStream << data.m_center;
dataStream << data.m_type;
dataStream << data.m_rotationMatrix;
dataStream << data.m_box;
// Added in classVersion = 2
return dataStream;
}
//---------------------------------------------------------------------------------------------------------------------
auto operator>>(QDataStream &dataStream, VLayoutPlaceLabel &data) -> QDataStream&
{
quint32 actualStreamHeader = 0;
dataStream >> actualStreamHeader;
if (actualStreamHeader != VLayoutPlaceLabel::streamHeader)
{
QString message = QCoreApplication::tr("VLayoutPlaceLabel prefix mismatch error: actualStreamHeader = 0x%1 and "
"streamHeader = 0x%2")
.arg(actualStreamHeader, 8, 0x10, QChar('0'))
.arg(VLayoutPlaceLabel::streamHeader, 8, 0x10, QChar('0'));
throw VException(message);
}
quint16 actualClassVersion = 0;
dataStream >> actualClassVersion;
if (actualClassVersion > VLayoutPlaceLabel::classVersion)
{
QString message = QCoreApplication::tr("VLayoutPlaceLabel compatibility error: actualClassVersion = %1 and "
"classVersion = %2")
.arg(actualClassVersion).arg(VLayoutPlaceLabel::classVersion);
throw VException(message);
}
dataStream >> data.m_center;
dataStream >> data.m_type;
if (actualClassVersion == 1)
{
QVector<QPolygonF> shape;
dataStream >> shape; // no longer in use
}
dataStream >> data.m_rotationMatrix;
dataStream >> data.m_box;
// if (actualClassVersion >= 2)
// {
// }
return dataStream;
}

View File

@ -0,0 +1,118 @@
/************************************************************************
**
** @file vlayoutplacelabel.h
** @author Roman Telezhynskyi <dismine(at)gmail.com>
** @date 12 10, 2022
**
** @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) 2022 Valentina project
** <https://gitlab.com/smart-pattern/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 VLAYOUTPLACELABEL_H
#define VLAYOUTPLACELABEL_H
#include <QPolygonF>
#include "vgeometrydef.h"
#include "vplacelabelitem.h"
class VLayoutPlaceLabel
{
public:
VLayoutPlaceLabel() = default;
explicit VLayoutPlaceLabel(const VPlaceLabelItem &item);
friend auto operator<<(QDataStream& dataStream, const VLayoutPlaceLabel& data) -> QDataStream&;
friend auto operator>>(QDataStream& dataStream, VLayoutPlaceLabel& data) -> QDataStream&;
auto Center() const -> QPointF;
void SetCenter(QPointF newCenter);
auto Type() const -> PlaceLabelType;
void SetType(PlaceLabelType newType);
auto RotationMatrix() const -> const QTransform &;
void SetRotationMatrix(const QTransform &newRotationMatrix);
auto Box() const -> const QRectF &;
void SetBox(const QRectF &newBox);
private:
static constexpr quint32 streamHeader = 0xB282E284; // CRC-32Q string "VLayoutPlaceLabel"
static constexpr quint16 classVersion = 2;
QPointF m_center{};
PlaceLabelType m_type{PlaceLabelType::Button};
QTransform m_rotationMatrix{};
QRectF m_box{};
};
Q_DECLARE_METATYPE(VLayoutPlaceLabel) // NOLINT
Q_DECLARE_TYPEINFO(VLayoutPlaceLabel, Q_MOVABLE_TYPE); // NOLINT
//---------------------------------------------------------------------------------------------------------------------
inline auto VLayoutPlaceLabel::Center() const -> QPointF
{
return m_center;
}
//---------------------------------------------------------------------------------------------------------------------
inline void VLayoutPlaceLabel::SetCenter(QPointF newCenter)
{
m_center = newCenter;
}
//---------------------------------------------------------------------------------------------------------------------
inline auto VLayoutPlaceLabel::Type() const -> PlaceLabelType
{
return m_type;
}
//---------------------------------------------------------------------------------------------------------------------
inline void VLayoutPlaceLabel::SetType(PlaceLabelType newType)
{
m_type = newType;
}
//---------------------------------------------------------------------------------------------------------------------
inline auto VLayoutPlaceLabel::RotationMatrix() const -> const QTransform &
{
return m_rotationMatrix;
}
//---------------------------------------------------------------------------------------------------------------------
inline void VLayoutPlaceLabel::SetRotationMatrix(const QTransform &newRotationMatrix)
{
m_rotationMatrix = newRotationMatrix;
}
//---------------------------------------------------------------------------------------------------------------------
inline auto VLayoutPlaceLabel::Box() const -> const QRectF &
{
return m_box;
}
//---------------------------------------------------------------------------------------------------------------------
inline void VLayoutPlaceLabel::SetBox(const QRectF &newBox)
{
m_box = newBox;
}
#endif // VLAYOUTPLACELABEL_H

View File

@ -28,7 +28,6 @@
#include "vplacelabelitem.h" #include "vplacelabelitem.h"
#include "vplacelabelitem_p.h" #include "vplacelabelitem_p.h"
#include "../vpatterndb/vcontainer.h" #include "../vpatterndb/vcontainer.h"
#include "varc.h"
#include <qnumeric.h> #include <qnumeric.h>
#include <QPolygonF> #include <QPolygonF>
@ -240,198 +239,3 @@ VPlaceLabelItem &VPlaceLabelItem::operator=(VPlaceLabelItem &&item) Q_DECL_NOTHR
return *this; return *this;
} }
#endif #endif
//---------------------------------------------------------------------------------------------------------------------
PlaceLabelImg VPlaceLabelItem::LabelShape() const
{
QTransform t = RotationMatrix();
auto SegmentShape = [t, this]()
{
QPolygonF shape;
shape << QPointF(x(), y() - d->hValue/2.0) << QPointF(x(), y() + d->hValue/2.0);
return PlaceLabelImg({t.map(shape)});
};
auto RectangleShape = [t, this]()
{
QRectF rect(QPointF(x() - d->wValue/2.0, y() - d->hValue/2.0),
QPointF(x() + d->wValue/2.0, y() + d->hValue/2.0));
QPolygonF shape;
shape << rect.topLeft() << rect.topRight() << rect.bottomRight() << rect.bottomLeft() << rect.topLeft();
return PlaceLabelImg({t.map(shape)});
};
auto CrossShape = [t, this]()
{
QPolygonF shape1;
shape1 << QPointF(x(), y() - d->hValue/2.0)
<< QPointF(x(), y() + d->hValue/2.0);
QPolygonF shape2;
shape2 << QPointF(x() - d->wValue/2.0, y())
<< QPointF(x() + d->wValue/2.0, y());
return PlaceLabelImg({t.map(shape1), t.map(shape2)});
};
auto TshapedShape = [t, this]()
{
QPointF center2(x(), y() + d->hValue/2.0);
QPolygonF shape1;
shape1 << QPointF(x(), y()) << center2;
QPolygonF shape2;
shape2 << QPointF(center2.x() - d->wValue/2.0, center2.y())
<< QPointF(center2.x() + d->wValue/2.0, center2.y());
return PlaceLabelImg({t.map(shape1), t.map(shape2)});
};
auto DoubletreeShape = [t, this]()
{
QRectF rect(QPointF(x() - d->wValue/2.0, y() - d->hValue/2.0),
QPointF(x() + d->wValue/2.0, y() + d->hValue/2.0));
QPolygonF shape1;
shape1 << rect.topLeft() << rect.bottomRight();
QPolygonF shape2;
shape2 << rect.topRight() << rect.bottomLeft();
return PlaceLabelImg({t.map(shape1), t.map(shape2)});
};
auto CornerShape = [t, this]()
{
QPolygonF shape1;
shape1 << QPointF(x(), y()) << QPointF(x(), y() + d->hValue/2.0);
QPolygonF shape2;
shape2 << QPointF(x() - d->wValue/2.0, y()) << QPointF(x(), y());
return PlaceLabelImg({t.map(shape1), t.map(shape2)});
};
auto TriangleShape = [t, this]()
{
QRectF rect(QPointF(x() - d->wValue/2.0, y() - d->hValue/2.0),
QPointF(x() + d->wValue/2.0, y() + d->hValue/2.0));
QPolygonF shape;
shape << rect.topLeft() << rect.topRight() << rect.bottomRight() << rect.topLeft();
return PlaceLabelImg({t.map(shape)});
};
auto HshapedShape = [t, this]()
{
const QPointF center1 (x(), y() - d->hValue/2.0);
const QPointF center2 (x(), y() + d->hValue/2.0);
QPolygonF shape1;
shape1 << center1 << center2;
QPolygonF shape2;
shape2 << QPointF(center1.x() - d->wValue/2.0, center1.y())
<< QPointF(center1.x() + d->wValue/2.0, center1.y());
QPolygonF shape3;
shape3 << QPointF(center2.x() - d->wValue/2.0, center2.y())
<< QPointF(center2.x() + d->wValue/2.0, center2.y());
return PlaceLabelImg({t.map(shape1), t.map(shape2), t.map(shape3)});
};
auto ButtonShape = [t, this]()
{
const qreal radius = qMin(d->wValue/2.0, d->hValue/2.0);
QPolygonF shape1;
shape1 << QPointF(x(), y() - radius)
<< QPointF(x(), y() + radius);
QPolygonF shape2;
shape2 << QPointF(x() - radius, y())
<< QPointF(x() + radius, y());
const qreal circleSize = 0.85;
VArc arc(*this, radius*circleSize, 0, 360);
arc.SetApproximationScale(10);
QPolygonF shape3(arc.GetPoints());
if (not shape3.isClosed() && not shape3.isEmpty())
{
shape3 << ConstFirst<QPointF>(shape3);
}
return PlaceLabelImg({t.map(shape1), t.map(shape2), t.map(shape3)});
};
auto CircleShape = [t, this]()
{
const qreal radius = qMin(d->wValue/2.0, d->hValue/2.0);
VArc arc(*this, radius, 0, 360);
arc.SetApproximationScale(10);
QPolygonF circle(arc.GetPoints());
if (not circle.isClosed() && not circle.isEmpty())
{
circle << ConstFirst<QPointF>(circle);
}
return PlaceLabelImg({t.map(circle)});
};
QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Wswitch-default")
switch(d->type)
{
case PlaceLabelType::Segment:
return SegmentShape();
case PlaceLabelType::Rectangle:
return RectangleShape();
case PlaceLabelType::Cross:
return CrossShape();
case PlaceLabelType::Tshaped:
return TshapedShape();
case PlaceLabelType::Doubletree:
return DoubletreeShape();
case PlaceLabelType::Corner:
return CornerShape();
case PlaceLabelType::Triangle:
return TriangleShape();
case PlaceLabelType::Hshaped:
return HshapedShape();
case PlaceLabelType::Button:
return ButtonShape();
case PlaceLabelType::Circle:
return CircleShape();
}
// cppcheck-suppress unknownMacro
QT_WARNING_POP
return PlaceLabelImg();
}
//---------------------------------------------------------------------------------------------------------------------
QPainterPath VPlaceLabelItem::LabelShapePath() const
{
return LabelShapePath(LabelShape());
}
//---------------------------------------------------------------------------------------------------------------------
QPainterPath VPlaceLabelItem::LabelShapePath(const PlaceLabelImg &shape)
{
QPainterPath path;
for (const auto &p : shape)
{
if (not p.isEmpty())
{
path.moveTo(ConstFirst<QPointF>(p));
path.addPolygon(p);
}
}
return path;
}

View File

@ -83,12 +83,6 @@ public:
QTransform RotationMatrix() const; QTransform RotationMatrix() const;
QRectF Box() const; QRectF Box() const;
PlaceLabelImg LabelShape() const;
QPainterPath LabelShapePath() const;
static QPainterPath LabelShapePath(const PlaceLabelImg &shape);
private: private:
QSharedDataPointer<VPlaceLabelItemData> d; QSharedDataPointer<VPlaceLabelItemData> d;
}; };

View File

@ -30,6 +30,8 @@
#include "vabstractpiece_p.h" #include "vabstractpiece_p.h"
#include "../vmisc/vabstractvalapplication.h" #include "../vmisc/vabstractvalapplication.h"
#include "../vgeometry/vpointf.h" #include "../vgeometry/vpointf.h"
#include "../vgeometry/vlayoutplacelabel.h"
#include "../vgeometry/varc.h"
#include "../ifc/exception/vexception.h" #include "../ifc/exception/vexception.h"
#include "../vmisc/compatibility.h" #include "../vmisc/compatibility.h"
#include "../vpatterndb/floatItemData/vgrainlinedata.h" #include "../vpatterndb/floatItemData/vgrainlinedata.h"
@ -111,7 +113,9 @@ auto AngleByLength(QVector<VRawSAPoint> points, QPointF p1, QPointF p2, QPointF
{ {
qDebug()<<"Couldn't find intersection with cut line."; qDebug()<<"Couldn't find intersection with cut line.";
} }
points.append(px); VRawSAPoint sp(px, p.CurvePoint(), p.TurnPoint());
sp.SetPrimary(true);
points.append(sp);
cutLine.setAngle(cutLine.angle()-180); cutLine.setAngle(cutLine.angle()-180);
type = Intersects(QLineF(sp2, sp3), cutLine, &px); type = Intersects(QLineF(sp2, sp3), cutLine, &px);
@ -120,11 +124,13 @@ auto AngleByLength(QVector<VRawSAPoint> points, QPointF p1, QPointF p2, QPointF
{ {
qDebug()<<"Couldn't find intersection with cut line."; qDebug()<<"Couldn't find intersection with cut line.";
} }
points.append(px); sp = VRawSAPoint(px, p.CurvePoint(), p.TurnPoint());
sp.SetPrimary(true);
points.append(sp);
} }
else else
{// The point just fine {// The point just fine
points.append(sp2); points.append(VRawSAPoint(sp2, p.CurvePoint(), p.TurnPoint()));
} }
} }
else else
@ -139,25 +145,25 @@ auto AngleByLength(QVector<VRawSAPoint> points, QPointF p1, QPointF p2, QPointF
{ {
QLineF loop(bigLine1.p2(), sp2); QLineF loop(bigLine1.p2(), sp2);
loop.setLength(loop.length() + accuracyPointOnLine*2.); loop.setLength(loop.length() + accuracyPointOnLine*2.);
points.append(loop.p2()); points.append(VRawSAPoint(loop.p2(), p.CurvePoint(), p.TurnPoint()));
points.append(sp2); points.append(VRawSAPoint(sp2, p.CurvePoint(), p.TurnPoint()));
points.append(VRawSAPoint(bigLine1.p2(), true)); points.append(VRawSAPoint(bigLine1.p2(), p.CurvePoint(), p.TurnPoint(), true));
loop = QLineF(bigLine2.p2(), sp2); loop = QLineF(bigLine2.p2(), sp2);
loop.setLength(loop.length() + localWidth); loop.setLength(loop.length() + localWidth);
points.append(VRawSAPoint(loop.p2(), true)); points.append(VRawSAPoint(loop.p2(), p.CurvePoint(), p.TurnPoint(), true));
} }
else else
{ {
QLineF loop(sp2, bigLine1.p1()); QLineF loop(sp2, bigLine1.p1());
loop.setLength(accuracyPointOnLine*2.); loop.setLength(accuracyPointOnLine*2.);
points.append(loop.p2()); points.append(VRawSAPoint(loop.p2(), p.CurvePoint(), p.TurnPoint()));
points.append(sp2); points.append(VRawSAPoint(sp2, p.CurvePoint(), p.TurnPoint()));
loop = QLineF(bigLine1.p1(), sp2); loop = QLineF(bigLine1.p1(), sp2);
loop.setLength(loop.length() + localWidth); loop.setLength(loop.length() + localWidth);
points.append(VRawSAPoint(loop.p2(), true)); points.append(VRawSAPoint(loop.p2(), p.CurvePoint(), p.TurnPoint(), true));
points.append(VRawSAPoint(bigLine2.p1(), true)); points.append(VRawSAPoint(bigLine2.p1(), p.CurvePoint(), p.TurnPoint(), true));
} }
} }
else else
@ -168,7 +174,7 @@ auto AngleByLength(QVector<VRawSAPoint> points, QPointF p1, QPointF p2, QPointF
{ {
bool success = false; bool success = false;
QVector<VRawSAPoint> temp = points; QVector<VRawSAPoint> temp = points;
temp.append(bigLine1.p2()); temp.append(VRawSAPoint(bigLine1.p2(), p.CurvePoint(), p.TurnPoint()));
temp = VAbstractPiece::RollbackSeamAllowance(temp, bigLine2, &success); temp = VAbstractPiece::RollbackSeamAllowance(temp, bigLine2, &success);
if (success) if (success)
@ -183,7 +189,7 @@ auto AngleByLength(QVector<VRawSAPoint> points, QPointF p1, QPointF p2, QPointF
} }
else else
{ {
points.append(sp2); points.append(VRawSAPoint(sp2, p.CurvePoint(), p.TurnPoint()));
} }
} }
else else
@ -194,16 +200,17 @@ auto AngleByLength(QVector<VRawSAPoint> points, QPointF p1, QPointF p2, QPointF
QLineF loop1(sp2, sp1); QLineF loop1(sp2, sp1);
loop1.setLength(loop1.length()*0.2); loop1.setLength(loop1.length()*0.2);
points.append(loop1.p2()); // Need for the main path rule // Need for the main path rule
points.append(VRawSAPoint(loop1.p2(), p.CurvePoint(), p.TurnPoint()));
loop1.setAngle(loop1.angle() + 180); loop1.setAngle(loop1.angle() + 180);
loop1.setLength(localWidth); loop1.setLength(localWidth);
points.append(loop1.p2()); points.append(VRawSAPoint(loop1.p2(), p.CurvePoint(), p.TurnPoint()));
points.append(bigLine2.p1()); points.append(VRawSAPoint(bigLine2.p1(), p.CurvePoint(), p.TurnPoint()));
} }
else else
{ {
points.append(sp2); points.append(VRawSAPoint(sp2, p.CurvePoint(), p.TurnPoint()));
} }
} }
} }
@ -252,13 +259,13 @@ auto AngleByIntersection(const QVector<VRawSAPoint> &points, QPointF p1, QPointF
{ {
return AngleByLength(points, p1, p2, p3, bigLine1, sp2, bigLine2, p, width, needRollback); return AngleByLength(points, p1, p2, p3, bigLine1, sp2, bigLine2, p, width, needRollback);
} }
pointsIntr.append(px); pointsIntr.append(VRawSAPoint(px, p.CurvePoint(), p.TurnPoint()));
} }
else else
{// Because artificial loop can lead to wrong clipping we must rollback current seam allowance points {// Because artificial loop can lead to wrong clipping we must rollback current seam allowance points
bool success = false; bool success = false;
QVector<VRawSAPoint> temp = pointsIntr; QVector<VRawSAPoint> temp = pointsIntr;
temp.append(bigLine1.p2()); temp.append(VRawSAPoint(bigLine1.p2(), p.CurvePoint(), p.TurnPoint()));
temp = VAbstractPiece::RollbackSeamAllowance(temp, edge2, &success); temp = VAbstractPiece::RollbackSeamAllowance(temp, edge2, &success);
if (success) if (success)
@ -283,16 +290,16 @@ auto AngleByIntersection(const QVector<VRawSAPoint> &points, QPointF p1, QPointF
if (IsOutsidePoint(bigLine2.p2(), bigLine2.p1(), px)) if (IsOutsidePoint(bigLine2.p2(), bigLine2.p1(), px))
{ {
pointsIntr.append(px); pointsIntr.append(VRawSAPoint(px, p.CurvePoint(), p.TurnPoint()));
} }
else else
{ {
pointsIntr.append(px); pointsIntr.append(VRawSAPoint(px, p.CurvePoint(), p.TurnPoint()));
QLineF allowance(p2, px); QLineF allowance(p2, px);
allowance.setLength(allowance.length() + localWidth * 3.); allowance.setLength(allowance.length() + localWidth * 3.);
pointsIntr.append(allowance.p2()); pointsIntr.append(VRawSAPoint(allowance.p2(), p.CurvePoint(), p.TurnPoint()));
pointsIntr.append(bigLine2.p1()); pointsIntr.append(VRawSAPoint(bigLine2.p1(), p.CurvePoint(), p.TurnPoint()));
} }
return pointsIntr; return pointsIntr;
@ -343,13 +350,13 @@ auto AngleByFirstSymmetry(const QVector<VRawSAPoint> &points, QPointF p1, QPoint
if (IsOutsidePoint(bigLine1.p1(), bigLine1.p2(), px1)) if (IsOutsidePoint(bigLine1.p1(), bigLine1.p2(), px1))
{ {
pointsIntr.append(px1); pointsIntr.append(VRawSAPoint(px1, p.CurvePoint(), p.TurnPoint()));
} }
else else
{// Because artificial loop can lead to wrong clipping we must rollback current seam allowance points {// Because artificial loop can lead to wrong clipping we must rollback current seam allowance points
bool success = false; bool success = false;
QVector<VRawSAPoint> temp = pointsIntr; QVector<VRawSAPoint> temp = pointsIntr;
temp.append(bigLine1.p2()); temp.append(VRawSAPoint(bigLine1.p2(), p.CurvePoint(), p.TurnPoint()));
temp = VAbstractPiece::RollbackSeamAllowance(temp, sEdge, &success); temp = VAbstractPiece::RollbackSeamAllowance(temp, sEdge, &success);
if (success) if (success)
@ -365,15 +372,15 @@ auto AngleByFirstSymmetry(const QVector<VRawSAPoint> &points, QPointF p1, QPoint
if (IsOutsidePoint(bigLine2.p2(), bigLine2.p1(), px2)) if (IsOutsidePoint(bigLine2.p2(), bigLine2.p1(), px2))
{ {
pointsIntr.append(px2); pointsIntr.append(VRawSAPoint(px2, p.CurvePoint(), p.TurnPoint()));
} }
else else
{ {
QLineF allowance(px2, p2); QLineF allowance(px2, p2);
allowance.setAngle(allowance.angle() + 90); allowance.setAngle(allowance.angle() + 90);
pointsIntr.append(px2); pointsIntr.append(VRawSAPoint(px2, p.CurvePoint(), p.TurnPoint()));
pointsIntr.append(allowance.p2()); pointsIntr.append(VRawSAPoint(allowance.p2(), p.CurvePoint(), p.TurnPoint()));
pointsIntr.append(bigLine2.p1()); pointsIntr.append(VRawSAPoint(bigLine2.p1(), p.CurvePoint(), p.TurnPoint()));
} }
return pointsIntr; return pointsIntr;
@ -425,13 +432,13 @@ auto AngleBySecondSymmetry(const QVector<VRawSAPoint> &points, QPointF p1, QPoin
if (IsOutsidePoint(bigLine1.p1(), bigLine1.p2(), px1)) if (IsOutsidePoint(bigLine1.p1(), bigLine1.p2(), px1))
{ {
pointsIntr.append(px1); pointsIntr.append(VRawSAPoint(px1, p.CurvePoint(), p.TurnPoint()));
} }
else else
{// Because artificial loop can lead to wrong clipping we must rollback current seam allowance points {// Because artificial loop can lead to wrong clipping we must rollback current seam allowance points
bool success = false; bool success = false;
QVector<VRawSAPoint> temp = pointsIntr; QVector<VRawSAPoint> temp = pointsIntr;
temp.append(bigLine1.p2()); temp.append(VRawSAPoint(bigLine1.p2(), p.CurvePoint(), p.TurnPoint()));
temp = VAbstractPiece::RollbackSeamAllowance(temp, sEdge, &success); temp = VAbstractPiece::RollbackSeamAllowance(temp, sEdge, &success);
if (success) if (success)
@ -447,16 +454,16 @@ auto AngleBySecondSymmetry(const QVector<VRawSAPoint> &points, QPointF p1, QPoin
if (IsOutsidePoint(bigLine2.p2(), bigLine2.p1(), px2)) if (IsOutsidePoint(bigLine2.p2(), bigLine2.p1(), px2))
{ {
pointsIntr.append(px2); pointsIntr.append(VRawSAPoint(px2, p.CurvePoint(), p.TurnPoint()));
} }
else else
{ {
QLineF allowance(p2, px2); QLineF allowance(p2, px2);
allowance.setLength(p.GetSAAfter(width)*0.98); allowance.setLength(p.GetSAAfter(width)*0.98);
pointsIntr.append(allowance.p2()); pointsIntr.append(VRawSAPoint(allowance.p2(), p.CurvePoint(), p.TurnPoint()));
allowance.setLength(allowance.length() + localWidth * 3.); allowance.setLength(allowance.length() + localWidth * 3.);
pointsIntr.append(allowance.p2()); pointsIntr.append(VRawSAPoint(allowance.p2(), p.CurvePoint(), p.TurnPoint()));
pointsIntr.append(bigLine2.p1()); pointsIntr.append(VRawSAPoint(bigLine2.p1(), p.CurvePoint(), p.TurnPoint()));
} }
return pointsIntr; return pointsIntr;
@ -500,8 +507,8 @@ auto AngleByFirstRightAngle(const QVector<VRawSAPoint> &points, QPointF p1, QPoi
{ {
return AngleByLength(points, p1, p2, p3, bigLine1, sp2, bigLine2, p, width, needRollback); return AngleByLength(points, p1, p2, p3, bigLine1, sp2, bigLine2, p, width, needRollback);
} }
pointsRA.append(seam.p2()); pointsRA.append(VRawSAPoint(seam.p2(), p.CurvePoint(), p.TurnPoint()));
pointsRA.append(seam.p1()); pointsRA.append(VRawSAPoint(seam.p1(), p.CurvePoint(), p.TurnPoint()));
} }
else else
{ {
@ -514,7 +521,7 @@ auto AngleByFirstRightAngle(const QVector<VRawSAPoint> &points, QPointF p1, QPoi
return AngleByLength(points, p1, p2, p3, bigLine1, sp2, bigLine2, p, width, needRollback); return AngleByLength(points, p1, p2, p3, bigLine1, sp2, bigLine2, p, width, needRollback);
} }
pointsRA.append(seam.p2()); pointsRA.append(VRawSAPoint(seam.p2(), p.CurvePoint(), p.TurnPoint()));
QLineF loopLine(px, sp2); QLineF loopLine(px, sp2);
const qreal length = loopLine.length()*0.98; const qreal length = loopLine.length()*0.98;
@ -523,8 +530,8 @@ auto AngleByFirstRightAngle(const QVector<VRawSAPoint> &points, QPointF p1, QPoi
QLineF tmp(seam.p2(), seam.p1()); QLineF tmp(seam.p2(), seam.p1());
tmp.setLength(tmp.length()+length); tmp.setLength(tmp.length()+length);
pointsRA.append(tmp.p2()); pointsRA.append(VRawSAPoint(tmp.p2(), p.CurvePoint(), p.TurnPoint()));
pointsRA.append(loopLine.p2()); pointsRA.append(VRawSAPoint(loopLine.p2(), p.CurvePoint(), p.TurnPoint()));
} }
return pointsRA; return pointsRA;
@ -568,12 +575,12 @@ auto AngleBySecondRightAngle(QVector<VRawSAPoint> points, QPointF p1, QPointF p2
{ {
return AngleByLength(points, p1, p2, p3, bigLine1, sp2, bigLine2, p, width, needRollback); return AngleByLength(points, p1, p2, p3, bigLine1, sp2, bigLine2, p, width, needRollback);
} }
points.append(px); points.append(VRawSAPoint(px, p.CurvePoint(), p.TurnPoint()));
QLineF seam(px, p3); QLineF seam(px, p3);
seam.setAngle(seam.angle()+90); seam.setAngle(seam.angle()+90);
seam.setLength(p.GetSAAfter(width)); seam.setLength(p.GetSAAfter(width));
points.append(seam.p2()); points.append(VRawSAPoint(seam.p2(), p.CurvePoint(), p.TurnPoint()));
if (needRollback != nullptr) if (needRollback != nullptr)
{ {
@ -595,7 +602,7 @@ auto AngleBySecondRightAngle(QVector<VRawSAPoint> points, QPointF p1, QPointF p2
bool success = false; bool success = false;
const int countBefore = points.size(); const int countBefore = points.size();
QVector<VRawSAPoint> temp = points; QVector<VRawSAPoint> temp = points;
temp.append(bigLine1.p2()); temp.append(VRawSAPoint(bigLine1.p2(), p.CurvePoint(), p.TurnPoint()));
temp = VAbstractPiece::RollbackSeamAllowance(temp, edge, &success); temp = VAbstractPiece::RollbackSeamAllowance(temp, edge, &success);
if (success) if (success)
@ -609,7 +616,7 @@ auto AngleBySecondRightAngle(QVector<VRawSAPoint> points, QPointF p1, QPointF p2
QLineF seam(px, p3); QLineF seam(px, p3);
seam.setAngle(seam.angle()+90); seam.setAngle(seam.angle()+90);
seam.setLength(p.GetSAAfter(width)); seam.setLength(p.GetSAAfter(width));
points.append(seam.p2()); points.append(VRawSAPoint(seam.p2(), p.CurvePoint(), p.TurnPoint()));
} }
else else
{ {
@ -619,11 +626,11 @@ auto AngleBySecondRightAngle(QVector<VRawSAPoint> points, QPointF p1, QPointF p2
} }
else if (IsSameDirection(bigLine1.p1(), bigLine1.p2(), px)) else if (IsSameDirection(bigLine1.p1(), bigLine1.p2(), px))
{ {
points.append(px); points.append(VRawSAPoint(px, p.CurvePoint(), p.TurnPoint()));
QLineF seam(px, p3); QLineF seam(px, p3);
seam.setAngle(seam.angle()+90); seam.setAngle(seam.angle()+90);
seam.setLength(p.GetSAAfter(width)); seam.setLength(p.GetSAAfter(width));
points.append(seam.p2()); points.append(VRawSAPoint(seam.p2(), p.CurvePoint(), p.TurnPoint()));
} }
} }
} }
@ -756,7 +763,7 @@ void RollbackByLength(QVector<VRawSAPoint> &ekvPoints, const QVector<VSAPoint> &
const QLineF bigLine1 = VAbstractPiece::ParallelLine(points.at(points.size()-2), points.at(0), width); const QLineF bigLine1 = VAbstractPiece::ParallelLine(points.at(points.size()-2), points.at(0), width);
QVector<VRawSAPoint> temp = ekvPoints; QVector<VRawSAPoint> temp = ekvPoints;
temp.insert(ekvPoints.size()-1, bigLine1.p2()); temp.insert(ekvPoints.size()-1, VRawSAPoint(bigLine1.p2(), points.at(0).CurvePoint(), points.at(0).TurnPoint()));
bool success = Rollback(temp, VAbstractPiece::ParallelLine(points.at(0), points.at(1), width)); bool success = Rollback(temp, VAbstractPiece::ParallelLine(points.at(0), points.at(1), width));
if (success) if (success)
@ -773,7 +780,7 @@ void RollbackBySecondEdgeSymmetry(QVector<VRawSAPoint> &ekvPoints, const QVector
QLineF sEdge(VPointF::FlipPF(axis, bigLine1.p1()), VPointF::FlipPF(axis, bigLine1.p2())); QLineF sEdge(VPointF::FlipPF(axis, bigLine1.p1()), VPointF::FlipPF(axis, bigLine1.p2()));
QVector<VRawSAPoint> temp = ekvPoints; QVector<VRawSAPoint> temp = ekvPoints;
temp.insert(ekvPoints.size()-1, bigLine1.p2()); temp.insert(ekvPoints.size()-1, VRawSAPoint(bigLine1.p2(), points.at(0).CurvePoint(), points.at(0).TurnPoint()));
bool success = Rollback(temp, sEdge); bool success = Rollback(temp, sEdge);
if (success) if (success)
@ -791,7 +798,7 @@ void RollbackByFirstEdgeSymmetry(QVector<VRawSAPoint> &ekvPoints, const QVector<
const QLineF bigLine1 = VAbstractPiece::ParallelLine(points.at(points.size()-2), points.at(0), width); const QLineF bigLine1 = VAbstractPiece::ParallelLine(points.at(points.size()-2), points.at(0), width);
QVector<VRawSAPoint> temp = ekvPoints; QVector<VRawSAPoint> temp = ekvPoints;
temp.insert(ekvPoints.size()-1, bigLine1.p2()); temp.insert(ekvPoints.size()-1, VRawSAPoint(bigLine1.p2(), points.at(0).CurvePoint(), points.at(0).TurnPoint()));
bool success = Rollback(temp, sEdge); bool success = Rollback(temp, sEdge);
if (success) if (success)
@ -805,7 +812,7 @@ void RollbackByPointsIntersection(QVector<VRawSAPoint> &ekvPoints, const QVector
{ {
const QLineF bigLine1 = VAbstractPiece::ParallelLine(points.at(points.size()-2), points.at(0), width); const QLineF bigLine1 = VAbstractPiece::ParallelLine(points.at(points.size()-2), points.at(0), width);
QVector<VRawSAPoint> temp = ekvPoints; QVector<VRawSAPoint> temp = ekvPoints;
temp.insert(ekvPoints.size()-1, bigLine1.p2()); temp.insert(ekvPoints.size()-1, VRawSAPoint(bigLine1.p2(), points.at(0).CurvePoint(), points.at(0).TurnPoint()));
bool success = Rollback(temp, QLineF(ConstLast(points), points.at(1))); bool success = Rollback(temp, QLineF(ConstLast(points), points.at(1)));
if (success) if (success)
@ -848,7 +855,7 @@ void RollbackBySecondEdgeRightAngle(QVector<VRawSAPoint> &ekvPoints, const QVect
ekvPoints.removeFirst(); ekvPoints.removeFirst();
ekvPoints.removeLast(); ekvPoints.removeLast();
ekvPoints.append(crosPoint); ekvPoints.append(VRawSAPoint(crosPoint, ekvPoints.at(0).CurvePoint(), ekvPoints.at(0).TurnPoint()));
} }
} }
} }
@ -856,7 +863,7 @@ void RollbackBySecondEdgeRightAngle(QVector<VRawSAPoint> &ekvPoints, const QVect
{ {
bool success = false; bool success = false;
QVector<VRawSAPoint> temp = ekvPoints; QVector<VRawSAPoint> temp = ekvPoints;
temp.append(bigLine1.p2()); temp.append(VRawSAPoint(bigLine1.p2(), ekvPoints.at(0).CurvePoint(), ekvPoints.at(0).TurnPoint()));
temp = VAbstractPiece::RollbackSeamAllowance(temp, edge, &success); temp = VAbstractPiece::RollbackSeamAllowance(temp, edge, &success);
if (success) if (success)
@ -868,7 +875,7 @@ void RollbackBySecondEdgeRightAngle(QVector<VRawSAPoint> &ekvPoints, const QVect
QLineF seam(px, points.at(1)); QLineF seam(px, points.at(1));
seam.setAngle(seam.angle()+90); seam.setAngle(seam.angle()+90);
seam.setLength(points.at(0).GetSAAfter(width)); seam.setLength(points.at(0).GetSAAfter(width));
ekvPoints.append(seam.p2()); ekvPoints.append(VRawSAPoint(seam.p2(), ekvPoints.at(0).CurvePoint(), ekvPoints.at(0).TurnPoint()));
if (not ekvPoints.isEmpty()) if (not ekvPoints.isEmpty())
{ {
@ -885,22 +892,6 @@ void RollbackBySecondEdgeRightAngle(QVector<VRawSAPoint> &ekvPoints, const QVect
} }
} }
} }
//---------------------------------------------------------------------------------------------------------------------
auto CleanLoopArtifacts(const QVector<VRawSAPoint> &points) -> QVector<QPointF>
{
QVector<QPointF> cleaned;
cleaned.reserve(points.size());
for (const auto &point : points)
{
if (not point.LoopPoint())
{
cleaned.append(point);
}
}
return cleaned;
}
} // namespace } // namespace
// Friend functions // Friend functions
@ -1052,7 +1043,7 @@ void VAbstractPiece::SetSAWidth(qreal value)
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
auto VAbstractPiece::Equidistant(QVector<VSAPoint> points, qreal width, const QString &name) -> QVector<QPointF> auto VAbstractPiece::Equidistant(QVector<VSAPoint> points, qreal width, const QString &name) -> QVector<VLayoutPoint>
{ {
if (width < 0) if (width < 0)
{ {
@ -1135,20 +1126,20 @@ auto VAbstractPiece::Equidistant(QVector<VSAPoint> points, qreal width, const QS
QT_WARNING_POP QT_WARNING_POP
} }
QVector<VLayoutPoint> cleaned;
// Uncomment for debug // Uncomment for debug
// QVector<QPointF> cleaned; // CastTo(ekvPoints, cleaned);
// cleaned.reserve(ekvPoints.size());
// for (auto &point : ekvPoints)
// {
// cleaned.append(point);
// }
const bool removeFirstAndLast = false; const bool removeFirstAndLast = false;
ekvPoints = RemoveDublicates(ekvPoints, removeFirstAndLast); ekvPoints = RemoveDublicates(ekvPoints, removeFirstAndLast);
QVector<QPointF> cleaned = CheckLoops(ekvPoints);//Result path can contain loops ekvPoints = CheckLoops(ekvPoints);
cleaned = CorrectEquidistantPoints(cleaned, removeFirstAndLast); cleaned = CorrectEquidistantPoints(cleaned, removeFirstAndLast);
cleaned = CorrectPathDistortion(cleaned); cleaned = CorrectPathDistortion(cleaned);
// DumpVector(cleaned, QStringLiteral("output.json.XXXXXX")); // Uncomment for dumping test data CastTo(ekvPoints, cleaned);//Result path can contain loops
// QVector<QPointF> dump;
// CastTo(cleaned, dump);
// DumpVector(dump, QStringLiteral("output.json.XXXXXX")); // Uncomment for dumping test data
return cleaned; return cleaned;
} }
@ -1188,131 +1179,6 @@ auto VAbstractPiece::SumTrapezoids(const QVector<QPointF> &points) -> qreal
return res; return res;
} }
//---------------------------------------------------------------------------------------------------------------------
auto VAbstractPiece::CheckLoops(const QVector<QPointF> &points) -> QVector<QPointF>
{
QVector<VRawSAPoint> rawPath;
rawPath.reserve(points.size());
for (const auto &point : points)
{
rawPath.append(point);
}
return CheckLoops(rawPath);
}
//---------------------------------------------------------------------------------------------------------------------
/**
* @brief CheckLoops seek and delete loops in equidistant.
* @param points vector of points of equidistant.
* @return vector of points of equidistant.
*/
auto VAbstractPiece::CheckLoops(const QVector<VRawSAPoint> &points) -> QVector<QPointF>
{
// DumpVector(points, QStringLiteral("input.json.XXXXXX")); // Uncomment for dumping test data
/*If we got less than 4 points no need seek loops.*/
if (points.size() < 4)
{
return CleanLoopArtifacts(points);
}
bool loopFound = false;
auto CheckLoop = [&loopFound](const QVector<VRawSAPoint> &points)
{
loopFound = false;
const bool pathClosed = (ConstFirst(points) == ConstLast(points));
QVector<VRawSAPoint> ekvPoints;
ekvPoints.reserve(points.size());
qint32 i;
for (i = 0; i < points.size(); ++i)
{
/*Last three points no need to check.*/
/*Triangle can not contain a loop*/
if (loopFound || i > points.size()-4)
{
ekvPoints.append(points.at(i));
continue;
}
enum LoopIntersectType { NoIntersection, BoundedIntersection, ParallelIntersection };
QPointF crosPoint;
LoopIntersectType status = NoIntersection;
const QLineF line1(points.at(i), points.at(i+1));
const int limit = pathClosed && i == 0 ? 2 : 1;
qint32 j;
for (j = i+2; j < points.size()-limit; ++j)
{
QLineF line2(points.at(j), points.at(j+1));
const QLineF::IntersectType intersect = Intersects(line1, line2, &crosPoint);
if (intersect == QLineF::NoIntersection)
{ // According to the documentation QLineF::NoIntersection indicates that the lines do not intersect;
// i.e. they are parallel. But parallel also mean they can be on the same line.
// Method IsLineSegmentOnLineSegment will check it.
if (VGObject::IsLineSegmentOnLineSegment(line1, line2))
{// Now we really sure that segments are on the same line and have real intersections.
status = ParallelIntersection;
break;
}
}
else if (intersect == QLineF::BoundedIntersection)
{
status = BoundedIntersection;
break;
}
}
switch (status)
{
case ParallelIntersection:
/*We have found a loop.*/
ekvPoints.append(points.at(i));
ekvPoints.append(points.at(j+1));
i = j+1; // Skip a loop
loopFound = true;
break;
case BoundedIntersection:
ekvPoints.append(points.at(i));
ekvPoints.append(crosPoint);
i = j;
loopFound = true;
break;
case NoIntersection:
/*We have not found loop.*/
ekvPoints.append(points.at(i));
break;
default:
break;
}
}
return ekvPoints;
};
QVector<VRawSAPoint> ekvPoints = points;
qint32 i;
const int maxLoops = 10000; // limit number of loops to be removed
for (i = 0; i < maxLoops; ++i)
{
ekvPoints = CheckLoop(ekvPoints);
if (not loopFound)
{
break;
}
}
const QVector<QPointF> cleaned = CleanLoopArtifacts(ekvPoints);
// DumpVector(cleaned, QStringLiteral("output.json.XXXXXX")); // Uncomment for dumping test data
return cleaned;
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
/** /**
* @brief EkvPoint return seam aloowance points in place of intersection two edges. Last points of two edges should be * @brief EkvPoint return seam aloowance points in place of intersection two edges. Last points of two edges should be
@ -1342,7 +1208,7 @@ auto VAbstractPiece::EkvPoint(QVector<VRawSAPoint> points, const VSAPoint &p1Lin
if (VFuzzyComparePoints(bigLine1.p2(), bigLine2.p1())) if (VFuzzyComparePoints(bigLine1.p2(), bigLine2.p1()))
{ {
points.append(bigLine1.p2()); points.append(VRawSAPoint(bigLine1.p2(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points; return points;
} }
@ -1357,16 +1223,16 @@ auto VAbstractPiece::EkvPoint(QVector<VRawSAPoint> points, const VSAPoint &p1Lin
ray.setLength(width*2); ray.setLength(width*2);
QPointF crosPoint; QPointF crosPoint;
QLineF::IntersectType type = Intersects(ray, bigLine1, &crosPoint ); QLineF::IntersectType type = Intersects(ray, bigLine1, &crosPoint);
if (type != QLineF::NoIntersection) if (type != QLineF::NoIntersection)
{ {
points.append(crosPoint); points.append(VRawSAPoint(crosPoint, p2Line1.CurvePoint(), p2Line1.TurnPoint()));
} }
type = Intersects(ray, bigLine2, &crosPoint ); type = Intersects(ray, bigLine2, &crosPoint );
if (type != QLineF::NoIntersection) if (type != QLineF::NoIntersection)
{ {
points.append(crosPoint); points.append(VRawSAPoint(crosPoint, p2Line1.CurvePoint(), p2Line1.TurnPoint()));
} }
return points; return points;
} }
@ -1378,7 +1244,7 @@ auto VAbstractPiece::EkvPoint(QVector<VRawSAPoint> points, const VSAPoint &p1Lin
{// There are at least three big cases {// There are at least three big cases
case (QLineF::BoundedIntersection): case (QLineF::BoundedIntersection):
// The easiest, real intersection // The easiest, real intersection
points.append(crosPoint); points.append(VRawSAPoint(crosPoint, p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points; return points;
case (QLineF::UnboundedIntersection): case (QLineF::UnboundedIntersection):
{ // Most common case { // Most common case
@ -1400,8 +1266,8 @@ auto VAbstractPiece::EkvPoint(QVector<VRawSAPoint> points, const VSAPoint &p1Lin
if (VGObject::IsPointOnLineSegment(p2Line1, p1Line1, p1Line2, ToPixel(0.5, Unit::Mm)) && if (VGObject::IsPointOnLineSegment(p2Line1, p1Line1, p1Line2, ToPixel(0.5, Unit::Mm)) &&
IsOnLine(p2Line1, bigLine1.p2(), bigLine2.p1(), ToPixel(0.5, Unit::Mm))) IsOnLine(p2Line1, bigLine1.p2(), bigLine2.p1(), ToPixel(0.5, Unit::Mm)))
{ {
points.append(bigLine1.p2()); points.append(VRawSAPoint(bigLine1.p2(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
points.append(bigLine2.p1()); points.append(VRawSAPoint(bigLine2.p1(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points; return points;
} }
@ -1473,7 +1339,7 @@ QT_WARNING_POP
const QLineF::IntersectType type = Intersects(bigEdge, line, &px); const QLineF::IntersectType type = Intersects(bigEdge, line, &px);
if (type != QLineF::BoundedIntersection && line.length() < QLineF(p2Line1, px).length()) if (type != QLineF::BoundedIntersection && line.length() < QLineF(p2Line1, px).length())
{ {
points.append(crosPoint); points.append(VRawSAPoint(crosPoint, p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points; return points;
} }
} }
@ -1484,12 +1350,12 @@ QT_WARNING_POP
QLineF loop(crosPoint, bigLine1.p1()); QLineF loop(crosPoint, bigLine1.p1());
loop.setAngle(loop.angle() + 180); loop.setAngle(loop.angle() + 180);
loop.setLength(accuracyPointOnLine*2.); loop.setLength(accuracyPointOnLine*2.);
points.append(loop.p2()); points.append(VRawSAPoint(loop.p2(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
points.append(crosPoint); points.append(VRawSAPoint(crosPoint, p2Line1.CurvePoint(), p2Line1.TurnPoint()));
loop = QLineF(crosPoint, bigLine1.p1()); loop = QLineF(crosPoint, bigLine1.p1());
loop.setLength(loop.length() + localWidth*2.); loop.setLength(loop.length() + localWidth*2.);
points.append(VRawSAPoint(loop.p2(), true)); points.append(VRawSAPoint(loop.p2(), p2Line1.CurvePoint(), p2Line1.TurnPoint(), true));
} }
return points; return points;
@ -1504,20 +1370,20 @@ QT_WARNING_POP
{// The cross point is still outside of a piece {// The cross point is still outside of a piece
if (line.length() >= localWidth) if (line.length() >= localWidth)
{ {
points.append(crosPoint); points.append(VRawSAPoint(crosPoint, p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points; return points;
} }
// but not enough far, fix it // but not enough far, fix it
line.setLength(localWidth); line.setLength(localWidth);
points.append(line.p2()); points.append(VRawSAPoint(line.p2(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points; return points;
} }
// Wrong cross point, probably inside of a piece. Manually creating correct seam allowance // Wrong cross point, probably inside of a piece. Manually creating correct seam allowance
const QLineF bigEdge = SimpleParallelLine(bigLine1.p2(), bigLine2.p1(), localWidth ); const QLineF bigEdge = SimpleParallelLine(bigLine1.p2(), bigLine2.p1(), localWidth );
points.append(bigEdge.p1()); points.append(VRawSAPoint(bigEdge.p1(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
points.append(bigEdge.p2()); points.append(VRawSAPoint(bigEdge.p2(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points; return points;
} }
} }
@ -1525,8 +1391,9 @@ QT_WARNING_POP
} }
case (QLineF::NoIntersection): case (QLineF::NoIntersection):
/*If we have correct lines this means lines lie on a line or parallel.*/ /*If we have correct lines this means lines lie on a line or parallel.*/
points.append(bigLine1.p2()); points.append(VRawSAPoint(bigLine1.p2(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
points.append(bigLine2.p1()); // Second point for parallel line // Second point for parallel line
points.append(VRawSAPoint(bigLine2.p1(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points; return points;
default: default:
break; break;
@ -1657,10 +1524,8 @@ auto VAbstractPiece::GetUniqueID() const -> QString
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
auto VSAPoint::toJson() const -> QJsonObject auto VSAPoint::toJson() const -> QJsonObject
{ {
QJsonObject pointObject; QJsonObject pointObject = VLayoutPoint::toJson();
pointObject[QLatin1String("type")] = "VSAPoint"; pointObject[QLatin1String("type")] = "VSAPoint";
pointObject[QLatin1String("x")] = x();
pointObject[QLatin1String("y")] = y();
if (not VFuzzyComparePossibleNulls(m_before, -1)) if (not VFuzzyComparePossibleNulls(m_before, -1))
{ {
@ -1698,7 +1563,7 @@ auto VAbstractPiece::RollbackSeamAllowance(QVector<VRawSAPoint> points, const QL
&& VGObject::IsPointOnLineSegment(crosPoint, segment.p1(), segment.p2()) && VGObject::IsPointOnLineSegment(crosPoint, segment.p1(), segment.p2())
&& IsSameDirection(cuttingEdge.p2(), cuttingEdge.p1(), crosPoint)) && IsSameDirection(cuttingEdge.p2(), cuttingEdge.p1(), crosPoint))
{ {
clipped.append(crosPoint); clipped.append(VRawSAPoint(crosPoint, points.at(i).CurvePoint(), points.at(i).TurnPoint()));
for (int j=i-1; j>=0; --j) for (int j=i-1; j>=0; --j)
{ {
clipped.append(points.at(j)); clipped.append(points.at(j));
@ -1717,7 +1582,8 @@ auto VAbstractPiece::RollbackSeamAllowance(QVector<VRawSAPoint> points, const QL
if (type != QLineF::NoIntersection && IsOutsidePoint(secondLast.p1(), secondLast.p2(), crosPoint)) if (type != QLineF::NoIntersection && IsOutsidePoint(secondLast.p1(), secondLast.p2(), crosPoint))
{ {
points.append(crosPoint); points.append(VRawSAPoint(crosPoint, points.at(points.size()-1).CurvePoint(),
points.at(points.size()-1).TurnPoint()));
*success = true; *success = true;
} }
} }
@ -1919,20 +1785,275 @@ auto VAbstractPiece::GrainlinePoints(const VGrainlineData &geom, const VContaine
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
auto VAbstractPiece::PainterPath(const QVector<QPointF> &points) -> QPainterPath auto VAbstractPiece::PlaceLabelShape(const VLayoutPlaceLabel &label) -> PlaceLabelImg
{ {
QPainterPath path; auto LayoutPoint = [label](QPointF p, bool turnPoint = false, bool curvePoint = false)
path.setFillRule(Qt::WindingFill);
if (not points.isEmpty())
{ {
path.moveTo(points.at(0)); VLayoutPoint point(label.RotationMatrix().map(p));
for (qint32 i = 1; i < points.count(); ++i) point.SetTurnPoint(turnPoint);
point.SetCurvePoint(curvePoint);
return point;
};
const QPointF pos = label.Center();
const QRectF box = label.Box();
auto SegmentShape = [pos, box, LayoutPoint]()
{
QVector<VLayoutPoint> shape
{ {
path.lineTo(points.at(i)); LayoutPoint(QPointF(pos.x(), pos.y() - box.height()/2.0), true),
LayoutPoint(QPointF(pos.x(), pos.y() + box.height()/2.0), true)
};
return PlaceLabelImg{shape};
};
auto RectangleShape = [pos, box, LayoutPoint]()
{
QRectF rect(QPointF(pos.x() - box.width()/2.0, pos.y() - box.height()/2.0),
QPointF(pos.x() + box.width()/2.0, pos.y() + box.height()/2.0));
QVector<VLayoutPoint> shape
{
LayoutPoint(rect.topLeft(), true),
LayoutPoint(rect.topRight(), true),
LayoutPoint(rect.bottomRight(), true),
LayoutPoint(rect.bottomLeft(), true),
LayoutPoint(rect.topLeft(), true)
};
return PlaceLabelImg{shape};
};
auto CrossShape = [pos, box, LayoutPoint]()
{
QVector<VLayoutPoint> shape1
{
LayoutPoint(QPointF(pos.x(), pos.y() - box.height()/2.0), true),
LayoutPoint(QPointF(pos.x(), pos.y() + box.height()/2.0), true)
};
QVector<VLayoutPoint> shape2
{
LayoutPoint(QPointF(pos.x() - box.width()/2.0, pos.y()), true),
LayoutPoint(QPointF(pos.x() + box.width()/2.0, pos.y()), true)
};
return PlaceLabelImg{shape1, shape2};
};
auto TshapedShape = [pos, box, LayoutPoint]()
{
QPointF center2(pos.x(), pos.y() + box.height()/2.0);
QVector<VLayoutPoint> shape1
{
LayoutPoint(QPointF(pos.x(), pos.y()), true),
LayoutPoint(center2, true)
};
QVector<VLayoutPoint> shape2
{
LayoutPoint(QPointF(center2.x() - box.width()/2.0, center2.y()), true),
LayoutPoint(QPointF(center2.x() + box.width()/2.0, center2.y()), true)
};
return PlaceLabelImg{shape1, shape2};
};
auto DoubletreeShape = [pos, box, LayoutPoint]()
{
QRectF rect(QPointF(pos.x() - box.width()/2.0, pos.y() - box.height()/2.0),
QPointF(pos.x() + box.width()/2.0, pos.y() + box.height()/2.0));
QVector<VLayoutPoint> shape1
{
LayoutPoint(rect.topLeft(), true),
LayoutPoint(rect.bottomRight(), true)
};
QVector<VLayoutPoint> shape2
{
LayoutPoint(rect.topRight(), true),
LayoutPoint(rect.bottomLeft(), true)
};
return PlaceLabelImg{shape1, shape2};
};
auto CornerShape = [pos, box, LayoutPoint]()
{
QVector<VLayoutPoint> shape1
{
LayoutPoint(QPointF(pos.x(), pos.y()), true),
LayoutPoint(QPointF(pos.x(), pos.y() + box.height()/2.0), true)
};
QVector<VLayoutPoint> shape2
{
LayoutPoint(QPointF(pos.x() - box.width()/2.0, pos.y()), true),
LayoutPoint(QPointF(pos.x(), pos.y()), true)
};
return PlaceLabelImg{shape1, shape2};
};
auto TriangleShape = [pos, box, LayoutPoint]()
{
QRectF rect(QPointF(pos.x() - box.width()/2.0, pos.y() - box.height()/2.0),
QPointF(pos.x() + box.width()/2.0, pos.y() + box.height()/2.0));
QVector<VLayoutPoint> shape
{
LayoutPoint(rect.topLeft(), true),
LayoutPoint(rect.topRight(), true),
LayoutPoint(rect.bottomRight(), true),
LayoutPoint(rect.topLeft(), true)
};
return PlaceLabelImg{shape};
};
auto HshapedShape = [pos, box, LayoutPoint]()
{
const QPointF center1 (pos.x(), pos.y() - box.height()/2.0);
const QPointF center2 (pos.x(), pos.y() + box.height()/2.0);
QVector<VLayoutPoint> shape1
{
LayoutPoint(center1, true),
LayoutPoint(center2, true)
};
QVector<VLayoutPoint> shape2
{
LayoutPoint(QPointF(center1.x() - box.width()/2.0, center1.y()), true),
LayoutPoint(QPointF(center1.x() + box.width()/2.0, center1.y()), true)
};
QVector<VLayoutPoint> shape3
{
LayoutPoint(QPointF(center2.x() - box.width()/2.0, center2.y()), true),
LayoutPoint(QPointF(center2.x() + box.width()/2.0, center2.y()), true)
};
return PlaceLabelImg{shape1, shape2, shape3};
};
auto ButtonShape = [pos, box, LayoutPoint]()
{
const qreal radius = qMin(box.width()/2.0, box.height()/2.0);
QVector<VLayoutPoint> shape1
{
LayoutPoint(QPointF(pos.x(), pos.y() - radius), true),
LayoutPoint(QPointF(pos.x(), pos.y() + radius), true)
};
QVector<VLayoutPoint> shape2
{
LayoutPoint(QPointF(pos.x() - radius, pos.y()), true),
LayoutPoint(QPointF(pos.x() + radius, pos.y()), true)
};
const qreal circleSize = 0.85;
VArc arc(VPointF(pos), radius*circleSize, 0, 360);
arc.SetApproximationScale(10);
QVector<QPointF> points = arc.GetPoints();
if (not points.isEmpty() && ConstFirst(points) != ConstLast(points))
{
points.append(ConstFirst(points));
} }
path.lineTo(points.at(0));
QVector<VLayoutPoint> shape3;
for (int i=0; i < points.size(); ++i)
{
bool turnPoint = false;
if (i == 0 || i == points.size() -1)
{
turnPoint = true;
}
shape3.append(LayoutPoint(points.at(i), turnPoint, true));
}
return PlaceLabelImg{shape1, shape2, shape3};
};
auto CircleShape = [pos, box, LayoutPoint]()
{
const qreal radius = qMin(box.width()/2.0, box.height()/2.0);
VArc arc(VPointF(pos), radius, 0, 360);
arc.SetApproximationScale(10);
QVector<QPointF> points = arc.GetPoints();
if (not points.isEmpty() && ConstFirst(points) != ConstLast(points))
{
points.append(ConstFirst(points));
}
QVector<VLayoutPoint> circle;
for (int i=0; i < points.size(); ++i)
{
bool turnPoint = false;
if (i == 0 || i == points.size() -1)
{
turnPoint = true;
}
circle.append(LayoutPoint(points.at(i), turnPoint, true));
}
return PlaceLabelImg{circle};
};
switch(label.Type())
{
case PlaceLabelType::Segment:
return SegmentShape();
case PlaceLabelType::Rectangle:
return RectangleShape();
case PlaceLabelType::Cross:
return CrossShape();
case PlaceLabelType::Tshaped:
return TshapedShape();
case PlaceLabelType::Doubletree:
return DoubletreeShape();
case PlaceLabelType::Corner:
return CornerShape();
case PlaceLabelType::Triangle:
return TriangleShape();
case PlaceLabelType::Hshaped:
return HshapedShape();
case PlaceLabelType::Button:
return ButtonShape();
case PlaceLabelType::Circle:
return CircleShape();
default:
return {};
} }
return {};
}
//---------------------------------------------------------------------------------------------------------------------
auto VAbstractPiece::LabelShapePath(const VLayoutPlaceLabel &label) -> QPainterPath
{
return LabelShapePath(PlaceLabelShape(label));
}
//---------------------------------------------------------------------------------------------------------------------
auto VAbstractPiece::LabelShapePath(const PlaceLabelImg &shape) -> QPainterPath
{
QPainterPath path;
for (const auto &p : shape)
{
if (not p.isEmpty())
{
path.moveTo(ConstFirst<QPointF>(p));
QVector<QPointF> polygon;
CastTo(p, polygon);
path.addPolygon(polygon);
}
}
return path; return path;
} }

View File

@ -38,6 +38,7 @@
#include "../vmisc/compatibility.h" #include "../vmisc/compatibility.h"
#include "../vgeometry/vgobject.h" #include "../vgeometry/vgobject.h"
#include "vsapoint.h" #include "vsapoint.h"
#include "vrawsapoint.h"
#include "testpath.h" #include "testpath.h"
class VAbstractPieceData; class VAbstractPieceData;
@ -45,6 +46,9 @@ class QPainterPath;
class VGrainlineData; class VGrainlineData;
class VContainer; class VContainer;
class VRawSAPoint; class VRawSAPoint;
class VLayoutPlaceLabel;
using PlaceLabelImg = QVector<QVector<VLayoutPoint> >;
class VAbstractPiece class VAbstractPiece
{ {
@ -100,10 +104,10 @@ public:
*/ */
virtual auto GetUniqueID() const -> QString; virtual auto GetUniqueID() const -> QString;
static auto Equidistant(QVector<VSAPoint> points, qreal width, const QString &name) -> QVector<QPointF>; static auto Equidistant(QVector<VSAPoint> points, qreal width, const QString &name) -> QVector<VLayoutPoint>;
static auto SumTrapezoids(const QVector<QPointF> &points) -> qreal; static auto SumTrapezoids(const QVector<QPointF> &points) -> qreal;
static auto CheckLoops(const QVector<QPointF> &points) -> QVector<QPointF>; template <class T>
static auto CheckLoops(const QVector<VRawSAPoint> &points) -> QVector<QPointF>; static auto CheckLoops(QVector<T> points) -> QVector<T>;
static auto EkvPoint(QVector<VRawSAPoint> points, const VSAPoint &p1Line1, const VSAPoint &p2Line1, static auto EkvPoint(QVector<VRawSAPoint> points, const VSAPoint &p1Line1, const VSAPoint &p2Line1,
const VSAPoint &p1Line2, const VSAPoint &p2Line2, qreal width, const VSAPoint &p1Line2, const VSAPoint &p2Line2, qreal width,
bool *needRollback = nullptr) -> QVector<VRawSAPoint>; bool *needRollback = nullptr) -> QVector<VRawSAPoint>;
@ -122,28 +126,81 @@ public:
static auto GrainlinePoints(const VGrainlineData &geom, const VContainer *pattern, static auto GrainlinePoints(const VGrainlineData &geom, const VContainer *pattern,
const QRectF &boundingRect, qreal &dAng) -> QVector<QPointF>; const QRectF &boundingRect, qreal &dAng) -> QVector<QPointF>;
static auto PainterPath(const QVector<QPointF> &points) -> QPainterPath; template <class T>
static auto PainterPath(const QVector<T> &points) -> QPainterPath;
friend auto operator<< (QDataStream& dataStream, const VAbstractPiece& piece) -> QDataStream&; friend auto operator<< (QDataStream& dataStream, const VAbstractPiece& piece) -> QDataStream&;
friend auto operator>> (QDataStream& dataStream, VAbstractPiece& piece) -> QDataStream&; friend auto operator>> (QDataStream& dataStream, VAbstractPiece& piece) -> QDataStream&;
static auto PlaceLabelShape(const VLayoutPlaceLabel &label) -> PlaceLabelImg;
static auto LabelShapePath(const VLayoutPlaceLabel &label) -> QPainterPath;
static auto LabelShapePath(const PlaceLabelImg &shape) -> QPainterPath;
protected: protected:
template <class T> template <class T>
static auto RemoveDublicates(const QVector<T> &points, bool removeFirstAndLast = true) -> QVector<T>; static auto RemoveDublicates(const QVector<T> &points, bool removeFirstAndLast = true) -> QVector<T>;
static auto IsEkvPointOnLine(const QPointF &iPoint, const QPointF &prevPoint, const QPointF &nextPoint) -> bool; static auto IsEkvPointOnLine(const QPointF &iPoint, const QPointF &prevPoint, const QPointF &nextPoint) -> bool;
static auto IsEkvPointOnLine(const VSAPoint &iPoint, const VSAPoint &prevPoint, const VSAPoint &nextPoint) -> bool; static auto IsEkvPointOnLine(const VSAPoint &iPoint, const VSAPoint &prevPoint, const VSAPoint &nextPoint) -> bool;
template <class T>
static auto CheckPointOnLine(QVector<T> &points, const T &iPoint, const T &prevPoint, const T &nextPoint) -> bool;
static auto IsItemContained(const QRectF &parentBoundingRect, const QVector<QPointF> &shape, qreal &dX, static auto IsItemContained(const QRectF &parentBoundingRect, const QVector<QPointF> &shape, qreal &dX,
qreal &dY) -> bool; qreal &dY) -> bool;
static auto CorrectPosition(const QRectF &parentBoundingRect, QVector<QPointF> points) -> QVector<QPointF>; static auto CorrectPosition(const QRectF &parentBoundingRect, QVector<QPointF> points) -> QVector<QPointF>;
static auto FindGrainlineGeometry(const VGrainlineData& geom, const VContainer *pattern, qreal &length, static auto FindGrainlineGeometry(const VGrainlineData& geom, const VContainer *pattern, qreal &length,
qreal &rotationAngle, QPointF &pos) -> bool; qreal &rotationAngle, QPointF &pos) -> bool;
template <class T>
static auto ComparePoints(QVector<T> &points, const T &p1, const T &p2, qreal accuracy) -> bool;
template <class T>
static auto CompareFirstAndLastPoints(QVector<T> &points, qreal accuracy) -> void;
template <class T>
static auto CheckLoop(const QVector<T> &points, bool &loopFound) -> QVector<T>;
template <class T>
static auto IntersectionPoint(QPointF crosPoint, const T &l1p1, const T &l1p2, const T &l2p1, const T &l2p2) -> T;
private: private:
QSharedDataPointer<VAbstractPieceData> d; QSharedDataPointer<VAbstractPieceData> d;
}; };
Q_DECLARE_TYPEINFO(VAbstractPiece, Q_MOVABLE_TYPE); // NOLINT Q_DECLARE_TYPEINFO(VAbstractPiece, Q_MOVABLE_TYPE); // NOLINT
//---------------------------------------------------------------------------------------------------------------------
template <class T>
inline auto VAbstractPiece::CheckPointOnLine(QVector<T> &points, const T &iPoint, const T &prevPoint,
const T &nextPoint) -> bool
{
if (not IsEkvPointOnLine(iPoint, prevPoint, nextPoint))
{
points.append(iPoint);
return false;
}
if (not points.isEmpty() && iPoint.TurnPoint())
{
points.last().SetTurnPoint(true);
}
if (not points.isEmpty() && iPoint.CurvePoint())
{
points.last().SetCurvePoint(true);
}
return true;
}
//---------------------------------------------------------------------------------------------------------------------
template <>
inline auto VAbstractPiece::CheckPointOnLine<QPointF>(QVector<QPointF> &points, const QPointF &iPoint,
const QPointF &prevPoint, const QPointF &nextPoint) -> bool
{
if (not IsEkvPointOnLine(iPoint, prevPoint, nextPoint))
{
points.append(iPoint);
return false;
}
return true;
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
/** /**
* @brief CorrectEquidistantPoints clear equivalent points and remove point on line from equdistant. * @brief CorrectEquidistantPoints clear equivalent points and remove point on line from equdistant.
@ -151,7 +208,7 @@ Q_DECLARE_TYPEINFO(VAbstractPiece, Q_MOVABLE_TYPE); // NOLINT
* @return corrected list. * @return corrected list.
*/ */
template <class T> template <class T>
auto VAbstractPiece::CorrectEquidistantPoints(const QVector<T> &points, bool removeFirstAndLast) -> QVector<T> inline auto VAbstractPiece::CorrectEquidistantPoints(const QVector<T> &points, bool removeFirstAndLast) -> QVector<T>
{ {
// DumpVector(points, QStringLiteral("input.json.XXXXXX")); // Uncomment for dumping test data // DumpVector(points, QStringLiteral("input.json.XXXXXX")); // Uncomment for dumping test data
if (points.size()<4)//Better don't check if only three points. We can destroy equidistant. if (points.size()<4)//Better don't check if only three points. We can destroy equidistant.
@ -174,7 +231,7 @@ auto VAbstractPiece::CorrectEquidistantPoints(const QVector<T> &points, bool rem
QVector<T> buf2; QVector<T> buf2;
//Remove point on line //Remove point on line
for (qint32 i = 0; i < buf1.size(); ++i) for (qint32 i = 0; i < buf1.size(); ++i)
{// In this case we alwayse will have bounded intersection, so all is need is to check if point i is on line. {// In this case we alwayse will have bounded intersection, so all is need is to check if point is on line.
// Unfortunatelly QLineF::intersect can't be used in this case because of the floating-point accuraccy problem. // Unfortunatelly QLineF::intersect can't be used in this case because of the floating-point accuraccy problem.
if (prev == -1) if (prev == -1)
{ {
@ -213,9 +270,8 @@ auto VAbstractPiece::CorrectEquidistantPoints(const QVector<T> &points, bool rem
const T &prevPoint = buf1.at(prev); const T &prevPoint = buf1.at(prev);
const T &nextPoint = buf1.at(next); const T &nextPoint = buf1.at(next);
if (not IsEkvPointOnLine(iPoint, prevPoint, nextPoint)) if (not CheckPointOnLine(buf2, iPoint, prevPoint, nextPoint))
{ {
buf2.append(iPoint);
prev = -1; prev = -1;
} }
} }
@ -233,7 +289,7 @@ auto VAbstractPiece::CorrectEquidistantPoints(const QVector<T> &points, bool rem
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
template <class T> template <class T>
auto VAbstractPiece::RemoveDublicates(const QVector<T> &points, bool removeFirstAndLast) -> QVector<T> inline auto VAbstractPiece::RemoveDublicates(const QVector<T> &points, bool removeFirstAndLast) -> QVector<T>
{ {
if (points.size() < 4) if (points.size() < 4)
{ {
@ -252,9 +308,8 @@ auto VAbstractPiece::RemoveDublicates(const QVector<T> &points, bool removeFirst
{ {
for (int j = i+1; j < points.size(); ++j) for (int j = i+1; j < points.size(); ++j)
{ {
if (not VFuzzyComparePoints(points.at(i), points.at(j), accuracy)) if (not ComparePoints(p, points.at(i), points.at(j), accuracy))
{ {
p.append(points.at(j));
i = j-1; i = j-1;
break; break;
} }
@ -267,10 +322,7 @@ auto VAbstractPiece::RemoveDublicates(const QVector<T> &points, bool removeFirst
{ {
// Path can't be closed // Path can't be closed
// See issue #686 // See issue #686
if (VFuzzyComparePoints(ConstFirst(p), ConstLast(p), accuracy)) CompareFirstAndLastPoints(p, accuracy);
{
p.removeLast();
}
} }
} }
@ -279,7 +331,163 @@ auto VAbstractPiece::RemoveDublicates(const QVector<T> &points, bool removeFirst
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
template <class T> template <class T>
auto VAbstractPiece::IsInsidePolygon(const QVector<T> &path, const QVector<T> &polygon, qreal accuracy) -> bool inline auto VAbstractPiece::ComparePoints(QVector<T> &points, const T &p1, const T &p2, qreal accuracy) -> bool
{
qreal testAccuracy = accuracy;
if (p2.TurnPoint())
{
testAccuracy = accuracyPointOnLine;
}
if (not VFuzzyComparePoints(p1, p2, testAccuracy))
{
points.append(p2);
return false;
}
if (not points.isEmpty() && p2.TurnPoint())
{
points.last().SetTurnPoint(true);
}
if (not points.isEmpty() && p2.CurvePoint())
{
points.last().SetCurvePoint(true);
}
return true;
}
//---------------------------------------------------------------------------------------------------------------------
template <>
inline auto VAbstractPiece::ComparePoints(QVector<VRawSAPoint> &points, const VRawSAPoint &p1, const VRawSAPoint &p2,
qreal accuracy) -> bool
{
qreal testAccuracy = accuracy;
if ((p1.Primary() && p2.Primary()) || p2.TurnPoint())
{
testAccuracy = accuracyPointOnLine;
}
if (not VFuzzyComparePoints(p1, p2, testAccuracy))
{
points.append(p2);
return false;
}
if (not points.isEmpty() && p2.TurnPoint())
{
points.last().SetTurnPoint(true);
}
if (not points.isEmpty() && p2.CurvePoint())
{
points.last().SetCurvePoint(true);
}
return true;
}
//---------------------------------------------------------------------------------------------------------------------
template <>
inline auto VAbstractPiece::ComparePoints<QPointF>(QVector<QPointF> &points, const QPointF &p1, const QPointF &p2,
qreal accuracy) -> bool
{
if (not VFuzzyComparePoints(p1, p2, accuracy))
{
points.append(p2);
return false;
}
return true;
}
//---------------------------------------------------------------------------------------------------------------------
template <class T>
inline auto VAbstractPiece::CompareFirstAndLastPoints(QVector<T> &points, qreal accuracy) -> void
{
if (points.isEmpty())
{
return;
}
const T& first = ConstFirst(points);
const T& last = ConstLast(points);
qreal testAccuracy = accuracy;
if (last.TurnPoint())
{
testAccuracy = accuracyPointOnLine;
}
if (VFuzzyComparePoints(first, last, testAccuracy))
{
points.removeLast();
if (last.TurnPoint())
{
points.last().SetTurnPoint(true);
}
if (last.CurvePoint())
{
points.last().SetCurvePoint(true);
}
}
}
//---------------------------------------------------------------------------------------------------------------------
template <>
inline auto VAbstractPiece::CompareFirstAndLastPoints(QVector<VRawSAPoint> &points, qreal accuracy) -> void
{
if (points.isEmpty())
{
return;
}
const VRawSAPoint& first = ConstFirst(points);
const VRawSAPoint& last = ConstLast(points);
qreal testAccuracy = accuracy;
if ((first.Primary() && last.Primary()) || last.TurnPoint())
{
testAccuracy = accuracyPointOnLine;
}
if (VFuzzyComparePoints(first, last, testAccuracy))
{
points.removeLast();
if (last.TurnPoint())
{
points.last().SetTurnPoint(true);
}
if (last.CurvePoint())
{
points.last().SetCurvePoint(true);
}
}
}
//---------------------------------------------------------------------------------------------------------------------
template <>
inline auto VAbstractPiece::CompareFirstAndLastPoints<QPointF>(QVector<QPointF> &points, qreal accuracy) -> void
{
if (points.isEmpty())
{
return;
}
if (VFuzzyComparePoints(ConstFirst(points), ConstLast(points), accuracy))
{
points.removeLast();
}
}
//---------------------------------------------------------------------------------------------------------------------
template <class T>
inline auto VAbstractPiece::IsInsidePolygon(const QVector<T> &path, const QVector<T> &polygon, qreal accuracy) -> bool
{ {
// Edges must not intersect // Edges must not intersect
for (auto i = 0; i < path.count(); ++i) for (auto i = 0; i < path.count(); ++i)
@ -340,4 +548,167 @@ auto VAbstractPiece::IsInsidePolygon(const QVector<T> &path, const QVector<T> &p
{ return allowancePolygon.containsPoint(point, Qt::WindingFill); }); { return allowancePolygon.containsPoint(point, Qt::WindingFill); });
} }
//---------------------------------------------------------------------------------------------------------------------
template <class T>
inline auto VAbstractPiece::PainterPath(const QVector<T> &points) -> QPainterPath
{
QPainterPath path;
path.setFillRule(Qt::WindingFill);
if (not points.isEmpty())
{
path.moveTo(points.at(0));
for (qint32 i = 1; i < points.count(); ++i)
{
path.lineTo(points.at(i));
}
path.lineTo(points.at(0));
}
return path;
}
//---------------------------------------------------------------------------------------------------------------------
/**
* @brief CheckLoops seek and delete loops in equidistant.
* @param points vector of points of equidistant.
* @return vector of points of equidistant.
*/
template <class T>
inline auto VAbstractPiece::CheckLoops(QVector<T> points) -> QVector<T>
{
// DumpVector(points, QStringLiteral("input.json.XXXXXX")); // Uncomment for dumping test data
/*If we got less than 4 points no need seek loops.*/
if (points.size() < 4)
{
return points;
}
bool loopFound = false;
qint32 i;
const int maxLoops = 10000; // limit number of loops to be removed
for (i = 0; i < maxLoops; ++i)
{
points = CheckLoop(points, loopFound);
if (not loopFound)
{
break;
}
}
// DumpVector(ekvPoints, QStringLiteral("output.json.XXXXXX")); // Uncomment for dumping test data
return points;
}
//---------------------------------------------------------------------------------------------------------------------
template<class T>
inline auto VAbstractPiece::CheckLoop(const QVector<T> &points, bool &loopFound) -> QVector<T>
{
loopFound = false;
const bool pathClosed = (ConstFirst(points) == ConstLast(points));
QVector<T> ekvPoints;
ekvPoints.reserve(points.size());
qint32 i;
for (i = 0; i < points.size(); ++i)
{
/*Last three points no need to check.*/
/*Triangle can not contain a loop*/
if (loopFound || i > points.size()-4)
{
ekvPoints.append(points.at(i));
continue;
}
enum LoopIntersectType { NoIntersection, BoundedIntersection, ParallelIntersection };
QPointF crosPoint;
LoopIntersectType status = NoIntersection;
const QLineF line1(points.at(i), points.at(i+1));
const int limit = pathClosed && i == 0 ? 2 : 1;
qint32 j;
for (j = i+2; j < points.size()-limit; ++j)
{
QLineF line2(points.at(j), points.at(j+1));
const QLineF::IntersectType intersect = Intersects(line1, line2, &crosPoint);
if (intersect == QLineF::NoIntersection)
{ // According to the documentation QLineF::NoIntersection indicates that the lines do not intersect;
// i.e. they are parallel. But parallel also mean they can be on the same line.
// Method IsLineSegmentOnLineSegment will check it.
if (VGObject::IsLineSegmentOnLineSegment(line1, line2))
{// Now we really sure that segments are on the same line and have real intersections.
status = ParallelIntersection;
break;
}
}
else if (intersect == QLineF::BoundedIntersection)
{
status = BoundedIntersection;
break;
}
}
switch (status)
{
case ParallelIntersection:
/*We have found a loop.*/
ekvPoints.append(points.at(i));
ekvPoints.append(points.at(j+1));
i = j+1; // Skip a loop
loopFound = true;
break;
case BoundedIntersection:
ekvPoints.append(points.at(i));
ekvPoints.append(IntersectionPoint(crosPoint, points.at(i), points.at(i+1), points.at(j), points.at(j+1)));
i = j;
loopFound = true;
break;
case NoIntersection:
/*We have not found loop.*/
ekvPoints.append(points.at(i));
break;
default:
break;
}
}
return ekvPoints;
}
//---------------------------------------------------------------------------------------------------------------------
template<class T>
inline auto VAbstractPiece::IntersectionPoint(QPointF crosPoint, const T &l1p1, const T &l1p2, const T &l2p1,
const T &l2p2) -> T
{
T point(crosPoint);
if ((l1p1.CurvePoint() && l1p2.CurvePoint()) || (l2p1.CurvePoint() && l2p2.CurvePoint()) ||
(l1p1.CurvePoint() && l2p2.CurvePoint()))
{
point.SetCurvePoint(true);
}
if ((l1p1.TurnPoint() && l1p2.TurnPoint()) || (l2p1.TurnPoint() && l2p2.TurnPoint()) ||
(l1p1.TurnPoint() && l2p2.TurnPoint()))
{
point.SetTurnPoint(true);
}
return point;
}
//---------------------------------------------------------------------------------------------------------------------
template<>
inline auto VAbstractPiece::IntersectionPoint<QPointF>(QPointF crosPoint, const QPointF & /*unused*/,
const QPointF & /*unused*/, const QPointF & /*unused*/,
const QPointF & /*unused*/) -> QPointF
{
return crosPoint;
}
#endif // VABSTRACTPIECE_H #endif // VABSTRACTPIECE_H

View File

@ -15,6 +15,7 @@ HEADERS += \
$$PWD/vcontour.h \ $$PWD/vcontour.h \
$$PWD/vcontour_p.h \ $$PWD/vcontour_p.h \
$$PWD/vbestsquare.h \ $$PWD/vbestsquare.h \
$$PWD/vlayoutpoint.h \
$$PWD/vposition.h \ $$PWD/vposition.h \
$$PWD/vrawlayout.h \ $$PWD/vrawlayout.h \
$$PWD/vprintlayout.h \ $$PWD/vprintlayout.h \
@ -38,6 +39,7 @@ SOURCES += \
$$PWD/vbank.cpp \ $$PWD/vbank.cpp \
$$PWD/vcontour.cpp \ $$PWD/vcontour.cpp \
$$PWD/vbestsquare.cpp \ $$PWD/vbestsquare.cpp \
$$PWD/vlayoutpoint.cpp \
$$PWD/vposition.cpp \ $$PWD/vposition.cpp \
$$PWD/vrawlayout.cpp \ $$PWD/vrawlayout.cpp \
$$PWD/vprintlayout.cpp \ $$PWD/vprintlayout.cpp \

View File

@ -34,8 +34,6 @@
#include <QPainterPath> #include <QPainterPath>
#include <ciso646> #include <ciso646>
#include "../vmisc/typedef.h"
enum class LayoutExportFormats : qint8 enum class LayoutExportFormats : qint8
{ {
SVG = 0, SVG = 0,

File diff suppressed because it is too large Load Diff

View File

@ -55,6 +55,7 @@ class VPiece;
class VPieceLabelData; class VPieceLabelData;
class VAbstractPattern; class VAbstractPattern;
class VPatternLabelData; class VPatternLabelData;
class VLayoutPoint;
QT_WARNING_PUSH QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Wsuggest-final-types") QT_WARNING_DISABLE_GCC("-Wsuggest-final-types")
@ -67,75 +68,74 @@ public:
VLayoutPiece(); VLayoutPiece();
VLayoutPiece(const VLayoutPiece &detail); VLayoutPiece(const VLayoutPiece &detail);
virtual ~VLayoutPiece() override; ~VLayoutPiece() override;
VLayoutPiece &operator=(const VLayoutPiece &detail); auto operator=(const VLayoutPiece &detail) -> VLayoutPiece &;
#ifdef Q_COMPILER_RVALUE_REFS #ifdef Q_COMPILER_RVALUE_REFS
VLayoutPiece(VLayoutPiece &&detail) Q_DECL_NOTHROW; VLayoutPiece(VLayoutPiece &&detail) Q_DECL_NOTHROW;
VLayoutPiece &operator=(VLayoutPiece &&detail) Q_DECL_NOTHROW; auto operator=(VLayoutPiece &&detail) Q_DECL_NOTHROW -> VLayoutPiece &;
#endif #endif
static VLayoutPiece Create(const VPiece &piece, vidtype id, const VContainer *pattern); static auto Create(const VPiece &piece, vidtype id, const VContainer *pattern) -> VLayoutPiece;
virtual auto GetUniqueID() const -> QString override; auto GetUniqueID() const -> QString override;
QVector<QPointF> GetMappedContourPoints() const; auto GetMappedContourPoints() const -> QVector<VLayoutPoint>;
QVector<QPointF> GetContourPoints() const; auto GetContourPoints() const -> QVector<VLayoutPoint>;
void SetCountourPoints(const QVector<QPointF> &points, bool hideMainPath = false); void SetCountourPoints(const QVector<VLayoutPoint> &points, bool hideMainPath = false);
QVector<QPointF> GetMappedSeamAllowancePoints() const; auto GetMappedSeamAllowancePoints() const -> QVector<VLayoutPoint>;
QVector<QPointF> GetSeamAllowancePoints() const; auto GetSeamAllowancePoints() const -> QVector<VLayoutPoint>;
void SetSeamAllowancePoints(const QVector<QPointF> &points, bool seamAllowance = true, void SetSeamAllowancePoints(const QVector<VLayoutPoint> &points, bool seamAllowance = true,
bool seamAllowanceBuiltIn = false); bool seamAllowanceBuiltIn = false);
QVector<QPointF> GetMappedLayoutAllowancePoints() const; auto GetMappedLayoutAllowancePoints() const -> QVector<QPointF>;
QVector<QPointF> GetLayoutAllowancePoints() const; auto GetLayoutAllowancePoints() const -> QVector<QPointF>;
void SetLayoutAllowancePoints(); void SetLayoutAllowancePoints();
QVector<QPointF> GetMappedExternalContourPoints() const; auto GetMappedExternalContourPoints() const -> QVector<VLayoutPoint>;
QVector<QPointF> GetExternalContourPoints() const; auto GetExternalContourPoints() const -> QVector<VLayoutPoint>;
QVector<VLayoutPassmark> GetMappedPassmarks() const; auto GetMappedPassmarks() const -> QVector<VLayoutPassmark>;
QVector<VLayoutPassmark> GetPassmarks() const; auto GetPassmarks() const -> QVector<VLayoutPassmark>;
void SetPassmarks(const QVector<VLayoutPassmark> &passmarks); void SetPassmarks(const QVector<VLayoutPassmark> &passmarks);
QVector<VLayoutPlaceLabel> GetMappedPlaceLabels() const; auto GetPlaceLabels() const -> QVector<VLayoutPlaceLabel>;
QVector<VLayoutPlaceLabel> GetPlaceLabels() const;
void SetPlaceLabels(const QVector<VLayoutPlaceLabel> &labels); void SetPlaceLabels(const QVector<VLayoutPlaceLabel> &labels);
QVector<QVector<QPointF>> MappedInternalPathsForCut(bool cut) const; auto MappedInternalPathsForCut(bool cut) const -> QVector<QVector<VLayoutPoint> >;
QVector<VLayoutPiecePath> GetInternalPaths() const; auto GetInternalPaths() const -> QVector<VLayoutPiecePath>;
void SetInternalPaths(const QVector<VLayoutPiecePath> &internalPaths); void SetInternalPaths(const QVector<VLayoutPiecePath> &internalPaths);
QPointF GetPieceTextPosition() const; auto GetPieceTextPosition() const -> QPointF;
QStringList GetPieceText() const; auto GetPieceText() const -> QStringList;
void SetPieceText(const QString &qsName, const VPieceLabelData& data, const QFont& font, const VContainer *pattern); void SetPieceText(const QString &qsName, const VPieceLabelData& data, const QFont& font, const VContainer *pattern);
QPointF GetPatternTextPosition() const; auto GetPatternTextPosition() const -> QPointF;
QStringList GetPatternText() const; auto GetPatternText() const -> QStringList;
void SetPatternInfo(VAbstractPattern *pDoc, const VPatternLabelData& geom, const QFont& font, void SetPatternInfo(VAbstractPattern *pDoc, const VPatternLabelData& geom, const QFont& font,
const VContainer *pattern); const VContainer *pattern);
void SetGrainline(const VGrainlineData& geom, const VContainer *pattern); void SetGrainline(const VGrainlineData& geom, const VContainer *pattern);
QVector<QPointF> GetMappedGrainline() const; auto GetMappedGrainline() const -> QVector<QPointF>;
QVector<QPointF> GetGrainline() const; auto GetGrainline() const -> QVector<QPointF>;
bool IsGrainlineEnabled() const; auto IsGrainlineEnabled() const -> bool;
qreal GrainlineAngle() const; auto GrainlineAngle() const -> qreal;
GrainlineArrowDirection GrainlineArrowType() const; auto GrainlineArrowType() const -> GrainlineArrowDirection;
QTransform GetMatrix() const; auto GetMatrix() const -> QTransform;
void SetMatrix(const QTransform &matrix); void SetMatrix(const QTransform &matrix);
qreal GetLayoutWidth() const; auto GetLayoutWidth() const -> qreal;
void SetLayoutWidth(qreal value); void SetLayoutWidth(qreal value);
quint16 GetQuantity() const; auto GetQuantity() const -> quint16;
void SetQuantity(quint16 value); void SetQuantity(quint16 value);
vidtype GetId() const; auto GetId() const -> vidtype;
void SetId(vidtype id); void SetId(vidtype id);
bool IsMirror() const; auto IsMirror() const -> bool;
void SetMirror(bool value); void SetMirror(bool value);
void SetGradationId(const QString &id); void SetGradationId(const QString &id);
@ -154,36 +154,38 @@ public:
void Mirror(const QLineF &edge); void Mirror(const QLineF &edge);
void Mirror(); void Mirror();
int DetailEdgesCount() const; auto DetailEdgesCount() const -> int;
int LayoutEdgesCount() const; auto LayoutEdgesCount() const -> int;
QLineF LayoutEdge(int i) const; auto LayoutEdge(int i) const -> QLineF;
int LayoutEdgeByPoint(const QPointF &p1) const; auto LayoutEdgeByPoint(const QPointF &p1) const -> int;
QRectF MappedDetailBoundingRect() const; auto MappedDetailBoundingRect() const -> QRectF;
QRectF DetailBoundingRect() const; auto DetailBoundingRect() const -> QRectF;
QRectF MappedLayoutBoundingRect() const; auto MappedLayoutBoundingRect() const -> QRectF;
qreal Diagonal() const; auto Diagonal() const -> qreal;
static QRectF BoundingRect(QVector<QPointF> points); static auto BoundingRect(QVector<QPointF> points) -> QRectF;
bool isNull() const; auto isNull() const -> bool;
qint64 Square() const; auto Square() const -> qint64;
QPainterPath MappedContourPath() const; auto MappedContourPath() const -> QPainterPath;
QPainterPath ContourPath() const; auto ContourPath() const -> QPainterPath;
QPainterPath MappedLayoutAllowancePath() const; auto MappedLayoutAllowancePath() const -> QPainterPath;
void DrawMiniature(QPainter &painter) const; void DrawMiniature(QPainter &painter) const;
Q_REQUIRED_RESULT QGraphicsItem *GetItem(bool textAsPaths) const; Q_REQUIRED_RESULT auto GetItem(bool textAsPaths) const -> QGraphicsItem *;
bool IsLayoutAllowanceValid() const; auto IsLayoutAllowanceValid() const -> bool;
qreal BiggestEdge() const; auto BiggestEdge() const -> qreal;
friend QDataStream& operator<< (QDataStream& dataStream, const VLayoutPiece& piece); friend auto operator<< (QDataStream& dataStream, const VLayoutPiece& piece) -> QDataStream&;
friend QDataStream& operator>> (QDataStream& dataStream, VLayoutPiece& piece); friend auto operator>> (QDataStream& dataStream, VLayoutPiece& piece) -> QDataStream&;
auto MapPlaceLabelShape(PlaceLabelImg shape) const -> PlaceLabelImg;
protected: protected:
void SetGrainlineEnabled(bool enabled); void SetGrainlineEnabled(bool enabled);
@ -206,20 +208,20 @@ protected:
private: private:
QSharedDataPointer<VLayoutPieceData> d; QSharedDataPointer<VLayoutPieceData> d;
QVector<QPointF> DetailPath() const; auto DetailPath() const -> QVector<VLayoutPoint>;
Q_REQUIRED_RESULT QGraphicsPathItem *GetMainItem() const; Q_REQUIRED_RESULT auto GetMainItem() const -> QGraphicsPathItem *;
Q_REQUIRED_RESULT QGraphicsPathItem *GetMainPathItem() const; Q_REQUIRED_RESULT auto GetMainPathItem() const -> QGraphicsPathItem *;
void CreateLabelStrings(QGraphicsItem *parent, const QVector<QPointF> &labelShape, const VTextManager &tm, void CreateLabelStrings(QGraphicsItem *parent, const QVector<QPointF> &labelShape, const VTextManager &tm,
bool textAsPaths) const; bool textAsPaths) const;
void CreateGrainlineItem(QGraphicsItem *parent) const; void CreateGrainlineItem(QGraphicsItem *parent) const;
template <class T> template <class T>
QVector<T> Map(QVector<T> points) const; auto Map(QVector<T> points) const -> QVector<T>;
QLineF Edge(const QVector<QPointF> &path, int i) const; auto Edge(const QVector<QPointF> &path, int i) const -> QLineF;
int EdgeByPoint(const QVector<QPointF> &path, const QPointF &p1) const; auto EdgeByPoint(const QVector<QPointF> &path, const QPointF &p1) const -> int;
}; };
QT_WARNING_POP QT_WARNING_POP

View File

@ -34,9 +34,7 @@
#include <QVector> #include <QVector>
#include <QTransform> #include <QTransform>
#include "../vpatterndb/floatItemData/vpiecelabeldata.h" #include "../vpatterndb/floatItemData/floatitemdef.h"
#include "../vpatterndb/floatItemData/vpatternlabeldata.h"
#include "../vpatterndb/floatItemData/vgrainlinedata.h"
#if QT_VERSION < QT_VERSION_CHECK(5, 5, 0) #if QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
#include "../vmisc/diagnostic.h" #include "../vmisc/diagnostic.h"
#endif // QT_VERSION < QT_VERSION_CHECK(5, 5, 0) #endif // QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
@ -47,6 +45,8 @@
#include "../vgeometry/vgeometrydef.h" #include "../vgeometry/vgeometrydef.h"
#include "vtextmanager.h" #include "vtextmanager.h"
#include "../ifc/exception/vexception.h" #include "../ifc/exception/vexception.h"
#include "vlayoutpoint.h"
#include "vlayoutplacelabel.h"
QT_WARNING_PUSH QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Weffc++") QT_WARNING_DISABLE_GCC("-Weffc++")
@ -55,126 +55,99 @@ QT_WARNING_DISABLE_GCC("-Wnon-virtual-dtor")
class VLayoutPieceData : public QSharedData class VLayoutPieceData : public QSharedData
{ {
public: public:
VLayoutPieceData() VLayoutPieceData(){} // NOLINT(modernize-use-equals-default)
{}
VLayoutPieceData(const VLayoutPieceData &detail)
: QSharedData(detail),
contour(detail.contour),
seamAllowance(detail.seamAllowance),
layoutAllowance(detail.layoutAllowance),
passmarks(detail.passmarks),
m_internalPaths(detail.m_internalPaths),
matrix(detail.matrix),
layoutWidth(detail.layoutWidth),
mirror(detail.mirror),
detailLabel(detail.detailLabel),
patternInfo(detail.patternInfo),
grainlinePoints(detail.grainlinePoints),
grainlineArrowType(detail.grainlineArrowType),
grainlineAngle(detail.grainlineAngle),
grainlineEnabled(detail.grainlineEnabled),
m_tmDetail(detail.m_tmDetail),
m_tmPattern(detail.m_tmPattern),
m_placeLabels(detail.m_placeLabels),
m_square(detail.m_square),
m_quantity(detail.m_quantity),
m_id(detail.m_id),
m_gradationId(detail.m_gradationId),
m_xScale(detail.m_xScale),
m_yScale(detail.m_yScale)
{}
VLayoutPieceData(const VLayoutPieceData &detail) = default;
~VLayoutPieceData() = default; ~VLayoutPieceData() = default;
friend QDataStream& operator<<(QDataStream& dataStream, const VLayoutPieceData& piece); friend auto operator<<(QDataStream& dataStream, const VLayoutPieceData& piece) -> QDataStream&;
friend QDataStream& operator>>(QDataStream& dataStream, VLayoutPieceData& piece); friend auto operator>>(QDataStream& dataStream, VLayoutPieceData& piece) -> QDataStream&;
/** @brief contour list of contour points. */ /** @brief contour list of contour points. */
QVector<QPointF> contour{}; QVector<VLayoutPoint> m_contour{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @brief seamAllowance list of seam allowance points. */ /** @brief seamAllowance list of seam allowance points. */
QVector<QPointF> seamAllowance{}; QVector<VLayoutPoint> m_seamAllowance{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @brief layoutAllowance list of layout allowance points. */ /** @brief layoutAllowance list of layout allowance points. */
QVector<QPointF> layoutAllowance{}; QVector<QPointF> m_layoutAllowance{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @brief passmarks list of passmakrs. */ /** @brief passmarks list of passmakrs. */
QVector<VLayoutPassmark> passmarks{}; QVector<VLayoutPassmark> m_passmarks{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @brief m_internalPaths list of internal paths. */ /** @brief m_internalPaths list of internal paths. */
QVector<VLayoutPiecePath> m_internalPaths{}; QVector<VLayoutPiecePath> m_internalPaths{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @brief matrix transformation matrix*/ /** @brief matrix transformation matrix*/
QTransform matrix{}; QTransform m_matrix{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @brief layoutWidth value layout allowance width in pixels. */ /** @brief layoutWidth value layout allowance width in pixels. */
qreal layoutWidth{0}; qreal m_layoutWidth{0}; // NOLINT(misc-non-private-member-variables-in-classes)
bool mirror{false}; bool m_mirror{false}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @brief detailLabel detail label rectangle */ /** @brief detailLabel detail label rectangle */
QVector<QPointF> detailLabel{}; QVector<QPointF> m_detailLabel{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @brief patternInfo pattern info rectangle */ /** @brief patternInfo pattern info rectangle */
QVector<QPointF> patternInfo{}; QVector<QPointF> m_patternInfo{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @brief grainlineInfo line */ /** @brief grainlineInfo line */
QVector<QPointF> grainlinePoints{}; QVector<QPointF> m_grainlinePoints{}; // NOLINT(misc-non-private-member-variables-in-classes)
GrainlineArrowDirection grainlineArrowType{GrainlineArrowDirection::atFront}; GrainlineArrowDirection m_grainlineArrowType{GrainlineArrowDirection::atFront}; // NOLINT(misc-non-private-member-variables-in-classes)
qreal grainlineAngle{0}; qreal m_grainlineAngle{0}; // NOLINT(misc-non-private-member-variables-in-classes)
bool grainlineEnabled{false}; bool m_grainlineEnabled{false}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @brief m_tmDetail text manager for laying out detail info */ /** @brief m_tmDetail text manager for laying out detail info */
VTextManager m_tmDetail{}; VTextManager m_tmDetail{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @brief m_tmPattern text manager for laying out pattern info */ /** @brief m_tmPattern text manager for laying out pattern info */
VTextManager m_tmPattern{}; VTextManager m_tmPattern{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @brief m_placeLabels list of place labels. */ /** @brief m_placeLabels list of place labels. */
QVector<VLayoutPlaceLabel> m_placeLabels{}; QVector<VLayoutPlaceLabel> m_placeLabels{}; // NOLINT(misc-non-private-member-variables-in-classes)
qint64 m_square{0}; qint64 m_square{0}; // NOLINT(misc-non-private-member-variables-in-classes)
quint16 m_quantity{1}; quint16 m_quantity{1}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @brief m_id keep id of original piece. */ /** @brief m_id keep id of original piece. */
vidtype m_id; vidtype m_id{NULL_ID}; // NOLINT(misc-non-private-member-variables-in-classes)
QString m_gradationId{}; QString m_gradationId{}; // NOLINT(misc-non-private-member-variables-in-classes)
qreal m_xScale{1.0}; qreal m_xScale{1.0}; // NOLINT(misc-non-private-member-variables-in-classes)
qreal m_yScale{1.0}; qreal m_yScale{1.0}; // NOLINT(misc-non-private-member-variables-in-classes)
private: private:
Q_DISABLE_ASSIGN(VLayoutPieceData) Q_DISABLE_ASSIGN_MOVE(VLayoutPieceData) // NOLINT
static const quint32 streamHeader; static constexpr quint32 streamHeader{0x80D7D009}; // CRC-32Q string "VLayoutPieceData"
static const quint16 classVersion; static constexpr quint16 classVersion{4};
}; };
// Friend functions // Friend functions
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
inline QDataStream &operator<<(QDataStream &dataStream, const VLayoutPieceData &piece) inline auto operator<<(QDataStream &dataStream, const VLayoutPieceData &piece) -> QDataStream &
{ {
dataStream << VLayoutPieceData::streamHeader << VLayoutPieceData::classVersion; dataStream << VLayoutPieceData::streamHeader << VLayoutPieceData::classVersion;
// Added in classVersion = 1 // Added in classVersion = 1
dataStream << piece.contour; dataStream << piece.m_contour;
dataStream << piece.seamAllowance; dataStream << piece.m_seamAllowance;
dataStream << piece.layoutAllowance; dataStream << piece.m_layoutAllowance;
dataStream << piece.passmarks; dataStream << piece.m_passmarks;
dataStream << piece.m_internalPaths; dataStream << piece.m_internalPaths;
dataStream << piece.matrix; dataStream << piece.m_matrix;
dataStream << piece.layoutWidth; dataStream << piece.m_layoutWidth;
dataStream << piece.mirror; dataStream << piece.m_mirror;
dataStream << piece.detailLabel; dataStream << piece.m_detailLabel;
dataStream << piece.patternInfo; dataStream << piece.m_patternInfo;
dataStream << piece.grainlinePoints; dataStream << piece.m_grainlinePoints;
dataStream << piece.grainlineArrowType; dataStream << piece.m_grainlineArrowType;
dataStream << piece.grainlineAngle; dataStream << piece.m_grainlineAngle;
dataStream << piece.grainlineEnabled; dataStream << piece.m_grainlineEnabled;
dataStream << piece.m_placeLabels; dataStream << piece.m_placeLabels;
dataStream << piece.m_square; dataStream << piece.m_square;
@ -193,7 +166,7 @@ inline QDataStream &operator<<(QDataStream &dataStream, const VLayoutPieceData &
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
inline QDataStream &operator>>(QDataStream &dataStream, VLayoutPieceData &piece) inline auto operator>>(QDataStream &dataStream, VLayoutPieceData &piece) -> QDataStream &
{ {
quint32 actualStreamHeader = 0; quint32 actualStreamHeader = 0;
dataStream >> actualStreamHeader; dataStream >> actualStreamHeader;
@ -218,20 +191,37 @@ inline QDataStream &operator>>(QDataStream &dataStream, VLayoutPieceData &piece)
throw VException(message); throw VException(message);
} }
dataStream >> piece.contour; if (actualClassVersion < 4)
dataStream >> piece.seamAllowance; {
dataStream >> piece.layoutAllowance; auto ReadPoints = [&dataStream]()
dataStream >> piece.passmarks; {
QVector<QPointF> points;
dataStream >> points;
QVector<VLayoutPoint> casted;
CastTo(points, casted);
return casted;
};
piece.m_contour = ReadPoints();
piece.m_seamAllowance = ReadPoints();
}
else
{
dataStream >> piece.m_contour;
dataStream >> piece.m_seamAllowance;
}
dataStream >> piece.m_layoutAllowance;
dataStream >> piece.m_passmarks;
dataStream >> piece.m_internalPaths; dataStream >> piece.m_internalPaths;
dataStream >> piece.matrix; dataStream >> piece.m_matrix;
dataStream >> piece.layoutWidth; dataStream >> piece.m_layoutWidth;
dataStream >> piece.mirror; dataStream >> piece.m_mirror;
dataStream >> piece.detailLabel; dataStream >> piece.m_detailLabel;
dataStream >> piece.patternInfo; dataStream >> piece.m_patternInfo;
dataStream >> piece.grainlinePoints; dataStream >> piece.m_grainlinePoints;
dataStream >> piece.grainlineArrowType; dataStream >> piece.m_grainlineArrowType;
dataStream >> piece.grainlineAngle; dataStream >> piece.m_grainlineAngle;
dataStream >> piece.grainlineEnabled; dataStream >> piece.m_grainlineEnabled;
dataStream >> piece.m_placeLabels; dataStream >> piece.m_placeLabels;
dataStream >> piece.m_square; dataStream >> piece.m_square;

View File

@ -28,13 +28,9 @@
#include "vlayoutpiecepath.h" #include "vlayoutpiecepath.h"
#include "vlayoutpiecepath_p.h" #include "vlayoutpiecepath_p.h"
#include "vlayoutdef.h"
#include <QPainterPath> #include <QPainterPath>
const quint32 VLayoutPiecePathData::streamHeader = 0xA53F0225; // CRC-32Q string "VLayoutPiecePathData"
const quint16 VLayoutPiecePathData::classVersion = 1;
// Friend functions // Friend functions
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QDataStream &operator<<(QDataStream &dataStream, const VLayoutPiecePath &path) QDataStream &operator<<(QDataStream &dataStream, const VLayoutPiecePath &path)
@ -57,7 +53,7 @@ VLayoutPiecePath::VLayoutPiecePath()
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
VLayoutPiecePath::VLayoutPiecePath(const QVector<QPointF> &points) VLayoutPiecePath::VLayoutPiecePath(const QVector<VLayoutPoint> &points)
: d(new VLayoutPiecePathData(points)) : d(new VLayoutPiecePathData(points))
{ {
} }
@ -104,20 +100,22 @@ QPainterPath VLayoutPiecePath::GetPainterPath() const
QPainterPath path; QPainterPath path;
if (not d->m_points.isEmpty()) if (not d->m_points.isEmpty())
{ {
path.addPolygon(QPolygonF(d->m_points)); QVector<QPointF> points;
CastTo(d->m_points, points);
path.addPolygon(QPolygonF(points));
path.setFillRule(Qt::WindingFill); path.setFillRule(Qt::WindingFill);
} }
return path; return path;
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QVector<QPointF> VLayoutPiecePath::Points() const QVector<VLayoutPoint> VLayoutPiecePath::Points() const
{ {
return d->m_points; return d->m_points;
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VLayoutPiecePath::SetPoints(const QVector<QPointF> &points) void VLayoutPiecePath::SetPoints(const QVector<VLayoutPoint> &points)
{ {
d->m_points = points; d->m_points = points;
} }

View File

@ -29,6 +29,7 @@
#ifndef VLAYOUTPIECEPATH_H #ifndef VLAYOUTPIECEPATH_H
#define VLAYOUTPIECEPATH_H #define VLAYOUTPIECEPATH_H
#include "vlayoutpoint.h"
#include <QPointF> #include <QPointF>
#include <QSharedDataPointer> #include <QSharedDataPointer>
#include <QMetaType> #include <QMetaType>
@ -40,7 +41,7 @@ class VLayoutPiecePath
{ {
public: public:
VLayoutPiecePath(); VLayoutPiecePath();
explicit VLayoutPiecePath(const QVector<QPointF> &points); explicit VLayoutPiecePath(const QVector<VLayoutPoint> &points);
VLayoutPiecePath(const VLayoutPiecePath &path); VLayoutPiecePath(const VLayoutPiecePath &path);
virtual ~VLayoutPiecePath(); virtual ~VLayoutPiecePath();
@ -53,8 +54,8 @@ public:
QPainterPath GetPainterPath() const; QPainterPath GetPainterPath() const;
QVector<QPointF> Points() const; QVector<VLayoutPoint> Points() const;
void SetPoints(const QVector<QPointF> &points); void SetPoints(const QVector<VLayoutPoint> &points);
Qt::PenStyle PenStyle() const; Qt::PenStyle PenStyle() const;
void SetPenStyle(const Qt::PenStyle &penStyle); void SetPenStyle(const Qt::PenStyle &penStyle);

View File

@ -41,6 +41,7 @@
# include "../vmisc/vdatastreamenum.h" # include "../vmisc/vdatastreamenum.h"
#endif #endif
#include "../ifc/exception/vexception.h" #include "../ifc/exception/vexception.h"
#include "vlayoutpoint.h"
QT_WARNING_PUSH QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Weffc++") QT_WARNING_DISABLE_GCC("-Weffc++")
@ -52,24 +53,18 @@ public:
VLayoutPiecePathData() VLayoutPiecePathData()
{} {}
explicit VLayoutPiecePathData(const QVector<QPointF> &points) explicit VLayoutPiecePathData(const QVector<VLayoutPoint> &points)
: m_points(points) : m_points(points)
{} {}
VLayoutPiecePathData(const VLayoutPiecePathData &path) VLayoutPiecePathData(const VLayoutPiecePathData &path) = default;
: QSharedData(path),
m_points(path.m_points),
m_penStyle(path.m_penStyle),
m_cut(path.m_cut)
{}
~VLayoutPiecePathData() = default; ~VLayoutPiecePathData() = default;
friend QDataStream& operator<<(QDataStream& dataStream, const VLayoutPiecePathData& path); friend QDataStream& operator<<(QDataStream& dataStream, const VLayoutPiecePathData& path);
friend QDataStream& operator>>(QDataStream& dataStream, VLayoutPiecePathData& path); friend QDataStream& operator>>(QDataStream& dataStream, VLayoutPiecePathData& path);
/** @brief m_points list of path points. */ /** @brief m_points list of path points. */
QVector<QPointF> m_points{}; QVector<VLayoutPoint> m_points{};
/** @brief m_penStyle path pen style. */ /** @brief m_penStyle path pen style. */
Qt::PenStyle m_penStyle{Qt::SolidLine}; Qt::PenStyle m_penStyle{Qt::SolidLine};
@ -79,8 +74,8 @@ public:
private: private:
Q_DISABLE_ASSIGN(VLayoutPiecePathData) Q_DISABLE_ASSIGN(VLayoutPiecePathData)
static const quint32 streamHeader; static constexpr quint32 streamHeader = 0xA53F0225; // CRC-32Q string "VLayoutPiecePathData"
static const quint16 classVersion; static constexpr quint16 classVersion = 2;
}; };
QT_WARNING_POP QT_WARNING_POP
@ -127,7 +122,16 @@ QDataStream& operator>>(QDataStream &dataStream, VLayoutPiecePathData &path)
throw VException(message); throw VException(message);
} }
dataStream >> path.m_points; if (actualClassVersion == 1)
{
QVector<QPointF> points;
dataStream >> points;
CastTo(points, path.m_points);
}
else
{
dataStream >> path.m_points;
}
dataStream >> path.m_penStyle; dataStream >> path.m_penStyle;
dataStream >> path.m_cut; dataStream >> path.m_cut;

View File

@ -0,0 +1,52 @@
/************************************************************************
**
** @file vlayoutpoint.cpp
** @author Roman Telezhynskyi <dismine(at)gmail.com>
** @date 17 10, 2022
**
** @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) 2022 Valentina project
** <https://gitlab.com/smart-pattern/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 "vlayoutpoint.h"
#include <QJsonObject>
//---------------------------------------------------------------------------------------------------------------------
auto VLayoutPoint::toJson() const -> QJsonObject
{
QJsonObject pointObject;
pointObject[QLatin1String("type")] = "VLayoutPoint";
pointObject[QLatin1String("x")] = x();
pointObject[QLatin1String("y")] = y();
if (m_turnPoint)
{
pointObject[QLatin1String("turnPoint")] = m_turnPoint;
}
if (m_curvePoint)
{
pointObject[QLatin1String("curvePoint")] = m_curvePoint;
}
return pointObject;
}

View File

@ -0,0 +1,146 @@
/************************************************************************
**
** @file vlayoutpoint.h
** @author Roman Telezhynskyi <dismine(at)gmail.com>
** @date 8 10, 2022
**
** @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) 2022 Valentina project
** <https://gitlab.com/smart-pattern/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 VLAYOUTPOINT_H
#define VLAYOUTPOINT_H
#include <QtGlobal>
#include <QPointF>
#include <QMetaType>
#include <QVector>
#if QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
#include "../vmisc/diagnostic.h"
#endif // QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Weffc++")
QT_WARNING_DISABLE_GCC("-Wnon-virtual-dtor")
QT_WARNING_DISABLE_CLANG("-Wnon-virtual-dtor")
class VLayoutPoint : public QPointF
{
public:
Q_DECL_CONSTEXPR VLayoutPoint() = default;
Q_DECL_CONSTEXPR VLayoutPoint(qreal xpos, qreal ypos);
Q_DECL_CONSTEXPR explicit VLayoutPoint(QPointF p);
Q_DECL_CONSTEXPR auto TurnPoint() const -> bool;
Q_DECL_CONSTEXPR auto CurvePoint() const -> bool;
Q_DECL_RELAXED_CONSTEXPR void SetTurnPoint(bool newTurnPoint);
Q_DECL_RELAXED_CONSTEXPR void SetCurvePoint(bool newCurvePoint);
virtual auto toJson() const -> QJsonObject;
private:
bool m_turnPoint{false};
bool m_curvePoint{false};
};
Q_DECLARE_METATYPE(VLayoutPoint) // NOLINT
Q_DECLARE_TYPEINFO(VLayoutPoint, Q_MOVABLE_TYPE); // NOLINT
//---------------------------------------------------------------------------------------------------------------------
template <class T>
inline auto CastTo(const QVector<T> &points, QVector<T> &casted) -> void
{
Q_UNUSED(points)
Q_UNUSED(casted)
}
//---------------------------------------------------------------------------------------------------------------------
//upcast
template <class Derived, class Base, typename std::enable_if<std::is_base_of<Base, Derived>::value>::type* = nullptr>
inline auto CastTo(const QVector<Base> &points, QVector<Derived> &casted) -> void
{
casted.clear();
casted.reserve(points.size());
for (const auto &p : points)
{
casted.append(Derived(p));
}
}
//---------------------------------------------------------------------------------------------------------------------
//downcast
template <class Base, class Derived, typename std::enable_if<std::is_base_of<Base, Derived>::value>::type* = nullptr>
inline auto CastTo(const QVector<Derived> &points, QVector<Base> &casted) -> void
{
casted.clear();
casted.reserve(points.size());
for (const auto &p : points)
{
casted.append(p);
}
}
/*****************************************************************************
VLayoutPoint stream functions
*****************************************************************************/
#ifndef QT_NO_DATASTREAM
auto operator<<(QDataStream &, const VLayoutPoint &) -> QDataStream &;
auto operator>>(QDataStream &, VLayoutPoint &) -> QDataStream &;
#endif
//---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR inline VLayoutPoint::VLayoutPoint(qreal xpos, qreal ypos)
: QPointF(xpos, ypos)
{}
//---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR inline VLayoutPoint::VLayoutPoint(QPointF p)
: QPointF(p)
{}
//---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR inline auto VLayoutPoint::TurnPoint() const -> bool
{
return m_turnPoint;
}
//---------------------------------------------------------------------------------------------------------------------
Q_DECL_RELAXED_CONSTEXPR inline void VLayoutPoint::SetTurnPoint(bool newTurnPoint)
{
m_turnPoint = newTurnPoint;
}
//---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR inline auto VLayoutPoint::CurvePoint() const -> bool
{
return m_curvePoint;
}
//---------------------------------------------------------------------------------------------------------------------
Q_DECL_RELAXED_CONSTEXPR inline void VLayoutPoint::SetCurvePoint(bool newCurvePoint)
{
m_curvePoint = newCurvePoint;
}
QT_WARNING_POP
#endif // VLAYOUTPOINT_H

View File

@ -53,6 +53,7 @@
#include "../vmisc/def.h" #include "../vmisc/def.h"
#include "../ifc/exception/vexception.h" #include "../ifc/exception/vexception.h"
#include "../vpatterndb/floatItemData/floatitemdef.h" #include "../vpatterndb/floatItemData/floatitemdef.h"
#include "../vlayout/vlayoutpoint.h"
namespace namespace
{ {
@ -461,8 +462,9 @@ auto VPosition::Crossing(const VLayoutPiece &detail) const -> VPosition::Crossin
const QRectF layoutBoundingRect = VLayoutPiece::BoundingRect(layoutPoints); const QRectF layoutBoundingRect = VLayoutPiece::BoundingRect(layoutPoints);
const QPainterPath layoutAllowancePath = VAbstractPiece::PainterPath(layoutPoints); const QPainterPath layoutAllowancePath = VAbstractPiece::PainterPath(layoutPoints);
const QVector<QPointF> contourPoints = detail.IsSeamAllowance() && not detail.IsSeamAllowanceBuiltIn() ? QVector<QPointF> contourPoints;
detail.GetMappedSeamAllowancePoints() : detail.GetMappedContourPoints(); CastTo(detail.IsSeamAllowance() && not detail.IsSeamAllowanceBuiltIn() ?
detail.GetMappedSeamAllowancePoints() : detail.GetMappedContourPoints(), contourPoints);
const QRectF detailBoundingRect = VLayoutPiece::BoundingRect(contourPoints); const QRectF detailBoundingRect = VLayoutPiece::BoundingRect(contourPoints);
const QPainterPath contourPath = VAbstractPiece::PainterPath(contourPoints); const QPainterPath contourPath = VAbstractPiece::PainterPath(contourPoints);

View File

@ -31,14 +31,13 @@
#include <QJsonObject> #include <QJsonObject>
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QJsonObject VRawSAPoint::toJson() const auto VRawSAPoint::toJson() const -> QJsonObject
{ {
QJsonObject pointObject; QJsonObject pointObject = VLayoutPoint::toJson();
pointObject[QLatin1String("type")] = "VRawSAPoint";
pointObject[QLatin1String("x")] = x();
pointObject[QLatin1String("y")] = y();
pointObject[QLatin1String("type")] = "VRawSAPoint";
pointObject[QLatin1String("loopPoint")] = m_loopPoint; pointObject[QLatin1String("loopPoint")] = m_loopPoint;
pointObject[QLatin1String("primary")] = m_primary;
return pointObject; return pointObject;
} }

View File

@ -28,59 +28,78 @@
#ifndef VRAWSAPOINT_H #ifndef VRAWSAPOINT_H
#define VRAWSAPOINT_H #define VRAWSAPOINT_H
#include <QPointF> #include <QtGlobal>
#if QT_VERSION < QT_VERSION_CHECK(5, 5, 0) #if QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
#include "../vmisc/diagnostic.h" #include "../vmisc/diagnostic.h"
#endif // QT_VERSION < QT_VERSION_CHECK(5, 5, 0) #endif // QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
#include "../vmisc/def.h" #include "vlayoutpoint.h"
QT_WARNING_PUSH QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Weffc++") QT_WARNING_DISABLE_GCC("-Weffc++")
QT_WARNING_DISABLE_GCC("-Wnon-virtual-dtor") QT_WARNING_DISABLE_GCC("-Wnon-virtual-dtor")
QT_WARNING_DISABLE_CLANG("-Wnon-virtual-dtor")
class VRawSAPoint : public QPointF class VRawSAPoint : public VLayoutPoint
{ {
public: public:
Q_DECL_CONSTEXPR VRawSAPoint(); Q_DECL_CONSTEXPR VRawSAPoint() = default;
Q_DECL_CONSTEXPR VRawSAPoint(qreal xpos, qreal ypos); Q_DECL_CONSTEXPR VRawSAPoint(qreal xpos, qreal ypos);
Q_DECL_CONSTEXPR VRawSAPoint(QPointF p); Q_DECL_CONSTEXPR explicit VRawSAPoint(QPointF p);
Q_DECL_CONSTEXPR VRawSAPoint(QPointF p, bool loopPoint); Q_DECL_CONSTEXPR explicit VRawSAPoint(const VLayoutPoint &p);
Q_DECL_CONSTEXPR VRawSAPoint(QPointF p, bool curvePoint, bool turnPoint);
Q_DECL_CONSTEXPR VRawSAPoint(QPointF p, bool curvePoint, bool turnPoint, bool loopPoint);
Q_DECL_CONSTEXPR bool LoopPoint() const; Q_DECL_CONSTEXPR auto LoopPoint() const -> bool;
Q_DECL_RELAXED_CONSTEXPR void SetLoopPoint(bool loopPoint); Q_DECL_RELAXED_CONSTEXPR void SetLoopPoint(bool loopPoint);
QJsonObject toJson() const; Q_DECL_CONSTEXPR auto Primary() const -> bool;
Q_DECL_RELAXED_CONSTEXPR void SetPrimary(bool primary);
auto toJson() const -> QJsonObject override;
private: private:
bool m_loopPoint{false}; bool m_loopPoint{false};
bool m_primary{false};
}; };
Q_DECLARE_METATYPE(VRawSAPoint) Q_DECLARE_METATYPE(VRawSAPoint) // NOLINT
Q_DECLARE_TYPEINFO(VRawSAPoint, Q_MOVABLE_TYPE); // NOLINT Q_DECLARE_TYPEINFO(VRawSAPoint, Q_MOVABLE_TYPE); // NOLINT
//---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR inline VRawSAPoint::VRawSAPoint()
{}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR inline VRawSAPoint::VRawSAPoint(qreal xpos, qreal ypos) Q_DECL_CONSTEXPR inline VRawSAPoint::VRawSAPoint(qreal xpos, qreal ypos)
: QPointF(xpos, ypos) : VLayoutPoint(xpos, ypos)
{} {}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR inline VRawSAPoint::VRawSAPoint(QPointF p) Q_DECL_CONSTEXPR inline VRawSAPoint::VRawSAPoint(QPointF p)
: QPointF(p) : VLayoutPoint(p)
{} {}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR inline VRawSAPoint::VRawSAPoint(QPointF p, bool loopPoint) Q_DECL_CONSTEXPR inline VRawSAPoint::VRawSAPoint(const VLayoutPoint &p)
: QPointF(p), : VLayoutPoint(p)
{}
//---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR inline VRawSAPoint::VRawSAPoint(QPointF p, bool curvePoint, bool turnPoint)
: VLayoutPoint(p)
{
SetCurvePoint(curvePoint);
SetTurnPoint(turnPoint);
}
//---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR inline VRawSAPoint::VRawSAPoint(QPointF p, bool curvePoint, bool turnPoint, bool loopPoint)
: VLayoutPoint(p),
m_loopPoint(loopPoint) m_loopPoint(loopPoint)
{} {
SetCurvePoint(curvePoint);
SetTurnPoint(turnPoint);
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR inline bool VRawSAPoint::LoopPoint() const Q_DECL_CONSTEXPR inline auto VRawSAPoint::LoopPoint() const -> bool
{ {
return m_loopPoint; return m_loopPoint;
} }
@ -91,6 +110,18 @@ Q_DECL_RELAXED_CONSTEXPR inline void VRawSAPoint::SetLoopPoint(bool loopPoint)
m_loopPoint = loopPoint; m_loopPoint = loopPoint;
} }
//---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR inline auto VRawSAPoint::Primary() const -> bool
{
return m_primary;
}
//---------------------------------------------------------------------------------------------------------------------
Q_DECL_RELAXED_CONSTEXPR inline void VRawSAPoint::SetPrimary(bool primary)
{
m_primary = primary;
}
QT_WARNING_POP QT_WARNING_POP
#endif // VRAWSAPOINT_H #endif // VRAWSAPOINT_H

View File

@ -36,17 +36,17 @@
#endif // QT_VERSION < QT_VERSION_CHECK(5, 5, 0) #endif // QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
#include "../vmisc/def.h" #include "../vmisc/def.h"
#include "../vgeometry/vgeometrydef.h" #include "../vgeometry/vgeometrydef.h"
#include "vlayoutpoint.h"
#include <QPointF>
QT_WARNING_PUSH QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Weffc++") QT_WARNING_DISABLE_GCC("-Weffc++")
QT_WARNING_DISABLE_GCC("-Wnon-virtual-dtor") QT_WARNING_DISABLE_GCC("-Wnon-virtual-dtor")
QT_WARNING_DISABLE_CLANG("-Wnon-virtual-dtor")
/** /**
* @brief The VSAPoint class seam allowance point * @brief The VSAPoint class seam allowance point
*/ */
class VSAPoint : public QPointF class VSAPoint : public VLayoutPoint
{ {
public: public:
QT_WARNING_PUSH QT_WARNING_PUSH
@ -58,6 +58,7 @@ public:
Q_DECL_CONSTEXPR VSAPoint(qreal xpos, qreal ypos); Q_DECL_CONSTEXPR VSAPoint(qreal xpos, qreal ypos);
Q_DECL_CONSTEXPR explicit VSAPoint(QPointF p); Q_DECL_CONSTEXPR explicit VSAPoint(QPointF p);
Q_DECL_CONSTEXPR explicit VSAPoint(const VLayoutPoint &p);
Q_DECL_CONSTEXPR auto GetSABefore() const -> qreal; Q_DECL_CONSTEXPR auto GetSABefore() const -> qreal;
Q_DECL_CONSTEXPR auto GetSAAfter() const -> qreal; Q_DECL_CONSTEXPR auto GetSAAfter() const -> qreal;
@ -78,7 +79,7 @@ public:
Q_DECL_RELAXED_CONSTEXPR auto MaxLocalSA(qreal width) const -> qreal; Q_DECL_RELAXED_CONSTEXPR auto MaxLocalSA(qreal width) const -> qreal;
Q_DECL_RELAXED_CONSTEXPR auto PassmarkLength(qreal width) const -> qreal; Q_DECL_RELAXED_CONSTEXPR auto PassmarkLength(qreal width) const -> qreal;
auto toJson() const -> QJsonObject; auto toJson() const -> QJsonObject override;
static constexpr qreal passmarkFactor{0.5}; static constexpr qreal passmarkFactor{0.5};
static constexpr qreal maxPassmarkLength{MmToPixel(10.)}; static constexpr qreal maxPassmarkLength{MmToPixel(10.)};
@ -97,12 +98,17 @@ Q_DECLARE_TYPEINFO(VSAPoint, Q_MOVABLE_TYPE); // NOLINT
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR inline VSAPoint::VSAPoint(qreal xpos, qreal ypos) Q_DECL_CONSTEXPR inline VSAPoint::VSAPoint(qreal xpos, qreal ypos)
: QPointF(xpos, ypos) : VLayoutPoint(xpos, ypos)
{} {}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR inline VSAPoint::VSAPoint(QPointF p) Q_DECL_CONSTEXPR inline VSAPoint::VSAPoint(QPointF p)
: QPointF(p) : VLayoutPoint(p)
{}
//---------------------------------------------------------------------------------------------------------------------
Q_DECL_CONSTEXPR inline VSAPoint::VSAPoint(const VLayoutPoint &p)
: VLayoutPoint(p)
{} {}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------

View File

@ -198,7 +198,7 @@ inline void Move(T &vector, int from, int to)
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
template <typename T> template <typename T>
auto Reverse(const QVector<T> &container) -> QVector<T> inline auto Reverse(const QVector<T> &container) -> QVector<T>
{ {
if (container.isEmpty()) if (container.isEmpty())
{ {
@ -216,14 +216,14 @@ auto Reverse(const QVector<T> &container) -> QVector<T>
template <typename T, template <typename> class C> template <typename T, template <typename> class C>
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
auto Reverse(const C<T> &container) -> C<T> inline auto Reverse(const C<T> &container) -> C<T>
{ {
return ConvertToList(Reverse(ConvertToVector(container))); return ConvertToList(Reverse(ConvertToVector(container)));
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
template <typename T, typename std::enable_if<std::is_same<T, QStringList>::value, T>::type* = nullptr> template <typename T, typename std::enable_if<std::is_same<T, QStringList>::value, T>::type* = nullptr>
auto Reverse(const T &container) -> T inline auto Reverse(const T &container) -> T
{ {
return Reverse<QString, QList>(container); return Reverse<QString, QList>(container);
} }

View File

@ -33,7 +33,6 @@
#include "../ifc/exception/vexceptioninvalidnotch.h" #include "../ifc/exception/vexceptioninvalidnotch.h"
#include "../vgeometry/vabstractcurve.h" #include "../vgeometry/vabstractcurve.h"
#include "../vgeometry/varc.h" #include "../vgeometry/varc.h"
#include "testpassmark.h"
#include "../vlayout/vrawsapoint.h" #include "../vlayout/vrawsapoint.h"
const qreal VPassmark::passmarkRadiusFactor = 0.45; const qreal VPassmark::passmarkRadiusFactor = 0.45;
@ -53,7 +52,7 @@ PassmarkStatus GetSeamPassmarkSAPoint(const VPiecePassmarkData &passmarkData, co
if (needRollback && not seamAllowance.isEmpty()) if (needRollback && not seamAllowance.isEmpty())
{ {
ekvPoints.clear(); ekvPoints.clear();
ekvPoints += seamAllowance.at(seamAllowance.size()-2); ekvPoints += VRawSAPoint(seamAllowance.at(seamAllowance.size()-2));
} }
if (ekvPoints.isEmpty()) if (ekvPoints.isEmpty())
@ -689,7 +688,7 @@ QVector<QLineF> VPassmark::FullPassmark(const VPiece &piece, const VContainer *d
{ {
if (m_null) if (m_null)
{ {
return QVector<QLineF>(); return {};
} }
if (not piece.IsSeamAllowanceBuiltIn()) if (not piece.IsSeamAllowanceBuiltIn())
@ -720,16 +719,18 @@ QVector<QLineF> VPassmark::SAPassmark(const VPiece &piece, const VContainer *dat
{ {
if (m_null) if (m_null)
{ {
return QVector<QLineF>(); return {};
} }
if (not piece.IsSeamAllowanceBuiltIn()) if (not piece.IsSeamAllowanceBuiltIn())
{ {
// Because rollback cannot be calulated if passmark is not first point in main path we rotate it. // Because rollback cannot be calulated if passmark is not first point in main path we rotate it.
return SAPassmark(piece.SeamAllowancePointsWithRotation(data, m_data.passmarkIndex), side); QVector<QPointF> points;
CastTo(piece.SeamAllowancePointsWithRotation(data, m_data.passmarkIndex), points);
return SAPassmark(points, side);
} }
return QVector<QLineF>(); return {};
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -737,7 +738,7 @@ QVector<QLineF> VPassmark::SAPassmark(const QVector<QPointF> &seamAllowance, Pas
{ {
if (m_null) if (m_null)
{ {
return QVector<QLineF>(); return {};
} }
// Because rollback @seamAllowance must be rotated here. // Because rollback @seamAllowance must be rotated here.
@ -801,8 +802,9 @@ QVector<QLineF> VPassmark::BuiltInSAPassmark(const VPiece &piece, const VContain
return QVector<QLineF>(); return QVector<QLineF>();
} }
return CreatePassmarkLines(m_data.passmarkLineType, m_data.passmarkAngleType, lines, piece.MainPathPoints(data), QVector<QPointF> points;
PassmarkSide::All); CastTo(piece.MainPathPoints(data), points);
return CreatePassmarkLines(m_data.passmarkLineType, m_data.passmarkAngleType, lines, points, PassmarkSide::All);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -854,7 +856,7 @@ QVector<QLineF> VPassmark::BuiltInSAPassmarkBaseLine(const VPiece &piece) const
edge1.setAngle(edge1.angle() + edge1.angleTo(edge2)/2.); edge1.setAngle(edge1.angle() + edge1.angleTo(edge2)/2.);
edge1.setLength(length); edge1.setLength(length);
return QVector<QLineF>({edge1}); return {edge1};
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -862,16 +864,18 @@ QVector<QLineF> VPassmark::SAPassmarkBaseLine(const VPiece &piece, const VContai
{ {
if (m_null) if (m_null)
{ {
return QVector<QLineF>(); return {};
} }
if (not piece.IsSeamAllowanceBuiltIn()) if (not piece.IsSeamAllowanceBuiltIn())
{ {
// Because rollback cannot be calulated if passmark is not first point in main path we rotate it. // Because rollback cannot be calulated if passmark is not first point in main path we rotate it.
return SAPassmarkBaseLine(piece.SeamAllowancePointsWithRotation(data, m_data.passmarkIndex), side); QVector<QPointF> points;
CastTo(piece.SeamAllowancePointsWithRotation(data, m_data.passmarkIndex), points);
return SAPassmarkBaseLine(points, side);
} }
return QVector<QLineF>(); return {};
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -879,7 +883,7 @@ QVector<QLineF> VPassmark::SAPassmarkBaseLine(const QVector<QPointF> &seamAllowa
{ {
if (m_null) if (m_null)
{ {
return QVector<QLineF>(); return {};
} }
if (seamAllowance.size() < 2) if (seamAllowance.size() < 2)

View File

@ -32,7 +32,7 @@
#include "../vgeometry/vpointf.h" #include "../vgeometry/vpointf.h"
#include "../vgeometry/vabstractcurve.h" #include "../vgeometry/vabstractcurve.h"
#include "../vgeometry/vplacelabelitem.h" #include "../vgeometry/vplacelabelitem.h"
#include "../vgeometry/varc.h" #include "../vgeometry/vlayoutplacelabel.h"
#include "vcontainer.h" #include "vcontainer.h"
#include "../vmisc/vabstractvalapplication.h" #include "../vmisc/vabstractvalapplication.h"
#include "../vmisc/compatibility.h" #include "../vmisc/compatibility.h"
@ -171,14 +171,14 @@ void VPiece::SetPath(const VPiecePath &path)
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QVector<QPointF> VPiece::MainPathPoints(const VContainer *data) const QVector<VLayoutPoint> VPiece::MainPathPoints(const VContainer *data) const
{ {
// DumpPiece(*this, data, QStringLiteral("input.json.XXXXXX")); // Uncomment for dumping test data // DumpPiece(*this, data, QStringLiteral("input.json.XXXXXX")); // Uncomment for dumping test data
VPiecePath mainPath = GetPath(); VPiecePath mainPath = GetPath();
mainPath.SetName(tr("Main path of piece %1").arg(GetName())); mainPath.SetName(tr("Main path of piece %1").arg(GetName()));
QVector<QPointF> points = mainPath.PathPoints(data); QVector<VLayoutPoint> points = mainPath.PathPoints(data);
points = CheckLoops(CorrectEquidistantPoints(points));//A path can contains loops points = CheckLoops(CorrectEquidistantPoints(points));//A path can contains loops
// DumpVector(points, QStringLiteral("output.json.XXXXXX")); // Uncomment for dumping test data // DumpVector(points, QStringLiteral("output.json.XXXXXX")); // Uncomment for dumping test data
@ -186,9 +186,9 @@ QVector<QPointF> VPiece::MainPathPoints(const VContainer *data) const
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QVector<QPointF> VPiece::UniteMainPathPoints(const VContainer *data) const QVector<VLayoutPoint> VPiece::UniteMainPathPoints(const VContainer *data) const
{ {
QVector<QPointF> points = VPiecePath::NodesToPoints(data, GetUnitedPath(data), GetName()); QVector<VLayoutPoint> points = VPiecePath::NodesToPoints(data, GetUnitedPath(data), GetName());
points = CheckLoops(CorrectEquidistantPoints(points));//A path can contains loops points = CheckLoops(CorrectEquidistantPoints(points));//A path can contains loops
return points; return points;
} }
@ -200,7 +200,7 @@ QVector<VPointF> VPiece::MainPathNodePoints(const VContainer *data, bool showExc
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QVector<QPointF> VPiece::SeamAllowancePoints(const VContainer *data) const QVector<VLayoutPoint> VPiece::SeamAllowancePoints(const VContainer *data) const
{ {
return SeamAllowancePointsWithRotation(data, -1); return SeamAllowancePointsWithRotation(data, -1);
} }
@ -208,14 +208,15 @@ QVector<QPointF> VPiece::SeamAllowancePoints(const VContainer *data) const
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QVector<QPointF> VPiece::CuttingPathPoints(const VContainer *data) const QVector<QPointF> VPiece::CuttingPathPoints(const VContainer *data) const
{ {
if (IsSeamAllowance() and not IsSeamAllowanceBuiltIn()) QVector<QPointF> points;
if (IsSeamAllowance() && not IsSeamAllowanceBuiltIn())
{ {
return SeamAllowancePoints(data); CastTo(SeamAllowancePoints(data), points);
} return points;
else
{
return MainPathPoints(data);
} }
CastTo(MainPathPoints(data), points);
return points;
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -271,7 +272,9 @@ QVector<QPainterPath> VPiece::CurvesPainterPath(const VContainer *data) const
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QPainterPath VPiece::MainPathPath(const VContainer *data) const QPainterPath VPiece::MainPathPath(const VContainer *data) const
{ {
return VPiece::MainPathPath(MainPathPoints(data)); QVector<QPointF> points;
CastTo(MainPathPoints(data), points);
return VPiece::MainPathPath(points);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -299,42 +302,6 @@ QPainterPath VPiece::SeamAllowancePath(const VContainer *data) const
return SeamAllowancePath(SeamAllowancePoints(data)); return SeamAllowancePath(SeamAllowancePoints(data));
} }
//---------------------------------------------------------------------------------------------------------------------
QPainterPath VPiece::SeamAllowancePath(const QVector<QPointF> &points) const
{
QPainterPath ekv;
// seam allowence
if (IsSeamAllowance() && not IsSeamAllowanceBuiltIn())
{
if (not points.isEmpty())
{
ekv.moveTo(points.at(0));
for (qint32 i = 1; i < points.count(); ++i)
{
ekv.lineTo(points.at(i));
}
#if !defined(V_NO_ASSERT)
// uncomment for debug
// QFont font;
// font.setPixelSize(1);
// for (qint32 i = 0; i < points.count(); ++i)
// {
// ekv.addEllipse(points.at(i).x()-accuracyPointOnLine, points.at(i).y()-accuracyPointOnLine,
// accuracyPointOnLine*2., accuracyPointOnLine*2.);
// ekv.addText(points.at(i).x()-accuracyPointOnLine, points.at(i).y()-accuracyPointOnLine, font,
// QString::number(i+1));
// }
#endif
ekv.setFillRule(Qt::WindingFill);
}
}
return ekv;
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QPainterPath VPiece::PassmarksPath(const VContainer *data) const QPainterPath VPiece::PassmarksPath(const VContainer *data) const
{ {
@ -370,7 +337,7 @@ QPainterPath VPiece::PlaceLabelPath(const VContainer *data) const
const auto label = data->GeometricObject<VPlaceLabelItem>(placeLabel); const auto label = data->GeometricObject<VPlaceLabelItem>(placeLabel);
if (label->IsVisible()) if (label->IsVisible())
{ {
path.addPath(label->LabelShapePath()); path.addPath(LabelShapePath(VLayoutPlaceLabel(*label)));
} }
} }
catch (const VExceptionBadId &e) catch (const VExceptionBadId &e)
@ -387,12 +354,16 @@ bool VPiece::IsSeamAllowanceValid(const VContainer *data) const
{ {
if (IsSeamAllowance() && not IsSeamAllowanceBuiltIn()) if (IsSeamAllowance() && not IsSeamAllowanceBuiltIn())
{ {
return VAbstractPiece::IsAllowanceValid(UniteMainPathPoints(data), SeamAllowancePoints(data)); QVector<QPointF> mainPathPoints;
} CastTo<QPointF>(UniteMainPathPoints(data), mainPathPoints);
else
{ QVector<QPointF> seamAllowancePoints;
return true; CastTo<QPointF>(SeamAllowancePoints(data), seamAllowancePoints);
return VAbstractPiece::IsAllowanceValid(mainPathPoints, seamAllowancePoints);
} }
return true;
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -662,13 +633,13 @@ const VGrainlineData &VPiece::GetGrainlineGeometry() const
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QVector<QPointF> VPiece::SeamAllowancePointsWithRotation(const VContainer *data, int makeFirst) const QVector<VLayoutPoint> VPiece::SeamAllowancePointsWithRotation(const VContainer *data, int makeFirst) const
{ {
SCASSERT(data != nullptr); SCASSERT(data != nullptr);
if (not IsSeamAllowance() || IsSeamAllowanceBuiltIn()) if (not IsSeamAllowance() || IsSeamAllowanceBuiltIn())
{ {
return QVector<QPointF>(); return {};
} }
const QVector<CustomSARecord> records = FilterRecords(GetValidRecords()); const QVector<CustomSARecord> records = FilterRecords(GetValidRecords());

View File

@ -33,7 +33,6 @@
#include <QSharedDataPointer> #include <QSharedDataPointer>
#include "../vlayout/vabstractpiece.h" #include "../vlayout/vabstractpiece.h"
#include "../vgeometry/vgeometrydef.h"
class VPieceData; class VPieceData;
class VPieceNode; class VPieceNode;
@ -65,10 +64,10 @@ public:
VPiecePath &GetPath(); VPiecePath &GetPath();
void SetPath(const VPiecePath &path); void SetPath(const VPiecePath &path);
QVector<QPointF> MainPathPoints(const VContainer *data) const; QVector<VLayoutPoint> MainPathPoints(const VContainer *data) const;
QVector<QPointF> UniteMainPathPoints(const VContainer *data) const; QVector<VLayoutPoint> UniteMainPathPoints(const VContainer *data) const;
QVector<VPointF> MainPathNodePoints(const VContainer *data, bool showExcluded = false) const; QVector<VPointF> MainPathNodePoints(const VContainer *data, bool showExcluded = false) const;
QVector<QPointF> SeamAllowancePoints(const VContainer *data) const; QVector<VLayoutPoint> SeamAllowancePoints(const VContainer *data) const;
QVector<QPointF> CuttingPathPoints(const VContainer *data) const; QVector<QPointF> CuttingPathPoints(const VContainer *data) const;
QVector<QLineF> PassmarksLines(const VContainer *data) const; QVector<QLineF> PassmarksLines(const VContainer *data) const;
@ -80,7 +79,8 @@ public:
static QPainterPath MainPathPath(const QVector<QPointF> &points); static QPainterPath MainPathPath(const QVector<QPointF> &points);
QPainterPath SeamAllowancePath(const VContainer *data) const; QPainterPath SeamAllowancePath(const VContainer *data) const;
QPainterPath SeamAllowancePath(const QVector<QPointF> &points) const; template <class T>
QPainterPath SeamAllowancePath(const QVector<T> &points) const;
QPainterPath PassmarksPath(const VContainer *data) const; QPainterPath PassmarksPath(const VContainer *data) const;
QPainterPath PlaceLabelPath(const VContainer *data) const; QPainterPath PlaceLabelPath(const VContainer *data) const;
@ -132,7 +132,7 @@ public:
QVector<VPieceNode> GetUnitedPath(const VContainer *data) const; QVector<VPieceNode> GetUnitedPath(const VContainer *data) const;
QVector<QPointF> SeamAllowancePointsWithRotation(const VContainer *data, int makeFirst) const; QVector<VLayoutPoint> SeamAllowancePointsWithRotation(const VContainer *data, int makeFirst) const;
void SetGradationLabel(const QString &label); void SetGradationLabel(const QString &label);
auto GetGradationLabel() const -> QString; auto GetGradationLabel() const -> QString;
@ -167,4 +167,41 @@ private:
Q_DECLARE_TYPEINFO(VPiece, Q_MOVABLE_TYPE); // NOLINT Q_DECLARE_TYPEINFO(VPiece, Q_MOVABLE_TYPE); // NOLINT
//---------------------------------------------------------------------------------------------------------------------
template <class T>
inline QPainterPath VPiece::SeamAllowancePath(const QVector<T> &points) const
{
QPainterPath ekv;
// seam allowence
if (IsSeamAllowance() && not IsSeamAllowanceBuiltIn())
{
if (not points.isEmpty())
{
ekv.moveTo(points.at(0));
for (qint32 i = 1; i < points.count(); ++i)
{
ekv.lineTo(points.at(i));
}
#if !defined(V_NO_ASSERT)
// uncomment for debug
// QFont font;
// font.setPixelSize(1);
// for (qint32 i = 0; i < points.count(); ++i)
// {
// ekv.addEllipse(points.at(i).x()-accuracyPointOnLine, points.at(i).y()-accuracyPointOnLine,
// accuracyPointOnLine*2., accuracyPointOnLine*2.);
// ekv.addText(points.at(i).x()-accuracyPointOnLine, points.at(i).y()-accuracyPointOnLine, font,
// QString::number(i+1));
// }
#endif
ekv.setFillRule(Qt::WindingFill);
}
}
return ekv;
}
#endif // VPIECE_H #endif // VPIECE_H

View File

@ -36,9 +36,6 @@
#include <QDataStream> #include <QDataStream>
#include <QtNumeric> #include <QtNumeric>
const quint32 VPieceNodeData::streamHeader = 0x2198CBC8; // CRC-32Q string "VPieceNodeData"
const quint16 VPieceNodeData::classVersion = 1;
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
VPieceNode::VPieceNode() VPieceNode::VPieceNode()
: d(new VPieceNodeData) : d(new VPieceNodeData)
@ -454,6 +451,18 @@ void VPieceNode::SetManualPassmarkLength(bool value)
d->m_manualPassmarkLength = value; d->m_manualPassmarkLength = value;
} }
//---------------------------------------------------------------------------------------------------------------------
bool VPieceNode::IsTurnPoint() const
{
return d->m_typeTool == Tool::NodePoint ? d->m_turnPoint : false;
}
//---------------------------------------------------------------------------------------------------------------------
void VPieceNode::SetTurnPoint(bool value)
{
d->m_turnPoint = value;
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
bool VPieceNode::IsExcluded() const bool VPieceNode::IsExcluded() const
{ {

View File

@ -108,6 +108,9 @@ public:
bool IsManualPassmarkLength() const; bool IsManualPassmarkLength() const;
void SetManualPassmarkLength(bool value); void SetManualPassmarkLength(bool value);
bool IsTurnPoint() const;
void SetTurnPoint(bool value);
private: private:
QSharedDataPointer<VPieceNodeData> d; QSharedDataPointer<VPieceNodeData> d;
}; };

View File

@ -63,24 +63,7 @@ public:
} }
} }
VPieceNodeData (const VPieceNodeData& node) VPieceNodeData (const VPieceNodeData& node) = default;
: QSharedData(node),
m_id(node.m_id),
m_typeTool(node.m_typeTool),
m_reverse(node.m_reverse),
m_excluded(node.m_excluded),
m_isPassmark(node.m_isPassmark),
m_isMainPathNode(node.m_isMainPathNode),
m_formulaWidthBefore(node.m_formulaWidthBefore),
m_formulaWidthAfter(node.m_formulaWidthAfter),
m_formulaPassmarkLength(node.m_formulaPassmarkLength),
m_angleType(node.m_angleType),
m_passmarkLineType(node.m_passmarkLineType),
m_passmarkAngleType(node.m_passmarkAngleType),
m_isShowSecondPassmark(node.m_isShowSecondPassmark),
m_checkUniqueness(node.m_checkUniqueness),
m_manualPassmarkLength(node.m_manualPassmarkLength)
{}
~VPieceNodeData() = default; ~VPieceNodeData() = default;
@ -124,11 +107,13 @@ public:
bool m_manualPassmarkLength{false}; bool m_manualPassmarkLength{false};
bool m_turnPoint{true};
private: private:
Q_DISABLE_ASSIGN(VPieceNodeData) Q_DISABLE_ASSIGN(VPieceNodeData)
static const quint32 streamHeader; static constexpr quint32 streamHeader = 0x2198CBC8; // CRC-32Q string "VPieceNodeData"
static const quint16 classVersion; static constexpr quint16 classVersion = 2;
}; };
// Friend functions // Friend functions
@ -155,6 +140,8 @@ QDataStream &operator<<(QDataStream &out, const VPieceNodeData &p)
// Added in classVersion = 2 // Added in classVersion = 2
out << p.m_turnPoint;
return out; return out;
} }
@ -199,10 +186,10 @@ QDataStream &operator>>(QDataStream &in, VPieceNodeData &p)
>> p.m_checkUniqueness >> p.m_checkUniqueness
>> p.m_manualPassmarkLength; >> p.m_manualPassmarkLength;
// if (actualClassVersion >= 2) if (actualClassVersion >= 2)
// { {
in >> p.m_turnPoint;
// } }
return in; return in;
} }

View File

@ -30,7 +30,6 @@
#include "vpiecepath_p.h" #include "vpiecepath_p.h"
#include "vcontainer.h" #include "vcontainer.h"
#include "../vgeometry/vpointf.h" #include "../vgeometry/vpointf.h"
#include "../vlayout/vabstractpiece.h"
#include "calculator.h" #include "calculator.h"
#include "../vmisc/vabstractvalapplication.h" #include "../vmisc/vabstractvalapplication.h"
#include "../vmisc/compatibility.h" #include "../vmisc/compatibility.h"
@ -54,6 +53,7 @@ VSAPoint CurvePoint(VSAPoint candidate, const VContainer *data, const VPieceNode
candidate.SetSAAfter(node.GetSAAfter(data, *data->GetPatternUnit())); candidate.SetSAAfter(node.GetSAAfter(data, *data->GetPatternUnit()));
candidate.SetSABefore(node.GetSABefore(data, *data->GetPatternUnit())); candidate.SetSABefore(node.GetSABefore(data, *data->GetPatternUnit()));
candidate.SetAngleType(node.GetAngleType()); candidate.SetAngleType(node.GetAngleType());
candidate.SetTurnPoint(node.IsTurnPoint());
} }
} }
return candidate; return candidate;
@ -92,6 +92,7 @@ VSAPoint CurveStartPoint(VSAPoint candidate, const VContainer *data, const VPiec
} }
candidate = VSAPoint(p); candidate = VSAPoint(p);
candidate.SetTurnPoint(true);
break; break;
} }
@ -131,6 +132,7 @@ VSAPoint CurveEndPoint(VSAPoint candidate, const VContainer *data, const VPieceN
} }
candidate = VSAPoint(p); candidate = VSAPoint(p);
candidate.SetTurnPoint(true);
break; break;
} }
@ -172,14 +174,15 @@ QPainterPath MakePainterPath(const QVector<QPointF> &points)
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
qreal FindTipDirection(const QVector<QPointF> &points) template <class T>
qreal FindTipDirection(const QVector<T> &points)
{ {
if (points.size() <= 1) if (points.size() <= 1)
{ {
return 0; return 0;
} }
const QPointF &first = ConstFirst(points); const T &first = ConstFirst(points);
for(int i = 1; i < points.size(); ++i) for(int i = 1; i < points.size(); ++i)
{ {
@ -195,8 +198,8 @@ qreal FindTipDirection(const QVector<QPointF> &points)
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
bool IntersectionWithCuttingCountour(const QVector<QPointF> &cuttingPath, const QVector<QPointF> &points, bool IntersectionWithCuttingCountour(const QVector<QPointF> &cuttingPath, const QVector<VLayoutPoint> &points,
QPointF *firstConnection) QPointF *connection)
{ {
if (points.size() <= 1) if (points.size() <= 1)
{ {
@ -207,12 +210,35 @@ bool IntersectionWithCuttingCountour(const QVector<QPointF> &cuttingPath, const
if (VAbstractCurve::IsPointOnCurve(cuttingPath, first)) if (VAbstractCurve::IsPointOnCurve(cuttingPath, first))
{ // Point is already part of a cutting countour { // Point is already part of a cutting countour
*firstConnection = first; *connection = first;
return true; return true;
} }
else else
{ {
return VAbstractCurve::CurveIntersectAxis(first, FindTipDirection(points), cuttingPath, firstConnection); return VAbstractCurve::CurveIntersectAxis(first, FindTipDirection(points), cuttingPath, connection);
}
}
//---------------------------------------------------------------------------------------------------------------------
template <class T>
void AppendCurveSegment(QVector<T> &points, QVector<QPointF> &segment, const VSAPoint &begin, const VSAPoint &end)
{
points.reserve(points.size() + segment.size());
for(int i=0; i < segment.size(); ++i)
{
VLayoutPoint lp(segment.at(i));
if (i == 0)
{
lp.SetTurnPoint(VFuzzyComparePoints(lp, begin) ? begin.TurnPoint() : true);
}
else if (i == segment.size() - 1)
{
lp.SetTurnPoint(VFuzzyComparePoints(lp, end) ? end.TurnPoint() : true);
}
lp.SetCurvePoint(true);
points.append(lp);
} }
} }
} }
@ -388,19 +414,20 @@ bool VPiecePath::IsLastToCuttingCountour() const
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QVector<QPointF> VPiecePath::PathPoints(const VContainer *data, const QVector<QPointF> &cuttingPath) const QVector<VLayoutPoint> VPiecePath::PathPoints(const VContainer *data, const QVector<QPointF> &cuttingPath) const
{ {
QVector<QPointF> points = NodesToPoints(data, d->m_nodes, GetName()); QVector<VLayoutPoint> points = NodesToPoints(data, d->m_nodes, GetName());
if (GetType() == PiecePathType::InternalPath && not cuttingPath.isEmpty() && points.size() > 1) if (GetType() == PiecePathType::InternalPath && not cuttingPath.isEmpty() && points.size() > 1)
{ {
QVector<QPointF> extended = points; QVector<VLayoutPoint> extended = points;
if (IsFirstToCuttingCountour()) if (IsFirstToCuttingCountour())
{ {
QPointF firstConnection; VLayoutPoint firstConnection;
if (IntersectionWithCuttingCountour(cuttingPath, points, &firstConnection)) if (IntersectionWithCuttingCountour(cuttingPath, points, &firstConnection))
{ {
firstConnection.SetTurnPoint(true);
extended.prepend(firstConnection); extended.prepend(firstConnection);
} }
else else
@ -415,9 +442,10 @@ QVector<QPointF> VPiecePath::PathPoints(const VContainer *data, const QVector<QP
if (IsLastToCuttingCountour()) if (IsLastToCuttingCountour())
{ {
QPointF lastConnection; VLayoutPoint lastConnection;
if (IntersectionWithCuttingCountour(cuttingPath, Reverse(points), &lastConnection)) if (IntersectionWithCuttingCountour(cuttingPath, Reverse(points), &lastConnection))
{ {
lastConnection.SetTurnPoint(true);
extended.append(lastConnection); extended.append(lastConnection);
} }
else else
@ -542,7 +570,10 @@ QVector<VSAPoint> VPiecePath::SeamAllowancePoints(const VContainer *data, qreal
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QPainterPath VPiecePath::PainterPath(const VContainer *data, const QVector<QPointF> &cuttingPath) const QPainterPath VPiecePath::PainterPath(const VContainer *data, const QVector<QPointF> &cuttingPath) const
{ {
return MakePainterPath(PathPoints(data, cuttingPath)); QVector<VLayoutPoint> points = PathPoints(data, cuttingPath);
QVector<QPointF> casted;
CastTo(points, casted);
return MakePainterPath(casted);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -552,7 +583,7 @@ QVector<QPainterPath> VPiecePath::CurvesPainterPath(const VContainer *data) cons
QVector<QPainterPath> paths; QVector<QPainterPath> paths;
paths.reserve(curves.size()); paths.reserve(curves.size());
for(auto &curve : curves) for(const auto &curve : curves)
{ {
paths.append(MakePainterPath(curve)); paths.append(MakePainterPath(curve));
} }
@ -1104,6 +1135,7 @@ VSAPoint VPiecePath::PreparePointEkv(const VPieceNode &node, const VContainer *d
const QSharedPointer<VPointF> point = data->GeometricObject<VPointF>(node.GetId()); const QSharedPointer<VPointF> point = data->GeometricObject<VPointF>(node.GetId());
VSAPoint p(point->toQPointF()); VSAPoint p(point->toQPointF());
p.SetTurnPoint(node.IsTurnPoint());
p.SetSAAfter(node.GetSAAfter(data, *data->GetPatternUnit())); p.SetSAAfter(node.GetSAAfter(data, *data->GetPatternUnit()));
p.SetSABefore(node.GetSABefore(data, *data->GetPatternUnit())); p.SetSABefore(node.GetSABefore(data, *data->GetPatternUnit()));
p.SetAngleType(node.GetAngleType()); p.SetAngleType(node.GetAngleType());
@ -1138,18 +1170,23 @@ QVector<VSAPoint> VPiecePath::CurveSeamAllowanceSegment(const VContainer *data,
{ {
VSAPoint p(points.at(i)); VSAPoint p(points.at(i));
p.SetAngleType(PieceNodeAngle::ByLengthCurve); p.SetAngleType(PieceNodeAngle::ByLengthCurve);
p.SetCurvePoint(true);
if (i == 0) if (i == 0)
{ // first point { // first point
p.SetSAAfter(begin.GetSAAfter()); p.SetSAAfter(begin.GetSAAfter());
p.SetSABefore(begin.GetSABefore()); p.SetSABefore(begin.GetSABefore());
p.SetAngleType(begin.GetAngleType()); p.SetAngleType(begin.GetAngleType());
p.SetTurnPoint(VFuzzyComparePoints(p, begin) ? begin.TurnPoint() : true);
} }
else if (i == points.size() - 1) else if (i == points.size() - 1)
{ // last point { // last point
p.SetSAAfter(end.GetSAAfter()); p.SetSAAfter(end.GetSAAfter());
p.SetSABefore(end.GetSABefore()); p.SetSABefore(end.GetSABefore());
p.SetAngleType(end.GetAngleType()); p.SetAngleType(end.GetAngleType());
p.SetTurnPoint(VFuzzyComparePoints(p, end) ? end.TurnPoint() : true);
} }
pointsEkv.append(p); pointsEkv.append(p);
} }
} }
@ -1165,13 +1202,15 @@ QVector<VSAPoint> VPiecePath::CurveSeamAllowanceSegment(const VContainer *data,
w2 = width; w2 = width;
} }
const qreal wDiff = w2 - w1;// Difference between to local widths const qreal wDiff = w2 - w1;// Difference between two local widths
const qreal fullLength = VAbstractCurve::PathLength(points); const qreal fullLength = VAbstractCurve::PathLength(points);
VSAPoint p(points.at(0));//First point in the list VSAPoint p(points.at(0));//First point in the list
p.SetSAAfter(begin.GetSAAfter()); p.SetSAAfter(begin.GetSAAfter());
p.SetSABefore(begin.GetSABefore()); p.SetSABefore(begin.GetSABefore());
p.SetAngleType(begin.GetAngleType()); p.SetAngleType(begin.GetAngleType());
p.SetCurvePoint(true);
p.SetTurnPoint(VFuzzyComparePoints(p, begin) ? begin.TurnPoint() : true);
pointsEkv.append(p); pointsEkv.append(p);
qreal length = 0; // how much we handle qreal length = 0; // how much we handle
@ -1179,12 +1218,14 @@ QVector<VSAPoint> VPiecePath::CurveSeamAllowanceSegment(const VContainer *data,
for(int i = 1; i < points.size(); ++i) for(int i = 1; i < points.size(); ++i)
{ {
p = VSAPoint(points.at(i)); p = VSAPoint(points.at(i));
p.SetCurvePoint(true);
if (i == points.size() - 1) if (i == points.size() - 1)
{// last point {// last point
p.SetSAAfter(end.GetSAAfter()); p.SetSAAfter(end.GetSAAfter());
p.SetSABefore(end.GetSABefore()); p.SetSABefore(end.GetSABefore());
p.SetAngleType(end.GetAngleType()); p.SetAngleType(end.GetAngleType());
p.SetTurnPoint(VFuzzyComparePoints(p, end) ? end.TurnPoint() : true);
} }
else else
{ {
@ -1220,14 +1261,14 @@ QString VPiecePath::NodeName(const QVector<VPieceNode> &nodes, int nodeIndex, co
{ {
// ignore // ignore
} }
return QString(); return {};
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QVector<QPointF> VPiecePath::NodesToPoints(const VContainer *data, const QVector<VPieceNode> &nodes, QVector<VLayoutPoint> VPiecePath::NodesToPoints(const VContainer *data, const QVector<VPieceNode> &nodes,
const QString &piece) const QString &piece)
{ {
QVector<QPointF> points; QVector<VLayoutPoint> points;
for (int i = 0; i < nodes.size(); ++i) for (int i = 0; i < nodes.size(); ++i)
{ {
const VPieceNode &node = nodes.at(i); const VPieceNode &node = nodes.at(i);
@ -1241,7 +1282,9 @@ QVector<QPointF> VPiecePath::NodesToPoints(const VContainer *data, const QVector
case (Tool::NodePoint): case (Tool::NodePoint):
{ {
const QSharedPointer<VPointF> point = data->GeometricObject<VPointF>(node.GetId()); const QSharedPointer<VPointF> point = data->GeometricObject<VPointF>(node.GetId());
points.append(static_cast<QPointF>(*point)); VLayoutPoint layoutPoint(point->toQPointF());
layoutPoint.SetTurnPoint(node.IsTurnPoint());
points.append(layoutPoint);
} }
break; break;
case (Tool::NodeArc): case (Tool::NodeArc):
@ -1251,11 +1294,11 @@ QVector<QPointF> VPiecePath::NodesToPoints(const VContainer *data, const QVector
{ {
const QSharedPointer<VAbstractCurve> curve = data->GeometricObject<VAbstractCurve>(node.GetId()); const QSharedPointer<VAbstractCurve> curve = data->GeometricObject<VAbstractCurve>(node.GetId());
const VSAPoint begin = StartSegment(data, nodes, i);
const VSAPoint end = EndSegment(data, nodes, i);
const QPointF begin = StartSegment(data, nodes, i); QVector<QPointF> segment = curve->GetSegmentPoints(begin, end, node.GetReverse(), piece);
const QPointF end = EndSegment(data, nodes, i); AppendCurveSegment(points, segment, begin, end);
points << curve->GetSegmentPoints(begin, end, node.GetReverse(), piece);
} }
break; break;
default: default:

View File

@ -42,6 +42,7 @@ class QPainterPath;
class VPointF; class VPointF;
class VPieceNode; class VPieceNode;
class VInternalVariable; class VInternalVariable;
class VLayoutPoint;
class VPiecePath class VPiecePath
{ {
@ -89,7 +90,7 @@ public:
void SetLastToCuttingCountour(bool value); void SetLastToCuttingCountour(bool value);
bool IsLastToCuttingCountour() const; bool IsLastToCuttingCountour() const;
QVector<QPointF> PathPoints(const VContainer *data, QVector<VLayoutPoint> PathPoints(const VContainer *data,
const QVector<QPointF> &cuttingPath = QVector<QPointF>()) const; const QVector<QPointF> &cuttingPath = QVector<QPointF>()) const;
QVector<VPointF> PathNodePoints(const VContainer *data, bool showExcluded = true) const; QVector<VPointF> PathNodePoints(const VContainer *data, bool showExcluded = true) const;
QVector<QVector<QPointF> > PathCurvePoints(const VContainer *data) const; QVector<QVector<QPointF> > PathCurvePoints(const VContainer *data) const;
@ -138,8 +139,8 @@ public:
static QString NodeName(const QVector<VPieceNode> &nodes, int nodeIndex, const VContainer *data); static QString NodeName(const QVector<VPieceNode> &nodes, int nodeIndex, const VContainer *data);
static QVector<QPointF> NodesToPoints(const VContainer *data, const QVector<VPieceNode> &nodes, static QVector<VLayoutPoint> NodesToPoints(const VContainer *data, const QVector<VPieceNode> &nodes,
const QString &piece = QString()); const QString &piece = QString());
private: private:
QSharedDataPointer<VPiecePathData> d; QSharedDataPointer<VPiecePathData> d;

View File

@ -46,17 +46,14 @@
#include <QVector> #include <QVector>
#include <QtGlobal> #include <QtGlobal>
#include <QLineF> #include <QLineF>
#include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QJsonArray> #include <QJsonArray>
#include "vsysexits.h"
#include "../vgeometry/vgobject.h" #include "../vgeometry/vgobject.h"
#include "../vgeometry/vpointf.h" #include "../vgeometry/vpointf.h"
#include "../vgeometry/vspline.h" #include "../vgeometry/vspline.h"
#include "../vgeometry/vsplinepath.h" #include "../vgeometry/vsplinepath.h"
#include "../vlayout/vabstractpiece.h" #include "../vlayout/vabstractpiece.h"
#include "../vlayout/vrawsapoint.h"
#include "../vpatterndb/vcontainer.h" #include "../vpatterndb/vcontainer.h"
#include "../vpatterndb/vpiece.h" #include "../vpatterndb/vpiece.h"
#include "../vpatterndb/vpiecenode.h" #include "../vpatterndb/vpiecenode.h"
@ -68,104 +65,6 @@ AbstractTest::AbstractTest(QObject *parent) :
{ {
} }
//---------------------------------------------------------------------------------------------------------------------
void AbstractTest::VectorFromJson(const QString &json, QVector<QPointF>& vector) const
{
QByteArray saveData;
PrepareDocument(json, saveData);
QJsonDocument loadDoc(QJsonDocument::fromJson(saveData));
const QString vectorKey = QStringLiteral("vector");
const QString typeKey = QStringLiteral("type");
QJsonObject vectorObject = loadDoc.object();
TestRoot(vectorObject, vectorKey, json);
QJsonArray vectorArray = vectorObject[vectorKey].toArray();
for (int i = 0; i < vectorArray.size(); ++i)
{
QJsonObject pointObject = vectorArray[i].toObject();
QString type;
AbstractTest::ReadStringValue(pointObject, typeKey, type);
if (type != QLatin1String("QPointF"))
{
const QString error = QStringLiteral("Invalid json file '%1'. Unexpected class '%2'.")
.arg(json, pointObject[typeKey].toString());
QFAIL(qUtf8Printable(error));
}
QPointF point;
QPointFromJson(pointObject, point);
vector.append(point);
}
}
//---------------------------------------------------------------------------------------------------------------------
void AbstractTest::VectorFromJson(const QString &json, QVector<VSAPoint> &vector) const
{
QByteArray saveData;
PrepareDocument(json, saveData);
QJsonDocument loadDoc(QJsonDocument::fromJson(saveData));
const QString vectorKey = QStringLiteral("vector");
QJsonObject vectorObject = loadDoc.object();
TestRoot(vectorObject, vectorKey, json);
QJsonArray vectorArray = vectorObject[vectorKey].toArray();
for (int i = 0; i < vectorArray.size(); ++i)
{
QJsonObject pointObject = vectorArray[i].toObject();
QString type;
AbstractTest::ReadStringValue(pointObject, QStringLiteral("type"), type);
if (type != QLatin1String("VSAPoint"))
{
const QString error = QStringLiteral("Invalid json file '%1'. Unexpected class '%2'.").arg(json, type);
QFAIL(qUtf8Printable(error));
}
VSAPoint point;
SAPointFromJson(pointObject, point);
vector.append(point);
}
}
//---------------------------------------------------------------------------------------------------------------------
void AbstractTest::VectorFromJson(const QString &json, QVector<VRawSAPoint> &vector) const
{
QByteArray saveData;
PrepareDocument(json, saveData);
QJsonDocument loadDoc(QJsonDocument::fromJson(saveData));
const QString vectorKey = QStringLiteral("vector");
QJsonObject vectorObject = loadDoc.object();
TestRoot(vectorObject, vectorKey, json);
QJsonArray vectorArray = vectorObject[vectorKey].toArray();
for (int i = 0; i < vectorArray.size(); ++i)
{
QJsonObject pointObject = vectorArray[i].toObject();
QString type;
AbstractTest::ReadStringValue(pointObject, QStringLiteral("type"), type);
if (type != QLatin1String("VRawSAPoint"))
{
const QString error = QStringLiteral("Invalid json file '%1'. Unexpected class '%2'.").arg(json, type);
QFAIL(qUtf8Printable(error));
}
VRawSAPoint point;
RawSAPointFromJson(pointObject, point);
vector.append(point);
}
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void AbstractTest::PieceFromJson(const QString &json, VPiece &piece, QSharedPointer<VContainer> &data) void AbstractTest::PieceFromJson(const QString &json, VPiece &piece, QSharedPointer<VContainer> &data)
{ {
@ -217,17 +116,25 @@ void AbstractTest::PassmarkDataFromJson(const QString &json, VPiecePassmarkData
QJsonObject passmarkData = dataObject[dataKey].toObject(); QJsonObject passmarkData = dataObject[dataKey].toObject();
VSAPoint previousSAPoint; try
SAPointFromJson(passmarkData[QStringLiteral("previousSAPoint")].toObject(), previousSAPoint); {
data.previousSAPoint = previousSAPoint; VSAPoint previousSAPoint;
PointFromJson(passmarkData[QStringLiteral("previousSAPoint")].toObject(), previousSAPoint);
data.previousSAPoint = previousSAPoint;
VSAPoint passmarkSAPoint; VSAPoint passmarkSAPoint;
SAPointFromJson(passmarkData[QStringLiteral("passmarkSAPoint")].toObject(), passmarkSAPoint); PointFromJson(passmarkData[QStringLiteral("passmarkSAPoint")].toObject(), passmarkSAPoint);
data.passmarkSAPoint = passmarkSAPoint; data.passmarkSAPoint = passmarkSAPoint;
VSAPoint nextSAPoint; VSAPoint nextSAPoint;
SAPointFromJson(passmarkData[QStringLiteral("nextSAPoint")].toObject(), nextSAPoint); PointFromJson(passmarkData[QStringLiteral("nextSAPoint")].toObject(), nextSAPoint);
data.nextSAPoint = nextSAPoint; data.nextSAPoint = nextSAPoint;
}
catch (const VException &e)
{
const QString error = QStringLiteral("Invalid json file '%1'. %2").arg(json, e.ErrorMessage());
QFAIL(qUtf8Printable(error));
}
qreal saWidth = 0; qreal saWidth = 0;
AbstractTest::ReadDoubleValue(passmarkData, QStringLiteral("saWidth"), saWidth); AbstractTest::ReadDoubleValue(passmarkData, QStringLiteral("saWidth"), saWidth);
@ -287,9 +194,9 @@ void AbstractTest::PassmarkShapeFromJson(const QString &json, QVector<QLineF> &s
TestRoot(shapeObject, shapeKey, json); TestRoot(shapeObject, shapeKey, json);
QJsonArray vectorArray = shapeObject[shapeKey].toArray(); QJsonArray vectorArray = shapeObject[shapeKey].toArray();
for (int i = 0; i < vectorArray.size(); ++i) for (auto && item : vectorArray)
{ {
QJsonObject lineObject = vectorArray[i].toObject(); QJsonObject lineObject = item.toObject();
QString type; QString type;
AbstractTest::ReadStringValue(lineObject, typeKey, type); AbstractTest::ReadStringValue(lineObject, typeKey, type);
@ -301,27 +208,25 @@ void AbstractTest::PassmarkShapeFromJson(const QString &json, QVector<QLineF> &s
QFAIL(qUtf8Printable(error)); QFAIL(qUtf8Printable(error));
} }
QLineF line; shape.append(QLineFromJson(lineObject));
QLineFromJson(lineObject, line);
shape.append(line);
} }
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void AbstractTest::Comparison(const QVector<QPointF> &ekv, const QVector<QPointF> &ekvOrig) const void AbstractTest::ComparePathsDistance(const QVector<QPointF> &ekv, const QVector<QPointF> &ekvOrig) const
{ {
// Begin comparison // Begin comparison
QCOMPARE(ekv.size(), ekvOrig.size());// First check if sizes equal QCOMPARE(ekv.size(), ekvOrig.size());// First check if sizes are equal
const qreal testAccuracy = MmToPixel(1.); const qreal testAccuracy = MmToPixel(1.);
for (int i=0; i < ekv.size(); i++) for (int i=0; i < ekv.size(); i++)
{ {
Comparison(ekv.at(i), ekvOrig.at(i), testAccuracy); ComparePointsDistance(ekv.at(i), ekvOrig.at(i), testAccuracy);
} }
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void AbstractTest::Comparison(const QPointF &result, const QPointF &expected, qreal testAccuracy) const void AbstractTest::ComparePointsDistance(const QPointF &result, const QPointF &expected, qreal testAccuracy) const
{ {
const QString msg = QStringLiteral("Actual '%2;%3', Expected '%4;%5'. Distance between points %6 mm.") const QString msg = QStringLiteral("Actual '%2;%3', Expected '%4;%5'. Distance between points %6 mm.")
.arg(result.x()).arg(result.y()).arg(expected.x()).arg(expected.y()) .arg(result.x()).arg(result.y()).arg(expected.x()).arg(expected.y())
@ -332,7 +237,7 @@ void AbstractTest::Comparison(const QPointF &result, const QPointF &expected, qr
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void AbstractTest::Comparison(const QVector<QLineF> &result, const QVector<QLineF> &expected) const void AbstractTest::CompareLinesDistance(const QVector<QLineF> &result, const QVector<QLineF> &expected) const
{ {
// Begin comparison // Begin comparison
QCOMPARE(result.size(), expected.size());// First check if sizes equal QCOMPARE(result.size(), expected.size());// First check if sizes equal
@ -525,7 +430,7 @@ bool AbstractTest::CopyRecursively(const QString &srcFilePath, const QString &tg
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void AbstractTest::PrepareDocument(const QString &json, QByteArray &data) const void AbstractTest::PrepareDocument(const QString &json, QByteArray &data)
{ {
QFile loadFile(json); QFile loadFile(json);
if (not loadFile.open(QIODevice::ReadOnly)) if (not loadFile.open(QIODevice::ReadOnly))
@ -538,7 +443,7 @@ void AbstractTest::PrepareDocument(const QString &json, QByteArray &data) const
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void AbstractTest::TestRoot(const QJsonObject &root, const QString &attribute, const QString &file) const void AbstractTest::TestRoot(const QJsonObject &root, const QString &attribute, const QString &file)
{ {
if (not root.contains(attribute)) if (not root.contains(attribute))
{ {
@ -549,7 +454,7 @@ void AbstractTest::TestRoot(const QJsonObject &root, const QString &attribute, c
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void AbstractTest::ReadStringValue(const QJsonObject &itemObject, const QString &attribute, QString &value, void AbstractTest::ReadStringValue(const QJsonObject &itemObject, const QString &attribute, QString &value,
const QString &defaultValue) const const QString &defaultValue)
{ {
if (itemObject.contains(attribute)) if (itemObject.contains(attribute))
{ {
@ -580,7 +485,7 @@ void AbstractTest::ReadStringValue(const QJsonObject &itemObject, const QString
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void AbstractTest::ReadBooleanValue(const QJsonObject &itemObject, const QString &attribute, bool &value, void AbstractTest::ReadBooleanValue(const QJsonObject &itemObject, const QString &attribute, bool &value,
const QString &defaultValue) const const QString &defaultValue)
{ {
if (itemObject.contains(attribute)) if (itemObject.contains(attribute))
{ {
@ -624,8 +529,7 @@ void AbstractTest::ReadPointValue(const QJsonObject &itemObject, const QString &
{ {
if (itemObject.contains(attribute)) if (itemObject.contains(attribute))
{ {
QJsonObject p1Object = itemObject[attribute].toObject(); PointFromJson(itemObject[attribute].toObject(), value);
VPointFromJson(p1Object, value);
} }
else else
{ {
@ -706,22 +610,11 @@ void AbstractTest::ReadPieceNodeValue(const QJsonObject &itemObject, VPieceNode
node = VPieceNode(id, typeTool, reverse); node = VPieceNode(id, typeTool, reverse);
} }
//---------------------------------------------------------------------------------------------------------------------
void AbstractTest::QPointFromJson(const QJsonObject &itemObject, QPointF &point) const
{
qreal x = 0;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("x"), x);
point.setX(x);
qreal y = 0;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("y"), y);
point.setY(y);
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
template<typename T, typename std::enable_if<std::is_floating_point<T>::value>::type*> template<typename T, typename std::enable_if<std::is_floating_point<T>::value>::type*>
void AbstractTest::ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value, void AbstractTest::ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value,
const QString &defaultValue) const const QString &defaultValue)
{ {
if (itemObject.contains(attribute)) if (itemObject.contains(attribute))
{ {
@ -760,7 +653,7 @@ void AbstractTest::ReadDoubleValue(const QJsonObject &itemObject, const QString
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
template<typename T, typename std::enable_if<std::is_enum<T>::value>::type*> template<typename T, typename std::enable_if<std::is_enum<T>::value>::type*>
void AbstractTest::ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value, void AbstractTest::ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value,
const QString &defaultValue) const const QString &defaultValue)
{ {
if (itemObject.contains(attribute)) if (itemObject.contains(attribute))
{ {
@ -799,7 +692,7 @@ void AbstractTest::ReadDoubleValue(const QJsonObject &itemObject, const QString
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
template<typename T, typename std::enable_if<std::is_integral<T>::value>::type*> template<typename T, typename std::enable_if<std::is_integral<T>::value>::type*>
void AbstractTest::ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value, void AbstractTest::ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value,
const QString &defaultValue) const const QString &defaultValue)
{ {
if (itemObject.contains(attribute)) if (itemObject.contains(attribute))
{ {
@ -836,81 +729,13 @@ void AbstractTest::ReadDoubleValue(const QJsonObject &itemObject, const QString
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void AbstractTest::VPointFromJson(const QJsonObject &itemObject, VPointF &point) auto AbstractTest::QLineFromJson(const QJsonObject &itemObject) -> QLineF
{
vidtype id = NULL_ID;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("id"), id);
qreal mx = 0;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("mx"), mx);
qreal my = 0;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("my"), my);
QString name;
AbstractTest::ReadStringValue(itemObject, QStringLiteral("name"), name);
qreal x = 0;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("x"), x);
qreal y = 0;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("y"), y);
point = VPointF(x, y, name, mx, my);
point.setId(id);
}
//---------------------------------------------------------------------------------------------------------------------
void AbstractTest::QLineFromJson(const QJsonObject &itemObject, QLineF &line)
{ {
QPointF p1; QPointF p1;
QPointFromJson(itemObject[QStringLiteral("p1")].toObject(), p1);
QPointF p2; QPointF p2;
QPointFromJson(itemObject[QStringLiteral("p2")].toObject(), p2); PointFromJson(itemObject[QStringLiteral("p1")].toObject(), p1);
PointFromJson(itemObject[QStringLiteral("p2")].toObject(), p2);
line = QLineF(p1, p2); return {p1, p2};
}
//---------------------------------------------------------------------------------------------------------------------
void AbstractTest::SAPointFromJson(const QJsonObject &itemObject, VSAPoint &point) const
{
qreal x = 0;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("x"), x);
point.setX(x);
qreal y = 0;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("y"), y);
point.setY(y);
qreal saBefore;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("saBefore"), saBefore, QStringLiteral("-1"));
point.SetSABefore(saBefore);
qreal saAfter;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("saAfter"), saAfter, QStringLiteral("-1"));
point.SetSAAfter(saAfter);
PieceNodeAngle angleType = PieceNodeAngle::ByLength;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("angle"), angleType,
QString::number(static_cast<int>(PieceNodeAngle::ByLength)));
point.SetAngleType(angleType);
}
//---------------------------------------------------------------------------------------------------------------------
void AbstractTest::RawSAPointFromJson(const QJsonObject &itemObject, VRawSAPoint &point) const
{
qreal x = 0;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("x"), x);
point.setX(x);
qreal y = 0;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("y"), y);
point.setY(y);
bool loopPoint;
AbstractTest::ReadBooleanValue(itemObject, QStringLiteral("loopPoint"), loopPoint, QStringLiteral("0"));
point.SetLoopPoint(loopPoint);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -989,9 +814,9 @@ void AbstractTest::DBFromJson(const QJsonObject &dbObject, QSharedPointer<VConta
if (dbObject.contains(itemsKey)) if (dbObject.contains(itemsKey))
{ {
QJsonArray items = dbObject[itemsKey].toArray(); QJsonArray items = dbObject[itemsKey].toArray();
for (int i = 0; i < items.size(); ++i) for (auto && item : items)
{ {
QJsonObject itemObject = items[i].toObject(); QJsonObject itemObject = item.toObject();
GOType objectType; GOType objectType;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("type"), objectType); AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("type"), objectType);
@ -1000,7 +825,7 @@ void AbstractTest::DBFromJson(const QJsonObject &dbObject, QSharedPointer<VConta
case GOType::Point: case GOType::Point:
{ {
VPointF point; VPointF point;
VPointFromJson(itemObject, point); PointFromJson(itemObject, point);
data->UpdateGObject(point.id(), new VPointF(point)); data->UpdateGObject(point.id(), new VPointF(point));
break; break;
} }

View File

@ -32,9 +32,17 @@
#include <QMetaObject> #include <QMetaObject>
#include <QObject> #include <QObject>
#include <QString> #include <QString>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <qtestcase.h>
#include "../vgeometry/vpointf.h"
#include "../vlayout/vsapoint.h"
#include "../vlayout/vrawsapoint.h"
#include "../ifc/exception/vexception.h"
template <class T> class QVector; template <class T> class QVector;
class VSAPoint;
#include <ciso646> #include <ciso646>
@ -69,9 +77,8 @@ class AbstractTest : public QObject
public: public:
explicit AbstractTest(QObject *parent = nullptr); explicit AbstractTest(QObject *parent = nullptr);
void VectorFromJson(const QString &json, QVector<QPointF>& vector) const; template <class T>
void VectorFromJson(const QString &json, QVector<VSAPoint>& vector) const; static auto VectorFromJson(const QString &json) -> QVector<T>;
void VectorFromJson(const QString &json, QVector<VRawSAPoint>& vector) const;
void PieceFromJson(const QString &json, VPiece &piece, QSharedPointer<VContainer> &data); void PieceFromJson(const QString &json, VPiece &piece, QSharedPointer<VContainer> &data);
@ -79,45 +86,50 @@ public:
void PassmarkShapeFromJson(const QString &json, QVector<QLineF> &shape); void PassmarkShapeFromJson(const QString &json, QVector<QLineF> &shape);
protected: protected:
void Comparison(const QVector<QPointF> &ekv, const QVector<QPointF> &ekvOrig) const; void ComparePathsDistance(const QVector<QPointF> &ekv, const QVector<QPointF> &ekvOrig) const;
void Comparison(const QPointF &result, const QPointF &expected, qreal testAccuracy) const; void ComparePointsDistance(const QPointF &result, const QPointF &expected, qreal testAccuracy) const;
void Comparison(const QVector<QLineF> &result, const QVector<QLineF> &expected) const; void CompareLinesDistance(const QVector<QLineF> &result, const QVector<QLineF> &expected) const;
QString ValentinaPath() const; auto ValentinaPath() const -> QString;
QString TapePath() const; auto TapePath() const -> QString;
QString TranslationsPath() const; auto TranslationsPath() const -> QString;
static int RunTimeout(int defMsecs); static auto RunTimeout(int defMsecs) -> int;
int Run(int exit, const QString &program, const QStringList &arguments, QString &error, int msecs = 120000); auto Run(int exit, const QString &program, const QStringList &arguments, QString &error, int msecs = 120000) -> int;
bool CopyRecursively(const QString &srcFilePath, const QString &tgtFilePath) const; auto CopyRecursively(const QString &srcFilePath, const QString &tgtFilePath) const -> bool;
void PrepareDocument(const QString &json, QByteArray &data) const; static void PrepareDocument(const QString &json, QByteArray &data);
void TestRoot(const QJsonObject &root, const QString &attribute, const QString &file) const; static void TestRoot(const QJsonObject &root, const QString &attribute, const QString &file);
template <typename T, typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr> template <typename T, typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr>
void ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value, static void ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value,
const QString &defaultValue = QString()) const; const QString &defaultValue = QString());
template <typename T, typename std::enable_if<std::is_enum<T>::value>::type* = nullptr> template <typename T, typename std::enable_if<std::is_enum<T>::value>::type* = nullptr>
void ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value, static void ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value,
const QString &defaultValue = QString()) const; const QString &defaultValue = QString());
template <typename T, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr> template <typename T, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
void ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value, static void ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value,
const QString &defaultValue = QString()) const; const QString &defaultValue = QString());
void ReadStringValue(const QJsonObject &itemObject, const QString &attribute, QString &value, static void ReadStringValue(const QJsonObject &itemObject, const QString &attribute, QString &value,
const QString &defaultValue = QString()) const; const QString &defaultValue = QString());
void ReadBooleanValue(const QJsonObject &itemObject, const QString &attribute, bool &value, static void ReadBooleanValue(const QJsonObject &itemObject, const QString &attribute, bool &value,
const QString &defaultValue = QString()) const; const QString &defaultValue = QString());
void ReadPointValue(const QJsonObject &itemObject, const QString &attribute, VPointF &value); void ReadPointValue(const QJsonObject &itemObject, const QString &attribute, VPointF &value);
void ReadSplinePointValues(const QJsonObject &itemObject, const QString &attribute, QVector<VSplinePoint> &points); void ReadSplinePointValues(const QJsonObject &itemObject, const QString &attribute, QVector<VSplinePoint> &points);
void ReadSplinePointValue(const QJsonObject &itemObject, VSplinePoint &point); void ReadSplinePointValue(const QJsonObject &itemObject, VSplinePoint &point);
void ReadPieceNodeValue(const QJsonObject &itemObject, VPieceNode &node); void ReadPieceNodeValue(const QJsonObject &itemObject, VPieceNode &node);
void QPointFromJson(const QJsonObject &itemObject, QPointF &point) const; template <class T>
void VPointFromJson(const QJsonObject &itemObject, VPointF &point); static void CheckClassType(const QJsonObject &itemObject);
void QLineFromJson(const QJsonObject &itemObject, QLineF &line);
void SAPointFromJson(const QJsonObject &itemObject, VSAPoint &point) const; template <class T>
void RawSAPointFromJson(const QJsonObject &itemObject, VRawSAPoint &point) const; static auto ReadPointData(const QJsonObject &pointObject) -> T;
template <class T>
static auto PointFromJson(const QJsonObject &pointObject, T &point) -> void;
auto QLineFromJson(const QJsonObject &itemObject) -> QLineF;
void SplineFromJson(const QJsonObject &itemObject, QSharedPointer<VContainer> &data); void SplineFromJson(const QJsonObject &itemObject, QSharedPointer<VContainer> &data);
void SplinePathFromJson(const QJsonObject &itemObject, QSharedPointer<VContainer> &data); void SplinePathFromJson(const QJsonObject &itemObject, QSharedPointer<VContainer> &data);
@ -125,4 +137,190 @@ protected:
void MainPathFromJson(const QJsonObject &pieceObject, VPiece &piece); void MainPathFromJson(const QJsonObject &pieceObject, VPiece &piece);
}; };
//---------------------------------------------------------------------------------------------------------------------
template<class T>
inline auto AbstractTest::VectorFromJson(const QString &json) -> QVector<T>
{
QByteArray saveData;
PrepareDocument(json, saveData);
QJsonDocument loadDoc(QJsonDocument::fromJson(saveData));
const QString vectorKey = QStringLiteral("vector");
QJsonObject vectorObject = loadDoc.object();
TestRoot(vectorObject, vectorKey, json);
QJsonArray vectorArray = vectorObject[vectorKey].toArray();
QVector<T> vector;
vector.reserve(vectorArray.size());
for (auto && item : vectorArray)
{
try
{
T point;
PointFromJson(item.toObject(), point);
vector.append(point);
}
catch (const VException &e)
{
throw VException(QStringLiteral("Invalid json file '%1'. %2").arg(json, e.ErrorMessage()));
}
}
return vector;
}
//---------------------------------------------------------------------------------------------------------------------
template<class T>
inline void AbstractTest::CheckClassType(const QJsonObject &itemObject)
{
const QString typeKey = QStringLiteral("type");
QString type;
AbstractTest::ReadStringValue(itemObject, typeKey, type);
const QStringList types
{
QStringLiteral("QPointF"), // 0
QStringLiteral("VLayoutPoint"), // 1
QStringLiteral("VRawSAPoint"), // 2
QStringLiteral("VSAPoint"), // 3
};
bool res = false;
switch (types.indexOf(type))
{
case 0:
res = (typeid(T) == typeid(QPointF));
break;
case 1:
res = (typeid(T) == typeid(VLayoutPoint));
break;
case 2:
res = (typeid(T) == typeid(VRawSAPoint));
break;
case 3:
res = (typeid(T) == typeid(VSAPoint));
break;
default:
break;
}
if (not res)
{
throw VException(QStringLiteral("Unexpected class '%2'.").arg(itemObject[typeKey].toString()));
}
}
//---------------------------------------------------------------------------------------------------------------------
template<class T>
inline auto AbstractTest::ReadPointData(const QJsonObject &pointObject) -> T
{
T point;
qreal x = 0;
AbstractTest::ReadDoubleValue(pointObject, QChar('x'), x);
point.setX(x);
qreal y = 0;
AbstractTest::ReadDoubleValue(pointObject, QChar('y'), y);
point.setY(y);
return point;
}
//---------------------------------------------------------------------------------------------------------------------
template<class T>
inline auto AbstractTest::PointFromJson(const QJsonObject &pointObject, T &point) -> void
{
CheckClassType<T>(pointObject);
point = ReadPointData<T>(pointObject);
}
//---------------------------------------------------------------------------------------------------------------------
template<>
inline auto AbstractTest::PointFromJson(const QJsonObject &pointObject, VPointF &point) -> void
{
vidtype id = NULL_ID;
AbstractTest::ReadDoubleValue(pointObject, QStringLiteral("id"), id);
qreal mx = 0;
AbstractTest::ReadDoubleValue(pointObject, QStringLiteral("mx"), mx);
qreal my = 0;
AbstractTest::ReadDoubleValue(pointObject, QStringLiteral("my"), my);
QString name;
AbstractTest::ReadStringValue(pointObject, QStringLiteral("name"), name);
qreal x = 0;
AbstractTest::ReadDoubleValue(pointObject, QChar('x'), x);
qreal y = 0;
AbstractTest::ReadDoubleValue(pointObject, QChar('y'), y);
point = VPointF(x, y, name, mx, my);
point.setId(id);
}
//---------------------------------------------------------------------------------------------------------------------
template<>
inline auto AbstractTest::ReadPointData(const QJsonObject &pointObject) -> VLayoutPoint
{
VLayoutPoint point(ReadPointData<QPointF>(pointObject));
bool turnPoint;
AbstractTest::ReadBooleanValue(pointObject, QStringLiteral("turnPoint"), turnPoint, QStringLiteral("0"));
point.SetTurnPoint(turnPoint);
bool curvePoint;
AbstractTest::ReadBooleanValue(pointObject, QStringLiteral("curvePoint"), curvePoint, QStringLiteral("0"));
point.SetCurvePoint(curvePoint);
return point;
}
//---------------------------------------------------------------------------------------------------------------------
template<>
inline auto AbstractTest::PointFromJson(const QJsonObject &pointObject, VLayoutPoint &point) -> void
{
CheckClassType<VLayoutPoint>(pointObject);
point = ReadPointData<VLayoutPoint>(pointObject);
}
//---------------------------------------------------------------------------------------------------------------------
template<>
inline auto AbstractTest::PointFromJson(const QJsonObject &pointObject, VSAPoint &point) -> void
{
CheckClassType<VSAPoint>(pointObject);
point = VSAPoint(ReadPointData<VLayoutPoint>(pointObject));
qreal saBefore;
AbstractTest::ReadDoubleValue(pointObject, QStringLiteral("saBefore"), saBefore, QStringLiteral("-1"));
point.SetSABefore(saBefore);
qreal saAfter;
AbstractTest::ReadDoubleValue(pointObject, QStringLiteral("saAfter"), saAfter, QStringLiteral("-1"));
point.SetSAAfter(saAfter);
PieceNodeAngle angleType = PieceNodeAngle::ByLength;
AbstractTest::ReadDoubleValue(pointObject, QStringLiteral("angle"), angleType,
QString::number(static_cast<int>(PieceNodeAngle::ByLength)));
point.SetAngleType(angleType);
}
//---------------------------------------------------------------------------------------------------------------------
template<>
inline auto AbstractTest::PointFromJson(const QJsonObject &pointObject, VRawSAPoint &point) -> void
{
CheckClassType<VRawSAPoint>(pointObject);
point = VRawSAPoint(ReadPointData<VLayoutPoint>(pointObject));
bool loopPoint;
AbstractTest::ReadBooleanValue(pointObject, QStringLiteral("loopPoint"), loopPoint, QStringLiteral("0"));
point.SetLoopPoint(loopPoint);
}
#endif // ABSTRACTTEST_H #endif // ABSTRACTTEST_H

View File

@ -672,6 +672,11 @@ QString GetNodeName(const VContainer *data, const VPieceNode &node, bool showPas
{ {
name = QLatin1Char('[') + name + QLatin1Char(']'); name = QLatin1Char('[') + name + QLatin1Char(']');
} }
if (not node.IsTurnPoint())
{
name += QStringLiteral(" ⦿");
}
} }
return name; return name;

View File

@ -329,11 +329,13 @@ void DialogPiecePath::ShowContextMenu(const QPoint &pos)
QListWidgetItem *rowItem = ui->listWidget->item(row); QListWidgetItem *rowItem = ui->listWidget->item(row);
SCASSERT(rowItem != nullptr); SCASSERT(rowItem != nullptr);
VPieceNode rowNode = qvariant_cast<VPieceNode>(rowItem->data(Qt::UserRole)); auto rowNode = qvariant_cast<VPieceNode>(rowItem->data(Qt::UserRole));
QAction *actionPassmark = nullptr; QAction *actionPassmark = nullptr;
QAction *actionUniqueness = nullptr; QAction *actionUniqueness = nullptr;
QAction *actionReverse = nullptr; QAction *actionReverse = nullptr;
QAction *actionTurnPoint = nullptr;
if (rowNode.GetTypeTool() != Tool::NodePoint) if (rowNode.GetTypeTool() != Tool::NodePoint)
{ {
actionReverse = menu->addAction(tr("Reverse")); actionReverse = menu->addAction(tr("Reverse"));
@ -353,6 +355,10 @@ void DialogPiecePath::ShowContextMenu(const QPoint &pos)
actionUniqueness = menu->addAction(tr("Check uniqueness")); actionUniqueness = menu->addAction(tr("Check uniqueness"));
actionUniqueness->setCheckable(true); actionUniqueness->setCheckable(true);
actionUniqueness->setChecked(rowNode.IsCheckUniqueness()); actionUniqueness->setChecked(rowNode.IsCheckUniqueness());
actionTurnPoint = menu->addAction(tr("Turn point"));
actionTurnPoint->setCheckable(true);
actionTurnPoint->setChecked(rowNode.IsTurnPoint());
} }
QAction *actionExcluded = menu->addAction(tr("Excluded")); QAction *actionExcluded = menu->addAction(tr("Excluded"));
@ -393,6 +399,12 @@ void DialogPiecePath::ShowContextMenu(const QPoint &pos)
rowItem->setData(Qt::UserRole, QVariant::fromValue(rowNode)); rowItem->setData(Qt::UserRole, QVariant::fromValue(rowNode));
rowItem->setText(GetNodeName(data, rowNode, IsShowNotch())); rowItem->setText(GetNodeName(data, rowNode, IsShowNotch()));
} }
else if (rowNode.GetTypeTool() == Tool::NodePoint && selectedAction == actionTurnPoint)
{
rowNode.SetTurnPoint(not rowNode.IsTurnPoint());
rowItem->setData(Qt::UserRole, QVariant::fromValue(rowNode));
rowItem->setText(GetNodeName(data, rowNode, IsShowNotch()));
}
ValidObjects(PathIsValid()); ValidObjects(PathIsValid());
ListChanged(); ListChanged();

View File

@ -745,11 +745,13 @@ void DialogSeamAllowance::ShowMainPathContextMenu(const QPoint &pos)
QListWidgetItem *rowItem = uiTabPaths->listWidgetMainPath->item(row); QListWidgetItem *rowItem = uiTabPaths->listWidgetMainPath->item(row);
SCASSERT(rowItem != nullptr); SCASSERT(rowItem != nullptr);
VPieceNode rowNode = qvariant_cast<VPieceNode>(rowItem->data(Qt::UserRole)); auto rowNode = qvariant_cast<VPieceNode>(rowItem->data(Qt::UserRole));
QAction *actionPassmark = nullptr; QAction *actionPassmark = nullptr;
QAction *actionUniqueness = nullptr; QAction *actionUniqueness = nullptr;
QAction *actionReverse = nullptr; QAction *actionReverse = nullptr;
QAction *actionTurnPoint = nullptr;
if (rowNode.GetTypeTool() != Tool::NodePoint) if (rowNode.GetTypeTool() != Tool::NodePoint)
{ {
actionReverse = menu->addAction(tr("Reverse")); actionReverse = menu->addAction(tr("Reverse"));
@ -768,6 +770,10 @@ void DialogSeamAllowance::ShowMainPathContextMenu(const QPoint &pos)
actionUniqueness = menu->addAction(tr("Check uniqueness")); actionUniqueness = menu->addAction(tr("Check uniqueness"));
actionUniqueness->setCheckable(true); actionUniqueness->setCheckable(true);
actionUniqueness->setChecked(rowNode.IsCheckUniqueness()); actionUniqueness->setChecked(rowNode.IsCheckUniqueness());
actionTurnPoint = menu->addAction(tr("Turn point"));
actionTurnPoint->setCheckable(true);
actionTurnPoint->setChecked(rowNode.IsTurnPoint());
} }
QAction *actionExcluded = menu->addAction(tr("Excluded")); QAction *actionExcluded = menu->addAction(tr("Excluded"));
@ -807,6 +813,13 @@ void DialogSeamAllowance::ShowMainPathContextMenu(const QPoint &pos)
rowItem->setText(GetNodeName(data, rowNode, true)); rowItem->setText(GetNodeName(data, rowNode, true));
} }
else if (selectedAction == actionTurnPoint)
{
rowNode.SetTurnPoint(not rowNode.IsTurnPoint());
rowItem->setData(Qt::UserRole, QVariant::fromValue(rowNode));
rowItem->setText(GetNodeName(data, rowNode, true));
}
ValidObjects(MainPathIsValid()); ValidObjects(MainPathIsValid());
ListChanged(); ListChanged();
} }
@ -2750,7 +2763,8 @@ void DialogSeamAllowance::ValidObjects(bool value)
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
bool DialogSeamAllowance::MainPathIsClockwise() const bool DialogSeamAllowance::MainPathIsClockwise() const
{ {
const QVector<QPointF> points = CreatePiece().MainPathPoints(data); QVector<QPointF> points;
CastTo(CreatePiece().MainPathPoints(data), points);
if(points.count() < 3) if(points.count() < 3)
{ {

View File

@ -100,6 +100,7 @@ enum class ContextMenuOption : int
ForbidFlipping, ForbidFlipping,
ForceFlipping, ForceFlipping,
Remove, Remove,
TurnPoint,
LAST_ONE_DO_NOT_USE LAST_ONE_DO_NOT_USE
}; };
} }
@ -140,7 +141,7 @@ void VNodePoint::Create(const VAbstractNodeInitData &initData)
VAbstractTool::AddRecord(initData.id, Tool::NodePoint, initData.doc); VAbstractTool::AddRecord(initData.id, Tool::NodePoint, initData.doc);
//TODO Need create garbage collector and remove all nodes, what we don't use. //TODO Need create garbage collector and remove all nodes, what we don't use.
//Better check garbage before each saving file. Check only modeling tags. //Better check garbage before each saving file. Check only modeling tags.
VNodePoint *point = new VNodePoint(initData); auto *point = new VNodePoint(initData);
connect(initData.scene, &VMainGraphicsScene::EnableToolMove, point, &VNodePoint::EnableToolMove); connect(initData.scene, &VMainGraphicsScene::EnableToolMove, point, &VNodePoint::EnableToolMove);
connect(initData.scene, &VMainGraphicsScene::EnablePointItemHover, point, &VNodePoint::AllowHover); connect(initData.scene, &VMainGraphicsScene::EnablePointItemHover, point, &VNodePoint::AllowHover);
@ -326,7 +327,7 @@ QHash<int, QAction *> VNodePoint::InitContextMenu(QMenu *menu, vidtype pieceId,
InitPassmarkAngleTypeMenu(menu, pieceId, contextMenu); InitPassmarkAngleTypeMenu(menu, pieceId, contextMenu);
InitPassmarkLineTypeMenu(menu, pieceId, contextMenu); InitPassmarkLineTypeMenu(menu, pieceId, contextMenu);
QAction *separatorAct = new QAction(this); auto *separatorAct = new QAction(this);
separatorAct->setSeparator(true); separatorAct->setSeparator(true);
menu->addAction(separatorAct); menu->addAction(separatorAct);
@ -366,11 +367,17 @@ void VNodePoint::InitPassmarkMenu(QMenu *menu, vidtype pieceId, QHash<int, QActi
const int nodeIndex = detail.GetPath().indexOfNode(m_id); const int nodeIndex = detail.GetPath().indexOfNode(m_id);
if (nodeIndex != -1) if (nodeIndex != -1)
{ {
const VPieceNode &node = detail.GetPath().at(nodeIndex);
QAction *actionPassmark = menu->addAction(tr("Passmark")); QAction *actionPassmark = menu->addAction(tr("Passmark"));
actionPassmark->setCheckable(true); actionPassmark->setCheckable(true);
actionPassmark->setChecked(detail.GetPath().at(nodeIndex).IsPassmark()); actionPassmark->setChecked(node.IsPassmark());
contextMenu.insert(static_cast<int>(ContextMenuOption::Passmark), actionPassmark); contextMenu.insert(static_cast<int>(ContextMenuOption::Passmark), actionPassmark);
QAction *actionTurnPoint = menu->addAction(tr("Turn point"));
actionTurnPoint->setCheckable(true);
actionTurnPoint->setChecked(node.IsTurnPoint());
contextMenu.insert(static_cast<int>(ContextMenuOption::TurnPoint), actionTurnPoint);
} }
} }
@ -524,7 +531,7 @@ void VNodePoint::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
return; return;
} }
if (VToolSeamAllowance *piece = qgraphicsitem_cast<VToolSeamAllowance *>(parentItem())) if (auto *piece = qgraphicsitem_cast<VToolSeamAllowance *>(parentItem()))
{ {
QMenu menu; QMenu menu;
QHash<int, QAction *> contextMenu = InitContextMenu(&menu, piece->getId(), piece->referens()); QHash<int, QAction *> contextMenu = InitContextMenu(&menu, piece->getId(), piece->referens());
@ -573,7 +580,7 @@ void VNodePoint::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
ContextMenuOption selectedOption = static_cast<ContextMenuOption>( ContextMenuOption selectedOption = static_cast<ContextMenuOption>(
contextMenu.key(selectedAction, static_cast<int>(ContextMenuOption::NoSelection))); contextMenu.key(selectedAction, static_cast<int>(ContextMenuOption::NoSelection)));
Q_STATIC_ASSERT_X(static_cast<int>(ContextMenuOption::LAST_ONE_DO_NOT_USE) == 31, Q_STATIC_ASSERT_X(static_cast<int>(ContextMenuOption::LAST_ONE_DO_NOT_USE) == 32,
"Not all options were handled."); "Not all options were handled.");
QT_WARNING_PUSH QT_WARNING_PUSH
@ -614,6 +621,9 @@ QT_WARNING_DISABLE_GCC("-Wswitch-default")
case ContextMenuOption::Exclude: case ContextMenuOption::Exclude:
emit ToggleExcludeState(m_id); emit ToggleExcludeState(m_id);
break; break;
case ContextMenuOption::TurnPoint:
emit ToggleTurnPointState(m_id);
break;
case ContextMenuOption::ByLength: case ContextMenuOption::ByLength:
SelectSeamAllowanceAngle(PieceNodeAngle::ByLength); SelectSeamAllowanceAngle(PieceNodeAngle::ByLength);
break; break;

View File

@ -38,7 +38,6 @@
#include <QString> #include <QString>
#include <QtGlobal> #include <QtGlobal>
#include "../ifc/xml/vabstractpattern.h"
#include "../vmisc/def.h" #include "../vmisc/def.h"
#include "vabstractnode.h" #include "vabstractnode.h"
#include "../vwidgets/vscenepoint.h" #include "../vwidgets/vscenepoint.h"
@ -66,6 +65,7 @@ signals:
void ToggleForceFlipping(bool checked); void ToggleForceFlipping(bool checked);
void Delete(); void Delete();
void ToggleExcludeState(quint32 id); void ToggleExcludeState(quint32 id);
void ToggleTurnPointState(quint32 id);
void ToggleSeamAllowanceAngleType(quint32 id, PieceNodeAngle type); void ToggleSeamAllowanceAngleType(quint32 id, PieceNodeAngle type);
void TogglePassmark(quint32 id, bool toggle); void TogglePassmark(quint32 id, bool toggle);
void TogglePassmarkAngleType(quint32 id, PassmarkAngleType type); void TogglePassmarkAngleType(quint32 id, PassmarkAngleType type);

View File

@ -567,6 +567,9 @@ QDomElement VAbstractTool::AddSANode(VAbstractPattern *doc, const QString &tagNa
nod.removeAttribute(VAbstractPattern::AttrNodePassmarkLine); nod.removeAttribute(VAbstractPattern::AttrNodePassmarkLine);
nod.removeAttribute(VAbstractPattern::AttrNodePassmarkAngle); nod.removeAttribute(VAbstractPattern::AttrNodePassmarkAngle);
} }
doc->SetAttributeOrRemoveIf<bool>(nod, VAbstractPattern::AttrNodeTurnPoint, node.IsTurnPoint(),
[](bool value) noexcept {return value;});
} }
else else
{ // Wrong configuration. { // Wrong configuration.

View File

@ -1391,7 +1391,7 @@ void VToolSeamAllowance::RefreshGeometry(bool updateChildren)
this->getData()); this->getData());
QFuture<QPainterPath > futurePassmarks = QtConcurrent::run(detail, &VPiece::PassmarksPath, this->getData()); QFuture<QPainterPath > futurePassmarks = QtConcurrent::run(detail, &VPiece::PassmarksPath, this->getData());
QFuture<QVector<QPointF> > futureSeamAllowance; QFuture<QVector<VLayoutPoint> > futureSeamAllowance;
QFuture<bool> futureSeamAllowanceValid; QFuture<bool> futureSeamAllowanceValid;
if (detail.IsSeamAllowance()) if (detail.IsSeamAllowance())
@ -1584,6 +1584,26 @@ void VToolSeamAllowance::ToggleExcludeState(quint32 id)
} }
} }
//---------------------------------------------------------------------------------------------------------------------
void VToolSeamAllowance::ToggleTurnPointState(quint32 id)
{
const VPiece oldDet = VAbstractTool::data.GetPiece(m_id);
VPiece newDet = oldDet;
for (int i = 0; i< oldDet.GetPath().CountNodes(); ++i)
{
VPieceNode node = oldDet.GetPath().at(i);
if (node.GetId() == id && node.GetTypeTool() == Tool::NodePoint)
{
node.SetTurnPoint(not node.IsTurnPoint());
newDet.GetPath()[i] = node;
VAbstractApplication::VApp()->getUndoStack()->push(new SavePieceOptions(oldDet, newDet, doc, m_id));
return;
}
}
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VToolSeamAllowance::ToggleNodePointAngleType(quint32 id, PieceNodeAngle type) void VToolSeamAllowance::ToggleNodePointAngleType(quint32 id, PieceNodeAngle type)
{ {
@ -1876,7 +1896,7 @@ void VToolSeamAllowance::InitNode(const VPieceNode &node, VMainGraphicsScene *sc
{ {
case (Tool::NodePoint): case (Tool::NodePoint):
{ {
VNodePoint *tool = qobject_cast<VNodePoint*>(VAbstractPattern::getTool(node.GetId())); auto *tool = qobject_cast<VNodePoint*>(VAbstractPattern::getTool(node.GetId()));
SCASSERT(tool != nullptr); SCASSERT(tool != nullptr);
if (tool->parent() != parent) if (tool->parent() != parent)
@ -1891,6 +1911,8 @@ void VToolSeamAllowance::InitNode(const VPieceNode &node, VMainGraphicsScene *sc
connect(tool, &VNodePoint::Delete, parent, &VToolSeamAllowance::DeleteFromMenu, Qt::UniqueConnection); connect(tool, &VNodePoint::Delete, parent, &VToolSeamAllowance::DeleteFromMenu, Qt::UniqueConnection);
connect(tool, &VNodePoint::ToggleExcludeState, parent, &VToolSeamAllowance::ToggleExcludeState, connect(tool, &VNodePoint::ToggleExcludeState, parent, &VToolSeamAllowance::ToggleExcludeState,
Qt::UniqueConnection); Qt::UniqueConnection);
connect(tool, &VNodePoint::ToggleTurnPointState, parent, &VToolSeamAllowance::ToggleTurnPointState,
Qt::UniqueConnection);
connect(tool, &VNodePoint::ToggleSeamAllowanceAngleType, parent, connect(tool, &VNodePoint::ToggleSeamAllowanceAngleType, parent,
&VToolSeamAllowance::ToggleNodePointAngleType, Qt::UniqueConnection); &VToolSeamAllowance::ToggleNodePointAngleType, Qt::UniqueConnection);
connect(tool, &VNodePoint::TogglePassmark, parent, &VToolSeamAllowance::ToggleNodePointPassmark, connect(tool, &VNodePoint::TogglePassmark, parent, &VToolSeamAllowance::ToggleNodePointPassmark,
@ -2071,8 +2093,10 @@ auto VToolSeamAllowance::IsGrainlinePositionValid() const -> bool
{ {
QLineF grainLine = m_grainLine->Grainline(); QLineF grainLine = m_grainLine->Grainline();
const VPiece detail = VAbstractTool::data.GetPiece(m_id); const VPiece detail = VAbstractTool::data.GetPiece(m_id);
const QVector<QPointF> contourPoints = detail.IsSeamAllowance() && not detail.IsSeamAllowanceBuiltIn() ? QVector<QPointF> contourPoints;
detail.SeamAllowancePoints(getData()) : detail.MainPathPoints(getData()); detail.IsSeamAllowance() && not detail.IsSeamAllowanceBuiltIn()
? CastTo(detail.SeamAllowancePoints(getData()), contourPoints)
: CastTo(detail.MainPathPoints(getData()), contourPoints);
QVector<QPointF> points = VAbstractCurve::CurveIntersectLine(contourPoints, grainLine); QVector<QPointF> points = VAbstractCurve::CurveIntersectLine(contourPoints, grainLine);
if (not points.isEmpty()) if (not points.isEmpty())

View File

@ -168,6 +168,7 @@ private slots:
void ToggleForbidFlipping(bool checked); void ToggleForbidFlipping(bool checked);
void ToggleForceFlipping(bool checked); void ToggleForceFlipping(bool checked);
void ToggleExcludeState(quint32 id); void ToggleExcludeState(quint32 id);
void ToggleTurnPointState(quint32 id);
void ToggleNodePointAngleType(quint32 id, PieceNodeAngle type); void ToggleNodePointAngleType(quint32 id, PieceNodeAngle type);
void ToggleNodePointPassmark(quint32 id, bool toggle); void ToggleNodePointPassmark(quint32 id, bool toggle);
void TogglePassmarkAngleType(quint32 id, PassmarkAngleType type); void TogglePassmarkAngleType(quint32 id, PassmarkAngleType type);

View File

@ -52,7 +52,7 @@ void VisToolPiece::RefreshGeometry()
if (GetMode() == Mode::Creation) if (GetMode() == Mode::Creation)
{ {
m_cachedCurvesPath = m_piece.CurvesPainterPath(GetData()); m_cachedCurvesPath = m_piece.CurvesPainterPath(GetData());
m_cachedMainPathPoints = m_piece.MainPathPoints(GetData()); CastTo(m_piece.MainPathPoints(GetData()), m_cachedMainPathPoints);
m_cachedMainPath = VPiece::MainPathPath(m_cachedMainPathPoints); m_cachedMainPath = VPiece::MainPathPath(m_cachedMainPathPoints);
} }
else else

View File

@ -31,6 +31,7 @@
#include "../vgeometry/vpointf.h" #include "../vgeometry/vpointf.h"
#include "../vwidgets/scalesceneitems.h" #include "../vwidgets/scalesceneitems.h"
#include "../vmisc/compatibility.h" #include "../vmisc/compatibility.h"
#include "../vlayout/vlayoutpoint.h"
#include <QGraphicsSceneMouseEvent> #include <QGraphicsSceneMouseEvent>
@ -63,7 +64,7 @@ void VisToolPiecePath::RefreshGeometry()
if (GetMode() == Mode::Creation) if (GetMode() == Mode::Creation)
{ {
const QVector<QPointF> points = m_path.PathPoints(GetData()); const QVector<VLayoutPoint> points = m_path.PathPoints(GetData());
if (not points.empty()) if (not points.empty())
{ {
DrawLine(m_line, QLineF(ConstLast(points), ScenePos()), Color(VColor::SupportColor), Qt::DashLine); DrawLine(m_line, QLineF(ConstLast(points), ScenePos()), Color(VColor::SupportColor), Qt::DashLine);

View File

@ -1,549 +1,651 @@
{ {
"vector": [ "vector": [
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1676.804606592377, "x": 1676.804606592377,
"y": 376.4976377952755 "y": 376.4976377952755
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1790.1904333640305, "x": 1790.1904333640305,
"y": 376.4976377952755 "y": 376.4976377952755
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2132.831278036873, "x": 2132.831278036873,
"y": 334.01963822471856 "y": 334.01963822471856
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2170.166929133858, "x": 2170.166929133858,
"y": 187.5212598425196 "y": 187.5212598425196
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2170.166929133858, "x": 2170.166929133858,
"y": 187.5212598425196 "y": 187.5212598425196
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2209.0824577516487, "x": 2209.0824577516487,
"y": 196.52029498815347 "y": 196.52029498815347
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2280.0788311549086, "x": 2280.0788311549086,
"y": 214.46913581675784 "y": 214.46913581675784
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2345.053938897079, "x": 2345.053938897079,
"y": 232.82808880019167 "y": 232.82808880019167
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2406.430397575602, "x": 2406.430397575602,
"y": 252.1184733940386 "y": 252.1184733940386
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2466.630823787921, "x": 2466.630823787921,
"y": 272.8616090538824 "y": 272.8616090538824
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2528.077834131477, "x": 2528.077834131477,
"y": 295.5788152353067 "y": 295.5788152353067
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2626.972277996681, "x": 2626.972277996681,
"y": 334.08672189942854 "y": 334.08672189942854
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2683.174281565618, "x": 2683.174281565618,
"y": 428.6163050991843 "y": 428.6163050991843
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2636.9155845119085, "x": 2636.9155845119085,
"y": 570.0364148944475 "y": 570.0364148944475
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2602.3359035137023, "x": 2602.3359035137023,
"y": 679.2016045836615 "y": 679.2016045836615
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2581.1485889486808, "x": 2581.1485889486808,
"y": 750.3046656507598 "y": 750.3046656507598
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2562.658903353014, "x": 2562.658903353014,
"y": 818.1666036205969 "y": 818.1666036205969
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2551.3190086136897, "x": 2551.3190086136897,
"y": 865.7283064025331 "y": 865.7283064025331
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2545.058458315721, "x": 2545.058458315721,
"y": 895.6477493986852 "y": 895.6477493986852
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2542.4441145955184, "x": 2542.4441145955184,
"y": 909.8834645669292 "y": 909.8834645669292
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2539.941891688312, "x": 2539.941891688312,
"y": 924.5359428210015 "y": 924.5359428210015
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2537.2824566009085, "x": 2537.2824566009085,
"y": 946.6345652094251 "y": 946.6345652094251
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2536.3671357993244, "x": 2536.3671357993244,
"y": 961.2177429989904 "y": 961.2177429989904
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2536.3893819364166, "x": 2536.3893819364166,
"y": 975.5256347551833 "y": 975.5256347551833
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2537.538148749601, "x": 2537.538148749601,
"y": 989.4206965556962 "y": 989.4206965556962
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2540.002389976296, "x": 2540.002389976296,
"y": 1002.7653844782211 "y": 1002.7653844782211
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2543.971059353917, "x": 2543.971059353917,
"y": 1015.422154600451 "y": 1015.422154600451
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2549.633110619882, "x": 2549.633110619882,
"y": 1027.253463000078 "y": 1027.253463000078
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2557.177497511606, "x": 2557.177497511606,
"y": 1038.121765754795 "y": 1038.121765754795
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2566.7931737665076, "x": 2566.7931737665076,
"y": 1047.8895189422938 "y": 1047.8895189422938
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2578.669093122002, "x": 2578.669093122002,
"y": 1056.419178640267 "y": 1056.419178640267
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2592.9942093155073, "x": 2592.9942093155073,
"y": 1063.5732009264073 "y": 1063.5732009264073
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2609.9574760844393, "x": 2609.9574760844393,
"y": 1069.214041878407 "y": 1069.214041878407
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2629.747847166216, "x": 2629.747847166216,
"y": 1073.204157573959 "y": 1073.204157573959
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2652.554276298253, "x": 2652.554276298253,
"y": 1075.406004090755 "y": 1075.406004090755
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2656.455947900562, "x": 2656.455947900562,
"y": 1149.9520876303336 "y": 1149.9520876303336
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2642.4743193451973, "x": 2642.4743193451973,
"y": 1283.9248328571011 "y": 1283.9248328571011
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2632.348846491074, "x": 2632.348846491074,
"y": 1400.3953842544354 "y": 1400.3953842544354
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2625.462074272455, "x": 2625.462074272455,
"y": 1499.2648032469053 "y": 1499.2648032469053
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2621.1965476236046, "x": 2621.1965476236046,
"y": 1580.4341512590793 "y": 1580.4341512590793
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2618.9348114787863, "x": 2618.9348114787863,
"y": 1643.804489715526 "y": 1643.804489715526
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2617.8911123953603, "x": 2617.8911123953603,
"y": 1707.5262208487393 "y": 1707.5262208487393
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2617.9884514435694, "x": 2617.9884514435694,
"y": 1722.9543307086615 "y": 1722.9543307086615
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2618.243518754759, "x": 2618.243518754759,
"y": 1728.6863715569775 "y": 1728.6863715569775
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2620.9069750474355, "x": 2620.9069750474355,
"y": 1754.8103451532859 "y": 1754.8103451532859
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2628.7361755238107, "x": 2628.7361755238107,
"y": 1818.230094084754 "y": 1818.230094084754
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2644.9536288641093, "x": 2644.9536288641093,
"y": 1932.092426039521 "y": 1932.092426039521
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2659.427198191514, "x": 2659.427198191514,
"y": 2020.1956325333963 "y": 2020.1956325333963
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2669.339056867133, "x": 2669.339056867133,
"y": 2073.2470143796036 "y": 2073.2470143796036
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2674.225047922979, "x": 2674.225047922979,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2674.225047922979, "x": 2674.225047922979,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"saAfter": 151.18110236220474, "saAfter": 151.18110236220474,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 3075.2356380110023 "y": 3075.2356380110023
}, },
{ {
"saBefore": 151.18110236220474, "saBefore": 151.18110236220474,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3069.6740125566685 "y": 3069.6740125566685
}, },
{ {
"curvePoint": true,
"saBefore": 151.18110236220474, "saBefore": 151.18110236220474,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3069.6740125566685 "y": 3069.6740125566685
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2007.2814993554916, "x": 2007.2814993554916,
"y": 3069.0853220695535 "y": 3069.0853220695535
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1985.2213981724194, "x": 1985.2213981724194,
"y": 3066.6063749413943 "y": 3066.6063749413943
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1971.0975271551902, "x": 1971.0975271551902,
"y": 3064.1269682327293 "y": 3064.1269682327293
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1957.4637612744855, "x": 1957.4637612744855,
"y": 3060.939408867782 "y": 3060.939408867782
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1944.3112415072071, "x": 1944.3112415072071,
"y": 3057.044174599266 "y": 3057.044174599266
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1931.6311088302562, "x": 1931.6311088302562,
"y": 3052.4417431799 "y": 3052.4417431799
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1919.4145042205341, "x": 1919.4145042205341,
"y": 3047.1325923624 "y": 3047.1325923624
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1907.6525686549428, "x": 1907.6525686549428,
"y": 3041.117199899481 "y": 3041.117199899481
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1896.3364431103832, "x": 1896.3364431103832,
"y": 3034.3960435438594 "y": 3034.3960435438594
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1885.457268563757, "x": 1885.457268563757,
"y": 3026.969601048252 "y": 3026.969601048252
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1875.0061859919656, "x": 1875.0061859919656,
"y": 3018.8383501653752 "y": 3018.8383501653752
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1864.97433637191, "x": 1864.97433637191,
"y": 3010.0027686479434 "y": 3010.0027686479434
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1855.3528606804925, "x": 1855.3528606804925,
"y": 3000.4633342486754 "y": 3000.4633342486754
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1841.6221908501716, "x": 1841.6221908501716,
"y": 2984.9233358928996 "y": 2984.9233358928996
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1824.7351747619791, "x": 1824.7351747619791,
"y": 2961.627082835932 "y": 2961.627082835932
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1809.3301919725623, "x": 1809.3301919725623,
"y": 2935.524017800505 "y": 2935.524017800505
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1795.3363702971328, "x": 1795.3363702971328,
"y": 2906.617962808349 "y": 2906.617962808349
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1782.6828375509026, "x": 1782.6828375509026,
"y": 2874.9127398811934 "y": 2874.9127398811934
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1771.298721549083, "x": 1771.298721549083,
"y": 2840.412171040767 "y": 2840.412171040767
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1761.1131501068844, "x": 1761.1131501068844,
"y": 2803.1200783087997 "y": 2803.1200783087997
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1752.0552510395196, "x": 1752.0552510395196,
"y": 2763.0402837070214 "y": 2763.0402837070214
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1744.054152162199, "x": 1744.054152162199,
"y": 2720.1766092571615 "y": 2720.1766092571615
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1737.0389812901346, "x": 1737.0389812901346,
"y": 2674.5328769809485 "y": 2674.5328769809485
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1730.9388662385377, "x": 1730.9388662385377,
"y": 2626.1129089001124 "y": 2626.1129089001124
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1725.6829348226192, "x": 1725.6829348226192,
"y": 2574.9205270363836 "y": 2574.9205270363836
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1721.2003148575914, "x": 1721.2003148575914,
"y": 2520.9595534114897 "y": 2520.9595534114897
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1715.6967946026289, "x": 1715.6967946026289,
"y": 2435.1802236828553 "y": 2435.1802236828553
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1710.5209571604514, "x": 1710.5209571604514,
"y": 2310.692590126838 "y": 2310.692590126838
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1707.1626661956402, "x": 1707.1626661956402,
"y": 2175.1993859172935 "y": 2175.1993859172935
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1705.0549442298873, "x": 1705.0549442298873,
"y": 2028.73118722806 "y": 2028.73118722806
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1703.0187742577805, "x": 1703.0187742577805,
"y": 1789.8799791806941 "y": 1789.8799791806941
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1701.5055118110236, "x": 1701.5055118110236,
"y": 1614.2929133858268 "y": 1614.2929133858268
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1701.5055118110236, "x": 1701.5055118110236,
"y": 1614.2929133858268 "y": 1614.2929133858268

View File

@ -22,33 +22,33 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2218.3461551694068, "x": 2217.5977299326023,
"y": 159.8778773943609 "y": 159.69675636609975
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2290.3556666474014, "x": 2289.3425285726667,
"y": 178.09786268498775 "y": 177.82671822296527
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2356.386310160867, "x": 2355.330774389572,
"y": 196.77174097480187 "y": 196.45681566842157
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2418.743012243872, "x": 2417.76276883939,
"y": 216.38498242273093 "y": 216.0621255686488
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2479.7368903013507, "x": 2478.943438456191,
"y": 237.4114485815882 "y": 237.12811808257362
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2541.791733714628, "x": 2541.1839006449068,
"y": 260.35933461464947 "y": 260.1286547630125
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -58,7 +58,7 @@
{ {
"type": "QPointF", "type": "QPointF",
"x": 2750.0942175506984, "x": 2750.0942175506984,
"y": 342.49876114111674 "y": 342.4987611411168
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -95,6 +95,11 @@
"x": 2582.147933534884, "x": 2582.147933534884,
"y": 902.9327107340721 "y": 902.9327107340721
}, },
{
"type": "QPointF",
"x": 2579.6177268527103,
"y": 916.710279982473
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 2577.3549162322406, "x": 2577.3549162322406,
@ -137,18 +142,18 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2586.114686464242, "x": 2586.380914190024,
"y": 1013.528603121976 "y": 1013.9121258080509
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2591.4699318406524, "x": 2591.4629589216133,
"y": 1019.025810364433 "y": 1019.0745457263262
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2598.6551332041845, "x": 2598.261040748605,
"y": 1024.1539538228847 "y": 1023.957142420315
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -177,8 +182,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2694.0188568415797, "x": 2693.986760463563,
"y": 1154.1454872438824 "y": 1154.4153784932541
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -210,6 +215,11 @@
"x": 2655.688340739313, "x": 2655.688340739313,
"y": 1707.7165018577969 "y": 1707.7165018577969
}, },
{
"type": "QPointF",
"x": 2655.778424569198,
"y": 1721.9946692493584
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 2655.953419573936, "x": 2655.953419573936,
@ -257,13 +267,13 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2021.3199675389635, "x": 2023.4768582688548,
"y": 3220.8483027084308 "y": 3220.8687790842673
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2021.3182640632187, "x": 2022.9357135847897,
"y": 3107.4419653203568 "y": 3107.5035007672386
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -362,48 +372,48 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1724.2475956555309, "x": 1724.6533610418696,
"y": 2811.4515698895543 "y": 2813.078323048724
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1714.9017110090306, "x": 1715.189696588166,
"y": 2769.975506859066 "y": 2771.371775287776
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1706.6975180190836, "x": 1706.90061213171,
"y": 2725.918102308894 "y": 2727.1118324092063
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1699.5401219581372, "x": 1699.6823471470193,
"y": 2679.257112978941 "y": 2680.274370032681
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1693.3412326417047, "x": 1693.4400069065402,
"y": 2629.9730649700537 "y": 2630.837144898105
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1688.0173984057383, "x": 1688.0853012257862,
"y": 2578.0494603041498 "y": 2578.780683106325
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1683.4825898547426, "x": 1683.5347784407104,
"y": 2523.3794867938254 "y": 2524.0884866792558
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1677.9341442539435, "x": 1677.9790695997801,
"y": 2436.7502859774568 "y": 2437.600157065191
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1672.7372856065697, "x": 1672.758306811766,
"y": 2311.629084053139 "y": 2312.2626524214393
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -415,6 +425,11 @@
"x": 1667.2635813707664, "x": 1667.2635813707664,
"y": 2029.2750164437336 "y": 2029.2750164437336
}, },
{
"type": "QPointF",
"x": 1665.2248719406762,
"y": 1790.2021664103715
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 1663.7116397669358, "x": 1663.7116397669358,

View File

@ -2,569 +2,675 @@
"vector": [ "vector": [
{ {
"angle": 4, "angle": 4,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3069.6740125566685 "y": 3069.6740125566685
}, },
{ {
"angle": 4, "angle": 4,
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3069.6740125566685 "y": 3069.6740125566685
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2014.9729320292, "x": 2014.9729320292,
"y": 3069.6130267291883 "y": 3069.6130267291883
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1999.838557691558, "x": 1999.838557691558,
"y": 3068.8816935485092 "y": 3068.8816935485092
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1985.2122453725951, "x": 1985.2122453725951,
"y": 3067.420020685311 "y": 3067.420020685311
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1971.0851302475294, "x": 1971.0851302475294,
"y": 3065.229001637756 "y": 3065.229001637756
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1957.4483474915787, "x": 1957.4483474915787,
"y": 3062.309629904003 "y": 3062.309629904003
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1944.293032279962, "x": 1944.293032279962,
"y": 3058.6628989822143 "y": 3058.6628989822143
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1931.6103197878972, "x": 1931.6103197878972,
"y": 3054.289802370551 "y": 3054.289802370551
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1919.3913451906024, "x": 1919.3913451906024,
"y": 3049.191333567172 "y": 3049.191333567172
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1907.6272436632962, "x": 1907.6272436632962,
"y": 3043.368486070239 "y": 3043.368486070239
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1896.3091503811966, "x": 1896.3091503811966,
"y": 3036.8222533779135 "y": 3036.8222533779135
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1885.4282005195219, "x": 1885.4282005195219,
"y": 3029.5536289883566 "y": 3029.5536289883566
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1874.9755292534905, "x": 1874.9755292534905,
"y": 3021.563606399727 "y": 3021.563606399727
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1864.9422717583204, "x": 1864.9422717583204,
"y": 3012.8531791101877 "y": 3012.8531791101877
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1855.3195632092302, "x": 1855.3195632092302,
"y": 3003.4233406178982 "y": 3003.4233406178982
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1846.098538781438, "x": 1846.098538781438,
"y": 2993.2750844210195 "y": 2993.2750844210195
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1837.2703336501618, "x": 1837.2703336501618,
"y": 2982.4094040177133 "y": 2982.4094040177133
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1824.6988381756855, "x": 1824.6988381756855,
"y": 2964.8572538605545 "y": 2964.8572538605545
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1809.2929657948505, "x": 1809.2929657948505,
"y": 2938.833269793301 "y": 2938.833269793301
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1795.2988037540088, "x": 1795.2988037540088,
"y": 2909.9574718672293 "y": 2909.9574718672293
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1782.645433454907, "x": 1782.645433454907,
"y": 2878.237808067624 "y": 2878.237808067624
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1771.2619362992912, "x": 1771.2619362992912,
"y": 2843.682226379773 "y": 2843.682226379773
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1761.0773936889077, "x": 1761.0773936889077,
"y": 2806.2986747889627 "y": 2806.2986747889627
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1752.020887025502, "x": 1752.020887025502,
"y": 2766.095101280478 "y": 2766.095101280478
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1744.0214977108208, "x": 1744.0214977108208,
"y": 2723.0794538396067 "y": 2723.0794538396067
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1737.00830714661, "x": 1737.00830714661,
"y": 2677.259680451635 "y": 2677.259680451635
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1730.9103967346155, "x": 1730.9103967346155,
"y": 2628.6437291018483 "y": 2628.6437291018483
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1725.656847876584, "x": 1725.656847876584,
"y": 2577.2395477755335 "y": 2577.2395477755335
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1721.1767419742605, "x": 1721.1767419742605,
"y": 2523.055084457977 "y": 2523.055084457977
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1715.6771359215397, "x": 1715.6771359215397,
"y": 2436.927798469381 "y": 2436.927798469381
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1710.5065586720987, "x": 1710.5065586720987,
"y": 2311.972555710253 "y": 2311.972555710253
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1707.153218476922, "x": 1707.153218476922,
"y": 2176.039248721311 "y": 2176.039248721311
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1705.0497665499784, "x": 1705.0497665499784,
"y": 2029.1914613848467 "y": 2029.1914613848467
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1703.0181141551627, "x": 1703.0181141551627,
"y": 1789.9386595512806 "y": 1789.9386595512806
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1701.5055118110236, "x": 1701.5055118110236,
"y": 1614.2929133858268 "y": 1614.2929133858268
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1701.5055118110236, "x": 1701.5055118110236,
"y": 1614.2929133858268 "y": 1614.2929133858268
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1676.804606592377, "x": 1676.804606592377,
"y": 376.4976377952755 "y": 376.4976377952755
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1790.1904333640305, "x": 1790.1904333640305,
"y": 376.4976377952755 "y": 376.4976377952755
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2132.831278036873, "x": 2132.831278036873,
"y": 334.01963822471856 "y": 334.01963822471856
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2170.166929133858, "x": 2170.166929133858,
"y": 187.5212598425196 "y": 187.5212598425196
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2170.166929133858, "x": 2170.166929133858,
"y": 187.5212598425196 "y": 187.5212598425196
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2209.0824577516487, "x": 2209.0824577516487,
"y": 196.52029498815347 "y": 196.52029498815347
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2280.0788311549086, "x": 2280.0788311549086,
"y": 214.46913581675784 "y": 214.46913581675784
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2345.053938897079, "x": 2345.053938897079,
"y": 232.82808880019167 "y": 232.82808880019167
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2406.430397575602, "x": 2406.430397575602,
"y": 252.1184733940386 "y": 252.1184733940386
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2466.630823787921, "x": 2466.630823787921,
"y": 272.8616090538824 "y": 272.8616090538824
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2528.077834131477, "x": 2528.077834131477,
"y": 295.5788152353067 "y": 295.5788152353067
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2626.972277996681, "x": 2626.972277996681,
"y": 334.08672189942854 "y": 334.08672189942854
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2683.174281565618, "x": 2683.174281565618,
"y": 428.6163050991843 "y": 428.6163050991843
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2636.9155845119085, "x": 2636.9155845119085,
"y": 570.0364148944475 "y": 570.0364148944475
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2602.3359035137023, "x": 2602.3359035137023,
"y": 679.2016045836615 "y": 679.2016045836615
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2581.1485889486808, "x": 2581.1485889486808,
"y": 750.3046656507598 "y": 750.3046656507598
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2562.658903353014, "x": 2562.658903353014,
"y": 818.1666036205969 "y": 818.1666036205969
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2551.3190086136897, "x": 2551.3190086136897,
"y": 865.7283064025331 "y": 865.7283064025331
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2545.058458315721, "x": 2545.058458315721,
"y": 895.6477493986852 "y": 895.6477493986852
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2542.4441145955184, "x": 2542.4441145955184,
"y": 909.8834645669292 "y": 909.8834645669292
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2539.941891688312, "x": 2539.941891688312,
"y": 924.5359428210015 "y": 924.5359428210015
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2537.2824566009085, "x": 2537.2824566009085,
"y": 946.6345652094251 "y": 946.6345652094251
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2536.3671357993244, "x": 2536.3671357993244,
"y": 961.2177429989904 "y": 961.2177429989904
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2536.3893819364166, "x": 2536.3893819364166,
"y": 975.5256347551833 "y": 975.5256347551833
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2537.538148749601, "x": 2537.538148749601,
"y": 989.4206965556962 "y": 989.4206965556962
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2540.002389976296, "x": 2540.002389976296,
"y": 1002.7653844782211 "y": 1002.7653844782211
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2543.971059353917, "x": 2543.971059353917,
"y": 1015.422154600451 "y": 1015.422154600451
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2549.633110619882, "x": 2549.633110619882,
"y": 1027.253463000078 "y": 1027.253463000078
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2557.177497511606, "x": 2557.177497511606,
"y": 1038.121765754795 "y": 1038.121765754795
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2566.7931737665076, "x": 2566.7931737665076,
"y": 1047.8895189422938 "y": 1047.8895189422938
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2578.669093122002, "x": 2578.669093122002,
"y": 1056.419178640267 "y": 1056.419178640267
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2592.9942093155073, "x": 2592.9942093155073,
"y": 1063.5732009264073 "y": 1063.5732009264073
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2609.9574760844393, "x": 2609.9574760844393,
"y": 1069.214041878407 "y": 1069.214041878407
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2629.747847166216, "x": 2629.747847166216,
"y": 1073.204157573959 "y": 1073.204157573959
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2652.554276298253, "x": 2652.554276298253,
"y": 1075.406004090755 "y": 1075.406004090755
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2656.455947900562, "x": 2656.455947900562,
"y": 1149.9520876303336 "y": 1149.9520876303336
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2642.4743193451973, "x": 2642.4743193451973,
"y": 1283.9248328571011 "y": 1283.9248328571011
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2632.348846491074, "x": 2632.348846491074,
"y": 1400.3953842544354 "y": 1400.3953842544354
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2625.462074272455, "x": 2625.462074272455,
"y": 1499.2648032469053 "y": 1499.2648032469053
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2621.1965476236046, "x": 2621.1965476236046,
"y": 1580.4341512590793 "y": 1580.4341512590793
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2618.9348114787863, "x": 2618.9348114787863,
"y": 1643.804489715526 "y": 1643.804489715526
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2617.8911123953603, "x": 2617.8911123953603,
"y": 1707.5262208487393 "y": 1707.5262208487393
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2617.9884514435694, "x": 2617.9884514435694,
"y": 1722.9543307086615 "y": 1722.9543307086615
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2618.243518754759, "x": 2618.243518754759,
"y": 1728.6863715569775 "y": 1728.6863715569775
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2620.9069750474355, "x": 2620.9069750474355,
"y": 1754.8103451532859 "y": 1754.8103451532859
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2628.7361755238107, "x": 2628.7361755238107,
"y": 1818.230094084754 "y": 1818.230094084754
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2644.9536288641093, "x": 2644.9536288641093,
"y": 1932.092426039521 "y": 1932.092426039521
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2659.427198191514, "x": 2659.427198191514,
"y": 2020.1956325333963 "y": 2020.1956325333963
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2669.339056867133, "x": 2669.339056867133,
"y": 2073.2470143796036 "y": 2073.2470143796036
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2674.225047922979, "x": 2674.225047922979,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2674.225047922979, "x": 2674.225047922979,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 3075.2356380110023 "y": 3075.2356380110023
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 3188.621464782656 "y": 3188.621464782656
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3183.059839328322 "y": 3183.059839328322

View File

@ -7,8 +7,13 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2013.1486925189367, "x": 2022.7551360150967,
"y": 3107.3642519699065 "y": 3107.470448669474
},
{
"type": "QPointF",
"x": 2014.6767556005577,
"y": 3107.407141833111
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -22,8 +27,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1964.1685608395817, "x": 1964.2273050875103,
"y": 3102.6667943667003 "y": 3102.4125360082517
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -72,8 +77,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1827.775230874743, "x": 1828.6586787634583,
"y": 3029.062323188764 "y": 3029.9799215151306
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -112,48 +117,48 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1724.2060573521064, "x": 1724.611163823378,
"y": 2814.604541011345 "y": 2816.233307965892
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1714.8626689124646, "x": 1715.1495506887006,
"y": 2773.005215869235 "y": 2774.4009675028606
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1706.6613158714413, "x": 1706.8632795977835,
"y": 2728.7978163582184 "y": 2729.989568428364
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1699.5068804939508, "x": 1699.6481253072302,
"y": 2681.9634933710727 "y": 2682.978042970247
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1693.3109741320875, "x": 1693.4089700819563,
"y": 2632.486420466245 "y": 2633.347542021286
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1687.9901053084427, "x": 1688.057425274056,
"y": 2580.353927532551 "y": 2581.08223913993
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1683.4582844809274, "x": 1683.5099994061193,
"y": 2525.463573878589 "y": 2526.1694642149946
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1677.9141764602605, "x": 1677.9586784282067,
"y": 2438.490408366745 "y": 2439.336287889993
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1672.7227781832871, "x": 1672.7435992108194,
"y": 2312.9046441927917 "y": 2313.5351656076173
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -165,6 +170,11 @@
"x": 1667.2583677386065, "x": 1667.2583677386065,
"y": 2029.732786467735 "y": 2029.732786467735
}, },
{
"type": "QPointF",
"x": 1665.224201165844,
"y": 1790.259592444213
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 1663.7116376060108, "x": 1663.7116376060108,
@ -192,33 +202,33 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2218.3461551694068, "x": 2217.5977299326023,
"y": 159.8778773943609 "y": 159.69675636609975
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2290.3556666474014, "x": 2289.3425285726667,
"y": 178.09786268498775 "y": 177.82671822296527
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2356.386310160867, "x": 2355.330774389572,
"y": 196.77174097480187 "y": 196.45681566842157
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2418.743012243872, "x": 2417.76276883939,
"y": 216.38498242273093 "y": 216.0621255686488
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2479.7368903013507, "x": 2478.943438456191,
"y": 237.4114485815882 "y": 237.12811808257362
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2541.791733714628, "x": 2541.1839006449068,
"y": 260.35933461464947 "y": 260.1286547630125
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -265,6 +275,11 @@
"x": 2582.147933534884, "x": 2582.147933534884,
"y": 902.9327107340721 "y": 902.9327107340721
}, },
{
"type": "QPointF",
"x": 2579.6177268527103,
"y": 916.710279982473
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 2577.3549162322406, "x": 2577.3549162322406,
@ -347,8 +362,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2694.0188568415797, "x": 2693.986760463563,
"y": 1154.1454872438824 "y": 1154.4153784932541
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -380,6 +395,11 @@
"x": 2655.688340739313, "x": 2655.688340739313,
"y": 1707.7165018577969 "y": 1707.7165018577969
}, },
{
"type": "QPointF",
"x": 2655.778424569198,
"y": 1721.9946692493584
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 2655.953419573936, "x": 2655.953419573936,

View File

@ -2,569 +2,675 @@
"vector": [ "vector": [
{ {
"angle": 2, "angle": 2,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3069.6740125566685 "y": 3069.6740125566685
}, },
{ {
"angle": 2, "angle": 2,
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3069.6740125566685 "y": 3069.6740125566685
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2014.9729320292, "x": 2014.9729320292,
"y": 3069.6130267291883 "y": 3069.6130267291883
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1999.838557691558, "x": 1999.838557691558,
"y": 3068.8816935485092 "y": 3068.8816935485092
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1985.2122453725951, "x": 1985.2122453725951,
"y": 3067.420020685311 "y": 3067.420020685311
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1971.0851302475294, "x": 1971.0851302475294,
"y": 3065.229001637756 "y": 3065.229001637756
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1957.4483474915787, "x": 1957.4483474915787,
"y": 3062.309629904003 "y": 3062.309629904003
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1944.293032279962, "x": 1944.293032279962,
"y": 3058.6628989822143 "y": 3058.6628989822143
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1931.6103197878972, "x": 1931.6103197878972,
"y": 3054.289802370551 "y": 3054.289802370551
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1919.3913451906024, "x": 1919.3913451906024,
"y": 3049.191333567172 "y": 3049.191333567172
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1907.6272436632962, "x": 1907.6272436632962,
"y": 3043.368486070239 "y": 3043.368486070239
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1896.3091503811966, "x": 1896.3091503811966,
"y": 3036.8222533779135 "y": 3036.8222533779135
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1885.4282005195219, "x": 1885.4282005195219,
"y": 3029.5536289883566 "y": 3029.5536289883566
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1874.9755292534905, "x": 1874.9755292534905,
"y": 3021.563606399727 "y": 3021.563606399727
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1864.9422717583204, "x": 1864.9422717583204,
"y": 3012.8531791101877 "y": 3012.8531791101877
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1855.3195632092302, "x": 1855.3195632092302,
"y": 3003.4233406178982 "y": 3003.4233406178982
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1846.098538781438, "x": 1846.098538781438,
"y": 2993.2750844210195 "y": 2993.2750844210195
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1837.2703336501618, "x": 1837.2703336501618,
"y": 2982.4094040177133 "y": 2982.4094040177133
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1824.6988381756855, "x": 1824.6988381756855,
"y": 2964.8572538605545 "y": 2964.8572538605545
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1809.2929657948505, "x": 1809.2929657948505,
"y": 2938.833269793301 "y": 2938.833269793301
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1795.2988037540088, "x": 1795.2988037540088,
"y": 2909.9574718672293 "y": 2909.9574718672293
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1782.645433454907, "x": 1782.645433454907,
"y": 2878.237808067624 "y": 2878.237808067624
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1771.2619362992912, "x": 1771.2619362992912,
"y": 2843.682226379773 "y": 2843.682226379773
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1761.0773936889077, "x": 1761.0773936889077,
"y": 2806.2986747889627 "y": 2806.2986747889627
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1752.020887025502, "x": 1752.020887025502,
"y": 2766.095101280478 "y": 2766.095101280478
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1744.0214977108208, "x": 1744.0214977108208,
"y": 2723.0794538396067 "y": 2723.0794538396067
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1737.00830714661, "x": 1737.00830714661,
"y": 2677.259680451635 "y": 2677.259680451635
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1730.9103967346155, "x": 1730.9103967346155,
"y": 2628.6437291018483 "y": 2628.6437291018483
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1725.656847876584, "x": 1725.656847876584,
"y": 2577.2395477755335 "y": 2577.2395477755335
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1721.1767419742605, "x": 1721.1767419742605,
"y": 2523.055084457977 "y": 2523.055084457977
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1715.6771359215397, "x": 1715.6771359215397,
"y": 2436.927798469381 "y": 2436.927798469381
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1710.5065586720987, "x": 1710.5065586720987,
"y": 2311.972555710253 "y": 2311.972555710253
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1707.153218476922, "x": 1707.153218476922,
"y": 2176.039248721311 "y": 2176.039248721311
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1705.0497665499784, "x": 1705.0497665499784,
"y": 2029.1914613848467 "y": 2029.1914613848467
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1703.0181141551627, "x": 1703.0181141551627,
"y": 1789.9386595512806 "y": 1789.9386595512806
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1701.5055118110236, "x": 1701.5055118110236,
"y": 1614.2929133858268 "y": 1614.2929133858268
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1701.5055118110236, "x": 1701.5055118110236,
"y": 1614.2929133858268 "y": 1614.2929133858268
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1676.804606592377, "x": 1676.804606592377,
"y": 376.4976377952755 "y": 376.4976377952755
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1790.1904333640305, "x": 1790.1904333640305,
"y": 376.4976377952755 "y": 376.4976377952755
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2132.831278036873, "x": 2132.831278036873,
"y": 334.01963822471856 "y": 334.01963822471856
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2170.166929133858, "x": 2170.166929133858,
"y": 187.5212598425196 "y": 187.5212598425196
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2170.166929133858, "x": 2170.166929133858,
"y": 187.5212598425196 "y": 187.5212598425196
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2209.0824577516487, "x": 2209.0824577516487,
"y": 196.52029498815347 "y": 196.52029498815347
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2280.0788311549086, "x": 2280.0788311549086,
"y": 214.46913581675784 "y": 214.46913581675784
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2345.053938897079, "x": 2345.053938897079,
"y": 232.82808880019167 "y": 232.82808880019167
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2406.430397575602, "x": 2406.430397575602,
"y": 252.1184733940386 "y": 252.1184733940386
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2466.630823787921, "x": 2466.630823787921,
"y": 272.8616090538824 "y": 272.8616090538824
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2528.077834131477, "x": 2528.077834131477,
"y": 295.5788152353067 "y": 295.5788152353067
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2626.972277996681, "x": 2626.972277996681,
"y": 334.08672189942854 "y": 334.08672189942854
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2683.174281565618, "x": 2683.174281565618,
"y": 428.6163050991843 "y": 428.6163050991843
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2636.9155845119085, "x": 2636.9155845119085,
"y": 570.0364148944475 "y": 570.0364148944475
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2602.3359035137023, "x": 2602.3359035137023,
"y": 679.2016045836615 "y": 679.2016045836615
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2581.1485889486808, "x": 2581.1485889486808,
"y": 750.3046656507598 "y": 750.3046656507598
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2562.658903353014, "x": 2562.658903353014,
"y": 818.1666036205969 "y": 818.1666036205969
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2551.3190086136897, "x": 2551.3190086136897,
"y": 865.7283064025331 "y": 865.7283064025331
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2545.058458315721, "x": 2545.058458315721,
"y": 895.6477493986852 "y": 895.6477493986852
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2542.4441145955184, "x": 2542.4441145955184,
"y": 909.8834645669292 "y": 909.8834645669292
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2539.941891688312, "x": 2539.941891688312,
"y": 924.5359428210015 "y": 924.5359428210015
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2537.2824566009085, "x": 2537.2824566009085,
"y": 946.6345652094251 "y": 946.6345652094251
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2536.3671357993244, "x": 2536.3671357993244,
"y": 961.2177429989904 "y": 961.2177429989904
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2536.3893819364166, "x": 2536.3893819364166,
"y": 975.5256347551833 "y": 975.5256347551833
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2537.538148749601, "x": 2537.538148749601,
"y": 989.4206965556962 "y": 989.4206965556962
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2540.002389976296, "x": 2540.002389976296,
"y": 1002.7653844782211 "y": 1002.7653844782211
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2543.971059353917, "x": 2543.971059353917,
"y": 1015.422154600451 "y": 1015.422154600451
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2549.633110619882, "x": 2549.633110619882,
"y": 1027.253463000078 "y": 1027.253463000078
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2557.177497511606, "x": 2557.177497511606,
"y": 1038.121765754795 "y": 1038.121765754795
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2566.7931737665076, "x": 2566.7931737665076,
"y": 1047.8895189422938 "y": 1047.8895189422938
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2578.669093122002, "x": 2578.669093122002,
"y": 1056.419178640267 "y": 1056.419178640267
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2592.9942093155073, "x": 2592.9942093155073,
"y": 1063.5732009264073 "y": 1063.5732009264073
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2609.9574760844393, "x": 2609.9574760844393,
"y": 1069.214041878407 "y": 1069.214041878407
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2629.747847166216, "x": 2629.747847166216,
"y": 1073.204157573959 "y": 1073.204157573959
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2652.554276298253, "x": 2652.554276298253,
"y": 1075.406004090755 "y": 1075.406004090755
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2656.455947900562, "x": 2656.455947900562,
"y": 1149.9520876303336 "y": 1149.9520876303336
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2642.4743193451973, "x": 2642.4743193451973,
"y": 1283.9248328571011 "y": 1283.9248328571011
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2632.348846491074, "x": 2632.348846491074,
"y": 1400.3953842544354 "y": 1400.3953842544354
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2625.462074272455, "x": 2625.462074272455,
"y": 1499.2648032469053 "y": 1499.2648032469053
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2621.1965476236046, "x": 2621.1965476236046,
"y": 1580.4341512590793 "y": 1580.4341512590793
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2618.9348114787863, "x": 2618.9348114787863,
"y": 1643.804489715526 "y": 1643.804489715526
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2617.8911123953603, "x": 2617.8911123953603,
"y": 1707.5262208487393 "y": 1707.5262208487393
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2617.9884514435694, "x": 2617.9884514435694,
"y": 1722.9543307086615 "y": 1722.9543307086615
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2618.243518754759, "x": 2618.243518754759,
"y": 1728.6863715569775 "y": 1728.6863715569775
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2620.9069750474355, "x": 2620.9069750474355,
"y": 1754.8103451532859 "y": 1754.8103451532859
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2628.7361755238107, "x": 2628.7361755238107,
"y": 1818.230094084754 "y": 1818.230094084754
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2644.9536288641093, "x": 2644.9536288641093,
"y": 1932.092426039521 "y": 1932.092426039521
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2659.427198191514, "x": 2659.427198191514,
"y": 2020.1956325333963 "y": 2020.1956325333963
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2669.339056867133, "x": 2669.339056867133,
"y": 2073.2470143796036 "y": 2073.2470143796036
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2674.225047922979, "x": 2674.225047922979,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2674.225047922979, "x": 2674.225047922979,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 3075.2356380110023 "y": 3075.2356380110023
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 3188.621464782656 "y": 3188.621464782656
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3183.059839328322 "y": 3183.059839328322

View File

@ -1,5 +1,15 @@
{ {
"vector": [ "vector": [
{
"type": "QPointF",
"x": 1984.9598604245455,
"y": 3108.349696217459
},
{
"type": "QPointF",
"x": 1984.9598604245455,
"y": 3107.1742631465927
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 1984.9598604245455, "x": 1984.9598604245455,
@ -7,8 +17,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1980.460653502646, "x": 1980.4332947144517,
"y": 3104.734721364734 "y": 3104.9259742893705
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -62,8 +72,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1827.775230874743, "x": 1828.6586787634583,
"y": 3029.062323188764 "y": 3029.9799215151306
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -102,48 +112,48 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1724.2060573521064, "x": 1724.611163823378,
"y": 2814.604541011345 "y": 2816.233307965892
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1714.8626689124646, "x": 1715.1495506887006,
"y": 2773.005215869235 "y": 2774.4009675028606
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1706.6613158714413, "x": 1706.8632795977835,
"y": 2728.7978163582184 "y": 2729.989568428364
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1699.5068804939508, "x": 1699.6481253072302,
"y": 2681.9634933710727 "y": 2682.978042970247
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1693.3109741320875, "x": 1693.4089700819563,
"y": 2632.486420466245 "y": 2633.347542021286
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1687.9901053084427, "x": 1688.057425274056,
"y": 2580.353927532551 "y": 2581.08223913993
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1683.4582844809274, "x": 1683.5099994061193,
"y": 2525.463573878589 "y": 2526.1694642149946
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1677.9141764602605, "x": 1677.9586784282067,
"y": 2438.490408366745 "y": 2439.336287889993
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1672.7227781832871, "x": 1672.7435992108194,
"y": 2312.9046441927917 "y": 2313.5351656076173
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -155,6 +165,11 @@
"x": 1667.2583677386065, "x": 1667.2583677386065,
"y": 2029.732786467735 "y": 2029.732786467735
}, },
{
"type": "QPointF",
"x": 1665.224201165844,
"y": 1790.259592444213
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 1663.7116376060108, "x": 1663.7116376060108,
@ -182,33 +197,33 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2218.3461551694068, "x": 2217.5977299326023,
"y": 159.8778773943609 "y": 159.69675636609975
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2290.3556666474014, "x": 2289.3425285726667,
"y": 178.09786268498775 "y": 177.82671822296527
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2356.386310160867, "x": 2355.330774389572,
"y": 196.77174097480187 "y": 196.45681566842157
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2418.743012243872, "x": 2417.76276883939,
"y": 216.38498242273093 "y": 216.0621255686488
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2479.7368903013507, "x": 2478.943438456191,
"y": 237.4114485815882 "y": 237.12811808257362
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2541.791733714628, "x": 2541.1839006449068,
"y": 260.35933461464947 "y": 260.1286547630125
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -255,6 +270,11 @@
"x": 2582.147933534884, "x": 2582.147933534884,
"y": 902.9327107340721 "y": 902.9327107340721
}, },
{
"type": "QPointF",
"x": 2579.6177268527103,
"y": 916.710279982473
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 2577.3549162322406, "x": 2577.3549162322406,
@ -337,8 +357,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2694.0188568415797, "x": 2693.986760463563,
"y": 1154.1454872438824 "y": 1154.4153784932541
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -370,6 +390,11 @@
"x": 2655.688340739313, "x": 2655.688340739313,
"y": 1707.7165018577969 "y": 1707.7165018577969
}, },
{
"type": "QPointF",
"x": 2655.778424569198,
"y": 1721.9946692493584
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 2655.953419573936, "x": 2655.953419573936,
@ -423,7 +448,7 @@
{ {
"type": "QPointF", "type": "QPointF",
"x": 1984.9598604245455, "x": 1984.9598604245455,
"y": 3105.37833426348 "y": 3108.349696217459
} }
] ]
} }

View File

@ -2,569 +2,675 @@
"vector": [ "vector": [
{ {
"angle": 1, "angle": 1,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3069.6740125566685 "y": 3069.6740125566685
}, },
{ {
"angle": 1, "angle": 1,
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3069.6740125566685 "y": 3069.6740125566685
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2014.9729320292, "x": 2014.9729320292,
"y": 3069.6130267291883 "y": 3069.6130267291883
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1999.838557691558, "x": 1999.838557691558,
"y": 3068.8816935485092 "y": 3068.8816935485092
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1985.2122453725951, "x": 1985.2122453725951,
"y": 3067.420020685311 "y": 3067.420020685311
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1971.0851302475294, "x": 1971.0851302475294,
"y": 3065.229001637756 "y": 3065.229001637756
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1957.4483474915787, "x": 1957.4483474915787,
"y": 3062.309629904003 "y": 3062.309629904003
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1944.293032279962, "x": 1944.293032279962,
"y": 3058.6628989822143 "y": 3058.6628989822143
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1931.6103197878972, "x": 1931.6103197878972,
"y": 3054.289802370551 "y": 3054.289802370551
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1919.3913451906024, "x": 1919.3913451906024,
"y": 3049.191333567172 "y": 3049.191333567172
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1907.6272436632962, "x": 1907.6272436632962,
"y": 3043.368486070239 "y": 3043.368486070239
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1896.3091503811966, "x": 1896.3091503811966,
"y": 3036.8222533779135 "y": 3036.8222533779135
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1885.4282005195219, "x": 1885.4282005195219,
"y": 3029.5536289883566 "y": 3029.5536289883566
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1874.9755292534905, "x": 1874.9755292534905,
"y": 3021.563606399727 "y": 3021.563606399727
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1864.9422717583204, "x": 1864.9422717583204,
"y": 3012.8531791101877 "y": 3012.8531791101877
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1855.3195632092302, "x": 1855.3195632092302,
"y": 3003.4233406178982 "y": 3003.4233406178982
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1846.098538781438, "x": 1846.098538781438,
"y": 2993.2750844210195 "y": 2993.2750844210195
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1837.2703336501618, "x": 1837.2703336501618,
"y": 2982.4094040177133 "y": 2982.4094040177133
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1824.6988381756855, "x": 1824.6988381756855,
"y": 2964.8572538605545 "y": 2964.8572538605545
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1809.2929657948505, "x": 1809.2929657948505,
"y": 2938.833269793301 "y": 2938.833269793301
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1795.2988037540088, "x": 1795.2988037540088,
"y": 2909.9574718672293 "y": 2909.9574718672293
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1782.645433454907, "x": 1782.645433454907,
"y": 2878.237808067624 "y": 2878.237808067624
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1771.2619362992912, "x": 1771.2619362992912,
"y": 2843.682226379773 "y": 2843.682226379773
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1761.0773936889077, "x": 1761.0773936889077,
"y": 2806.2986747889627 "y": 2806.2986747889627
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1752.020887025502, "x": 1752.020887025502,
"y": 2766.095101280478 "y": 2766.095101280478
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1744.0214977108208, "x": 1744.0214977108208,
"y": 2723.0794538396067 "y": 2723.0794538396067
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1737.00830714661, "x": 1737.00830714661,
"y": 2677.259680451635 "y": 2677.259680451635
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1730.9103967346155, "x": 1730.9103967346155,
"y": 2628.6437291018483 "y": 2628.6437291018483
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1725.656847876584, "x": 1725.656847876584,
"y": 2577.2395477755335 "y": 2577.2395477755335
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1721.1767419742605, "x": 1721.1767419742605,
"y": 2523.055084457977 "y": 2523.055084457977
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1715.6771359215397, "x": 1715.6771359215397,
"y": 2436.927798469381 "y": 2436.927798469381
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1710.5065586720987, "x": 1710.5065586720987,
"y": 2311.972555710253 "y": 2311.972555710253
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1707.153218476922, "x": 1707.153218476922,
"y": 2176.039248721311 "y": 2176.039248721311
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1705.0497665499784, "x": 1705.0497665499784,
"y": 2029.1914613848467 "y": 2029.1914613848467
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1703.0181141551627, "x": 1703.0181141551627,
"y": 1789.9386595512806 "y": 1789.9386595512806
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1701.5055118110236, "x": 1701.5055118110236,
"y": 1614.2929133858268 "y": 1614.2929133858268
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1701.5055118110236, "x": 1701.5055118110236,
"y": 1614.2929133858268 "y": 1614.2929133858268
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1676.804606592377, "x": 1676.804606592377,
"y": 376.4976377952755 "y": 376.4976377952755
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1790.1904333640305, "x": 1790.1904333640305,
"y": 376.4976377952755 "y": 376.4976377952755
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2132.831278036873, "x": 2132.831278036873,
"y": 334.01963822471856 "y": 334.01963822471856
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2170.166929133858, "x": 2170.166929133858,
"y": 187.5212598425196 "y": 187.5212598425196
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2170.166929133858, "x": 2170.166929133858,
"y": 187.5212598425196 "y": 187.5212598425196
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2209.0824577516487, "x": 2209.0824577516487,
"y": 196.52029498815347 "y": 196.52029498815347
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2280.0788311549086, "x": 2280.0788311549086,
"y": 214.46913581675784 "y": 214.46913581675784
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2345.053938897079, "x": 2345.053938897079,
"y": 232.82808880019167 "y": 232.82808880019167
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2406.430397575602, "x": 2406.430397575602,
"y": 252.1184733940386 "y": 252.1184733940386
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2466.630823787921, "x": 2466.630823787921,
"y": 272.8616090538824 "y": 272.8616090538824
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2528.077834131477, "x": 2528.077834131477,
"y": 295.5788152353067 "y": 295.5788152353067
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2626.972277996681, "x": 2626.972277996681,
"y": 334.08672189942854 "y": 334.08672189942854
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2683.174281565618, "x": 2683.174281565618,
"y": 428.6163050991843 "y": 428.6163050991843
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2636.9155845119085, "x": 2636.9155845119085,
"y": 570.0364148944475 "y": 570.0364148944475
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2602.3359035137023, "x": 2602.3359035137023,
"y": 679.2016045836615 "y": 679.2016045836615
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2581.1485889486808, "x": 2581.1485889486808,
"y": 750.3046656507598 "y": 750.3046656507598
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2562.658903353014, "x": 2562.658903353014,
"y": 818.1666036205969 "y": 818.1666036205969
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2551.3190086136897, "x": 2551.3190086136897,
"y": 865.7283064025331 "y": 865.7283064025331
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2545.058458315721, "x": 2545.058458315721,
"y": 895.6477493986852 "y": 895.6477493986852
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2542.4441145955184, "x": 2542.4441145955184,
"y": 909.8834645669292 "y": 909.8834645669292
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2539.941891688312, "x": 2539.941891688312,
"y": 924.5359428210015 "y": 924.5359428210015
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2537.2824566009085, "x": 2537.2824566009085,
"y": 946.6345652094251 "y": 946.6345652094251
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2536.3671357993244, "x": 2536.3671357993244,
"y": 961.2177429989904 "y": 961.2177429989904
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2536.3893819364166, "x": 2536.3893819364166,
"y": 975.5256347551833 "y": 975.5256347551833
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2537.538148749601, "x": 2537.538148749601,
"y": 989.4206965556962 "y": 989.4206965556962
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2540.002389976296, "x": 2540.002389976296,
"y": 1002.7653844782211 "y": 1002.7653844782211
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2543.971059353917, "x": 2543.971059353917,
"y": 1015.422154600451 "y": 1015.422154600451
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2549.633110619882, "x": 2549.633110619882,
"y": 1027.253463000078 "y": 1027.253463000078
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2557.177497511606, "x": 2557.177497511606,
"y": 1038.121765754795 "y": 1038.121765754795
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2566.7931737665076, "x": 2566.7931737665076,
"y": 1047.8895189422938 "y": 1047.8895189422938
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2578.669093122002, "x": 2578.669093122002,
"y": 1056.419178640267 "y": 1056.419178640267
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2592.9942093155073, "x": 2592.9942093155073,
"y": 1063.5732009264073 "y": 1063.5732009264073
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2609.9574760844393, "x": 2609.9574760844393,
"y": 1069.214041878407 "y": 1069.214041878407
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2629.747847166216, "x": 2629.747847166216,
"y": 1073.204157573959 "y": 1073.204157573959
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2652.554276298253, "x": 2652.554276298253,
"y": 1075.406004090755 "y": 1075.406004090755
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2656.455947900562, "x": 2656.455947900562,
"y": 1149.9520876303336 "y": 1149.9520876303336
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2642.4743193451973, "x": 2642.4743193451973,
"y": 1283.9248328571011 "y": 1283.9248328571011
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2632.348846491074, "x": 2632.348846491074,
"y": 1400.3953842544354 "y": 1400.3953842544354
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2625.462074272455, "x": 2625.462074272455,
"y": 1499.2648032469053 "y": 1499.2648032469053
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2621.1965476236046, "x": 2621.1965476236046,
"y": 1580.4341512590793 "y": 1580.4341512590793
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2618.9348114787863, "x": 2618.9348114787863,
"y": 1643.804489715526 "y": 1643.804489715526
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2617.8911123953603, "x": 2617.8911123953603,
"y": 1707.5262208487393 "y": 1707.5262208487393
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2617.9884514435694, "x": 2617.9884514435694,
"y": 1722.9543307086615 "y": 1722.9543307086615
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2618.243518754759, "x": 2618.243518754759,
"y": 1728.6863715569775 "y": 1728.6863715569775
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2620.9069750474355, "x": 2620.9069750474355,
"y": 1754.8103451532859 "y": 1754.8103451532859
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2628.7361755238107, "x": 2628.7361755238107,
"y": 1818.230094084754 "y": 1818.230094084754
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2644.9536288641093, "x": 2644.9536288641093,
"y": 1932.092426039521 "y": 1932.092426039521
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2659.427198191514, "x": 2659.427198191514,
"y": 2020.1956325333963 "y": 2020.1956325333963
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2669.339056867133, "x": 2669.339056867133,
"y": 2073.2470143796036 "y": 2073.2470143796036
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2674.225047922979, "x": 2674.225047922979,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2674.225047922979, "x": 2674.225047922979,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 3075.2356380110023 "y": 3075.2356380110023
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 3188.621464782656 "y": 3188.621464782656
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3183.059839328322 "y": 3183.059839328322

View File

@ -1,5 +1,15 @@
{ {
"vector": [ "vector": [
{
"type": "QPointF",
"x": 1984.9598604245455,
"y": 3108.349696217459
},
{
"type": "QPointF",
"x": 1984.9598604245455,
"y": 3107.1742631465927
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 1984.9598604245455, "x": 1984.9598604245455,
@ -7,8 +17,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1980.460653502646, "x": 1980.4332947144517,
"y": 3104.734721364734 "y": 3104.9259742893705
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -62,8 +72,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1827.775230874743, "x": 1828.6586787634583,
"y": 3029.062323188764 "y": 3029.9799215151306
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -102,48 +112,48 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1724.2060573521064, "x": 1724.611163823378,
"y": 2814.604541011345 "y": 2816.233307965892
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1714.8626689124646, "x": 1715.1495506887006,
"y": 2773.005215869235 "y": 2774.4009675028606
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1706.6613158714413, "x": 1706.8632795977835,
"y": 2728.7978163582184 "y": 2729.989568428364
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1699.5068804939508, "x": 1699.6481253072302,
"y": 2681.9634933710727 "y": 2682.978042970247
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1693.3109741320875, "x": 1693.4089700819563,
"y": 2632.486420466245 "y": 2633.347542021286
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1687.9901053084427, "x": 1688.057425274056,
"y": 2580.353927532551 "y": 2581.08223913993
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1683.4582844809274, "x": 1683.5099994061193,
"y": 2525.463573878589 "y": 2526.1694642149946
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1677.9141764602605, "x": 1677.9586784282067,
"y": 2438.490408366745 "y": 2439.336287889993
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1672.7227781832871, "x": 1672.7435992108194,
"y": 2312.9046441927917 "y": 2313.5351656076173
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -155,6 +165,11 @@
"x": 1667.2583677386065, "x": 1667.2583677386065,
"y": 2029.732786467735 "y": 2029.732786467735
}, },
{
"type": "QPointF",
"x": 1665.224201165844,
"y": 1790.259592444213
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 1663.7116376060108, "x": 1663.7116376060108,
@ -182,33 +197,33 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2218.3461551694068, "x": 2217.5977299326023,
"y": 159.8778773943609 "y": 159.69675636609975
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2290.3556666474014, "x": 2289.3425285726667,
"y": 178.09786268498775 "y": 177.82671822296527
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2356.386310160867, "x": 2355.330774389572,
"y": 196.77174097480187 "y": 196.45681566842157
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2418.743012243872, "x": 2417.76276883939,
"y": 216.38498242273093 "y": 216.0621255686488
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2479.7368903013507, "x": 2478.943438456191,
"y": 237.4114485815882 "y": 237.12811808257362
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2541.791733714628, "x": 2541.1839006449068,
"y": 260.35933461464947 "y": 260.1286547630125
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -255,6 +270,11 @@
"x": 2582.147933534884, "x": 2582.147933534884,
"y": 902.9327107340721 "y": 902.9327107340721
}, },
{
"type": "QPointF",
"x": 2579.6177268527103,
"y": 916.710279982473
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 2577.3549162322406, "x": 2577.3549162322406,
@ -337,8 +357,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2694.0188568415797, "x": 2693.986760463563,
"y": 1154.1454872438824 "y": 1154.4153784932541
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -370,6 +390,11 @@
"x": 2655.688340739313, "x": 2655.688340739313,
"y": 1707.7165018577969 "y": 1707.7165018577969
}, },
{
"type": "QPointF",
"x": 2655.778424569198,
"y": 1721.9946692493584
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 2655.953419573936, "x": 2655.953419573936,
@ -423,7 +448,7 @@
{ {
"type": "QPointF", "type": "QPointF",
"x": 1984.9598604245455, "x": 1984.9598604245455,
"y": 3105.37833426348 "y": 3108.349696217459
} }
] ]
} }

View File

@ -1,568 +1,674 @@
{ {
"vector": [ "vector": [
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3069.6740125566685 "y": 3069.6740125566685
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3069.6740125566685 "y": 3069.6740125566685
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2014.9729320292, "x": 2014.9729320292,
"y": 3069.6130267291883 "y": 3069.6130267291883
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1999.838557691558, "x": 1999.838557691558,
"y": 3068.8816935485092 "y": 3068.8816935485092
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1985.2122453725951, "x": 1985.2122453725951,
"y": 3067.420020685311 "y": 3067.420020685311
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1971.0851302475294, "x": 1971.0851302475294,
"y": 3065.229001637756 "y": 3065.229001637756
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1957.4483474915787, "x": 1957.4483474915787,
"y": 3062.309629904003 "y": 3062.309629904003
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1944.293032279962, "x": 1944.293032279962,
"y": 3058.6628989822143 "y": 3058.6628989822143
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1931.6103197878972, "x": 1931.6103197878972,
"y": 3054.289802370551 "y": 3054.289802370551
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1919.3913451906024, "x": 1919.3913451906024,
"y": 3049.191333567172 "y": 3049.191333567172
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1907.6272436632962, "x": 1907.6272436632962,
"y": 3043.368486070239 "y": 3043.368486070239
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1896.3091503811966, "x": 1896.3091503811966,
"y": 3036.8222533779135 "y": 3036.8222533779135
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1885.4282005195219, "x": 1885.4282005195219,
"y": 3029.5536289883566 "y": 3029.5536289883566
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1874.9755292534905, "x": 1874.9755292534905,
"y": 3021.563606399727 "y": 3021.563606399727
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1864.9422717583204, "x": 1864.9422717583204,
"y": 3012.8531791101877 "y": 3012.8531791101877
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1855.3195632092302, "x": 1855.3195632092302,
"y": 3003.4233406178982 "y": 3003.4233406178982
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1846.098538781438, "x": 1846.098538781438,
"y": 2993.2750844210195 "y": 2993.2750844210195
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1837.2703336501618, "x": 1837.2703336501618,
"y": 2982.4094040177133 "y": 2982.4094040177133
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1824.6988381756855, "x": 1824.6988381756855,
"y": 2964.8572538605545 "y": 2964.8572538605545
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1809.2929657948505, "x": 1809.2929657948505,
"y": 2938.833269793301 "y": 2938.833269793301
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1795.2988037540088, "x": 1795.2988037540088,
"y": 2909.9574718672293 "y": 2909.9574718672293
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1782.645433454907, "x": 1782.645433454907,
"y": 2878.237808067624 "y": 2878.237808067624
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1771.2619362992912, "x": 1771.2619362992912,
"y": 2843.682226379773 "y": 2843.682226379773
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1761.0773936889077, "x": 1761.0773936889077,
"y": 2806.2986747889627 "y": 2806.2986747889627
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1752.020887025502, "x": 1752.020887025502,
"y": 2766.095101280478 "y": 2766.095101280478
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1744.0214977108208, "x": 1744.0214977108208,
"y": 2723.0794538396067 "y": 2723.0794538396067
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1737.00830714661, "x": 1737.00830714661,
"y": 2677.259680451635 "y": 2677.259680451635
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1730.9103967346155, "x": 1730.9103967346155,
"y": 2628.6437291018483 "y": 2628.6437291018483
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1725.656847876584, "x": 1725.656847876584,
"y": 2577.2395477755335 "y": 2577.2395477755335
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1721.1767419742605, "x": 1721.1767419742605,
"y": 2523.055084457977 "y": 2523.055084457977
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1715.6771359215397, "x": 1715.6771359215397,
"y": 2436.927798469381 "y": 2436.927798469381
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1710.5065586720987, "x": 1710.5065586720987,
"y": 2311.972555710253 "y": 2311.972555710253
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1707.153218476922, "x": 1707.153218476922,
"y": 2176.039248721311 "y": 2176.039248721311
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1705.0497665499784, "x": 1705.0497665499784,
"y": 2029.1914613848467 "y": 2029.1914613848467
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1703.0181141551627, "x": 1703.0181141551627,
"y": 1789.9386595512806 "y": 1789.9386595512806
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1701.5055118110236, "x": 1701.5055118110236,
"y": 1614.2929133858268 "y": 1614.2929133858268
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1701.5055118110236, "x": 1701.5055118110236,
"y": 1614.2929133858268 "y": 1614.2929133858268
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1676.804606592377, "x": 1676.804606592377,
"y": 376.4976377952755 "y": 376.4976377952755
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1790.1904333640305, "x": 1790.1904333640305,
"y": 376.4976377952755 "y": 376.4976377952755
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2132.831278036873, "x": 2132.831278036873,
"y": 334.01963822471856 "y": 334.01963822471856
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2170.166929133858, "x": 2170.166929133858,
"y": 187.5212598425196 "y": 187.5212598425196
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2170.166929133858, "x": 2170.166929133858,
"y": 187.5212598425196 "y": 187.5212598425196
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2209.0824577516487, "x": 2209.0824577516487,
"y": 196.52029498815347 "y": 196.52029498815347
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2280.0788311549086, "x": 2280.0788311549086,
"y": 214.46913581675784 "y": 214.46913581675784
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2345.053938897079, "x": 2345.053938897079,
"y": 232.82808880019167 "y": 232.82808880019167
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2406.430397575602, "x": 2406.430397575602,
"y": 252.1184733940386 "y": 252.1184733940386
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2466.630823787921, "x": 2466.630823787921,
"y": 272.8616090538824 "y": 272.8616090538824
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2528.077834131477, "x": 2528.077834131477,
"y": 295.5788152353067 "y": 295.5788152353067
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2626.972277996681, "x": 2626.972277996681,
"y": 334.08672189942854 "y": 334.08672189942854
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2683.174281565618, "x": 2683.174281565618,
"y": 428.6163050991843 "y": 428.6163050991843
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2636.9155845119085, "x": 2636.9155845119085,
"y": 570.0364148944475 "y": 570.0364148944475
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2602.3359035137023, "x": 2602.3359035137023,
"y": 679.2016045836615 "y": 679.2016045836615
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2581.1485889486808, "x": 2581.1485889486808,
"y": 750.3046656507598 "y": 750.3046656507598
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2562.658903353014, "x": 2562.658903353014,
"y": 818.1666036205969 "y": 818.1666036205969
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2551.3190086136897, "x": 2551.3190086136897,
"y": 865.7283064025331 "y": 865.7283064025331
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2545.058458315721, "x": 2545.058458315721,
"y": 895.6477493986852 "y": 895.6477493986852
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2542.4441145955184, "x": 2542.4441145955184,
"y": 909.8834645669292 "y": 909.8834645669292
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2539.941891688312, "x": 2539.941891688312,
"y": 924.5359428210015 "y": 924.5359428210015
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2537.2824566009085, "x": 2537.2824566009085,
"y": 946.6345652094251 "y": 946.6345652094251
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2536.3671357993244, "x": 2536.3671357993244,
"y": 961.2177429989904 "y": 961.2177429989904
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2536.3893819364166, "x": 2536.3893819364166,
"y": 975.5256347551833 "y": 975.5256347551833
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2537.538148749601, "x": 2537.538148749601,
"y": 989.4206965556962 "y": 989.4206965556962
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2540.002389976296, "x": 2540.002389976296,
"y": 1002.7653844782211 "y": 1002.7653844782211
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2543.971059353917, "x": 2543.971059353917,
"y": 1015.422154600451 "y": 1015.422154600451
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2549.633110619882, "x": 2549.633110619882,
"y": 1027.253463000078 "y": 1027.253463000078
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2557.177497511606, "x": 2557.177497511606,
"y": 1038.121765754795 "y": 1038.121765754795
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2566.7931737665076, "x": 2566.7931737665076,
"y": 1047.8895189422938 "y": 1047.8895189422938
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2578.669093122002, "x": 2578.669093122002,
"y": 1056.419178640267 "y": 1056.419178640267
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2592.9942093155073, "x": 2592.9942093155073,
"y": 1063.5732009264073 "y": 1063.5732009264073
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2609.9574760844393, "x": 2609.9574760844393,
"y": 1069.214041878407 "y": 1069.214041878407
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2629.747847166216, "x": 2629.747847166216,
"y": 1073.204157573959 "y": 1073.204157573959
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2652.554276298253, "x": 2652.554276298253,
"y": 1075.406004090755 "y": 1075.406004090755
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2656.455947900562, "x": 2656.455947900562,
"y": 1149.9520876303336 "y": 1149.9520876303336
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2642.4743193451973, "x": 2642.4743193451973,
"y": 1283.9248328571011 "y": 1283.9248328571011
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2632.348846491074, "x": 2632.348846491074,
"y": 1400.3953842544354 "y": 1400.3953842544354
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2625.462074272455, "x": 2625.462074272455,
"y": 1499.2648032469053 "y": 1499.2648032469053
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2621.1965476236046, "x": 2621.1965476236046,
"y": 1580.4341512590793 "y": 1580.4341512590793
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2618.9348114787863, "x": 2618.9348114787863,
"y": 1643.804489715526 "y": 1643.804489715526
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2617.8911123953603, "x": 2617.8911123953603,
"y": 1707.5262208487393 "y": 1707.5262208487393
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2617.9884514435694, "x": 2617.9884514435694,
"y": 1722.9543307086615 "y": 1722.9543307086615
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2618.243518754759, "x": 2618.243518754759,
"y": 1728.6863715569775 "y": 1728.6863715569775
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2620.9069750474355, "x": 2620.9069750474355,
"y": 1754.8103451532859 "y": 1754.8103451532859
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2628.7361755238107, "x": 2628.7361755238107,
"y": 1818.230094084754 "y": 1818.230094084754
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2644.9536288641093, "x": 2644.9536288641093,
"y": 1932.092426039521 "y": 1932.092426039521
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2659.427198191514, "x": 2659.427198191514,
"y": 2020.1956325333963 "y": 2020.1956325333963
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2669.339056867133, "x": 2669.339056867133,
"y": 2073.2470143796036 "y": 2073.2470143796036
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2674.225047922979, "x": 2674.225047922979,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2674.225047922979, "x": 2674.225047922979,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 3075.2356380110023 "y": 3075.2356380110023
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 3188.621464782656 "y": 3188.621464782656
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3183.059839328322 "y": 3183.059839328322

View File

@ -1,5 +1,15 @@
{ {
"vector": [ "vector": [
{
"type": "QPointF",
"x": 1984.9598604245455,
"y": 3108.349696217459
},
{
"type": "QPointF",
"x": 1984.9598604245455,
"y": 3107.1742631465927
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 1984.9598604245455, "x": 1984.9598604245455,
@ -7,8 +17,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1980.460653502646, "x": 1980.4332947144517,
"y": 3104.734721364734 "y": 3104.9259742893705
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -62,8 +72,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1827.775230874743, "x": 1828.6586787634583,
"y": 3029.062323188764 "y": 3029.9799215151306
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -102,48 +112,48 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1724.2060573521064, "x": 1724.611163823378,
"y": 2814.604541011345 "y": 2816.233307965892
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1714.8626689124646, "x": 1715.1495506887006,
"y": 2773.005215869235 "y": 2774.4009675028606
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1706.6613158714413, "x": 1706.8632795977835,
"y": 2728.7978163582184 "y": 2729.989568428364
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1699.5068804939508, "x": 1699.6481253072302,
"y": 2681.9634933710727 "y": 2682.978042970247
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1693.3109741320875, "x": 1693.4089700819563,
"y": 2632.486420466245 "y": 2633.347542021286
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1687.9901053084427, "x": 1688.057425274056,
"y": 2580.353927532551 "y": 2581.08223913993
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1683.4582844809274, "x": 1683.5099994061193,
"y": 2525.463573878589 "y": 2526.1694642149946
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1677.9141764602605, "x": 1677.9586784282067,
"y": 2438.490408366745 "y": 2439.336287889993
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1672.7227781832871, "x": 1672.7435992108194,
"y": 2312.9046441927917 "y": 2313.5351656076173
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -155,6 +165,11 @@
"x": 1667.2583677386065, "x": 1667.2583677386065,
"y": 2029.732786467735 "y": 2029.732786467735
}, },
{
"type": "QPointF",
"x": 1665.224201165844,
"y": 1790.259592444213
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 1663.7116376060108, "x": 1663.7116376060108,
@ -182,33 +197,33 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2218.3461551694068, "x": 2217.5977299326023,
"y": 159.8778773943609 "y": 159.69675636609975
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2290.3556666474014, "x": 2289.3425285726667,
"y": 178.09786268498775 "y": 177.82671822296527
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2356.386310160867, "x": 2355.330774389572,
"y": 196.77174097480187 "y": 196.45681566842157
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2418.743012243872, "x": 2417.76276883939,
"y": 216.38498242273093 "y": 216.0621255686488
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2479.7368903013507, "x": 2478.943438456191,
"y": 237.4114485815882 "y": 237.12811808257362
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2541.791733714628, "x": 2541.1839006449068,
"y": 260.35933461464947 "y": 260.1286547630125
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -255,6 +270,11 @@
"x": 2582.147933534884, "x": 2582.147933534884,
"y": 902.9327107340721 "y": 902.9327107340721
}, },
{
"type": "QPointF",
"x": 2579.6177268527103,
"y": 916.710279982473
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 2577.3549162322406, "x": 2577.3549162322406,
@ -337,8 +357,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2694.0188568415797, "x": 2693.986760463563,
"y": 1154.1454872438824 "y": 1154.4153784932541
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -370,6 +390,11 @@
"x": 2655.688340739313, "x": 2655.688340739313,
"y": 1707.7165018577969 "y": 1707.7165018577969
}, },
{
"type": "QPointF",
"x": 2655.778424569198,
"y": 1721.9946692493584
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 2655.953419573936, "x": 2655.953419573936,
@ -423,7 +448,7 @@
{ {
"type": "QPointF", "type": "QPointF",
"x": 1984.9598604245455, "x": 1984.9598604245455,
"y": 3105.37833426348 "y": 3108.349696217459
} }
] ]
} }

View File

@ -2,569 +2,675 @@
"vector": [ "vector": [
{ {
"angle": 5, "angle": 5,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3069.6740125566685 "y": 3069.6740125566685
}, },
{ {
"angle": 5, "angle": 5,
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3069.6740125566685 "y": 3069.6740125566685
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2014.9729320292, "x": 2014.9729320292,
"y": 3069.6130267291883 "y": 3069.6130267291883
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1999.838557691558, "x": 1999.838557691558,
"y": 3068.8816935485092 "y": 3068.8816935485092
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1985.2122453725951, "x": 1985.2122453725951,
"y": 3067.420020685311 "y": 3067.420020685311
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1971.0851302475294, "x": 1971.0851302475294,
"y": 3065.229001637756 "y": 3065.229001637756
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1957.4483474915787, "x": 1957.4483474915787,
"y": 3062.309629904003 "y": 3062.309629904003
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1944.293032279962, "x": 1944.293032279962,
"y": 3058.6628989822143 "y": 3058.6628989822143
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1931.6103197878972, "x": 1931.6103197878972,
"y": 3054.289802370551 "y": 3054.289802370551
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1919.3913451906024, "x": 1919.3913451906024,
"y": 3049.191333567172 "y": 3049.191333567172
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1907.6272436632962, "x": 1907.6272436632962,
"y": 3043.368486070239 "y": 3043.368486070239
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1896.3091503811966, "x": 1896.3091503811966,
"y": 3036.8222533779135 "y": 3036.8222533779135
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1885.4282005195219, "x": 1885.4282005195219,
"y": 3029.5536289883566 "y": 3029.5536289883566
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1874.9755292534905, "x": 1874.9755292534905,
"y": 3021.563606399727 "y": 3021.563606399727
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1864.9422717583204, "x": 1864.9422717583204,
"y": 3012.8531791101877 "y": 3012.8531791101877
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1855.3195632092302, "x": 1855.3195632092302,
"y": 3003.4233406178982 "y": 3003.4233406178982
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1846.098538781438, "x": 1846.098538781438,
"y": 2993.2750844210195 "y": 2993.2750844210195
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1837.2703336501618, "x": 1837.2703336501618,
"y": 2982.4094040177133 "y": 2982.4094040177133
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1824.6988381756855, "x": 1824.6988381756855,
"y": 2964.8572538605545 "y": 2964.8572538605545
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1809.2929657948505, "x": 1809.2929657948505,
"y": 2938.833269793301 "y": 2938.833269793301
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1795.2988037540088, "x": 1795.2988037540088,
"y": 2909.9574718672293 "y": 2909.9574718672293
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1782.645433454907, "x": 1782.645433454907,
"y": 2878.237808067624 "y": 2878.237808067624
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1771.2619362992912, "x": 1771.2619362992912,
"y": 2843.682226379773 "y": 2843.682226379773
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1761.0773936889077, "x": 1761.0773936889077,
"y": 2806.2986747889627 "y": 2806.2986747889627
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1752.020887025502, "x": 1752.020887025502,
"y": 2766.095101280478 "y": 2766.095101280478
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1744.0214977108208, "x": 1744.0214977108208,
"y": 2723.0794538396067 "y": 2723.0794538396067
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1737.00830714661, "x": 1737.00830714661,
"y": 2677.259680451635 "y": 2677.259680451635
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1730.9103967346155, "x": 1730.9103967346155,
"y": 2628.6437291018483 "y": 2628.6437291018483
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1725.656847876584, "x": 1725.656847876584,
"y": 2577.2395477755335 "y": 2577.2395477755335
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1721.1767419742605, "x": 1721.1767419742605,
"y": 2523.055084457977 "y": 2523.055084457977
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1715.6771359215397, "x": 1715.6771359215397,
"y": 2436.927798469381 "y": 2436.927798469381
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1710.5065586720987, "x": 1710.5065586720987,
"y": 2311.972555710253 "y": 2311.972555710253
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1707.153218476922, "x": 1707.153218476922,
"y": 2176.039248721311 "y": 2176.039248721311
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1705.0497665499784, "x": 1705.0497665499784,
"y": 2029.1914613848467 "y": 2029.1914613848467
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1703.0181141551627, "x": 1703.0181141551627,
"y": 1789.9386595512806 "y": 1789.9386595512806
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1701.5055118110236, "x": 1701.5055118110236,
"y": 1614.2929133858268 "y": 1614.2929133858268
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1701.5055118110236, "x": 1701.5055118110236,
"y": 1614.2929133858268 "y": 1614.2929133858268
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1676.804606592377, "x": 1676.804606592377,
"y": 376.4976377952755 "y": 376.4976377952755
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1790.1904333640305, "x": 1790.1904333640305,
"y": 376.4976377952755 "y": 376.4976377952755
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2132.831278036873, "x": 2132.831278036873,
"y": 334.01963822471856 "y": 334.01963822471856
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2170.166929133858, "x": 2170.166929133858,
"y": 187.5212598425196 "y": 187.5212598425196
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2170.166929133858, "x": 2170.166929133858,
"y": 187.5212598425196 "y": 187.5212598425196
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2209.0824577516487, "x": 2209.0824577516487,
"y": 196.52029498815347 "y": 196.52029498815347
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2280.0788311549086, "x": 2280.0788311549086,
"y": 214.46913581675784 "y": 214.46913581675784
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2345.053938897079, "x": 2345.053938897079,
"y": 232.82808880019167 "y": 232.82808880019167
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2406.430397575602, "x": 2406.430397575602,
"y": 252.1184733940386 "y": 252.1184733940386
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2466.630823787921, "x": 2466.630823787921,
"y": 272.8616090538824 "y": 272.8616090538824
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2528.077834131477, "x": 2528.077834131477,
"y": 295.5788152353067 "y": 295.5788152353067
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2626.972277996681, "x": 2626.972277996681,
"y": 334.08672189942854 "y": 334.08672189942854
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2683.174281565618, "x": 2683.174281565618,
"y": 428.6163050991843 "y": 428.6163050991843
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2636.9155845119085, "x": 2636.9155845119085,
"y": 570.0364148944475 "y": 570.0364148944475
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2602.3359035137023, "x": 2602.3359035137023,
"y": 679.2016045836615 "y": 679.2016045836615
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2581.1485889486808, "x": 2581.1485889486808,
"y": 750.3046656507598 "y": 750.3046656507598
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2562.658903353014, "x": 2562.658903353014,
"y": 818.1666036205969 "y": 818.1666036205969
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2551.3190086136897, "x": 2551.3190086136897,
"y": 865.7283064025331 "y": 865.7283064025331
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2545.058458315721, "x": 2545.058458315721,
"y": 895.6477493986852 "y": 895.6477493986852
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2542.4441145955184, "x": 2542.4441145955184,
"y": 909.8834645669292 "y": 909.8834645669292
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2539.941891688312, "x": 2539.941891688312,
"y": 924.5359428210015 "y": 924.5359428210015
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2537.2824566009085, "x": 2537.2824566009085,
"y": 946.6345652094251 "y": 946.6345652094251
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2536.3671357993244, "x": 2536.3671357993244,
"y": 961.2177429989904 "y": 961.2177429989904
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2536.3893819364166, "x": 2536.3893819364166,
"y": 975.5256347551833 "y": 975.5256347551833
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2537.538148749601, "x": 2537.538148749601,
"y": 989.4206965556962 "y": 989.4206965556962
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2540.002389976296, "x": 2540.002389976296,
"y": 1002.7653844782211 "y": 1002.7653844782211
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2543.971059353917, "x": 2543.971059353917,
"y": 1015.422154600451 "y": 1015.422154600451
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2549.633110619882, "x": 2549.633110619882,
"y": 1027.253463000078 "y": 1027.253463000078
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2557.177497511606, "x": 2557.177497511606,
"y": 1038.121765754795 "y": 1038.121765754795
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2566.7931737665076, "x": 2566.7931737665076,
"y": 1047.8895189422938 "y": 1047.8895189422938
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2578.669093122002, "x": 2578.669093122002,
"y": 1056.419178640267 "y": 1056.419178640267
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2592.9942093155073, "x": 2592.9942093155073,
"y": 1063.5732009264073 "y": 1063.5732009264073
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2609.9574760844393, "x": 2609.9574760844393,
"y": 1069.214041878407 "y": 1069.214041878407
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2629.747847166216, "x": 2629.747847166216,
"y": 1073.204157573959 "y": 1073.204157573959
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2652.554276298253, "x": 2652.554276298253,
"y": 1075.406004090755 "y": 1075.406004090755
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2656.455947900562, "x": 2656.455947900562,
"y": 1149.9520876303336 "y": 1149.9520876303336
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2642.4743193451973, "x": 2642.4743193451973,
"y": 1283.9248328571011 "y": 1283.9248328571011
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2632.348846491074, "x": 2632.348846491074,
"y": 1400.3953842544354 "y": 1400.3953842544354
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2625.462074272455, "x": 2625.462074272455,
"y": 1499.2648032469053 "y": 1499.2648032469053
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2621.1965476236046, "x": 2621.1965476236046,
"y": 1580.4341512590793 "y": 1580.4341512590793
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2618.9348114787863, "x": 2618.9348114787863,
"y": 1643.804489715526 "y": 1643.804489715526
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2617.8911123953603, "x": 2617.8911123953603,
"y": 1707.5262208487393 "y": 1707.5262208487393
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2617.9884514435694, "x": 2617.9884514435694,
"y": 1722.9543307086615 "y": 1722.9543307086615
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2618.243518754759, "x": 2618.243518754759,
"y": 1728.6863715569775 "y": 1728.6863715569775
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2620.9069750474355, "x": 2620.9069750474355,
"y": 1754.8103451532859 "y": 1754.8103451532859
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2628.7361755238107, "x": 2628.7361755238107,
"y": 1818.230094084754 "y": 1818.230094084754
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2644.9536288641093, "x": 2644.9536288641093,
"y": 1932.092426039521 "y": 1932.092426039521
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2659.427198191514, "x": 2659.427198191514,
"y": 2020.1956325333963 "y": 2020.1956325333963
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2669.339056867133, "x": 2669.339056867133,
"y": 2073.2470143796036 "y": 2073.2470143796036
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2674.225047922979, "x": 2674.225047922979,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2674.225047922979, "x": 2674.225047922979,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 3075.2356380110023 "y": 3075.2356380110023
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 3188.621464782656 "y": 3188.621464782656
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3183.059839328322 "y": 3183.059839328322

View File

@ -1,5 +1,15 @@
{ {
"vector": [ "vector": [
{
"type": "QPointF",
"x": 1984.9598604245455,
"y": 3108.349696217459
},
{
"type": "QPointF",
"x": 1984.9598604245455,
"y": 3107.1742631465927
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 1984.9598604245455, "x": 1984.9598604245455,
@ -7,8 +17,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1980.460653502646, "x": 1980.4332947144517,
"y": 3104.734721364734 "y": 3104.9259742893705
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -62,8 +72,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1827.775230874743, "x": 1828.6586787634583,
"y": 3029.062323188764 "y": 3029.9799215151306
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -102,48 +112,48 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1724.2060573521064, "x": 1724.611163823378,
"y": 2814.604541011345 "y": 2816.233307965892
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1714.8626689124646, "x": 1715.1495506887006,
"y": 2773.005215869235 "y": 2774.4009675028606
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1706.6613158714413, "x": 1706.8632795977835,
"y": 2728.7978163582184 "y": 2729.989568428364
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1699.5068804939508, "x": 1699.6481253072302,
"y": 2681.9634933710727 "y": 2682.978042970247
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1693.3109741320875, "x": 1693.4089700819563,
"y": 2632.486420466245 "y": 2633.347542021286
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1687.9901053084427, "x": 1688.057425274056,
"y": 2580.353927532551 "y": 2581.08223913993
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1683.4582844809274, "x": 1683.5099994061193,
"y": 2525.463573878589 "y": 2526.1694642149946
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1677.9141764602605, "x": 1677.9586784282067,
"y": 2438.490408366745 "y": 2439.336287889993
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1672.7227781832871, "x": 1672.7435992108194,
"y": 2312.9046441927917 "y": 2313.5351656076173
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -155,6 +165,11 @@
"x": 1667.2583677386065, "x": 1667.2583677386065,
"y": 2029.732786467735 "y": 2029.732786467735
}, },
{
"type": "QPointF",
"x": 1665.224201165844,
"y": 1790.259592444213
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 1663.7116376060108, "x": 1663.7116376060108,
@ -182,33 +197,33 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2218.3461551694068, "x": 2217.5977299326023,
"y": 159.8778773943609 "y": 159.69675636609975
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2290.3556666474014, "x": 2289.3425285726667,
"y": 178.09786268498775 "y": 177.82671822296527
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2356.386310160867, "x": 2355.330774389572,
"y": 196.77174097480187 "y": 196.45681566842157
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2418.743012243872, "x": 2417.76276883939,
"y": 216.38498242273093 "y": 216.0621255686488
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2479.7368903013507, "x": 2478.943438456191,
"y": 237.4114485815882 "y": 237.12811808257362
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2541.791733714628, "x": 2541.1839006449068,
"y": 260.35933461464947 "y": 260.1286547630125
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -255,6 +270,11 @@
"x": 2582.147933534884, "x": 2582.147933534884,
"y": 902.9327107340721 "y": 902.9327107340721
}, },
{
"type": "QPointF",
"x": 2579.6177268527103,
"y": 916.710279982473
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 2577.3549162322406, "x": 2577.3549162322406,
@ -337,8 +357,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2694.0188568415797, "x": 2693.986760463563,
"y": 1154.1454872438824 "y": 1154.4153784932541
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -370,6 +390,11 @@
"x": 2655.688340739313, "x": 2655.688340739313,
"y": 1707.7165018577969 "y": 1707.7165018577969
}, },
{
"type": "QPointF",
"x": 2655.778424569198,
"y": 1721.9946692493584
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 2655.953419573936, "x": 2655.953419573936,
@ -423,7 +448,7 @@
{ {
"type": "QPointF", "type": "QPointF",
"x": 1984.9598604245455, "x": 1984.9598604245455,
"y": 3105.37833426348 "y": 3108.349696217459
} }
] ]
} }

View File

@ -2,569 +2,675 @@
"vector": [ "vector": [
{ {
"angle": 3, "angle": 3,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3069.6740125566685 "y": 3069.6740125566685
}, },
{ {
"angle": 3, "angle": 3,
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3069.6740125566685 "y": 3069.6740125566685
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2014.9729320292, "x": 2014.9729320292,
"y": 3069.6130267291883 "y": 3069.6130267291883
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1999.838557691558, "x": 1999.838557691558,
"y": 3068.8816935485092 "y": 3068.8816935485092
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1985.2122453725951, "x": 1985.2122453725951,
"y": 3067.420020685311 "y": 3067.420020685311
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1971.0851302475294, "x": 1971.0851302475294,
"y": 3065.229001637756 "y": 3065.229001637756
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1957.4483474915787, "x": 1957.4483474915787,
"y": 3062.309629904003 "y": 3062.309629904003
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1944.293032279962, "x": 1944.293032279962,
"y": 3058.6628989822143 "y": 3058.6628989822143
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1931.6103197878972, "x": 1931.6103197878972,
"y": 3054.289802370551 "y": 3054.289802370551
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1919.3913451906024, "x": 1919.3913451906024,
"y": 3049.191333567172 "y": 3049.191333567172
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1907.6272436632962, "x": 1907.6272436632962,
"y": 3043.368486070239 "y": 3043.368486070239
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1896.3091503811966, "x": 1896.3091503811966,
"y": 3036.8222533779135 "y": 3036.8222533779135
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1885.4282005195219, "x": 1885.4282005195219,
"y": 3029.5536289883566 "y": 3029.5536289883566
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1874.9755292534905, "x": 1874.9755292534905,
"y": 3021.563606399727 "y": 3021.563606399727
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1864.9422717583204, "x": 1864.9422717583204,
"y": 3012.8531791101877 "y": 3012.8531791101877
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1855.3195632092302, "x": 1855.3195632092302,
"y": 3003.4233406178982 "y": 3003.4233406178982
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1846.098538781438, "x": 1846.098538781438,
"y": 2993.2750844210195 "y": 2993.2750844210195
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1837.2703336501618, "x": 1837.2703336501618,
"y": 2982.4094040177133 "y": 2982.4094040177133
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1824.6988381756855, "x": 1824.6988381756855,
"y": 2964.8572538605545 "y": 2964.8572538605545
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1809.2929657948505, "x": 1809.2929657948505,
"y": 2938.833269793301 "y": 2938.833269793301
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1795.2988037540088, "x": 1795.2988037540088,
"y": 2909.9574718672293 "y": 2909.9574718672293
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1782.645433454907, "x": 1782.645433454907,
"y": 2878.237808067624 "y": 2878.237808067624
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1771.2619362992912, "x": 1771.2619362992912,
"y": 2843.682226379773 "y": 2843.682226379773
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1761.0773936889077, "x": 1761.0773936889077,
"y": 2806.2986747889627 "y": 2806.2986747889627
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1752.020887025502, "x": 1752.020887025502,
"y": 2766.095101280478 "y": 2766.095101280478
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1744.0214977108208, "x": 1744.0214977108208,
"y": 2723.0794538396067 "y": 2723.0794538396067
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1737.00830714661, "x": 1737.00830714661,
"y": 2677.259680451635 "y": 2677.259680451635
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1730.9103967346155, "x": 1730.9103967346155,
"y": 2628.6437291018483 "y": 2628.6437291018483
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1725.656847876584, "x": 1725.656847876584,
"y": 2577.2395477755335 "y": 2577.2395477755335
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1721.1767419742605, "x": 1721.1767419742605,
"y": 2523.055084457977 "y": 2523.055084457977
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1715.6771359215397, "x": 1715.6771359215397,
"y": 2436.927798469381 "y": 2436.927798469381
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1710.5065586720987, "x": 1710.5065586720987,
"y": 2311.972555710253 "y": 2311.972555710253
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1707.153218476922, "x": 1707.153218476922,
"y": 2176.039248721311 "y": 2176.039248721311
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1705.0497665499784, "x": 1705.0497665499784,
"y": 2029.1914613848467 "y": 2029.1914613848467
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1703.0181141551627, "x": 1703.0181141551627,
"y": 1789.9386595512806 "y": 1789.9386595512806
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1701.5055118110236, "x": 1701.5055118110236,
"y": 1614.2929133858268 "y": 1614.2929133858268
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1701.5055118110236, "x": 1701.5055118110236,
"y": 1614.2929133858268 "y": 1614.2929133858268
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1676.804606592377, "x": 1676.804606592377,
"y": 376.4976377952755 "y": 376.4976377952755
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1790.1904333640305, "x": 1790.1904333640305,
"y": 376.4976377952755 "y": 376.4976377952755
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2132.831278036873, "x": 2132.831278036873,
"y": 334.01963822471856 "y": 334.01963822471856
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2170.166929133858, "x": 2170.166929133858,
"y": 187.5212598425196 "y": 187.5212598425196
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2170.166929133858, "x": 2170.166929133858,
"y": 187.5212598425196 "y": 187.5212598425196
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2209.0824577516487, "x": 2209.0824577516487,
"y": 196.52029498815347 "y": 196.52029498815347
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2280.0788311549086, "x": 2280.0788311549086,
"y": 214.46913581675784 "y": 214.46913581675784
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2345.053938897079, "x": 2345.053938897079,
"y": 232.82808880019167 "y": 232.82808880019167
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2406.430397575602, "x": 2406.430397575602,
"y": 252.1184733940386 "y": 252.1184733940386
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2466.630823787921, "x": 2466.630823787921,
"y": 272.8616090538824 "y": 272.8616090538824
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2528.077834131477, "x": 2528.077834131477,
"y": 295.5788152353067 "y": 295.5788152353067
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2626.972277996681, "x": 2626.972277996681,
"y": 334.08672189942854 "y": 334.08672189942854
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2703.4528262445083, "x": 2703.4528262445083,
"y": 364.5878268403889 "y": 364.5878268403889
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2683.174281565618, "x": 2683.174281565618,
"y": 428.6163050991843 "y": 428.6163050991843
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2636.9155845119085, "x": 2636.9155845119085,
"y": 570.0364148944475 "y": 570.0364148944475
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2602.3359035137023, "x": 2602.3359035137023,
"y": 679.2016045836615 "y": 679.2016045836615
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2581.1485889486808, "x": 2581.1485889486808,
"y": 750.3046656507598 "y": 750.3046656507598
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2562.658903353014, "x": 2562.658903353014,
"y": 818.1666036205969 "y": 818.1666036205969
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2551.3190086136897, "x": 2551.3190086136897,
"y": 865.7283064025331 "y": 865.7283064025331
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2545.058458315721, "x": 2545.058458315721,
"y": 895.6477493986852 "y": 895.6477493986852
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2542.4441145955184, "x": 2542.4441145955184,
"y": 909.8834645669292 "y": 909.8834645669292
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2539.941891688312, "x": 2539.941891688312,
"y": 924.5359428210015 "y": 924.5359428210015
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2537.2824566009085, "x": 2537.2824566009085,
"y": 946.6345652094251 "y": 946.6345652094251
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2536.3671357993244, "x": 2536.3671357993244,
"y": 961.2177429989904 "y": 961.2177429989904
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2536.3893819364166, "x": 2536.3893819364166,
"y": 975.5256347551833 "y": 975.5256347551833
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2537.538148749601, "x": 2537.538148749601,
"y": 989.4206965556962 "y": 989.4206965556962
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2540.002389976296, "x": 2540.002389976296,
"y": 1002.7653844782211 "y": 1002.7653844782211
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2543.971059353917, "x": 2543.971059353917,
"y": 1015.422154600451 "y": 1015.422154600451
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2549.633110619882, "x": 2549.633110619882,
"y": 1027.253463000078 "y": 1027.253463000078
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2557.177497511606, "x": 2557.177497511606,
"y": 1038.121765754795 "y": 1038.121765754795
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2566.7931737665076, "x": 2566.7931737665076,
"y": 1047.8895189422938 "y": 1047.8895189422938
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2578.669093122002, "x": 2578.669093122002,
"y": 1056.419178640267 "y": 1056.419178640267
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2592.9942093155073, "x": 2592.9942093155073,
"y": 1063.5732009264073 "y": 1063.5732009264073
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2609.9574760844393, "x": 2609.9574760844393,
"y": 1069.214041878407 "y": 1069.214041878407
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2629.747847166216, "x": 2629.747847166216,
"y": 1073.204157573959 "y": 1073.204157573959
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2652.554276298253, "x": 2652.554276298253,
"y": 1075.406004090755 "y": 1075.406004090755
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2665.2850393700787, "x": 2665.2850393700787,
"y": 1075.7102362204726 "y": 1075.7102362204726
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2656.455947900562, "x": 2656.455947900562,
"y": 1149.9520876303336 "y": 1149.9520876303336
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2642.4743193451973, "x": 2642.4743193451973,
"y": 1283.9248328571011 "y": 1283.9248328571011
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2632.348846491074, "x": 2632.348846491074,
"y": 1400.3953842544354 "y": 1400.3953842544354
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2625.462074272455, "x": 2625.462074272455,
"y": 1499.2648032469053 "y": 1499.2648032469053
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2621.1965476236046, "x": 2621.1965476236046,
"y": 1580.4341512590793 "y": 1580.4341512590793
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2618.9348114787863, "x": 2618.9348114787863,
"y": 1643.804489715526 "y": 1643.804489715526
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2617.8911123953603, "x": 2617.8911123953603,
"y": 1707.5262208487393 "y": 1707.5262208487393
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2617.9884514435694, "x": 2617.9884514435694,
"y": 1722.9543307086615 "y": 1722.9543307086615
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2618.243518754759, "x": 2618.243518754759,
"y": 1728.6863715569775 "y": 1728.6863715569775
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2620.9069750474355, "x": 2620.9069750474355,
"y": 1754.8103451532859 "y": 1754.8103451532859
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2628.7361755238107, "x": 2628.7361755238107,
"y": 1818.230094084754 "y": 1818.230094084754
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2644.9536288641093, "x": 2644.9536288641093,
"y": 1932.092426039521 "y": 1932.092426039521
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2659.427198191514, "x": 2659.427198191514,
"y": 2020.1956325333963 "y": 2020.1956325333963
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2669.339056867133, "x": 2669.339056867133,
"y": 2073.2470143796036 "y": 2073.2470143796036
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2674.225047922979, "x": 2674.225047922979,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2674.225047922979, "x": 2674.225047922979,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 2096.1826771653546 "y": 2096.1826771653546
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 3075.2356380110023 "y": 3075.2356380110023
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2608.5921259842517, "x": 2608.5921259842517,
"y": 3188.621464782656 "y": 3188.621464782656
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2022.7551360150967, "x": 2022.7551360150967,
"y": 3183.059839328322 "y": 3183.059839328322

View File

@ -1,5 +1,15 @@
{ {
"vector": [ "vector": [
{
"type": "QPointF",
"x": 1984.9598604245455,
"y": 3108.349696217459
},
{
"type": "QPointF",
"x": 1984.9598604245455,
"y": 3107.1742631465927
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 1984.9598604245455, "x": 1984.9598604245455,
@ -7,8 +17,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1980.460653502646, "x": 1980.4332947144517,
"y": 3104.734721364734 "y": 3104.9259742893705
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -62,8 +72,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1827.775230874743, "x": 1828.6586787634583,
"y": 3029.062323188764 "y": 3029.9799215151306
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -102,48 +112,48 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1724.2060573521064, "x": 1724.611163823378,
"y": 2814.604541011345 "y": 2816.233307965892
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1714.8626689124646, "x": 1715.1495506887006,
"y": 2773.005215869235 "y": 2774.4009675028606
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1706.6613158714413, "x": 1706.8632795977835,
"y": 2728.7978163582184 "y": 2729.989568428364
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1699.5068804939508, "x": 1699.6481253072302,
"y": 2681.9634933710727 "y": 2682.978042970247
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1693.3109741320875, "x": 1693.4089700819563,
"y": 2632.486420466245 "y": 2633.347542021286
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1687.9901053084427, "x": 1688.057425274056,
"y": 2580.353927532551 "y": 2581.08223913993
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1683.4582844809274, "x": 1683.5099994061193,
"y": 2525.463573878589 "y": 2526.1694642149946
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1677.9141764602605, "x": 1677.9586784282067,
"y": 2438.490408366745 "y": 2439.336287889993
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1672.7227781832871, "x": 1672.7435992108194,
"y": 2312.9046441927917 "y": 2313.5351656076173
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -155,6 +165,11 @@
"x": 1667.2583677386065, "x": 1667.2583677386065,
"y": 2029.732786467735 "y": 2029.732786467735
}, },
{
"type": "QPointF",
"x": 1665.224201165844,
"y": 1790.259592444213
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 1663.7116376060108, "x": 1663.7116376060108,
@ -182,33 +197,33 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2218.3461551694068, "x": 2217.5977299326023,
"y": 159.8778773943609 "y": 159.69675636609975
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2290.3556666474014, "x": 2289.3425285726667,
"y": 178.09786268498775 "y": 177.82671822296527
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2356.386310160867, "x": 2355.330774389572,
"y": 196.77174097480187 "y": 196.45681566842157
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2418.743012243872, "x": 2417.76276883939,
"y": 216.38498242273093 "y": 216.0621255686488
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2479.7368903013507, "x": 2478.943438456191,
"y": 237.4114485815882 "y": 237.12811808257362
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2541.791733714628, "x": 2541.1839006449068,
"y": 260.35933461464947 "y": 260.1286547630125
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -255,6 +270,11 @@
"x": 2582.147933534884, "x": 2582.147933534884,
"y": 902.9327107340721 "y": 902.9327107340721
}, },
{
"type": "QPointF",
"x": 2579.6177268527103,
"y": 916.710279982473
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 2577.3549162322406, "x": 2577.3549162322406,
@ -337,8 +357,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 2694.0188568415797, "x": 2693.986760463563,
"y": 1154.1454872438824 "y": 1154.4153784932541
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -370,6 +390,11 @@
"x": 2655.688340739313, "x": 2655.688340739313,
"y": 1707.7165018577969 "y": 1707.7165018577969
}, },
{
"type": "QPointF",
"x": 2655.778424569198,
"y": 1721.9946692493584
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 2655.953419573936, "x": 2655.953419573936,
@ -423,7 +448,7 @@
{ {
"type": "QPointF", "type": "QPointF",
"x": 1984.9598604245455, "x": 1984.9598604245455,
"y": 3105.37833426348 "y": 3108.349696217459
} }
] ]
} }

View File

@ -1,31 +1,37 @@
{ {
"vector": [ "vector": [
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 99.86433649395012, "x": 99.86433649395012,
"y": 10.166060970128015 "y": 10.166060970128015
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 236.976230899601, "x": 236.976230899601,
"y": 65.89294600598842 "y": 65.89294600598842
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 198.9294347511521, "x": 198.9294347511521,
"y": 172.04822599160408 "y": 172.04822599160408
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 260.3187756756982, "x": 260.3187756756982,
"y": 75.38014122578073 "y": 75.38014122578073
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 324.5363299638826, "x": 324.5363299638826,
"y": 101.48031496062993 "y": 101.48031496062993
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 29.858267716535437, "x": 29.858267716535437,
"y": 300.8503937007874 "y": 300.8503937007874

View File

@ -5,6 +5,16 @@
"x": 73.4038432255171, "x": 73.4038432255171,
"y": -41.386063334917424 "y": -41.386063334917424
}, },
{
"type": "QPointF",
"x": 284.78380715883054,
"y": 44.52586283354347
},
{
"type": "QPointF",
"x": 245.32495095506744,
"y": 28.488456649013926
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 404.34279917400556, "x": 404.34279917400556,

View File

@ -1,31 +1,37 @@
{ {
"vector": [ "vector": [
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 99.86433649395012, "x": 99.86433649395012,
"y": 10.166060970128015 "y": 10.166060970128015
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 236.976230899601, "x": 236.976230899601,
"y": 65.89294600598842 "y": 65.89294600598842
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 198.9294347511521, "x": 198.9294347511521,
"y": 172.04822599160408 "y": 172.04822599160408
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 260.3187756756982, "x": 260.3187756756982,
"y": 75.38014122578073 "y": 75.38014122578073
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 324.5363299638826, "x": 324.5363299638826,
"y": 101.48031496062993 "y": 101.48031496062993
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 29.858267716535437, "x": 29.858267716535437,
"y": 300.8503937007874 "y": 300.8503937007874

View File

@ -5,6 +5,16 @@
"x": 46.94334995708405, "x": 46.94334995708405,
"y": -92.9381876399629 "y": -92.9381876399629
}, },
{
"type": "QPointF",
"x": 332.5913834180602,
"y": 23.15877966109862
},
{
"type": "QPointF",
"x": 230.33112623443668,
"y": -18.40322792775288
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 484.14926838412856, "x": 484.14926838412856,

View File

@ -2,147 +2,126 @@
"vector": [ "vector": [
{ {
"saAfter": 0, "saAfter": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 11565.008125001965, "x": 11565.013142470898,
"y": -71.44488549419933 "y": -71.44502878281966
}, },
{ {
"saBefore": 0, "saBefore": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 11774.053467225081, "x": 12574.226196766724,
"y": -3376.8303371353477 "y": -4788.694779920271
}, },
{ {
"curvePoint": true,
"saBefore": 0, "saBefore": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 11774.053467225081, "x": 12574.226196766724,
"y": -3376.8303371353477 "y": -4788.694779920271
},
{
"angle": 6,
"type": "VSAPoint",
"x": 11821.637653562488,
"y": -3457.444047544761
},
{
"angle": 6,
"type": "VSAPoint",
"x": 11916.506852253828,
"y": -3619.698047174161
},
{
"angle": 6,
"type": "VSAPoint",
"x": 12011.687139013728,
"y": -3784.3170132645946
},
{
"angle": 6,
"type": "VSAPoint",
"x": 12107.923065894336,
"y": -3952.559914581168
},
{
"angle": 6,
"type": "VSAPoint",
"x": 12205.959184947797,
"y": -4125.685719888987
},
{
"angle": 6,
"type": "VSAPoint",
"x": 12306.540048226263,
"y": -4304.953397953153
},
{
"angle": 6,
"type": "VSAPoint",
"x": 12463.260680635496,
"y": -4586.963758807588
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 12688.625497168217, "x": 12688.625497168217,
"y": -4997.457976655285 "y": -4997.457976655285
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 12937.571227539614, "x": 12937.571227539614,
"y": -5455.181123300274 "y": -5455.181123300274
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 13363.424703096609, "x": 13363.424703096609,
"y": -6243.3010001396 "y": -6243.3010001396
}, },
{ {
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 13704.042216387523, "x": 13704.042216387523,
"y": -6875.648082494775 "y": -6875.648082494775
}, },
{ {
"saAfter": 0, "saAfter": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 13704.042216387523, "x": 13704.042216387523,
"y": -6875.648082494775 "y": -6875.648082494775
}, },
{ {
"saBefore": 0, "saBefore": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 13493.259591532773, "x": 13493.254460030012,
"y": -71.4448854942045 "y": -71.44503203938407
}, },
{ {
"curvePoint": true,
"saBefore": 0, "saBefore": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 13493.259591532773, "x": 13493.254460030012,
"y": -71.4448854942045 "y": -71.44503203938407
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 13227.96813484252, "x": 13227.96813484252,
"y": -78.38238188976378 "y": -78.38238188976378
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 12939.963705708662, "x": 12939.963705708662,
"y": -83.80364173228347 "y": -83.80364173228347
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 12664.66535433071, "x": 12664.66535433071,
"y": -86.51427165354332 "y": -86.51427165354332
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 12393.602362204725, "x": 12393.602362204725,
"y": -86.51427165354332 "y": -86.51427165354332
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 12118.304010826774, "x": 12118.304010826774,
"y": -83.80364173228347 "y": -83.80364173228347
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 11830.299581692912, "x": 11830.299581692912,
"y": -78.38238188976378 "y": -78.38238188976378
}, },
{ {
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 11565.008125001965, "x": 11565.013142470898,
"y": -71.44488549419933 "y": -71.44502878281966
} }
] ]
} }

View File

@ -2,48 +2,23 @@
"vector": [ "vector": [
{ {
"type": "QPointF", "type": "QPointF",
"x": 11560.846475874965, "x": 11551.905199769692,
"y": -14.623761696484117 "y": -14.389955863800495
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 11781.326946495077, "x": 12404.150893454804,
"y": -3500.819302857501 "y": -3997.9450330949685
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 11867.565752333256, "x": 12614.150847904311,
"y": -3648.313692662954 "y": -4979.523926317832
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 11962.607394275858, "x": 12638.908041375378,
"y": -3812.6942063012807 "y": -5024.702444307613
},
{
"type": "QPointF",
"x": 12058.712075176787,
"y": -3980.708890064595
},
{
"type": "QPointF",
"x": 12156.626721853161,
"y": -4153.62126200273
},
{
"type": "QPointF",
"x": 12257.09760942872,
"y": -4332.693831870464
},
{
"type": "QPointF",
"x": 12413.705754675855,
"y": -4614.5027446514505
},
{
"type": "QPointF",
"x": 12638.929472529417,
"y": -5024.741516808089
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -57,38 +32,38 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 13708.573357026718, "x": 13708.907465404465,
"y": -7003.606684992652 "y": -7004.226948043184
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 13492.070905293423, "x": 13492.380272854994,
"y": -14.763675483318366 "y": -14.755597758319709
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 13226.486095144688, "x": 13226.486097782079,
"y": -21.70884320982175 "y": -21.708843140852863
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 12939.151113441983, "x": 12938.896733996888,
"y": -27.11598122480561 "y": -27.120769543772127
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 12664.386257521342, "x": 12664.107174239743,
"y": -29.824106164643062
},
{
"type": "QPointF",
"x": 12393.602362204725,
"y": -29.82135826771654 "y": -29.82135826771654
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 12393.881459014092, "x": 12118.86219091774,
"y": -29.82135826771654 "y": -27.11347624338321
},
{
"type": "QPointF",
"x": 12119.116603093453,
"y": -27.11598122480561
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -97,8 +72,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 11560.846475874965, "x": 11551.905199769692,
"y": -14.623761696484117 "y": -14.389955863800495
} }
] ]
} }

View File

@ -1,6 +1,7 @@
{ {
"vector": [ "vector": [
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1352.8346456692914, "x": 1352.8346456692914,
"y": 1173.8581417322835 "y": 1173.8581417322835
@ -9,20 +10,24 @@
"angle": 6, "angle": 6,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1352.8346456692914, "x": 1352.8346456692914,
"y": 1362.8345196850394 "y": 1362.8345196850394
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1352.8346456692914, "x": 1352.8346456692914,
"y": 1362.8345196850394 "y": 1362.8345196850394
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -31,6 +36,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -39,6 +45,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -47,6 +54,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -55,6 +63,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -63,6 +72,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -71,6 +81,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -79,6 +90,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -87,6 +99,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -95,6 +108,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -103,6 +117,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -111,6 +126,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -119,6 +135,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -127,6 +144,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -135,6 +153,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -143,6 +162,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -151,6 +171,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -159,6 +180,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -167,6 +189,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -175,6 +198,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -183,6 +207,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -191,8 +216,10 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 691.4173228346457, "x": 691.4173228346457,
"y": 1476.2203464566928 "y": 1476.2203464566928
@ -201,20 +228,24 @@
"angle": 6, "angle": 6,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 691.4173228346457, "x": 691.4173228346457,
"y": 1476.2203464566928 "y": 1476.2203464566928
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 691.4173228346457, "x": 691.4173228346457,
"y": 1476.2203464566928 "y": 1476.2203464566928
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -223,6 +254,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -231,6 +263,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -239,6 +272,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -247,6 +281,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -255,6 +290,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -263,6 +299,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -271,6 +308,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -279,6 +317,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -287,6 +326,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -295,6 +335,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -303,6 +344,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -311,6 +353,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -319,6 +362,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -327,6 +371,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -335,6 +380,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"type": "VSAPoint", "type": "VSAPoint",
@ -343,8 +389,10 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 30, "x": 30,
"y": 1362.8345196850394 "y": 1362.8345196850394
@ -353,401 +401,473 @@
"angle": 6, "angle": 6,
"saAfter": 0, "saAfter": 0,
"saBefore": 0, "saBefore": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 30, "x": 30,
"y": 1362.8345196850394 "y": 1362.8345196850394
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 30, "x": 30,
"y": 1173.8581417322835 "y": 1173.8581417322835
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 30, "x": 30,
"y": 39.999874015748034 "y": 39.999874015748034
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 30, "x": 30,
"y": 39.999874015748034 "y": 39.999874015748034
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 33.76305151898726, "x": 33.76305151898726,
"y": 60.995030973282226 "y": 60.995030973282226
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 43.0315825387278, "x": 43.0315825387278,
"y": 101.39020424935029 "y": 101.39020424935029
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 54.27954844568175, "x": 54.27954844568175,
"y": 139.90490371803747 "y": 139.90490371803747
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 67.38308402773156, "x": 67.38308402773156,
"y": 176.57656822314317 "y": 176.57656822314317
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 82.21832407275966, "x": 82.21832407275966,
"y": 211.44263660846684 "y": 211.44263660846684
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 98.66140336864854, "x": 98.66140336864854,
"y": 244.5405477178079 "y": 244.5405477178079
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 116.58845670328057, "x": 116.58845670328057,
"y": 275.9077403949657 "y": 275.9077403949657
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 135.87561886453827, "x": 135.87561886453827,
"y": 305.58165348373984 "y": 305.58165348373984
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 156.39902464030405, "x": 156.39902464030405,
"y": 333.59972582792955 "y": 333.59972582792955
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 178.03480881846033, "x": 178.03480881846033,
"y": 359.9993962713345 "y": 359.9993962713345
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 200.65910618688957, "x": 200.65910618688957,
"y": 384.8181036577539 "y": 384.8181036577539
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 224.1480515334743, "x": 224.1480515334743,
"y": 408.0932868309873 "y": 408.0932868309873
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 248.37777964609688, "x": 248.37777964609688,
"y": 429.8623846348342 "y": 429.8623846348342
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 273.2244253126397, "x": 273.2244253126397,
"y": 450.1628359130938 "y": 450.1628359130938
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 298.5641233209853, "x": 298.5641233209853,
"y": 469.03207950956573 "y": 469.03207950956573
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 324.27300845901607, "x": 324.27300845901607,
"y": 486.50755426804926 "y": 486.50755426804926
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 350.2272155146145, "x": 350.2272155146145,
"y": 502.62669903234394 "y": 502.62669903234394
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 376.30287927566303, "x": 376.30287927566303,
"y": 517.4269526462492 "y": 517.4269526462492
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 402.37613453004406, "x": 402.37613453004406,
"y": 530.9457539535643 "y": 530.9457539535643
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 428.3231160656401, "x": 428.3231160656401,
"y": 543.220541798089 "y": 543.220541798089
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 454.0199586703335, "x": 454.0199586703335,
"y": 554.2887550236226 "y": 554.2887550236226
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 479.34279713200675, "x": 479.34279713200675,
"y": 564.1878324739644 "y": 564.1878324739644
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 504.1677662385423, "x": 504.1677662385423,
"y": 572.9552129929136 "y": 572.9552129929136
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 528.3710007778225, "x": 528.3710007778225,
"y": 580.6283354242702 "y": 580.6283354242702
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 563.3555698213261, "x": 563.3555698213261,
"y": 590.2932652501413 "y": 590.2932652501413
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 606.5452489509445, "x": 606.5452489509445,
"y": 599.5232277128903 "y": 599.5232277128903
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 645.018415993426, "x": 645.018415993426,
"y": 605.0500570136577 "y": 605.0500570136577
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 677.7841492518301, "x": 677.7841492518301,
"y": 607.1732639028387 "y": 607.1732639028387
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 691.4173228346472, "x": 691.4173228346472,
"y": 606.9290078739998 "y": 606.9290078739998
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 691.4173228346472, "x": 691.4173228346472,
"y": 606.9290078739998 "y": 606.9290078739998
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 691.4173228346472, "x": 691.4173228346472,
"y": 606.9290078739998 "y": 606.9290078739998
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 705.4040324293001, "x": 705.4040324293001,
"y": 606.5537669203095 "y": 606.5537669203095
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 733.313887957579, "x": 733.313887957579,
"y": 607.2856128814886 "y": 607.2856128814886
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 761.113422978073, "x": 761.113422978073,
"y": 609.7421003245712 "y": 609.7421003245712
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 788.7648106968343, "x": 788.7648106968343,
"y": 613.8630604047041 "y": 613.8630604047041
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 816.2302243199158, "x": 816.2302243199158,
"y": 619.5883242770342 "y": 619.5883242770342
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 843.4718370533695, "x": 843.4718370533695,
"y": 626.8577230967081 "y": 626.8577230967081
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 870.4518221032482, "x": 870.4518221032482,
"y": 635.6110880188726 "y": 635.6110880188726
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 897.1323526756041, "x": 897.1323526756041,
"y": 645.7882501986744 "y": 645.7882501986744
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 923.4756019764898, "x": 923.4756019764898,
"y": 657.3290407912602 "y": 657.3290407912602
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 949.4437432119576, "x": 949.4437432119576,
"y": 670.1732909517772 "y": 670.1732909517772
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 974.99894958806, "x": 974.99894958806,
"y": 684.2608318353717 "y": 684.2608318353717
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1000.1033943108496, "x": 1000.1033943108496,
"y": 699.5314945971908 "y": 699.5314945971908
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1024.7192505863786, "x": 1024.7192505863786,
"y": 715.9251103923807 "y": 715.9251103923807
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1048.8086916206998, "x": 1048.8086916206998,
"y": 733.381510376089 "y": 733.381510376089
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1072.333890619865, "x": 1072.333890619865,
"y": 751.8405257034619 "y": 751.8405257034619
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1095.257020789927, "x": 1095.257020789927,
"y": 771.2419875296464 "y": 771.2419875296464
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1117.5402553369386, "x": 1117.5402553369386,
"y": 791.5257270097891 "y": 791.5257270097891
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1139.1457674669518, "x": 1139.1457674669518,
"y": 812.6315752990367 "y": 812.6315752990367
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1160.0357303860196, "x": 1160.0357303860196,
"y": 834.4993635525362 "y": 834.4993635525362
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1180.1723173001938, "x": 1180.1723173001938,
"y": 857.0689229254342 "y": 857.0689229254342
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1199.517701415527, "x": 1199.517701415527,
"y": 880.2800845728777 "y": 880.2800845728777
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1218.0340559380716, "x": 1218.0340559380716,
"y": 904.0726796500132 "y": 904.0726796500132
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1235.6835540738803, "x": 1235.6835540738803,
"y": 928.3865393119877 "y": 928.3865393119877
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1252.4283690290056, "x": 1252.4283690290056,
"y": 953.1614947139476 "y": 953.1614947139476
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1268.2306740094996, "x": 1268.2306740094996,
"y": 978.3373770110402 "y": 978.3373770110402
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1283.0526422214152, "x": 1283.0526422214152,
"y": 1003.8540173584116 "y": 1003.8540173584116
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1296.8564468708046, "x": 1296.8564468708046,
"y": 1029.651246911209 "y": 1029.651246911209
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1309.60426116372, "x": 1309.60426116372,
"y": 1055.6688968245794 "y": 1055.6688968245794
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1321.258258306214, "x": 1321.258258306214,
"y": 1081.846798253669 "y": 1081.846798253669
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1331.780611504339, "x": 1331.780611504339,
"y": 1108.1247823536248 "y": 1108.1247823536248
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1341.1334939641479, "x": 1341.1334939641479,
"y": 1134.4426802795938 "y": 1134.4426802795938
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1349.2790788916927, "x": 1349.2790788916927,
"y": 1160.7403231867224 "y": 1160.7403231867224
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1352.8346456692914, "x": 1352.8346456692914,
"y": 1173.8581417322835 "y": 1173.8581417322835

View File

@ -2,203 +2,208 @@
"vector": [ "vector": [
{ {
"type": "QPointF", "type": "QPointF",
"x": 1391.2039211231315, "x": 1391.2011016775252,
"y": 1170.9444368424918 "y": 1170.934034850861
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1353.4015748031497, "x": 1353.716220472441,
"y": 1362.8345196850394 "y": 1362.8345196850394
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1351.1847957148477, "x": 1351.472718112178,
"y": 1367.9837020242383 "y": 1368.1105980065204
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1345.1491063827884, "x": 1345.4107517871767,
"y": 1377.0351535858993 "y": 1377.2099208012642
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1337.195060618467, "x": 1337.4187552857716,
"y": 1385.0908506308913 "y": 1385.3121255572237
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1327.4356491832236, "x": 1327.6206417585736,
"y": 1392.193532758326 "y": 1392.4480512139812
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1315.972058403799, "x": 1316.1219684603934,
"y": 1398.411239348762 "y": 1398.6878778712705
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1302.9006184964092, "x": 1303.0207413941732,
"y": 1403.813879103759 "y": 1404.1046924229804
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1288.3146848455422, "x": 1288.4103406995205,
"y": 1408.4705173942918 "y": 1408.7702703839407
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1272.3064038330447, "x": 1272.3822665169344,
"y": 1412.4487702782033 "y": 1412.7541335870615
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1245.9857010948988, "x": 1246.043310569705,
"y": 1417.3517931078604 "y": 1417.6611198697424
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1206.53852508622, "x": 1206.575567617045,
"y": 1422.0295899414439 "y": 1422.3420475355488
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1163.0590153626633, "x": 1163.0816776764527,
"y": 1425.1699495236505 "y": 1425.4837780066432
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1116.2932350829396, "x": 1116.3074690935448,
"y": 1427.2879226859707 "y": 1427.602246229705
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1041.7895077573253, "x": 1041.799436608138,
"y": 1429.6401613199018 "y": 1429.9546502944706
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 963.7205338463195, "x": 963.7326517001363,
"y": 1432.6490541812936 "y": 1432.9634664183689
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 911.2591589138497, "x": 911.2781230605095,
"y": 1435.8168701844065 "y": 1436.1309438355543
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 859.237872023468, "x": 859.2662640679569,
"y": 1440.530494934681 "y": 1440.84385700803
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 808.4052261459925, "x": 808.4467747259209,
"y": 1447.3026887534452 "y": 1447.6145791391734
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 771.5939627010235, "x": 771.6513546317626,
"y": 1454.1324411149867 "y": 1454.4418083134578
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 747.7741871176479, "x": 747.8438596303752,
"y": 1459.5416218107064 "y": 1459.8484566818895
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 724.6693192587568, "x": 724.7510106846972,
"y": 1465.7538024321 "y": 1466.0576583323743
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 702.3758460326873, "x": 702.4710574539205,
"y": 1472.8321997422458 "y": 1473.1320941944628
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 674.507015051664, "x": 691.7189992449391,
"y": 1482.923776815389 "y": 1477.0486975157376
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 639.6066402491301, "x": 674.6137934445236,
"y": 1493.192210436715 "y": 1483.2197502466663
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 603.8826034921715, "x": 639.6954429590429,
"y": 1500.9647096620215 "y": 1493.494064666296
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 567.3181507277893, "x": 603.9494838615082,
"y": 1506.2427302418655 "y": 1501.2721652090543
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 529.8901218300683, "x": 567.3630914194166,
"y": 1509.0302296950115 "y": 1506.554149944903
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 491.57527912840374, "x": 529.9134794568803,
"y": 1509.3313030222791 "y": 1509.3440071933658
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 452.3502707817418, "x": 491.57774121601966,
"y": 1507.150148679257 "y": 1509.6459390585628
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 412.19161352943087, "x": 452.33279240390664,
"y": 1502.4910279791181 "y": 1507.4643085167793
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 371.07569338620755, "x": 412.1553443701381,
"y": 1495.3582260526082 "y": 1502.803576287845
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 328.97877955542225, "x": 371.02190518754037,
"y": 1485.756019959969 "y": 1495.6682401279145
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 285.87704576492825, "x": 328.9088012872336,
"y": 1473.6886564035954 "y": 1486.0627852435086
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 241.7465938922898, "x": 285.79221063594036,
"y": 1459.1603388979738 "y": 1473.9916496346968
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 196.56347626091042, "x": 241.64819947318352,
"y": 1442.1752227113166 "y": 1459.4592041443518
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 150.30371460077188, "x": 196.45275698176602,
"y": 1422.7374153405683 "y": 1442.4697445923873
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 102.94331495188868, "x": 150.1818247717201,
"y": 1400.8509803944567 "y": 1423.0274925143988
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 54.45827862060838, "x": 102.81132005517884,
"y": 1376.5199431940014 "y": 1401.1366011998023
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 29.507951730702608, "x": 54.31715268342318,
"y": 1363.2146255965158 "y": 1376.8011644006297
},
{
"type": "QPointF",
"x": 29.233766383669003,
"y": 1363.4249985383867
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -212,13 +217,13 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 61.10102183090257, "x": 61.101021830902596,
"y": -0.7096412239110919 "y": -0.7096412239110919
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 70.80478764466314, "x": 70.80478764466314,
"y": 53.4304855617782 "y": 53.43048556177821
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -357,8 +362,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 706.3947511130126, "x": 704.5565208119547,
"y": 568.7714782991122 "y": 568.7679947166857
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -392,123 +397,128 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 912.2986372044141, "x": 910.602492678925,
"y": 611.1693728258188 "y": 610.4748223665233
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 940.2320789181749, "x": 938.6418865052998,
"y": 623.4512702408151 "y": 622.7101634184046
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 967.6899838064253, "x": 966.2002201536427,
"y": 637.0740830891309 "y": 636.295520401332
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 994.6408167524145, "x": 993.2451901825277,
"y": 651.9702773145275 "y": 651.1616239727255
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1021.0534381150906, "x": 1019.7452614752041,
"y": 668.0739275970849 "y": 667.2409400763465
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1046.8968187993657, "x": 1045.6692943906153,
"y": 685.3205629341362 "y": 684.4675433922748
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1072.1398306898122, "x": 1070.986259833687,
"y": 703.64700505477 "y": 702.7769629178445
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1096.7510983823208, "x": 1095.6650296889775,
"y": 722.9912133710887 "y": 722.106020382143
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1120.6988985644755, "x": 1119.6742285523828,
"y": 743.2921447345486 "y": 742.3926751972732
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1143.951094808868, "x": 1142.982133111487,
"y": 764.4896323333478 "y": 763.5758842146913
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1166.4750973318512, "x": 1165.5566069388813,
"y": 786.5242853956154 "y": 785.5954806225955
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1188.2378390526756, "x": 1187.365060250919,
"y": 809.3374096594064 "y": 808.3920736491149
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1209.2057608601567, "x": 1208.3744259668497,
"y": 832.8709475552462 "y": 831.9069690323043
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1229.3448002632733, "x": 1228.55114497549,
"y": 857.0674364841201 "y": 856.0821092026897
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1248.6203785442863, "x": 1247.861154785818,
"y": 881.8699832733486 "y": 880.8600315612556
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1266.9973821590536, "x": 1266.269876680095,
"y": 907.2222527041721 "y": 906.183842935323
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1284.4401344692822, "x": 1283.742197114179,
"y": 933.0684678050294 "y": 931.997208106132
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1300.9123539842592, "x": 1300.2424394497762,
"y": 959.3534192837141 "y": 958.244350102122
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1316.3770951840902, "x": 1315.7343221961748,
"y": 986.0224809214067 "y": 984.8700596310855
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1330.796667754822, "x": 1330.1808998334795,
"y": 1013.0216268521107 "y": 1011.8197104741997
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1344.1325297827989, "x": 1343.5444820477373,
"y": 1040.2974452621988 "y": 1039.0392767654812
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1356.3451502749065, "x": 1355.786526925293,
"y": 1067.7971410001053 "y": 1066.4753466912885
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1367.393836528276, "x": 1366.8675034730315,
"y": 1095.4685166974318 "y": 1094.075125100061
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1377.236522737057, "x": 1376.746718988085,
"y": 1123.259918081096 "y": 1121.7864146234008
},
{
"type": "QPointF",
"x": 1385.3821076646018,
"y": 1149.5575609882246
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -517,8 +527,8 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1391.2039211231315, "x": 1391.2011016775252,
"y": 1170.9444368424918 "y": 1170.934034850861
} }
] ]
} }

View File

@ -2,125 +2,149 @@
"vector": [ "vector": [
{ {
"angle": 2, "angle": 2,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1122.8447244094489, "x": 1122.8447244094489,
"y": 91.85612598425197 "y": 91.85612598425197
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1122.8447244094489, "x": 1122.8447244094489,
"y": -664.0493858267716 "y": -664.0493858267716
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1122.8447244094489, "x": 1122.8447244094489,
"y": -664.0493858267716 "y": -664.0493858267716
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1123.2605071010314, "x": 1123.2605071010314,
"y": -692.1027566151841 "y": -692.1027566151841
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1125.5521344988651, "x": 1125.5521344988651,
"y": -746.904953834852 "y": -746.904953834852
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1129.5018897097445, "x": 1129.5018897097445,
"y": -800.813185020781 "y": -800.813185020781
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1135.005387617497, "x": 1135.005387617497,
"y": -854.573547056137 "y": -854.573547056137
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1141.9582431059482, "x": 1141.9582431059482,
"y": -908.9321368240863 "y": -908.9321368240863
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1150.2560710589246, "x": 1150.2560710589246,
"y": -964.635051207795 "y": -964.635051207795
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1164.860792708483, "x": 1164.860792708483,
"y": -1051.9409225168733 "y": -1051.9409225168733
}, },
{ {
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1176.2406858386873, "x": 1176.2406858386873,
"y": -1114.83483747791 "y": -1114.83483747791
}, },
{ {
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1176.2406858386873, "x": 1176.2406858386873,
"y": -1114.83483747791 "y": -1114.83483747791
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1179.7035125223924, "x": 1179.7035125223924,
"y": -1136.9452686438185 "y": -1136.9452686438185
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1186.627664934387, "x": 1186.627664934387,
"y": -1177.145289266175 "y": -1177.145289266175
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1197.298845134993, "x": 1197.298845134993,
"y": -1231.2802973446833 "y": -1231.2802973446833
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1213.068331853193, "x": 1213.068331853193,
"y": -1298.0112723855073 "y": -1298.0112723855073
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1231.8133334949034, "x": 1231.8133334949034,
"y": -1369.0339174169235 "y": -1369.0339174169235
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1242.934050298766, "x": 1242.934050298766,
"y": -1410.35475 "y": -1410.35475
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1242.934050298766, "x": 1242.934050298766,
"y": -1410.35475 "y": -1410.35475
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2006.3092913385829, "x": 2006.3092913385829,
"y": -1344.3643464566928 "y": -1344.3643464566928
}, },
{ {
"saAfter": 56.69291338582678, "saAfter": 56.69291338582678,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2006.3092913385829, "x": 2006.3092913385829,
"y": -664.0493858267716 "y": -664.0493858267716
}, },
{ {
"saBefore": 56.69291338582678, "saBefore": 56.69291338582678,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2006.3092913385829, "x": 2006.3092913385829,
"y": 91.85612598425197 "y": 91.85612598425197

View File

@ -5,6 +5,11 @@
"x": 1085.0694887145344, "x": 1085.0694887145344,
"y": 129.65140157480317 "y": 129.65140157480317
}, },
{
"type": "QPointF",
"x": 1085.0494435032829,
"y": 91.85612598425197
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 1085.4656504337784, "x": 1085.4656504337784,
@ -12,28 +17,28 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1087.857898937872, "x": 1087.7898601657712,
"y": -749.6667399304415 "y": -748.4840339969
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1091.9031145734355, "x": 1091.8076541487517,
"y": -804.6622063529023 "y": -803.5749711163705
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1097.515539595737, "x": 1097.406612481188,
"y": -859.3687688728184 "y": -858.4225683882584
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1104.5754685306931, "x": 1104.4683950841882,
"y": -914.5008909056683 "y": -913.7273586407676
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1112.978768668652, "x": 1112.8732964836695,
"y": -970.8708818236878 "y": -970.2038052893769
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -42,18 +47,23 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1149.5459641167045, "x": 1142.4715598772536,
"y": -1184.4548940046989 "y": -1143.4463884855134
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1160.5166586790917, "x": 1149.3808605824634,
"y": -1239.9724556778692 "y": -1183.5607722982636
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1176.5244363705685, "x": 1160.2171443173104,
"y": -1307.6563001159316 "y": -1238.589902083207
},
{
"type": "QPointF",
"x": 1176.2861453972919,
"y": -1306.7034307186932
}, },
{ {
"type": "QPointF", "type": "QPointF",

View File

@ -2,124 +2,148 @@
"vector": [ "vector": [
{ {
"angle": 2, "angle": 2,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1122.8447244094489, "x": 1122.8447244094489,
"y": 91.85612598425197 "y": 91.85612598425197
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1122.8447244094489, "x": 1122.8447244094489,
"y": -664.0493858267716 "y": -664.0493858267716
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1122.8447244094489, "x": 1122.8447244094489,
"y": -664.0493858267716 "y": -664.0493858267716
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1123.2605071010314, "x": 1123.2605071010314,
"y": -692.1027566151841 "y": -692.1027566151841
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1125.5521344988651, "x": 1125.5521344988651,
"y": -746.904953834852 "y": -746.904953834852
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1129.5018897097445, "x": 1129.5018897097445,
"y": -800.813185020781 "y": -800.813185020781
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1135.005387617497, "x": 1135.005387617497,
"y": -854.573547056137 "y": -854.573547056137
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1141.9582431059482, "x": 1141.9582431059482,
"y": -908.9321368240863 "y": -908.9321368240863
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1150.2560710589246, "x": 1150.2560710589246,
"y": -964.635051207795 "y": -964.635051207795
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1164.860792708483, "x": 1164.860792708483,
"y": -1051.9409225168733 "y": -1051.9409225168733
}, },
{ {
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1176.2406858386873, "x": 1176.2406858386873,
"y": -1114.83483747791 "y": -1114.83483747791
}, },
{ {
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1176.2406858386873, "x": 1176.2406858386873,
"y": -1114.83483747791 "y": -1114.83483747791
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1179.7035125223924, "x": 1179.7035125223924,
"y": -1136.9452686438185 "y": -1136.9452686438185
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1186.627664934387, "x": 1186.627664934387,
"y": -1177.145289266175 "y": -1177.145289266175
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1197.298845134993, "x": 1197.298845134993,
"y": -1231.2802973446833 "y": -1231.2802973446833
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1213.068331853193, "x": 1213.068331853193,
"y": -1298.0112723855073 "y": -1298.0112723855073
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1231.8133334949034, "x": 1231.8133334949034,
"y": -1369.0339174169235 "y": -1369.0339174169235
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1242.934050298766, "x": 1242.934050298766,
"y": -1410.35475 "y": -1410.35475
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 1242.934050298766, "x": 1242.934050298766,
"y": -1410.35475 "y": -1410.35475
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2006.3092913385829, "x": 2006.3092913385829,
"y": -1344.3643464566928 "y": -1344.3643464566928
}, },
{ {
"saAfter": 56.69291338582678, "saAfter": 56.69291338582678,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2006.3092913385829, "x": 2006.3092913385829,
"y": -664.0493858267716 "y": -664.0493858267716
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": 2006.3092913385829, "x": 2006.3092913385829,
"y": 91.85612598425197 "y": 91.85612598425197

View File

@ -5,6 +5,11 @@
"x": 1085.0694887145344, "x": 1085.0694887145344,
"y": 129.65140157480317 "y": 129.65140157480317
}, },
{
"type": "QPointF",
"x": 1085.0494435032829,
"y": 91.85612598425197
},
{ {
"type": "QPointF", "type": "QPointF",
"x": 1085.4656504337784, "x": 1085.4656504337784,
@ -12,28 +17,28 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1087.857898937872, "x": 1087.7898601657712,
"y": -749.6667399304415 "y": -748.4840339969
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1091.9031145734355, "x": 1091.8076541487517,
"y": -804.6622063529023 "y": -803.5749711163705
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1097.515539595737, "x": 1097.406612481188,
"y": -859.3687688728184 "y": -858.4225683882584
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1104.5754685306931, "x": 1104.4683950841882,
"y": -914.5008909056683 "y": -913.7273586407676
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1112.978768668652, "x": 1112.8732964836695,
"y": -970.8708818236878 "y": -970.2038052893769
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -42,18 +47,23 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1149.5459641167045, "x": 1142.4715598772536,
"y": -1184.4548940046989 "y": -1143.4463884855134
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1160.5166586790917, "x": 1149.3808605824634,
"y": -1239.9724556778692 "y": -1183.5607722982636
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": 1176.5244363705685, "x": 1160.2171443173104,
"y": -1307.6563001159316 "y": -1238.589902083207
},
{
"type": "QPointF",
"x": 1176.2861453972919,
"y": -1306.7034307186932
}, },
{ {
"type": "QPointF", "type": "QPointF",

View File

@ -3,6 +3,7 @@
{ {
"saAfter": 0, "saAfter": 0,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -814.7149606299213, "x": -814.7149606299213,
"y": 331.31319685039375 "y": 331.31319685039375
@ -10,19 +11,23 @@
{ {
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 0, "saBefore": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -814.7149606299213, "x": -814.7149606299213,
"y": -8.844283464566928 "y": -8.844283464566928
}, },
{ {
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 0, "saBefore": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -814.7149606299213, "x": -814.7149606299213,
"y": -8.844283464566928 "y": -8.844283464566928
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -31,6 +36,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -39,6 +45,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -47,6 +54,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -55,6 +63,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -63,6 +72,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -71,6 +81,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -79,6 +90,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -87,6 +99,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -95,6 +108,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -102,84 +116,103 @@
"y": -69.04225265620269 "y": -69.04225265620269
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -590.4629921259842, "x": -590.4629921259842,
"y": -72.52932283464567 "y": -72.52932283464567
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -590.4629921259842, "x": -590.4629921259842,
"y": -72.52932283464567 "y": -72.52932283464567
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -231.11800695198497, "x": -231.11800695198497,
"y": 95.87915857519384 "y": 95.87915857519384
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -231.11800695198497, "x": -231.11800695198497,
"y": 95.87915857519384 "y": 95.87915857519384
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -238.40281543387266, "x": -238.40281543387266,
"y": 116.44191216638788 "y": 116.44191216638788
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -251.05490182747536, "x": -251.05490182747536,
"y": 155.85530707633535 "y": 155.85530707633535
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -261.5198582532174, "x": -261.5198582532174,
"y": 193.3982017541216 "y": 193.3982017541216
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -269.9242477292619, "x": -269.9242477292619,
"y": 229.27507897171068 "y": 229.27507897171068
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -276.39463327377155, "x": -276.39463327377155,
"y": 263.69042150106657 "y": 263.69042150106657
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -281.0575779049093, "x": -281.0575779049093,
"y": 296.8487121141533 "y": 296.8487121141533
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -284.03964464083833, "x": -284.03964464083833,
"y": 328.95443358293466 "y": 328.95443358293466
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -284.1473856336994, "x": -284.1473856336994,
"y": 331.31319685039375 "y": 331.31319685039375
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -284.1473856336994, "x": -284.1473856336994,
"y": 331.31319685039375 "y": 331.31319685039375
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -284.1473856336994, "x": -284.1473856336994,
"y": 331.31319685039375 "y": 331.31319685039375
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -188,6 +221,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -196,6 +230,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -204,6 +239,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -212,6 +248,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -220,6 +257,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -228,6 +266,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -236,6 +275,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -244,6 +284,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -252,6 +293,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -260,6 +302,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -268,6 +311,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -276,6 +320,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -284,6 +329,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -292,6 +338,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -300,6 +347,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -308,6 +356,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -316,6 +365,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -324,6 +374,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -332,6 +383,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -340,6 +392,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -348,6 +401,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -356,6 +410,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -364,6 +419,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -372,6 +428,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -380,6 +437,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -388,6 +446,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -396,6 +455,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -404,6 +464,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -412,6 +473,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -420,6 +482,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -428,6 +491,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -436,6 +500,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -444,6 +509,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -452,6 +518,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -460,6 +527,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -467,8 +535,10 @@
"y": 331.90352529002166 "y": 331.90352529002166
}, },
{ {
"curvePoint": true,
"saAfter": 0, "saAfter": 0,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -814.7149606299213, "x": -814.7149606299213,
"y": 331.31319685039375 "y": 331.31319685039375

View File

@ -1,10 +1,30 @@
{ {
"vector": [ "vector": [
{
"type": "QPointF",
"x": -838.7026077978918,
"y": 360.52065549216434
},
{
"type": "QPointF",
"x": -815.5965354330709,
"y": 331.31319685039375
},
{
"type": "QPointF",
"x": -815.5965354330709,
"y": 28.923105387765915
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -815.5965354330709, "x": -815.5965354330709,
"y": -46.674417477891 "y": -46.674417477891
}, },
{
"type": "QPointF",
"x": -814.2667801920632,
"y": -46.77051665539527
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -778.5602746831936, "x": -778.5602746831936,
@ -35,6 +55,11 @@
"x": -652.0000133582188, "x": -652.0000133582188,
"y": -80.53001488530833 "y": -80.53001488530833
}, },
{
"type": "QPointF",
"x": -647.5347421078782,
"y": -82.70049226350477
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -631.5852394687809, "x": -631.5852394687809,
@ -140,46 +165,91 @@
"x": -374.97963878344376, "x": -374.97963878344376,
"y": 385.6272715746786 "y": 385.6272715746786
}, },
{
"type": "QPointF",
"x": -394.4224543531813,
"y": 386.9889713429367
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -414.7876067251059, "x": -414.7876067251059,
"y": 388.13579550460213 "y": 388.13579550460213
}, },
{
"type": "QPointF",
"x": -435.9520270040894,
"y": 389.07661798449516
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -457.7859582653625, "x": -457.7859582653625,
"y": 389.818484035946 "y": 389.818484035946
}, },
{
"type": "QPointF",
"x": -480.15529936788164,
"y": 390.3673559353522
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -502.9230721502445, "x": -502.9230721502445,
"y": 390.728524359008 "y": 390.728524359008
}, },
{
"type": "QPointF",
"x": -525.9503830211974,
"y": 390.90684349642925
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -549.0970864147907, "x": -549.0970864147907,
"y": 390.9068680348474 "y": 390.9068680348474
}, },
{
"type": "QPointF",
"x": -572.2222728858704,
"y": 390.7329321107656
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -595.1846601171007, "x": -595.1846601171007,
"y": 390.3891909827686 "y": 390.3891909827686
}, },
{
"type": "QPointF",
"x": -617.8429427582322,
"y": 389.87963542037477
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -640.0561486385066, "x": -640.0561486385066,
"y": 389.208081776043 "y": 389.208081776043
}, },
{
"type": "QPointF",
"x": -661.6840517509004,
"y": 388.3781346110808
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -682.5877079123347, "x": -682.5877079123347,
"y": 387.3931112039713 "y": 387.3931112039713
}, },
{
"type": "QPointF",
"x": -702.630213618707,
"y": 386.255904969502
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -721.6778577696439, "x": -721.6778577696439,
"y": 384.9687413227849 "y": 384.9687413227849
}, },
{
"type": "QPointF",
"x": -739.6019742862287,
"y": 383.5327301728105
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -756.2820913691256, "x": -756.2820913691256,
@ -207,13 +277,28 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": -815.5965354330709, "x": -818.0929557813755,
"y": 371.9998875942574 "y": 371.2795759163598
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": -815.5965354330709, "x": -823.6929755287612,
"y": -46.674417477891 "y": 369.27180555079025
},
{
"type": "QPointF",
"x": -829.5753368833404,
"y": 366.62694879394627
},
{
"type": "QPointF",
"x": -835.8151397150936,
"y": 362.8920896668543
},
{
"type": "QPointF",
"x": -838.7026077978918,
"y": 360.52065549216434
} }
] ]
} }

View File

@ -3,6 +3,7 @@
{ {
"saAfter": 151.18110236220474, "saAfter": 151.18110236220474,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -814.7149606299213, "x": -814.7149606299213,
"y": 331.31319685039375 "y": 331.31319685039375
@ -10,19 +11,23 @@
{ {
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 0, "saBefore": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -814.7149606299213, "x": -814.7149606299213,
"y": -8.844283464566928 "y": -8.844283464566928
}, },
{ {
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 0, "saBefore": 0,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -814.7149606299213, "x": -814.7149606299213,
"y": -8.844283464566928 "y": -8.844283464566928
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -31,6 +36,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -39,6 +45,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -47,6 +54,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -55,6 +63,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -63,6 +72,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -71,6 +81,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -79,6 +90,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -87,6 +99,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -95,6 +108,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -102,84 +116,103 @@
"y": -69.04225265620269 "y": -69.04225265620269
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -590.4629921259842, "x": -590.4629921259842,
"y": -72.52932283464567 "y": -72.52932283464567
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -590.4629921259842, "x": -590.4629921259842,
"y": -72.52932283464567 "y": -72.52932283464567
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -231.11800695198497, "x": -231.11800695198497,
"y": 95.87915857519384 "y": 95.87915857519384
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -231.11800695198497, "x": -231.11800695198497,
"y": 95.87915857519384 "y": 95.87915857519384
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -238.40281543387266, "x": -238.40281543387266,
"y": 116.44191216638788 "y": 116.44191216638788
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -251.05490182747536, "x": -251.05490182747536,
"y": 155.85530707633535 "y": 155.85530707633535
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -261.5198582532174, "x": -261.5198582532174,
"y": 193.3982017541216 "y": 193.3982017541216
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -269.9242477292619, "x": -269.9242477292619,
"y": 229.27507897171068 "y": 229.27507897171068
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -276.39463327377155, "x": -276.39463327377155,
"y": 263.69042150106657 "y": 263.69042150106657
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -281.0575779049093, "x": -281.0575779049093,
"y": 296.8487121141533 "y": 296.8487121141533
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -284.03964464083833, "x": -284.03964464083833,
"y": 328.95443358293466 "y": 328.95443358293466
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -284.1473856336994, "x": -284.1473856336994,
"y": 331.31319685039375 "y": 331.31319685039375
}, },
{ {
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -284.1473856336994, "x": -284.1473856336994,
"y": 331.31319685039375 "y": 331.31319685039375
}, },
{ {
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -284.1473856336994, "x": -284.1473856336994,
"y": 331.31319685039375 "y": 331.31319685039375
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -188,6 +221,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -196,6 +230,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -204,6 +239,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -212,6 +248,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -220,6 +257,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -228,6 +266,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -236,6 +275,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -244,6 +284,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -252,6 +293,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -260,6 +302,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -268,6 +311,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -276,6 +320,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -284,6 +329,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -292,6 +338,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -300,6 +347,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -308,6 +356,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -316,6 +365,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -324,6 +374,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -332,6 +383,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -340,6 +392,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -348,6 +401,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -356,6 +410,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -364,6 +419,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -372,6 +428,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -380,6 +437,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -388,6 +446,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -396,6 +455,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -404,6 +464,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -412,6 +473,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -420,6 +482,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -428,6 +491,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -436,6 +500,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -444,6 +509,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -452,6 +518,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -460,6 +527,7 @@
}, },
{ {
"angle": 6, "angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185, "saAfter": 37.795275590551185,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"type": "VSAPoint", "type": "VSAPoint",
@ -467,8 +535,10 @@
"y": 331.90352529002166 "y": 331.90352529002166
}, },
{ {
"curvePoint": true,
"saAfter": 151.18110236220474, "saAfter": 151.18110236220474,
"saBefore": 37.795275590551185, "saBefore": 37.795275590551185,
"turnPoint": true,
"type": "VSAPoint", "type": "VSAPoint",
"x": -814.7149606299213, "x": -814.7149606299213,
"y": 331.31319685039375 "y": 331.31319685039375

View File

@ -2,8 +2,18 @@
"vector": [ "vector": [
{ {
"type": "QPointF", "type": "QPointF",
"x": -947.2972331766374, "x": -920.795365621608,
"y": 289.2203760039845 "y": 293.099106295665
},
{
"type": "QPointF",
"x": -941.498251666416,
"y": 276.0961368866333
},
{
"type": "QPointF",
"x": -831.8430732289739,
"y": 27.924836507053584
}, },
{ {
"type": "QPointF", "type": "QPointF",
@ -40,6 +50,11 @@
"x": -652.0000133582188, "x": -652.0000133582188,
"y": -80.53001488530833 "y": -80.53001488530833
}, },
{
"type": "QPointF",
"x": -647.5347421078782,
"y": -82.70049226350477
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -631.5852394687809, "x": -631.5852394687809,
@ -145,46 +160,91 @@
"x": -374.97963878344376, "x": -374.97963878344376,
"y": 385.6272715746786 "y": 385.6272715746786
}, },
{
"type": "QPointF",
"x": -394.4224543531813,
"y": 386.9889713429367
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -414.7876067251059, "x": -414.7876067251059,
"y": 388.13579550460213 "y": 388.13579550460213
}, },
{
"type": "QPointF",
"x": -435.9520270040894,
"y": 389.07661798449516
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -457.7859582653625, "x": -457.7859582653625,
"y": 389.818484035946 "y": 389.818484035946
}, },
{
"type": "QPointF",
"x": -480.15529936788164,
"y": 390.3673559353522
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -502.9230721502445, "x": -502.9230721502445,
"y": 390.728524359008 "y": 390.728524359008
}, },
{
"type": "QPointF",
"x": -525.9503830211974,
"y": 390.90684349642925
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -549.0970864147907, "x": -549.0970864147907,
"y": 390.9068680348474 "y": 390.9068680348474
}, },
{
"type": "QPointF",
"x": -572.2222728858704,
"y": 390.7329321107656
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -595.1846601171007, "x": -595.1846601171007,
"y": 390.3891909827686 "y": 390.3891909827686
}, },
{
"type": "QPointF",
"x": -617.8429427582322,
"y": 389.87963542037477
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -640.0561486385066, "x": -640.0561486385066,
"y": 389.208081776043 "y": 389.208081776043
}, },
{
"type": "QPointF",
"x": -661.6840517509004,
"y": 388.3781346110808
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -682.5877079123347, "x": -682.5877079123347,
"y": 387.3931112039713 "y": 387.3931112039713
}, },
{
"type": "QPointF",
"x": -702.630213618707,
"y": 386.255904969502
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -721.6778577696439, "x": -721.6778577696439,
"y": 384.9687413227849 "y": 384.9687413227849
}, },
{
"type": "QPointF",
"x": -739.6019742862287,
"y": 383.5327301728105
},
{ {
"type": "QPointF", "type": "QPointF",
"x": -756.2820913691256, "x": -756.2820913691256,
@ -222,13 +282,18 @@
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": -830.3240189199333, "x": -829.5753368833404,
"y": 366.2903226290697 "y": 366.62694879394627
}, },
{ {
"type": "QPointF", "type": "QPointF",
"x": -947.2972331766374, "x": -835.8151397150936,
"y": 289.2203760039845 "y": 362.8920896668543
},
{
"type": "QPointF",
"x": -920.795365621608,
"y": 293.099106295665
} }
] ]
} }

Some files were not shown because too many files have changed in this diff Show More