Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions

mitk::Mesh Class Reference
[Data Classes]

DataStructure which stores a set of points (incl. pointdata) where each point can be associated to an element of a cell. More...

#include <mitkMesh.h>

Inheritance diagram for mitk::Mesh:
Inheritance graph
[legend]
Collaboration diagram for mitk::Mesh:
Collaboration graph
[legend]

List of all members.

Public Types

typedef Mesh Self
typedef PointSet Superclass
typedef itk::SmartPointer< SelfPointer
typedef itk::SmartPointer
< const Self
ConstPointer
typedef
Superclass::DataType::CellType 
CellType
typedef CellType::CellAutoPointer CellAutoPointer
typedef
Superclass::MeshTraits::CellTraits 
CellTraits
typedef
CellTraits::PointIdConstIterator 
PointIdConstIterator
typedef CellTraits::PointIdIterator PointIdIterator
typedef DataType::CellDataContainer CellDataContainer
typedef
DataType::CellDataContainerIterator 
CellDataIterator
typedef
Superclass::DataType::CellsContainer::Iterator 
CellIterator
typedef
Superclass::DataType::CellsContainer::ConstIterator 
ConstCellIterator
typedef itk::PolygonCell
< CellType
PolygonType
typedef
MeshType::CellType::MultiVisitor 
MeshMultiVisitor

Public Member Functions

virtual const char * GetClassName () const
virtual unsigned long GetNumberOfCells (int t=0)
 returns the current number of cells in the mesh
virtual const DataTypeGetMesh (int t=0) const
 returns the mesh
virtual DataTypeGetMesh (int t=0)
 returns the mesh
void SetMesh (DataType *mesh, int t=0)
virtual bool EvaluatePosition (Point3D point, unsigned long &cellId, float precision, int t=0)
 checks if the given point is in a cell and returns that cellId. Basicaly it searches lines and points that are hit.
unsigned long GetNewCellId (int t=0)
 searches for the next new cellId and returns that id
virtual int SearchFirstCell (unsigned long pointId, int t=0)
 returns the first cell that includes the given pointId
virtual bool SearchLine (Point3D point, float distance, unsigned long &lineId, unsigned long &cellId, int t=0)
 searches for a line, that is hit by the given point. Then returns the lineId and the cellId
virtual bool GetPointIds (unsigned long cellId, unsigned long lineId, int &idA, int &idB, int t=0)
 searches a line according to the cellId and lineId and returns the PointIds, that assign the line; if successful, then return param = true;
virtual int SearchSelectedCell (int t=0)
 searches a selected cell and returns the id of that cell. If no cell is found, then -1 is returned
virtual
DataType::BoundingBoxPointer 
GetBoundingBoxFromCell (unsigned long cellId, int t=0)
 creates a BoundingBox and computes it with the given points of the cell.
virtual void ExecuteOperation (Operation *operation)
 executes the given Operation

Static Public Member Functions

static Pointer New ()

Protected Member Functions

 Mesh ()
virtual ~Mesh ()

Detailed Description

DataStructure which stores a set of points (incl. pointdata) where each point can be associated to an element of a cell.

A mesh contains several cells that can be of different celltypes (Line, Triangle, Polygone...). A cell is always closed. If a linestrip is to be created, then declare several cells, each containing one line.

The operations take care of the coherence. If a line is added to an existing LineCell, then a TriangleCell is built with the old and the new parameter (and so on). Deletion is done the opposite way.

Example for inserting a line into a TriangleCell: existing PIds ind the cell: 1, 2, 4; inserting (2, 3) so that new PIds in Cell: 1, 2, 3, 4

The cell is now of type QuadrilateralCell

Definition at line 60 of file mitkMesh.h.


Member Typedef Documentation

typedef CellType::CellAutoPointer mitk::Mesh::CellAutoPointer

Definition at line 68 of file mitkMesh.h.

typedef DataType::CellDataContainer mitk::Mesh::CellDataContainer

Definition at line 72 of file mitkMesh.h.

typedef DataType::CellDataContainerIterator mitk::Mesh::CellDataIterator

Definition at line 73 of file mitkMesh.h.

typedef Superclass::DataType::CellsContainer::Iterator mitk::Mesh::CellIterator

Definition at line 74 of file mitkMesh.h.

typedef Superclass::MeshTraits::CellTraits mitk::Mesh::CellTraits

Definition at line 69 of file mitkMesh.h.

typedef Superclass::DataType::CellType mitk::Mesh::CellType

Definition at line 65 of file mitkMesh.h.

typedef Superclass::DataType::CellsContainer::ConstIterator mitk::Mesh::ConstCellIterator

Definition at line 75 of file mitkMesh.h.

typedef itk::SmartPointer<const Self> mitk::Mesh::ConstPointer

Reimplemented from mitk::PointSet.

Definition at line 63 of file mitkMesh.h.

typedef MeshType::CellType::MultiVisitor mitk::Mesh::MeshMultiVisitor

Definition at line 77 of file mitkMesh.h.

typedef itk::SmartPointer<Self> mitk::Mesh::Pointer

Reimplemented from mitk::PointSet.

Definition at line 63 of file mitkMesh.h.

typedef CellTraits::PointIdConstIterator mitk::Mesh::PointIdConstIterator

Definition at line 70 of file mitkMesh.h.

typedef CellTraits::PointIdIterator mitk::Mesh::PointIdIterator

Definition at line 71 of file mitkMesh.h.

typedef itk::PolygonCell< CellType > mitk::Mesh::PolygonType

Definition at line 76 of file mitkMesh.h.

Reimplemented from mitk::PointSet.

Definition at line 63 of file mitkMesh.h.

Reimplemented from mitk::PointSet.

Definition at line 63 of file mitkMesh.h.


Constructor & Destructor Documentation

mitk::Mesh::Mesh (  ) [protected]

Definition at line 32 of file mitkMesh.cpp.

{
}
mitk::Mesh::~Mesh (  ) [protected, virtual]

Definition at line 36 of file mitkMesh.cpp.

{
}

Member Function Documentation

virtual bool mitk::Mesh::EvaluatePosition ( Point3D  point,
unsigned long &  cellId,
float  precision,
int  t = 0 
) [virtual]

checks if the given point is in a cell and returns that cellId. Basicaly it searches lines and points that are hit.

void mitk::Mesh::ExecuteOperation ( Operation operation ) [virtual]

executes the given Operation

Reimplemented from mitk::PointSet.

Definition at line 274 of file mitkMesh.cpp.

References mitk::PointSet::CellDataType::closed, mitk::StatusBar::DisplayText(), mitk::CellOperation::GetCellId(), mitk::LineOperation::GetId(), mitk::StatusBar::GetInstance(), mitk::Operation::GetOperationType(), mitk::LineOperation::GetPIdA(), mitk::LineOperation::GetPIdB(), mitk::CellOperation::GetVector(), int(), mitk::OpADDLINE, mitk::OpCLOSECELL, mitk::OpDELETECELL, mitk::OpDELETELINE, mitk::OpDESELECTCELL, mitk::OpDESELECTLINE, mitk::OpINSERTLINE, mitk::OpMOVE, mitk::OpMOVECELL, mitk::OpMOVELINE, mitk::OpNEWCELL, mitk::OpNOTHING, mitk::OpOPENCELL, mitk::OpREMOVELINE, mitk::OpSELECTCELL, mitk::OpSELECTLINE, mitk::PointSet::CellDataType::selected, and mitk::PointSet::CellDataType::selectedLines.

Referenced by mitk::ConnectPointsInteractor::ExecuteAction().

{
  //adding only the operations, that aren't implemented by the pointset.
  switch (operation->GetOperationType())
  {
  case OpNOTHING:
    break;

  case OpNEWCELL:
    {
      mitk::LineOperation *lineOp = 
        dynamic_cast<mitk::LineOperation *>(operation);
      
      // if no lineoperation, then call superclass pointSet
      if (lineOp == NULL)
      {
        Superclass::ExecuteOperation(operation);
      }

      bool ok;
      int cellId = lineOp->GetCellId();
      CellAutoPointer cellAutoPointer;
      ok = m_PointSetSeries[0]->GetCell(cellId, cellAutoPointer);
      
      // if it doesn't already exist
      if (!ok) 
      {
        cellAutoPointer.TakeOwnership( new PolygonType );
        m_PointSetSeries[0]->SetCell(cellId, cellAutoPointer);
        CellDataType cellData;
        cellData.selected = true;
        cellData.selectedLines.clear();
        cellData.closed = false;
        m_PointSetSeries[0]->SetCellData(cellId, cellData);
      }
    }
    break;

  case OpDELETECELL:
    {
      mitk::LineOperation *lineOp = dynamic_cast<mitk::LineOperation *>(operation);
      if (lineOp == NULL)//if no lineoperation, then call superclass pointSet
      {
        Superclass::ExecuteOperation(operation);
      }
      m_PointSetSeries[0]->GetCells()->DeleteIndex((unsigned)lineOp->GetCellId());
      m_PointSetSeries[0]->GetCellData()->DeleteIndex((unsigned)lineOp->GetCellId());
    }
    break;

  case OpCLOSECELL:
    //sets the bolean flag closed from a specified cell to true.
    {
      mitk::LineOperation *lineOp = dynamic_cast<mitk::LineOperation *>(operation);
      if (lineOp == NULL)//if no lineoperation, then call superclass pointSet
      {
        //then search the selected cell!//TODO
        Superclass::ExecuteOperation(operation);
      }
      bool ok;
      int cellId = lineOp->GetCellId();
      if (cellId<0)//cellId isn't set
      {
        cellId = this->SearchSelectedCell( 0 );
        if (cellId < 0 )//still not found
          return;
      }
      CellAutoPointer cellAutoPointer;
      
      //get directly the celldata!TODO
      ok = m_PointSetSeries[0]->GetCell(cellId, cellAutoPointer);
      if (ok) 
      {
        CellDataType cellData;
        m_PointSetSeries[0]->GetCellData(cellId, &cellData);
        cellData.closed = true;
        m_PointSetSeries[0]->SetCellData(cellId, cellData);
      }
    }
    break;

  case OpOPENCELL:
    {
      mitk::LineOperation *lineOp = dynamic_cast<mitk::LineOperation *>(operation);
      if (lineOp == NULL)//if no lineoperation, then call superclass pointSet
      {
        Superclass::ExecuteOperation(operation);
      }
      bool ok;
      int cellId = lineOp->GetCellId();
      CellAutoPointer cellAutoPointer;
      ok = m_PointSetSeries[0]->GetCell(cellId, cellAutoPointer);
      if (ok) 
      {
        CellDataType cellData;
        m_PointSetSeries[0]->GetCellData(cellId, &cellData);
        cellData.closed = false;;
        m_PointSetSeries[0]->SetCellData(cellId, cellData);
      }
    }
    break;

  case OpADDLINE: 
    // inserts the ID of the selected point into the indexes of lines in the
    // selected cell afterwars the added line is selected
    {
      mitk::LineOperation *lineOp = 
        dynamic_cast<mitk::LineOperation *>(operation);

      int cellId = -1;
      int pId = -1;

      if (lineOp == NULL)
      {
        cellId = this->SearchSelectedCell( 0 );
        if (cellId == -1)
          return;

        pId = this->SearchSelectedPoint( 0 );
        if (pId == -1)
          return;
      }
      else
      {
        cellId = lineOp->GetCellId();
        if (cellId == -1)
          return;
        pId = lineOp->GetPIdA();
        if (pId == -1)
          return;
      }

      bool ok;
      CellAutoPointer cellAutoPointer;
      ok = m_PointSetSeries[0]->GetCell(cellId, cellAutoPointer);
      if (ok) 
      {
        CellType * cell = cellAutoPointer.GetPointer();
        if( cell->GetType() == CellType::POLYGON_CELL )
        {
          PolygonType * polygon = static_cast<PolygonType *>( cell );
          // add the pointId to the Cell. filling the empty cell with 
          // one id doesn't mean to add a line, it means, that the 
          // initilal PointId is set. The next addition of a pointId adds
          // a line
          polygon->AddPointId(pId);

          // select the line, if we really added a line, so now have more than
          // 1 pointID in the cell
          CellDataType cellData;
          ok = m_PointSetSeries[0]->GetCellData(cellId, &cellData);
          if (ok)
          {
            // A line between point 0 and 1 has the Id 0. A line between
            // 1 and 2 has a Id = 1. So we add getnumberofpoints-2.
            if (polygon->GetNumberOfPoints()>1)
              cellData.selectedLines.push_back(polygon->GetNumberOfPoints()-2);
          }
          m_PointSetSeries[0]->SetCellData(cellId, cellData);
          m_PointSetSeries[0]->SetCell(cellId, cellAutoPointer);
        }
      }
    }
    break;

  case OpDELETELINE:
    {
      // deleted the last line through removing the index PIdA
      // (if set to -1, use the last point) in the given cellId
      mitk::LineOperation *lineOp = dynamic_cast<mitk::LineOperation *>(operation);
      int cellId = -1;
      int pId = -1;

      if (lineOp == NULL)
      {
        cellId = this->SearchSelectedCell( 0 );
        if (cellId == -1)
          return;
        pId = this->SearchSelectedPoint( 0 );
      }
      else
      {
        cellId = lineOp->GetCellId();
        if (cellId == -1)
          return;
        pId = lineOp->GetPIdA();
      }

      bool ok;
      CellAutoPointer cellAutoPointer;
      ok = m_PointSetSeries[0]->GetCell(cellId, cellAutoPointer);
      if (ok) 
      {
        CellType * cell = cellAutoPointer.GetPointer();
        if( cell->GetType() == CellType::POLYGON_CELL )
        {
          PolygonType * oldPolygon = static_cast<PolygonType *>( cell );

          PolygonType * newPolygonCell = new PolygonType;
          CellAutoPointer newCell;
          newCell.TakeOwnership( newPolygonCell );

          PointIdConstIterator it, oldend;
          oldend = oldPolygon->PointIdsEnd();
          if(pId >= 0)
          {
            for(it = oldPolygon->PointIdsBegin(); it != oldend; ++it)
            {
              if((*it) != (MeshType::PointIdentifier)pId)
              {
                newPolygonCell->AddPointId(*it);
              }
            }
          }
          else
          {
            --oldend;
            for(it = oldPolygon->PointIdsBegin(); it != oldend; ++it)
              newPolygonCell->AddPointId(*it);
          }
          oldPolygon->SetPointIds(0, newPolygonCell->GetNumberOfPoints(), 
            newPolygonCell->PointIdsBegin());
        }
      }
    }
    break;

  case OpREMOVELINE:
    //Remove the given Index in the given cell through copying everything
    // into a new cell accept the one that has to be deleted.
    {
      mitk::LineOperation *lineOp = 
        dynamic_cast<mitk::LineOperation *>(operation);
      if (lineOp == NULL)//if no lineoperation, then call superclass pointSet
      {
        Superclass::ExecuteOperation(operation);
      }

      bool ok;
      CellAutoPointer cellAutoPointer;
      int cellId = lineOp->GetCellId();
      ok = m_PointSetSeries[0]->GetCell(cellId, cellAutoPointer);
      if (!ok) 
        return;

      CellType * cell = cellAutoPointer.GetPointer();
      CellAutoPointer newCellAutoPointer;
      newCellAutoPointer.TakeOwnership( new PolygonType );
      PolygonType * newPolygon = static_cast<PolygonType *>( cell );

      PointIdIterator it = cell->PointIdsBegin();
      PointIdIterator end = cell->PointIdsEnd();
      int pointId = lineOp->GetPIdA();
      if (pointId<0)//if not initialized!!
        return;

      while (it!=end)
      {
        if ((*it)==(unsigned int)pointId)
        {
          break;
        }
        else
        {
          newPolygon ->AddPointId(*it);
        }
        ++it;
      }
      while (it!=end)
      {
        newPolygon ->AddPointId(*it);
        it++;
      }
      m_PointSetSeries[0]->SetCell(cellId, newCellAutoPointer);
    }
    break;

  case OpINSERTLINE:
    //  //insert line between two other points.
    //  //the points A, B and C have to be in the pointset.
    //  //needed: CellId, Id of C , Id A and Id B
    //{
    //mitk::LineOperation *lineOp = dynamic_cast<mitk::LineOperation *>(operation);
    //  if (lineOp == NULL)//if no lineoperation, then call superclass pointSet
    // {
    //    Superclass::ExecuteOperation(operation);
    //  }
    //    int cellId = lineOp->GetCellId();
    //    int pIdC = lineOp->GetPIdC();
    //  int pIdA = lineOp->GetPIdA();
    //    int pIdB = lineOp->GetPIdB();

    //    //the points of the given PointIds have to exist in the PointSet
    //    bool ok;
    //    ok = m_PointSetSeries[0]->GetPoints()->IndexExists(pIdA);
    //    if (!ok) 
    //      return;
    //    ok = m_PointSetSeries[0]->GetPoints()->IndexExists(pIdB);
    //    if (!ok) 
    //      return;
    //  ok = m_PointSetSeries[0]->GetPoints()->IndexExists(pIdC);
    //    if (!ok) 
    //      return;

    //    // so the points do exist. So now check, if there is already a cell
    //    // with the given Id
    //    DataType::CellAutoPointer cell;
    //    ok = m_PointSetSeries[0]->GetCell(cellId, cell);
    //  if (!ok)
    //    return;

    //  //pIdA and pIdB should exist in the cell
    //    
    //  PointIdIterator pit = cell->PointIdsBegin();
    //    PointIdIterator end = cell->PointIdsEnd();
    //    
    //  //now arrange the new Ids in the cell like desired; pIdC between 
    //  // pIdA and pIdB
    //  unsigned int nuPoints = cell->GetNumberOfPoints();

    //  std::vector<unsigned int> newPoints;
    //  pit = cell->PointIdsBegin();
    //    end = cell->PointIdsEnd();
    //    int i = 0;
    //    while( pit != end )
    //    {
    //      if ((*pit) = pIdA)
    //      {
    //        //now we have found the place to add pIdC after
    //        newPoints[i] = (*pit);
    //        i++;
    //        newPoints[i] = pIdC;
    //      }
    //      else
    //        newPoints[i] = (*pit);
    //      pit++;
    //    }

    //  //now we have the Ids, that existed before combined with the new ones
    //  //so delete the old cell
    //  //doesn't seem to be necessary!
    //  //cell->ClearPoints();
    //  pit = cell->PointIdsBegin();
    //  cell->SetPointIds(pit);
    //}
    break;

  case OpMOVELINE://(moves two points)
    {
      mitk::LineOperation *lineOp = 
        dynamic_cast<mitk::LineOperation *>(operation);

      if (lineOp == NULL)
      {
        mitk::StatusBar::GetInstance()->DisplayText(
          "Message from mitkMesh: Recieved wrong type of operation! See mitkMeshInteractor.cpp", 10000);
        return;
      }

      //create two operations out of the one operation and call superclass
      //through the transmitted pointIds get the koordinates of the points.
      //then add the transmitted vestor to them
      //create two operations and send them to superclass
      Point3D pointA, pointB;
      pointA.Fill(0.0);
      pointB.Fill(0.0);
      m_PointSetSeries[0]->GetPoint(lineOp->GetPIdA(), &pointA);
      m_PointSetSeries[0]->GetPoint(lineOp->GetPIdB(), &pointB);

      pointA[0] += lineOp->GetVector()[0];
      pointA[1] += lineOp->GetVector()[1];
      pointA[2] += lineOp->GetVector()[2];
      pointB[0] += lineOp->GetVector()[0];
      pointB[1] += lineOp->GetVector()[1];
      pointB[2] += lineOp->GetVector()[2];

      mitk::PointOperation* operationA = 
        new mitk::PointOperation(OpMOVE, pointA, lineOp->GetPIdA());
      mitk::PointOperation* operationB = 
        new mitk::PointOperation(OpMOVE, pointB, lineOp->GetPIdB());

      Superclass::ExecuteOperation(operationA);
      Superclass::ExecuteOperation(operationB);
    }
    break;

  case OpSELECTLINE://(select the given line)
    {
      mitk::LineOperation *lineOp = 
        dynamic_cast<mitk::LineOperation *>(operation);
      if (lineOp == NULL)//if no lineoperation, then call superclass pointSet
      {
        Superclass::ExecuteOperation(operation);
      }
      int cellId = lineOp->GetCellId();
      CellAutoPointer cellAutoPointer;
      bool ok = m_PointSetSeries[0]->GetCell(cellId, cellAutoPointer);
      if (ok) 
      {
        CellDataType cellData;
        m_PointSetSeries[0]->GetCellData(cellId, &cellData);
        SelectedLinesType *selectedLines = &(cellData.selectedLines);
        SelectedLinesIter position = std::find(selectedLines->begin(), 
          selectedLines->end(), (unsigned int) lineOp->GetId());

        if (position == selectedLines->end())//if not alsready selected
        {
          cellData.selectedLines.push_back(lineOp->GetId());
        }
        m_PointSetSeries[0]->SetCellData(lineOp->GetCellId(), cellData);
      }
    }
    break;

  case OpDESELECTLINE://(deselect the given line)
    {
      mitk::LineOperation *lineOp = dynamic_cast<mitk::LineOperation *>(operation);
      if (lineOp == NULL) 
      {
        Superclass::ExecuteOperation(operation);
      }
      int cellId = lineOp->GetCellId();
      CellAutoPointer cellAutoPointer;
      bool ok = m_PointSetSeries[0]->GetCell(cellId, cellAutoPointer);
      if (ok) 
      {
        CellDataType cellData;
        m_PointSetSeries[0]->GetCellData(cellId, &cellData);
        SelectedLinesType *selectedLines = &(cellData.selectedLines);
        SelectedLinesIter position = std::find(selectedLines->begin(),
          selectedLines->end(), (unsigned int) lineOp->GetId());

        if (position != selectedLines->end())//if found
        {
          selectedLines->erase(position);
        }
        m_PointSetSeries[0]->SetCellData(cellId, cellData);
      }
    }
    break;

  case OpSELECTCELL://(select the given cell)
    {
      mitk::LineOperation *lineOp = 
        dynamic_cast<mitk::LineOperation *>(operation);
      if (lineOp == NULL)//if no lineoperation, then call superclass pointSet
      {
        Superclass::ExecuteOperation(operation);
      }

      int cellId = lineOp->GetCellId();
      CellAutoPointer cellAutoPointer;
      
      //directly get the data!//TODO
      bool ok = m_PointSetSeries[0]->GetCell(cellId, cellAutoPointer);
      if (ok) 
      {
        CellDataType cellData;
        m_PointSetSeries[0]->GetCellData(cellId, &cellData);
        cellData.selected = true;
        m_PointSetSeries[0]->SetCellData(cellId, cellData);
      }
    }
    break;

  case OpDESELECTCELL://(deselect the given cell)
    {
      mitk::LineOperation *lineOp = dynamic_cast<mitk::LineOperation *>(operation);
      if (lineOp == NULL)//if no lineoperation, then call superclass pointSet
      {
        Superclass::ExecuteOperation(operation);
      }
      int cellId = lineOp->GetCellId();
      CellAutoPointer cellAutoPointer;
      bool ok = m_PointSetSeries[0]->GetCell(cellId, cellAutoPointer);
      if (ok) 
      {
        CellDataType cellData;
        m_PointSetSeries[0]->GetCellData(cellId, &cellData);
        cellData.selected = false;
        m_PointSetSeries[0]->SetCellData(cellId, cellData);
      }
    }
    break;

  case OpMOVECELL:
    //moves all Points of one cell according to the given vector
    {
      mitk::CellOperation *lineOp = dynamic_cast<mitk::CellOperation *>(operation);
      if (lineOp == NULL)//if no celloperation, then call superclass pointSet
      {
        Superclass::ExecuteOperation(operation);
      }

      int cellId = lineOp->GetCellId();
      Vector3D vector = lineOp->GetVector();

      //get the cell
      CellAutoPointer cellAutoPointer;
      bool ok = m_PointSetSeries[0]->GetCell(cellId, cellAutoPointer);
      if (!ok)
        return;

      CellDataType cellData;
      m_PointSetSeries[0]->GetCellData(cellId, &cellData);
      // iterate through the pointIds of the CellData and move those points in 
      // the pointset
      PointIdIterator it = cellAutoPointer->PointIdsBegin();
      PointIdIterator end = cellAutoPointer->PointIdsEnd();
      while(it != end)
      {
        unsigned int position = (*it);
        PointType point;
        point.Fill(0);
        m_PointSetSeries[0]->GetPoint(position, &point);
        point = point + vector;
        m_PointSetSeries[0]->SetPoint(position, point);
        ++it;
      }

    }
    break;

  default:
    //if the operation couldn't be handled here, then send it to superclass
    Superclass::ExecuteOperation(operation);
    return;
  }
  //to tell the mappers, that the data is modifierd and has to be updated
  this->Modified();

  mitk::OperationEndEvent endevent(operation);
  ((const itk::Object*)this)->InvokeEvent(endevent);

  // As discussed lately, don't mess with rendering from inside data structures
  //*todo has to be done here, cause of update-pipeline not working yet
  //mitk::RenderingManager::GetInstance()->RequestUpdateAll();

}
mitk::Mesh::DataType::BoundingBoxPointer mitk::Mesh::GetBoundingBoxFromCell ( unsigned long  cellId,
int  t = 0 
) [virtual]

creates a BoundingBox and computes it with the given points of the cell.

Returns the BoundingBox != IsNull() if successful.

Definition at line 817 of file mitkMesh.cpp.

References QuadProgPP::t().

{
  // itk::CellInterface has also a GetBoundingBox, but it
  // returns CoordRepType [PointDimension *2]
  DataType::BoundingBoxPointer bBoxPointer = NULL;
  CellAutoPointer cellAutoPointer;
  if ( m_PointSetSeries[t]->GetCell(cellId, cellAutoPointer))
  {
    DataType::PointsContainerPointer pointsContainer = DataType::PointsContainer::New();
    PointIdIterator bbIt = cellAutoPointer.GetPointer()->PointIdsBegin();
    PointIdIterator bbEnd = cellAutoPointer.GetPointer()->PointIdsEnd();
    while(bbIt != bbEnd)
    {
      mitk::PointSet::PointType point;
      bool pointOk = m_PointSetSeries[t]->GetPoint((*bbIt), &point);
      if (pointOk)
        pointsContainer->SetElement((*bbIt), point);
      ++bbIt;
    }
    bBoxPointer = DataType::BoundingBoxType::New();
    bBoxPointer->SetPoints(pointsContainer);
    bBoxPointer->ComputeBoundingBox();
  }
  return bBoxPointer;
}
virtual const char* mitk::Mesh::GetClassName (  ) const [virtual]

Reimplemented from mitk::PointSet.

const mitk::Mesh::DataType * mitk::Mesh::GetMesh ( int  t = 0 ) const [virtual]

returns the mesh

Definition at line 41 of file mitkMesh.cpp.

References QuadProgPP::t().

Referenced by mitk::ConnectPointsInteractor::ExecuteAction(), and mitk::MeshVtkMapper3D::GenerateData().

{
  return m_PointSetSeries[t];
}
mitk::Mesh::DataType * mitk::Mesh::GetMesh ( int  t = 0 ) [virtual]

returns the mesh

Definition at line 47 of file mitkMesh.cpp.

References QuadProgPP::t().

{
  return m_PointSetSeries[t];
}
unsigned long mitk::Mesh::GetNewCellId ( int  t = 0 )

searches for the next new cellId and returns that id

Definition at line 185 of file mitkMesh.cpp.

References QuadProgPP::t().

Referenced by mitk::ConnectPointsInteractor::ExecuteAction().

{
  long nextCellId = -1;
  ConstCellIterator it = m_PointSetSeries[t]->GetCells()->Begin();
  ConstCellIterator end = m_PointSetSeries[t]->GetCells()->End();
  
  while (it!=end)
  {
    nextCellId = it.Index();
    ++it;
  }
  ++nextCellId;
  return nextCellId;
}
unsigned long mitk::Mesh::GetNumberOfCells ( int  t = 0 ) [virtual]

returns the current number of cells in the mesh

Definition at line 60 of file mitkMesh.cpp.

References QuadProgPP::t().

{
  return m_PointSetSeries[t]->GetNumberOfCells();
}
bool mitk::Mesh::GetPointIds ( unsigned long  cellId,
unsigned long  lineId,
int &  idA,
int &  idB,
int  t = 0 
) [virtual]

searches a line according to the cellId and lineId and returns the PointIds, that assign the line; if successful, then return param = true;

Definition at line 220 of file mitkMesh.cpp.

References mitk::PointSet::CellDataType::closed, and QuadProgPP::t().

{
  bool ok = false;
  bool found = false;
  CellAutoPointer cellAutoPointer;
  ok = m_PointSetSeries[t]->GetCell(cellId, cellAutoPointer);
  if (ok) 
  {

    CellType * cell = cellAutoPointer.GetPointer();

    //Get the cellData to also check the closing line 
    CellDataType cellData;
    m_PointSetSeries[t]->GetCellData(cellId, &cellData);
    bool closed = cellData.closed;

    PointIdIterator pointIdIt = cell->PointIdsBegin();
    PointIdIterator pointIdEnd = cell->PointIdsEnd();
    unsigned int counter = 0;
    while (pointIdIt != pointIdEnd)
    {
      if(counter == lineId)
      {
        idA = (*pointIdIt);
        ++pointIdIt;
        found = true;
        break;
      }
      ++counter;
      ++pointIdIt;
    }
    if(found)
    {
      //if in the middle
      if (pointIdIt != pointIdEnd)
      {
        idB = (*pointIdIt);
      }
      // if found but on the end, then it is the closing connection, so the
      // last and the first point
      else if (closed)
      {
        pointIdIt = cell->PointIdsBegin();
        idB = (*pointIdIt);
      }
    }
    else
      ok = false;
  }
  return ok;
}
static Pointer mitk::Mesh::New (  ) [static]
int mitk::Mesh::SearchFirstCell ( unsigned long  pointId,
int  t = 0 
) [virtual]

returns the first cell that includes the given pointId

Definition at line 143 of file mitkMesh.cpp.

References QuadProgPP::t().

Referenced by mitk::ConnectPointsInteractor::ExecuteAction().

{
  //iterate through all cells and find the cell the given pointId is inside
  ConstCellIterator it = m_PointSetSeries[t]->GetCells()->Begin();
  ConstCellIterator end = m_PointSetSeries[t]->GetCells()->End();
  while( it != end)
  {
    PointIdIterator position = std::find(it->Value()->PointIdsBegin(), 
      it->Value()->PointIdsEnd(), pointId);

    if ( position != it->Value()->PointIdsEnd())
    {
      return it->Index();
    }
    ++it;
  }
  return -1;
}
bool mitk::Mesh::SearchLine ( Point3D  point,
float  distance,
unsigned long &  lineId,
unsigned long &  cellId,
int  t = 0 
) [virtual]

searches for a line, that is hit by the given point. Then returns the lineId and the cellId

Definition at line 67 of file mitkMesh.cpp.

References mitk::PointSet::CellDataType::closed, mitk::Line< TCoordRep, NPointDimension >::Distance(), QuadProgPP::distance(), mitk::Line< TCoordRep, NPointDimension >::SetPoints(), and QuadProgPP::t().

{
  //returns true if a line is found
  ScalarType bestDist = distance;

  //iterate through all cells.
  ConstCellIterator cellIt = m_PointSetSeries[t]->GetCells()->Begin();
  ConstCellIterator cellEnd = m_PointSetSeries[t]->GetCells()->End();
  while( cellIt != cellEnd)
  {
    if (cellIt.Value()->GetNumberOfPoints() >1)
    {
      //then iterate through all indexes of points in it->Value()
      PointIdIterator inAIt = cellIt.Value()->PointIdsBegin(); // first point
      PointIdIterator inBIt = cellIt.Value()->PointIdsBegin(); // second point
      PointIdIterator inEnd = cellIt.Value()->PointIdsEnd();
      
      ++inAIt; //so it points to the point before inBIt

      int currentLineId = 0;
      while(inAIt != inEnd)
      {
        mitk::PointSet::PointType pointA, pointB;
        if ( m_PointSetSeries[t]->GetPoint((*inAIt), &pointA) &&
          m_PointSetSeries[t]->GetPoint((*inBIt), &pointB))
        {
          Line<CoordinateType> *line = new Line<CoordinateType>();
          line->SetPoints(pointA, pointB);
          double thisDistance = line->Distance(point);
          if (thisDistance < bestDist)
          {
            cellId = cellIt->Index();
            lineId = currentLineId;
            bestDist = thisDistance;
          }
        }
        ++inAIt;
        ++inBIt;
        ++currentLineId;
      }

      // If the cell is closed, then check the line from the last index to
      // the first index if inAIt points to inEnd, then inBIt points to the
      // last index.
      CellDataType cellData;
      bool dataOk = m_PointSetSeries[t]->GetCellData(cellIt->Index(), &cellData);
      if (dataOk)
      {
        if (cellData.closed)
        {
          // get the points
          PointIdIterator inAIt = cellIt.Value()->PointIdsBegin();//first point
          // inBIt points to last.
          mitk::PointSet::PointType pointA, pointB;
          if ( m_PointSetSeries[t]->GetPoint((*inAIt), &pointA) &&
            m_PointSetSeries[t]->GetPoint((*inBIt), &pointB))
          {
            Line<CoordinateType> *line = new Line<CoordinateType>();
            line->SetPoints(pointA, pointB);
            double thisDistance = line->Distance(point);
            if (thisDistance < bestDist)
            {
              cellId = cellIt->Index();
              lineId = currentLineId;
              bestDist = thisDistance;
            }
          }
        }
      }
    }
    ++cellIt;
  }
  return (bestDist < distance);
}
int mitk::Mesh::SearchSelectedCell ( int  t = 0 ) [virtual]

searches a selected cell and returns the id of that cell. If no cell is found, then -1 is returned

Definition at line 200 of file mitkMesh.cpp.

References QuadProgPP::t().

{
  CellDataIterator cellDataIt, cellDataEnd;
  cellDataEnd = m_PointSetSeries[t]->GetCellData()->End();
  for ( cellDataIt = m_PointSetSeries[t]->GetCellData()->Begin(); 
        cellDataIt != cellDataEnd;
        cellDataIt++ )
  {
    //then declare an operation which unselects this line; UndoOperation as well!
    if ( cellDataIt->Value().selected )
    {
      return cellDataIt->Index();
    }
  }
  return -1;
}
void mitk::Mesh::SetMesh ( DataType mesh,
int  t = 0 
)

Definition at line 53 of file mitkMesh.cpp.

References QuadProgPP::t().

{
  this->Expand( t+1 );
  m_PointSetSeries[t] = mesh;
}

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines