00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mitkMeshMapper2D.h"
00020 #include "mitkMesh.h"
00021 #include "mitkBaseRenderer.h"
00022 #include "mitkPlaneGeometry.h"
00023 #include "mitkColorProperty.h"
00024 #include "mitkProperties.h"
00025 #include "mitkLine.h"
00026 #include "mitkGL.h"
00027
00028 #include <vtkLinearTransform.h>
00029
00030 #include <algorithm>
00031
00032 const float selectedColor[]={1.0,0.0,0.6};
00033
00034 mitk::MeshMapper2D::MeshMapper2D()
00035 {
00036 }
00037
00038
00039 mitk::MeshMapper2D::~MeshMapper2D()
00040 {
00041 }
00042
00043 const mitk::Mesh *mitk::MeshMapper2D::GetInput(void)
00044 {
00045 return static_cast<const mitk::Mesh * > ( GetData() );
00046 }
00047
00048
00049 static bool point3DSmaller( const mitk::Point3D& elem1, const mitk::Point3D& elem2 )
00050 {
00051 if(elem1[0]!=elem2[0])
00052 return elem1[0] < elem2[0];
00053 if(elem1[1]!=elem2[1])
00054 return elem1[1] < elem2[1];
00055 return elem1[2] < elem2[2];
00056 }
00057
00058 void mitk::MeshMapper2D::Paint( mitk::BaseRenderer *renderer )
00059 {
00060 if ( !this->IsVisible(renderer) ) return;
00061
00062
00063 bool updateNeccesary = true;
00064
00065 if (updateNeccesary)
00066 {
00067
00068 mitk::Mesh::Pointer input = const_cast<mitk::Mesh*>(this->GetInput());
00069
00070
00071 const TimeSlicedGeometry* inputTimeGeometry = input->GetTimeSlicedGeometry();
00072 if (( inputTimeGeometry == NULL ) || ( inputTimeGeometry->GetTimeSteps() == 0 ) )
00073 {
00074 return;
00075 }
00076
00077
00078
00079
00080 const Geometry2D* worldGeometry = renderer->GetCurrentWorldGeometry2D();
00081 assert( worldGeometry != NULL );
00082 ScalarType time = worldGeometry->GetTimeBounds()[ 0 ];
00083
00084
00085
00086
00087 int timeStep=0;
00088 if ( time > ScalarTypeNumericTraits::NonpositiveMin() )
00089 timeStep = inputTimeGeometry->MSToTimeStep( time );
00090 if ( inputTimeGeometry->IsValidTime( timeStep ) == false )
00091 {
00092 return;
00093 }
00094
00095
00096 mitk::Mesh::MeshType::Pointer itkMesh = input->GetMesh( timeStep );
00097
00098 if ( itkMesh.GetPointer() == NULL)
00099 {
00100 return;
00101 }
00102
00103
00104 mitk::DisplayGeometry::Pointer displayGeometry = renderer->GetDisplayGeometry();
00105 assert(displayGeometry.IsNotNull());
00106
00107 const PlaneGeometry* worldplanegeometry = dynamic_cast<const PlaneGeometry*>(renderer->GetCurrentWorldGeometry2D());
00108
00109
00110 ApplyProperties(renderer);
00111
00112 vtkLinearTransform* transform = GetDataNode()->GetVtkTransform();
00113
00114
00115 Mesh::DataType::PointsContainerConstIterator it, end;
00116 it=itkMesh->GetPoints()->Begin();
00117 end=itkMesh ->GetPoints()->End();
00118
00119
00120 Mesh::PointDataIterator dataIt;
00121 dataIt=itkMesh->GetPointData()->Begin();
00122
00123
00124 float unselectedColor[4];
00125 glGetFloatv(GL_CURRENT_COLOR,unselectedColor);
00126
00127 while(it!=end)
00128 {
00129 mitk::Point3D p, projected_p;
00130 float vtkp[3];
00131
00132 itk2vtk(it->Value(), vtkp);
00133 transform->TransformPoint(vtkp, vtkp);
00134 vtk2itk(vtkp,p);
00135
00136 displayGeometry->Project(p, projected_p);
00137 Vector3D diff=p-projected_p;
00138 if(diff.GetSquaredNorm()<4.0)
00139 {
00140 Point2D pt2d, tmp;
00141 displayGeometry->Map(projected_p, pt2d);
00142 displayGeometry->WorldToDisplay(pt2d, pt2d);
00143
00144 Vector2D horz,vert;
00145 horz[0]=5; horz[1]=0;
00146 vert[0]=0; vert[1]=5;
00147
00148
00149 if (dataIt->Value().selected)
00150 {
00151 horz[0]=8;
00152 vert[1]=8;
00153 glColor3f(selectedColor[0],selectedColor[1],selectedColor[2]);
00154
00155 switch (dataIt->Value().pointSpec)
00156 {
00157 case PTSTART:
00158 {
00159
00160 glBegin (GL_LINE_LOOP);
00161 tmp=pt2d-horz+vert; glVertex2fv(&tmp[0]);
00162 tmp=pt2d+horz+vert; glVertex2fv(&tmp[0]);
00163 tmp=pt2d+horz-vert; glVertex2fv(&tmp[0]);
00164 tmp=pt2d-horz-vert; glVertex2fv(&tmp[0]);
00165 glEnd ();
00166 }
00167 break;
00168 case PTUNDEFINED:
00169 {
00170
00171 glBegin (GL_LINE_LOOP);
00172 tmp=pt2d-horz; glVertex2fv(&tmp[0]);
00173 tmp=pt2d+vert; glVertex2fv(&tmp[0]);
00174 tmp=pt2d+horz; glVertex2fv(&tmp[0]);
00175 tmp=pt2d-vert; glVertex2fv(&tmp[0]);
00176 glEnd ();
00177 }
00178 break;
00179 default:
00180 break;
00181 }
00182
00183
00184 glBegin (GL_POINTS);
00185 tmp=pt2d; glVertex2fv(&tmp[0]);
00186 glEnd ();
00187 }
00188 else
00189 {
00190 glColor3f(unselectedColor[0],unselectedColor[1],unselectedColor[2]);
00191 switch (dataIt->Value().pointSpec)
00192 {
00193 case PTSTART:
00194 {
00195
00196 glBegin (GL_LINE_LOOP);
00197 tmp=pt2d-horz+vert; glVertex2fv(&tmp[0]);
00198 tmp=pt2d+horz+vert; glVertex2fv(&tmp[0]);
00199 tmp=pt2d+horz-vert; glVertex2fv(&tmp[0]);
00200 tmp=pt2d-horz-vert; glVertex2fv(&tmp[0]);
00201 glEnd ();
00202 }
00203 case PTUNDEFINED:
00204 {
00205
00206 glBegin (GL_LINES);
00207 tmp=pt2d-horz; glVertex2fv(&tmp[0]);
00208 tmp=pt2d+horz; glVertex2fv(&tmp[0]);
00209 tmp=pt2d-vert; glVertex2fv(&tmp[0]);
00210 tmp=pt2d+vert; glVertex2fv(&tmp[0]);
00211 glEnd ();
00212 }
00213 default:
00214 {
00215 break;
00216 }
00217 }
00218 }
00219 }
00220 ++it;
00221 ++dataIt;
00222 }
00223
00224
00225 mitk::Mesh::PointType thisPoint; thisPoint.Fill(0);
00226 Point2D *firstOfCell = NULL;
00227 Point2D *lastPoint = NULL;
00228 unsigned int lastPointId = 0;
00229 bool lineSelected = false;
00230
00231 Point3D firstOfCell3D;
00232 Point3D lastPoint3D;
00233 bool first;
00234 mitk::Line<mitk::ScalarType> line;
00235 std::vector<mitk::Point3D> intersectionPoints;
00236 double t;
00237
00238
00239 Mesh::CellIterator cellIt, cellEnd;
00240 Mesh::CellDataIterator cellDataIt;
00241 Mesh::PointIdIterator cellIdIt, cellIdEnd;
00242
00243 cellIt = itkMesh->GetCells()->Begin();
00244 cellEnd = itkMesh->GetCells()->End();
00245 cellDataIt = itkMesh->GetCellData()->Begin();
00246
00247 while (cellIt != cellEnd)
00248 {
00249 unsigned int numOfPointsInCell = cellIt->Value()->GetNumberOfPoints();
00250 if (numOfPointsInCell>1)
00251 {
00252
00253 cellIdIt = cellIt->Value()->PointIdsBegin();
00254 cellIdEnd = cellIt->Value()->PointIdsEnd();
00255
00256 firstOfCell3D = input->GetPoint(*cellIdIt);
00257
00258 intersectionPoints.clear();
00259 intersectionPoints.reserve(numOfPointsInCell);
00260
00261 first = true;
00262
00263 while(cellIdIt != cellIdEnd)
00264 {
00265 lastPoint3D = thisPoint;
00266
00267 thisPoint = input->GetPoint(*cellIdIt);
00268
00269
00270 lineSelected = false;
00271 Mesh::SelectedLinesType selectedLines = cellDataIt->Value().selectedLines;
00272
00273
00274
00275 Mesh::SelectedLinesIter position = std::find(selectedLines.begin(), selectedLines.end(), lastPointId);
00276 if (position != selectedLines.end())
00277 {
00278 lineSelected = true;
00279 }
00280
00281 mitk::Point3D p, projected_p;
00282 float vtkp[3];
00283 itk2vtk(thisPoint, vtkp);
00284 transform->TransformPoint(vtkp, vtkp);
00285 vtk2itk(vtkp,p);
00286 displayGeometry->Project(p, projected_p);
00287 Vector3D diff=p-projected_p;
00288 if(diff.GetSquaredNorm()<4.0)
00289 {
00290 Point2D pt2d, tmp;
00291 displayGeometry->Map(projected_p, pt2d);
00292 displayGeometry->WorldToDisplay(pt2d, pt2d);
00293
00294 if (lastPoint == NULL)
00295 {
00296
00297 firstOfCell = new Point2D;
00298 *firstOfCell = pt2d;
00299 lastPoint = new Point2D;
00300 *lastPoint = pt2d;
00301 lastPointId = *cellIdIt;
00302 }
00303 else
00304 {
00305 if (lineSelected)
00306 {
00307 glColor3f(selectedColor[0],selectedColor[1],selectedColor[2]);
00308
00309 glBegin (GL_LINES);
00310 glVertex2fv(&(*lastPoint)[0]);
00311 glVertex2fv(&pt2d[0]);
00312 glEnd ();
00313 }
00314 else
00315 {
00316 glColor3f(unselectedColor[0],unselectedColor[1],unselectedColor[2]);
00317
00318 glBegin (GL_LINES);
00319 glVertex2fv(&(*lastPoint)[0]);
00320 glVertex2fv(&pt2d[0]);
00321 glEnd ();
00322 }
00323
00324 *lastPoint = pt2d;
00325
00326 lastPointId = *cellIdIt;
00327 }
00328 }
00329
00330
00331 if((!first) && (worldplanegeometry!=NULL))
00332 {
00333 line.SetPoints(lastPoint3D, thisPoint);
00334 if(worldplanegeometry->IntersectionPointParam(line, t) &&
00335 ((t>=0) && (t<=1))
00336 )
00337 {
00338 intersectionPoints.push_back(line.GetPoint(t));
00339 }
00340 }
00341 ++cellIdIt;
00342 first=false;
00343 }
00344
00345
00346 if ( cellDataIt->Value().closed )
00347 {
00348
00349 if( firstOfCell != NULL )
00350 {
00351 lineSelected = false;
00352 Mesh::SelectedLinesType selectedLines = cellDataIt->Value().selectedLines;
00353 Mesh::SelectedLinesIter position = std::find(selectedLines.begin(), selectedLines.end(), lastPointId);
00354 if (position != selectedLines.end())
00355 {
00356 glColor3f(selectedColor[0],selectedColor[1],selectedColor[2]);
00357
00358 glBegin (GL_LINES);
00359 glVertex2fv(&(*lastPoint)[0]);
00360 glVertex2fv(&(*firstOfCell)[0]);
00361 glEnd ();
00362 }
00363 else
00364 {
00365 glColor3f(unselectedColor[0],unselectedColor[1],unselectedColor[2]);
00366 glBegin (GL_LINES);
00367 glVertex2fv(&(*lastPoint)[0]);
00368 glVertex2fv(&(*firstOfCell)[0]);
00369 glEnd ();
00370 }
00371 }
00372 }
00373
00374
00375 bool showBoundingBox;
00376 if (dynamic_cast<mitk::BoolProperty *>(this->GetDataNode()->GetProperty("showBoundingBox")) == NULL)
00377 showBoundingBox = false;
00378 else
00379 showBoundingBox = dynamic_cast<mitk::BoolProperty *>(this->GetDataNode()->GetProperty("showBoundingBox"))->GetValue();
00380
00381 if(showBoundingBox)
00382 {
00383 if (cellDataIt->Value().selected)
00384 {
00385 mitk::Mesh::DataType::BoundingBoxPointer aABB = input->GetBoundingBoxFromCell(cellIt->Index());
00386 if (aABB.IsNotNull())
00387 {
00388 mitk::Mesh::PointType min, max;
00389 min = aABB->GetMinimum();
00390 max = aABB->GetMaximum();
00391
00392
00393 Point2D min2D, max2D;
00394 Point3D p, projected_p;
00395 float vtkp[3];
00396 itk2vtk(min, vtkp);
00397 transform->TransformPoint(vtkp, vtkp);
00398 vtk2itk(vtkp,p);
00399 displayGeometry->Project(p, projected_p);
00400 displayGeometry->Map(projected_p, min2D);
00401 displayGeometry->WorldToDisplay(min2D, min2D);
00402
00403 itk2vtk(max, vtkp);
00404 transform->TransformPoint(vtkp, vtkp);
00405 vtk2itk(vtkp,p);
00406 displayGeometry->Project(p, projected_p);
00407 Vector3D diff=p-projected_p;
00408 if(diff.GetSquaredNorm()<4.0)
00409 {
00410 displayGeometry->Map(projected_p, max2D);
00411 displayGeometry->WorldToDisplay(max2D, max2D);
00412
00413
00414 glColor3f(selectedColor[0],selectedColor[1],selectedColor[2]);
00415
00416 glBegin(GL_LINE_LOOP);
00417 glVertex2f(min2D[0], min2D[1]);
00418 glVertex2f(min2D[0], max2D[1]);
00419 glVertex2f(max2D[0], max2D[1]);
00420 glVertex2f(max2D[0], min2D[1]);
00421 glEnd();
00422 }
00423 }
00424 }
00425 }
00426
00427
00428 if(worldplanegeometry!=NULL)
00429 {
00430
00431 line.SetPoints(thisPoint, firstOfCell3D);
00432 if(worldplanegeometry->IntersectionPointParam(line, t) &&
00433 ((t>=0) && (t<=1))
00434 )
00435 {
00436 intersectionPoints.push_back(line.GetPoint(t));
00437 }
00438 std::sort(intersectionPoints.begin(), intersectionPoints.end(), point3DSmaller);
00439 std::vector<mitk::Point3D>::iterator it, end;
00440 end=intersectionPoints.end();
00441 if((intersectionPoints.size()%2)!=0)
00442 {
00443 --end;
00444 }
00445 float p[2];
00446 Point3D pt3d;
00447 Point2D pt2d;
00448 for ( it = intersectionPoints.begin( ); it != end; ++it )
00449 {
00450 glBegin (GL_LINES);
00451 displayGeometry->Map(*it, pt2d); displayGeometry->WorldToDisplay(pt2d, pt2d);
00452 p[0] = pt2d[0]; p[1] = pt2d[1]; glVertex2fv(p);
00453 ++it;
00454 displayGeometry->Map(*it, pt2d); displayGeometry->WorldToDisplay(pt2d, pt2d);
00455 p[0] = pt2d[0]; p[1] = pt2d[1]; glVertex2fv(p);
00456 glEnd ();
00457 }
00458 if(it!=intersectionPoints.end())
00459 {
00460 glBegin (GL_LINES);
00461 displayGeometry->Map(*it, pt2d); displayGeometry->WorldToDisplay(pt2d, pt2d);
00462 p[0] = pt2d[0]; p[1] = pt2d[1]; glVertex2fv(p);
00463 p[0] = pt2d[0]; p[1] = pt2d[1]; glVertex2fv(p);
00464 glEnd ();
00465 }
00466 }
00467 }
00468 delete firstOfCell;
00469 delete lastPoint;
00470 lastPoint = NULL;
00471 firstOfCell = NULL;
00472 lastPointId = 0;
00473 ++cellIt;
00474 ++cellDataIt;
00475 }
00476 }
00477 }