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

mitk::MeshMapper2D Class Reference
[Mapper Classes]

OpenGL-based mapper to display a mesh in a 2D window. More...

#include <mitkMeshMapper2D.h>

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

List of all members.

Public Types

typedef MeshMapper2D Self
typedef Mapper2D Superclass
typedef itk::SmartPointer< SelfPointer
typedef itk::SmartPointer
< const Self
ConstPointer

Public Member Functions

virtual const char * GetClassName () const
const mitk::MeshGetInput (void)
 Get the Mesh to map.
virtual void Paint (mitk::BaseRenderer *renderer)
 Do the painting into the renderer.

Static Public Member Functions

static Pointer New ()

Protected Member Functions

 MeshMapper2D ()
virtual ~MeshMapper2D ()

Detailed Description

OpenGL-based mapper to display a mesh in a 2D window.

Definition at line 37 of file mitkMeshMapper2D.h.


Member Typedef Documentation

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

Reimplemented from mitk::Mapper2D.

Definition at line 40 of file mitkMeshMapper2D.h.

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

Reimplemented from mitk::Mapper2D.

Definition at line 40 of file mitkMeshMapper2D.h.

Reimplemented from mitk::Mapper2D.

Definition at line 40 of file mitkMeshMapper2D.h.

Reimplemented from mitk::Mapper2D.

Definition at line 40 of file mitkMeshMapper2D.h.


Constructor & Destructor Documentation

mitk::MeshMapper2D::MeshMapper2D (  ) [protected]

Definition at line 34 of file mitkMeshMapper2D.cpp.

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

Definition at line 39 of file mitkMeshMapper2D.cpp.

{
}

Member Function Documentation

virtual const char* mitk::MeshMapper2D::GetClassName (  ) const [virtual]

Reimplemented from mitk::Mapper2D.

const mitk::Mesh * mitk::MeshMapper2D::GetInput ( void   )

Get the Mesh to map.

Definition at line 43 of file mitkMeshMapper2D.cpp.

{
    return static_cast<const mitk::Mesh * > ( GetData() );
}
static Pointer mitk::MeshMapper2D::New (  ) [static]
void mitk::MeshMapper2D::Paint ( mitk::BaseRenderer renderer ) [virtual]

Do the painting into the renderer.

Implements mitk::GLMapper2D.

Definition at line 58 of file mitkMeshMapper2D.cpp.

References mitk::BaseRenderer::GetCurrentWorldGeometry2D(), mitk::BaseRenderer::GetDisplayGeometry(), mitk::Line< TCoordRep, NPointDimension >::GetPoint(), mitk::Geometry3D::GetTimeBounds(), mitk::TimeSlicedGeometry::GetTimeSteps(), GL_CURRENT_COLOR, GL_LINE_LOOP, GL_LINES, GL_POINTS, glBegin(), glColor3f(), glEnd(), glGetFloatv(), glVertex2f(), glVertex2fv(), mitk::TimeSlicedGeometry::IsValidTime(), QuadProgPP::max(), min, mitk::TimeSlicedGeometry::MSToTimeStep(), point3DSmaller(), selectedColor, mitk::Line< TCoordRep, NPointDimension >::SetPoints(), QuadProgPP::sort(), and QuadProgPP::t().

{
  if ( !this->IsVisible(renderer) ) return;

  //  @FIXME: Logik fuer update
  bool updateNeccesary = true;

  if (updateNeccesary) 
  {
  //aus GenerateData    
    mitk::Mesh::Pointer input = const_cast<mitk::Mesh*>(this->GetInput());

    // Get the TimeSlicedGeometry of the input object
    const TimeSlicedGeometry* inputTimeGeometry = input->GetTimeSlicedGeometry();
    if (( inputTimeGeometry == NULL ) || ( inputTimeGeometry->GetTimeSteps() == 0 ) )
    {
      return;
    }

    //
    // get the world time
    //
    const Geometry2D* worldGeometry = renderer->GetCurrentWorldGeometry2D();
    assert( worldGeometry != NULL );
    ScalarType time = worldGeometry->GetTimeBounds()[ 0 ];

    //
    // convert the world time in time steps of the input object
    //
    int timeStep=0;
    if ( time > ScalarTypeNumericTraits::NonpositiveMin() )
      timeStep = inputTimeGeometry->MSToTimeStep( time );
    if ( inputTimeGeometry->IsValidTime( timeStep ) == false )
    {
      return;
    }


    mitk::Mesh::MeshType::Pointer itkMesh = input->GetMesh( timeStep );

    if ( itkMesh.GetPointer() == NULL) 
    {
      return;
    }


    mitk::DisplayGeometry::Pointer displayGeometry = renderer->GetDisplayGeometry();
    assert(displayGeometry.IsNotNull());

    const PlaneGeometry* worldplanegeometry = dynamic_cast<const PlaneGeometry*>(renderer->GetCurrentWorldGeometry2D());

    //apply color and opacity read from the PropertyList
    ApplyProperties(renderer);

    vtkLinearTransform* transform = GetDataNode()->GetVtkTransform();

    //List of the Points
    Mesh::DataType::PointsContainerConstIterator it, end;
    it=itkMesh->GetPoints()->Begin();
    end=itkMesh ->GetPoints()->End();

    //iterator on the additional data of each point
    Mesh::PointDataIterator dataIt;//, dataEnd;
    dataIt=itkMesh->GetPointData()->Begin();
      
    //for switching back to old color after using selected color
    float unselectedColor[4];
    glGetFloatv(GL_CURRENT_COLOR,unselectedColor);

    while(it!=end)
    {
      mitk::Point3D p, projected_p;
      float vtkp[3];

      itk2vtk(it->Value(), vtkp);
      transform->TransformPoint(vtkp, vtkp);
      vtk2itk(vtkp,p);

      displayGeometry->Project(p, projected_p);
      Vector3D diff=p-projected_p;
      if(diff.GetSquaredNorm()<4.0)
      {
        Point2D pt2d, tmp;
        displayGeometry->Map(projected_p, pt2d);
        displayGeometry->WorldToDisplay(pt2d, pt2d);

        Vector2D horz,vert;
        horz[0]=5; horz[1]=0;
        vert[0]=0; vert[1]=5;
                        
        //check if the point is to be marked as selected 
        if (dataIt->Value().selected)
        {
          horz[0]=8;
          vert[1]=8;
          glColor3f(selectedColor[0],selectedColor[1],selectedColor[2]);//red

          switch (dataIt->Value().pointSpec)
          {
          case PTSTART:
            {
              //a quad
              glBegin (GL_LINE_LOOP);
                tmp=pt2d-horz+vert;      glVertex2fv(&tmp[0]);
                tmp=pt2d+horz+vert;      glVertex2fv(&tmp[0]);
                tmp=pt2d+horz-vert;      glVertex2fv(&tmp[0]);
                tmp=pt2d-horz-vert;      glVertex2fv(&tmp[0]);
              glEnd ();
            }
            break;
          case PTUNDEFINED:
            {
              //a diamond around the point
              glBegin (GL_LINE_LOOP);
                tmp=pt2d-horz;      glVertex2fv(&tmp[0]);
                tmp=pt2d+vert;      glVertex2fv(&tmp[0]);
                tmp=pt2d+horz;      glVertex2fv(&tmp[0]);
                tmp=pt2d-vert;      glVertex2fv(&tmp[0]);
              glEnd ();
            }
            break;
          default:
            break;
          }//switch

          //the actual point
          glBegin (GL_POINTS);
            tmp=pt2d;             glVertex2fv(&tmp[0]);
          glEnd ();
        }
        else //if not selected
        {
          glColor3f(unselectedColor[0],unselectedColor[1],unselectedColor[2]);
          switch (dataIt->Value().pointSpec)
          {
          case PTSTART:
            {
              //a quad
              glBegin (GL_LINE_LOOP);
                tmp=pt2d-horz+vert;      glVertex2fv(&tmp[0]);
                tmp=pt2d+horz+vert;      glVertex2fv(&tmp[0]);
                tmp=pt2d+horz-vert;      glVertex2fv(&tmp[0]);
                tmp=pt2d-horz-vert;      glVertex2fv(&tmp[0]);
              glEnd ();
            }
          case PTUNDEFINED:
            {
              //drawing crosses
              glBegin (GL_LINES);
                  tmp=pt2d-horz;      glVertex2fv(&tmp[0]);
                  tmp=pt2d+horz;      glVertex2fv(&tmp[0]);
                  tmp=pt2d-vert;      glVertex2fv(&tmp[0]);
                  tmp=pt2d+vert;      glVertex2fv(&tmp[0]);
              glEnd ();
            }
    default:
            {
        break;
            }
          }//switch
        }//else
      }
      ++it;
      ++dataIt;
    }

    //now connect the lines inbetween
    mitk::Mesh::PointType thisPoint; thisPoint.Fill(0);
    Point2D *firstOfCell = NULL;
    Point2D *lastPoint = NULL;
    unsigned int lastPointId = 0;
    bool lineSelected = false;

    Point3D firstOfCell3D;
    Point3D lastPoint3D;
    bool first;
    mitk::Line<mitk::ScalarType> line;
    std::vector<mitk::Point3D> intersectionPoints;
    double t;

    //iterate through all cells and then iterate through all indexes of points in that cell
    Mesh::CellIterator cellIt, cellEnd;
    Mesh::CellDataIterator cellDataIt;//, cellDataEnd;
    Mesh::PointIdIterator cellIdIt, cellIdEnd;

    cellIt = itkMesh->GetCells()->Begin();
    cellEnd = itkMesh->GetCells()->End();
    cellDataIt = itkMesh->GetCellData()->Begin();

    while (cellIt != cellEnd)
    {
      unsigned int numOfPointsInCell = cellIt->Value()->GetNumberOfPoints();
      if (numOfPointsInCell>1)
      {
        //iterate through all id's in the cell
        cellIdIt = cellIt->Value()->PointIdsBegin();
        cellIdEnd = cellIt->Value()->PointIdsEnd();

        firstOfCell3D = input->GetPoint(*cellIdIt);

        intersectionPoints.clear();
        intersectionPoints.reserve(numOfPointsInCell);

        first = true;

        while(cellIdIt != cellIdEnd)
        {
          lastPoint3D = thisPoint;

          thisPoint = input->GetPoint(*cellIdIt);

          //search in data (vector<> selectedLines) if the index of the point is set. if so, then the line is selected.
          lineSelected = false;
          Mesh::SelectedLinesType selectedLines = cellDataIt->Value().selectedLines;
          
          //a line between 1(lastPoint) and 2(pt2d) has the Id 1, so look for the Id of lastPoint
          //since we only start, if we have more than one point in the cell, lastPointId is initiated with 0
          Mesh::SelectedLinesIter position = std::find(selectedLines.begin(), selectedLines.end(), lastPointId);
          if (position != selectedLines.end())
          {
            lineSelected = true;
          }

          mitk::Point3D p, projected_p;
          float vtkp[3];
          itk2vtk(thisPoint, vtkp);
          transform->TransformPoint(vtkp, vtkp);
          vtk2itk(vtkp,p);
          displayGeometry->Project(p, projected_p);
          Vector3D diff=p-projected_p;
          if(diff.GetSquaredNorm()<4.0)
          {
            Point2D pt2d, tmp;
            displayGeometry->Map(projected_p, pt2d);
            displayGeometry->WorldToDisplay(pt2d, pt2d);

            if (lastPoint == NULL)
            {
              //set the first point in the cell. This point in needed to close the polygon
              firstOfCell = new Point2D;
              *firstOfCell = pt2d;
              lastPoint = new Point2D;
              *lastPoint = pt2d;
              lastPointId = *cellIdIt;
            }
            else
            {
              if (lineSelected)
              {
                glColor3f(selectedColor[0],selectedColor[1],selectedColor[2]);//red
                //a line from lastPoint to thisPoint
                glBegin (GL_LINES);
                  glVertex2fv(&(*lastPoint)[0]);
                  glVertex2fv(&pt2d[0]);
                glEnd ();
              }
              else //if not selected
              {
                glColor3f(unselectedColor[0],unselectedColor[1],unselectedColor[2]);
                //drawing crosses
                glBegin (GL_LINES);
                  glVertex2fv(&(*lastPoint)[0]);
                  glVertex2fv(&pt2d[0]);
                glEnd ();
              }
              //to draw the line to the next in iteration step
              *lastPoint = pt2d;
              //and to search for the selection state of the line
              lastPointId = *cellIdIt;
            }//if..else
          }//if <4.0

          //fill off-plane polygon part 1
          if((!first) && (worldplanegeometry!=NULL))
          {
            line.SetPoints(lastPoint3D, thisPoint);
            if(worldplanegeometry->IntersectionPointParam(line, t) &&
              ((t>=0) && (t<=1))
              )
            {
              intersectionPoints.push_back(line.GetPoint(t));
            }
          }
          ++cellIdIt;
          first=false;
        }//while cellIdIter

        //closed polygon?
        if ( cellDataIt->Value().closed )
        {
          //close the polygon if needed
          if( firstOfCell != NULL )
          {
            lineSelected = false;
            Mesh::SelectedLinesType selectedLines = cellDataIt->Value().selectedLines;
            Mesh::SelectedLinesIter position = std::find(selectedLines.begin(), selectedLines.end(), lastPointId);
            if (position != selectedLines.end())//found the index
            {
              glColor3f(selectedColor[0],selectedColor[1],selectedColor[2]);//red
              //a line from lastPoint to firstPoint
              glBegin (GL_LINES);
                glVertex2fv(&(*lastPoint)[0]);
                glVertex2fv(&(*firstOfCell)[0]);
              glEnd ();
            }
            else 
            {
              glColor3f(unselectedColor[0],unselectedColor[1],unselectedColor[2]);
              glBegin (GL_LINES);
                glVertex2fv(&(*lastPoint)[0]);
                glVertex2fv(&(*firstOfCell)[0]);
              glEnd ();
            }
          }
        }//if closed

        //Axis-aligned bounding box(AABB) around the cell if selected and set in Property
        bool showBoundingBox;
        if (dynamic_cast<mitk::BoolProperty *>(this->GetDataNode()->GetProperty("showBoundingBox")) == NULL)
          showBoundingBox = false;
        else
          showBoundingBox = dynamic_cast<mitk::BoolProperty *>(this->GetDataNode()->GetProperty("showBoundingBox"))->GetValue();

        if(showBoundingBox) 
        {
          if (cellDataIt->Value().selected)
          {
            mitk::Mesh::DataType::BoundingBoxPointer aABB = input->GetBoundingBoxFromCell(cellIt->Index());
            if (aABB.IsNotNull())
            {
              mitk::Mesh::PointType min, max;
              min = aABB->GetMinimum();
              max = aABB->GetMaximum();

              //project to the displayed geometry
              Point2D min2D, max2D;
              Point3D p, projected_p;
              float vtkp[3];
              itk2vtk(min, vtkp);
              transform->TransformPoint(vtkp, vtkp);
              vtk2itk(vtkp,p);
              displayGeometry->Project(p, projected_p);
              displayGeometry->Map(projected_p, min2D);
              displayGeometry->WorldToDisplay(min2D, min2D);

              itk2vtk(max, vtkp);
              transform->TransformPoint(vtkp, vtkp);
              vtk2itk(vtkp,p);
              displayGeometry->Project(p, projected_p);
              Vector3D diff=p-projected_p;
              if(diff.GetSquaredNorm()<4.0)
              {
                displayGeometry->Map(projected_p, max2D);
                displayGeometry->WorldToDisplay(max2D, max2D);

                //draw the BoundingBox
                glColor3f(selectedColor[0],selectedColor[1],selectedColor[2]);//red
                //a line from lastPoint to firstPoint
                glBegin(GL_LINE_LOOP);
                  glVertex2f(min2D[0], min2D[1]);
                  glVertex2f(min2D[0], max2D[1]);
                  glVertex2f(max2D[0], max2D[1]);
                  glVertex2f(max2D[0], min2D[1]);
                glEnd();
              }//draw bounding-box
            }//bounding-box exists
          }//cell selected
        }//show bounding-box

        //fill off-plane polygon part 2
        if(worldplanegeometry!=NULL)
        {
          //consider line from last to first
          line.SetPoints(thisPoint, firstOfCell3D);
          if(worldplanegeometry->IntersectionPointParam(line, t) &&
            ((t>=0) && (t<=1))
            )
          {
            intersectionPoints.push_back(line.GetPoint(t));
          }
          std::sort(intersectionPoints.begin(), intersectionPoints.end(), point3DSmaller);
          std::vector<mitk::Point3D>::iterator it, end;
          end=intersectionPoints.end();
          if((intersectionPoints.size()%2)!=0)
          {
            --end; //ensure even number of intersection-points 
          }
          float p[2];
          Point3D pt3d;
          Point2D pt2d;
          for ( it = intersectionPoints.begin( ); it != end; ++it )
          {
            glBegin (GL_LINES);
              displayGeometry->Map(*it, pt2d); displayGeometry->WorldToDisplay(pt2d, pt2d); 
              p[0] = pt2d[0]; p[1] = pt2d[1]; glVertex2fv(p); 
              ++it;
              displayGeometry->Map(*it, pt2d); displayGeometry->WorldToDisplay(pt2d, pt2d);
              p[0] = pt2d[0]; p[1] = pt2d[1]; glVertex2fv(p); 
            glEnd ();
          }
          if(it!=intersectionPoints.end())
          {
            glBegin (GL_LINES);
              displayGeometry->Map(*it, pt2d); displayGeometry->WorldToDisplay(pt2d, pt2d); 
              p[0] = pt2d[0]; p[1] = pt2d[1]; glVertex2fv(p); 
              p[0] = pt2d[0]; p[1] = pt2d[1]; glVertex2fv(p); 
            glEnd ();
          }
        }//fill off-plane polygon part 2
      }//if numOfPointsInCell>1
      delete firstOfCell;
      delete lastPoint;
      lastPoint = NULL;
      firstOfCell = NULL;
      lastPointId = 0;
      ++cellIt;
      ++cellDataIt;
    }
  }
}

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