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