Esempio n. 1
0
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 );
}
mitk::StdFunctionCommand::ActionFunction mitk::DisplayActionEventFunctions::SetLevelWindowAction()
{
  auto actionFunction = [](const itk::EventObject& displayInteractorEvent)
  {
    if (DisplaySetLevelWindowEvent().CheckEvent(&displayInteractorEvent))
    {
      const DisplaySetLevelWindowEvent* displayActionEvent = dynamic_cast<const DisplaySetLevelWindowEvent*>(&displayInteractorEvent);
      const BaseRenderer::Pointer sendingRenderer = displayActionEvent->GetSender();
      if (nullptr == sendingRenderer)
      {
        return;
      }

      // get the the topmost visible image of the sending renderer
      DataStorage::Pointer storage = sendingRenderer->GetDataStorage();
      DataStorage::SetOfObjects::ConstPointer allImageNodes = storage->GetSubset(NodePredicateDataType::New("Image"));
      Point3D worldposition;
      const auto* positionEvent = dynamic_cast<const InteractionPositionEvent*>(displayActionEvent->GetInteractionEvent());
      sendingRenderer->DisplayToWorld(positionEvent->GetPointerPositionOnScreen(), worldposition);
      auto globalCurrentTimePoint = sendingRenderer->GetTime();
      DataNode::Pointer node = FindTopmostVisibleNode(allImageNodes, worldposition, globalCurrentTimePoint, sendingRenderer);
      if (node.IsNull())
      {
        return;
      }

      LevelWindow levelWindow = LevelWindow();
      node->GetLevelWindow(levelWindow);
      ScalarType level = levelWindow.GetLevel();
      ScalarType window = levelWindow.GetWindow();

      level += displayActionEvent->GetLevel();
      window += displayActionEvent->GetWindow();

      levelWindow.SetLevelWindow(level, window);
      auto* levelWindowProperty = dynamic_cast<LevelWindowProperty*>(node->GetProperty("levelwindow"));
      if (nullptr != levelWindowProperty)
      {
        levelWindowProperty->SetLevelWindow(levelWindow);
        sendingRenderer->GetRenderingManager()->RequestUpdateAll();
      }
    }
  };

  return actionFunction;
}
Esempio n. 3
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);
  }
}
Esempio n. 4
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());
}