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

View File

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

View File

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

View File

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

View File

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

View File

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