|
|
|
|
@ -607,6 +607,39 @@ static bool isGeometryParaAttrName(const QString& name)
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 参数注册名可能带对象编码前缀,判断时只匹配完整的基础参数后缀。
|
|
|
|
|
static bool hasRegisteredAttributeBaseName(
|
|
|
|
|
const QString& sName,
|
|
|
|
|
const char* pBaseName)
|
|
|
|
|
{
|
|
|
|
|
const QString sBaseName = QString::fromLatin1(pBaseName);
|
|
|
|
|
return sName == sBaseName || sName.endsWith(QString("_") + sBaseName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 这里只区分网格输入和仅求解输入,不在界面层重新解释 PEBI 业务规则。
|
|
|
|
|
static bool isPebiGridInputAttributeName(const QString& sName)
|
|
|
|
|
{
|
|
|
|
|
static const char* GRID_INPUT_NAMES[] = {
|
|
|
|
|
"W_X", "W_Y", "W_Rw",
|
|
|
|
|
"W_FractureHalfLength", "W_FractureAngle", "W_Dfc",
|
|
|
|
|
"W_WellLength", "W_DrainAngle", "W_NumberOfFractures",
|
|
|
|
|
"F_X0", "F_Y0", "F_X1", "F_Y1",
|
|
|
|
|
"FT_X0", "FT_Y0", "FT_X1", "FT_Y1",
|
|
|
|
|
"BR_XMin", "BR_YMin", "BR_XMax", "BR_YMax",
|
|
|
|
|
"BC_CenterX", "BC_CenterY", "BC_Radius",
|
|
|
|
|
"BP_X", "BP_Y"
|
|
|
|
|
};
|
|
|
|
|
const int nNameCount = sizeof(GRID_INPUT_NAMES) /
|
|
|
|
|
sizeof(GRID_INPUT_NAMES[0]);
|
|
|
|
|
for(int nIndex = 0; nIndex < nNameCount; ++nIndex) {
|
|
|
|
|
if(hasRegisteredAttributeBaseName(sName,
|
|
|
|
|
GRID_INPUT_NAMES[nIndex])) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
// 清空指定目录下的所有旧文件和子目录,但保留目录本身
|
|
|
|
|
bool clearDirectoryContents(const QString& dirPath)
|
|
|
|
|
@ -1329,6 +1362,8 @@ ZX_DEFINE_DYNAMIC(DataAnalyzeManager, nmDataAnalyzeManager)
|
|
|
|
|
|
|
|
|
|
// 属性注册表
|
|
|
|
|
m_pAttrRegistry = new nmAttrRegistry();
|
|
|
|
|
connect(m_pAttrRegistry, SIGNAL(sigAttrEdited(QString,QVariant)),
|
|
|
|
|
this, SLOT(onRegisteredAttributeEdited(QString,QVariant)));
|
|
|
|
|
|
|
|
|
|
m_backgroundImageInfo.bIsVisible = false;
|
|
|
|
|
// 初始化混合参数数据(Temp)
|
|
|
|
|
@ -4308,7 +4343,14 @@ bool nmDataAnalyzeManager::getIncludeOtherWells() const
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::setPebiGridControl(double dGridControl)
|
|
|
|
|
{
|
|
|
|
|
const quint64 nOldGridInputRevision =
|
|
|
|
|
m_oNumericalAnalysisCase.getGridInputRevision();
|
|
|
|
|
m_oNumericalAnalysisCase.setPebiGridControl(dGridControl);
|
|
|
|
|
if(nOldGridInputRevision !=
|
|
|
|
|
m_oNumericalAnalysisCase.getGridInputRevision()) {
|
|
|
|
|
// 分析方案已完成网格和结果失效,这里只通知已打开的网格窗口刷新。
|
|
|
|
|
emit dataChanged();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double nmDataAnalyzeManager::getPebiGridControl() const
|
|
|
|
|
@ -4811,13 +4853,29 @@ nmDataWellBase* nmDataAnalyzeManager::getCurWellData()
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::notifyDataChanged()
|
|
|
|
|
{
|
|
|
|
|
// 现有属性编辑链路尚未细分“几何变化”和“仅求解输入变化”,
|
|
|
|
|
// 为保证正确性先采用保守策略:任一计算数据变化都使网格失效。
|
|
|
|
|
// 本入口用于几何、井集合等网格输入;仅影响求解的参数应调用
|
|
|
|
|
// invalidatePebiResults(),避免无意义地重建当前有效网格。
|
|
|
|
|
m_oNumericalAnalysisCase.invalidateGrid();
|
|
|
|
|
|
|
|
|
|
emit dataChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::onRegisteredAttributeEdited(
|
|
|
|
|
QString sName,
|
|
|
|
|
QVariant oValue)
|
|
|
|
|
{
|
|
|
|
|
Q_UNUSED(oValue);
|
|
|
|
|
|
|
|
|
|
if(isPebiGridInputAttributeName(sName)) {
|
|
|
|
|
// 几何及离散参数变化后,Map 使用数据对象重绘,网格窗口按新版本自动重建。
|
|
|
|
|
notifyDataChanged();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 其余实时注册参数均属于求解输入,只使结果过期,保留当前有效网格。
|
|
|
|
|
invalidatePebiResults();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::notifyGeometryListChanged()
|
|
|
|
|
{
|
|
|
|
|
m_oNumericalAnalysisCase.invalidateGrid();
|
|
|
|
|
|