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 "RigEclipseCase.h"
|
||||
#include "RimResultReservoir.h"
|
||||
|
||||
|
||||
CAF_PDM_SOURCE_INIT(RimProject, "ResInsightProject");
|
||||
@ -134,31 +135,8 @@ void RimProject::moveEclipseCaseIntoCaseGroup(RimReservoir* rimReservoir)
|
||||
CVF_ASSERT(rimReservoir);
|
||||
|
||||
RigEclipseCase* rigEclipseCase = rimReservoir->reservoirData();
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
m_gridCollection->addCase(rigEclipseCase);
|
||||
|
||||
RigMainGrid* equalGrid = registerCaseInGridCollection(rigEclipseCase);
|
||||
CVF_ASSERT(equalGrid);
|
||||
|
||||
// Insert in identical grid group
|
||||
bool foundGroup = false;
|
||||
@ -214,3 +192,96 @@ void RimProject::removeEclipseCaseFromAllGroups(RimReservoir* 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,8 +48,14 @@ public:
|
||||
|
||||
void close();
|
||||
|
||||
void copyFromCaseList(RimIdenticalGridCaseGroup* caseGroup, const caf::PdmObjectGroup& caseList);
|
||||
void insertCaseInCaseGroup(RimReservoir* rimReservoir, RimIdenticalGridCaseGroup* caseGroup);
|
||||
|
||||
void moveEclipseCaseIntoCaseGroup(RimReservoir* rimReservoir);
|
||||
void removeEclipseCaseFromAllGroups(RimReservoir* rimReservoir);
|
||||
|
||||
private:
|
||||
RigMainGrid* registerCaseInGridCollection(RigEclipseCase* rigEclipseCase);
|
||||
|
||||
protected:
|
||||
// Overridden methods
|
||||
|
@ -40,6 +40,17 @@ RimUiTreeView::RimUiTreeView(QWidget *parent /*= 0*/)
|
||||
: QTreeView(parent)
|
||||
{
|
||||
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()))
|
||||
{
|
||||
QMenu menu;
|
||||
menu.addAction(QString("Copy"), this, SLOT(slotCopyPdmObjectToClipboard()));
|
||||
menu.addAction(QString("Close"), this, SLOT(slotCloseCase()));
|
||||
menu.addAction(QString("New View"), this, SLOT(slotAddView()));
|
||||
menu.exec(event->globalPos());
|
||||
@ -169,6 +181,7 @@ void RimUiTreeView::contextMenuEvent(QContextMenuEvent* event)
|
||||
{
|
||||
QMenu menu;
|
||||
menu.addAction(QString("New Case Group"), this, SLOT(slotAddCaseGroup()));
|
||||
menu.addAction(QString("Paste"), this, SLOT(slotPasteEclipseCases()));
|
||||
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>
|
||||
|
||||
class QItemSelection;
|
||||
class PdmObjectGroup;
|
||||
|
||||
//==================================================================================================
|
||||
///
|
||||
@ -34,6 +35,7 @@ class RimUiTreeView : public QTreeView
|
||||
|
||||
public:
|
||||
RimUiTreeView(QWidget *parent = 0);
|
||||
~RimUiTreeView();
|
||||
|
||||
virtual void setModel(QAbstractItemModel* model);
|
||||
|
||||
@ -73,11 +75,20 @@ private slots:
|
||||
void slotComputeStatisticalCases();
|
||||
void slotAddCaseGroup();
|
||||
|
||||
void slotCopyPdmObjectToClipboard();
|
||||
void slotPasteEclipseCases();
|
||||
|
||||
void slotSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected);
|
||||
|
||||
signals:
|
||||
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);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
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");
|
||||
|
||||
@ -157,29 +185,6 @@ void PdmDocument::writeFile(QIODevice* xmlFile)
|
||||
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)
|
||||
{
|
||||
|
@ -44,6 +44,8 @@ public:
|
||||
void removeNullPtrs();
|
||||
void addObject(PdmObject * obj);
|
||||
|
||||
static void initAfterReadTraversal(PdmObject * root);
|
||||
|
||||
template <typename T>
|
||||
void objectsByType(std::vector<PdmPointer<T> >* typedObjects ) const
|
||||
{
|
||||
@ -115,7 +117,6 @@ class PdmDocument: public PdmObjectGroup
|
||||
void writeFile(QIODevice* device);
|
||||
|
||||
private:
|
||||
static void initAfterReadTraversal(PdmObject * root);
|
||||
static void setupBeforeSaveTraversal(PdmObject * root);
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user