Prototype of copy/paste of reservoir case

p4#: 20962
This commit is contained in:
Magne Sjaastad 2013-03-19 09:55:17 +01:00
parent 5860cb2e49
commit 051710b82f
6 changed files with 261 additions and 50 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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