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.
303 lines
9.2 KiB
C++
303 lines
9.2 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkContextArea.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 vtkContextArea
|
|
* @brief Clipped, transformed area with axes for context items.
|
|
*
|
|
*
|
|
* vtkContextArea provides an clipped drawing area surrounded by four axes.
|
|
* The drawing area is transformed to map the 2D area described by
|
|
* DrawAreaBounds into pixel coordinates. DrawAreaBounds is also used to
|
|
* configure the axes. Item to be rendered in the draw area should be added
|
|
* to the context item returned by GetDrawAreaItem().
|
|
*
|
|
* The size and shape of the draw area is configured by the following member
|
|
* variables:
|
|
* - Geometry: The rect (pixel coordinates) defining the location of the context
|
|
* area in the scene. This includes the draw area and axis ticks/labels.
|
|
* - FillViewport: If true (default), Geometry is set to span the size returned
|
|
* by vtkContextDevice2D::GetViewportSize().
|
|
* - DrawAreaResizeBehavior: Controls how the draw area should be shaped.
|
|
* Available options: Expand (default), FixedAspect, FixedRect, FixedMargins.
|
|
* - FixedAspect: Aspect ratio to enforce for FixedAspect resize behavior.
|
|
* - FixedRect: Rect used to enforce for FixedRect resize behavior.
|
|
* - FixedMargins: Margins to enforce for FixedMargins resize behavior.
|
|
*/
|
|
|
|
#ifndef vtkContextArea_h
|
|
#define vtkContextArea_h
|
|
|
|
#include "vtkAbstractContextItem.h"
|
|
|
|
#include "vtkAxis.h" // For enums
|
|
#include "vtkChartsCoreModule.h" // For export macro
|
|
#include "vtkNew.h" // For vtkNew
|
|
#include "vtkRect.h" // For vtkRect/vtkVector/vtkTuple
|
|
|
|
class vtkContextClip;
|
|
class vtkContextTransform;
|
|
class vtkPlotGrid;
|
|
|
|
class VTKCHARTSCORE_EXPORT vtkContextArea : public vtkAbstractContextItem
|
|
{
|
|
public:
|
|
typedef vtkTuple<int, 4> Margins;
|
|
vtkTypeMacro(vtkContextArea, vtkAbstractContextItem);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
static vtkContextArea* New();
|
|
|
|
/**
|
|
* Get the vtkAxis associated with the specified location.
|
|
*/
|
|
vtkAxis* GetAxis(vtkAxis::Location location);
|
|
|
|
/**
|
|
* Returns the vtkAbstractContextItem that will draw in the clipped,
|
|
* transformed space. This is the item to add children for.
|
|
*/
|
|
vtkAbstractContextItem* GetDrawAreaItem();
|
|
|
|
/**
|
|
* Paint event for the item, called whenever the item needs to be drawn.
|
|
*/
|
|
bool Paint(vtkContext2D* painter) override;
|
|
|
|
//@{
|
|
/**
|
|
* The rect defining the pixel location and size of the entire vtkContextArea,
|
|
* including axis labels, title, etc. Note that this will be updated to the
|
|
* window geometry if FillWindow is true.
|
|
*/
|
|
vtkGetMacro(Geometry, vtkRecti);
|
|
vtkSetMacro(Geometry, vtkRecti);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* The data bounds of the clipped and transformed area inside of the axes.
|
|
* This is used to configure the axes labels and setup the transform.
|
|
*/
|
|
vtkGetMacro(DrawAreaBounds, vtkRectd);
|
|
vtkSetMacro(DrawAreaBounds, vtkRectd);
|
|
//@}
|
|
|
|
enum DrawAreaResizeBehaviorType
|
|
{
|
|
DARB_Expand,
|
|
DARB_FixedAspect,
|
|
DARB_FixedRect,
|
|
DARB_FixedMargins
|
|
};
|
|
|
|
//@{
|
|
/**
|
|
* Set the resize behavior for the draw area:
|
|
* - @a Expand: The default behavior. The draw area will automatically resize
|
|
* to take up as much of @a Geometry as possible. Margin sizes are
|
|
* minimized based on the space required for axis labels/tick marks.
|
|
* - FixedAspect: Same as Expand, but a fixed aspect ratio is enforced.
|
|
* See SetFixedAspect.
|
|
* - FixedRect: Draw area is always constrained to a fixed rectangle.
|
|
* See SetFixedRect.
|
|
* - FixMargins: The draw area expands to fill @a Geometry, but margins
|
|
* (axis labels, etc) are fixed, rather than dynamically sized.
|
|
* See SetFixedMargins.
|
|
*/
|
|
vtkGetMacro(DrawAreaResizeBehavior, DrawAreaResizeBehaviorType);
|
|
vtkSetMacro(DrawAreaResizeBehavior, DrawAreaResizeBehaviorType);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* The fixed aspect ratio, if DrawAreaResizeBehavior is FixedAspect.
|
|
* Defined as width/height. Default is 1.
|
|
* Setting the aspect ratio will also set DrawAreaResizeBehavior to
|
|
* FixedAspect.
|
|
*/
|
|
vtkGetMacro(FixedAspect, float) virtual void SetFixedAspect(float aspect);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* The fixed rect to use for the draw area, if DrawAreaResizeBehavior is
|
|
* FixedRect. Units are in pixels, default is 300x300+0+0.
|
|
* Setting the fixed rect will also set DrawAreaResizeBehavior to
|
|
* FixedRect.
|
|
*/
|
|
vtkGetMacro(FixedRect, vtkRecti);
|
|
virtual void SetFixedRect(vtkRecti rect);
|
|
virtual void SetFixedRect(int x, int y, int width, int height);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* The left, right, bottom, and top margins for the draw area, if
|
|
* DrawAreaResizeBehavior is FixedMargins. Units are in pixels, default is
|
|
* { 0, 0, 0, 0 }.
|
|
* Setting the fixed margins will also set DrawAreaResizeBehavior to
|
|
* FixedMargins.
|
|
*/
|
|
virtual const Margins& GetFixedMargins() { return this->FixedMargins; }
|
|
virtual void GetFixedMarginsArray(int margins[4]);
|
|
virtual const int* GetFixedMarginsArray();
|
|
virtual void SetFixedMargins(Margins margins);
|
|
virtual void SetFixedMargins(int margins[4]);
|
|
virtual void SetFixedMargins(int left, int right, int bottom, int top);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* If true, Geometry is set to (0, 0, vpSize[0], vpSize[1]) at the start
|
|
* of each Paint call. vpSize is vtkContextDevice2D::GetViewportSize. Default
|
|
* is true.
|
|
*/
|
|
vtkGetMacro(FillViewport, bool);
|
|
vtkSetMacro(FillViewport, bool);
|
|
vtkBooleanMacro(FillViewport, bool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Turn on/off grid visibility.
|
|
*/
|
|
virtual void SetShowGrid(bool show);
|
|
virtual bool GetShowGrid();
|
|
virtual void ShowGridOn() { this->SetShowGrid(true); }
|
|
virtual void ShowGridOff() { this->SetShowGrid(false); }
|
|
//@}
|
|
|
|
protected:
|
|
vtkContextArea();
|
|
~vtkContextArea() override;
|
|
|
|
/**
|
|
* Sync the Axes locations with Geometry, and update the DrawAreaGeometry
|
|
* to account for Axes size (margins). Must be called while the painter
|
|
* is active.
|
|
*/
|
|
void LayoutAxes(vtkContext2D* painter);
|
|
virtual void SetAxisRange(vtkRectd const& data);
|
|
virtual void ComputeViewTransform();
|
|
|
|
/**
|
|
* Return the draw area's geometry.
|
|
*/
|
|
vtkRecti ComputeDrawAreaGeometry(vtkContext2D* painter);
|
|
|
|
//@{
|
|
/**
|
|
* Working implementations for ComputeDrawAreaGeometry.
|
|
*/
|
|
vtkRecti ComputeExpandedDrawAreaGeometry(vtkContext2D* painter);
|
|
vtkRecti ComputeFixedAspectDrawAreaGeometry(vtkContext2D* painter);
|
|
vtkRecti ComputeFixedRectDrawAreaGeometry(vtkContext2D* painter);
|
|
vtkRecti ComputeFixedMarginsDrawAreaGeometry(vtkContext2D* painter);
|
|
//@}
|
|
|
|
/**
|
|
* Set the transform to map DrawAreaBounds to DrawAreaGeometry. Should be
|
|
* called after LayoutAxes to ensure that DrawAreaGeometry is up to date.
|
|
*/
|
|
void UpdateDrawArea();
|
|
|
|
/**
|
|
* vtkAxis objects that surround the draw area, indexed by vtkAxis::Location.
|
|
*/
|
|
vtkTuple<vtkAxis*, 4> Axes;
|
|
|
|
/**
|
|
* The vtkPlotGrid that renders a grid atop the data in the draw area.
|
|
*/
|
|
vtkNew<vtkPlotGrid> Grid;
|
|
|
|
/**
|
|
* The context item that clips rendered data.
|
|
*/
|
|
vtkNew<vtkContextClip> Clip;
|
|
|
|
/**
|
|
* The context item that clips rendered data.
|
|
*/
|
|
vtkNew<vtkContextTransform> Transform;
|
|
|
|
/**
|
|
* The rect defining the pixel location and size of the entire vtkContextArea,
|
|
* including axis label, title, etc.
|
|
*/
|
|
vtkRecti Geometry;
|
|
|
|
/**
|
|
* The data bounds of the clipped and transformed area inside of the axes.
|
|
* This is used to configure the axes labels and setup the transform.
|
|
*/
|
|
vtkRectd DrawAreaBounds;
|
|
|
|
/**
|
|
* The rect defining the pixel location and size of the clipped and
|
|
* transformed area inside the axes. Relative to Geometry.
|
|
*/
|
|
vtkRecti DrawAreaGeometry;
|
|
|
|
/**
|
|
* Controls how the draw area size is determined.
|
|
*/
|
|
DrawAreaResizeBehaviorType DrawAreaResizeBehavior;
|
|
|
|
/**
|
|
* The fixed aspect ratio, if DrawAreaResizeBehavior is FixedAspect.
|
|
* Defined as width/height. Default is 1.
|
|
*/
|
|
float FixedAspect;
|
|
|
|
/**
|
|
* The fixed rect to use for the draw area, if DrawAreaResizeBehavior is
|
|
* FixedRect. Units are in pixels, default is 300x300+0+0.
|
|
*/
|
|
vtkRecti FixedRect;
|
|
|
|
/**
|
|
* The left, right, bottom, and top margins for the draw area, if
|
|
* DrawAreaResizeBehavior is FixedMargins. Units are in pixels, default is
|
|
* { 0, 0, 0, 0 }
|
|
*/
|
|
Margins FixedMargins;
|
|
|
|
/**
|
|
* If true, Geometry is set to (0, 0, vpSize[0], vpSize[1]) at the start
|
|
* of each Paint call. vpSize is vtkContextDevice2D::GetViewportSize. Default
|
|
* is true.
|
|
*/
|
|
bool FillViewport;
|
|
|
|
/**
|
|
* Initialize the drawing area's item hierarchy
|
|
*/
|
|
virtual void InitializeDrawArea();
|
|
|
|
// Smart pointers for axis lifetime management. See this->Axes.
|
|
vtkNew<vtkAxis> TopAxis;
|
|
vtkNew<vtkAxis> BottomAxis;
|
|
vtkNew<vtkAxis> LeftAxis;
|
|
vtkNew<vtkAxis> RightAxis;
|
|
|
|
private:
|
|
vtkContextArea(const vtkContextArea&) = delete;
|
|
void operator=(const vtkContextArea&) = delete;
|
|
};
|
|
|
|
#endif // vtkContextArea_h
|