mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Prototype of copy/paste of reservoir case
p4#: 20962
This commit is contained in:
parent
5860cb2e49
commit
051710b82f
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include "RigGridCollection.h"
|
#include "RigGridCollection.h"
|
||||||
#include "RigEclipseCase.h"
|
#include "RigEclipseCase.h"
|
||||||
|
#include "RimResultReservoir.h"
|
||||||
|
|
||||||
|
|
||||||
CAF_PDM_SOURCE_INIT(RimProject, "ResInsightProject");
|
CAF_PDM_SOURCE_INIT(RimProject, "ResInsightProject");
|
||||||
@ -134,31 +135,8 @@ void RimProject::moveEclipseCaseIntoCaseGroup(RimReservoir* rimReservoir)
|
|||||||
CVF_ASSERT(rimReservoir);
|
CVF_ASSERT(rimReservoir);
|
||||||
|
|
||||||
RigEclipseCase* rigEclipseCase = rimReservoir->reservoirData();
|
RigEclipseCase* rigEclipseCase = rimReservoir->reservoirData();
|
||||||
|
RigMainGrid* equalGrid = registerCaseInGridCollection(rigEclipseCase);
|
||||||
RigMainGrid* equalGrid = m_gridCollection->findEqualGrid(rigEclipseCase->mainGrid());
|
CVF_ASSERT(equalGrid);
|
||||||
|
|
||||||
if (equalGrid)
|
|
||||||
{
|
|
||||||
// Replace the grid with an already registered grid
|
|
||||||
rigEclipseCase->setMainGrid(equalGrid);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// This is the first insertion of this grid, compute cached data
|
|
||||||
rigEclipseCase->mainGrid()->computeCachedData();
|
|
||||||
|
|
||||||
std::vector<RigGridBase*> grids;
|
|
||||||
rigEclipseCase->allGrids(&grids);
|
|
||||||
|
|
||||||
size_t i;
|
|
||||||
for (i = 0; i < grids.size(); i++)
|
|
||||||
{
|
|
||||||
grids[i]->computeFaults();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_gridCollection->addCase(rigEclipseCase);
|
|
||||||
|
|
||||||
|
|
||||||
// Insert in identical grid group
|
// Insert in identical grid group
|
||||||
bool foundGroup = false;
|
bool foundGroup = false;
|
||||||
@ -214,3 +192,96 @@ void RimProject::removeEclipseCaseFromAllGroups(RimReservoir* reservoir)
|
|||||||
|
|
||||||
reservoirs().removeChildObject(reservoir);
|
reservoirs().removeChildObject(reservoir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RigMainGrid* RimProject::registerCaseInGridCollection(RigEclipseCase* rigEclipseCase)
|
||||||
|
{
|
||||||
|
CVF_ASSERT(rigEclipseCase);
|
||||||
|
|
||||||
|
RigMainGrid* equalGrid = m_gridCollection->findEqualGrid(rigEclipseCase->mainGrid());
|
||||||
|
|
||||||
|
if (equalGrid)
|
||||||
|
{
|
||||||
|
// Replace the grid with an already registered grid
|
||||||
|
rigEclipseCase->setMainGrid(equalGrid);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// This is the first insertion of this grid, compute cached data
|
||||||
|
rigEclipseCase->mainGrid()->computeCachedData();
|
||||||
|
|
||||||
|
std::vector<RigGridBase*> grids;
|
||||||
|
rigEclipseCase->allGrids(&grids);
|
||||||
|
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < grids.size(); i++)
|
||||||
|
{
|
||||||
|
grids[i]->computeFaults();
|
||||||
|
}
|
||||||
|
|
||||||
|
equalGrid = rigEclipseCase->mainGrid();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_gridCollection->addCase(rigEclipseCase);
|
||||||
|
|
||||||
|
return equalGrid;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimProject::insertCaseInCaseGroup(RimReservoir* rimReservoir, RimIdenticalGridCaseGroup* caseGroup)
|
||||||
|
{
|
||||||
|
CVF_ASSERT(rimReservoir);
|
||||||
|
|
||||||
|
RigEclipseCase* rigEclipseCase = rimReservoir->reservoirData();
|
||||||
|
registerCaseInGridCollection(rigEclipseCase);
|
||||||
|
|
||||||
|
caseGroup->addCase(rimReservoir);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimProject::copyFromCaseList(RimIdenticalGridCaseGroup* caseGroup, const caf::PdmObjectGroup& caseList)
|
||||||
|
{
|
||||||
|
std::vector<caf::PdmPointer<RimReservoir> > typedObjects;
|
||||||
|
caseList.createCopyByType(&typedObjects);
|
||||||
|
|
||||||
|
if (typedObjects.size() == 0) return;
|
||||||
|
|
||||||
|
RigEclipseCase* mainEclipseCase = NULL;
|
||||||
|
if (caseGroup->caseCollection()->reservoirs().size() > 0)
|
||||||
|
{
|
||||||
|
RimReservoir* mainReservoir = caseGroup->caseCollection()->reservoirs()[0];;
|
||||||
|
mainEclipseCase = mainReservoir->reservoirData();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < typedObjects.size(); i++)
|
||||||
|
{
|
||||||
|
RimReservoir* rimReservoir = typedObjects[i];
|
||||||
|
caf::PdmObjectGroup::initAfterReadTraversal(rimReservoir);
|
||||||
|
|
||||||
|
RimResultReservoir* rimResultReservoir = dynamic_cast<RimResultReservoir*>(rimReservoir);
|
||||||
|
if (rimResultReservoir)
|
||||||
|
{
|
||||||
|
if (caseGroup->mainGrid() == NULL)
|
||||||
|
{
|
||||||
|
rimResultReservoir->openEclipseGridFile();
|
||||||
|
mainEclipseCase = rimResultReservoir->reservoirData();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!rimResultReservoir->openAndReadActiveCellData(mainEclipseCase))
|
||||||
|
{
|
||||||
|
CVF_ASSERT(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
insertCaseInCaseGroup(rimResultReservoir, caseGroup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -48,9 +48,15 @@ public:
|
|||||||
|
|
||||||
void close();
|
void close();
|
||||||
|
|
||||||
|
void copyFromCaseList(RimIdenticalGridCaseGroup* caseGroup, const caf::PdmObjectGroup& caseList);
|
||||||
|
void insertCaseInCaseGroup(RimReservoir* rimReservoir, RimIdenticalGridCaseGroup* caseGroup);
|
||||||
|
|
||||||
void moveEclipseCaseIntoCaseGroup(RimReservoir* rimReservoir);
|
void moveEclipseCaseIntoCaseGroup(RimReservoir* rimReservoir);
|
||||||
void removeEclipseCaseFromAllGroups(RimReservoir* rimReservoir);
|
void removeEclipseCaseFromAllGroups(RimReservoir* rimReservoir);
|
||||||
|
|
||||||
|
private:
|
||||||
|
RigMainGrid* registerCaseInGridCollection(RigEclipseCase* rigEclipseCase);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Overridden methods
|
// Overridden methods
|
||||||
virtual void initAfterRead();
|
virtual void initAfterRead();
|
||||||
|
@ -40,6 +40,17 @@ RimUiTreeView::RimUiTreeView(QWidget *parent /*= 0*/)
|
|||||||
: QTreeView(parent)
|
: QTreeView(parent)
|
||||||
{
|
{
|
||||||
setHeaderHidden(true);
|
setHeaderHidden(true);
|
||||||
|
|
||||||
|
m_pdmObjectsFromClipboard = new caf::PdmObjectGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RimUiTreeView::~RimUiTreeView()
|
||||||
|
{
|
||||||
|
delete m_pdmObjectsFromClipboard;
|
||||||
|
m_pdmObjectsFromClipboard = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -161,6 +172,7 @@ void RimUiTreeView::contextMenuEvent(QContextMenuEvent* event)
|
|||||||
else if (dynamic_cast<RimReservoir*>(uiItem->dataObject().p()))
|
else if (dynamic_cast<RimReservoir*>(uiItem->dataObject().p()))
|
||||||
{
|
{
|
||||||
QMenu menu;
|
QMenu menu;
|
||||||
|
menu.addAction(QString("Copy"), this, SLOT(slotCopyPdmObjectToClipboard()));
|
||||||
menu.addAction(QString("Close"), this, SLOT(slotCloseCase()));
|
menu.addAction(QString("Close"), this, SLOT(slotCloseCase()));
|
||||||
menu.addAction(QString("New View"), this, SLOT(slotAddView()));
|
menu.addAction(QString("New View"), this, SLOT(slotAddView()));
|
||||||
menu.exec(event->globalPos());
|
menu.exec(event->globalPos());
|
||||||
@ -169,6 +181,7 @@ void RimUiTreeView::contextMenuEvent(QContextMenuEvent* event)
|
|||||||
{
|
{
|
||||||
QMenu menu;
|
QMenu menu;
|
||||||
menu.addAction(QString("New Case Group"), this, SLOT(slotAddCaseGroup()));
|
menu.addAction(QString("New Case Group"), this, SLOT(slotAddCaseGroup()));
|
||||||
|
menu.addAction(QString("Paste"), this, SLOT(slotPasteEclipseCases()));
|
||||||
menu.exec(event->globalPos());
|
menu.exec(event->globalPos());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -816,3 +829,107 @@ void RimUiTreeView::slotAddCaseGroup()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimUiTreeView::slotCopyPdmObjectToClipboard()
|
||||||
|
{
|
||||||
|
QItemSelectionModel* m = selectionModel();
|
||||||
|
|
||||||
|
QModelIndexList mil = m->selectedRows();
|
||||||
|
if (mil.size() == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MimeDataWithIndexes* myObject = new MimeDataWithIndexes;
|
||||||
|
myObject->setIndexes(mil);
|
||||||
|
|
||||||
|
QClipboard* clipboard = QApplication::clipboard();
|
||||||
|
if (clipboard)
|
||||||
|
{
|
||||||
|
clipboard->setMimeData(myObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimUiTreeView::slotPasteEclipseCases()
|
||||||
|
{
|
||||||
|
if (!currentIndex().isValid()) return;
|
||||||
|
|
||||||
|
createPdmObjectsFromClipboard();
|
||||||
|
if (m_pdmObjectsFromClipboard->objects().size() == 0) return;
|
||||||
|
|
||||||
|
RimUiTreeModelPdm* myModel = dynamic_cast<RimUiTreeModelPdm*>(model());
|
||||||
|
caf::PdmUiTreeItem* uiItem = myModel->getTreeItemFromIndex(currentIndex());
|
||||||
|
|
||||||
|
RimIdenticalGridCaseGroup* destinationGroup = dynamic_cast<RimIdenticalGridCaseGroup*>(uiItem->dataObject().p());
|
||||||
|
if (!destinationGroup) return;
|
||||||
|
|
||||||
|
|
||||||
|
RimProject* proj = RIApplication::instance()->project();
|
||||||
|
proj->copyFromCaseList(destinationGroup, *m_pdmObjectsFromClipboard);
|
||||||
|
|
||||||
|
myModel->rebuildUiSubTree(destinationGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimUiTreeView::createPdmObjectsFromClipboard()
|
||||||
|
{
|
||||||
|
m_pdmObjectsFromClipboard->objects().clear();
|
||||||
|
|
||||||
|
RimUiTreeModelPdm* myModel = dynamic_cast<RimUiTreeModelPdm*>(model());
|
||||||
|
if (!myModel) return;
|
||||||
|
|
||||||
|
QClipboard* clipboard = QApplication::clipboard();
|
||||||
|
if (!clipboard) return;
|
||||||
|
|
||||||
|
const MimeDataWithIndexes* mdWithIndexes = dynamic_cast<const MimeDataWithIndexes*>(clipboard->mimeData());
|
||||||
|
if (!mdWithIndexes) return;
|
||||||
|
|
||||||
|
QModelIndexList indexList = mdWithIndexes->indexes();
|
||||||
|
for (int i = 0; i < indexList.size(); i++)
|
||||||
|
{
|
||||||
|
caf::PdmUiTreeItem* uiItem = myModel->getTreeItemFromIndex(indexList.at(i));
|
||||||
|
m_pdmObjectsFromClipboard->addObject(uiItem->dataObject().p());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimUiTreeView::keyPressEvent(QKeyEvent* keyEvent)
|
||||||
|
{
|
||||||
|
RimUiTreeModelPdm* myModel = dynamic_cast<RimUiTreeModelPdm*>(model());
|
||||||
|
caf::PdmUiTreeItem* uiItem = myModel->getTreeItemFromIndex(currentIndex());
|
||||||
|
|
||||||
|
if (dynamic_cast<RimReservoir*>(uiItem->dataObject().p()))
|
||||||
|
{
|
||||||
|
if (keyEvent->matches(QKeySequence::Copy))
|
||||||
|
{
|
||||||
|
slotCopyPdmObjectToClipboard();
|
||||||
|
keyEvent->setAccepted(true);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dynamic_cast<RimIdenticalGridCaseGroup*>(uiItem->dataObject().p()))
|
||||||
|
{
|
||||||
|
if (keyEvent->matches(QKeySequence::Paste))
|
||||||
|
{
|
||||||
|
slotPasteEclipseCases();
|
||||||
|
keyEvent->setAccepted(true);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QTreeView::keyPressEvent(keyEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include <QTreeView>
|
#include <QTreeView>
|
||||||
|
|
||||||
class QItemSelection;
|
class QItemSelection;
|
||||||
|
class PdmObjectGroup;
|
||||||
|
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
///
|
///
|
||||||
@ -34,6 +35,7 @@ class RimUiTreeView : public QTreeView
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
RimUiTreeView(QWidget *parent = 0);
|
RimUiTreeView(QWidget *parent = 0);
|
||||||
|
~RimUiTreeView();
|
||||||
|
|
||||||
virtual void setModel(QAbstractItemModel* model);
|
virtual void setModel(QAbstractItemModel* model);
|
||||||
|
|
||||||
@ -73,11 +75,20 @@ private slots:
|
|||||||
void slotComputeStatisticalCases();
|
void slotComputeStatisticalCases();
|
||||||
void slotAddCaseGroup();
|
void slotAddCaseGroup();
|
||||||
|
|
||||||
|
void slotCopyPdmObjectToClipboard();
|
||||||
|
void slotPasteEclipseCases();
|
||||||
|
|
||||||
void slotSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected);
|
void slotSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void selectedObjectChanged( caf::PdmObject* pdmObject );
|
void selectedObjectChanged( caf::PdmObject* pdmObject );
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void createPdmObjectsFromClipboard();
|
||||||
|
|
||||||
|
virtual void keyPressEvent(QKeyEvent* keyEvent);
|
||||||
|
caf::PdmObjectGroup* m_pdmObjectsFromClipboard;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -72,6 +72,34 @@ void PdmObjectGroup::addObject(PdmObject * obj)
|
|||||||
objects.push_back(obj);
|
objects.push_back(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void PdmObjectGroup::initAfterReadTraversal(PdmObject* object)
|
||||||
|
{
|
||||||
|
if (object == NULL) return;
|
||||||
|
|
||||||
|
std::vector<PdmFieldHandle*> fields;
|
||||||
|
object->fields(fields);
|
||||||
|
|
||||||
|
std::vector<PdmObject*> children;
|
||||||
|
size_t fIdx;
|
||||||
|
for (fIdx = 0; fIdx < fields.size(); ++fIdx)
|
||||||
|
{
|
||||||
|
if (fields[fIdx]) fields[fIdx]->childObjects(&children);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t cIdx;
|
||||||
|
for (cIdx = 0; cIdx < children.size(); ++cIdx)
|
||||||
|
{
|
||||||
|
PdmObjectGroup::initAfterReadTraversal(children[cIdx]);
|
||||||
|
if (children[cIdx]) children[cIdx]->initAfterRead();
|
||||||
|
}
|
||||||
|
|
||||||
|
object->initAfterRead();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CAF_PDM_SOURCE_INIT(PdmDocument, "PdmDocument");
|
CAF_PDM_SOURCE_INIT(PdmDocument, "PdmDocument");
|
||||||
|
|
||||||
@ -157,29 +185,6 @@ void PdmDocument::writeFile(QIODevice* xmlFile)
|
|||||||
xmlStream.writeEndDocument();
|
xmlStream.writeEndDocument();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PdmDocument::initAfterReadTraversal(PdmObject* object)
|
|
||||||
{
|
|
||||||
if (object == NULL) return;
|
|
||||||
|
|
||||||
std::vector<PdmFieldHandle*> fields;
|
|
||||||
object->fields(fields);
|
|
||||||
|
|
||||||
std::vector<PdmObject*> children;
|
|
||||||
size_t fIdx;
|
|
||||||
for (fIdx = 0; fIdx < fields.size(); ++fIdx)
|
|
||||||
{
|
|
||||||
if (fields[fIdx]) fields[fIdx]->childObjects(&children);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t cIdx;
|
|
||||||
for (cIdx = 0; cIdx < children.size(); ++cIdx)
|
|
||||||
{
|
|
||||||
PdmDocument::initAfterReadTraversal(children[cIdx]);
|
|
||||||
if (children[cIdx]) children[cIdx]->initAfterRead();
|
|
||||||
}
|
|
||||||
|
|
||||||
object->initAfterRead();
|
|
||||||
}
|
|
||||||
|
|
||||||
void PdmDocument::setupBeforeSaveTraversal(PdmObject * object)
|
void PdmDocument::setupBeforeSaveTraversal(PdmObject * object)
|
||||||
{
|
{
|
||||||
|
@ -44,6 +44,8 @@ public:
|
|||||||
void removeNullPtrs();
|
void removeNullPtrs();
|
||||||
void addObject(PdmObject * obj);
|
void addObject(PdmObject * obj);
|
||||||
|
|
||||||
|
static void initAfterReadTraversal(PdmObject * root);
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void objectsByType(std::vector<PdmPointer<T> >* typedObjects ) const
|
void objectsByType(std::vector<PdmPointer<T> >* typedObjects ) const
|
||||||
{
|
{
|
||||||
@ -115,7 +117,6 @@ class PdmDocument: public PdmObjectGroup
|
|||||||
void writeFile(QIODevice* device);
|
void writeFile(QIODevice* device);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void initAfterReadTraversal(PdmObject * root);
|
|
||||||
static void setupBeforeSaveTraversal(PdmObject * root);
|
static void setupBeforeSaveTraversal(PdmObject * root);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user