|
|
|
|
@ -137,6 +137,7 @@
|
|
|
|
|
#include "TileBasemap.hpp"
|
|
|
|
|
#include "panels/columns/ColumnDrawer.hpp"
|
|
|
|
|
#include "panels/columns/CategoryAnalysisTab.hpp"
|
|
|
|
|
#include "panels/columns/CategorySection.hpp"
|
|
|
|
|
#include "panels/columns/Column3DDataset.hpp"
|
|
|
|
|
#include "panels/columns/Column2DDataset.hpp"
|
|
|
|
|
#include "panels/columns/Column3DAnalysis.hpp"
|
|
|
|
|
@ -450,11 +451,21 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
|
|
|
|
|
// splitByCategory 后注入 5 段(电阻率/视电阻率/瞬变/三维体/切片);二维(足迹)经 dim2D 仍走 col2D。
|
|
|
|
|
auto lastSourceRows = std::make_shared<std::vector<geopro::data::DsRow>>();
|
|
|
|
|
auto refreshAnalysis = [drawer, scene3dRepo, lastSourceRows]() {
|
|
|
|
|
std::vector<geopro::data::DsRow> rows = *lastSourceRows;
|
|
|
|
|
for (auto& vr : scene3dRepo->volumeRows()) rows.push_back(std::move(vr)); // 客户端三维体
|
|
|
|
|
for (auto& sr : scene3dRepo->sliceRows()) rows.push_back(std::move(sr)); // 已保存切片(挂父体下)
|
|
|
|
|
drawer->analysisTab()->setBuckets(geopro::app::splitByCategory(rows));
|
|
|
|
|
drawer->col2D()->setDatasets(geopro::app::splitByDimension(rows).dim2D);
|
|
|
|
|
const auto vols = scene3dRepo->volumeRows();
|
|
|
|
|
const auto slices = scene3dRepo->sliceRows();
|
|
|
|
|
const auto anomalies = scene3dRepo->anomalyRows();
|
|
|
|
|
// 电阻率/视/瞬变段=对象树反演 ds;voxel/slice 段先由 splitByCategory 按 ddCode 填体/切片。
|
|
|
|
|
std::vector<geopro::data::DsRow> forCat = *lastSourceRows;
|
|
|
|
|
for (const auto& v : vols) forCat.push_back(v);
|
|
|
|
|
for (const auto& s : slices) forCat.push_back(s);
|
|
|
|
|
drawer->analysisTab()->setBuckets(geopro::app::splitByCategory(forCat));
|
|
|
|
|
// 三维体段重置为「体→切片/异常」三级树:体(根)+切片(parentId=体)+异常(parentId=体/切片),
|
|
|
|
|
// populateDatasetList 按 parentId 自动建三级树(spec §8)。
|
|
|
|
|
std::vector<geopro::data::DsRow> voxelTree = vols;
|
|
|
|
|
for (const auto& s : slices) voxelTree.push_back(s);
|
|
|
|
|
for (const auto& a : anomalies) voxelTree.push_back(a);
|
|
|
|
|
if (auto* sec = drawer->analysisTab()->section("voxel")) sec->setDatasets(voxelTree);
|
|
|
|
|
drawer->col2D()->setDatasets(geopro::app::splitByDimension(*lastSourceRows).dim2D);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 渲染勾选聚合:三维数据集栏(剖面→帘面)+ 三维分析栏(三维体/切片→体素/切片)两套勾选并集
|
|
|
|
|
@ -504,8 +515,8 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
|
|
|
|
|
const std::string savedSliceId = interactionMgr->selectedSliceDsId();
|
|
|
|
|
anomalyDrawTool->start(
|
|
|
|
|
o, normal,
|
|
|
|
|
[&window, sceneView, scene3dRepo, renderWindowPtr, refreshAnomalies, volId,
|
|
|
|
|
savedSliceId, normal, o](const std::vector<ri::Vec3>& worldPts) {
|
|
|
|
|
[&window, sceneView, scene3dRepo, renderWindowPtr, refreshAnomalies, refreshAnalysis,
|
|
|
|
|
volId, savedSliceId, normal, o](const std::vector<ri::Vec3>& worldPts) {
|
|
|
|
|
// 草稿异常:先临时渲染(让用户在对话框前看到所画,且截图含异常)。
|
|
|
|
|
geopro::core::Anomaly a;
|
|
|
|
|
a.markType = geopro::core::AnomalyMarkType::Polygon;
|
|
|
|
|
@ -539,9 +550,11 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
|
|
|
|
|
a.remark = dlg.remark().toStdString();
|
|
|
|
|
scene3dRepo->saveAnomaly(
|
|
|
|
|
a, shot.toStdString(),
|
|
|
|
|
[sceneView, renderWindowPtr, refreshAnomalies, draftId](std::string) {
|
|
|
|
|
[sceneView, renderWindowPtr, refreshAnomalies, refreshAnalysis,
|
|
|
|
|
draftId](std::string) {
|
|
|
|
|
sceneView->removeAnomaly(draftId); // 撤草稿
|
|
|
|
|
refreshAnomalies(); // 重渲染 + 刷新异常列表(含新异常)
|
|
|
|
|
refreshAnomalies(); // 重渲染异常 actor
|
|
|
|
|
refreshAnalysis(); // 新异常进三维体段三级树(挂体/切片)
|
|
|
|
|
renderWindowPtr->Render();
|
|
|
|
|
},
|
|
|
|
|
[&window](const std::string& m) {
|
|
|
|
|
@ -663,7 +676,9 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
|
|
|
|
|
checkedSliceIds->clear();
|
|
|
|
|
for (const QString& id : ids) {
|
|
|
|
|
const std::string s = id.toStdString();
|
|
|
|
|
if (scene3dRepo->isSliceDataset(s))
|
|
|
|
|
if (scene3dRepo->isAnomalyDataset(s))
|
|
|
|
|
continue; // 异常不进渲染勾选(显隐另管,避免被当帘面源 loadSection 失败)
|
|
|
|
|
else if (scene3dRepo->isSliceDataset(s))
|
|
|
|
|
checkedSliceIds->insert(s);
|
|
|
|
|
else if (scene3dRepo->isVolumeDataset(s))
|
|
|
|
|
analysis << id;
|
|
|
|
|
|