|
|
|
@ -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);
|
|
|
|
|