00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mitkPointSetGLMapper2D.h"
00020 #include "mitkPointSet.h"
00021 #include "mitkPlaneGeometry.h"
00022 #include "mitkColorProperty.h"
00023 #include "mitkProperties.h"
00024 #include "vtkLinearTransform.h"
00025 #include "mitkStringProperty.h"
00026 #include "mitkPointSet.h"
00027 #include "mitkVtkPropRenderer.h"
00028 #include "mitkGL.h"
00029
00030
00031
00032
00033 mitk::PointSetGLMapper2D::PointSetGLMapper2D()
00034 : m_Polygon(false),
00035 m_ShowPoints(true),
00036 m_ShowDistances(false),
00037 m_DistancesDecimalDigits(1),
00038 m_ShowAngles(false),
00039 m_ShowDistantLines(true),
00040 m_LineWidth(1)
00041 {
00042 }
00043
00044
00045 mitk::PointSetGLMapper2D::~PointSetGLMapper2D()
00046 {
00047 }
00048
00049
00050 const mitk::PointSet *mitk::PointSetGLMapper2D::GetInput(void)
00051 {
00052 return static_cast<const mitk::PointSet * > ( GetData() );
00053 }
00054
00055 void mitk::PointSetGLMapper2D::ApplyProperties(mitk::BaseRenderer* renderer)
00056 {
00057 GLMapper2D::ApplyProperties( renderer );
00058
00059 const mitk::DataNode* node=GetDataNode();
00060 if( node == NULL )
00061 return;
00062
00063 node->GetBoolProperty("show contour", m_Polygon);
00064 node->GetBoolProperty("show points", m_ShowPoints);
00065 node->GetBoolProperty("show distances", m_ShowDistances);
00066 node->GetIntProperty("distance decimal digits", m_DistancesDecimalDigits);
00067 node->GetBoolProperty("show angles", m_ShowAngles);
00068 node->GetBoolProperty("show distant lines", m_ShowDistantLines);
00069 node->GetIntProperty("line width", m_LineWidth);
00070 node->GetIntProperty("point line width", m_PointLineWidth);
00071 node->GetIntProperty("point 2D size", m_Point2DSize);
00072 }
00073
00074
00075
00076 static bool makePerpendicularVector2D(const mitk::Vector2D& in, mitk::Vector2D& out)
00077 {
00078 if((fabs(in[0])>0) && ( (fabs(in[0])>fabs(in[1])) || (in[1] == 0) ) )
00079 {
00080 out[0]=-in[1]/in[0];
00081 out[1]=1;
00082 out.Normalize();
00083 return true;
00084 }
00085 else
00086 if(fabs(in[1])>0)
00087 {
00088 out[0]=1;
00089 out[1]=-in[0]/in[1];
00090 out.Normalize();
00091 return true;
00092 }
00093 else
00094 return false;
00095 }
00096
00097
00098 void mitk::PointSetGLMapper2D::Paint( mitk::BaseRenderer *renderer )
00099 {
00100
00101 const mitk::DataNode* node=GetDataNode();
00102 if( node == NULL )
00103 return;
00104
00105 const int text2dDistance = 10;
00106
00107 if(IsVisible(renderer)==false) return;
00108
00109
00110 bool updateNeccesary=true;
00111
00112 if (updateNeccesary)
00113 {
00114
00115 mitk::PointSet::Pointer input = const_cast<mitk::PointSet*>(this->GetInput());
00116
00117
00118 const TimeSlicedGeometry* inputTimeGeometry = input->GetTimeSlicedGeometry();
00119 if (( inputTimeGeometry == NULL ) || ( inputTimeGeometry->GetTimeSteps() == 0 ) )
00120 {
00121 return;
00122 }
00123
00124
00125
00126
00127 const Geometry2D* worldGeometry = renderer->GetCurrentWorldGeometry2D();
00128 assert( worldGeometry != NULL );
00129 ScalarType time = worldGeometry->GetTimeBounds()[ 0 ];
00130
00131
00132
00133
00134 int timeStep=0;
00135 if ( time > ScalarTypeNumericTraits::NonpositiveMin() )
00136 timeStep = inputTimeGeometry->MSToTimeStep( time );
00137 if ( inputTimeGeometry->IsValidTime( timeStep ) == false )
00138 {
00139 return;
00140 }
00141
00142
00143 mitk::PointSet::DataType::Pointer itkPointSet = input->GetPointSet( timeStep );
00144
00145 if ( itkPointSet.GetPointer() == NULL)
00146 {
00147 return;
00148 }
00149
00150
00151 mitk::DisplayGeometry::Pointer displayGeometry = renderer->GetDisplayGeometry();
00152
00153 assert(displayGeometry.IsNotNull());
00154
00155
00156 ApplyProperties(renderer);
00157
00158 vtkLinearTransform* transform = GetDataNode()->GetVtkTransform();
00159
00160
00161 PointSet::DataType::PointsContainerConstIterator it, end;
00162 it = itkPointSet->GetPoints()->Begin();
00163 end = itkPointSet->GetPoints()->End();
00164
00165
00166 PointSet::DataType::PointDataContainerIterator selIt, selEnd;
00167 bool pointDataBroken = (itkPointSet->GetPointData()->Size() != itkPointSet->GetPoints()->Size());
00168 selIt = itkPointSet->GetPointData()->Begin();
00169 selEnd = itkPointSet->GetPointData()->End();
00170
00171 int counter = 0;
00172
00173
00174 int j = 0;
00175
00176
00177 float recallColor[4];
00178 glGetFloatv(GL_CURRENT_COLOR,recallColor);
00179
00180
00181 float unselectedColor[4] = {1.0, 1.0, 0.0, 1.0};
00182
00183 if (dynamic_cast<mitk::ColorProperty*>(node->GetPropertyList(renderer)->GetProperty("unselectedcolor")) != NULL)
00184 {
00185 mitk::Color tmpColor = dynamic_cast<mitk::ColorProperty *>(this->GetDataNode()->GetPropertyList(renderer)->GetProperty("unselectedcolor"))->GetValue();
00186 unselectedColor[0] = tmpColor[0];
00187 unselectedColor[1] = tmpColor[1];
00188 unselectedColor[2] = tmpColor[2];
00189 unselectedColor[3] = 1.0f;
00190 }
00191 else if (dynamic_cast<mitk::ColorProperty*>(node->GetPropertyList(NULL)->GetProperty("unselectedcolor")) != NULL)
00192 {
00193 mitk::Color tmpColor = dynamic_cast<mitk::ColorProperty *>(this->GetDataNode()->GetPropertyList(NULL)->GetProperty("unselectedcolor"))->GetValue();
00194 unselectedColor[0] = tmpColor[0];
00195 unselectedColor[1] = tmpColor[1];
00196 unselectedColor[2] = tmpColor[2];
00197 unselectedColor[3] = 1.0f;
00198 }
00199 else
00200 {
00201
00202 node->GetColor(unselectedColor, NULL);
00203 }
00204
00205
00206 float selectedColor[4] = {1.0, 0.0, 0.6, 1.0};
00207 if (dynamic_cast<mitk::ColorProperty*>(node->GetPropertyList(renderer)->GetProperty("selectedcolor")) != NULL)
00208 {
00209 mitk::Color tmpColor = dynamic_cast<mitk::ColorProperty *>(this->GetDataNode()->GetPropertyList(renderer)->GetProperty("selectedcolor"))->GetValue();
00210 selectedColor[0] = tmpColor[0];
00211 selectedColor[1] = tmpColor[1];
00212 selectedColor[2] = tmpColor[2];
00213 selectedColor[3] = 1.0f;
00214 }
00215 else if (dynamic_cast<mitk::ColorProperty*>(node->GetPropertyList(NULL)->GetProperty("selectedcolor")) != NULL)
00216 {
00217 mitk::Color tmpColor = dynamic_cast<mitk::ColorProperty *>(this->GetDataNode()->GetPropertyList(NULL)->GetProperty("selectedcolor"))->GetValue();
00218 selectedColor[0] = tmpColor[0];
00219 selectedColor[1] = tmpColor[1];
00220 selectedColor[2] = tmpColor[2];
00221 selectedColor[3] = 1.0f;
00222 }
00223
00224
00225 if (dynamic_cast<mitk::IntProperty*>(node->GetPropertyList(renderer)->GetProperty("point line width")) != NULL)
00226 {
00227 m_PointLineWidth = dynamic_cast<mitk::IntProperty *>(this->GetDataNode()->GetPropertyList(renderer)->GetProperty("point line width"))->GetValue();
00228 }
00229 else if (dynamic_cast<mitk::IntProperty*>(node->GetPropertyList(NULL)->GetProperty("point line width")) != NULL)
00230 {
00231 m_PointLineWidth = dynamic_cast<mitk::IntProperty *>(this->GetDataNode()->GetPropertyList(NULL)->GetProperty("point line width"))->GetValue();
00232 }
00233
00234
00235 if (dynamic_cast<mitk::IntProperty*>(node->GetPropertyList(renderer)->GetProperty("point 2D size")) != NULL)
00236 {
00237 m_Point2DSize = dynamic_cast<mitk::IntProperty *>(this->GetDataNode()->GetPropertyList(renderer)->GetProperty("point 2D size"))->GetValue();
00238 }
00239 else if (dynamic_cast<mitk::IntProperty*>(node->GetPropertyList(NULL)->GetProperty("point 2D size")) != NULL)
00240 {
00241 m_Point2DSize = dynamic_cast<mitk::IntProperty *>(this->GetDataNode()->GetPropertyList(NULL)->GetProperty("point 2D size"))->GetValue();
00242 }
00243
00244 Point3D p;
00245 Point3D lastP;
00246 Vector3D vec;
00247 Vector3D lastVec;
00248 vec.Fill(0);
00249
00250 mitk::Point3D projected_p;
00251
00252 Point2D pt2d;
00253 Point2D lastPt2d;
00254 Point2D preLastPt2d;
00255
00256 while(it!=end)
00257 {
00258 lastP = p;
00259 lastVec = vec;
00260
00261 preLastPt2d = lastPt2d;
00262 lastPt2d = pt2d;
00263
00264 float vtkp[3];
00265
00266 itk2vtk(it->Value(), vtkp);
00267 transform->TransformPoint(vtkp, vtkp);
00268 vtk2itk(vtkp,p);
00269
00270 vec = p-lastP;
00271
00272 displayGeometry->Project(p, projected_p);
00273 Vector3D diff=p-projected_p;
00274 ScalarType scalardiff = diff.GetSquaredNorm();
00275
00276
00277 bool isInputDevice=false;
00278
00279 bool isRendererSlice = scalardiff < 0.00001;
00280 if(this->GetDataNode()->GetBoolProperty("inputdevice",isInputDevice) && isInputDevice && !isRendererSlice )
00281 {
00282 displayGeometry->Map(projected_p, pt2d);
00283 displayGeometry->WorldToDisplay(pt2d, pt2d);
00284
00285
00286
00287
00288
00289
00290
00291 float p_size = (1/scalardiff)*100.0;
00292 if(p_size < 6.0 )
00293 p_size = 6.0 ;
00294 else if ( p_size > 10.0 )
00295 p_size = 10.0;
00296
00297
00298 float opacity = (p_size<8)?0.3:1.0;
00299 glColor4f(unselectedColor[0],unselectedColor[1],unselectedColor[2],opacity);
00300 glPointSize(p_size);
00301
00302 glBegin (GL_POINTS);
00303 glVertex2fv(&pt2d[0]);
00304 glEnd ();
00305 }
00306
00307
00308 if(!isInputDevice && ( (scalardiff<4.0) || (m_Polygon)))
00309 {
00310 Point2D tmp;
00311 displayGeometry->Map(projected_p, pt2d);
00312 displayGeometry->WorldToDisplay(pt2d, pt2d);
00313
00314 Vector2D horz,vert;
00315 horz[0]=(float)m_Point2DSize-scalardiff*2; horz[1]=0;
00316 vert[0]=0; vert[1]=(float)m_Point2DSize-scalardiff*2;
00317
00318
00319 if (dynamic_cast<mitk::StringProperty *>(this->GetDataNode()
00320 ->GetProperty("label")) != NULL)
00321 {
00322 const char * pointLabel = dynamic_cast<mitk::StringProperty *>(
00323 this->GetDataNode()->GetProperty("label"))->GetValue();
00324 std::string l = pointLabel;
00325 if (input->GetSize()>1)
00326 {
00327
00328
00329 std::stringstream ss;
00330 ss << it->Index();
00331 l.append(ss.str());
00332 }
00333 if (unselectedColor != NULL)
00334 {
00335 mitk::VtkPropRenderer* OpenGLrenderer = dynamic_cast<mitk::VtkPropRenderer*>( renderer );
00336 float rgb[3];
00337 rgb[0] = unselectedColor[0]; rgb[1] = unselectedColor[1]; rgb[2] = unselectedColor[2];
00338 OpenGLrenderer->WriteSimpleText(l, pt2d[0] + text2dDistance, pt2d[1] + text2dDistance,rgb[0], rgb[1],rgb[2]);
00339 }
00340 else
00341 {
00342 mitk::VtkPropRenderer* OpenGLrenderer = dynamic_cast<mitk::VtkPropRenderer*>( renderer );
00343 OpenGLrenderer->WriteSimpleText(l, pt2d[0] + text2dDistance, pt2d[1] + text2dDistance,0.0,1.0,0.0);
00344 }
00345 }
00346
00347 if((m_ShowPoints) && (scalardiff<4.0))
00348 {
00349
00350 if(selIt != selEnd || pointDataBroken)
00351 {
00352 bool addAsSelected = false;
00353 if (pointDataBroken)
00354 addAsSelected = false;
00355 else if (selIt->Value().selected)
00356 addAsSelected = true;
00357 else
00358 addAsSelected = false;
00359
00360 if (addAsSelected)
00361 {
00362 horz[0]=(float)m_Point2DSize;
00363 vert[1]=(float)m_Point2DSize;
00364 glColor3f(selectedColor[0],selectedColor[1],selectedColor[2]);
00365 glLineWidth(m_PointLineWidth);
00366
00367 glBegin (GL_LINE_LOOP);
00368 tmp=pt2d-horz; glVertex2fv(&tmp[0]);
00369 tmp=pt2d+vert; glVertex2fv(&tmp[0]);
00370 tmp=pt2d+horz; glVertex2fv(&tmp[0]);
00371 tmp=pt2d-vert; glVertex2fv(&tmp[0]);
00372 glEnd ();
00373 glLineWidth(1);
00374
00375 glColor3f(unselectedColor[0],unselectedColor[1],unselectedColor[2]);
00376 glPointSize(1);
00377 glBegin (GL_POINTS);
00378 tmp=pt2d; glVertex2fv(&tmp[0]);
00379 glEnd ();
00380 }
00381 else
00382 {
00383 glColor3f(unselectedColor[0],unselectedColor[1],unselectedColor[2]);
00384 glLineWidth(m_PointLineWidth);
00385
00386 glBegin (GL_LINES);
00387 tmp=pt2d-horz; glVertex2fv(&tmp[0]);
00388 tmp=pt2d+horz; glVertex2fv(&tmp[0]);
00389 tmp=pt2d-vert; glVertex2fv(&tmp[0]);
00390 tmp=pt2d+vert; glVertex2fv(&tmp[0]);
00391 glEnd ();
00392 glLineWidth(1);
00393 }
00394 }
00395 }
00396
00397 bool drawLinesEtc = true;
00398 if (!m_ShowDistantLines && counter > 0)
00399 {
00400 ScalarType currentDistance = displayGeometry->GetWorldGeometry()->SignedDistance(p);
00401 ScalarType lastDistance = displayGeometry->GetWorldGeometry()->SignedDistance(lastP);
00402 if ( currentDistance * lastDistance > 0.5 )
00403 drawLinesEtc = false;
00404 }
00405
00406 if ( m_Polygon && counter > 0 && drawLinesEtc)
00407 {
00408
00409 float contourColor[4] = {unselectedColor[0], unselectedColor[1], unselectedColor[2], unselectedColor[3]};
00410 if (dynamic_cast<mitk::ColorProperty*>(node->GetPropertyList(renderer)->GetProperty("contourcolor")) != NULL)
00411 {
00412 mitk::Color tmpColor = dynamic_cast<mitk::ColorProperty *>(this->GetDataNode()->GetPropertyList(renderer)->GetProperty("contourcolor"))->GetValue();
00413 contourColor[0] = tmpColor[0];
00414 contourColor[1] = tmpColor[1];
00415 contourColor[2] = tmpColor[2];
00416 contourColor[3] = 1.0f;
00417 }
00418 else if (dynamic_cast<mitk::ColorProperty*>(node->GetPropertyList(NULL)->GetProperty("contourcolor")) != NULL)
00419 {
00420 mitk::Color tmpColor = dynamic_cast<mitk::ColorProperty *>(this->GetDataNode()->GetPropertyList(NULL)->GetProperty("contourcolor"))->GetValue();
00421 contourColor[0] = tmpColor[0];
00422 contourColor[1] = tmpColor[1];
00423 contourColor[2] = tmpColor[2];
00424 contourColor[3] = 1.0f;
00425 }
00426
00427 glColor3f(contourColor[0],contourColor[1],contourColor[2]);
00428
00429 glLineWidth( m_LineWidth );
00430 glBegin (GL_LINES);
00431 glVertex2fv(&pt2d[0]);
00432 glVertex2fv(&lastPt2d[0]);
00433 glEnd ();
00434 glLineWidth(1.0);
00435 if(m_ShowDistances)
00436 {
00437 std::stringstream buffer;
00438 float distance = vec.GetNorm();
00439 buffer<<std::fixed <<std::setprecision(m_DistancesDecimalDigits)<<distance<<" mm";
00440
00441 Vector2D vec2d = pt2d-lastPt2d;
00442 makePerpendicularVector2D(vec2d, vec2d);
00443
00444 Vector2D pos2d = (lastPt2d.GetVectorFromOrigin()+pt2d)*0.5+vec2d*text2dDistance;
00445
00446 mitk::VtkPropRenderer* OpenGLrenderer = dynamic_cast<mitk::VtkPropRenderer*>( renderer );
00447 OpenGLrenderer->WriteSimpleText(buffer.str(), pos2d[0], pos2d[1]);
00448
00449 }
00450
00451 if(m_ShowAngles && counter > 1 )
00452 {
00453 std::stringstream buffer;
00454
00455 buffer << angle(vec.Get_vnl_vector(), -lastVec.Get_vnl_vector())*180/vnl_math::pi << (char)176;
00456
00457 Vector2D vec2d = pt2d-lastPt2d;
00458 vec2d.Normalize();
00459 Vector2D lastVec2d = lastPt2d-preLastPt2d;
00460 lastVec2d.Normalize();
00461 vec2d=vec2d-lastVec2d;
00462 vec2d.Normalize();
00463
00464 Vector2D pos2d = lastPt2d.GetVectorFromOrigin()+vec2d*text2dDistance*text2dDistance;
00465
00466 mitk::VtkPropRenderer* OpenGLrenderer = dynamic_cast<mitk::VtkPropRenderer*>( renderer );
00467 OpenGLrenderer->WriteSimpleText(buffer.str(), pos2d[0], pos2d[1]);
00468
00469 }
00470 }
00471 counter++;
00472 }
00473 ++it;
00474 if(selIt != selEnd && !pointDataBroken)
00475 ++selIt;
00476 j++;
00477 }
00478
00479
00480 glColor3f(recallColor[0],recallColor[1],recallColor[2]);
00481 }
00482 }
00483
00484 void mitk::PointSetGLMapper2D::SetDefaultProperties(mitk::DataNode* node, mitk::BaseRenderer* renderer, bool overwrite)
00485 {
00486 node->AddProperty( "line width", mitk::IntProperty::New(2), renderer, overwrite );
00487 node->AddProperty( "point line width", mitk::IntProperty::New(1), renderer, overwrite );
00488 node->AddProperty( "point 2D size", mitk::IntProperty::New(8), renderer, overwrite );
00489 node->AddProperty( "show contour", mitk::BoolProperty::New(false), renderer, overwrite );
00490 node->AddProperty( "show points", mitk::BoolProperty::New(true), renderer, overwrite );
00491 node->AddProperty( "show distances", mitk::BoolProperty::New(false), renderer, overwrite );
00492 node->AddProperty( "distance decimal digits", mitk::IntProperty::New(2), renderer, overwrite );
00493 node->AddProperty( "show angles", mitk::BoolProperty::New(false), renderer, overwrite );
00494 node->AddProperty( "show distant lines", mitk::BoolProperty::New(false), renderer, overwrite );
00495 node->AddProperty( "layer", mitk::IntProperty::New(1), renderer, overwrite );
00496 Superclass::SetDefaultProperties(node, renderer, overwrite);
00497 }