You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

246 lines
6.8 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkCornerAnnotation.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkCornerAnnotation
* @brief text annotation in four corners
*
* This is an annotation object that manages four text actors / mappers
* to provide annotation in the four corners of a viewport
*
* @par Special input text::
* - <image> : will be replaced with slice number (relative number)
* - <slice> : will be replaced with slice number (relative number)
* - <image_and_max> : will be replaced with slice number and slice max (relative)
* - <slice_and_max> : will be replaced with slice number and slice max (relative)
* - <slice_pos> : will be replaced by the position of the current slice
* - <window> : will be replaced with window value
* - <level> : will be replaced with level value
* - <window_level> : will be replaced with window and level value
*
* @sa
* vtkActor2D vtkTextMapper
*/
#ifndef vtkCornerAnnotation_h
#define vtkCornerAnnotation_h
#include "vtkActor2D.h"
#include "vtkRenderingAnnotationModule.h" // For export macro
class vtkTextMapper;
class vtkImageMapToWindowLevelColors;
class vtkImageActor;
class vtkTextProperty;
class VTKRENDERINGANNOTATION_EXPORT vtkCornerAnnotation : public vtkActor2D
{
public:
vtkTypeMacro(vtkCornerAnnotation, vtkActor2D);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Instantiate object with a rectangle in normaled view coordinates
* of (0.2,0.85, 0.8, 0.95).
*/
static vtkCornerAnnotation* New();
//@{
/**
* Draw the scalar bar and annotation text to the screen.
*/
int RenderOpaqueGeometry(vtkViewport* viewport) override;
int RenderTranslucentPolygonalGeometry(vtkViewport*) override { return 0; }
int RenderOverlay(vtkViewport* viewport) override;
//@}
/**
* Does this prop have some translucent polygonal geometry?
*/
vtkTypeBool HasTranslucentPolygonalGeometry() override;
//@{
/**
* Set/Get the maximum height of a line of text as a
* percentage of the vertical area allocated to this
* scaled text actor. Defaults to 1.0
*/
vtkSetMacro(MaximumLineHeight, double);
vtkGetMacro(MaximumLineHeight, double);
//@}
//@{
/**
* Set/Get the minimum/maximum size font that will be shown.
* If the font drops below the minimum size it will not be rendered.
*/
vtkSetMacro(MinimumFontSize, int);
vtkGetMacro(MinimumFontSize, int);
vtkSetMacro(MaximumFontSize, int);
vtkGetMacro(MaximumFontSize, int);
//@}
//@{
/**
* Set/Get font scaling factors
* The font size, f, is calculated as the largest possible value
* such that the annotations for the given viewport do not overlap.
* This font size is scaled non-linearly with the viewport size,
* to maintain an acceptable readable size at larger viewport sizes,
* without being too big.
* f' = linearScale * pow(f,nonlinearScale)
*/
vtkSetMacro(LinearFontScaleFactor, double);
vtkGetMacro(LinearFontScaleFactor, double);
vtkSetMacro(NonlinearFontScaleFactor, double);
vtkGetMacro(NonlinearFontScaleFactor, double);
//@}
/**
* Release any graphics resources that are being consumed by this actor.
* The parameter window could be used to determine which graphic
* resources to release.
*/
void ReleaseGraphicsResources(vtkWindow*) override;
//@{
/**
* Position used to get or set the corner annotation text.
* \sa GetText(), SetText()
*/
enum TextPosition
{
LowerLeft = 0, ///< Uses the lower left corner.
LowerRight, ///< Uses the lower right corner.
UpperLeft, ///< Uses the upper left corner.
UpperRight, ///< Uses the upper right corner.
LowerEdge, ///< Uses the lower edge center.
RightEdge, ///< Uses the right edge center.
LeftEdge, ///< Uses the left edge center
UpperEdge ///< Uses the upper edge center.
};
static const int NumTextPositions = 8;
//@}
//@{
/**
* Set/Get the text to be displayed for each corner
* \sa TextPosition
*/
void SetText(int i, const char* text);
const char* GetText(int i);
void ClearAllTexts();
void CopyAllTextsFrom(vtkCornerAnnotation* ca);
//@}
//@{
/**
* Set an image actor to look at for slice information
*/
void SetImageActor(vtkImageActor*);
vtkGetObjectMacro(ImageActor, vtkImageActor);
//@}
//@{
/**
* Set an instance of vtkImageMapToWindowLevelColors to use for
* looking at window level changes
*/
void SetWindowLevel(vtkImageMapToWindowLevelColors*);
vtkGetObjectMacro(WindowLevel, vtkImageMapToWindowLevelColors);
//@}
//@{
/**
* Set the value to shift the level by.
*/
vtkSetMacro(LevelShift, double);
vtkGetMacro(LevelShift, double);
//@}
//@{
/**
* Set the value to scale the level by.
*/
vtkSetMacro(LevelScale, double);
vtkGetMacro(LevelScale, double);
//@}
//@{
/**
* Set/Get the text property of all corners.
*/
virtual void SetTextProperty(vtkTextProperty* p);
vtkGetObjectMacro(TextProperty, vtkTextProperty);
//@}
//@{
/**
* Even if there is an image actor, should `slice' and `image' be displayed?
*/
vtkBooleanMacro(ShowSliceAndImage, vtkTypeBool);
vtkSetMacro(ShowSliceAndImage, vtkTypeBool);
vtkGetMacro(ShowSliceAndImage, vtkTypeBool);
//@}
protected:
vtkCornerAnnotation();
~vtkCornerAnnotation() override;
double MaximumLineHeight;
vtkTextProperty* TextProperty;
vtkImageMapToWindowLevelColors* WindowLevel;
double LevelShift;
double LevelScale;
vtkImageActor* ImageActor;
vtkImageActor* LastImageActor;
char* CornerText[NumTextPositions];
int FontSize;
vtkActor2D* TextActor[NumTextPositions];
vtkTimeStamp BuildTime;
int LastSize[2];
vtkTextMapper* TextMapper[NumTextPositions];
int MinimumFontSize;
int MaximumFontSize;
double LinearFontScaleFactor;
double NonlinearFontScaleFactor;
vtkTypeBool ShowSliceAndImage;
/**
* Search for replaceable tokens and replace
*/
virtual void TextReplace(vtkImageActor* ia, vtkImageMapToWindowLevelColors* wl);
//@{
/**
* Set text actor positions given a viewport size and justification
*/
virtual void SetTextActorsPosition(const int vsize[2]);
virtual void SetTextActorsJustification();
//@}
private:
vtkCornerAnnotation(const vtkCornerAnnotation&) = delete;
void operator=(const vtkCornerAnnotation&) = delete;
};
#endif