diff --git a/Src/nmNum/nmSubWxs/nmParameterField.cpp b/Src/nmNum/nmSubWxs/nmParameterField.cpp index 7f8f8fe..30765f8 100644 --- a/Src/nmNum/nmSubWxs/nmParameterField.cpp +++ b/Src/nmNum/nmSubWxs/nmParameterField.cpp @@ -3,6 +3,7 @@ #include "iParaItemCtrl.h" #include "iParameter.h" #include "iSysParaHelper.h" +#include "iUnitHelper.h" #include "mModuleDefines.h" #include @@ -12,6 +13,7 @@ #include #include #include +#include namespace { @@ -47,6 +49,185 @@ QString validationToolTip(const QString& sText, bool bValid) return "" + sEscaped + ""; } +QChar superscriptDigit(QChar ch) +{ + switch (ch.unicode()) + { + case '0': return QChar(0x2070); + case '1': return QChar(0x00B9); + case '2': return QChar(0x00B2); + case '3': return QChar(0x00B3); + case '4': return QChar(0x2074); + case '5': return QChar(0x2075); + case '6': return QChar(0x2076); + case '7': return QChar(0x2077); + case '8': return QChar(0x2078); + case '9': return QChar(0x2079); + default: return QChar(); + } +} + +QChar plainDigitFromSuperscript(QChar ch) +{ + switch (ch.unicode()) + { + case 0x2070: return QLatin1Char('0'); + case 0x00B9: return QLatin1Char('1'); + case 0x00B2: return QLatin1Char('2'); + case 0x00B3: return QLatin1Char('3'); + case 0x2074: return QLatin1Char('4'); + case 0x2075: return QLatin1Char('5'); + case 0x2076: return QLatin1Char('6'); + case 0x2077: return QLatin1Char('7'); + case 0x2078: return QLatin1Char('8'); + case 0x2079: return QLatin1Char('9'); + default: return QChar(); + } +} + +QString toSuperscriptUnit(const QString& sUnit) +{ + QString sResult; + sResult.reserve(sUnit.size()); + for (int nIndex = 0; nIndex < sUnit.size(); ++nIndex) + { + if (sUnit[nIndex] == QLatin1Char('^') && + nIndex + 1 < sUnit.size()) + { + QString sDigits; + int nDigitIndex = nIndex + 1; + while (nDigitIndex < sUnit.size()) + { + QChar chSuperscript = superscriptDigit(sUnit[nDigitIndex]); + if (chSuperscript.isNull()) + { + break; + } + + sDigits.append(chSuperscript); + ++nDigitIndex; + } + + if (!sDigits.isEmpty()) + { + sResult.append(sDigits); + nIndex = nDigitIndex - 1; + continue; + } + } + + sResult.append(sUnit[nIndex]); + } + return sResult; +} + +QString fromSuperscriptUnit(const QString& sUnit) +{ + QString sResult; + sResult.reserve(sUnit.size() * 2); + bool bInSuperscriptDigits = false; + for (int nIndex = 0; nIndex < sUnit.size(); ++nIndex) + { + QChar chDigit = plainDigitFromSuperscript(sUnit[nIndex]); + if (!chDigit.isNull()) + { + if (!bInSuperscriptDigits) + { + sResult.append(QLatin1Char('^')); + bInSuperscriptDigits = true; + } + sResult.append(chDigit); + continue; + } + + bInSuperscriptDigits = false; + sResult.append(sUnit[nIndex]); + } + return sResult; +} + +void appendUnique(QStringList& listUnits, const QString& sUnit) +{ + if (!sUnit.isEmpty() && !listUnits.contains(sUnit)) + { + listUnits << sUnit; + } +} + +void appendUnitSpellingVariants(QStringList& listUnits, + const QString& sUnit) +{ + QString sVariant = toSuperscriptUnit(sUnit); + appendUnique(listUnits, sVariant); + + sVariant = fromSuperscriptUnit(sUnit); + appendUnique(listUnits, sVariant); + + sVariant = sUnit; + sVariant.replace(QLatin1String("."), QString(QChar(0x00B7))); + appendUnique(listUnits, sVariant); + + sVariant = sUnit; + sVariant.replace(QString(QChar(0x00B7)), QLatin1String(".")); + appendUnique(listUnits, sVariant); + + sVariant = sUnit; + sVariant.replace(QLatin1String("/D"), QLatin1String("/d")); + appendUnique(listUnits, sVariant); + + sVariant = sUnit; + sVariant.replace(QLatin1String("/d"), QLatin1String("/D")); + appendUnique(listUnits, sVariant); + + if (sUnit == QLatin1String("Darcy")) + { + appendUnique(listUnits, QLatin1String("D")); + } + else if (sUnit == QLatin1String("D")) + { + appendUnique(listUnits, QLatin1String("Darcy")); + } +} + +QStringList unitSpellingCandidates(const QString& sUnit) +{ + QStringList listUnits; + appendUnique(listUnits, sUnit); + for (int nIndex = 0; nIndex < listUnits.size(); ++nIndex) + { + appendUnitSpellingVariants(listUnits, listUnits[nIndex]); + } + return listUnits; +} + +QString resolveAvailableUnitSpelling(const QString& sUnit) +{ + QStringList listUnits = unitSpellingCandidates(sUnit); + for (int nIndex = 0; nIndex < listUnits.size(); ++nIndex) + { + if (iUnitHelper::getUnitGroupByUnit(listUnits[nIndex]) != nullptr) + { + return listUnits[nIndex]; + } + } + return sUnit; +} + +void resolveParameterUnitSpelling(iParameter* pParameter) +{ + if (pParameter == nullptr || pParameter->m_sUnit.isEmpty()) + { + return; + } + + // 参数XML和单位XML可能使用不同排版写法,绑定前切到当前单位表可识别的单位名。 + QString sResolvedUnit = resolveAvailableUnitSpelling(pParameter->m_sUnit); + if (sResolvedUnit != pParameter->m_sUnit) + { + pParameter->m_sUnit = sResolvedUnit; + } +} + } nmParameterFieldInfo::nmParameterFieldInfo() @@ -119,6 +300,7 @@ bool nmParameterField::initialize(QGridLayout* pLayout, .arg(m_oFieldInfo.m_sBaseParameterId); return false; } + resolveParameterUnitSpelling(m_pParameter); // 第三步:创建标签、输入框和单位列。 return createNumericEditor(pLayout, nRow, nColumnOffset, sError);