1 /************************************************************************
2  **
3  **  @file   vpatternconverter.cpp
4  **  @author Roman Telezhynskyi <dismine(at)gmail.com>
5  **  @date   11 12, 2014
6  **
7  **  @brief
8  **  @copyright
9  **  This source code is part of the Valentina project, a pattern making
10  **  program, whose allow create and modeling patterns of clothing.
11  **  Copyright (C) 2013-2015 Valentina project
12  **  <https://gitlab.com/smart-pattern/valentina> All Rights Reserved.
13  **
14  **  Valentina is free software: you can redistribute it and/or modify
15  **  it under the terms of the GNU General Public License as published by
16  **  the Free Software Foundation, either version 3 of the License, or
17  **  (at your option) any later version.
18  **
19  **  Valentina is distributed in the hope that it will be useful,
20  **  but WITHOUT ANY WARRANTY; without even the implied warranty of
21  **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  **  GNU General Public License for more details.
23  **
24  **  You should have received a copy of the GNU General Public License
25  **  along with Valentina.  If not, see <http://www.gnu.org/licenses/>.
26  **
27  *************************************************************************/
28 
29 #include "vpatternconverter.h"
30 
31 #include <QDir>
32 #include <QDomNode>
33 #include <QDomNodeList>
34 #include <QDomText>
35 #include <QFile>
36 #include <QFileInfo>
37 #include <QLatin1String>
38 #include <QList>
39 #include <QStaticStringData>
40 #include <QStringData>
41 #include <QStringDataPtr>
42 #include <algorithm>
43 #include <QGlobalStatic>
44 
45 #include "../exception/vexception.h"
46 #include "../exception/vexceptionemptyparameter.h"
47 #include "../qmuparser/qmutokenparser.h"
48 #include "../vmisc/def.h"
49 #include "vabstractconverter.h"
50 
51 class QDomElement;
52 
53 /*
54  * Version rules:
55  * 1. Version have three parts "major.minor.patch";
56  * 2. major part only for stable releases;
57  * 3. minor - 10 or more patch changes, or one big change;
58  * 4. patch - little change.
59  */
60 
61 const QString VPatternConverter::PatternMinVerStr = QStringLiteral("0.1.4");
62 const QString VPatternConverter::PatternMaxVerStr = QStringLiteral("0.8.11");
63 const QString VPatternConverter::CurrentSchema    = QStringLiteral("://schema/pattern/v0.8.11.xsd");
64 
65 //VPatternConverter::PatternMinVer; // <== DON'T FORGET TO UPDATE TOO!!!!
66 //VPatternConverter::PatternMaxVer; // <== DON'T FORGET TO UPDATE TOO!!!!
67 
68 namespace
69 {
70 // The list of all string we use for conversion
71 // Better to use global variables because repeating QStringLiteral blows up code size
72 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strUnit, (QLatin1String("unit")))
73 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strVersion, (QLatin1String("version")))
74 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strName, (QLatin1String("name")))
75 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strBase, (QLatin1String("base")))
76 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strFormula, (QLatin1String("formula")))
77 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strId, (QLatin1String("id")))
78 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strKGrowth , (QLatin1String("kgrowth")))
79 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strKSize, (QLatin1String("ksize")))
80 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strPoint, (QLatin1String("point")))
81 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strLength, (QLatin1String("length")))
82 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strAngle, (QLatin1String("angle")))
83 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strC1Radius, (QLatin1String("c1Radius")))
84 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strC2Radius, (QLatin1String("c2Radius")))
85 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strCRadius, (QLatin1String("cRadius")))
86 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strArc, (QLatin1String("arc")))
87 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strAngle1, (QLatin1String("angle1")))
88 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strAngle2, (QLatin1String("angle2")))
89 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strRadius, (QLatin1String("radius")))
90 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strPathPoint, (QLatin1String("pathPoint")))
91 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strKAsm1, (QLatin1String("kAsm1")))
92 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strKAsm2, (QLatin1String("kAsm2")))
93 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strPath, (QLatin1String("path")))
94 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strType, (QLatin1String("type")))
95 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strCutArc, (QLatin1String("cutArc")))
96 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strSpline, (QLatin1String("spline")))
97 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strSplinePath, (QLatin1String("splinePath")))
98 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strCutSpline, (QLatin1String("cutSpline")))
99 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strCutSplinePath, (QLatin1String("cutSplinePath")))
100 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strColor, (QLatin1String("color")))
101 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strMeasurements, (QLatin1String("measurements")))
102 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strIncrement, (QLatin1String("increment")))
103 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strIncrements, (QLatin1String("increments")))
104 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strPreviewCalculations, (QLatin1String("previewCalculations")))
105 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strModeling, (QLatin1String("modeling")))
106 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strTools, (QLatin1String("tools")))
107 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strIdTool, (QLatin1String("idTool")))
108 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strIdObject, (QLatin1String("idObject")))
109 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strChildren, (QLatin1String("children")))
110 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strChild, (QLatin1String("child")))
111 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strPointOfIntersectionCurves, (QLatin1String("pointOfIntersectionCurves")))
112 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strCurveIntersectAxis, (QLatin1String("curveIntersectAxis")))
113 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strCurve, (QLatin1String("curve")))
114 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strCurve1, (QLatin1String("curve1")))
115 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strCurve2, (QLatin1String("curve2")))
116 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strModelingPath, (QLatin1String("modelingPath")))
117 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strModelingSpline, (QLatin1String("modelingSpline")))
118 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strPointFromArcAndTangent, (QLatin1String("pointFromArcAndTangent")))
119 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strPointOfIntersectionArcs, (QLatin1String("pointOfIntersectionArcs")))
120 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strFirstArc, (QLatin1String("firstArc")))
121 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strSecondArc, (QLatin1String("secondArc")))
122 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strDetail, (QLatin1String("detail")))
123 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strSupplement, (QLatin1String("supplement")))
124 //Q_GLOBAL_STATIC_WITH_ARGS(const QString, strClosed, (QLatin1String("closed")))
125 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strWidth, (QLatin1String("width")))
126 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strHeight, (QLatin1String("height")))
127 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strNode, (QLatin1String("node")))
128 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strNodes, (QLatin1String("nodes")))
129 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strData, (QLatin1String("data")))
130 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strPatternInfo, (QLatin1String("patternInfo")))
131 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strGrainline, (QLatin1String("grainline")))
132 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strReverse, (QLatin1String("reverse")))
133 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strMx, (QLatin1String("mx")))
134 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strMy, (QLatin1String("my")))
135 //Q_GLOBAL_STATIC_WITH_ARGS(const QString, strForbidFlipping, (QLatin1String("forbidFlipping")))
136 //Q_GLOBAL_STATIC_WITH_ARGS(const QString, strInLayout, (QLatin1String("inLayout")))
137 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strSeamAllowance, (QLatin1String("seamAllowance")))
138 //Q_GLOBAL_STATIC_WITH_ARGS(const QString, strNodeType, (QLatin1String("nodeType")))
139 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strDet, (QLatin1String("det")))
140 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strTypeObject, (QLatin1String("typeObject")))
141 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strReadOnly, (QLatin1String("readOnly")))
142 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strPatternLabel, (QLatin1String("patternLabel")))
143 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strImage, (QLatin1String("image")))
144 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strAuthor, (QLatin1String("author")))
145 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strDescription, (QLatin1String("description")))
146 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strNotes, (QLatin1String("notes")))
147 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strGradation, (QLatin1String("gradation")))
148 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strPatternName, (QLatin1String("patternName")))
149 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strPatternNum, (QLatin1String("patternNumber")))
150 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strCompanyName, (QLatin1String("company")))
151 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strCustomerName, (QLatin1String("customer")))
152 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strLine, (QLatin1String("line")))
153 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strText, (QLatin1String("text")))
154 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strBold, (QLatin1String("bold")))
155 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strItalic, (QLatin1String("italic")))
156 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strAlignment, (QLatin1String("alignment")))
157 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strFSIncrement, (QLatin1String("sfIncrement")))
158 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strShowDate, (QLatin1String("showDate")))
159 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strShowMeasurements, (QLatin1String("showMeasurements")))
160 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strSize, (QLatin1String("size")))
161 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strMCP, (QLatin1String("mcp")))
162 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strLetter, (QLatin1String("letter")))
163 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strMaterial , (QLatin1String("material")))
164 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strUserDefined, (QLatin1String("userDef")))
165 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strPlacement, (QLatin1String("placement")))
166 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strCutNumber, (QLatin1String("cutNumber")))
167 Q_GLOBAL_STATIC_WITH_ARGS(const QString, strQuantity, (QLatin1String("quantity")))
168 } // anonymous namespace
169 
170 //---------------------------------------------------------------------------------------------------------------------
VPatternConverter(const QString & fileName)171 VPatternConverter::VPatternConverter(const QString &fileName)
172     : VAbstractConverter(fileName)
173 {
174     ValidateInputFile(CurrentSchema);
175 }
176 
177 //---------------------------------------------------------------------------------------------------------------------
XSDSchema(int ver) const178 QString VPatternConverter::XSDSchema(int ver) const
179 {
180     QHash <int, QString> schemas =
181     {
182         std::make_pair(FORMAT_VERSION(0, 1, 4), QStringLiteral("://schema/pattern/v0.1.4.xsd")),
183         std::make_pair(FORMAT_VERSION(0, 2, 0), QStringLiteral("://schema/pattern/v0.2.0.xsd")),
184         std::make_pair(FORMAT_VERSION(0, 2, 1), QStringLiteral("://schema/pattern/v0.2.1.xsd")),
185         std::make_pair(FORMAT_VERSION(0, 2, 2), QStringLiteral("://schema/pattern/v0.2.2.xsd")),
186         std::make_pair(FORMAT_VERSION(0, 2, 3), QStringLiteral("://schema/pattern/v0.2.3.xsd")),
187         std::make_pair(FORMAT_VERSION(0, 2, 4), QStringLiteral("://schema/pattern/v0.2.4.xsd")),
188         std::make_pair(FORMAT_VERSION(0, 2, 5), QStringLiteral("://schema/pattern/v0.2.5.xsd")),
189         std::make_pair(FORMAT_VERSION(0, 2, 6), QStringLiteral("://schema/pattern/v0.2.6.xsd")),
190         std::make_pair(FORMAT_VERSION(0, 2, 7), QStringLiteral("://schema/pattern/v0.2.7.xsd")),
191         std::make_pair(FORMAT_VERSION(0, 3, 0), QStringLiteral("://schema/pattern/v0.3.0.xsd")),
192         std::make_pair(FORMAT_VERSION(0, 3, 1), QStringLiteral("://schema/pattern/v0.3.1.xsd")),
193         std::make_pair(FORMAT_VERSION(0, 3, 2), QStringLiteral("://schema/pattern/v0.3.2.xsd")),
194         std::make_pair(FORMAT_VERSION(0, 3, 3), QStringLiteral("://schema/pattern/v0.3.3.xsd")),
195         std::make_pair(FORMAT_VERSION(0, 3, 4), QStringLiteral("://schema/pattern/v0.3.4.xsd")),
196         std::make_pair(FORMAT_VERSION(0, 3, 5), QStringLiteral("://schema/pattern/v0.3.5.xsd")),
197         std::make_pair(FORMAT_VERSION(0, 3, 6), QStringLiteral("://schema/pattern/v0.3.6.xsd")),
198         std::make_pair(FORMAT_VERSION(0, 3, 7), QStringLiteral("://schema/pattern/v0.3.7.xsd")),
199         std::make_pair(FORMAT_VERSION(0, 3, 8), QStringLiteral("://schema/pattern/v0.3.8.xsd")),
200         std::make_pair(FORMAT_VERSION(0, 3, 9), QStringLiteral("://schema/pattern/v0.3.9.xsd")),
201         std::make_pair(FORMAT_VERSION(0, 4, 0), QStringLiteral("://schema/pattern/v0.4.0.xsd")),
202         std::make_pair(FORMAT_VERSION(0, 4, 1), QStringLiteral("://schema/pattern/v0.4.1.xsd")),
203         std::make_pair(FORMAT_VERSION(0, 4, 2), QStringLiteral("://schema/pattern/v0.4.2.xsd")),
204         std::make_pair(FORMAT_VERSION(0, 4, 3), QStringLiteral("://schema/pattern/v0.4.3.xsd")),
205         std::make_pair(FORMAT_VERSION(0, 4, 4), QStringLiteral("://schema/pattern/v0.4.4.xsd")),
206         std::make_pair(FORMAT_VERSION(0, 4, 5), QStringLiteral("://schema/pattern/v0.4.5.xsd")),
207         std::make_pair(FORMAT_VERSION(0, 4, 6), QStringLiteral("://schema/pattern/v0.4.6.xsd")),
208         std::make_pair(FORMAT_VERSION(0, 4, 7), QStringLiteral("://schema/pattern/v0.4.7.xsd")),
209         std::make_pair(FORMAT_VERSION(0, 4, 8), QStringLiteral("://schema/pattern/v0.4.8.xsd")),
210         std::make_pair(FORMAT_VERSION(0, 5, 0), QStringLiteral("://schema/pattern/v0.5.0.xsd")),
211         std::make_pair(FORMAT_VERSION(0, 5, 1), QStringLiteral("://schema/pattern/v0.5.1.xsd")),
212         std::make_pair(FORMAT_VERSION(0, 6, 0), QStringLiteral("://schema/pattern/v0.6.0.xsd")),
213         std::make_pair(FORMAT_VERSION(0, 6, 1), QStringLiteral("://schema/pattern/v0.6.1.xsd")),
214         std::make_pair(FORMAT_VERSION(0, 6, 2), QStringLiteral("://schema/pattern/v0.6.2.xsd")),
215         std::make_pair(FORMAT_VERSION(0, 6, 3), QStringLiteral("://schema/pattern/v0.6.3.xsd")),
216         std::make_pair(FORMAT_VERSION(0, 6, 4), QStringLiteral("://schema/pattern/v0.6.4.xsd")),
217         std::make_pair(FORMAT_VERSION(0, 6, 5), QStringLiteral("://schema/pattern/v0.6.5.xsd")),
218         std::make_pair(FORMAT_VERSION(0, 6, 6), QStringLiteral("://schema/pattern/v0.6.6.xsd")),
219         std::make_pair(FORMAT_VERSION(0, 7, 0), QStringLiteral("://schema/pattern/v0.7.0.xsd")),
220         std::make_pair(FORMAT_VERSION(0, 7, 1), QStringLiteral("://schema/pattern/v0.7.1.xsd")),
221         std::make_pair(FORMAT_VERSION(0, 7, 2), QStringLiteral("://schema/pattern/v0.7.2.xsd")),
222         std::make_pair(FORMAT_VERSION(0, 7, 3), QStringLiteral("://schema/pattern/v0.7.3.xsd")),
223         std::make_pair(FORMAT_VERSION(0, 7, 4), QStringLiteral("://schema/pattern/v0.7.4.xsd")),
224         std::make_pair(FORMAT_VERSION(0, 7, 5), QStringLiteral("://schema/pattern/v0.7.5.xsd")),
225         std::make_pair(FORMAT_VERSION(0, 7, 6), QStringLiteral("://schema/pattern/v0.7.6.xsd")),
226         std::make_pair(FORMAT_VERSION(0, 7, 7), QStringLiteral("://schema/pattern/v0.7.7.xsd")),
227         std::make_pair(FORMAT_VERSION(0, 7, 8), QStringLiteral("://schema/pattern/v0.7.8.xsd")),
228         std::make_pair(FORMAT_VERSION(0, 7, 9), QStringLiteral("://schema/pattern/v0.7.9.xsd")),
229         std::make_pair(FORMAT_VERSION(0, 7, 10), QStringLiteral("://schema/pattern/v0.7.10.xsd")),
230         std::make_pair(FORMAT_VERSION(0, 7, 11), QStringLiteral("://schema/pattern/v0.7.11.xsd")),
231         std::make_pair(FORMAT_VERSION(0, 7, 12), QStringLiteral("://schema/pattern/v0.7.12.xsd")),
232         std::make_pair(FORMAT_VERSION(0, 7, 13), QStringLiteral("://schema/pattern/v0.7.13.xsd")),
233         std::make_pair(FORMAT_VERSION(0, 8, 0), QStringLiteral("://schema/pattern/v0.8.0.xsd")),
234         std::make_pair(FORMAT_VERSION(0, 8, 1), QStringLiteral("://schema/pattern/v0.8.1.xsd")),
235         std::make_pair(FORMAT_VERSION(0, 8, 2), QStringLiteral("://schema/pattern/v0.8.2.xsd")),
236         std::make_pair(FORMAT_VERSION(0, 8, 3), QStringLiteral("://schema/pattern/v0.8.3.xsd")),
237         std::make_pair(FORMAT_VERSION(0, 8, 4), QStringLiteral("://schema/pattern/v0.8.4.xsd")),
238         std::make_pair(FORMAT_VERSION(0, 8, 5), QStringLiteral("://schema/pattern/v0.8.5.xsd")),
239         std::make_pair(FORMAT_VERSION(0, 8, 6), QStringLiteral("://schema/pattern/v0.8.6.xsd")),
240         std::make_pair(FORMAT_VERSION(0, 8, 7), QStringLiteral("://schema/pattern/v0.8.7.xsd")),
241         std::make_pair(FORMAT_VERSION(0, 8, 8), QStringLiteral("://schema/pattern/v0.8.8.xsd")),
242         std::make_pair(FORMAT_VERSION(0, 8, 9), QStringLiteral("://schema/pattern/v0.8.9.xsd")),
243         std::make_pair(FORMAT_VERSION(0, 8, 10), QStringLiteral("://schema/pattern/v0.8.10.xsd")),
244         std::make_pair(FORMAT_VERSION(0, 8, 11), CurrentSchema)
245     };
246 
247     if (schemas.contains(ver))
248     {
249         return schemas.value(ver);
250     }
251 
252     InvalidVersion(ver);
253 }
254 
255 //---------------------------------------------------------------------------------------------------------------------
ApplyPatches()256 void VPatternConverter::ApplyPatches()
257 {
258     switch (m_ver)
259     {
260         case (FORMAT_VERSION(0, 1, 4)):
261             ToV0_2_0();
262             ValidateXML(XSDSchema(FORMAT_VERSION(0, 2, 0)));
263             Q_FALLTHROUGH();
264         case (FORMAT_VERSION(0, 2, 0)):
265             ToV0_2_1();
266             ValidateXML(XSDSchema(FORMAT_VERSION(0, 2, 1)));
267             Q_FALLTHROUGH();
268         case (FORMAT_VERSION(0, 2, 1)):
269             ToV0_2_2();
270             ValidateXML(XSDSchema(FORMAT_VERSION(0, 2, 2)));
271             Q_FALLTHROUGH();
272         case (FORMAT_VERSION(0, 2, 2)):
273             ToV0_2_3();
274             ValidateXML(XSDSchema(FORMAT_VERSION(0, 2, 3)));
275             Q_FALLTHROUGH();
276         case (FORMAT_VERSION(0, 2, 3)):
277             ToV0_2_4();
278             ValidateXML(XSDSchema(FORMAT_VERSION(0, 2, 4)));
279             Q_FALLTHROUGH();
280         case (FORMAT_VERSION(0, 2, 4)):
281             ToV0_2_5();
282             ValidateXML(XSDSchema(FORMAT_VERSION(0, 2, 5)));
283             Q_FALLTHROUGH();
284         case (FORMAT_VERSION(0, 2, 5)):
285             ToV0_2_6();
286             ValidateXML(XSDSchema(FORMAT_VERSION(0, 2, 6)));
287             Q_FALLTHROUGH();
288         case (FORMAT_VERSION(0, 2, 6)):
289             ToV0_2_7();
290             ValidateXML(XSDSchema(FORMAT_VERSION(0, 2, 7)));
291             Q_FALLTHROUGH();
292         case (FORMAT_VERSION(0, 2, 7)):
293             ToV0_3_0();
294             ValidateXML(XSDSchema(FORMAT_VERSION(0, 3, 0)));
295             Q_FALLTHROUGH();
296         case (FORMAT_VERSION(0, 3, 0)):
297             ToV0_3_1();
298             ValidateXML(XSDSchema(FORMAT_VERSION(0, 3, 1)));
299             Q_FALLTHROUGH();
300         case (FORMAT_VERSION(0, 3, 1)):
301             ToV0_3_2();
302             ValidateXML(XSDSchema(FORMAT_VERSION(0, 3, 2)));
303             Q_FALLTHROUGH();
304         case (FORMAT_VERSION(0, 3, 2)):
305             ToV0_3_3();
306             ValidateXML(XSDSchema(FORMAT_VERSION(0, 3, 3)));
307             Q_FALLTHROUGH();
308         case (FORMAT_VERSION(0, 3, 3)):
309             ToV0_3_4();
310             ValidateXML(XSDSchema(FORMAT_VERSION(0, 3, 4)));
311             Q_FALLTHROUGH();
312         case (FORMAT_VERSION(0, 3, 4)):
313             ToV0_3_5();
314             ValidateXML(XSDSchema(FORMAT_VERSION(0, 3, 5)));
315             Q_FALLTHROUGH();
316         case (FORMAT_VERSION(0, 3, 5)):
317             ToV0_3_6();
318             ValidateXML(XSDSchema(FORMAT_VERSION(0, 3, 6)));
319             Q_FALLTHROUGH();
320         case (FORMAT_VERSION(0, 3, 6)):
321             ToV0_3_7();
322             ValidateXML(XSDSchema(FORMAT_VERSION(0, 3, 7)));
323             Q_FALLTHROUGH();
324         case (FORMAT_VERSION(0, 3, 7)):
325             ToV0_3_8();
326             ValidateXML(XSDSchema(FORMAT_VERSION(0, 3, 8)));
327             Q_FALLTHROUGH();
328         case (FORMAT_VERSION(0, 3, 8)):
329             ToV0_3_9();
330             ValidateXML(XSDSchema(FORMAT_VERSION(0, 3, 9)));
331             Q_FALLTHROUGH();
332         case (FORMAT_VERSION(0, 3, 9)):
333             ToV0_4_0();
334             ValidateXML(XSDSchema(FORMAT_VERSION(0, 4, 0)));
335             Q_FALLTHROUGH();
336         case (FORMAT_VERSION(0, 4, 0)):
337             ToV0_4_1();
338             ValidateXML(XSDSchema(FORMAT_VERSION(0, 4, 1)));
339             Q_FALLTHROUGH();
340         case (FORMAT_VERSION(0, 4, 1)):
341             ToV0_4_2();
342             ValidateXML(XSDSchema(FORMAT_VERSION(0, 4, 2)));
343             Q_FALLTHROUGH();
344         case (FORMAT_VERSION(0, 4, 2)):
345             ToV0_4_3();
346             ValidateXML(XSDSchema(FORMAT_VERSION(0, 4, 3)));
347             Q_FALLTHROUGH();
348         case (FORMAT_VERSION(0, 4, 3)):
349             ToV0_4_4();
350             ValidateXML(XSDSchema(FORMAT_VERSION(0, 4, 4)));
351             Q_FALLTHROUGH();
352         case (FORMAT_VERSION(0, 4, 4)):
353             ToV0_4_5();
354             ValidateXML(XSDSchema(FORMAT_VERSION(0, 4, 5)));
355             Q_FALLTHROUGH();
356         case (FORMAT_VERSION(0, 4, 5)):
357             ToV0_4_6();
358             ValidateXML(XSDSchema(FORMAT_VERSION(0, 4, 6)));
359             Q_FALLTHROUGH();
360         case (FORMAT_VERSION(0, 4, 6)):
361             ToV0_4_7();
362             ValidateXML(XSDSchema(FORMAT_VERSION(0, 4, 7)));
363             Q_FALLTHROUGH();
364         case (FORMAT_VERSION(0, 4, 7)):
365             ToV0_4_8();
366             ValidateXML(XSDSchema(FORMAT_VERSION(0, 4, 8)));
367             Q_FALLTHROUGH();
368         case (FORMAT_VERSION(0, 4, 8)):
369             ToV0_5_0();
370             ValidateXML(XSDSchema(FORMAT_VERSION(0, 5, 0)));
371             Q_FALLTHROUGH();
372         case (FORMAT_VERSION(0, 5, 0)):
373             ToV0_5_1();
374             ValidateXML(XSDSchema(FORMAT_VERSION(0, 5, 1)));
375             Q_FALLTHROUGH();
376         case (FORMAT_VERSION(0, 5, 1)):
377             ToV0_6_0();
378             ValidateXML(XSDSchema(FORMAT_VERSION(0, 6, 0)));
379             Q_FALLTHROUGH();
380         case (FORMAT_VERSION(0, 6, 0)):
381             ToV0_6_1();
382             ValidateXML(XSDSchema(FORMAT_VERSION(0, 6, 1)));
383             Q_FALLTHROUGH();
384         case (FORMAT_VERSION(0, 6, 1)):
385             ToV0_6_2();
386             ValidateXML(XSDSchema(FORMAT_VERSION(0, 6, 2)));
387             Q_FALLTHROUGH();
388         case (FORMAT_VERSION(0, 6, 2)):
389             ToV0_6_3();
390             ValidateXML(XSDSchema(FORMAT_VERSION(0, 6, 3)));
391             Q_FALLTHROUGH();
392         case (FORMAT_VERSION(0, 6, 3)):
393             ToV0_6_4();
394             ValidateXML(XSDSchema(FORMAT_VERSION(0, 6, 4)));
395             Q_FALLTHROUGH();
396         case (FORMAT_VERSION(0, 6, 4)):
397             ToV0_6_5();
398             ValidateXML(XSDSchema(FORMAT_VERSION(0, 6, 5)));
399             Q_FALLTHROUGH();
400         case (FORMAT_VERSION(0, 6, 5)):
401             ToV0_6_6();
402             ValidateXML(XSDSchema(FORMAT_VERSION(0, 6, 6)));
403             Q_FALLTHROUGH();
404         case (FORMAT_VERSION(0, 6, 6)):
405             ToV0_7_0();
406             ValidateXML(XSDSchema(FORMAT_VERSION(0, 7, 0)));
407             Q_FALLTHROUGH();
408         case (FORMAT_VERSION(0, 7, 0)):
409             ToV0_7_1();
410             ValidateXML(XSDSchema(FORMAT_VERSION(0, 7, 1)));
411             Q_FALLTHROUGH();
412         case (FORMAT_VERSION(0, 7, 1)):
413             ToV0_7_2();
414             ValidateXML(XSDSchema(FORMAT_VERSION(0, 7, 2)));
415             Q_FALLTHROUGH();
416         case (FORMAT_VERSION(0, 7, 2)):
417             ToV0_7_3();
418             ValidateXML(XSDSchema(FORMAT_VERSION(0, 7, 3)));
419             Q_FALLTHROUGH();
420         case (FORMAT_VERSION(0, 7, 3)):
421             ToV0_7_4();
422             ValidateXML(XSDSchema(FORMAT_VERSION(0, 7, 4)));
423             Q_FALLTHROUGH();
424         case (FORMAT_VERSION(0, 7, 4)):
425             ToV0_7_5();
426             ValidateXML(XSDSchema(FORMAT_VERSION(0, 7, 5)));
427             Q_FALLTHROUGH();
428         case (FORMAT_VERSION(0, 7, 5)):
429             ToV0_7_6();
430             ValidateXML(XSDSchema(FORMAT_VERSION(0, 7, 6)));
431             Q_FALLTHROUGH();
432         case (FORMAT_VERSION(0, 7, 6)):
433             ToV0_7_7();
434             ValidateXML(XSDSchema(FORMAT_VERSION(0, 7, 7)));
435             Q_FALLTHROUGH();
436         case (FORMAT_VERSION(0, 7, 7)):
437             ToV0_7_8();
438             ValidateXML(XSDSchema(FORMAT_VERSION(0, 7, 8)));
439             Q_FALLTHROUGH();
440         case (FORMAT_VERSION(0, 7, 8)):
441             ToV0_7_9();
442             ValidateXML(XSDSchema(FORMAT_VERSION(0, 7, 9)));
443             Q_FALLTHROUGH();
444         case (FORMAT_VERSION(0, 7, 9)):
445             ToV0_7_10();
446             ValidateXML(XSDSchema(FORMAT_VERSION(0, 7, 10)));
447             Q_FALLTHROUGH();
448         case (FORMAT_VERSION(0, 7, 10)):
449             ToV0_7_11();
450             ValidateXML(XSDSchema(FORMAT_VERSION(0, 7, 11)));
451             Q_FALLTHROUGH();
452         case (FORMAT_VERSION(0, 7, 11)):
453             ToV0_7_12();
454             ValidateXML(XSDSchema(FORMAT_VERSION(0, 7, 12)));
455             Q_FALLTHROUGH();
456         case (FORMAT_VERSION(0, 7, 12)):
457             ToV0_7_13();
458             ValidateXML(XSDSchema(FORMAT_VERSION(0, 7, 13)));
459             Q_FALLTHROUGH();
460         case (FORMAT_VERSION(0, 7, 13)):
461             ToV0_8_0();
462             ValidateXML(XSDSchema(FORMAT_VERSION(0, 8, 0)));
463             Q_FALLTHROUGH();
464         case (FORMAT_VERSION(0, 8, 0)):
465             ToV0_8_1();
466             ValidateXML(XSDSchema(FORMAT_VERSION(0, 8, 1)));
467             Q_FALLTHROUGH();
468         case (FORMAT_VERSION(0, 8, 1)):
469             ToV0_8_2();
470             ValidateXML(XSDSchema(FORMAT_VERSION(0, 8, 2)));
471             Q_FALLTHROUGH();
472         case (FORMAT_VERSION(0, 8, 2)):
473             ToV0_8_3();
474             ValidateXML(XSDSchema(FORMAT_VERSION(0, 8, 3)));
475             Q_FALLTHROUGH();
476         case (FORMAT_VERSION(0, 8, 3)):
477             ToV0_8_4();
478             ValidateXML(XSDSchema(FORMAT_VERSION(0, 8, 4)));
479             Q_FALLTHROUGH();
480         case (FORMAT_VERSION(0, 8, 4)):
481             ToV0_8_5();
482             ValidateXML(XSDSchema(FORMAT_VERSION(0, 8, 5)));
483             Q_FALLTHROUGH();
484         case (FORMAT_VERSION(0, 8, 5)):
485             ToV0_8_6();
486             ValidateXML(XSDSchema(FORMAT_VERSION(0, 8, 6)));
487             Q_FALLTHROUGH();
488         case (FORMAT_VERSION(0, 8, 6)):
489             ToV0_8_7();
490             ValidateXML(XSDSchema(FORMAT_VERSION(0, 8, 7)));
491             Q_FALLTHROUGH();
492         case (FORMAT_VERSION(0, 8, 7)):
493             ToV0_8_8();
494             ValidateXML(XSDSchema(FORMAT_VERSION(0, 8, 8)));
495             Q_FALLTHROUGH();
496         case (FORMAT_VERSION(0, 8, 8)):
497             ToV0_8_9();
498             ValidateXML(XSDSchema(FORMAT_VERSION(0, 8, 9)));
499             Q_FALLTHROUGH();
500         case (FORMAT_VERSION(0, 8, 9)):
501             ToV0_8_10();
502             ValidateXML(XSDSchema(FORMAT_VERSION(0, 8, 10)));
503             Q_FALLTHROUGH();
504         case (FORMAT_VERSION(0, 8, 10)):
505             ToV0_8_11();
506             ValidateXML(XSDSchema(FORMAT_VERSION(0, 8, 11)));
507             Q_FALLTHROUGH();
508         case (FORMAT_VERSION(0, 8, 11)):
509             break;
510         default:
511             InvalidVersion(m_ver);
512     }
513 }
514 
515 //---------------------------------------------------------------------------------------------------------------------
DowngradeToCurrentMaxVersion()516 void VPatternConverter::DowngradeToCurrentMaxVersion()
517 {
518     SetVersion(PatternMaxVerStr);
519     Save();
520 }
521 
522 //---------------------------------------------------------------------------------------------------------------------
IsReadOnly() const523 bool VPatternConverter::IsReadOnly() const
524 {
525     // Check if attribute readOnly was not changed in file format
526     Q_STATIC_ASSERT_X(VPatternConverter::PatternMaxVer == FORMAT_VERSION(0, 8, 11),
527                       "Check attribute readOnly.");
528 
529     // Possibly in future attribute readOnly will change position etc.
530     // For now position is the same for all supported format versions.
531     // But don't forget to keep all versions of attribute until we support that format versions
532 
533     const QDomElement pattern = documentElement();
534 
535     if (pattern.isNull())
536     {
537         return false;
538     }
539 
540     return GetParametrBool(pattern, *strReadOnly, falseStr);
541 }
542 
543 //---------------------------------------------------------------------------------------------------------------------
ToV0_2_0()544 void VPatternConverter::ToV0_2_0()
545 {
546     // TODO. Delete if minimal supported version is 0.2.0
547     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
548                       "Time to refactor the code.");
549 
550     SetVersion(QStringLiteral("0.2.0"));
551     TagUnitToV0_2_0();
552     TagIncrementToV0_2_0();
553     ConvertMeasurementsToV0_2_0();
554     TagMeasurementsToV0_2_0();//Alwayse last!!!
555     Save();
556 }
557 
558 //---------------------------------------------------------------------------------------------------------------------
ToV0_2_1()559 void VPatternConverter::ToV0_2_1()
560 {
561     // TODO. Delete if minimal supported version is 0.2.1
562     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 1),
563                       "Time to refactor the code.");
564 
565     SetVersion(QStringLiteral("0.2.1"));
566     ConvertMeasurementsToV0_2_1();
567     Save();
568 }
569 
570 //---------------------------------------------------------------------------------------------------------------------
ToV0_2_2()571 void VPatternConverter::ToV0_2_2()
572 {
573     // TODO. Delete if minimal supported version is 0.2.2
574     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 2),
575                       "Time to refactor the code.");
576 
577     SetVersion(QStringLiteral("0.2.2"));
578     Save();
579 }
580 
581 //---------------------------------------------------------------------------------------------------------------------
ToV0_2_3()582 void VPatternConverter::ToV0_2_3()
583 {
584     // TODO. Delete if minimal supported version is 0.2.3
585     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 3),
586                       "Time to refactor the code.");
587 
588     SetVersion(QStringLiteral("0.2.3"));
589     Save();
590 }
591 
592 //---------------------------------------------------------------------------------------------------------------------
ToV0_2_4()593 void VPatternConverter::ToV0_2_4()
594 {
595     // TODO. Delete if minimal supported version is 0.2.4
596     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 4),
597                       "Time to refactor the code.");
598 
599     FixToolUnionToV0_2_4();
600     SetVersion(QStringLiteral("0.2.4"));
601     Save();
602 }
603 
604 //---------------------------------------------------------------------------------------------------------------------
ToV0_2_5()605 void VPatternConverter::ToV0_2_5()
606 {
607     // TODO. Delete if minimal supported version is 0.2.5
608     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 5),
609                       "Time to refactor the code.");
610 
611     SetVersion(QStringLiteral("0.2.5"));
612     Save();
613 }
614 
615 //---------------------------------------------------------------------------------------------------------------------
ToV0_2_6()616 void VPatternConverter::ToV0_2_6()
617 {
618     // TODO. Delete if minimal supported version is 0.2.6
619     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 6),
620                       "Time to refactor the code.");
621 
622     SetVersion(QStringLiteral("0.2.6"));
623     Save();
624 }
625 
626 //---------------------------------------------------------------------------------------------------------------------
ToV0_2_7()627 void VPatternConverter::ToV0_2_7()
628 {
629     // TODO. Delete if minimal supported version is 0.2.7
630     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 7),
631                       "Time to refactor the code.");
632 
633     SetVersion(QStringLiteral("0.2.7"));
634     Save();
635 }
636 
637 //---------------------------------------------------------------------------------------------------------------------
ToV0_3_0()638 void VPatternConverter::ToV0_3_0()
639 {
640     // TODO. Delete if minimal supported version is 0.3.0
641     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 3, 0),
642                       "Time to refactor the code.");
643 
644     //Cutting path do not create anymore subpaths
645     FixCutPoint();
646     FixCutPoint();
647     SetVersion(QStringLiteral("0.3.0"));
648     Save();
649 }
650 
651 //---------------------------------------------------------------------------------------------------------------------
ToV0_3_1()652 void VPatternConverter::ToV0_3_1()
653 {
654     // TODO. Delete if minimal supported version is 0.3.1
655     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 3, 1),
656                       "Time to refactor the code.");
657 
658     SetVersion(QStringLiteral("0.3.1"));
659     RemoveColorToolCutV0_3_1();
660     Save();
661 }
662 
663 //---------------------------------------------------------------------------------------------------------------------
ToV0_3_2()664 void VPatternConverter::ToV0_3_2()
665 {
666     // TODO. Delete if minimal supported version is 0.3.2
667     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 3, 2),
668                       "Time to refactor the code.");
669 
670     SetVersion(QStringLiteral("0.3.2"));
671     Save();
672 }
673 
674 //---------------------------------------------------------------------------------------------------------------------
ToV0_3_3()675 void VPatternConverter::ToV0_3_3()
676 {
677     // TODO. Delete if minimal supported version is 0.3.3
678     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 3, 3),
679                       "Time to refactor the code.");
680 
681     SetVersion(QStringLiteral("0.3.3"));
682     Save();
683 }
684 
685 //---------------------------------------------------------------------------------------------------------------------
ToV0_3_4()686 void VPatternConverter::ToV0_3_4()
687 {
688     // TODO. Delete if minimal supported version is 0.3.4
689     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 3, 4),
690                       "Time to refactor the code.");
691 
692     SetVersion(QStringLiteral("0.3.4"));
693     Save();
694 }
695 
696 //---------------------------------------------------------------------------------------------------------------------
ToV0_3_5()697 void VPatternConverter::ToV0_3_5()
698 {
699     // TODO. Delete if minimal supported version is 0.3.5
700     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 3, 5),
701                       "Time to refactor the code.");
702 
703     SetVersion(QStringLiteral("0.3.5"));
704     Save();
705 }
706 
707 //---------------------------------------------------------------------------------------------------------------------
ToV0_3_6()708 void VPatternConverter::ToV0_3_6()
709 {
710     // TODO. Delete if minimal supported version is 0.3.6
711     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 3, 6),
712                       "Time to refactor the code.");
713 
714     SetVersion(QStringLiteral("0.3.6"));
715     Save();
716 }
717 
718 //---------------------------------------------------------------------------------------------------------------------
ToV0_3_7()719 void VPatternConverter::ToV0_3_7()
720 {
721     // TODO. Delete if minimal supported version is 0.3.7
722     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 3, 7),
723                       "Time to refactor the code.");
724 
725     SetVersion(QStringLiteral("0.3.7"));
726     Save();
727 }
728 
729 //---------------------------------------------------------------------------------------------------------------------
ToV0_3_8()730 void VPatternConverter::ToV0_3_8()
731 {
732     // TODO. Delete if minimal supported version is 0.3.8
733     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 3, 8),
734                       "Time to refactor the code.");
735 
736     SetVersion(QStringLiteral("0.3.8"));
737     Save();
738 }
739 
740 //---------------------------------------------------------------------------------------------------------------------
ToV0_3_9()741 void VPatternConverter::ToV0_3_9()
742 {
743     // TODO. Delete if minimal supported version is 0.3.9
744     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 3, 9),
745                       "Time to refactor the code.");
746 
747     SetVersion(QStringLiteral("0.3.9"));
748     Save();
749 }
750 
751 //---------------------------------------------------------------------------------------------------------------------
ToV0_4_0()752 void VPatternConverter::ToV0_4_0()
753 {
754     // TODO. Delete if minimal supported version is 0.4.0
755     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 4, 0),
756                       "Time to refactor the code.");
757 
758     SetVersion(QStringLiteral("0.4.0"));
759     TagRemoveAttributeTypeObjectInV0_4_0();
760     TagDetailToV0_4_0();
761     TagUnionDetailsToV0_4_0();
762     Save();
763 }
764 
765 //---------------------------------------------------------------------------------------------------------------------
ToV0_4_1()766 void VPatternConverter::ToV0_4_1()
767 {
768     // TODO. Delete if minimal supported version is 0.4.1
769     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 4, 1),
770                       "Time to refactor the code.");
771 
772     SetVersion(QStringLiteral("0.4.1"));
773     Save();
774 }
775 
776 //---------------------------------------------------------------------------------------------------------------------
ToV0_4_2()777 void VPatternConverter::ToV0_4_2()
778 {
779     // TODO. Delete if minimal supported version is 0.4.2
780     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 4, 2),
781                       "Time to refactor the code.");
782 
783     SetVersion(QStringLiteral("0.4.2"));
784     Save();
785 }
786 
787 //---------------------------------------------------------------------------------------------------------------------
ToV0_4_3()788 void VPatternConverter::ToV0_4_3()
789 {
790     // TODO. Delete if minimal supported version is 0.4.3
791     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 4, 3),
792                       "Time to refactor the code.");
793 
794     SetVersion(QStringLiteral("0.4.3"));
795     Save();
796 }
797 
798 //---------------------------------------------------------------------------------------------------------------------
ToV0_4_4()799 void VPatternConverter::ToV0_4_4()
800 {
801     // TODO. Delete if minimal supported version is 0.4.4
802     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 4, 4),
803                       "Time to refactor the code.");
804 
805     SetVersion(QStringLiteral("0.4.4"));
806     LabelTagToV0_4_4(*strData);
807     LabelTagToV0_4_4(*strPatternInfo);
808     Save();
809 }
810 
811 //---------------------------------------------------------------------------------------------------------------------
ToV0_4_5()812 void VPatternConverter::ToV0_4_5()
813 {
814     // TODO. Delete if minimal supported version is 0.4.5
815     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 4, 5),
816                       "Time to refactor the code.");
817     SetVersion(QStringLiteral("0.4.5"));
818     Save();
819 }
820 
821 //---------------------------------------------------------------------------------------------------------------------
ToV0_4_6()822 void VPatternConverter::ToV0_4_6()
823 {
824     // TODO. Delete if minimal supported version is 0.4.6
825     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 4, 6),
826                       "Time to refactor the code.");
827     SetVersion(QStringLiteral("0.4.6"));
828     Save();
829 }
830 
831 //---------------------------------------------------------------------------------------------------------------------
ToV0_4_7()832 void VPatternConverter::ToV0_4_7()
833 {
834     // TODO. Delete if minimal supported version is 0.4.7
835     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 4, 7),
836                       "Time to refactor the code.");
837     SetVersion(QStringLiteral("0.4.7"));
838     Save();
839 }
840 
841 //---------------------------------------------------------------------------------------------------------------------
ToV0_4_8()842 void VPatternConverter::ToV0_4_8()
843 {
844     // TODO. Delete if minimal supported version is 0.4.8
845     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 4, 8),
846                       "Time to refactor the code.");
847     SetVersion(QStringLiteral("0.4.8"));
848     Save();
849 }
850 
851 //---------------------------------------------------------------------------------------------------------------------
ToV0_5_0()852 void VPatternConverter::ToV0_5_0()
853 {
854     // TODO. Delete if minimal supported version is 0.5.0
855     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 5, 0),
856                       "Time to refactor the code.");
857     SetVersion(QStringLiteral("0.5.0"));
858     Save();
859 }
860 
861 //---------------------------------------------------------------------------------------------------------------------
ToV0_5_1()862 void VPatternConverter::ToV0_5_1()
863 {
864     // TODO. Delete if minimal supported version is 0.5.1
865     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 5, 1),
866                       "Time to refactor the code.");
867     SetVersion(QStringLiteral("0.5.1"));
868     Save();
869 }
870 
871 //---------------------------------------------------------------------------------------------------------------------
ToV0_6_0()872 void VPatternConverter::ToV0_6_0()
873 {
874     // TODO. Delete if minimal supported version is 0.6.0
875     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 6, 0),
876                       "Time to refactor the code.");
877     SetVersion(QStringLiteral("0.6.0"));
878     QDomElement label = AddTagPatternLabelV0_5_1();
879     PortPatternLabeltoV0_6_0(label);
880     PortPieceLabelstoV0_6_0();
881     RemoveUnusedTagsV0_6_0();
882     Save();
883 }
884 
885 //---------------------------------------------------------------------------------------------------------------------
ToV0_6_1()886 void VPatternConverter::ToV0_6_1()
887 {
888     // TODO. Delete if minimal supported version is 0.6.1
889     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 6, 1),
890                       "Time to refactor the code.");
891     SetVersion(QStringLiteral("0.6.1"));
892     Save();
893 }
894 
895 //---------------------------------------------------------------------------------------------------------------------
ToV0_6_2()896 void VPatternConverter::ToV0_6_2()
897 {
898     // TODO. Delete if minimal supported version is 0.6.2
899     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 6, 2),
900                       "Time to refactor the code.");
901     SetVersion(QStringLiteral("0.6.2"));
902     AddTagPreviewCalculationsV0_6_2();
903     Save();
904 }
905 
906 //---------------------------------------------------------------------------------------------------------------------
ToV0_6_3()907 void VPatternConverter::ToV0_6_3()
908 {
909     // TODO. Delete if minimal supported version is 0.6.3
910     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 6, 3),
911                       "Time to refactor the code.");
912     SetVersion(QStringLiteral("0.6.3"));
913     Save();
914 }
915 
916 //---------------------------------------------------------------------------------------------------------------------
ToV0_6_4()917 void VPatternConverter::ToV0_6_4()
918 {
919     // TODO. Delete if minimal supported version is 0.6.4
920     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 6, 4),
921                       "Time to refactor the code.");
922     SetVersion(QStringLiteral("0.6.4"));
923     Save();
924 }
925 
926 //---------------------------------------------------------------------------------------------------------------------
ToV0_6_5()927 void VPatternConverter::ToV0_6_5()
928 {
929     // TODO. Delete if minimal supported version is 0.6.5
930     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 6, 5),
931                       "Time to refactor the code.");
932     SetVersion(QStringLiteral("0.6.5"));
933     Save();
934 }
935 
936 //---------------------------------------------------------------------------------------------------------------------
ToV0_6_6()937 void VPatternConverter::ToV0_6_6()
938 {
939     // TODO. Delete if minimal supported version is 0.6.6
940     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 6, 6),
941                       "Time to refactor the code.");
942     SetVersion(QStringLiteral("0.6.6"));
943     Save();
944 }
945 
946 //---------------------------------------------------------------------------------------------------------------------
ToV0_7_0()947 void VPatternConverter::ToV0_7_0()
948 {
949     // TODO. Delete if minimal supported version is 0.7.0
950     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 7, 0),
951                       "Time to refactor the code.");
952     SetVersion(QStringLiteral("0.7.0"));
953     Save();
954 }
955 
956 //---------------------------------------------------------------------------------------------------------------------
ToV0_7_1()957 void VPatternConverter::ToV0_7_1()
958 {
959     // TODO. Delete if minimal supported version is 0.7.1
960     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 7, 1),
961                       "Time to refactor the code.");
962     SetVersion(QStringLiteral("0.7.1"));
963     Save();
964 }
965 
966 //---------------------------------------------------------------------------------------------------------------------
ToV0_7_2()967 void VPatternConverter::ToV0_7_2()
968 {
969     // TODO. Delete if minimal supported version is 0.7.2
970     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 7, 2),
971                       "Time to refactor the code.");
972     SetVersion(QStringLiteral("0.7.2"));
973     Save();
974 }
975 
976 //---------------------------------------------------------------------------------------------------------------------
ToV0_7_3()977 void VPatternConverter::ToV0_7_3()
978 {
979     // TODO. Delete if minimal supported version is 0.7.3
980     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 7, 3),
981                       "Time to refactor the code.");
982     SetVersion(QStringLiteral("0.7.3"));
983     Save();
984 }
985 
986 //---------------------------------------------------------------------------------------------------------------------
ToV0_7_4()987 void VPatternConverter::ToV0_7_4()
988 {
989     // TODO. Delete if minimal supported version is 0.7.4
990     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 7, 4),
991                       "Time to refactor the code.");
992     SetVersion(QStringLiteral("0.7.4"));
993     Save();
994 }
995 
996 //---------------------------------------------------------------------------------------------------------------------
ToV0_7_5()997 void VPatternConverter::ToV0_7_5()
998 {
999     // TODO. Delete if minimal supported version is 0.7.5
1000     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 7, 5),
1001                       "Time to refactor the code.");
1002     SetVersion(QStringLiteral("0.7.5"));
1003     Save();
1004 }
1005 
1006 //---------------------------------------------------------------------------------------------------------------------
ToV0_7_6()1007 void VPatternConverter::ToV0_7_6()
1008 {
1009     // TODO. Delete if minimal supported version is 0.7.6
1010     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 7, 6),
1011                       "Time to refactor the code.");
1012     SetVersion(QStringLiteral("0.7.6"));
1013     Save();
1014 }
1015 
1016 //---------------------------------------------------------------------------------------------------------------------
ToV0_7_7()1017 void VPatternConverter::ToV0_7_7()
1018 {
1019     // TODO. Delete if minimal supported version is 0.7.7
1020     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 7, 7),
1021                       "Time to refactor the code.");
1022     SetVersion(QStringLiteral("0.7.7"));
1023     Save();
1024 }
1025 
1026 //---------------------------------------------------------------------------------------------------------------------
ToV0_7_8()1027 void VPatternConverter::ToV0_7_8()
1028 {
1029     // TODO. Delete if minimal supported version is 0.7.8
1030     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 7, 8),
1031                       "Time to refactor the code.");
1032     SetVersion(QStringLiteral("0.7.8"));
1033     Save();
1034 }
1035 
1036 //---------------------------------------------------------------------------------------------------------------------
ToV0_7_9()1037 void VPatternConverter::ToV0_7_9()
1038 {
1039     // TODO. Delete if minimal supported version is 0.7.9
1040     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 7, 9),
1041                       "Time to refactor the code.");
1042     SetVersion(QStringLiteral("0.7.9"));
1043     Save();
1044 }
1045 
1046 //---------------------------------------------------------------------------------------------------------------------
ToV0_7_10()1047 void VPatternConverter::ToV0_7_10()
1048 {
1049     // TODO. Delete if minimal supported version is 0.7.10
1050     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 7, 10),
1051                       "Time to refactor the code.");
1052     SetVersion(QStringLiteral("0.7.10"));
1053     Save();
1054 }
1055 
1056 //---------------------------------------------------------------------------------------------------------------------
ToV0_7_11()1057 void VPatternConverter::ToV0_7_11()
1058 {
1059     // TODO. Delete if minimal supported version is 0.7.11
1060     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 7, 11),
1061                       "Time to refactor the code.");
1062     SetVersion(QStringLiteral("0.7.11"));
1063     Save();
1064 }
1065 
1066 //---------------------------------------------------------------------------------------------------------------------
ToV0_7_12()1067 void VPatternConverter::ToV0_7_12()
1068 {
1069     // TODO. Delete if minimal supported version is 0.7.12
1070     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 7, 12),
1071                       "Time to refactor the code.");
1072     SetVersion(QStringLiteral("0.7.12"));
1073     Save();
1074 }
1075 
1076 //---------------------------------------------------------------------------------------------------------------------
ToV0_7_13()1077 void VPatternConverter::ToV0_7_13()
1078 {
1079     // TODO. Delete if minimal supported version is 0.7.13
1080     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 7, 13),
1081                       "Time to refactor the code.");
1082     SetVersion(QStringLiteral("0.7.13"));
1083     Save();
1084 }
1085 
1086 //---------------------------------------------------------------------------------------------------------------------
ToV0_8_0()1087 void VPatternConverter::ToV0_8_0()
1088 {
1089     // TODO. Delete if minimal supported version is 0.8.0
1090     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 8, 0),
1091                       "Time to refactor the code.");
1092     SetVersion(QStringLiteral("0.8.0"));
1093     Save();
1094 }
1095 
1096 //---------------------------------------------------------------------------------------------------------------------
ToV0_8_1()1097 void VPatternConverter::ToV0_8_1()
1098 {
1099     // TODO. Delete if minimal supported version is 0.8.1
1100     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 8, 1),
1101                       "Time to refactor the code.");
1102     SetVersion(QStringLiteral("0.8.1"));
1103     Save();
1104 }
1105 
1106 //---------------------------------------------------------------------------------------------------------------------
ToV0_8_2()1107 void VPatternConverter::ToV0_8_2()
1108 {
1109     // TODO. Delete if minimal supported version is 0.8.2
1110     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 8, 2),
1111                       "Time to refactor the code.");
1112     SetVersion(QStringLiteral("0.8.2"));
1113     Save();
1114 }
1115 
1116 //---------------------------------------------------------------------------------------------------------------------
ToV0_8_3()1117 void VPatternConverter::ToV0_8_3()
1118 {
1119     // TODO. Delete if minimal supported version is 0.8.3
1120     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 8, 3),
1121                       "Time to refactor the code.");
1122     SetVersion(QStringLiteral("0.8.3"));
1123     Save();
1124 }
1125 
1126 //---------------------------------------------------------------------------------------------------------------------
ToV0_8_4()1127 void VPatternConverter::ToV0_8_4()
1128 {
1129     // TODO. Delete if minimal supported version is 0.8.4
1130     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 8, 4),
1131                       "Time to refactor the code.");
1132     SetVersion(QStringLiteral("0.8.4"));
1133     Save();
1134 }
1135 
1136 //---------------------------------------------------------------------------------------------------------------------
ToV0_8_5()1137 void VPatternConverter::ToV0_8_5()
1138 {
1139     // TODO. Delete if minimal supported version is 0.8.5
1140     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 8, 5),
1141                       "Time to refactor the code.");
1142     SetVersion(QStringLiteral("0.8.5"));
1143     Save();
1144 }
1145 
1146 //---------------------------------------------------------------------------------------------------------------------
ToV0_8_6()1147 void VPatternConverter::ToV0_8_6()
1148 {
1149     // TODO. Delete if minimal supported version is 0.8.6
1150     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 8, 6),
1151                       "Time to refactor the code.");
1152     SetVersion(QStringLiteral("0.8.6"));
1153     Save();
1154 }
1155 
1156 //---------------------------------------------------------------------------------------------------------------------
ToV0_8_7()1157 void VPatternConverter::ToV0_8_7()
1158 {
1159     // TODO. Delete if minimal supported version is 0.8.7
1160     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 8, 7),
1161                       "Time to refactor the code.");
1162     SetVersion(QStringLiteral("0.8.7"));
1163     Save();
1164 }
1165 
1166 //---------------------------------------------------------------------------------------------------------------------
ToV0_8_8()1167 void VPatternConverter::ToV0_8_8()
1168 {
1169     // TODO. Delete if minimal supported version is 0.8.8
1170     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 8, 8),
1171                       "Time to refactor the code.");
1172     SetVersion(QStringLiteral("0.8.8"));
1173     RemoveGradationV0_8_8();
1174     Save();
1175 }
1176 
1177 //---------------------------------------------------------------------------------------------------------------------
ToV0_8_9()1178 void VPatternConverter::ToV0_8_9()
1179 {
1180     // TODO. Delete if minimal supported version is 0.8.9
1181     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 8, 9),
1182                       "Time to refactor the code.");
1183     SetVersion(QStringLiteral("0.8.9"));
1184     Save();
1185 }
1186 
1187 //---------------------------------------------------------------------------------------------------------------------
ToV0_8_10()1188 void VPatternConverter::ToV0_8_10()
1189 {
1190     // TODO. Delete if minimal supported version is 0.8.10
1191     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 8, 10),
1192                       "Time to refactor the code.");
1193     SetVersion(QStringLiteral("0.8.10"));
1194     Save();
1195 }
1196 
1197 //---------------------------------------------------------------------------------------------------------------------
ToV0_8_11()1198 void VPatternConverter::ToV0_8_11()
1199 {
1200     // TODO. Delete if minimal supported version is 0.8.11
1201     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 8, 11),
1202                       "Time to refactor the code.");
1203     SetVersion(QStringLiteral("0.8.11"));
1204     Save();
1205 }
1206 
1207 //---------------------------------------------------------------------------------------------------------------------
TagUnitToV0_2_0()1208 void VPatternConverter::TagUnitToV0_2_0()
1209 {
1210     // TODO. Delete if minimal supported version is 0.2.0
1211     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1212                       "Time to refactor the code.");
1213 
1214     QDomElement patternElement = documentElement();
1215     patternElement.insertAfter(CreateElementWithText(*strUnit, MUnitV0_1_4()),
1216                                patternElement.firstChildElement(*strVersion));
1217 }
1218 
1219 //---------------------------------------------------------------------------------------------------------------------
TagIncrementToV0_2_0()1220 void VPatternConverter::TagIncrementToV0_2_0()
1221 {
1222     // TODO. Delete if minimal supported version is 0.2.0
1223     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1224                       "Time to refactor the code.");
1225 
1226     const QSet<QString> names = FixIncrementsToV0_2_0();
1227 
1228     FixPointExpressionsToV0_2_0(names);
1229     FixArcExpressionsToV0_2_0(names);
1230     FixPathPointExpressionsToV0_2_0(names);
1231 }
1232 
1233 //---------------------------------------------------------------------------------------------------------------------
ConvertMeasurementsToV0_2_0()1234 void VPatternConverter::ConvertMeasurementsToV0_2_0()
1235 {
1236     // TODO. Delete if minimal supported version is 0.2.0
1237     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1238                       "Time to refactor the code.");
1239 
1240     const QMap<QString, QString> names = OldNamesToNewNames_InV0_2_0();
1241     ConvertPointExpressionsToV0_2_0(names);
1242     ConvertArcExpressionsToV0_2_0(names);
1243     ConvertPathPointExpressionsToV0_2_0(names);
1244 }
1245 
1246 //---------------------------------------------------------------------------------------------------------------------
FixIncrementsToV0_2_0()1247 QSet<QString> VPatternConverter::FixIncrementsToV0_2_0()
1248 {
1249     // TODO. Delete if minimal supported version is 0.2.0
1250     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1251                       "Time to refactor the code.");
1252 
1253     QSet<QString> names;
1254     const QDomElement incr = TagIncrementsV0_1_4();
1255     QDomNode domNode = incr.firstChild();
1256     while (not domNode.isNull())
1257     {
1258         if (domNode.isElement())
1259         {
1260             QDomElement domElement = domNode.toElement();
1261             if (not domElement.isNull())
1262             {
1263                 if (domElement.tagName() == *strIncrement)
1264                 {
1265                     try
1266                     {
1267                         const QString name = GetParametrString(domElement, *strName);
1268                         names.insert(name);
1269                         domElement.setAttribute(*strName, QLatin1String("#")+name);
1270 
1271                         const QString base = GetParametrString(domElement, *strBase);
1272                         domElement.setAttribute(*strFormula, base);
1273                     }
1274                     catch (VExceptionEmptyParameter &e)
1275                     {
1276                         VException excep("Can't get increment.");
1277                         excep.AddMoreInformation(e.ErrorMessage());
1278                         throw excep;
1279                     }
1280                     domElement.removeAttribute(*strId);
1281                     domElement.removeAttribute(*strKGrowth);
1282                     domElement.removeAttribute(*strKSize);
1283                     domElement.removeAttribute(*strBase);
1284                 }
1285             }
1286         }
1287         domNode = domNode.nextSibling();
1288     }
1289     return names;
1290 }
1291 
1292 //---------------------------------------------------------------------------------------------------------------------
FixPointExpressionsToV0_2_0(const QSet<QString> & names)1293 void VPatternConverter::FixPointExpressionsToV0_2_0(const QSet<QString> &names)
1294 {
1295     // TODO. Delete if minimal supported version is 0.2.0
1296     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1297                       "Time to refactor the code.");
1298 
1299     QString formula;
1300     const QDomNodeList list = elementsByTagName(*strPoint);
1301     for (int i=0; i < list.size(); ++i)
1302     {
1303         QDomElement dom = list.at(i).toElement();
1304 
1305         try
1306         {
1307             formula = GetParametrString(dom, *strLength);
1308             dom.setAttribute(*strLength, FixIncrementInFormulaToV0_2_0(formula, names));
1309         }
1310         catch (VExceptionEmptyParameter &e)
1311         {
1312             Q_UNUSED(e)
1313         }
1314 
1315         try
1316         {
1317             formula = GetParametrString(dom, *strAngle);
1318             dom.setAttribute(*strAngle, FixIncrementInFormulaToV0_2_0(formula, names));
1319         }
1320         catch (VExceptionEmptyParameter &e)
1321         {
1322             Q_UNUSED(e)
1323         }
1324         try
1325         {
1326             formula = GetParametrString(dom, *strC1Radius);
1327             dom.setAttribute(*strC1Radius, FixIncrementInFormulaToV0_2_0(formula, names));
1328         }
1329         catch (VExceptionEmptyParameter &e)
1330         {
1331             Q_UNUSED(e)
1332         }
1333 
1334         try
1335         {
1336             formula = GetParametrString(dom, *strC2Radius);
1337             dom.setAttribute(*strC2Radius, FixIncrementInFormulaToV0_2_0(formula, names));
1338         }
1339         catch (VExceptionEmptyParameter &e)
1340         {
1341             Q_UNUSED(e)
1342         }
1343 
1344         try
1345         {
1346             formula = GetParametrString(dom, *strCRadius);
1347             dom.setAttribute(*strCRadius, FixIncrementInFormulaToV0_2_0(formula, names));
1348         }
1349         catch (VExceptionEmptyParameter &e)
1350         {
1351             Q_UNUSED(e)
1352         }
1353     }
1354 }
1355 
1356 //---------------------------------------------------------------------------------------------------------------------
FixArcExpressionsToV0_2_0(const QSet<QString> & names)1357 void VPatternConverter::FixArcExpressionsToV0_2_0(const QSet<QString> &names)
1358 {
1359     // TODO. Delete if minimal supported version is 0.2.0
1360     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1361                       "Time to refactor the code.");
1362 
1363     QString formula;
1364     const QDomNodeList list = elementsByTagName(*strArc);
1365     for (int i=0; i < list.size(); ++i)
1366     {
1367         QDomElement dom = list.at(i).toElement();
1368 
1369         try
1370         {
1371             formula = GetParametrString(dom, *strAngle1);
1372             dom.setAttribute(*strAngle1, FixIncrementInFormulaToV0_2_0(formula, names));
1373         }
1374         catch (VExceptionEmptyParameter &e)
1375         {
1376             Q_UNUSED(e)
1377         }
1378 
1379         try
1380         {
1381             formula = GetParametrString(dom, *strAngle2);
1382             dom.setAttribute(*strAngle2, FixIncrementInFormulaToV0_2_0(formula, names));
1383         }
1384         catch (VExceptionEmptyParameter &e)
1385         {
1386             Q_UNUSED(e)
1387         }
1388 
1389         try
1390         {
1391             formula = GetParametrString(dom, *strRadius);
1392             dom.setAttribute(*strRadius, FixIncrementInFormulaToV0_2_0(formula, names));
1393         }
1394         catch (VExceptionEmptyParameter &e)
1395         {
1396             Q_UNUSED(e)
1397         }
1398 
1399         try
1400         {
1401             formula = GetParametrString(dom, *strLength);
1402             dom.setAttribute(*strLength, FixIncrementInFormulaToV0_2_0(formula, names));
1403         }
1404         catch (VExceptionEmptyParameter &e)
1405         {
1406             Q_UNUSED(e)
1407         }
1408     }
1409 }
1410 
1411 //---------------------------------------------------------------------------------------------------------------------
FixPathPointExpressionsToV0_2_0(const QSet<QString> & names)1412 void VPatternConverter::FixPathPointExpressionsToV0_2_0(const QSet<QString> &names)
1413 {
1414     // TODO. Delete if minimal supported version is 0.2.0
1415     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1416                       "Time to refactor the code.");
1417 
1418     QString formula;
1419     const QDomNodeList list = elementsByTagName(*strPathPoint);
1420     for (int i=0; i < list.size(); ++i)
1421     {
1422         QDomElement dom = list.at(i).toElement();
1423 
1424         try
1425         {
1426             formula = GetParametrString(dom, *strKAsm1);
1427             dom.setAttribute(*strKAsm1, FixIncrementInFormulaToV0_2_0(formula, names));
1428         }
1429         catch (VExceptionEmptyParameter &e)
1430         {
1431             Q_UNUSED(e)
1432         }
1433 
1434         try
1435         {
1436             formula = GetParametrString(dom, *strKAsm2);
1437             dom.setAttribute(*strKAsm2, FixIncrementInFormulaToV0_2_0(formula, names));
1438         }
1439         catch (VExceptionEmptyParameter &e)
1440         {
1441             Q_UNUSED(e)
1442         }
1443 
1444         try
1445         {
1446             formula = GetParametrString(dom, *strAngle);
1447             dom.setAttribute(*strAngle, FixIncrementInFormulaToV0_2_0(formula, names));
1448         }
1449         catch (VExceptionEmptyParameter &e)
1450         {
1451             Q_UNUSED(e)
1452         }
1453     }
1454 }
1455 
1456 //---------------------------------------------------------------------------------------------------------------------
ConvertPointExpressionsToV0_2_0(const QMap<QString,QString> & names)1457 void VPatternConverter::ConvertPointExpressionsToV0_2_0(const QMap<QString, QString> &names)
1458 {
1459     // TODO. Delete if minimal supported version is 0.2.0
1460     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1461                       "Time to refactor the code.");
1462 
1463     QString formula;
1464     const QDomNodeList list = elementsByTagName(*strPoint);
1465     for (int i=0; i < list.size(); ++i)
1466     {
1467         QDomElement dom = list.at(i).toElement();
1468 
1469         try
1470         {
1471             formula = GetParametrString(dom, *strLength);
1472             dom.setAttribute(*strLength, FixMeasurementInFormulaToV0_2_0(formula, names));
1473         }
1474         catch (VExceptionEmptyParameter &e)
1475         {
1476             Q_UNUSED(e)
1477         }
1478 
1479         try
1480         {
1481             formula = GetParametrString(dom, *strAngle);
1482             dom.setAttribute(*strAngle, FixMeasurementInFormulaToV0_2_0(formula, names));
1483         }
1484         catch (VExceptionEmptyParameter &e)
1485         {
1486             Q_UNUSED(e)
1487         }
1488         try
1489         {
1490             formula = GetParametrString(dom, *strC1Radius);
1491             dom.setAttribute(*strC1Radius, FixMeasurementInFormulaToV0_2_0(formula, names));
1492         }
1493         catch (VExceptionEmptyParameter &e)
1494         {
1495             Q_UNUSED(e)
1496         }
1497 
1498         try
1499         {
1500             formula = GetParametrString(dom, *strC2Radius);
1501             dom.setAttribute(*strC2Radius, FixMeasurementInFormulaToV0_2_0(formula, names));
1502         }
1503         catch (VExceptionEmptyParameter &e)
1504         {
1505             Q_UNUSED(e)
1506         }
1507 
1508         try
1509         {
1510             formula = GetParametrString(dom, *strCRadius);
1511             dom.setAttribute(*strCRadius, FixMeasurementInFormulaToV0_2_0(formula, names));
1512         }
1513         catch (VExceptionEmptyParameter &e)
1514         {
1515             Q_UNUSED(e)
1516         }
1517     }
1518 }
1519 
1520 //---------------------------------------------------------------------------------------------------------------------
ConvertArcExpressionsToV0_2_0(const QMap<QString,QString> & names)1521 void VPatternConverter::ConvertArcExpressionsToV0_2_0(const QMap<QString, QString> &names)
1522 {
1523     // TODO. Delete if minimal supported version is 0.2.0
1524     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1525                       "Time to refactor the code.");
1526 
1527     QString formula;
1528     const QDomNodeList list = elementsByTagName(*strArc);
1529     for (int i=0; i < list.size(); ++i)
1530     {
1531         QDomElement dom = list.at(i).toElement();
1532 
1533         try
1534         {
1535             formula = GetParametrString(dom, *strAngle1);
1536             dom.setAttribute(*strAngle1, FixMeasurementInFormulaToV0_2_0(formula, names));
1537         }
1538         catch (VExceptionEmptyParameter &e)
1539         {
1540             Q_UNUSED(e)
1541         }
1542 
1543         try
1544         {
1545             formula = GetParametrString(dom, *strAngle2);
1546             dom.setAttribute(*strAngle2, FixMeasurementInFormulaToV0_2_0(formula, names));
1547         }
1548         catch (VExceptionEmptyParameter &e)
1549         {
1550             Q_UNUSED(e)
1551         }
1552 
1553         try
1554         {
1555             formula = GetParametrString(dom, *strRadius);
1556             dom.setAttribute(*strRadius, FixMeasurementInFormulaToV0_2_0(formula, names));
1557         }
1558         catch (VExceptionEmptyParameter &e)
1559         {
1560             Q_UNUSED(e)
1561         }
1562 
1563         try
1564         {
1565             formula = GetParametrString(dom, *strLength);
1566             dom.setAttribute(*strLength, FixMeasurementInFormulaToV0_2_0(formula, names));
1567         }
1568         catch (VExceptionEmptyParameter &e)
1569         {
1570             Q_UNUSED(e)
1571         }
1572     }
1573 }
1574 
1575 //---------------------------------------------------------------------------------------------------------------------
ConvertPathPointExpressionsToV0_2_0(const QMap<QString,QString> & names)1576 void VPatternConverter::ConvertPathPointExpressionsToV0_2_0(const QMap<QString, QString> &names)
1577 {
1578     // TODO. Delete if minimal supported version is 0.2.0
1579     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1580                       "Time to refactor the code.");
1581 
1582     QString formula;
1583     const QDomNodeList list = elementsByTagName(*strPathPoint);
1584     for (int i=0; i < list.size(); ++i)
1585     {
1586         QDomElement dom = list.at(i).toElement();
1587 
1588         try
1589         {
1590             formula = GetParametrString(dom, *strKAsm1);
1591             dom.setAttribute(*strKAsm1, FixMeasurementInFormulaToV0_2_0(formula, names));
1592         }
1593         catch (VExceptionEmptyParameter &e)
1594         {
1595             Q_UNUSED(e)
1596         }
1597 
1598         try
1599         {
1600             formula = GetParametrString(dom, *strKAsm2);
1601             dom.setAttribute(*strKAsm2, FixMeasurementInFormulaToV0_2_0(formula, names));
1602         }
1603         catch (VExceptionEmptyParameter &e)
1604         {
1605             Q_UNUSED(e)
1606         }
1607 
1608         try
1609         {
1610             formula = GetParametrString(dom, *strAngle);
1611             dom.setAttribute(*strAngle, FixMeasurementInFormulaToV0_2_0(formula, names));
1612         }
1613         catch (VExceptionEmptyParameter &e)
1614         {
1615             Q_UNUSED(e)
1616         }
1617     }
1618 }
1619 
1620 //---------------------------------------------------------------------------------------------------------------------
FixMeasurementInFormulaToV0_2_0(const QString & formula,const QMap<QString,QString> & names)1621 QString VPatternConverter::FixMeasurementInFormulaToV0_2_0(const QString &formula, const QMap<QString, QString> &names)
1622 {
1623     // TODO. Delete if minimal supported version is 0.2.0
1624     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1625                       "Time to refactor the code.");
1626 
1627     QScopedPointer<qmu::QmuTokenParser> cal(new qmu::QmuTokenParser(formula, false, false));// Eval formula
1628     QMap<int, QString> tokens = cal->GetTokens();// Tokens (variables, measurements)
1629     delete cal.take();
1630 
1631     QList<int> tKeys = tokens.keys();// Take all tokens positions
1632     QList<QString> tValues = tokens.values();
1633 
1634     QString newFormula = formula;// Local copy for making changes
1635     for (int i = 0; i < tValues.size(); ++i)
1636     {
1637         if (not names.contains(tValues.at(i)))
1638         {
1639             continue;
1640         }
1641 
1642         int bias = 0;
1643         Replace(newFormula, names.value(tValues.at(i)), tKeys.at(i), tValues.at(i), bias);
1644         if (bias != 0)
1645         {// Translated token has different length than original. Position next tokens need to be corrected.
1646             CorrectionsPositions(tKeys.at(i), bias, tokens);
1647             tKeys = tokens.keys();
1648             tValues = tokens.values();
1649         }
1650     }
1651     return newFormula;
1652 }
1653 
1654 //---------------------------------------------------------------------------------------------------------------------
FixIncrementInFormulaToV0_2_0(const QString & formula,const QSet<QString> & names)1655 QString VPatternConverter::FixIncrementInFormulaToV0_2_0(const QString &formula, const QSet<QString> &names)
1656 {
1657     // TODO. Delete if minimal supported version is 0.2.0
1658     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1659                       "Time to refactor the code.");
1660 
1661     qmu::QmuTokenParser *cal = new qmu::QmuTokenParser(formula, false, false);// Eval formula
1662     QMap<int, QString> tokens = cal->GetTokens();// Tokens (variables, measurements)
1663     delete cal;
1664 
1665     QList<int> tKeys = tokens.keys();// Take all tokens positions
1666     QList<QString> tValues = tokens.values();
1667 
1668     QString newFormula = formula;// Local copy for making changes
1669     for (int i = 0; i < tValues.size(); ++i)
1670     {
1671         if (not names.contains(tValues.at(i)))
1672         {
1673             continue;
1674         }
1675 
1676         int bias = 0;
1677         Replace(newFormula, "#"+tValues.at(i), tKeys.at(i), tValues.at(i), bias);
1678         if (bias != 0)
1679         {// Translated token has different length than original. Position next tokens need to be corrected.
1680             CorrectionsPositions(tKeys.at(i), bias, tokens);
1681             tKeys = tokens.keys();
1682             tValues = tokens.values();
1683         }
1684     }
1685     return newFormula;
1686 }
1687 
1688 //---------------------------------------------------------------------------------------------------------------------
TagMeasurementsToV0_2_0()1689 void VPatternConverter::TagMeasurementsToV0_2_0()
1690 {
1691     // TODO. Delete if minimal supported version is 0.2.0
1692     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1693                       "Time to refactor the code.");
1694 
1695     QDomElement ms = TagMeasurementsV0_1_4();
1696     const QString path = GetParametrString(ms, *strPath);
1697 
1698     ms.removeAttribute(*strUnit);
1699     ms.removeAttribute(*strType);
1700     ms.removeAttribute(*strPath);
1701 
1702     ms.appendChild(createTextNode(QFileInfo(m_convertedFileName).absoluteDir().relativeFilePath(path)));
1703 }
1704 
1705 //---------------------------------------------------------------------------------------------------------------------
ConvertMeasurementsToV0_2_1()1706 void VPatternConverter::ConvertMeasurementsToV0_2_1()
1707 {
1708     // TODO. Delete if minimal supported version is 0.2.1
1709     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 1),
1710                       "Time to refactor the code.");
1711 
1712     const QMap<QString, QString> names = OldNamesToNewNames_InV0_2_1();
1713 
1714     // Structure did not change. We can use the same code.
1715     ConvertPointExpressionsToV0_2_0(names);
1716     ConvertArcExpressionsToV0_2_0(names);
1717     ConvertPathPointExpressionsToV0_2_0(names);
1718 }
1719 
1720 //---------------------------------------------------------------------------------------------------------------------
RemoveColorToolCutV0_3_1()1721 void VPatternConverter::RemoveColorToolCutV0_3_1()
1722 {
1723     // TODO. Delete if minimal supported version is 0.3.1
1724     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 3, 1),
1725                       "Time to refactor the code.");
1726 
1727     const QDomNodeList list = elementsByTagName(*strPoint);
1728     for (int i=0; i < list.size(); ++i)
1729     {
1730         QDomElement element = list.at(i).toElement();
1731         if (not element.isNull())
1732         {
1733             const QString type = element.attribute(*strType);
1734             if (type == *strCutArc || type == *strCutSpline || type == *strCutSplinePath)
1735             {
1736                 element.removeAttribute(*strColor);
1737             }
1738         }
1739     }
1740 }
1741 
1742 //---------------------------------------------------------------------------------------------------------------------
MUnitV0_1_4() const1743 QString VPatternConverter::MUnitV0_1_4() const
1744 {
1745     // TODO. Delete if minimal supported version is 0.2.0
1746     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1747                       "Time to refactor the code.");
1748 
1749     const QDomElement element = TagMeasurementsV0_1_4();
1750     try
1751     {
1752         return GetParametrString(element, *strUnit);
1753     }
1754     catch (VExceptionEmptyParameter &e)
1755     {
1756         VException excep("Can't get unit.");
1757         excep.AddMoreInformation(e.ErrorMessage());
1758         throw excep;
1759     }
1760 }
1761 
1762 //---------------------------------------------------------------------------------------------------------------------
TagMeasurementsV0_1_4() const1763 QDomElement VPatternConverter::TagMeasurementsV0_1_4() const
1764 {
1765     // TODO. Delete if minimal supported version is 0.2.0
1766     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1767                       "Time to refactor the code.");
1768 
1769     const QDomNodeList list = elementsByTagName(*strMeasurements);
1770     const QDomElement element = list.at(0).toElement();
1771     if (not element.isElement())
1772     {
1773         VException excep("Can't get tag measurements.");
1774         throw excep;
1775     }
1776     return element;
1777 }
1778 
1779 //---------------------------------------------------------------------------------------------------------------------
TagIncrementsV0_1_4() const1780 QDomElement VPatternConverter::TagIncrementsV0_1_4() const
1781 {
1782     // TODO. Delete if minimal supported version is 0.2.0
1783     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1784                       "Time to refactor the code.");
1785 
1786     const QDomNodeList list = elementsByTagName(*strIncrements);
1787     const QDomElement element = list.at(0).toElement();
1788     if (not element.isElement())
1789     {
1790         VException excep("Can't get tag measurements.");
1791         throw excep;
1792     }
1793     return element;
1794 }
1795 
1796 //---------------------------------------------------------------------------------------------------------------------
FixToolUnionToV0_2_4()1797 void VPatternConverter::FixToolUnionToV0_2_4()
1798 {
1799     // TODO. Delete if minimal supported version is 0.2.4
1800     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 4),
1801                       "Time to refactor the code.");
1802 
1803     QDomElement root = documentElement();
1804     const QDomNodeList modelings = root.elementsByTagName(*strModeling);
1805     for (int i=0; i<modelings.size(); ++i)
1806     {
1807         ParseModelingToV0_2_4(modelings.at(i).toElement());
1808     }
1809 }
1810 
1811 //---------------------------------------------------------------------------------------------------------------------
ParseModelingToV0_2_4(const QDomElement & modeling)1812 void VPatternConverter::ParseModelingToV0_2_4(const QDomElement &modeling)
1813 {
1814     // TODO. Delete if minimal supported version is 0.2.4
1815     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 4),
1816                       "Time to refactor the code.");
1817 
1818     QDomElement node = modeling.firstChild().toElement();
1819     while (not node.isNull())
1820     {
1821         if (node.tagName() == *strTools)
1822         {
1823             const quint32 toolId = node.attribute(*strId).toUInt();
1824             QVector<quint32> children;
1825             QDomElement childNode = node.nextSibling().toElement();
1826             while (not childNode.isNull())
1827             {
1828                 if (childNode.hasAttribute(*strIdTool) && childNode.attribute(*strIdTool).toUInt() == toolId)
1829                 {
1830                     children.append(childNode.attribute(*strIdObject).toUInt());
1831                 }
1832                 else
1833                 {
1834                     break;
1835                 }
1836                 childNode = childNode.nextSibling().toElement();
1837             }
1838 
1839             if (not children.isEmpty())
1840             {
1841                 SaveChildrenToolUnionToV0_2_4(toolId, children);
1842             }
1843             node = childNode;
1844             continue;
1845         }
1846         node = node.nextSibling().toElement();
1847     }
1848 }
1849 
1850 //---------------------------------------------------------------------------------------------------------------------
SaveChildrenToolUnionToV0_2_4(quint32 id,const QVector<quint32> & children)1851 void VPatternConverter::SaveChildrenToolUnionToV0_2_4(quint32 id, const QVector<quint32> &children)
1852 {
1853     // TODO. Delete if minimal supported version is 0.2.4
1854     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 4),
1855                       "Time to refactor the code.");
1856 
1857     QDomElement toolUnion = elementById(id);
1858     if (toolUnion.isNull())
1859     {
1860         return;
1861     }
1862 
1863     QDomElement tagChildren = createElement(*strChildren);
1864 
1865     for (auto child : children)
1866     {
1867         tagChildren.appendChild(CreateElementWithText(*strChild, QString().setNum(child)));
1868     }
1869 
1870     toolUnion.appendChild(tagChildren);
1871 }
1872 
1873 //---------------------------------------------------------------------------------------------------------------------
OldNamesToNewNames_InV0_2_0()1874 QMap<QString, QString> VPatternConverter::OldNamesToNewNames_InV0_2_0()
1875 {
1876     // TODO. Delete if minimal supported version is 0.2.0
1877     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 0),
1878                       "Time to refactor the code.");
1879 
1880     // old name, new name
1881     QMap<QString, QString> names;
1882 
1883     names.insert(QStringLiteral("cervicale_height"), QStringLiteral("height_neck_back"));
1884     names.insert(QStringLiteral("height_scapular_point"), QStringLiteral("height_scapula"));
1885     names.insert(QStringLiteral("height_back_angle_axilla"), QStringLiteral("height_armpit"));
1886     names.insert(QStringLiteral("waist_height"), QStringLiteral("height_waist_side"));
1887     names.insert(QStringLiteral("hip_height"), QStringLiteral("height_hip"));
1888     names.insert(QStringLiteral("knee_height"), QStringLiteral("height_knee"));
1889     names.insert(QStringLiteral("ankle_height"), QStringLiteral("height_ankle"));
1890     names.insert(QStringLiteral("high_hip_height"), QStringLiteral("height_highhip"));
1891     names.insert(QStringLiteral("front_waist_to_floor"), QStringLiteral("height_waist_front"));
1892     names.insert(QStringLiteral("height_nipple_point"), QStringLiteral("height_bustpoint"));
1893 
1894     QString name = QStringLiteral("height_shoulder_tip");
1895     names.insert(QStringLiteral("shoulder_height"), name);
1896     names.insert(QStringLiteral("height_shoulder_point"), name);
1897 
1898     name = QStringLiteral("height_neck_front");
1899     names.insert(QStringLiteral("height_clavicular_point"), name);
1900     names.insert(QStringLiteral("height_front_neck_base_point"), name);
1901 
1902     names.insert(QStringLiteral("height_base_neck_side_point"), QStringLiteral("height_neck_side"));
1903 
1904     name = QStringLiteral("height_neck_back_to_knee");
1905     names.insert(QStringLiteral("neck_to_knee_point"), name);
1906     names.insert(QStringLiteral("cervicale_to_knee_height"), name);
1907 
1908     names.insert(QStringLiteral("waist_to_knee_height"), QStringLiteral("height_waist_side_to_knee"));
1909     names.insert(QStringLiteral("waist_to_hip_height"), QStringLiteral("height_waist_side_to_hip"));
1910     names.insert(QStringLiteral("body_position"), QStringLiteral("indent_neck_back"));
1911 
1912     name = QStringLiteral("neck_mid_circ");
1913     names.insert(QStringLiteral("half_girth_neck_for_shirts"), name);
1914     names.insert(QStringLiteral("mid_neck_girth"), name);
1915 
1916     names.insert(QStringLiteral("neck_base_girth"), QStringLiteral("neck_circ"));
1917     names.insert(QStringLiteral("upper_chest_girth"), QStringLiteral("highbust_circ"));
1918     names.insert(QStringLiteral("bust_girth"), QStringLiteral("bust_circ"));
1919     names.insert(QStringLiteral("under_bust_girth"), QStringLiteral("lowbust_circ"));
1920     names.insert(QStringLiteral("waist_girth"), QStringLiteral("waist_circ"));
1921     names.insert(QStringLiteral("high_hip_girth"), QStringLiteral("highhip_circ"));
1922     names.insert(QStringLiteral("hips_excluding_protruding_abdomen"), QStringLiteral("hip_circ"));
1923     names.insert(QStringLiteral("hip_girth"), QStringLiteral("hip_circ_with_abdomen"));
1924 
1925     name = QStringLiteral("neck_arc_f");
1926     names.insert(QStringLiteral("half_girth_neck"), name);
1927     names.insert(QStringLiteral("front_neck_arc"), name);
1928 
1929     name = QStringLiteral("highbust_arc_f");
1930     names.insert(QStringLiteral("half_girth_chest_first"), name);
1931     names.insert(QStringLiteral("front_upper_chest_arc"), name);
1932 
1933     names.insert(QStringLiteral("half_girth_chest_second"), QStringLiteral("bust_arc_f"));
1934     names.insert(QStringLiteral("half_girth_chest_third"), QStringLiteral("lowbust_arc_f"));
1935 
1936     name = QStringLiteral("waist_arc_f");
1937     names.insert(QStringLiteral("half_girth_waist"), name);
1938     names.insert(QStringLiteral("front_waist_arc"), name);
1939 
1940     names.insert(QStringLiteral("front_upper_hip_arc"), QStringLiteral("highhip_arc_f"));
1941 
1942     name = QStringLiteral("hip_arc_f");
1943     names.insert(QStringLiteral("half_girth_hips_excluding_protruding_abdomen"), name);
1944     names.insert(QStringLiteral("front_hip_arc"), name);
1945 
1946     names.insert(QStringLiteral("back_neck_arc"), QStringLiteral("neck_arc_b"));
1947     names.insert(QStringLiteral("back_upper_chest_arc"), QStringLiteral("highbust_arc_b"));
1948     names.insert(QStringLiteral("back_waist_arc"), QStringLiteral("waist_arc_b"));
1949     names.insert(QStringLiteral("back_upper_hip_arc"), QStringLiteral("highhip_arc_b"));
1950     names.insert(QStringLiteral("back_hip_arc"), QStringLiteral("hip_arc_b"));
1951     names.insert(QStringLiteral("half_girth_hips_considering_protruding_abdomen"),
1952                  QStringLiteral("hip_with_abdomen_arc_f"));
1953     names.insert(QStringLiteral("shoulder_girth"), QStringLiteral("body_armfold_circ"));
1954     names.insert(QStringLiteral("trunk_length"), QStringLiteral("body_torso_circ"));
1955     names.insert(QStringLiteral("front_waist_length"), QStringLiteral("neck_front_to_waist_f"));
1956     names.insert(QStringLiteral("center_front_waist_length"), QStringLiteral("neck_front_to_waist_flat_f"));
1957     names.insert(QStringLiteral("side_waist_length"), QStringLiteral("armpit_to_waist_side"));
1958     names.insert(QStringLiteral("waist_to_neck_side"), QStringLiteral("neck_side_to_waist_b"));
1959 
1960     name = QStringLiteral("neck_side_to_waist_f");
1961     names.insert(QStringLiteral("neck_to_front_waist_line"), name);
1962     names.insert(QStringLiteral("front_shoulder_to_waist_length"), name);
1963 
1964     names.insert(QStringLiteral("back_shoulder_to_waist_length"), QStringLiteral("neck_side_to_waist_b"));
1965     names.insert(QStringLiteral("center_back_waist_length"), QStringLiteral("neck_back_to_waist_b"));
1966 
1967     name = QStringLiteral("neck_front_to_highbust_f");
1968     names.insert(QStringLiteral("neck_to_first_line_chest_circumference"), name);
1969     names.insert(QStringLiteral("front_neck_to_upper_chest_height"), name);
1970 
1971     names.insert(QStringLiteral("front_neck_to_bust_height"), QStringLiteral("neck_front_to_bust_f"));
1972     names.insert(QStringLiteral("front_waist_to_upper_chest"), QStringLiteral("highbust_to_waist_f"));
1973     names.insert(QStringLiteral("front_waist_to_lower_breast"), QStringLiteral("lowbust_to_waist_f"));
1974     names.insert(QStringLiteral("neck_to_back_line_chest_circumference"), QStringLiteral("neck_back_to_highbust_b"));
1975     names.insert(QStringLiteral("depth_waist_first"), QStringLiteral("waist_to_highhip_f"));
1976     names.insert(QStringLiteral("depth_waist_second"), QStringLiteral("waist_to_hip_f"));
1977     names.insert(QStringLiteral("shoulder_slope_degrees"), QStringLiteral("shoulder_slope_neck_side_angle"));
1978     names.insert(QStringLiteral("shoulder_drop"), QStringLiteral("shoulder_slope_neck_side_length"));
1979     names.insert(QStringLiteral("across_front_shoulder_width"), QStringLiteral("shoulder_tip_to_shoulder_tip_f"));
1980     names.insert(QStringLiteral("upper_front_chest_width"), QStringLiteral("across_chest_f"));
1981     names.insert(QStringLiteral("chest_width"), QStringLiteral("across_chest_f"));
1982     names.insert(QStringLiteral("front_chest_width"), QStringLiteral("armfold_to_armfold_f"));
1983 
1984     name = QStringLiteral("shoulder_tip_to_shoulder_tip_b");
1985     names.insert(QStringLiteral("arc_behind_shoulder_girdle"), name);
1986     names.insert(QStringLiteral("across_back_shoulder_width"), name);
1987 
1988     names.insert(QStringLiteral("upper_back_width"), QStringLiteral("across_back_b"));
1989     names.insert(QStringLiteral("back_width"), QStringLiteral("armfold_to_armfold_b"));
1990     names.insert(QStringLiteral("neck_transverse_diameter"), QStringLiteral("neck_width"));
1991     names.insert(QStringLiteral("bustpoint_to_bustpoint"), QStringLiteral("bustpoint_to_bustpoint"));
1992     names.insert(QStringLiteral("neck_to_bustpoint"), QStringLiteral("bustpoint_to_neck_side"));
1993     names.insert(QStringLiteral("halter_bustpoint_to_bustpoint"), QStringLiteral("bustpoint_to_bustpoint_halter"));
1994 
1995     name = QStringLiteral("shoulder_tip_to_waist_front");
1996     names.insert(QStringLiteral("front_slash_shoulder_height"), name);
1997     names.insert(QStringLiteral("front_shoulder_slope_length"), name);
1998 
1999     names.insert(QStringLiteral("front_waist_slope"), QStringLiteral("neck_front_to_waist_side"));
2000 
2001     name = QStringLiteral("neck_side_to_armfold_f");
2002     names.insert(QStringLiteral("height_armhole_slash"), name);
2003     names.insert(QStringLiteral("chest_slope"), name);
2004 
2005     name = QStringLiteral("shoulder_tip_to_waist_back");
2006     names.insert(QStringLiteral("slash_shoulder_height"), name);
2007     names.insert(QStringLiteral("back_shoulder_slope_length"), name);
2008 
2009     names.insert(QStringLiteral("back_waist_slope"), QStringLiteral("neck_back_to_waist_side"));
2010     names.insert(QStringLiteral("back_slope"), QStringLiteral("neck_side_to_armfold_b"));
2011     names.insert(QStringLiteral("arm_length"), QStringLiteral("arm_shoulder_tip_to_wrist"));
2012     names.insert(QStringLiteral("shoulder_to_elbow_length"), QStringLiteral("arm_shoulder_tip_to_elbow"));
2013     names.insert(QStringLiteral("underarm_length"), QStringLiteral("arm_armpit_to_wrist"));
2014     names.insert(QStringLiteral("upper_arm_girth"), QStringLiteral("arm_upper_circ"));
2015     names.insert(QStringLiteral("wrist_girth"), QStringLiteral("arm_wrist_circ"));
2016     names.insert(QStringLiteral("armscye_girth"), QStringLiteral("armscye_circ"));
2017     names.insert(QStringLiteral("anteroposterior_diameter_hands"), QStringLiteral("armscye_width"));
2018     names.insert(QStringLiteral("neck_to_third_finger"), QStringLiteral("arm_neck_side_to_finger_tip"));
2019     names.insert(QStringLiteral("neck_to_radial_point"), QStringLiteral("arm_neck_side_to_outer_elbow"));
2020     names.insert(QStringLiteral("shoulder_and_arm_length"), QStringLiteral("arm_neck_side_to_wrist"));
2021     names.insert(QStringLiteral("crotch_height"), QStringLiteral("leg_crotch_to_floor"));
2022     names.insert(QStringLiteral("side_waist_to_floor"), QStringLiteral("leg_waist_side_to_floor"));
2023     names.insert(QStringLiteral("waist_to_knee"), QStringLiteral("leg_waist_side_to_knee"));
2024     names.insert(QStringLiteral("thigh_girth"), QStringLiteral("leg_thigh_upper_circ"));
2025     names.insert(QStringLiteral("mid_thigh_girth"), QStringLiteral("leg_thigh_mid_circ"));
2026     names.insert(QStringLiteral("knee_girth"), QStringLiteral("leg_knee_circ"));
2027     names.insert(QStringLiteral("calf_girth"), QStringLiteral("leg_calf_circ"));
2028     names.insert(QStringLiteral("ankle_girth"), QStringLiteral("leg_ankle_circ"));
2029     names.insert(QStringLiteral("girth_knee_flexed_feet"), QStringLiteral("leg_knee_circ_bent"));
2030     names.insert(QStringLiteral("arc_through_groin_area"), QStringLiteral("crotch_length"));
2031     names.insert(QStringLiteral("waist_to_plane_seat"), QStringLiteral("rise_length_side_sitting"));
2032     names.insert(QStringLiteral("rise_height"), QStringLiteral("rise_length_diag"));
2033     names.insert(QStringLiteral("hand_vertical_diameter"), QStringLiteral("hand_length"));
2034     names.insert(QStringLiteral("hand_width"), QStringLiteral("hand_palm_width"));
2035     names.insert(QStringLiteral("hand_girth"), QStringLiteral("hand_circ"));
2036     names.insert(QStringLiteral("girth_foot_instep"), QStringLiteral("foot_instep_circ"));
2037     names.insert(QStringLiteral("head_height"), QStringLiteral("head_length"));
2038     names.insert(QStringLiteral("head_and_neck_length"), QStringLiteral("head_crown_to_neck_back"));
2039     names.insert(QStringLiteral("neck_to_neck_base"), QStringLiteral("head_chin_to_neck_back"));
2040     names.insert(QStringLiteral("arc_length_upper_body"), QStringLiteral("waist_to_waist_halter"));
2041     names.insert(QStringLiteral("cervicale_to_wrist_length"), QStringLiteral("arm_neck_back_to_wrist_bent"));
2042     names.insert(QStringLiteral("strap_length"), QStringLiteral("highbust_b_over_shoulder_to_highbust_f"));
2043     names.insert(QStringLiteral("arc_through_shoulder_joint"), QStringLiteral("armscye_arc"));
2044     names.insert(QStringLiteral("head_girth"), QStringLiteral("head_circ"));
2045     names.insert(QStringLiteral("elbow_girth"), QStringLiteral("arm_elbow_circ"));
2046     names.insert(QStringLiteral("height_under_buttock_folds"), QStringLiteral("height_gluteal_fold"));
2047     names.insert(QStringLiteral("scye_depth"), QStringLiteral("neck_back_to_highbust_b"));
2048     names.insert(QStringLiteral("back_waist_to_upper_chest"), QStringLiteral("across_back_to_waist_b"));
2049 
2050     return names;
2051 }
2052 
2053 //---------------------------------------------------------------------------------------------------------------------
OldNamesToNewNames_InV0_2_1()2054 QMap<QString, QString> VPatternConverter::OldNamesToNewNames_InV0_2_1()
2055 {
2056     // TODO. Delete if minimal supported version is 0.2.1
2057     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 2, 1),
2058                       "Time to refactor the code.");
2059 
2060     // old name, new name
2061     QMap<QString, QString> names;
2062 
2063     names.insert(QStringLiteral("rise_length_side"), QStringLiteral("rise_length_side_sitting"));
2064     names.insert(QStringLiteral("size"), QStringLiteral("bust_arc_f"));
2065 
2066     return names;
2067 }
2068 
2069 //---------------------------------------------------------------------------------------------------------------------
FixCutPoint()2070 void VPatternConverter::FixCutPoint()
2071 {
2072     const QStringList types = QStringList() << *strCutSplinePath
2073                                             << *strCutSpline
2074                                             << *strCutArc;
2075 
2076     const QDomNodeList list = elementsByTagName(*strPoint);
2077     for (int i=0; i < list.size(); ++i)
2078     {
2079         QDomElement element = list.at(i).toElement();
2080         if (not element.isNull())
2081         {
2082             const QString type = element.attribute(*strType);
2083             switch(types.indexOf(type))
2084             {
2085                 case 0: //strCutSplinePath
2086                 {
2087                     const quint32 id = element.attribute(*strId).toUInt();
2088                     quint32 curve = element.attribute(*strSplinePath).toUInt();
2089                     FixSubPaths(i, id, curve);
2090                     break;
2091                 }
2092                 case 1: //strCutSpline
2093                 {
2094                     const quint32 id = element.attribute(*strId).toUInt();
2095                     quint32 curve = element.attribute(*strSpline).toUInt();
2096                     FixSubPaths(i, id, curve);
2097                     break;
2098                 }
2099                 case 2: //strCutArc
2100                 {
2101                     const quint32 id = element.attribute(*strId).toUInt();
2102                     quint32 curve = element.attribute(*strArc).toUInt();
2103                     FixSubPaths(i, id, curve);
2104                     break;
2105                 }
2106                 default:
2107                     break;
2108             }
2109         }
2110     }
2111 }
2112 
2113 //---------------------------------------------------------------------------------------------------------------------
FixSubPaths(int i,quint32 id,quint32 baseCurve)2114 void VPatternConverter::FixSubPaths(int i, quint32 id, quint32 baseCurve)
2115 {
2116     const QStringList pointTypes = QStringList() << *strCutSplinePath
2117                                                  << *strCutSpline
2118                                                  << *strPointOfIntersectionCurves
2119                                                  << *strCurveIntersectAxis
2120                                                  << *strPointFromArcAndTangent
2121                                                  << *strPointOfIntersectionArcs;
2122 
2123     const QDomNodeList listPoints = elementsByTagName(*strPoint);
2124     for (int j = i+1; j < listPoints.size(); ++j)
2125     {
2126         QDomElement element = listPoints.at(j).toElement();
2127         if (not element.isNull())
2128         {
2129             const QString type = element.attribute(*strType);
2130             switch(pointTypes.indexOf(type))
2131             {
2132                 case 0: //strCutSplinePath
2133                 {
2134                     const quint32 spl = element.attribute(*strSplinePath).toUInt();
2135                     if (spl == id+1 || spl == id+2)
2136                     {
2137                         element.setAttribute(*strSplinePath, baseCurve);
2138                     }
2139                     break;
2140                 }
2141                 case 1: //strCutSpline
2142                 {
2143                     const quint32 spl = element.attribute(*strSpline).toUInt();
2144                     if (spl == id+1 || spl == id+2)
2145                     {
2146                         element.setAttribute(*strSpline, baseCurve);
2147                     }
2148                     break;
2149                 }
2150                 case 2: //strPointOfIntersectionCurves
2151                 {
2152                     quint32 spl = element.attribute(*strCurve1).toUInt();
2153                     if (spl == id+1 || spl == id+2)
2154                     {
2155                         element.setAttribute(*strCurve1, baseCurve);
2156                     }
2157 
2158                     spl = element.attribute(*strCurve2).toUInt();
2159                     if (spl == id+1 || spl == id+2)
2160                     {
2161                         element.setAttribute(*strCurve2, baseCurve);
2162                     }
2163                     break;
2164                 }
2165                 case 3: //strCurveIntersectAxis
2166                 {
2167                     const quint32 spl = element.attribute(*strCurve).toUInt();
2168                     if (spl == id+1 || spl == id+2)
2169                     {
2170                         element.setAttribute(*strCurve, baseCurve);
2171                     }
2172                     break;
2173                 }
2174                 case 4: //strPointFromArcAndTangent
2175                 {
2176                     const quint32 spl = element.attribute(*strArc).toUInt();
2177                     if (spl == id+1 || spl == id+2)
2178                     {
2179                         element.setAttribute(*strArc, baseCurve);
2180                     }
2181                     break;
2182                 }
2183                 case 5: //strPointOfIntersectionArcs
2184                 {
2185                     quint32 arc = element.attribute(*strFirstArc).toUInt();
2186                     if (arc == id+1 || arc == id+2)
2187                     {
2188                         element.setAttribute(*strFirstArc, baseCurve);
2189                     }
2190 
2191                     arc = element.attribute(*strSecondArc).toUInt();
2192                     if (arc == id+1 || arc == id+2)
2193                     {
2194                         element.setAttribute(*strSecondArc, baseCurve);
2195                     }
2196                     break;
2197                 }
2198                 default:
2199                     break;
2200             }
2201         }
2202     }
2203 
2204     const QStringList splTypes = QStringList() << *strModelingPath
2205                                                << *strModelingSpline;
2206 
2207     const QDomNodeList listSplines = elementsByTagName(*strSpline);
2208     for (int j = 0; j < listSplines.size(); ++j)
2209     {
2210         QDomElement element = listSplines.at(j).toElement();
2211         if (not element.isNull())
2212         {
2213             const QString type = element.attribute(*strType);
2214             switch(splTypes.indexOf(type))
2215             {
2216                 case 0: //strModelingPath
2217                 case 1: //strModelingSpline
2218                 {
2219                     const quint32 spl = element.attribute(*strIdObject).toUInt();
2220                     if (spl == id+1 || spl == id+2)
2221                     {
2222                         element.setAttribute(*strIdObject, baseCurve);
2223                     }
2224                     break;
2225                 }
2226                 default:
2227                     break;
2228             }
2229         }
2230     }
2231 
2232     const QDomNodeList listArcs = elementsByTagName(*strArc);
2233     for (int j = 0; j < listArcs.size(); ++j)
2234     {
2235         QDomElement element = listArcs.at(j).toElement();
2236         if (not element.isNull())
2237         {
2238             const QString type = element.attribute(*strType);
2239             if (type == *strModeling)
2240             {
2241                 const quint32 arc = element.attribute(*strIdObject).toUInt();
2242                 if (arc == id+1 || arc == id+2)
2243                 {
2244                     element.setAttribute(*strIdObject, baseCurve);
2245                 }
2246             }
2247         }
2248     }
2249 }
2250 
2251 //---------------------------------------------------------------------------------------------------------------------
TagRemoveAttributeTypeObjectInV0_4_0()2252 void VPatternConverter::TagRemoveAttributeTypeObjectInV0_4_0()
2253 {
2254     // TODO. Delete if minimal supported version is 0.4.0
2255     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 4, 0),
2256                       "Time to refactor the code.");
2257 
2258     const QDomNodeList list = elementsByTagName(*strModeling);
2259     for (int i = 0; i < list.size(); ++i)
2260     {
2261         QDomElement modeling = list.at(i).toElement();
2262         if (not modeling.isNull())
2263         {
2264             QDomNode domNode = modeling.firstChild();
2265             while (not domNode.isNull())
2266             {
2267                 QDomElement domElement = domNode.toElement();
2268                 if (not domElement.isNull())
2269                 {
2270                     if (domElement.hasAttribute(*strTypeObject))
2271                     {
2272                         domElement.removeAttribute(*strTypeObject);
2273                     }
2274                 }
2275                 domNode = domNode.nextSibling();
2276             }
2277         }
2278     }
2279 }
2280 
2281 //---------------------------------------------------------------------------------------------------------------------
TagDetailToV0_4_0()2282 void VPatternConverter::TagDetailToV0_4_0()
2283 {
2284     // TODO. Delete if minimal supported version is 0.4.0
2285     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 4, 0),
2286                       "Time to refactor the code.");
2287 
2288     const QDomNodeList list = elementsByTagName(*strDetail);
2289     for (int i=0; i < list.size(); ++i)
2290     {
2291         QDomElement dom = list.at(i).toElement();
2292 
2293         if (not dom.isNull())
2294         {
2295             dom.setAttribute(*strSeamAllowance, dom.attribute(*strSupplement, QChar('0')));
2296             dom.removeAttribute(*strSupplement);
2297 
2298             dom.setAttribute(*strVersion, QChar('1'));
2299 
2300             const QStringList tags = QStringList() << *strNode << *strData << *strPatternInfo << *strGrainline;
2301 
2302             QDomElement tagData;
2303             QDomElement tagPatternInfo;
2304             QDomElement tagGrainline;
2305             QDomElement tagNodes = createElement(*strNodes);
2306 
2307             const QDomNodeList childList = dom.childNodes();
2308             for (qint32 i = 0; i < childList.size(); ++i)
2309             {
2310                 const QDomElement element = childList.at(i).toElement();
2311                 if (not element.isNull())
2312                 {
2313                     switch (tags.indexOf(element.tagName()))
2314                     {
2315                         case 0://strNode
2316                         {
2317                             QDomElement tagNode = createElement(*strNode);
2318 
2319                             tagNode.setAttribute(*strIdObject, element.attribute(*strIdObject, NULL_ID_STR));
2320 
2321                             if (element.hasAttribute(*strReverse))
2322                             {
2323                                 tagNode.setAttribute(*strReverse, element.attribute(*strReverse, QChar('0')));
2324                             }
2325 
2326                             if (element.hasAttribute(*strMx))
2327                             {
2328                                 tagNode.setAttribute(*strMx, element.attribute(*strMx, QChar('0')));
2329                             }
2330 
2331                             if (element.hasAttribute(*strMy))
2332                             {
2333                                 tagNode.setAttribute(*strMy, element.attribute(*strMy, QChar('0')));
2334                             }
2335 
2336                             tagNode.setAttribute(*strType, element.attribute(*strType, QString()));
2337 
2338                             tagNodes.appendChild(tagNode);
2339 
2340                             break;
2341                         }
2342                         case 1://strData
2343                             tagData = element.cloneNode().toElement();
2344                             break;
2345                         case 2://strPatternInfo
2346                             tagPatternInfo = element.cloneNode().toElement();
2347                             break;
2348                         case 3://strGrainline
2349                             tagGrainline = element.cloneNode().toElement();
2350                             break;
2351                         default:
2352                             break;
2353                     }
2354                 }
2355             }
2356 
2357             RemoveAllChildren(dom);
2358 
2359             dom.appendChild(tagData);
2360             dom.appendChild(tagPatternInfo);
2361             dom.appendChild(tagGrainline);
2362             dom.appendChild(tagNodes);
2363         }
2364     }
2365 }
2366 
2367 //---------------------------------------------------------------------------------------------------------------------
GetUnionDetailNodesV0_4_0(const QDomElement & detail)2368 QDomElement VPatternConverter::GetUnionDetailNodesV0_4_0(const QDomElement &detail)
2369 {
2370     QDomElement tagNodes = createElement(*strNodes);
2371 
2372     if (not detail.isNull())
2373     {
2374         const QDomNodeList childList = detail.childNodes();
2375         for (qint32 i = 0; i < childList.size(); ++i)
2376         {
2377             const QDomElement node = childList.at(i).toElement();
2378             if (not node.isNull())
2379             {
2380                 QDomElement tagNode = createElement(*strNode);
2381 
2382                 tagNode.setAttribute(*strIdObject, node.attribute(*strIdObject, NULL_ID_STR));
2383 
2384                 if (node.hasAttribute(*strReverse))
2385                 {
2386                     tagNode.setAttribute(*strReverse, node.attribute(*strReverse, QChar('0')));
2387                 }
2388 
2389                 tagNode.setAttribute(*strType, node.attribute(*strType, QString()));
2390 
2391                 tagNodes.appendChild(tagNode);
2392             }
2393         }
2394     }
2395 
2396     return tagNodes;
2397 }
2398 
2399 //---------------------------------------------------------------------------------------------------------------------
GetUnionChildrenNodesV0_4_0(const QDomElement & detail)2400 QDomElement VPatternConverter::GetUnionChildrenNodesV0_4_0(const QDomElement &detail)
2401 {
2402     QDomElement tagNodes = createElement(*strNodes);
2403 
2404     if (not detail.isNull())
2405     {
2406         const QDomNodeList childList = detail.childNodes();
2407         for (qint32 i = 0; i < childList.size(); ++i)
2408         {
2409             const QDomElement node = childList.at(i).toElement();
2410             if (not node.isNull())
2411             {
2412                 QDomElement tagNode = node.cloneNode().toElement();
2413                 tagNodes.appendChild(tagNode);
2414             }
2415         }
2416     }
2417 
2418     return tagNodes;
2419 }
2420 
2421 //---------------------------------------------------------------------------------------------------------------------
LabelTagToV0_4_4(const QString & tagName)2422 void VPatternConverter::LabelTagToV0_4_4(const QString &tagName)
2423 {
2424     // TODO. Delete if minimal supported version is 0.4.4
2425     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 4, 4),
2426                       "Time to refactor the code.");
2427 
2428     Unit unit = Unit::Cm;
2429     const QStringList units = QStringList() << "mm" << "cm" << "inch";
2430     switch (units.indexOf(UniqueTagText(*strUnit)))
2431     {
2432         case 0:// mm
2433             unit = Unit::Mm;
2434             break;
2435         case 1:// cm
2436             unit = Unit::Cm;
2437             break;
2438         case 2:// in
2439             unit = Unit::Inch;
2440             break;
2441         default:
2442             break;
2443     }
2444 
2445     auto ConvertData = [unit](QDomElement &dom, const QString &attribute)
2446     {
2447         if (dom.hasAttribute(attribute))
2448         {
2449             QString valStr = dom.attribute(attribute, QChar('1'));
2450             bool ok = false;
2451             qreal val = valStr.toDouble(&ok);
2452             if (not ok)
2453             {
2454                 val = 1;
2455             }
2456             dom.setAttribute(attribute, QString().setNum(FromPixel(val, unit)));
2457         }
2458     };
2459 
2460     const QDomNodeList list = elementsByTagName(tagName);
2461     for (int i=0; i < list.size(); ++i)
2462     {
2463         QDomElement dom = list.at(i).toElement();
2464 
2465         if (not dom.isNull())
2466         {
2467             ConvertData(dom, *strWidth);
2468             ConvertData(dom, *strHeight);
2469         }
2470     }
2471 }
2472 
2473 //---------------------------------------------------------------------------------------------------------------------
AddTagPatternLabelV0_5_1()2474 QDomElement VPatternConverter::AddTagPatternLabelV0_5_1()
2475 {
2476     // TODO. Delete if minimal supported version is 0.6.0
2477     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 6, 0),
2478                       "Time to refactor the code.");
2479 
2480     const QDomNodeList list = elementsByTagName(*strPatternLabel);
2481     if (list.isEmpty())
2482     {
2483         const QStringList tags = QStringList() << *strUnit
2484                                                << *strImage
2485                                                << *strAuthor
2486                                                << *strDescription
2487                                                << *strNotes
2488                                                << *strGradation
2489                                                << *strPatternName
2490                                                << *strPatternNum
2491                                                << *strCompanyName
2492                                                << *strCustomerName
2493                                                << *strPatternLabel;
2494 
2495         QDomElement element = createElement(*strPatternLabel);
2496         QDomElement pattern = documentElement();
2497         for (int i = tags.indexOf(element.tagName())-1; i >= 0; --i)
2498         {
2499             const QDomNodeList list = elementsByTagName(tags.at(i));
2500             if (not list.isEmpty())
2501             {
2502                 pattern.insertAfter(element, list.at(0));
2503                 break;
2504             }
2505         }
2506         return element;
2507     }
2508     return list.at(0).toElement();
2509 }
2510 
2511 //---------------------------------------------------------------------------------------------------------------------
PortPatternLabeltoV0_6_0(QDomElement & label)2512 void VPatternConverter::PortPatternLabeltoV0_6_0(QDomElement &label)
2513 {
2514     // TODO. Delete if minimal supported version is 0.6.0
2515     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 6, 0),
2516                       "Time to refactor the code.");
2517 
2518     if (not UniqueTagText(*strCompanyName).isEmpty())
2519     {
2520         AddLabelTemplateLineV0_6_0(label, "%author%", true, false, 0, 4);
2521     }
2522     else
2523     {
2524         const QString author = UniqueTagText(*strAuthor);
2525         if (not author.isEmpty())
2526         {
2527             AddLabelTemplateLineV0_6_0(label, author, true, false, 0, 4);
2528         }
2529     }
2530 
2531     if (not UniqueTagText(*strPatternName).isEmpty())
2532     {
2533         AddLabelTemplateLineV0_6_0(label, "%patternName%", false, false, 0, 2);
2534     }
2535 
2536     if (not UniqueTagText(*strPatternNum).isEmpty())
2537     {
2538         AddLabelTemplateLineV0_6_0(label, "%patternNumber%", false, false, 0, 0);
2539     }
2540 
2541     if (not UniqueTagText(*strCustomerName).isEmpty())
2542     {
2543         AddLabelTemplateLineV0_6_0(label, "%customer%", false, true, 0, 0);
2544     }
2545 
2546     const QString sizeField = UniqueTagText(*strSize);
2547     if (not sizeField.isEmpty())
2548     {
2549         AddLabelTemplateLineV0_6_0(label, sizeField, false, false, 0, 0);
2550     }
2551 
2552     if (UniqueTagText(*strShowMeasurements) == trueStr)
2553     {
2554         AddLabelTemplateLineV0_6_0(label, "%mFileName%.%mExt%", false, false, 0, 0);
2555     }
2556 
2557     if (UniqueTagText(*strShowDate) == trueStr)
2558     {
2559         AddLabelTemplateLineV0_6_0(label, "%date%", false, true, 0, 0);
2560     }
2561 }
2562 
2563 //---------------------------------------------------------------------------------------------------------------------
AddLabelTemplateLineV0_6_0(QDomElement & label,const QString & text,bool bold,bool italic,int alignment,int fontSizeIncrement)2564 void VPatternConverter::AddLabelTemplateLineV0_6_0(QDomElement &label, const QString &text, bool bold, bool italic,
2565                                                    int alignment, int fontSizeIncrement)
2566 {
2567     // TODO. Delete if minimal supported version is 0.6.0
2568     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 6, 0),
2569                       "Time to refactor the code.");
2570 
2571     QDomElement tagLine = createElement(*strLine);
2572 
2573     SetAttribute(tagLine, *strText, text);
2574     SetAttribute(tagLine, *strBold, bold);
2575     SetAttribute(tagLine, *strItalic, italic);
2576     SetAttribute(tagLine, *strAlignment, alignment);
2577     SetAttribute(tagLine, *strFSIncrement, fontSizeIncrement);
2578 
2579     label.appendChild(tagLine);
2580 }
2581 
2582 //---------------------------------------------------------------------------------------------------------------------
PortPieceLabelstoV0_6_0()2583 void VPatternConverter::PortPieceLabelstoV0_6_0()
2584 {
2585     // TODO. Delete if minimal supported version is 0.6.0
2586     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 6, 0),
2587                       "Time to refactor the code.");
2588 
2589     const QDomNodeList nodeList = elementsByTagName(*strData);
2590     for (int i = 0; i < nodeList.size(); ++i)
2591     {
2592         QDomElement dataTag = nodeList.at(i).toElement();
2593         QDomNodeList nodeListMCP = dataTag.childNodes();
2594         const int count = nodeListMCP.count();
2595         try
2596         {
2597             if (not GetParametrString(dataTag, *strLetter, QString()).isEmpty())
2598             {
2599                 AddLabelTemplateLineV0_6_0(dataTag, "%pLetter%", true, false, Qt::AlignHCenter, 6);
2600             }
2601         }
2602         catch(const VExceptionEmptyParameter &)
2603         {}
2604 
2605         AddLabelTemplateLineV0_6_0(dataTag, "%pName%", true, false, Qt::AlignHCenter, 2);
2606 
2607         int firstLineCutNumber = 1;
2608         bool firstLine = true;
2609 
2610         for (int iMCP = 0; iMCP < count; ++iMCP)
2611         {
2612             QDomElement domMCP = nodeListMCP.at(iMCP).toElement();
2613 
2614             QString line;
2615 
2616             const int material = static_cast<int>(GetParametrUInt(domMCP, *strMaterial, QChar('0')));
2617             switch(material)
2618             {
2619                 case 0:
2620                     line.append("%mFabric%");
2621                     break;
2622                 case 1:
2623                     line.append("%mLining%");
2624                     break;
2625                 case 2:
2626                     line.append("%mInterfacing%");
2627                     break;
2628                 case 3:
2629                     line.append("%mInterlining%");
2630                     break;
2631                 case 4:
2632                 default:
2633                     line.append(GetParametrString(domMCP, *strUserDefined, "User material"));
2634                     break;
2635             }
2636 
2637             line.append(", %wCut% ");
2638 
2639             const int cutNumber = static_cast<int>(GetParametrUInt(domMCP, *strCutNumber, QChar('1')));
2640 
2641             if (firstLine)
2642             {
2643                 firstLineCutNumber = cutNumber;
2644                 dataTag.setAttribute(*strQuantity, cutNumber);
2645                 line.append("%pQuantity%");
2646                 firstLine = false;
2647             }
2648             else
2649             {
2650                 if (firstLineCutNumber != cutNumber)
2651                 {
2652                     line.append(QString::number(cutNumber));
2653                 }
2654                 else
2655                 {
2656                     line.append("%pQuantity%");
2657                 }
2658             }
2659 
2660             if (GetParametrUInt(domMCP, *strPlacement, QChar('0')) == 1)
2661             {
2662                 line.append(" %wOnFold%");
2663             }
2664 
2665             AddLabelTemplateLineV0_6_0(dataTag, line, false, false, Qt::AlignHCenter, 0);
2666         }
2667     }
2668 }
2669 
2670 //---------------------------------------------------------------------------------------------------------------------
RemoveUnusedTagsV0_6_0()2671 void VPatternConverter::RemoveUnusedTagsV0_6_0()
2672 {
2673     // TODO. Delete if minimal supported version is 0.6.0
2674     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 6, 0),
2675                       "Time to refactor the code.");
2676 
2677     RemoveUniqueTagV0_6_0(*strAuthor);
2678     RemoveUniqueTagV0_6_0(*strSize);
2679     RemoveUniqueTagV0_6_0(*strShowDate);
2680     RemoveUniqueTagV0_6_0(*strShowMeasurements);
2681 
2682     QDomNodeList nodeList = elementsByTagName(*strData);
2683     for (int i = 0; i < nodeList.size(); ++i)
2684     {
2685         QDomElement child = nodeList.at(i).firstChildElement(*strMCP);
2686         while (not child.isNull())
2687         {
2688             nodeList.at(i).removeChild(child);
2689             child = nodeList.at(i).firstChildElement(*strMCP);
2690         }
2691     }
2692 }
2693 
2694 //---------------------------------------------------------------------------------------------------------------------
RemoveUniqueTagV0_6_0(const QString & tag)2695 void VPatternConverter::RemoveUniqueTagV0_6_0(const QString &tag)
2696 {
2697     // TODO. Delete if minimal supported version is 0.6.0
2698     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 6, 0),
2699                       "Time to refactor the code.");
2700 
2701     const QDomNodeList nodeList = elementsByTagName(tag);
2702     if (nodeList.isEmpty())
2703     {
2704         return;
2705     }
2706 
2707     QDomElement pattern = documentElement();
2708     pattern.removeChild(nodeList.at(0));
2709 }
2710 
2711 //---------------------------------------------------------------------------------------------------------------------
AddTagPreviewCalculationsV0_6_2()2712 void VPatternConverter::AddTagPreviewCalculationsV0_6_2()
2713 {
2714     // TODO. Delete if minimal supported version is 0.6.2
2715     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 6, 2),
2716                       "Time to refactor the code.");
2717 
2718     const QDomNodeList list = elementsByTagName(*strIncrements);
2719     if (not list.isEmpty())
2720     {
2721         QDomElement pattern = documentElement();
2722         pattern.insertAfter(createElement(*strPreviewCalculations), list.at(0));
2723     }
2724 }
2725 
2726 //---------------------------------------------------------------------------------------------------------------------
RemoveGradationV0_8_8()2727 void VPatternConverter::RemoveGradationV0_8_8()
2728 {
2729     QDomElement patternElement = documentElement();
2730     if (patternElement.isElement())
2731     {
2732         QDomElement gradationTag = patternElement.firstChildElement(*strGradation);
2733         if (gradationTag.isElement())
2734         {
2735             patternElement.removeChild(gradationTag);
2736         }
2737     }
2738 }
2739 
2740 //---------------------------------------------------------------------------------------------------------------------
TagUnionDetailsToV0_4_0()2741 void VPatternConverter::TagUnionDetailsToV0_4_0()
2742 {
2743     // TODO. Delete if minimal supported version is 0.4.0
2744     Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 4, 0),
2745                       "Time to refactor the code.");
2746 
2747     const QDomNodeList list = elementsByTagName(*strTools);
2748     for (int i=0; i < list.size(); ++i)
2749     {
2750         // Tag 'tools' used only for union details, so no need to check any additional attributes
2751         QDomElement toolDOM = list.at(i).toElement();
2752         if (not toolDOM.isNull())
2753         {
2754             const QStringList tags = QStringList() << *strDet << *strChildren;
2755 
2756             QVector<QDomElement> nodes;
2757             QDomElement tagChildrenNodes = createElement(*strChildren);
2758 
2759             const QDomNodeList childList = toolDOM.childNodes();
2760             for (qint32 i = 0; i < childList.size(); ++i)
2761             {
2762                 const QDomElement element = childList.at(i).toElement();
2763                 if (not element.isNull())
2764                 {
2765                     switch (tags.indexOf(element.tagName()))
2766                     {
2767                         case 0://strDet
2768                             nodes.append(GetUnionDetailNodesV0_4_0(element));
2769                             break;
2770                         case 1://strChildren
2771                             tagChildrenNodes.appendChild(GetUnionChildrenNodesV0_4_0(element));
2772                             break;
2773                         default:
2774                             break;
2775                     }
2776                 }
2777             }
2778 
2779             RemoveAllChildren(toolDOM);
2780 
2781             for (auto &node : nodes)
2782             {
2783                 QDomElement tagDet = createElement(*strDet);
2784                 tagDet.appendChild(node);
2785                 toolDOM.appendChild(tagDet);
2786             }
2787             toolDOM.appendChild(tagChildrenNodes);
2788         }
2789     }
2790 }
2791