void mitk::ImageVtkMapper2D::ApplyLookuptable( mitk::BaseRenderer* renderer )
{
  bool binary = false;
  bool CTFcanBeApplied = false;
  this->GetDataNode()->GetBoolProperty( "binary", binary, renderer );
  LocalStorage* localStorage = this->GetLocalStorage(renderer);

  //default lookuptable
  localStorage->m_Texture->SetLookupTable( localStorage->m_LookupTable );

  if(binary)
  {
    //default lookuptable for binary images
    localStorage->m_Texture->GetLookupTable()->SetRange(0.0, 1.0);
  }
  else
  {
    bool useColor = true;
    this->GetDataNode()->GetBoolProperty( "use color", useColor, renderer );
    if((!useColor))
    {
      //BEGIN PROPERTY user-defined lut
      //currently we do not allow a lookuptable if it is a binary image
      // If lookup table use is requested...
      mitk::LookupTableProperty::Pointer LookupTableProp;
      LookupTableProp = dynamic_cast<mitk::LookupTableProperty*>
        (this->GetDataNode()->GetProperty("LookupTable"));
      //...check if there is a lookuptable provided by the user
      if ( LookupTableProp.IsNotNull() )
      {
        // If lookup table use is requested and supplied by the user:
        // only update the lut, when the properties have changed...
        if( LookupTableProp->GetLookupTable()->GetMTime()
          <= this->GetDataNode()->GetPropertyList()->GetMTime() )
        {
          LookupTableProp->GetLookupTable()->ChangeOpacityForAll( LookupTableProp->GetLookupTable()->GetVtkLookupTable()->GetAlpha()*localStorage->m_Actor->GetProperty()->GetOpacity() );
          LookupTableProp->GetLookupTable()->ChangeOpacity(0, 0.0);
        }
        //we use the user-defined lookuptable
        localStorage->m_Texture->SetLookupTable( LookupTableProp->GetLookupTable()->GetVtkLookupTable() );
      }
      else
      {
        CTFcanBeApplied = true;
      }
    }//END PROPERTY user-defined lut
    LevelWindow levelWindow;
    this->GetLevelWindow( levelWindow, renderer );
    //set up the lookuptable with the level window range
    localStorage->m_Texture->GetLookupTable()->SetRange( levelWindow.GetLowerWindowBound(), levelWindow.GetUpperWindowBound() );
  }
  //the color function can be applied if the user does not want to use color
  //and does not provide a lookuptable
  if(CTFcanBeApplied)
  {
    ApplyColorTransferFunction(renderer);
  }
  localStorage->m_Texture->SetInput( localStorage->m_ReslicedImage );
}
示例#2
0
void mitk::ImageVtkMapper2D::ApplyLevelWindow(mitk::BaseRenderer *renderer)
{
  LocalStorage *localStorage = this->GetLocalStorage( renderer );

  LevelWindow levelWindow;
  this->GetDataNode()->GetLevelWindow( levelWindow, renderer, "levelwindow" );
  localStorage->m_LevelWindowFilter->GetLookupTable()->SetRange( levelWindow.GetLowerWindowBound(), levelWindow.GetUpperWindowBound() );

  mitk::LevelWindow opacLevelWindow;
  if( this->GetDataNode()->GetLevelWindow( opacLevelWindow, renderer, "opaclevelwindow" ) )
  {
    //pass the opaque level window to the filter
    localStorage->m_LevelWindowFilter->SetMinOpacity(opacLevelWindow.GetLowerWindowBound());
    localStorage->m_LevelWindowFilter->SetMaxOpacity(opacLevelWindow.GetUpperWindowBound());
  }
  else
  {
    //no opaque level window
    localStorage->m_LevelWindowFilter->SetMinOpacity(0.0);
    localStorage->m_LevelWindowFilter->SetMaxOpacity(255.0);
  }
}
示例#3
0
void mitk::ImageVtkMapper2D::ApplyLookuptable( mitk::BaseRenderer* renderer, vtkFloatingPointType* bounds )
{
  //Have the following 4 different use cases how to generate the lookuptable:
  //1. We have a binary image -> The lut range is set to 0.0, 1.0
  //2. The user sets a lut we can use
  //3. The user sets a transfer function we can use
  //4. Nothing defined: The default color lookuptable is used
  //@Warning: If the user sets a lut and a transfer function the lut will be used!
  LocalStorage* localStorage = m_LSH.GetLocalStorage(renderer);
  bool binary = false;

  this->GetDataNode()->GetBoolProperty( "binary", binary, renderer );

  vtkLookupTable *usedLookupTable = localStorage->m_DefaultLookupTable;
  vtkScalarsToColors *usedScalarsToColors = localStorage->m_DefaultLookupTable;

  // If lookup table or transferfunction use is requested...
  mitk::LookupTableProperty::Pointer lookupTableProp = dynamic_cast<mitk::LookupTableProperty*>(this->GetDataNode()->GetProperty("LookupTable"));
  mitk::TransferFunctionProperty::Pointer transferFunctionProp = dynamic_cast<mitk::TransferFunctionProperty*>(this->GetDataNode()->GetProperty("Image Rendering.Transfer Function",renderer ));

  if(binary) // is it a binary image?
  {
    usedScalarsToColors = usedLookupTable = localStorage->m_BinaryLookupTable;
  }
  else if( lookupTableProp.IsNotNull() ) // is a lookuptable set?
  {
    if( transferFunctionProp.IsNotNull() )
    {
      MITK_WARN << "A LookupTable and a transfer function TransferFunction property is set! Only the Image Rendering.Transfer Function will be used. If you want to use the color transfer function, remove or rename the LookupTable property.";
    }
    //If a lookup table is supplied by the user:
    //only update the lut, when the properties have changed...
    if( lookupTableProp->GetLookupTable()->GetMTime()
      <= this->GetDataNode()->GetPropertyList()->GetMTime() )
    {
      lookupTableProp->GetLookupTable()->ChangeOpacityForAll( lookupTableProp->GetLookupTable()->GetVtkLookupTable()->GetAlpha()*localStorage->m_Actor->GetProperty()->GetOpacity() );
      lookupTableProp->GetLookupTable()->ChangeOpacity(0, 0.0);
    }
    //If the user defines a lut, we dont want to use the color and take white instead.
    dynamic_cast<vtkActor*> (localStorage->m_Actors->GetParts()->GetItemAsObject(0))->GetProperty()->SetColor(1.0, 1.0, 1.0);
    localStorage->m_Actor->GetProperty()->SetColor(1.0, 1.0, 1.0);
    usedScalarsToColors = usedLookupTable = lookupTableProp->GetLookupTable()->GetVtkLookupTable();
  }
  else if(transferFunctionProp.IsNotNull()) // is a color transfer function set?
  {
    usedScalarsToColors = transferFunctionProp->GetValue()->GetColorTransferFunction();
    usedLookupTable = 0;
  }
  else
  {
    //default lookuptable
    LevelWindow levelWindow;
    GetDataNode()->GetLevelWindow( levelWindow, renderer, "levelwindow" );
    usedLookupTable->SetRange( levelWindow.GetLowerWindowBound(), levelWindow.GetUpperWindowBound() );
  }

  this->ApplyColor( renderer );

  // check for texture interpolation property
  bool textureInterpolation = false;
  GetDataNode()->GetBoolProperty( "texture interpolation", textureInterpolation, renderer );

  //set the interpolation modus according to the property
  localStorage->m_Texture->SetInterpolate(textureInterpolation);

  mitk::LevelWindow opacLevelWindow;
  if( GetDataNode()->GetLevelWindow( opacLevelWindow, renderer, "opaclevelwindow" ) )
  {
    //pass the opaque level window to the filter
    localStorage->m_LevelWindowFilter->SetMinOpacity(opacLevelWindow.GetLowerWindowBound());
    localStorage->m_LevelWindowFilter->SetMaxOpacity(opacLevelWindow.GetUpperWindowBound());
  }
  else
  {
    //no opaque level window
    localStorage->m_LevelWindowFilter->SetMinOpacity(0.0);
    localStorage->m_LevelWindowFilter->SetMaxOpacity(255.0);
  }

  localStorage->m_LevelWindowFilter->SetLookupTable(usedScalarsToColors);
  localStorage->m_LevelWindowFilter->SetInput(localStorage->m_ReslicedImage);
  localStorage->m_LevelWindowFilter->SetClippingBounds(bounds);
  //connect the texture with the output of the levelwindow filter
  localStorage->m_Texture->SetInputConnection(localStorage->m_LevelWindowFilter->GetOutputPort());
}