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 option Hide labels.
- Improve segmenting a curve for calculating a piece path.
- [smart-pattern/valentina#184] Fix incorrect seam allowance.
# Valentina 0.7.52 September 12, 2022
- Fix crash when default locale is ru.

View File

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

View File

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

View File

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

View File

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

View File

@ -39,6 +39,7 @@
#include "../ifc/exception/vexceptionconversionerror.h"
#include "../vpatterndb/floatItemData/floatitemdef.h"
#include "../vgeometry/vgeometrydef.h"
#include "../vgeometry/vlayoutplacelabel.h"
#include "../layout/vplayout.h"
#include "../layout/vppiece.h"
@ -169,20 +170,6 @@ auto StringToRect(const QString &string) -> QRectF
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
//---------------------------------------------------------------------------------------------------------------------
@ -499,7 +486,7 @@ void VPLayoutFileReader::ReadPiece(const VPPiecePtr &piece)
switch (tags.indexOf(name().toString()))
{
case 0: // seam line
piece->SetCountourPoints(StringToPath(readElementText()));
ReadSeamLine(piece);
break;
case 1: // seam allowance
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)
{
@ -537,18 +568,15 @@ void VPLayoutFileReader::ReadSeamAllowance(const VPPiecePtr &piece)
piece->SetSeamAllowance(enabled);
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()));
}
piece->SetSeamAllowancePoints(path);
throw VException(tr("Error in line %1. Seam allowance is empty.").arg(lineNumber()));
}
piece->SetSeamAllowancePoints(path);
}
}
@ -658,7 +686,7 @@ auto VPLayoutFileReader::ReadInternalPath() -> VLayoutPiecePath
path.SetCutPath(ReadAttributeBool(attribs, ML::AttrCut, falseStr));
path.SetPenStyle(LineStyleToPenStyle(ReadAttributeString(attribs, ML::AttrPenStyle, TypeLineLine)));
QVector<QPointF> shape = StringToPath(readElementText());
QVector<VLayoutPoint> shape = ReadLayoutPoints();
if (shape.isEmpty())
{
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();
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.center = StringToPoint(ReadAttributeEmptyString(attribs, ML::AttrCenter));
marker.box = 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;
marker.SetType(static_cast<PlaceLabelType>(ReadAttributeUInt(attribs, ML::AttrType, QChar('0'))));
marker.SetCenter(StringToPoint(ReadAttributeEmptyString(attribs, ML::AttrCenter)));
marker.SetBox(StringToRect(ReadAttributeEmptyString(attribs, ML::AttrBox)));
// cppcheck-suppress unknownMacro
QT_WARNING_POP

View File

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

View File

@ -35,6 +35,7 @@
#include "../vmisc/projectversion.h"
#include "../vlayout/vlayoutpiecepath.h"
#include "../vlayout/vtextmanager.h"
#include "../vgeometry/vlayoutplacelabel.h"
namespace
{
@ -93,18 +94,6 @@ auto RectToString(const QRectF &r) -> QString
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
{
@ -284,7 +273,11 @@ void VPLayoutFileWriter::WritePiece(const VPPiecePtr &piece)
[](qreal z) noexcept {return VFuzzyComparePossibleNulls(z, 1.0);});
writeStartElement(ML::TagSeamLine);
writeCharacters(PathToString(piece->GetContourPoints()));
QVector<VLayoutPoint> contourPoints = piece->GetContourPoints();
for (auto &point : contourPoints)
{
WriteLayoutPoint(point);
}
writeEndElement();
writeStartElement(ML::TagSeamAllowance);
@ -294,7 +287,11 @@ void VPLayoutFileWriter::WritePiece(const VPPiecePtr &piece)
[](bool builtin) noexcept {return not builtin;});
if (piece->IsSeamAllowance() && not piece->IsSeamAllowanceBuiltIn())
{
writeCharacters(PathToString(piece->GetSeamAllowancePoints()));
QVector<VLayoutPoint> seamAllowancePoints = piece->GetSeamAllowancePoints();
for (auto &point : seamAllowancePoints)
{
WriteLayoutPoint(point);
}
}
writeEndElement();
@ -329,7 +326,13 @@ void VPLayoutFileWriter::WritePiece(const VPPiecePtr &piece)
writeStartElement(ML::TagInternalPath);
SetAttribute(ML::AttrCut, path.IsCutPath());
SetAttribute(ML::AttrPenStyle, PenStyleToLineStyle(path.PenStyle()));
writeCharacters(PathToString(path.Points()));
QVector<VLayoutPoint> points = path.Points();
for (auto &point : points)
{
WriteLayoutPoint(point);
}
writeEndElement();
}
writeEndElement();
@ -339,12 +342,10 @@ void VPLayoutFileWriter::WritePiece(const VPPiecePtr &piece)
for (const auto& label : placelabels)
{
writeStartElement(ML::TagMarker);
SetAttribute(ML::AttrTransform, TransformToString(label.rotationMatrix));
SetAttribute(ML::AttrType, static_cast<int>(label.type));
SetAttribute(ML::AttrCenter, PointToString(label.center));
SetAttribute(ML::AttrBox, RectToString(label.box));
writeCharacters(MarkerShapeToString(label.shape));
SetAttribute(ML::AttrTransform, TransformToString(label.RotationMatrix()));
SetAttribute(ML::AttrType, static_cast<int>(label.Type()));
SetAttribute(ML::AttrCenter, PointToString(label.Center()));
SetAttribute(ML::AttrBox, RectToString(label.Box()));
writeEndElement();
}
writeEndElement();
@ -425,3 +426,14 @@ void VPLayoutFileWriter::WriteSize(QSizeF size)
SetAttribute(ML::AttrLength, length);
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 QMarginsF;
class VTextManager;
class VLayoutPoint;
class VPLayoutFileWriter : public QXmlStreamWriter
{
@ -68,6 +69,7 @@ private:
void WritePiece(const VPPiecePtr &piece);
void WriteLabel(const QVector<QPointF> &labelShape, const VTextManager &tm, const QString &tagName);
void WriteLabelLines(const VTextManager &tm);
auto WriteLayoutPoint(const VLayoutPoint &point) -> void;
void WriteMargins(const QMarginsF &margins, bool ignore);
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 TagScale = QStringLiteral("scale"); // 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 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 AttrTileNumber = QStringLiteral("tileNumber"); // 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 atRearStr = QStringLiteral("atRear"); // NOLINT(cert-err58-cpp)

View File

@ -65,6 +65,7 @@ extern const QString TagLines;
extern const QString TagLine;
extern const QString TagScale;
extern const QString TagWatermark;
extern const QString TagPoint;
extern const QString AttrWarningSuperposition;
extern const QString AttrWarningOutOfBound;
@ -113,6 +114,10 @@ extern const QString AttrShowPreview;
extern const QString AttrPrintScheme;
extern const QString AttrTileNumber;
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 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.9.0.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.4.0.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::AttrNodePassmarkAngle = QStringLiteral("passmarkAngle");
const QString VAbstractPattern::AttrNodeShowSecondPassmark = QStringLiteral("showSecondPassmark");
const QString VAbstractPattern::AttrNodeTurnPoint = QStringLiteral("turnPoint");
const QString VAbstractPattern::AttrSABefore = QStringLiteral("before");
const QString VAbstractPattern::AttrSAAfter = QStringLiteral("after");
const QString VAbstractPattern::AttrStart = QStringLiteral("start");
@ -811,6 +812,9 @@ VPieceNode VAbstractPattern::ParseSANode(const QDomElement &domElement)
const QString passmarkLength =
VDomDocument::GetParametrEmptyString(domElement, VAbstractPattern::AttrPassmarkLength);
const bool turnPoint =
VDomDocument::GetParametrBool(domElement, VAbstractPattern::AttrNodeTurnPoint, trueStr);
const QString t = VDomDocument::GetParametrString(domElement, AttrType, VAbstractPattern::NodePoint);
Tool tool;
@ -841,8 +845,7 @@ VPieceNode VAbstractPattern::ParseSANode(const QDomElement &domElement)
tool = Tool::NodeElArc;
break;
default:
VException e(QObject::tr("Wrong tag name '%1'.").arg(t));
throw e;
throw VException(tr("Wrong tag name '%1'.").arg(t));
}
VPieceNode node(id, tool, reverse);
node.SetFormulaSABefore(saBefore);
@ -856,6 +859,7 @@ VPieceNode VAbstractPattern::ParseSANode(const QDomElement &domElement)
node.SetPassmarkAngleType(passmarkAngle);
node.SetManualPassmarkLength(manualPassmarkLength);
node.SetFormulaPassmarkLength(passmarkLength);
node.SetTurnPoint(turnPoint);
return node;
}

View File

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

View File

@ -28,6 +28,7 @@
#include "vlayoutconverter.h"
#include "../exception/vexception.h"
#include "ifcdef.h"
#include "../vlayout/vlayoutpoint.h"
/*
* Version rules:
@ -38,12 +39,61 @@
*/
const QString VLayoutConverter::LayoutMinVerStr = QStringLiteral("0.1.0");
const QString VLayoutConverter::LayoutMaxVerStr = QStringLiteral("0.1.2");
const QString VLayoutConverter::CurrentSchema = QStringLiteral("://schema/layout/v0.1.2.xsd");
const QString VLayoutConverter::LayoutMaxVerStr = QStringLiteral("0.1.3");
const QString VLayoutConverter::CurrentSchema = QStringLiteral("://schema/layout/v0.1.3.xsd");
//VLayoutConverter::LayoutMinVer; // <== 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)
: 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, 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))
@ -108,10 +159,11 @@ void VLayoutConverter::ApplyPatches()
{
case (FormatVersion(0, 1, 0)):
case (FormatVersion(0, 1, 1)):
ToV0_1_2();
ValidateXML(XSDSchema(FormatVersion(0, 1, 2)));
Q_FALLTHROUGH();
case (FormatVersion(0, 1, 2)):
ToV0_1_3();
ValidateXML(XSDSchema(FormatVersion(0, 1, 3)));
Q_FALLTHROUGH();
case (FormatVersion(0, 1, 3)):
break;
default:
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
Q_STATIC_ASSERT_X(VLayoutConverter::LayoutMinVer < FormatVersion(0, 1, 2),
// 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.");
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();
}

View File

@ -44,7 +44,7 @@ public:
static const QString LayoutMaxVerStr;
static const QString CurrentSchema;
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:
void SetVersion(const QString &version) override;
@ -61,7 +61,11 @@ protected:
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:
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::PatternMaxVerStr = QStringLiteral("0.9.1");
const QString VPatternConverter::CurrentSchema = QStringLiteral("://schema/pattern/v0.9.1.xsd");
const QString VPatternConverter::PatternMaxVerStr = QStringLiteral("0.9.2");
const QString VPatternConverter::CurrentSchema = QStringLiteral("://schema/pattern/v0.9.2.xsd");
//VPatternConverter::PatternMinVer; // <== 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, 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, 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))
@ -374,6 +375,10 @@ void VPatternConverter::ApplyPatches()
ValidateXML(CurrentSchema);
Q_FALLTHROUGH();
case (FormatVersion(0, 9, 1)):
ToV0_9_2();
ValidateXML(CurrentSchema);
Q_FALLTHROUGH();
case (FormatVersion(0, 9, 2)):
break;
default:
InvalidVersion(m_ver);
@ -391,7 +396,7 @@ void VPatternConverter::DowngradeToCurrentMaxVersion()
bool VPatternConverter::IsReadOnly() const
{
// 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.");
// Possibly in future attribute readOnly will change position etc.
@ -562,6 +567,17 @@ void VPatternConverter::ToV0_9_1()
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()
{

View File

@ -53,7 +53,7 @@ public:
static const QString PatternMaxVerStr;
static const QString CurrentSchema;
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:
void Save() override;
@ -86,6 +86,7 @@ private:
void ToV0_8_8();
void ToV0_9_0();
void ToV0_9_1();
void ToV0_9_2();
void TagUnitToV0_2_0();
void TagIncrementToV0_2_0();

View File

@ -53,7 +53,9 @@
#endif // QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
#include "dxiface.h"
#include "../vlayout/vlayoutpiece.h"
#include "../vlayout/vlayoutpoint.h"
#include "../vgeometry/vgeometrydef.h"
#include "../vgeometry/vlayoutplacelabel.h"
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, layer1, (UTF8STRING("1"))) // 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, layer2, (UTF8STRING("2"))) // 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, layer5, (UTF8STRING("5"))) // 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
//---------------------------------------------------------------------------------------------------------------------
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())
{
outline = detail.GetMappedSeamAllowancePoints();
@ -692,8 +694,7 @@ auto VDxfEngine::ExportToAAMA(const QVector<VLayoutPiece> &details) -> bool
return false;
}
m_input = QSharedPointer<dx_iface>(new dx_iface(GetFileNameForLocale(), m_version, m_varMeasurement,
m_varInsunits));
m_input = QSharedPointer<dx_iface>::create(GetFileNameForLocale(), m_version, m_varMeasurement, m_varInsunits);
m_input->AddAAMAHeaderData();
if (m_version > DRW::AC1009)
{
@ -705,7 +706,8 @@ auto VDxfEngine::ExportToAAMA(const QVector<VLayoutPiece> &details) -> bool
for(auto detail : details)
{
auto *detailBlock = new dx_ifaceBlock();
auto detailBlock = QSharedPointer<dx_ifaceBlock>::create();
QString blockName = detail.GetName();
if (m_version <= DRW::AC1009)
@ -726,80 +728,98 @@ auto VDxfEngine::ExportToAAMA(const QVector<VLayoutPiece> &details) -> bool
ExportPieceText(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->layer = *layer1;
m_input->AddEntity(insert);
m_input->AddEntity(insert.take());
}
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);
if (e)
QVector<VLayoutPoint> points = PieceOutline(detail);
if (DRW_Entity *e = AAMAPolygon(points, *layer1, true))
{
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())
{
QVector<VLayoutPoint> points = detail.GetMappedContourPoints();
if (DRW_Entity *e = AAMAPolygon(detail.GetMappedContourPoints(), *layer8, true))
{
detailBlock->ent.push_back(e);
}
ExportTurnPoints(detailBlock, points);
ExportCurvePoints(detailBlock, points);
}
const QVector<QVector<QPointF>> drawIntCut = detail.MappedInternalPathsForCut(false);
for(const auto &intCut : drawIntCut)
const QVector<QVector<VLayoutPoint>> drawIntLine = detail.MappedInternalPathsForCut(false);
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);
}
ExportTurnPoints(detailBlock, intLine);
ExportCurvePoints(detailBlock, intLine);
}
const QVector<VLayoutPlaceLabel> labels = detail.GetMappedPlaceLabels();
const QVector<VLayoutPlaceLabel> labels = detail.GetPlaceLabels();
for(const auto &label : labels)
{
if (label.type != PlaceLabelType::Doubletree && label.type != PlaceLabelType::Button
&& label.type != PlaceLabelType::Circle)
if (label.Type() != PlaceLabelType::Doubletree && label.Type() != PlaceLabelType::Button
&& 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);
}
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)
{
if (DRW_Entity *e = AAMAPolygon(intCut, *layer11, false))
{
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())
{
@ -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();
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 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)
{
if (label.type == PlaceLabelType::Doubletree || label.type == PlaceLabelType::Button
|| label.type == PlaceLabelType::Circle)
if (label.Type() == PlaceLabelType::Doubletree || label.Type() == PlaceLabelType::Button
|| label.Type() == PlaceLabelType::Circle)
{
const QPointF center = detail.GetMatrix().map(label.center);
auto *point = new DRW_Point();
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);
const QPointF center = detail.GetMatrix().map(label.Center());
detailBlock->ent.push_back(AAMAPoint(center, *layer13));
}
}
}
@ -906,7 +921,7 @@ auto VDxfEngine::ExportToASTM(const QVector<VLayoutPiece> &details) -> bool
for(auto detail : details)
{
auto *detailBlock = new dx_ifaceBlock();
auto detailBlock = QSharedPointer<dx_ifaceBlock>::create();
QString blockName = detail.GetName();
if (m_version <= DRW::AC1009)
@ -929,44 +944,45 @@ auto VDxfEngine::ExportToASTM(const QVector<VLayoutPiece> &details) -> bool
ExportASTMDrill(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->layer = *layer1;
m_input->AddEntity(insert);
m_input->AddEntity(insert.take());
}
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
DRW_Entity *e = AAMAPolygon(pieceBoundary, *layer1, true);
if (e)
if (DRW_Entity *e = AAMAPolygon(pieceBoundary, *layer1, true))
{
detailBlock->ent.push_back(e);
}
ExportTurnPoints(detailBlock, pieceBoundary);
ExportCurvePoints(detailBlock, pieceBoundary);
// Piece boundary quality validation curves
DRW_Entity *q = AAMAPolygon(pieceBoundary, *layer84, true);
if (q)
if (DRW_Entity *q = AAMAPolygon(pieceBoundary, *layer84, true))
{
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())
{
QVector<QPointF> sewLine = detail.GetMappedContourPoints();
QVector<VLayoutPoint> sewLine = detail.GetMappedContourPoints();
// Sew lines
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);
}
ExportTurnPoints(detailBlock, sewLine);
ExportCurvePoints(detailBlock, sewLine);
// Sew lines quality validation curves
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);
for(const auto &intCut : drawIntCut)
const QVector<QVector<VLayoutPoint>> drawIntLine = detail.MappedInternalPathsForCut(false);
for(const auto &intLine : drawIntLine)
{
// Internal line
if (DRW_Entity *e = AAMAPolygon(intCut, *layer8, false))
if (DRW_Entity *e = AAMAPolygon(intLine, *layer8, false))
{
detailBlock->ent.push_back(e);
}
ExportTurnPoints(detailBlock, intLine);
ExportCurvePoints(detailBlock, intLine);
// 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);
}
}
const QVector<VLayoutPlaceLabel> labels = detail.GetMappedPlaceLabels();
const QVector<VLayoutPlaceLabel> labels = detail.GetPlaceLabels();
for(const auto &label : labels)
{
if (label.type != PlaceLabelType::Doubletree && label.type != PlaceLabelType::Button
&& label.type != PlaceLabelType::Circle)
if (label.Type() != PlaceLabelType::Doubletree && label.Type() != PlaceLabelType::Button
&& 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)
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);
}
ExportTurnPoints(detailBlock, p);
ExportCurvePoints(detailBlock, p);
// Internal lines quality validation curves
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)
{
// Internal cutout
@ -1037,6 +1063,9 @@ void VDxfEngine::ExportASTMInternalCutout(dx_ifaceBlock *detailBlock, const VLay
detailBlock->ent.push_back(e);
}
ExportTurnPoints(detailBlock, intCut);
ExportCurvePoints(detailBlock, intCut);
// Internal cutouts quality validation curves
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();
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)
{
if (label.type == PlaceLabelType::Doubletree || label.type == PlaceLabelType::Button
|| label.type == PlaceLabelType::Circle)
if (label.Type() == PlaceLabelType::Doubletree || label.Type() == PlaceLabelType::Button
|| label.Type() == PlaceLabelType::Circle)
{
const QPointF center = detail.GetMatrix().map(label.center);
auto *point = new DRW_Point();
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);
const QPointF center = detail.GetMatrix().map(label.Center());
detailBlock->ent.push_back(AAMAPoint(center, *layer13));
// TODO. Investigate drill category
// 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())
{
@ -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())
{
@ -1186,6 +1237,16 @@ auto VDxfEngine::AAMAText(const QPointF &pos, const QString &text, const UTF8STR
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
{
@ -1203,8 +1264,9 @@ auto VDxfEngine::GetFileNameForLocale() const -> std::string
}
//---------------------------------------------------------------------------------------------------------------------
template<class P, class V>
auto VDxfEngine::CreateAAMAPolygon(const QVector<QPointF> &polygon, const UTF8STRING &layer, bool forceClosed) -> P *
template<class P, class V, class C>
auto VDxfEngine::CreateAAMAPolygon(const QVector<C> &polygon, const UTF8STRING &layer,
bool forceClosed) -> P *
{
auto *poly = new P();
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),
FromPixel(GetSize().height() - p.y(), m_varInsunits)));

View File

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

View File

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

View File

@ -93,64 +93,3 @@ QDataStream &operator>>(QDataStream &dataStream, VLayoutPassmark &data)
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
};
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
{
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_p.h"
#include "../vpatterndb/vcontainer.h"
#include "varc.h"
#include <qnumeric.h>
#include <QPolygonF>
@ -240,198 +239,3 @@ VPlaceLabelItem &VPlaceLabelItem::operator=(VPlaceLabelItem &&item) Q_DECL_NOTHR
return *this;
}
#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;
QRectF Box() const;
PlaceLabelImg LabelShape() const;
QPainterPath LabelShapePath() const;
static QPainterPath LabelShapePath(const PlaceLabelImg &shape);
private:
QSharedDataPointer<VPlaceLabelItemData> d;
};

View File

@ -30,6 +30,8 @@
#include "vabstractpiece_p.h"
#include "../vmisc/vabstractvalapplication.h"
#include "../vgeometry/vpointf.h"
#include "../vgeometry/vlayoutplacelabel.h"
#include "../vgeometry/varc.h"
#include "../ifc/exception/vexception.h"
#include "../vmisc/compatibility.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.";
}
points.append(px);
VRawSAPoint sp(px, p.CurvePoint(), p.TurnPoint());
sp.SetPrimary(true);
points.append(sp);
cutLine.setAngle(cutLine.angle()-180);
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.";
}
points.append(px);
sp = VRawSAPoint(px, p.CurvePoint(), p.TurnPoint());
sp.SetPrimary(true);
points.append(sp);
}
else
{// The point just fine
points.append(sp2);
points.append(VRawSAPoint(sp2, p.CurvePoint(), p.TurnPoint()));
}
}
else
@ -139,25 +145,25 @@ auto AngleByLength(QVector<VRawSAPoint> points, QPointF p1, QPointF p2, QPointF
{
QLineF loop(bigLine1.p2(), sp2);
loop.setLength(loop.length() + accuracyPointOnLine*2.);
points.append(loop.p2());
points.append(sp2);
points.append(VRawSAPoint(bigLine1.p2(), true));
points.append(VRawSAPoint(loop.p2(), p.CurvePoint(), p.TurnPoint()));
points.append(VRawSAPoint(sp2, p.CurvePoint(), p.TurnPoint()));
points.append(VRawSAPoint(bigLine1.p2(), p.CurvePoint(), p.TurnPoint(), true));
loop = QLineF(bigLine2.p2(), sp2);
loop.setLength(loop.length() + localWidth);
points.append(VRawSAPoint(loop.p2(), true));
points.append(VRawSAPoint(loop.p2(), p.CurvePoint(), p.TurnPoint(), true));
}
else
{
QLineF loop(sp2, bigLine1.p1());
loop.setLength(accuracyPointOnLine*2.);
points.append(loop.p2());
points.append(sp2);
points.append(VRawSAPoint(loop.p2(), p.CurvePoint(), p.TurnPoint()));
points.append(VRawSAPoint(sp2, p.CurvePoint(), p.TurnPoint()));
loop = QLineF(bigLine1.p1(), sp2);
loop.setLength(loop.length() + localWidth);
points.append(VRawSAPoint(loop.p2(), true));
points.append(VRawSAPoint(bigLine2.p1(), true));
points.append(VRawSAPoint(loop.p2(), p.CurvePoint(), p.TurnPoint(), true));
points.append(VRawSAPoint(bigLine2.p1(), p.CurvePoint(), p.TurnPoint(), true));
}
}
else
@ -168,7 +174,7 @@ auto AngleByLength(QVector<VRawSAPoint> points, QPointF p1, QPointF p2, QPointF
{
bool success = false;
QVector<VRawSAPoint> temp = points;
temp.append(bigLine1.p2());
temp.append(VRawSAPoint(bigLine1.p2(), p.CurvePoint(), p.TurnPoint()));
temp = VAbstractPiece::RollbackSeamAllowance(temp, bigLine2, &success);
if (success)
@ -183,7 +189,7 @@ auto AngleByLength(QVector<VRawSAPoint> points, QPointF p1, QPointF p2, QPointF
}
else
{
points.append(sp2);
points.append(VRawSAPoint(sp2, p.CurvePoint(), p.TurnPoint()));
}
}
else
@ -194,16 +200,17 @@ auto AngleByLength(QVector<VRawSAPoint> points, QPointF p1, QPointF p2, QPointF
QLineF loop1(sp2, sp1);
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.setLength(localWidth);
points.append(loop1.p2());
points.append(bigLine2.p1());
points.append(VRawSAPoint(loop1.p2(), p.CurvePoint(), p.TurnPoint()));
points.append(VRawSAPoint(bigLine2.p1(), p.CurvePoint(), p.TurnPoint()));
}
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);
}
pointsIntr.append(px);
pointsIntr.append(VRawSAPoint(px, p.CurvePoint(), p.TurnPoint()));
}
else
{// Because artificial loop can lead to wrong clipping we must rollback current seam allowance points
bool success = false;
QVector<VRawSAPoint> temp = pointsIntr;
temp.append(bigLine1.p2());
temp.append(VRawSAPoint(bigLine1.p2(), p.CurvePoint(), p.TurnPoint()));
temp = VAbstractPiece::RollbackSeamAllowance(temp, edge2, &success);
if (success)
@ -283,16 +290,16 @@ auto AngleByIntersection(const QVector<VRawSAPoint> &points, QPointF p1, QPointF
if (IsOutsidePoint(bigLine2.p2(), bigLine2.p1(), px))
{
pointsIntr.append(px);
pointsIntr.append(VRawSAPoint(px, p.CurvePoint(), p.TurnPoint()));
}
else
{
pointsIntr.append(px);
pointsIntr.append(VRawSAPoint(px, p.CurvePoint(), p.TurnPoint()));
QLineF allowance(p2, px);
allowance.setLength(allowance.length() + localWidth * 3.);
pointsIntr.append(allowance.p2());
pointsIntr.append(bigLine2.p1());
pointsIntr.append(VRawSAPoint(allowance.p2(), p.CurvePoint(), p.TurnPoint()));
pointsIntr.append(VRawSAPoint(bigLine2.p1(), p.CurvePoint(), p.TurnPoint()));
}
return pointsIntr;
@ -343,13 +350,13 @@ auto AngleByFirstSymmetry(const QVector<VRawSAPoint> &points, QPointF p1, QPoint
if (IsOutsidePoint(bigLine1.p1(), bigLine1.p2(), px1))
{
pointsIntr.append(px1);
pointsIntr.append(VRawSAPoint(px1, p.CurvePoint(), p.TurnPoint()));
}
else
{// Because artificial loop can lead to wrong clipping we must rollback current seam allowance points
bool success = false;
QVector<VRawSAPoint> temp = pointsIntr;
temp.append(bigLine1.p2());
temp.append(VRawSAPoint(bigLine1.p2(), p.CurvePoint(), p.TurnPoint()));
temp = VAbstractPiece::RollbackSeamAllowance(temp, sEdge, &success);
if (success)
@ -365,15 +372,15 @@ auto AngleByFirstSymmetry(const QVector<VRawSAPoint> &points, QPointF p1, QPoint
if (IsOutsidePoint(bigLine2.p2(), bigLine2.p1(), px2))
{
pointsIntr.append(px2);
pointsIntr.append(VRawSAPoint(px2, p.CurvePoint(), p.TurnPoint()));
}
else
{
QLineF allowance(px2, p2);
allowance.setAngle(allowance.angle() + 90);
pointsIntr.append(px2);
pointsIntr.append(allowance.p2());
pointsIntr.append(bigLine2.p1());
pointsIntr.append(VRawSAPoint(px2, p.CurvePoint(), p.TurnPoint()));
pointsIntr.append(VRawSAPoint(allowance.p2(), p.CurvePoint(), p.TurnPoint()));
pointsIntr.append(VRawSAPoint(bigLine2.p1(), p.CurvePoint(), p.TurnPoint()));
}
return pointsIntr;
@ -425,13 +432,13 @@ auto AngleBySecondSymmetry(const QVector<VRawSAPoint> &points, QPointF p1, QPoin
if (IsOutsidePoint(bigLine1.p1(), bigLine1.p2(), px1))
{
pointsIntr.append(px1);
pointsIntr.append(VRawSAPoint(px1, p.CurvePoint(), p.TurnPoint()));
}
else
{// Because artificial loop can lead to wrong clipping we must rollback current seam allowance points
bool success = false;
QVector<VRawSAPoint> temp = pointsIntr;
temp.append(bigLine1.p2());
temp.append(VRawSAPoint(bigLine1.p2(), p.CurvePoint(), p.TurnPoint()));
temp = VAbstractPiece::RollbackSeamAllowance(temp, sEdge, &success);
if (success)
@ -447,16 +454,16 @@ auto AngleBySecondSymmetry(const QVector<VRawSAPoint> &points, QPointF p1, QPoin
if (IsOutsidePoint(bigLine2.p2(), bigLine2.p1(), px2))
{
pointsIntr.append(px2);
pointsIntr.append(VRawSAPoint(px2, p.CurvePoint(), p.TurnPoint()));
}
else
{
QLineF allowance(p2, px2);
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.);
pointsIntr.append(allowance.p2());
pointsIntr.append(bigLine2.p1());
pointsIntr.append(VRawSAPoint(allowance.p2(), p.CurvePoint(), p.TurnPoint()));
pointsIntr.append(VRawSAPoint(bigLine2.p1(), p.CurvePoint(), p.TurnPoint()));
}
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);
}
pointsRA.append(seam.p2());
pointsRA.append(seam.p1());
pointsRA.append(VRawSAPoint(seam.p2(), p.CurvePoint(), p.TurnPoint()));
pointsRA.append(VRawSAPoint(seam.p1(), p.CurvePoint(), p.TurnPoint()));
}
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);
}
pointsRA.append(seam.p2());
pointsRA.append(VRawSAPoint(seam.p2(), p.CurvePoint(), p.TurnPoint()));
QLineF loopLine(px, sp2);
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());
tmp.setLength(tmp.length()+length);
pointsRA.append(tmp.p2());
pointsRA.append(loopLine.p2());
pointsRA.append(VRawSAPoint(tmp.p2(), p.CurvePoint(), p.TurnPoint()));
pointsRA.append(VRawSAPoint(loopLine.p2(), p.CurvePoint(), p.TurnPoint()));
}
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);
}
points.append(px);
points.append(VRawSAPoint(px, p.CurvePoint(), p.TurnPoint()));
QLineF seam(px, p3);
seam.setAngle(seam.angle()+90);
seam.setLength(p.GetSAAfter(width));
points.append(seam.p2());
points.append(VRawSAPoint(seam.p2(), p.CurvePoint(), p.TurnPoint()));
if (needRollback != nullptr)
{
@ -595,7 +602,7 @@ auto AngleBySecondRightAngle(QVector<VRawSAPoint> points, QPointF p1, QPointF p2
bool success = false;
const int countBefore = points.size();
QVector<VRawSAPoint> temp = points;
temp.append(bigLine1.p2());
temp.append(VRawSAPoint(bigLine1.p2(), p.CurvePoint(), p.TurnPoint()));
temp = VAbstractPiece::RollbackSeamAllowance(temp, edge, &success);
if (success)
@ -609,7 +616,7 @@ auto AngleBySecondRightAngle(QVector<VRawSAPoint> points, QPointF p1, QPointF p2
QLineF seam(px, p3);
seam.setAngle(seam.angle()+90);
seam.setLength(p.GetSAAfter(width));
points.append(seam.p2());
points.append(VRawSAPoint(seam.p2(), p.CurvePoint(), p.TurnPoint()));
}
else
{
@ -619,11 +626,11 @@ auto AngleBySecondRightAngle(QVector<VRawSAPoint> points, QPointF p1, QPointF p2
}
else if (IsSameDirection(bigLine1.p1(), bigLine1.p2(), px))
{
points.append(px);
points.append(VRawSAPoint(px, p.CurvePoint(), p.TurnPoint()));
QLineF seam(px, p3);
seam.setAngle(seam.angle()+90);
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);
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));
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()));
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);
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);
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);
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);
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)));
if (success)
@ -848,7 +855,7 @@ void RollbackBySecondEdgeRightAngle(QVector<VRawSAPoint> &ekvPoints, const QVect
ekvPoints.removeFirst();
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;
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);
if (success)
@ -868,7 +875,7 @@ void RollbackBySecondEdgeRightAngle(QVector<VRawSAPoint> &ekvPoints, const QVect
QLineF seam(px, points.at(1));
seam.setAngle(seam.angle()+90);
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())
{
@ -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
// 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)
{
@ -1135,20 +1126,20 @@ auto VAbstractPiece::Equidistant(QVector<VSAPoint> points, qreal width, const QS
QT_WARNING_POP
}
QVector<VLayoutPoint> cleaned;
// Uncomment for debug
// QVector<QPointF> cleaned;
// cleaned.reserve(ekvPoints.size());
// for (auto &point : ekvPoints)
// {
// cleaned.append(point);
// }
// CastTo(ekvPoints, cleaned);
const bool removeFirstAndLast = false;
ekvPoints = RemoveDublicates(ekvPoints, removeFirstAndLast);
QVector<QPointF> cleaned = CheckLoops(ekvPoints);//Result path can contain loops
ekvPoints = CheckLoops(ekvPoints);
cleaned = CorrectEquidistantPoints(cleaned, removeFirstAndLast);
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;
}
@ -1188,131 +1179,6 @@ auto VAbstractPiece::SumTrapezoids(const QVector<QPointF> &points) -> qreal
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
@ -1342,7 +1208,7 @@ auto VAbstractPiece::EkvPoint(QVector<VRawSAPoint> points, const VSAPoint &p1Lin
if (VFuzzyComparePoints(bigLine1.p2(), bigLine2.p1()))
{
points.append(bigLine1.p2());
points.append(VRawSAPoint(bigLine1.p2(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points;
}
@ -1357,16 +1223,16 @@ auto VAbstractPiece::EkvPoint(QVector<VRawSAPoint> points, const VSAPoint &p1Lin
ray.setLength(width*2);
QPointF crosPoint;
QLineF::IntersectType type = Intersects(ray, bigLine1, &crosPoint );
QLineF::IntersectType type = Intersects(ray, bigLine1, &crosPoint);
if (type != QLineF::NoIntersection)
{
points.append(crosPoint);
points.append(VRawSAPoint(crosPoint, p2Line1.CurvePoint(), p2Line1.TurnPoint()));
}
type = Intersects(ray, bigLine2, &crosPoint );
if (type != QLineF::NoIntersection)
{
points.append(crosPoint);
points.append(VRawSAPoint(crosPoint, p2Line1.CurvePoint(), p2Line1.TurnPoint()));
}
return points;
}
@ -1378,7 +1244,7 @@ auto VAbstractPiece::EkvPoint(QVector<VRawSAPoint> points, const VSAPoint &p1Lin
{// There are at least three big cases
case (QLineF::BoundedIntersection):
// The easiest, real intersection
points.append(crosPoint);
points.append(VRawSAPoint(crosPoint, p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points;
case (QLineF::UnboundedIntersection):
{ // 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)) &&
IsOnLine(p2Line1, bigLine1.p2(), bigLine2.p1(), ToPixel(0.5, Unit::Mm)))
{
points.append(bigLine1.p2());
points.append(bigLine2.p1());
points.append(VRawSAPoint(bigLine1.p2(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
points.append(VRawSAPoint(bigLine2.p1(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points;
}
@ -1473,7 +1339,7 @@ QT_WARNING_POP
const QLineF::IntersectType type = Intersects(bigEdge, line, &px);
if (type != QLineF::BoundedIntersection && line.length() < QLineF(p2Line1, px).length())
{
points.append(crosPoint);
points.append(VRawSAPoint(crosPoint, p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points;
}
}
@ -1484,12 +1350,12 @@ QT_WARNING_POP
QLineF loop(crosPoint, bigLine1.p1());
loop.setAngle(loop.angle() + 180);
loop.setLength(accuracyPointOnLine*2.);
points.append(loop.p2());
points.append(crosPoint);
points.append(VRawSAPoint(loop.p2(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
points.append(VRawSAPoint(crosPoint, p2Line1.CurvePoint(), p2Line1.TurnPoint()));
loop = QLineF(crosPoint, bigLine1.p1());
loop.setLength(loop.length() + localWidth*2.);
points.append(VRawSAPoint(loop.p2(), true));
points.append(VRawSAPoint(loop.p2(), p2Line1.CurvePoint(), p2Line1.TurnPoint(), true));
}
return points;
@ -1504,20 +1370,20 @@ QT_WARNING_POP
{// The cross point is still outside of a piece
if (line.length() >= localWidth)
{
points.append(crosPoint);
points.append(VRawSAPoint(crosPoint, p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points;
}
// but not enough far, fix it
line.setLength(localWidth);
points.append(line.p2());
points.append(VRawSAPoint(line.p2(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points;
}
// Wrong cross point, probably inside of a piece. Manually creating correct seam allowance
const QLineF bigEdge = SimpleParallelLine(bigLine1.p2(), bigLine2.p1(), localWidth );
points.append(bigEdge.p1());
points.append(bigEdge.p2());
points.append(VRawSAPoint(bigEdge.p1(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
points.append(VRawSAPoint(bigEdge.p2(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points;
}
}
@ -1525,8 +1391,9 @@ QT_WARNING_POP
}
case (QLineF::NoIntersection):
/*If we have correct lines this means lines lie on a line or parallel.*/
points.append(bigLine1.p2());
points.append(bigLine2.p1()); // Second point for parallel line
points.append(VRawSAPoint(bigLine1.p2(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
// Second point for parallel line
points.append(VRawSAPoint(bigLine2.p1(), p2Line1.CurvePoint(), p2Line1.TurnPoint()));
return points;
default:
break;
@ -1657,10 +1524,8 @@ auto VAbstractPiece::GetUniqueID() const -> QString
//---------------------------------------------------------------------------------------------------------------------
auto VSAPoint::toJson() const -> QJsonObject
{
QJsonObject pointObject;
QJsonObject pointObject = VLayoutPoint::toJson();
pointObject[QLatin1String("type")] = "VSAPoint";
pointObject[QLatin1String("x")] = x();
pointObject[QLatin1String("y")] = y();
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())
&& 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)
{
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))
{
points.append(crosPoint);
points.append(VRawSAPoint(crosPoint, points.at(points.size()-1).CurvePoint(),
points.at(points.size()-1).TurnPoint()));
*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;
path.setFillRule(Qt::WindingFill);
if (not points.isEmpty())
auto LayoutPoint = [label](QPointF p, bool turnPoint = false, bool curvePoint = false)
{
path.moveTo(points.at(0));
for (qint32 i = 1; i < points.count(); ++i)
VLayoutPoint point(label.RotationMatrix().map(p));
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;
}

View File

@ -38,6 +38,7 @@
#include "../vmisc/compatibility.h"
#include "../vgeometry/vgobject.h"
#include "vsapoint.h"
#include "vrawsapoint.h"
#include "testpath.h"
class VAbstractPieceData;
@ -45,6 +46,9 @@ class QPainterPath;
class VGrainlineData;
class VContainer;
class VRawSAPoint;
class VLayoutPlaceLabel;
using PlaceLabelImg = QVector<QVector<VLayoutPoint> >;
class VAbstractPiece
{
@ -100,10 +104,10 @@ public:
*/
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 CheckLoops(const QVector<QPointF> &points) -> QVector<QPointF>;
static auto CheckLoops(const QVector<VRawSAPoint> &points) -> QVector<QPointF>;
template <class T>
static auto CheckLoops(QVector<T> points) -> QVector<T>;
static auto EkvPoint(QVector<VRawSAPoint> points, const VSAPoint &p1Line1, const VSAPoint &p2Line1,
const VSAPoint &p1Line2, const VSAPoint &p2Line2, qreal width,
bool *needRollback = nullptr) -> QVector<VRawSAPoint>;
@ -122,28 +126,81 @@ public:
static auto GrainlinePoints(const VGrainlineData &geom, const VContainer *pattern,
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, 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:
template <class 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 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,
qreal &dY) -> bool;
static auto CorrectPosition(const QRectF &parentBoundingRect, QVector<QPointF> points) -> QVector<QPointF>;
static auto FindGrainlineGeometry(const VGrainlineData& geom, const VContainer *pattern, qreal &length,
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:
QSharedDataPointer<VAbstractPieceData> d;
};
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.
@ -151,7 +208,7 @@ Q_DECLARE_TYPEINFO(VAbstractPiece, Q_MOVABLE_TYPE); // NOLINT
* @return corrected list.
*/
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
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;
//Remove point on line
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.
if (prev == -1)
{
@ -213,9 +270,8 @@ auto VAbstractPiece::CorrectEquidistantPoints(const QVector<T> &points, bool rem
const T &prevPoint = buf1.at(prev);
const T &nextPoint = buf1.at(next);
if (not IsEkvPointOnLine(iPoint, prevPoint, nextPoint))
if (not CheckPointOnLine(buf2, iPoint, prevPoint, nextPoint))
{
buf2.append(iPoint);
prev = -1;
}
}
@ -233,7 +289,7 @@ auto VAbstractPiece::CorrectEquidistantPoints(const QVector<T> &points, bool rem
//---------------------------------------------------------------------------------------------------------------------
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)
{
@ -252,9 +308,8 @@ auto VAbstractPiece::RemoveDublicates(const QVector<T> &points, bool removeFirst
{
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;
break;
}
@ -267,10 +322,7 @@ auto VAbstractPiece::RemoveDublicates(const QVector<T> &points, bool removeFirst
{
// Path can't be closed
// See issue #686
if (VFuzzyComparePoints(ConstFirst(p), ConstLast(p), accuracy))
{
p.removeLast();
}
CompareFirstAndLastPoints(p, accuracy);
}
}
@ -279,7 +331,163 @@ auto VAbstractPiece::RemoveDublicates(const QVector<T> &points, bool removeFirst
//---------------------------------------------------------------------------------------------------------------------
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
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); });
}
//---------------------------------------------------------------------------------------------------------------------
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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -34,9 +34,7 @@
#include <QVector>
#include <QTransform>
#include "../vpatterndb/floatItemData/vpiecelabeldata.h"
#include "../vpatterndb/floatItemData/vpatternlabeldata.h"
#include "../vpatterndb/floatItemData/vgrainlinedata.h"
#include "../vpatterndb/floatItemData/floatitemdef.h"
#if QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
#include "../vmisc/diagnostic.h"
#endif // QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
@ -47,6 +45,8 @@
#include "../vgeometry/vgeometrydef.h"
#include "vtextmanager.h"
#include "../ifc/exception/vexception.h"
#include "vlayoutpoint.h"
#include "vlayoutplacelabel.h"
QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Weffc++")
@ -55,126 +55,99 @@ QT_WARNING_DISABLE_GCC("-Wnon-virtual-dtor")
class VLayoutPieceData : public QSharedData
{
public:
VLayoutPieceData()
{}
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(){} // NOLINT(modernize-use-equals-default)
VLayoutPieceData(const VLayoutPieceData &detail) = default;
~VLayoutPieceData() = default;
friend QDataStream& operator<<(QDataStream& dataStream, const VLayoutPieceData& piece);
friend QDataStream& operator>>(QDataStream& dataStream, VLayoutPieceData& piece);
friend auto operator<<(QDataStream& dataStream, const VLayoutPieceData& piece) -> QDataStream&;
friend auto operator>>(QDataStream& dataStream, VLayoutPieceData& piece) -> QDataStream&;
/** @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. */
QVector<QPointF> seamAllowance{};
QVector<VLayoutPoint> m_seamAllowance{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @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. */
QVector<VLayoutPassmark> passmarks{};
QVector<VLayoutPassmark> m_passmarks{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @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*/
QTransform matrix{};
QTransform m_matrix{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @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 */
QVector<QPointF> detailLabel{};
QVector<QPointF> m_detailLabel{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @brief patternInfo pattern info rectangle */
QVector<QPointF> patternInfo{};
QVector<QPointF> m_patternInfo{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @brief grainlineInfo line */
QVector<QPointF> grainlinePoints{};
QVector<QPointF> m_grainlinePoints{}; // NOLINT(misc-non-private-member-variables-in-classes)
GrainlineArrowDirection grainlineArrowType{GrainlineArrowDirection::atFront};
qreal grainlineAngle{0};
bool grainlineEnabled{false};
GrainlineArrowDirection m_grainlineArrowType{GrainlineArrowDirection::atFront}; // NOLINT(misc-non-private-member-variables-in-classes)
qreal m_grainlineAngle{0}; // NOLINT(misc-non-private-member-variables-in-classes)
bool m_grainlineEnabled{false}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @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 */
VTextManager m_tmPattern{};
VTextManager m_tmPattern{}; // NOLINT(misc-non-private-member-variables-in-classes)
/** @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. */
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_yScale{1.0};
qreal m_xScale{1.0}; // NOLINT(misc-non-private-member-variables-in-classes)
qreal m_yScale{1.0}; // NOLINT(misc-non-private-member-variables-in-classes)
private:
Q_DISABLE_ASSIGN(VLayoutPieceData)
Q_DISABLE_ASSIGN_MOVE(VLayoutPieceData) // NOLINT
static const quint32 streamHeader;
static const quint16 classVersion;
static constexpr quint32 streamHeader{0x80D7D009}; // CRC-32Q string "VLayoutPieceData"
static constexpr quint16 classVersion{4};
};
// Friend functions
//---------------------------------------------------------------------------------------------------------------------
inline QDataStream &operator<<(QDataStream &dataStream, const VLayoutPieceData &piece)
inline auto operator<<(QDataStream &dataStream, const VLayoutPieceData &piece) -> QDataStream &
{
dataStream << VLayoutPieceData::streamHeader << VLayoutPieceData::classVersion;
// Added in classVersion = 1
dataStream << piece.contour;
dataStream << piece.seamAllowance;
dataStream << piece.layoutAllowance;
dataStream << piece.passmarks;
dataStream << piece.m_contour;
dataStream << piece.m_seamAllowance;
dataStream << piece.m_layoutAllowance;
dataStream << piece.m_passmarks;
dataStream << piece.m_internalPaths;
dataStream << piece.matrix;
dataStream << piece.layoutWidth;
dataStream << piece.mirror;
dataStream << piece.detailLabel;
dataStream << piece.patternInfo;
dataStream << piece.grainlinePoints;
dataStream << piece.grainlineArrowType;
dataStream << piece.grainlineAngle;
dataStream << piece.grainlineEnabled;
dataStream << piece.m_matrix;
dataStream << piece.m_layoutWidth;
dataStream << piece.m_mirror;
dataStream << piece.m_detailLabel;
dataStream << piece.m_patternInfo;
dataStream << piece.m_grainlinePoints;
dataStream << piece.m_grainlineArrowType;
dataStream << piece.m_grainlineAngle;
dataStream << piece.m_grainlineEnabled;
dataStream << piece.m_placeLabels;
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;
dataStream >> actualStreamHeader;
@ -218,20 +191,37 @@ inline QDataStream &operator>>(QDataStream &dataStream, VLayoutPieceData &piece)
throw VException(message);
}
dataStream >> piece.contour;
dataStream >> piece.seamAllowance;
dataStream >> piece.layoutAllowance;
dataStream >> piece.passmarks;
if (actualClassVersion < 4)
{
auto ReadPoints = [&dataStream]()
{
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.matrix;
dataStream >> piece.layoutWidth;
dataStream >> piece.mirror;
dataStream >> piece.detailLabel;
dataStream >> piece.patternInfo;
dataStream >> piece.grainlinePoints;
dataStream >> piece.grainlineArrowType;
dataStream >> piece.grainlineAngle;
dataStream >> piece.grainlineEnabled;
dataStream >> piece.m_matrix;
dataStream >> piece.m_layoutWidth;
dataStream >> piece.m_mirror;
dataStream >> piece.m_detailLabel;
dataStream >> piece.m_patternInfo;
dataStream >> piece.m_grainlinePoints;
dataStream >> piece.m_grainlineArrowType;
dataStream >> piece.m_grainlineAngle;
dataStream >> piece.m_grainlineEnabled;
dataStream >> piece.m_placeLabels;
dataStream >> piece.m_square;

View File

@ -28,13 +28,9 @@
#include "vlayoutpiecepath.h"
#include "vlayoutpiecepath_p.h"
#include "vlayoutdef.h"
#include <QPainterPath>
const quint32 VLayoutPiecePathData::streamHeader = 0xA53F0225; // CRC-32Q string "VLayoutPiecePathData"
const quint16 VLayoutPiecePathData::classVersion = 1;
// Friend functions
//---------------------------------------------------------------------------------------------------------------------
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))
{
}
@ -104,20 +100,22 @@ QPainterPath VLayoutPiecePath::GetPainterPath() const
QPainterPath path;
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);
}
return path;
}
//---------------------------------------------------------------------------------------------------------------------
QVector<QPointF> VLayoutPiecePath::Points() const
QVector<VLayoutPoint> VLayoutPiecePath::Points() const
{
return d->m_points;
}
//---------------------------------------------------------------------------------------------------------------------
void VLayoutPiecePath::SetPoints(const QVector<QPointF> &points)
void VLayoutPiecePath::SetPoints(const QVector<VLayoutPoint> &points)
{
d->m_points = points;
}

View File

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

View File

@ -41,6 +41,7 @@
# include "../vmisc/vdatastreamenum.h"
#endif
#include "../ifc/exception/vexception.h"
#include "vlayoutpoint.h"
QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Weffc++")
@ -52,24 +53,18 @@ public:
VLayoutPiecePathData()
{}
explicit VLayoutPiecePathData(const QVector<QPointF> &points)
explicit VLayoutPiecePathData(const QVector<VLayoutPoint> &points)
: m_points(points)
{}
VLayoutPiecePathData(const VLayoutPiecePathData &path)
: QSharedData(path),
m_points(path.m_points),
m_penStyle(path.m_penStyle),
m_cut(path.m_cut)
{}
VLayoutPiecePathData(const VLayoutPiecePathData &path) = default;
~VLayoutPiecePathData() = default;
friend QDataStream& operator<<(QDataStream& dataStream, const VLayoutPiecePathData& path);
friend QDataStream& operator>>(QDataStream& dataStream, VLayoutPiecePathData& path);
/** @brief m_points list of path points. */
QVector<QPointF> m_points{};
QVector<VLayoutPoint> m_points{};
/** @brief m_penStyle path pen style. */
Qt::PenStyle m_penStyle{Qt::SolidLine};
@ -79,8 +74,8 @@ public:
private:
Q_DISABLE_ASSIGN(VLayoutPiecePathData)
static const quint32 streamHeader;
static const quint16 classVersion;
static constexpr quint32 streamHeader = 0xA53F0225; // CRC-32Q string "VLayoutPiecePathData"
static constexpr quint16 classVersion = 2;
};
QT_WARNING_POP
@ -127,7 +122,16 @@ QDataStream& operator>>(QDataStream &dataStream, VLayoutPiecePathData &path)
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_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 "../ifc/exception/vexception.h"
#include "../vpatterndb/floatItemData/floatitemdef.h"
#include "../vlayout/vlayoutpoint.h"
namespace
{
@ -461,8 +462,9 @@ auto VPosition::Crossing(const VLayoutPiece &detail) const -> VPosition::Crossin
const QRectF layoutBoundingRect = VLayoutPiece::BoundingRect(layoutPoints);
const QPainterPath layoutAllowancePath = VAbstractPiece::PainterPath(layoutPoints);
const QVector<QPointF> contourPoints = detail.IsSeamAllowance() && not detail.IsSeamAllowanceBuiltIn() ?
detail.GetMappedSeamAllowancePoints() : detail.GetMappedContourPoints();
QVector<QPointF> contourPoints;
CastTo(detail.IsSeamAllowance() && not detail.IsSeamAllowanceBuiltIn() ?
detail.GetMappedSeamAllowancePoints() : detail.GetMappedContourPoints(), contourPoints);
const QRectF detailBoundingRect = VLayoutPiece::BoundingRect(contourPoints);
const QPainterPath contourPath = VAbstractPiece::PainterPath(contourPoints);

View File

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

View File

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

View File

@ -36,17 +36,17 @@
#endif // QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
#include "../vmisc/def.h"
#include "../vgeometry/vgeometrydef.h"
#include <QPointF>
#include "vlayoutpoint.h"
QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Weffc++")
QT_WARNING_DISABLE_GCC("-Wnon-virtual-dtor")
QT_WARNING_DISABLE_CLANG("-Wnon-virtual-dtor")
/**
* @brief The VSAPoint class seam allowance point
*/
class VSAPoint : public QPointF
class VSAPoint : public VLayoutPoint
{
public:
QT_WARNING_PUSH
@ -58,6 +58,7 @@ public:
Q_DECL_CONSTEXPR VSAPoint(qreal xpos, qreal ypos);
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 GetSAAfter() const -> qreal;
@ -78,7 +79,7 @@ public:
Q_DECL_RELAXED_CONSTEXPR auto MaxLocalSA(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 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)
: QPointF(xpos, ypos)
: VLayoutPoint(xpos, ypos)
{}
//---------------------------------------------------------------------------------------------------------------------
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>
auto Reverse(const QVector<T> &container) -> QVector<T>
inline auto Reverse(const QVector<T> &container) -> QVector<T>
{
if (container.isEmpty())
{
@ -216,14 +216,14 @@ auto Reverse(const QVector<T> &container) -> QVector<T>
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)));
}
//---------------------------------------------------------------------------------------------------------------------
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);
}

View File

@ -33,7 +33,6 @@
#include "../ifc/exception/vexceptioninvalidnotch.h"
#include "../vgeometry/vabstractcurve.h"
#include "../vgeometry/varc.h"
#include "testpassmark.h"
#include "../vlayout/vrawsapoint.h"
const qreal VPassmark::passmarkRadiusFactor = 0.45;
@ -53,7 +52,7 @@ PassmarkStatus GetSeamPassmarkSAPoint(const VPiecePassmarkData &passmarkData, co
if (needRollback && not seamAllowance.isEmpty())
{
ekvPoints.clear();
ekvPoints += seamAllowance.at(seamAllowance.size()-2);
ekvPoints += VRawSAPoint(seamAllowance.at(seamAllowance.size()-2));
}
if (ekvPoints.isEmpty())
@ -689,7 +688,7 @@ QVector<QLineF> VPassmark::FullPassmark(const VPiece &piece, const VContainer *d
{
if (m_null)
{
return QVector<QLineF>();
return {};
}
if (not piece.IsSeamAllowanceBuiltIn())
@ -720,16 +719,18 @@ QVector<QLineF> VPassmark::SAPassmark(const VPiece &piece, const VContainer *dat
{
if (m_null)
{
return QVector<QLineF>();
return {};
}
if (not piece.IsSeamAllowanceBuiltIn())
{
// 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)
{
return QVector<QLineF>();
return {};
}
// Because rollback @seamAllowance must be rotated here.
@ -801,8 +802,9 @@ QVector<QLineF> VPassmark::BuiltInSAPassmark(const VPiece &piece, const VContain
return QVector<QLineF>();
}
return CreatePassmarkLines(m_data.passmarkLineType, m_data.passmarkAngleType, lines, piece.MainPathPoints(data),
PassmarkSide::All);
QVector<QPointF> points;
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.setLength(length);
return QVector<QLineF>({edge1});
return {edge1};
}
//---------------------------------------------------------------------------------------------------------------------
@ -862,16 +864,18 @@ QVector<QLineF> VPassmark::SAPassmarkBaseLine(const VPiece &piece, const VContai
{
if (m_null)
{
return QVector<QLineF>();
return {};
}
if (not piece.IsSeamAllowanceBuiltIn())
{
// 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)
{
return QVector<QLineF>();
return {};
}
if (seamAllowance.size() < 2)

View File

@ -32,7 +32,7 @@
#include "../vgeometry/vpointf.h"
#include "../vgeometry/vabstractcurve.h"
#include "../vgeometry/vplacelabelitem.h"
#include "../vgeometry/varc.h"
#include "../vgeometry/vlayoutplacelabel.h"
#include "vcontainer.h"
#include "../vmisc/vabstractvalapplication.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
VPiecePath mainPath = GetPath();
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
// 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
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);
}
@ -208,14 +208,15 @@ QVector<QPointF> VPiece::SeamAllowancePoints(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);
}
else
{
return MainPathPoints(data);
CastTo(SeamAllowancePoints(data), points);
return points;
}
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
{
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));
}
//---------------------------------------------------------------------------------------------------------------------
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
{
@ -370,7 +337,7 @@ QPainterPath VPiece::PlaceLabelPath(const VContainer *data) const
const auto label = data->GeometricObject<VPlaceLabelItem>(placeLabel);
if (label->IsVisible())
{
path.addPath(label->LabelShapePath());
path.addPath(LabelShapePath(VLayoutPlaceLabel(*label)));
}
}
catch (const VExceptionBadId &e)
@ -387,12 +354,16 @@ bool VPiece::IsSeamAllowanceValid(const VContainer *data) const
{
if (IsSeamAllowance() && not IsSeamAllowanceBuiltIn())
{
return VAbstractPiece::IsAllowanceValid(UniteMainPathPoints(data), SeamAllowancePoints(data));
}
else
{
return true;
QVector<QPointF> mainPathPoints;
CastTo<QPointF>(UniteMainPathPoints(data), mainPathPoints);
QVector<QPointF> seamAllowancePoints;
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);
if (not IsSeamAllowance() || IsSeamAllowanceBuiltIn())
{
return QVector<QPointF>();
return {};
}
const QVector<CustomSARecord> records = FilterRecords(GetValidRecords());

View File

@ -33,7 +33,6 @@
#include <QSharedDataPointer>
#include "../vlayout/vabstractpiece.h"
#include "../vgeometry/vgeometrydef.h"
class VPieceData;
class VPieceNode;
@ -65,10 +64,10 @@ public:
VPiecePath &GetPath();
void SetPath(const VPiecePath &path);
QVector<QPointF> MainPathPoints(const VContainer *data) const;
QVector<QPointF> UniteMainPathPoints(const VContainer *data) const;
QVector<VLayoutPoint> MainPathPoints(const VContainer *data) const;
QVector<VLayoutPoint> UniteMainPathPoints(const VContainer *data) 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<QLineF> PassmarksLines(const VContainer *data) const;
@ -80,7 +79,8 @@ public:
static QPainterPath MainPathPath(const QVector<QPointF> &points);
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 PlaceLabelPath(const VContainer *data) const;
@ -132,7 +132,7 @@ public:
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);
auto GetGradationLabel() const -> QString;
@ -167,4 +167,41 @@ private:
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

View File

@ -36,9 +36,6 @@
#include <QDataStream>
#include <QtNumeric>
const quint32 VPieceNodeData::streamHeader = 0x2198CBC8; // CRC-32Q string "VPieceNodeData"
const quint16 VPieceNodeData::classVersion = 1;
//---------------------------------------------------------------------------------------------------------------------
VPieceNode::VPieceNode()
: d(new VPieceNodeData)
@ -454,6 +451,18 @@ void VPieceNode::SetManualPassmarkLength(bool 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
{

View File

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

View File

@ -63,24 +63,7 @@ public:
}
}
VPieceNodeData (const VPieceNodeData& node)
: 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 (const VPieceNodeData& node) = default;
~VPieceNodeData() = default;
@ -124,11 +107,13 @@ public:
bool m_manualPassmarkLength{false};
bool m_turnPoint{true};
private:
Q_DISABLE_ASSIGN(VPieceNodeData)
static const quint32 streamHeader;
static const quint16 classVersion;
static constexpr quint32 streamHeader = 0x2198CBC8; // CRC-32Q string "VPieceNodeData"
static constexpr quint16 classVersion = 2;
};
// Friend functions
@ -155,6 +140,8 @@ QDataStream &operator<<(QDataStream &out, const VPieceNodeData &p)
// Added in classVersion = 2
out << p.m_turnPoint;
return out;
}
@ -199,10 +186,10 @@ QDataStream &operator>>(QDataStream &in, VPieceNodeData &p)
>> p.m_checkUniqueness
>> p.m_manualPassmarkLength;
// if (actualClassVersion >= 2)
// {
// }
if (actualClassVersion >= 2)
{
in >> p.m_turnPoint;
}
return in;
}

View File

@ -30,7 +30,6 @@
#include "vpiecepath_p.h"
#include "vcontainer.h"
#include "../vgeometry/vpointf.h"
#include "../vlayout/vabstractpiece.h"
#include "calculator.h"
#include "../vmisc/vabstractvalapplication.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.SetSABefore(node.GetSABefore(data, *data->GetPatternUnit()));
candidate.SetAngleType(node.GetAngleType());
candidate.SetTurnPoint(node.IsTurnPoint());
}
}
return candidate;
@ -92,6 +92,7 @@ VSAPoint CurveStartPoint(VSAPoint candidate, const VContainer *data, const VPiec
}
candidate = VSAPoint(p);
candidate.SetTurnPoint(true);
break;
}
@ -131,6 +132,7 @@ VSAPoint CurveEndPoint(VSAPoint candidate, const VContainer *data, const VPieceN
}
candidate = VSAPoint(p);
candidate.SetTurnPoint(true);
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)
{
return 0;
}
const QPointF &first = ConstFirst(points);
const T &first = ConstFirst(points);
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,
QPointF *firstConnection)
bool IntersectionWithCuttingCountour(const QVector<QPointF> &cuttingPath, const QVector<VLayoutPoint> &points,
QPointF *connection)
{
if (points.size() <= 1)
{
@ -207,12 +210,35 @@ bool IntersectionWithCuttingCountour(const QVector<QPointF> &cuttingPath, const
if (VAbstractCurve::IsPointOnCurve(cuttingPath, first))
{ // Point is already part of a cutting countour
*firstConnection = first;
*connection = first;
return true;
}
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)
{
QVector<QPointF> extended = points;
QVector<VLayoutPoint> extended = points;
if (IsFirstToCuttingCountour())
{
QPointF firstConnection;
VLayoutPoint firstConnection;
if (IntersectionWithCuttingCountour(cuttingPath, points, &firstConnection))
{
firstConnection.SetTurnPoint(true);
extended.prepend(firstConnection);
}
else
@ -415,9 +442,10 @@ QVector<QPointF> VPiecePath::PathPoints(const VContainer *data, const QVector<QP
if (IsLastToCuttingCountour())
{
QPointF lastConnection;
VLayoutPoint lastConnection;
if (IntersectionWithCuttingCountour(cuttingPath, Reverse(points), &lastConnection))
{
lastConnection.SetTurnPoint(true);
extended.append(lastConnection);
}
else
@ -542,7 +570,10 @@ QVector<VSAPoint> VPiecePath::SeamAllowancePoints(const VContainer *data, qreal
//---------------------------------------------------------------------------------------------------------------------
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;
paths.reserve(curves.size());
for(auto &curve : curves)
for(const auto &curve : curves)
{
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());
VSAPoint p(point->toQPointF());
p.SetTurnPoint(node.IsTurnPoint());
p.SetSAAfter(node.GetSAAfter(data, *data->GetPatternUnit()));
p.SetSABefore(node.GetSABefore(data, *data->GetPatternUnit()));
p.SetAngleType(node.GetAngleType());
@ -1138,18 +1170,23 @@ QVector<VSAPoint> VPiecePath::CurveSeamAllowanceSegment(const VContainer *data,
{
VSAPoint p(points.at(i));
p.SetAngleType(PieceNodeAngle::ByLengthCurve);
p.SetCurvePoint(true);
if (i == 0)
{ // first point
p.SetSAAfter(begin.GetSAAfter());
p.SetSABefore(begin.GetSABefore());
p.SetAngleType(begin.GetAngleType());
p.SetTurnPoint(VFuzzyComparePoints(p, begin) ? begin.TurnPoint() : true);
}
else if (i == points.size() - 1)
{ // last point
p.SetSAAfter(end.GetSAAfter());
p.SetSABefore(end.GetSABefore());
p.SetAngleType(end.GetAngleType());
p.SetTurnPoint(VFuzzyComparePoints(p, end) ? end.TurnPoint() : true);
}
pointsEkv.append(p);
}
}
@ -1165,13 +1202,15 @@ QVector<VSAPoint> VPiecePath::CurveSeamAllowanceSegment(const VContainer *data,
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);
VSAPoint p(points.at(0));//First point in the list
p.SetSAAfter(begin.GetSAAfter());
p.SetSABefore(begin.GetSABefore());
p.SetAngleType(begin.GetAngleType());
p.SetCurvePoint(true);
p.SetTurnPoint(VFuzzyComparePoints(p, begin) ? begin.TurnPoint() : true);
pointsEkv.append(p);
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)
{
p = VSAPoint(points.at(i));
p.SetCurvePoint(true);
if (i == points.size() - 1)
{// last point
p.SetSAAfter(end.GetSAAfter());
p.SetSABefore(end.GetSABefore());
p.SetAngleType(end.GetAngleType());
p.SetTurnPoint(VFuzzyComparePoints(p, end) ? end.TurnPoint() : true);
}
else
{
@ -1220,14 +1261,14 @@ QString VPiecePath::NodeName(const QVector<VPieceNode> &nodes, int nodeIndex, co
{
// ignore
}
return QString();
return {};
}
//---------------------------------------------------------------------------------------------------------------------
QVector<QPointF> VPiecePath::NodesToPoints(const VContainer *data, const QVector<VPieceNode> &nodes,
const QString &piece)
QVector<VLayoutPoint> VPiecePath::NodesToPoints(const VContainer *data, const QVector<VPieceNode> &nodes,
const QString &piece)
{
QVector<QPointF> points;
QVector<VLayoutPoint> points;
for (int i = 0; i < nodes.size(); ++i)
{
const VPieceNode &node = nodes.at(i);
@ -1241,7 +1282,9 @@ QVector<QPointF> VPiecePath::NodesToPoints(const VContainer *data, const QVector
case (Tool::NodePoint):
{
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;
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 VSAPoint begin = StartSegment(data, nodes, i);
const VSAPoint end = EndSegment(data, nodes, i);
const QPointF begin = StartSegment(data, nodes, i);
const QPointF end = EndSegment(data, nodes, i);
points << curve->GetSegmentPoints(begin, end, node.GetReverse(), piece);
QVector<QPointF> segment = curve->GetSegmentPoints(begin, end, node.GetReverse(), piece);
AppendCurveSegment(points, segment, begin, end);
}
break;
default:

View File

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

View File

@ -46,17 +46,14 @@
#include <QVector>
#include <QtGlobal>
#include <QLineF>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include "vsysexits.h"
#include "../vgeometry/vgobject.h"
#include "../vgeometry/vpointf.h"
#include "../vgeometry/vspline.h"
#include "../vgeometry/vsplinepath.h"
#include "../vlayout/vabstractpiece.h"
#include "../vlayout/vrawsapoint.h"
#include "../vpatterndb/vcontainer.h"
#include "../vpatterndb/vpiece.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)
{
@ -217,17 +116,25 @@ void AbstractTest::PassmarkDataFromJson(const QString &json, VPiecePassmarkData
QJsonObject passmarkData = dataObject[dataKey].toObject();
VSAPoint previousSAPoint;
SAPointFromJson(passmarkData[QStringLiteral("previousSAPoint")].toObject(), previousSAPoint);
data.previousSAPoint = previousSAPoint;
try
{
VSAPoint previousSAPoint;
PointFromJson(passmarkData[QStringLiteral("previousSAPoint")].toObject(), previousSAPoint);
data.previousSAPoint = previousSAPoint;
VSAPoint passmarkSAPoint;
SAPointFromJson(passmarkData[QStringLiteral("passmarkSAPoint")].toObject(), passmarkSAPoint);
data.passmarkSAPoint = passmarkSAPoint;
VSAPoint passmarkSAPoint;
PointFromJson(passmarkData[QStringLiteral("passmarkSAPoint")].toObject(), passmarkSAPoint);
data.passmarkSAPoint = passmarkSAPoint;
VSAPoint nextSAPoint;
SAPointFromJson(passmarkData[QStringLiteral("nextSAPoint")].toObject(), nextSAPoint);
data.nextSAPoint = nextSAPoint;
VSAPoint nextSAPoint;
PointFromJson(passmarkData[QStringLiteral("nextSAPoint")].toObject(), 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;
AbstractTest::ReadDoubleValue(passmarkData, QStringLiteral("saWidth"), saWidth);
@ -287,9 +194,9 @@ void AbstractTest::PassmarkShapeFromJson(const QString &json, QVector<QLineF> &s
TestRoot(shapeObject, shapeKey, json);
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;
AbstractTest::ReadStringValue(lineObject, typeKey, type);
@ -301,27 +208,25 @@ void AbstractTest::PassmarkShapeFromJson(const QString &json, QVector<QLineF> &s
QFAIL(qUtf8Printable(error));
}
QLineF line;
QLineFromJson(lineObject, line);
shape.append(line);
shape.append(QLineFromJson(lineObject));
}
}
//---------------------------------------------------------------------------------------------------------------------
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
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.);
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.")
.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
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);
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))
{
@ -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,
const QString &defaultValue) const
const QString &defaultValue)
{
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,
const QString &defaultValue) const
const QString &defaultValue)
{
if (itemObject.contains(attribute))
{
@ -624,8 +529,7 @@ void AbstractTest::ReadPointValue(const QJsonObject &itemObject, const QString &
{
if (itemObject.contains(attribute))
{
QJsonObject p1Object = itemObject[attribute].toObject();
VPointFromJson(p1Object, value);
PointFromJson(itemObject[attribute].toObject(), value);
}
else
{
@ -706,22 +610,11 @@ void AbstractTest::ReadPieceNodeValue(const QJsonObject &itemObject, VPieceNode
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*>
void AbstractTest::ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value,
const QString &defaultValue) const
const QString &defaultValue)
{
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*>
void AbstractTest::ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value,
const QString &defaultValue) const
const QString &defaultValue)
{
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*>
void AbstractTest::ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value,
const QString &defaultValue) const
const QString &defaultValue)
{
if (itemObject.contains(attribute))
{
@ -836,81 +729,13 @@ void AbstractTest::ReadDoubleValue(const QJsonObject &itemObject, const QString
}
//---------------------------------------------------------------------------------------------------------------------
void AbstractTest::VPointFromJson(const QJsonObject &itemObject, VPointF &point)
{
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)
auto AbstractTest::QLineFromJson(const QJsonObject &itemObject) -> QLineF
{
QPointF p1;
QPointFromJson(itemObject[QStringLiteral("p1")].toObject(), p1);
QPointF p2;
QPointFromJson(itemObject[QStringLiteral("p2")].toObject(), p2);
line = QLineF(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);
PointFromJson(itemObject[QStringLiteral("p1")].toObject(), p1);
PointFromJson(itemObject[QStringLiteral("p2")].toObject(), p2);
return {p1, p2};
}
//---------------------------------------------------------------------------------------------------------------------
@ -989,9 +814,9 @@ void AbstractTest::DBFromJson(const QJsonObject &dbObject, QSharedPointer<VConta
if (dbObject.contains(itemsKey))
{
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;
AbstractTest::ReadDoubleValue(itemObject, QStringLiteral("type"), objectType);
@ -1000,7 +825,7 @@ void AbstractTest::DBFromJson(const QJsonObject &dbObject, QSharedPointer<VConta
case GOType::Point:
{
VPointF point;
VPointFromJson(itemObject, point);
PointFromJson(itemObject, point);
data->UpdateGObject(point.id(), new VPointF(point));
break;
}

View File

@ -32,9 +32,17 @@
#include <QMetaObject>
#include <QObject>
#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;
class VSAPoint;
#include <ciso646>
@ -69,9 +77,8 @@ class AbstractTest : public QObject
public:
explicit AbstractTest(QObject *parent = nullptr);
void VectorFromJson(const QString &json, QVector<QPointF>& vector) const;
void VectorFromJson(const QString &json, QVector<VSAPoint>& vector) const;
void VectorFromJson(const QString &json, QVector<VRawSAPoint>& vector) const;
template <class T>
static auto VectorFromJson(const QString &json) -> QVector<T>;
void PieceFromJson(const QString &json, VPiece &piece, QSharedPointer<VContainer> &data);
@ -79,45 +86,50 @@ public:
void PassmarkShapeFromJson(const QString &json, QVector<QLineF> &shape);
protected:
void Comparison(const QVector<QPointF> &ekv, const QVector<QPointF> &ekvOrig) const;
void Comparison(const QPointF &result, const QPointF &expected, qreal testAccuracy) const;
void Comparison(const QVector<QLineF> &result, const QVector<QLineF> &expected) const;
void ComparePathsDistance(const QVector<QPointF> &ekv, const QVector<QPointF> &ekvOrig) const;
void ComparePointsDistance(const QPointF &result, const QPointF &expected, qreal testAccuracy) const;
void CompareLinesDistance(const QVector<QLineF> &result, const QVector<QLineF> &expected) const;
QString ValentinaPath() const;
QString TapePath() const;
QString TranslationsPath() const;
auto ValentinaPath() const -> QString;
auto TapePath() const -> QString;
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);
bool CopyRecursively(const QString &srcFilePath, const QString &tgtFilePath) const;
auto Run(int exit, const QString &program, const QStringList &arguments, QString &error, int msecs = 120000) -> int;
auto CopyRecursively(const QString &srcFilePath, const QString &tgtFilePath) const -> bool;
void PrepareDocument(const QString &json, QByteArray &data) const;
void TestRoot(const QJsonObject &root, const QString &attribute, const QString &file) const;
static void PrepareDocument(const QString &json, QByteArray &data);
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>
void ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value,
const QString &defaultValue = QString()) const;
static void ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value,
const QString &defaultValue = QString());
template <typename T, typename std::enable_if<std::is_enum<T>::value>::type* = nullptr>
void ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value,
const QString &defaultValue = QString()) const;
static void ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value,
const QString &defaultValue = QString());
template <typename T, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
void ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value,
const QString &defaultValue = QString()) const;
void ReadStringValue(const QJsonObject &itemObject, const QString &attribute, QString &value,
const QString &defaultValue = QString()) const;
void ReadBooleanValue(const QJsonObject &itemObject, const QString &attribute, bool &value,
const QString &defaultValue = QString()) const;
static void ReadDoubleValue(const QJsonObject &itemObject, const QString &attribute, T &value,
const QString &defaultValue = QString());
static void ReadStringValue(const QJsonObject &itemObject, const QString &attribute, QString &value,
const QString &defaultValue = QString());
static void ReadBooleanValue(const QJsonObject &itemObject, const QString &attribute, bool &value,
const QString &defaultValue = QString());
void ReadPointValue(const QJsonObject &itemObject, const QString &attribute, VPointF &value);
void ReadSplinePointValues(const QJsonObject &itemObject, const QString &attribute, QVector<VSplinePoint> &points);
void ReadSplinePointValue(const QJsonObject &itemObject, VSplinePoint &point);
void ReadPieceNodeValue(const QJsonObject &itemObject, VPieceNode &node);
void QPointFromJson(const QJsonObject &itemObject, QPointF &point) const;
void VPointFromJson(const QJsonObject &itemObject, VPointF &point);
void QLineFromJson(const QJsonObject &itemObject, QLineF &line);
void SAPointFromJson(const QJsonObject &itemObject, VSAPoint &point) const;
void RawSAPointFromJson(const QJsonObject &itemObject, VRawSAPoint &point) const;
template <class T>
static void CheckClassType(const QJsonObject &itemObject);
template <class T>
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 SplinePathFromJson(const QJsonObject &itemObject, QSharedPointer<VContainer> &data);
@ -125,4 +137,190 @@ protected:
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

View File

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

View File

@ -329,11 +329,13 @@ void DialogPiecePath::ShowContextMenu(const QPoint &pos)
QListWidgetItem *rowItem = ui->listWidget->item(row);
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 *actionUniqueness = nullptr;
QAction *actionReverse = nullptr;
QAction *actionTurnPoint = nullptr;
if (rowNode.GetTypeTool() != Tool::NodePoint)
{
actionReverse = menu->addAction(tr("Reverse"));
@ -353,6 +355,10 @@ void DialogPiecePath::ShowContextMenu(const QPoint &pos)
actionUniqueness = menu->addAction(tr("Check uniqueness"));
actionUniqueness->setCheckable(true);
actionUniqueness->setChecked(rowNode.IsCheckUniqueness());
actionTurnPoint = menu->addAction(tr("Turn point"));
actionTurnPoint->setCheckable(true);
actionTurnPoint->setChecked(rowNode.IsTurnPoint());
}
QAction *actionExcluded = menu->addAction(tr("Excluded"));
@ -393,6 +399,12 @@ void DialogPiecePath::ShowContextMenu(const QPoint &pos)
rowItem->setData(Qt::UserRole, QVariant::fromValue(rowNode));
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());
ListChanged();

View File

@ -745,11 +745,13 @@ void DialogSeamAllowance::ShowMainPathContextMenu(const QPoint &pos)
QListWidgetItem *rowItem = uiTabPaths->listWidgetMainPath->item(row);
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 *actionUniqueness = nullptr;
QAction *actionReverse = nullptr;
QAction *actionTurnPoint = nullptr;
if (rowNode.GetTypeTool() != Tool::NodePoint)
{
actionReverse = menu->addAction(tr("Reverse"));
@ -768,6 +770,10 @@ void DialogSeamAllowance::ShowMainPathContextMenu(const QPoint &pos)
actionUniqueness = menu->addAction(tr("Check uniqueness"));
actionUniqueness->setCheckable(true);
actionUniqueness->setChecked(rowNode.IsCheckUniqueness());
actionTurnPoint = menu->addAction(tr("Turn point"));
actionTurnPoint->setCheckable(true);
actionTurnPoint->setChecked(rowNode.IsTurnPoint());
}
QAction *actionExcluded = menu->addAction(tr("Excluded"));
@ -807,6 +813,13 @@ void DialogSeamAllowance::ShowMainPathContextMenu(const QPoint &pos)
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());
ListChanged();
}
@ -2750,7 +2763,8 @@ void DialogSeamAllowance::ValidObjects(bool value)
//---------------------------------------------------------------------------------------------------------------------
bool DialogSeamAllowance::MainPathIsClockwise() const
{
const QVector<QPointF> points = CreatePiece().MainPathPoints(data);
QVector<QPointF> points;
CastTo(CreatePiece().MainPathPoints(data), points);
if(points.count() < 3)
{

View File

@ -100,6 +100,7 @@ enum class ContextMenuOption : int
ForbidFlipping,
ForceFlipping,
Remove,
TurnPoint,
LAST_ONE_DO_NOT_USE
};
}
@ -140,7 +141,7 @@ void VNodePoint::Create(const VAbstractNodeInitData &initData)
VAbstractTool::AddRecord(initData.id, Tool::NodePoint, initData.doc);
//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.
VNodePoint *point = new VNodePoint(initData);
auto *point = new VNodePoint(initData);
connect(initData.scene, &VMainGraphicsScene::EnableToolMove, point, &VNodePoint::EnableToolMove);
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);
InitPassmarkLineTypeMenu(menu, pieceId, contextMenu);
QAction *separatorAct = new QAction(this);
auto *separatorAct = new QAction(this);
separatorAct->setSeparator(true);
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);
if (nodeIndex != -1)
{
const VPieceNode &node = detail.GetPath().at(nodeIndex);
QAction *actionPassmark = menu->addAction(tr("Passmark"));
actionPassmark->setCheckable(true);
actionPassmark->setChecked(detail.GetPath().at(nodeIndex).IsPassmark());
actionPassmark->setChecked(node.IsPassmark());
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;
}
if (VToolSeamAllowance *piece = qgraphicsitem_cast<VToolSeamAllowance *>(parentItem()))
if (auto *piece = qgraphicsitem_cast<VToolSeamAllowance *>(parentItem()))
{
QMenu menu;
QHash<int, QAction *> contextMenu = InitContextMenu(&menu, piece->getId(), piece->referens());
@ -573,7 +580,7 @@ void VNodePoint::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
ContextMenuOption selectedOption = static_cast<ContextMenuOption>(
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.");
QT_WARNING_PUSH
@ -614,6 +621,9 @@ QT_WARNING_DISABLE_GCC("-Wswitch-default")
case ContextMenuOption::Exclude:
emit ToggleExcludeState(m_id);
break;
case ContextMenuOption::TurnPoint:
emit ToggleTurnPointState(m_id);
break;
case ContextMenuOption::ByLength:
SelectSeamAllowanceAngle(PieceNodeAngle::ByLength);
break;

View File

@ -38,7 +38,6 @@
#include <QString>
#include <QtGlobal>
#include "../ifc/xml/vabstractpattern.h"
#include "../vmisc/def.h"
#include "vabstractnode.h"
#include "../vwidgets/vscenepoint.h"
@ -66,6 +65,7 @@ signals:
void ToggleForceFlipping(bool checked);
void Delete();
void ToggleExcludeState(quint32 id);
void ToggleTurnPointState(quint32 id);
void ToggleSeamAllowanceAngleType(quint32 id, PieceNodeAngle type);
void TogglePassmark(quint32 id, bool toggle);
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::AttrNodePassmarkAngle);
}
doc->SetAttributeOrRemoveIf<bool>(nod, VAbstractPattern::AttrNodeTurnPoint, node.IsTurnPoint(),
[](bool value) noexcept {return value;});
}
else
{ // Wrong configuration.

View File

@ -1391,7 +1391,7 @@ void VToolSeamAllowance::RefreshGeometry(bool updateChildren)
this->getData());
QFuture<QPainterPath > futurePassmarks = QtConcurrent::run(detail, &VPiece::PassmarksPath, this->getData());
QFuture<QVector<QPointF> > futureSeamAllowance;
QFuture<QVector<VLayoutPoint> > futureSeamAllowance;
QFuture<bool> futureSeamAllowanceValid;
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)
{
@ -1876,7 +1896,7 @@ void VToolSeamAllowance::InitNode(const VPieceNode &node, VMainGraphicsScene *sc
{
case (Tool::NodePoint):
{
VNodePoint *tool = qobject_cast<VNodePoint*>(VAbstractPattern::getTool(node.GetId()));
auto *tool = qobject_cast<VNodePoint*>(VAbstractPattern::getTool(node.GetId()));
SCASSERT(tool != nullptr);
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::ToggleExcludeState, parent, &VToolSeamAllowance::ToggleExcludeState,
Qt::UniqueConnection);
connect(tool, &VNodePoint::ToggleTurnPointState, parent, &VToolSeamAllowance::ToggleTurnPointState,
Qt::UniqueConnection);
connect(tool, &VNodePoint::ToggleSeamAllowanceAngleType, parent,
&VToolSeamAllowance::ToggleNodePointAngleType, Qt::UniqueConnection);
connect(tool, &VNodePoint::TogglePassmark, parent, &VToolSeamAllowance::ToggleNodePointPassmark,
@ -2071,8 +2093,10 @@ auto VToolSeamAllowance::IsGrainlinePositionValid() const -> bool
{
QLineF grainLine = m_grainLine->Grainline();
const VPiece detail = VAbstractTool::data.GetPiece(m_id);
const QVector<QPointF> contourPoints = detail.IsSeamAllowance() && not detail.IsSeamAllowanceBuiltIn() ?
detail.SeamAllowancePoints(getData()) : detail.MainPathPoints(getData());
QVector<QPointF> contourPoints;
detail.IsSeamAllowance() && not detail.IsSeamAllowanceBuiltIn()
? CastTo(detail.SeamAllowancePoints(getData()), contourPoints)
: CastTo(detail.MainPathPoints(getData()), contourPoints);
QVector<QPointF> points = VAbstractCurve::CurveIntersectLine(contourPoints, grainLine);
if (not points.isEmpty())

View File

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

View File

@ -52,7 +52,7 @@ void VisToolPiece::RefreshGeometry()
if (GetMode() == Mode::Creation)
{
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);
}
else

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,147 +2,126 @@
"vector": [
{
"saAfter": 0,
"turnPoint": true,
"type": "VSAPoint",
"x": 11565.008125001965,
"y": -71.44488549419933
"x": 11565.013142470898,
"y": -71.44502878281966
},
{
"saBefore": 0,
"turnPoint": true,
"type": "VSAPoint",
"x": 11774.053467225081,
"y": -3376.8303371353477
"x": 12574.226196766724,
"y": -4788.694779920271
},
{
"curvePoint": true,
"saBefore": 0,
"turnPoint": true,
"type": "VSAPoint",
"x": 11774.053467225081,
"y": -3376.8303371353477
},
{
"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
"x": 12574.226196766724,
"y": -4788.694779920271
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": 12688.625497168217,
"y": -4997.457976655285
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": 12937.571227539614,
"y": -5455.181123300274
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": 13363.424703096609,
"y": -6243.3010001396
},
{
"curvePoint": true,
"saAfter": 0,
"turnPoint": true,
"type": "VSAPoint",
"x": 13704.042216387523,
"y": -6875.648082494775
},
{
"saAfter": 0,
"turnPoint": true,
"type": "VSAPoint",
"x": 13704.042216387523,
"y": -6875.648082494775
},
{
"saBefore": 0,
"turnPoint": true,
"type": "VSAPoint",
"x": 13493.259591532773,
"y": -71.4448854942045
"x": 13493.254460030012,
"y": -71.44503203938407
},
{
"curvePoint": true,
"saBefore": 0,
"turnPoint": true,
"type": "VSAPoint",
"x": 13493.259591532773,
"y": -71.4448854942045
"x": 13493.254460030012,
"y": -71.44503203938407
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": 13227.96813484252,
"y": -78.38238188976378
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": 12939.963705708662,
"y": -83.80364173228347
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": 12664.66535433071,
"y": -86.51427165354332
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": 12393.602362204725,
"y": -86.51427165354332
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": 12118.304010826774,
"y": -83.80364173228347
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": 11830.299581692912,
"y": -78.38238188976378
},
{
"curvePoint": true,
"saAfter": 0,
"turnPoint": true,
"type": "VSAPoint",
"x": 11565.008125001965,
"y": -71.44488549419933
"x": 11565.013142470898,
"y": -71.44502878281966
}
]
}

View File

@ -2,48 +2,23 @@
"vector": [
{
"type": "QPointF",
"x": 11560.846475874965,
"y": -14.623761696484117
"x": 11551.905199769692,
"y": -14.389955863800495
},
{
"type": "QPointF",
"x": 11781.326946495077,
"y": -3500.819302857501
"x": 12404.150893454804,
"y": -3997.9450330949685
},
{
"type": "QPointF",
"x": 11867.565752333256,
"y": -3648.313692662954
"x": 12614.150847904311,
"y": -4979.523926317832
},
{
"type": "QPointF",
"x": 11962.607394275858,
"y": -3812.6942063012807
},
{
"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
"x": 12638.908041375378,
"y": -5024.702444307613
},
{
"type": "QPointF",
@ -57,38 +32,38 @@
},
{
"type": "QPointF",
"x": 13708.573357026718,
"y": -7003.606684992652
"x": 13708.907465404465,
"y": -7004.226948043184
},
{
"type": "QPointF",
"x": 13492.070905293423,
"y": -14.763675483318366
"x": 13492.380272854994,
"y": -14.755597758319709
},
{
"type": "QPointF",
"x": 13226.486095144688,
"y": -21.70884320982175
"x": 13226.486097782079,
"y": -21.708843140852863
},
{
"type": "QPointF",
"x": 12939.151113441983,
"y": -27.11598122480561
"x": 12938.896733996888,
"y": -27.120769543772127
},
{
"type": "QPointF",
"x": 12664.386257521342,
"x": 12664.107174239743,
"y": -29.824106164643062
},
{
"type": "QPointF",
"x": 12393.602362204725,
"y": -29.82135826771654
},
{
"type": "QPointF",
"x": 12393.881459014092,
"y": -29.82135826771654
},
{
"type": "QPointF",
"x": 12119.116603093453,
"y": -27.11598122480561
"x": 12118.86219091774,
"y": -27.11347624338321
},
{
"type": "QPointF",
@ -97,8 +72,8 @@
},
{
"type": "QPointF",
"x": 11560.846475874965,
"y": -14.623761696484117
"x": 11551.905199769692,
"y": -14.389955863800495
}
]
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,10 +1,30 @@
{
"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",
"x": -815.5965354330709,
"y": -46.674417477891
},
{
"type": "QPointF",
"x": -814.2667801920632,
"y": -46.77051665539527
},
{
"type": "QPointF",
"x": -778.5602746831936,
@ -35,6 +55,11 @@
"x": -652.0000133582188,
"y": -80.53001488530833
},
{
"type": "QPointF",
"x": -647.5347421078782,
"y": -82.70049226350477
},
{
"type": "QPointF",
"x": -631.5852394687809,
@ -140,46 +165,91 @@
"x": -374.97963878344376,
"y": 385.6272715746786
},
{
"type": "QPointF",
"x": -394.4224543531813,
"y": 386.9889713429367
},
{
"type": "QPointF",
"x": -414.7876067251059,
"y": 388.13579550460213
},
{
"type": "QPointF",
"x": -435.9520270040894,
"y": 389.07661798449516
},
{
"type": "QPointF",
"x": -457.7859582653625,
"y": 389.818484035946
},
{
"type": "QPointF",
"x": -480.15529936788164,
"y": 390.3673559353522
},
{
"type": "QPointF",
"x": -502.9230721502445,
"y": 390.728524359008
},
{
"type": "QPointF",
"x": -525.9503830211974,
"y": 390.90684349642925
},
{
"type": "QPointF",
"x": -549.0970864147907,
"y": 390.9068680348474
},
{
"type": "QPointF",
"x": -572.2222728858704,
"y": 390.7329321107656
},
{
"type": "QPointF",
"x": -595.1846601171007,
"y": 390.3891909827686
},
{
"type": "QPointF",
"x": -617.8429427582322,
"y": 389.87963542037477
},
{
"type": "QPointF",
"x": -640.0561486385066,
"y": 389.208081776043
},
{
"type": "QPointF",
"x": -661.6840517509004,
"y": 388.3781346110808
},
{
"type": "QPointF",
"x": -682.5877079123347,
"y": 387.3931112039713
},
{
"type": "QPointF",
"x": -702.630213618707,
"y": 386.255904969502
},
{
"type": "QPointF",
"x": -721.6778577696439,
"y": 384.9687413227849
},
{
"type": "QPointF",
"x": -739.6019742862287,
"y": 383.5327301728105
},
{
"type": "QPointF",
"x": -756.2820913691256,
@ -207,13 +277,28 @@
},
{
"type": "QPointF",
"x": -815.5965354330709,
"y": 371.9998875942574
"x": -818.0929557813755,
"y": 371.2795759163598
},
{
"type": "QPointF",
"x": -815.5965354330709,
"y": -46.674417477891
"x": -823.6929755287612,
"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,
"saBefore": 37.795275590551185,
"turnPoint": true,
"type": "VSAPoint",
"x": -814.7149606299213,
"y": 331.31319685039375
@ -10,19 +11,23 @@
{
"saAfter": 37.795275590551185,
"saBefore": 0,
"turnPoint": true,
"type": "VSAPoint",
"x": -814.7149606299213,
"y": -8.844283464566928
},
{
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 0,
"turnPoint": true,
"type": "VSAPoint",
"x": -814.7149606299213,
"y": -8.844283464566928
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -31,6 +36,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -39,6 +45,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -47,6 +54,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -55,6 +63,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -63,6 +72,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -71,6 +81,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -79,6 +90,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -87,6 +99,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -95,6 +108,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -102,84 +116,103 @@
"y": -69.04225265620269
},
{
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint",
"x": -590.4629921259842,
"y": -72.52932283464567
},
{
"turnPoint": true,
"type": "VSAPoint",
"x": -590.4629921259842,
"y": -72.52932283464567
},
{
"turnPoint": true,
"type": "VSAPoint",
"x": -231.11800695198497,
"y": 95.87915857519384
},
{
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint",
"x": -231.11800695198497,
"y": 95.87915857519384
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": -238.40281543387266,
"y": 116.44191216638788
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": -251.05490182747536,
"y": 155.85530707633535
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": -261.5198582532174,
"y": 193.3982017541216
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": -269.9242477292619,
"y": 229.27507897171068
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": -276.39463327377155,
"y": 263.69042150106657
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": -281.0575779049093,
"y": 296.8487121141533
},
{
"angle": 6,
"curvePoint": true,
"type": "VSAPoint",
"x": -284.03964464083833,
"y": 328.95443358293466
},
{
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint",
"x": -284.1473856336994,
"y": 331.31319685039375
},
{
"turnPoint": true,
"type": "VSAPoint",
"x": -284.1473856336994,
"y": 331.31319685039375
},
{
"curvePoint": true,
"turnPoint": true,
"type": "VSAPoint",
"x": -284.1473856336994,
"y": 331.31319685039375
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -188,6 +221,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -196,6 +230,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -204,6 +239,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -212,6 +248,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -220,6 +257,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -228,6 +266,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -236,6 +275,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -244,6 +284,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -252,6 +293,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -260,6 +302,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -268,6 +311,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -276,6 +320,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -284,6 +329,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -292,6 +338,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -300,6 +347,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -308,6 +356,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -316,6 +365,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -324,6 +374,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -332,6 +383,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -340,6 +392,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -348,6 +401,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -356,6 +410,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -364,6 +419,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -372,6 +428,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -380,6 +437,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -388,6 +446,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -396,6 +455,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -404,6 +464,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -412,6 +473,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -420,6 +482,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -428,6 +491,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -436,6 +500,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -444,6 +509,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -452,6 +518,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -460,6 +527,7 @@
},
{
"angle": 6,
"curvePoint": true,
"saAfter": 37.795275590551185,
"saBefore": 37.795275590551185,
"type": "VSAPoint",
@ -467,8 +535,10 @@
"y": 331.90352529002166
},
{
"curvePoint": true,
"saAfter": 151.18110236220474,
"saBefore": 37.795275590551185,
"turnPoint": true,
"type": "VSAPoint",
"x": -814.7149606299213,
"y": 331.31319685039375

View File

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