123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345 |
- /*=========================================================================
- Library: CTK
- Copyright (c) Kitware Inc.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.commontk.org/LICENSE
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- =========================================================================*/
- // Qt includes
- #include <QDebug>
- // CTK includes
- #include "ctkVTKDataSetModel.h"
- // VTK includes
- #include <vtkCellData.h>
- #include <vtkSmartPointer.h>
- #include <vtkDataArray.h>
- #include <vtkDataSet.h>
- #include <vtkPointData.h>
- class ctkVTKDataSetModelPrivate
- {
- Q_DECLARE_PUBLIC(ctkVTKDataSetModel);
- protected:
- ctkVTKDataSetModel* const q_ptr;
- public:
- ctkVTKDataSetModelPrivate(ctkVTKDataSetModel& object);
- virtual ~ctkVTKDataSetModelPrivate();
- void init();
- //void listenDataArrayModifiedEvent();
- vtkSmartPointer<vtkDataSet> DataSet;
- bool ListenDataArrayModifiedEvent;
- };
- //------------------------------------------------------------------------------
- ctkVTKDataSetModelPrivate::ctkVTKDataSetModelPrivate(ctkVTKDataSetModel& object)
- : q_ptr(&object)
- {
- this->ListenDataArrayModifiedEvent = false;
- }
- //------------------------------------------------------------------------------
- ctkVTKDataSetModelPrivate::~ctkVTKDataSetModelPrivate()
- {
- }
- //------------------------------------------------------------------------------
- void ctkVTKDataSetModelPrivate::init()
- {
- Q_Q(ctkVTKDataSetModel);
- q->setColumnCount(1);
-
- QObject::connect(q, SIGNAL(itemChanged(QStandardItem*)),
- q, SLOT(onItemChanged(QStandardItem*)));
- }
- /*
- //------------------------------------------------------------------------------
- void ctkVTKDataSetModelPrivate::listenDataArrayModifiedEvent()
- {
- Q_Q(ctkVTKDataSetModel);
- q->qvtkDisconnect(0, vtkCommand::ModifiedEvent, q, SLOT(onArrayModified(vtkObject*)));
- if (!this->ListenDataArrayModifiedEvent)
- {
- return;
- }
- const int count = q->rowCount();
- for (int i = 0; i < count; ++i)
- {
- q->qvtkConnect(q->arrayFromIndex(q->index(i,0)),vtkCommand::ModifiedEvent,
- q, SLOT(onMRMLNodeModified(vtkObject*)));
- }
- }
- */
- //------------------------------------------------------------------------------
- // ctkVTKDataSetModel
- //------------------------------------------------------------------------------
- ctkVTKDataSetModel::ctkVTKDataSetModel(QObject *_parent)
- : QStandardItemModel(_parent)
- , d_ptr(new ctkVTKDataSetModelPrivate(*this))
- {
- Q_D(ctkVTKDataSetModel);
- d->init();
- }
- //------------------------------------------------------------------------------
- ctkVTKDataSetModel::ctkVTKDataSetModel(ctkVTKDataSetModelPrivate* pimpl, QObject *parentObject)
- : QStandardItemModel(parentObject)
- , d_ptr(pimpl)
- {
- Q_D(ctkVTKDataSetModel);
- d->init();
- }
- //------------------------------------------------------------------------------
- ctkVTKDataSetModel::~ctkVTKDataSetModel()
- {
- }
- //------------------------------------------------------------------------------
- void ctkVTKDataSetModel::setDataSet(vtkDataSet* dataSet)
- {
- Q_D(ctkVTKDataSetModel);
- this->qvtkReconnect(d->DataSet, dataSet, vtkCommand::ModifiedEvent,
- this, SLOT(onDataSetModified(vtkObject*)) );
- d->DataSet = dataSet;
- this->updateDataSet();
- }
- //------------------------------------------------------------------------------
- vtkDataSet* ctkVTKDataSetModel::dataSet()const
- {
- Q_D(const ctkVTKDataSetModel);
- return d->DataSet;
- }
- //------------------------------------------------------------------------------
- vtkDataArray* ctkVTKDataSetModel::arrayFromItem(QStandardItem* dataArrayItem)const
- {
- Q_D(const ctkVTKDataSetModel);
- if (dataArrayItem == 0 || dataArrayItem == this->invisibleRootItem())
- {
- return 0;
- }
- QVariant dataArrayPointer = dataArrayItem->data(ctkVTK::PointerRole);
- Q_ASSERT(dataArrayPointer.isValid());
- vtkDataArray* dataArray = static_cast<vtkDataArray*>(
- reinterpret_cast<void *>(dataArrayPointer.toLongLong()));
- Q_ASSERT(dataArray);
- return dataArray;
- }
- //------------------------------------------------------------------------------
- QStandardItem* ctkVTKDataSetModel::itemFromArray(vtkDataArray* dataArray, int column)const
- {
- if (dataArray == 0)
- {
- return 0;
- }
- QModelIndexList indexes = this->match(this->index(-1,-1), ctkVTK::PointerRole,
- reinterpret_cast<long long>(dataArray), 1,
- Qt::MatchExactly | Qt::MatchRecursive);
- while (indexes.size())
- {
- if (indexes[0].column() == column)
- {
- return this->itemFromIndex(indexes[0]);
- }
- indexes = this->match(indexes[0], ctkVTK::PointerRole,
- reinterpret_cast<long long>(dataArray), 1,
- Qt::MatchExactly | Qt::MatchRecursive);
- }
- return 0;
- }
- //------------------------------------------------------------------------------
- QModelIndexList ctkVTKDataSetModel::indexes(vtkDataArray* dataArray)const
- {
- return this->match(this->index(-1,-1), ctkVTK::PointerRole,
- QVariant::fromValue(reinterpret_cast<long long>(dataArray)),
- -1, Qt::MatchExactly | Qt::MatchRecursive);
- }
- /*
- //------------------------------------------------------------------------------
- void ctkVTKDataSetModel::setListenArrayModifiedEvent(bool listen)
- {
- Q_D(ctkVTKDataSetModel);
- if (d->ListenArrayModifiedEvent == listen)
- {
- return;
- }
- d->ListenArrayModifiedEvent = listen;
- d->listenArrayModifiedEvent();
- }
- //------------------------------------------------------------------------------
- bool ctkVTKDataSetModel::listenNodeModifiedEvent()const
- {
- Q_D(const ctkVTKDataSetModel);
- return d->ListenNodeModifiedEvent;
- }
- */
- //------------------------------------------------------------------------------
- void ctkVTKDataSetModel::updateDataSet()
- {
- Q_D(ctkVTKDataSetModel);
- this->setRowCount(0);
- if (d->DataSet.GetPointer() == 0)
- {
- return;
- }
- // Populate scene with nodes
- this->populateDataSet();
- }
- //------------------------------------------------------------------------------
- void ctkVTKDataSetModel::populateDataSet()
- {
- Q_D(ctkVTKDataSetModel);
- Q_ASSERT(d->DataSet);
- for (int p = 0; p < d->DataSet->GetPointData()->GetNumberOfArrays(); ++p)
- {
- this->insertArray(d->DataSet->GetPointData()->GetArray(p));
- }
- for (int p = 0; p < d->DataSet->GetCellData()->GetNumberOfArrays(); ++p)
- {
- this->insertArray(d->DataSet->GetCellData()->GetArray(p));
- }
- }
- //------------------------------------------------------------------------------
- void ctkVTKDataSetModel::insertArray(vtkDataArray* dataArray)
- {
- this->insertArray(dataArray, this->rowCount());
- }
- //------------------------------------------------------------------------------
- void ctkVTKDataSetModel::insertArray(vtkDataArray* dataArray, int row)
- {
- Q_D(ctkVTKDataSetModel);
- Q_ASSERT(vtkDataArray::SafeDownCast(dataArray));
- QList<QStandardItem*> items;
- for (int i= 0; i < this->columnCount(); ++i)
- {
- QStandardItem* newArrayItem = new QStandardItem();
- this->updateItemFromArray(newArrayItem, dataArray, i);
- items.append(newArrayItem);
- }
- this->insertRow(row,items);
- // TODO: don't listen to nodes that are hidden from editors ?
- if (d->ListenDataArrayModifiedEvent)
- {
- qvtkConnect(dataArray, vtkCommand::ModifiedEvent,
- this, SLOT(onArrayModified(vtkObject*)));
- }
- }
- //------------------------------------------------------------------------------
- void ctkVTKDataSetModel::updateItemFromArray(QStandardItem* item, vtkDataArray* dataArray, int column)
- {
- item->setData(QVariant::fromValue(reinterpret_cast<long long>(dataArray)), ctkVTK::PointerRole);
- switch (column)
- {
- case 0:
- item->setText(QString(dataArray->GetName()));
- break;
- default:
- Q_ASSERT(column == 0);
- break;
- }
- }
- //------------------------------------------------------------------------------
- /*
- void ctkVTKDataSetModel::updateItemFromPointsArray(QStandardItem* item, vtkDataArray* dataArray, int column)
- {
- this->updateItemFromArray(item, dataArray, column);
- switch (column)
- {
- case 0:
- item->setIcon();
- break;
- default:
- Q_ASSERT(column == 0)
- break;
- }
- }
- //------------------------------------------------------------------------------
- /*
- void ctkVTKDataSetModel::updateItemFromCellsArray(QStandardItem* item, vtkDataArray* dataArray, int column)
- {
- this->updateItemFromArray(item, dataArray, column);
- switch (column)
- {
- case 0:
- item->setIcon();
- break;
- default:
- Q_ASSERT(column == 0)
- break;
- }
- }
- */
- //------------------------------------------------------------------------------
- void ctkVTKDataSetModel::updateArrayFromItem(vtkDataArray* dataArray, QStandardItem* item)
- {
- if (item->column() == 0)
- {
- dataArray->SetName(item->text().toLatin1());
- }
- }
- //------------------------------------------------------------------------------
- void ctkVTKDataSetModel::onDataSetModified(vtkObject* dataSet)
- {
- this->updateDataSet();
- }
- //------------------------------------------------------------------------------
- void ctkVTKDataSetModel::onArrayModified(vtkObject* array)
- {
- Q_D(ctkVTKDataSetModel);
- vtkDataArray* dataArray = vtkDataArray::SafeDownCast(array);
- Q_ASSERT(dataArray);
- QModelIndexList arrayIndexes = this->indexes(dataArray);
- foreach (QModelIndex index, arrayIndexes)
- {
- QStandardItem* item = this->itemFromIndex(index);
- this->updateItemFromArray(item, dataArray, item->column());
- }
- }
- //------------------------------------------------------------------------------
- void ctkVTKDataSetModel::onItemChanged(QStandardItem * item)
- {
- vtkDataArray* dataArray = this->arrayFromItem(item);
- Q_ASSERT(dataArray);
- this->updateArrayFromItem(dataArray, item);
- }
|