diff --git a/src/libs/ifc/schema/pattern/v0.4.0.xsd b/src/libs/ifc/schema/pattern/v0.4.0.xsd index d8b2f8066..397e7b1eb 100644 --- a/src/libs/ifc/schema/pattern/v0.4.0.xsd +++ b/src/libs/ifc/schema/pattern/v0.4.0.xsd @@ -362,23 +362,75 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libs/ifc/xml/vpatternconverter.cpp b/src/libs/ifc/xml/vpatternconverter.cpp index f17998f76..f9d936502 100644 --- a/src/libs/ifc/xml/vpatternconverter.cpp +++ b/src/libs/ifc/xml/vpatternconverter.cpp @@ -130,7 +130,8 @@ const QString strMy = QStringLiteral("my"); const QString strForbidFlipping = QStringLiteral("forbidFlipping"); const QString strInLayout = QStringLiteral("inLayout"); const QString strSeamAllowance = QStringLiteral("seamAllowance"); -const QString strTypeObject = QStringLiteral("typeObject"); +const QString strNodeType = QStringLiteral("nodeType"); +const QString strDet = QStringLiteral("det"); //--------------------------------------------------------------------------------------------------------------------- VPatternConverter::VPatternConverter(const QString &fileName) @@ -590,6 +591,7 @@ void VPatternConverter::ToV0_4_0() SetVersion(QStringLiteral("0.4.0")); TagRemoveAttributeTypeObjectInV0_4_0(); TagDetailToV0_4_0(); + TagUnionDetailsToV0_4_0(); Save(); } @@ -1714,9 +1716,9 @@ void VPatternConverter::TagRemoveAttributeTypeObjectInV0_4_0() QDomElement domElement = domNode.toElement(); if (not domElement.isNull()) { - if (domElement.hasAttribute(strTypeObject)) + if (domElement.hasAttribute(strNodeType)) { - domElement.removeAttribute(strTypeObject); + domElement.removeAttribute(strNodeType); } } domNode = domNode.nextSibling(); @@ -1810,3 +1812,109 @@ void VPatternConverter::TagDetailToV0_4_0() } } } + +//--------------------------------------------------------------------------------------------------------------------- +QDomElement VPatternConverter::GetUnionDetailNodesV0_4_0(const QDomElement &detail) +{ + QDomElement tagNodes = createElement(strNodes); + + if (not detail.isNull()) + { + const QDomNodeList childList = detail.childNodes(); + for (qint32 i = 0; i < childList.size(); ++i) + { + const QDomElement node = childList.at(i).toElement(); + if (not node.isNull()) + { + QDomElement tagNode = createElement(strNode); + + tagNode.setAttribute(strIdObject, node.attribute(strIdObject, NULL_ID_STR)); + + if (node.hasAttribute(strReverse)) + { + tagNode.setAttribute(strReverse, node.attribute(strReverse, "0")); + } + + tagNode.setAttribute(strType, node.attribute(strType, "")); + + tagNodes.appendChild(tagNode); + } + } + } + + return tagNodes; +} + +//--------------------------------------------------------------------------------------------------------------------- +QDomElement VPatternConverter::GetUnionChildrenNodesV0_4_0(const QDomElement &detail) +{ + QDomElement tagNodes = createElement(strNodes); + + if (not detail.isNull()) + { + const QDomNodeList childList = detail.childNodes(); + for (qint32 i = 0; i < childList.size(); ++i) + { + const QDomElement node = childList.at(i).toElement(); + if (not node.isNull()) + { + QDomElement tagNode = node.cloneNode().toElement(); + tagNodes.appendChild(tagNode); + } + } + } + + return tagNodes; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VPatternConverter::TagUnionDetailsToV0_4_0() +{ + // TODO. Delete if minimal supported version is 0.4.0 + Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < CONVERTER_VERSION_CHECK(0, 4, 0), + "Time to refactor the code."); + + const QDomNodeList list = elementsByTagName(strTools); + for (int i=0; i < list.size(); ++i) + { + // Tag 'tools' used only for union details, so no need to check any additional attributes + QDomElement toolDOM = list.at(i).toElement(); + if (not toolDOM.isNull()) + { + const QStringList tags = QStringList() << strDet << strChildren; + + QVector nodes; + QDomElement tagChildrenNodes = createElement(strChildren); + + const QDomNodeList childList = toolDOM.childNodes(); + for (qint32 i = 0; i < childList.size(); ++i) + { + const QDomElement element = childList.at(i).toElement(); + if (not element.isNull()) + { + switch (tags.indexOf(element.tagName())) + { + case 0://strDet + nodes.append(GetUnionDetailNodesV0_4_0(element)); + break; + case 1://strChildren + tagChildrenNodes.appendChild(GetUnionChildrenNodesV0_4_0(element)); + break; + default: + break; + } + } + } + + RemoveAllChildren(toolDOM); + + for (int i = 0; i < nodes.size(); ++i) + { + QDomElement tagDet = createElement(strDet); + tagDet.appendChild(nodes.at(i)); + toolDOM.appendChild(tagDet); + } + toolDOM.appendChild(tagChildrenNodes); + } + } +} diff --git a/src/libs/ifc/xml/vpatternconverter.h b/src/libs/ifc/xml/vpatternconverter.h index 8b51c0d4a..3341fecaf 100644 --- a/src/libs/ifc/xml/vpatternconverter.h +++ b/src/libs/ifc/xml/vpatternconverter.h @@ -137,6 +137,9 @@ private: void TagRemoveAttributeTypeObjectInV0_4_0(); void TagDetailToV0_4_0(); + void TagUnionDetailsToV0_4_0(); + QDomElement GetUnionDetailNodesV0_4_0(const QDomElement &detail); + QDomElement GetUnionChildrenNodesV0_4_0(const QDomElement &detail); }; //---------------------------------------------------------------------------------------------------------------------