feat:适配单位配置文件。

develop
lh 1 week ago
parent 89425fbcc9
commit f00c01cd5b

@ -3,6 +3,7 @@
#include "iParaItemCtrl.h" #include "iParaItemCtrl.h"
#include "iParameter.h" #include "iParameter.h"
#include "iSysParaHelper.h" #include "iSysParaHelper.h"
#include "iUnitHelper.h"
#include "mModuleDefines.h" #include "mModuleDefines.h"
#include <QComboBox> #include <QComboBox>
@ -12,6 +13,7 @@
#include <QLineEdit> #include <QLineEdit>
#include <QPalette> #include <QPalette>
#include <QSizePolicy> #include <QSizePolicy>
#include <QStringList>
namespace namespace
{ {
@ -47,6 +49,185 @@ QString validationToolTip(const QString& sText, bool bValid)
return "<span style=\"color:red;\">" + sEscaped + "</span>"; return "<span style=\"color:red;\">" + sEscaped + "</span>";
} }
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() nmParameterFieldInfo::nmParameterFieldInfo()
@ -119,6 +300,7 @@ bool nmParameterField::initialize(QGridLayout* pLayout,
.arg(m_oFieldInfo.m_sBaseParameterId); .arg(m_oFieldInfo.m_sBaseParameterId);
return false; return false;
} }
resolveParameterUnitSpelling(m_pParameter);
// 第三步:创建标签、输入框和单位列。 // 第三步:创建标签、输入框和单位列。
return createNumericEditor(pLayout, nRow, nColumnOffset, sError); return createNumericEditor(pLayout, nRow, nColumnOffset, sError);

Loading…
Cancel
Save