VTK  9.3.0
vtkChartXYZ.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
3 
23 #ifndef vtkChartXYZ_h
24 #define vtkChartXYZ_h
25 
26 #include "vtkChartsCoreModule.h" // For export macro
27 #include "vtkColor.h" // For vtkColor4ub
28 #include "vtkContextItem.h"
29 #include "vtkNew.h" // For ivars
30 #include "vtkRect.h" // For vtkRectf ivars
31 #include "vtkSmartPointer.h" // For ivars
32 #include "vtkStdString.h" // For vtkStdString
33 #include "vtkTextProperty.h" // For axes text properties
34 #include <vector> // For ivars
35 
36 VTK_ABI_NAMESPACE_BEGIN
37 class vtkAnnotationLink;
38 class vtkAxis;
39 class vtkContext3D;
41 class vtkPen;
42 class vtkPlaneCollection;
43 class vtkPlot3D;
44 class vtkTable;
45 class vtkTransform;
47 
48 class VTKCHARTSCORE_EXPORT vtkChartXYZ : public vtkContextItem
49 {
50 public:
51  vtkTypeMacro(vtkChartXYZ, vtkContextItem);
52  void PrintSelf(ostream& os, vtkIndent indent) override;
53 
54  static vtkChartXYZ* New();
55 
65  void SetGeometry(const vtkRectf& bounds);
66 
74  void SetMargins(const vtkVector4i& margins);
75 
79  vtkSetMacro(Angle, double);
80 
84  void SetAroundX(bool isX);
85 
89  virtual void SetAnnotationLink(vtkAnnotationLink* link);
90 
94  vtkAxis* GetAxis(int axis);
95 
99  virtual void SetAxis(int axisIndex, vtkAxis* axis);
100 
102 
108 
129 
133  vtkSetMacro(XAxisLabel, vtkStdString);
134 
138  vtkSetMacro(YAxisLabel, vtkStdString);
139 
143  vtkSetMacro(ZAxisLabel, vtkStdString);
144 
150  vtkSetMacro(EnsureOuterEdgeAxisLabelling, bool);
151 
156  vtkSetMacro(AutoRotate, bool);
157 
162  void SetDecorateAxes(bool b);
163 
168  void SetFitToScene(bool b);
169 
173  void Update() override;
174 
178  bool Paint(vtkContext2D* painter) override;
179 
183  virtual vtkIdType AddPlot(vtkPlot3D* plot);
184 
188  virtual bool RemovePlot(vtkPlot3D* plot);
189 
193  void ClearPlots();
194 
200 
207 
211  bool Hit(const vtkContextMouseEvent& mouse) override;
212 
216  bool MouseButtonPressEvent(const vtkContextMouseEvent& mouse) override;
217 
221  bool MouseMoveEvent(const vtkContextMouseEvent& mouse) override;
222 
226  bool MouseWheelEvent(const vtkContextMouseEvent& mouse, int delta) override;
227 
233  bool KeyPressEvent(const vtkContextKeyEvent& key) override;
234 
239 
243  vtkGetMacro(ClippingPlanesEnabled, bool);
244 
248  vtkSetMacro(ScaleBoxWithPlot, bool);
249 
253  vtkGetMacro(ScaleBoxWithPlot, bool);
254 
255 protected:
257  ~vtkChartXYZ() override;
258 
263  {
266  UP,
267  DOWN
268  };
269 
274  {
280  STANDARD
281  };
282 
287  {
295  NORTH_WEST
296  };
297 
303  virtual void CalculateTransforms();
304 
312 
316  bool Rotate(const vtkContextMouseEvent& mouse);
317 
321  bool Rotate(RotateDirection rotateDirection);
322 
326  bool Pan(const vtkContextMouseEvent& mouse);
327 
331  bool Zoom(const vtkContextMouseEvent& mouse);
332 
336  bool Spin(const vtkContextMouseEvent& mouse);
337 
341  void LookDownX();
342 
346  void LookDownY();
347 
351  void LookDownZ();
352 
356  void LookUpX();
357 
361  void LookUpY();
362 
366  void LookUpZ();
367 
372 
376  void RescaleAxes();
377 
381  void ScaleUpAxes();
382 
387 
391  void ZoomAxes(int delta);
392 
398 
409 
414 
418  void DrawAxes(vtkContext3D* context);
419 
425 
431 
440  void DrawTickMarks(vtkContext2D* painter);
441 
445  void DrawAxesLabels(vtkContext2D* painter);
446 
452  void GetOffsetForAxisLabel(int axis, float* bounds, float* offset);
453 
459  double CalculateNiceMinMax(double& min, double& max, int axis);
460 
464  void GetClippingPlaneEquation(int i, double* planeEquation);
465 
469  std::size_t GetMarginLeft() const;
470 
474  std::size_t GetMarginBottom() const;
475 
479  std::size_t GetPlotWidth() const;
480 
484  std::size_t GetPlotHeight() const;
485 
489  enum
490  {
492  USE_GEOMETRY
493  } SizeStrategy = USE_GEOMETRY;
494 
499  vtkVector4i Margins = vtkVector4i(40, 40, 40, 40);
500 
505  vtkRectf Geometry = vtkRectf(40, 40, 120, 120);
506 
510  std::vector<vtkSmartPointer<vtkAxis>> Axes;
511 
516  bool AutoRotate = false;
517 
522  bool IsX = false;
523 
528  double Angle = 0;
529 
534  bool DrawAxesDecoration = true;
535 
540  bool FitToScene = true;
541 
546 
553 
558 
563 
569 
575 
581 
588 
593 
598 
603 
608 
612  std::vector<vtkPlot3D*> Plots;
613 
617  std::vector<vtkIdType> FreePlaces;
618 
623 
628 
633 
638 
644  bool EnsureOuterEdgeAxisLabelling = false;
649 
654  float AxesBoundaryPoints[8][3];
655 
660  float TickLabelOffset[3][2];
661 
666 
671 
673 
676  int XAxisToLabel[3];
677  int YAxisToLabel[3];
678  int ZAxisToLabel[3];
680 
684  int DirectionToData[3];
685 
689  double DataBounds[4];
690 
694  bool ClippingPlanesEnabled = true;
695 
699  bool ScaleBoxWithPlot = true;
700 
701 private:
702  vtkChartXYZ(const vtkChartXYZ&) = delete;
703  void operator=(const vtkChartXYZ&) = delete;
704 };
705 
706 VTK_ABI_NAMESPACE_END
707 #endif
takes care of drawing 2D axes
Definition: vtkAxis.h:70
Factory class for drawing 3D XYZ charts.
Definition: vtkChartXYZ.h:49
~vtkChartXYZ() override
void SetClippingPlanesEnabled(bool)
Hide data outside the box.
vtkNew< vtkTransform > FutureBoxScale
This transform keeps track of the Scale of the FutureBox transform.
Definition: vtkChartXYZ.h:592
vtkNew< vtkTransform > FutureBox
This transform is initialized as a copy of Box.
Definition: vtkChartXYZ.h:587
std::string XAxisLabel
The label for the X Axis.
Definition: vtkChartXYZ.h:627
@ USE_MARGINS_AND_SCENE_SIZE
Definition: vtkChartXYZ.h:491
void ScaleDownAxes()
Scale down the axes when the scene gets smaller.
bool Paint(vtkContext2D *painter) override
Paint event for the chart, called whenever the chart needs to be drawn.
void RescaleAxes()
Scale the axes up or down in response to a scene resize.
vtkNew< vtkTransform > Box
This is the transform that is applied when rendering data from the plots.
Definition: vtkChartXYZ.h:557
void SetAxisColor(const vtkColor4ub &color)
Set the color for the axes.
void LookUpX()
Adjust the rotation of the chart so that we are looking up the X axis.
vtkNew< vtkPen > Pen
This is the pen that is used to draw data from the plots.
Definition: vtkChartXYZ.h:597
int SceneHeight
The height of the scene, as of the most recent call to Paint().
Definition: vtkChartXYZ.h:665
virtual bool RemovePlot(vtkPlot3D *plot)
Removes a plot from the chart.
void DrawAxesLabels(vtkContext2D *painter)
Label the axes.
void DrawTickMarks(vtkContext2D *painter)
Draw tick marks and tick mark labels along the axes.
static vtkChartXYZ * New()
RotateDirection
Rotation directions.
Definition: vtkChartXYZ.h:263
bool Zoom(const vtkContextMouseEvent &mouse)
Zoom in or out on the data in response to a mouse movement.
vtkTextProperty * GetAxesTextProperty()
Get the text property for axes.
std::string YAxisLabel
The label for the Y Axis.
Definition: vtkChartXYZ.h:632
void Update() override
Perform any updates to the item that may be necessary before rendering.
bool Rotate(const vtkContextMouseEvent &mouse)
Rotate the chart in response to a mouse movement.
double CalculateNiceMinMax(double &min, double &max, int axis)
Calculate the next "nicest" numbers above and below the current minimum.
vtkAxis * GetAxis(int axis)
Get the x (0), y (1) or z (2) axis.
vtkNew< vtkTransform > Scale
This transform keeps track of how the data points have been scaled (zoomed in or zoomed out) within t...
Definition: vtkChartXYZ.h:574
std::vector< vtkSmartPointer< vtkAxis > > Axes
The 3 axes of this chart.
Definition: vtkChartXYZ.h:510
bool Spin(const vtkContextMouseEvent &mouse)
Spin the chart in response to a mouse movement.
bool Rotate(RotateDirection rotateDirection)
Rotate the chart in a specific direction.
void GetClippingPlaneEquation(int i, double *planeEquation)
Get the equation for the ith face of our bounding cube.
vtkNew< vtkPlaneCollection > BoundingCube
The six planes that define the bounding cube of our 3D axes.
Definition: vtkChartXYZ.h:648
virtual void CalculateTransforms()
Calculate the transformation matrices used to draw data points and axes in the scene.
vtkNew< vtkTransform > Rotation
This transform keeps track of how the chart has been rotated.
Definition: vtkChartXYZ.h:562
void LegacyDetermineWhichAxesToLabel()
Old-style axis labelling, for compatibility; labelling may occur in less optimal places e....
void DrawAxes(vtkContext3D *context)
Draw the cube axes of this chart.
vtkNew< vtkPen > AxisPen
This is the pen that is used to draw the axes.
Definition: vtkChartXYZ.h:602
bool CalculatePlotTransform(vtkAxis *x, vtkAxis *y, vtkAxis *z, vtkTransform *transform)
Given the x, y and z vtkAxis, and a transform, calculate the transform that the points in a chart wou...
vtkNew< vtkTransform > BoxScale
This transform keeps track of how the axes have been scaled (zoomed in or zoomed out).
Definition: vtkChartXYZ.h:580
std::string ZAxisLabel
The label for the Z Axis.
Definition: vtkChartXYZ.h:637
void LookUpZ()
Adjust the rotation of the chart so that we are looking up the Z axis.
void GetOffsetForAxisLabel(int axis, float *bounds, float *offset)
Compute how some text should be offset from an axis.
void ClearPlots()
Remove all the plots from this chart.
std::size_t GetPlotHeight() const
Gets the current height of the plot in pixels irrespective of the size-strategy used.
void DetermineWhichAxesToLabel()
For each of the XYZ dimensions, find the axis line that is furthest from the rendered data.
std::vector< vtkPlot3D * > Plots
The plots that are drawn within this chart.
Definition: vtkChartXYZ.h:612
vtkNew< vtkTransform > ContextTransform
This is the transform that is applied when rendering data from the plots.
Definition: vtkChartXYZ.h:545
void LookDownX()
Adjust the rotation of the chart so that we are looking down the X axis.
vtkSmartPointer< vtkAnnotationLink > Link
This link is used to share selected points with other classes.
Definition: vtkChartXYZ.h:607
std::size_t GetMarginBottom() const
Gets the current margin top in pixels irrespective of the size-strategy used.
Direction
The direction to data from an axis.
Definition: vtkChartXYZ.h:287
void SetAroundX(bool isX)
Set whether or not we're rotating about the X axis.
void SetMargins(const vtkVector4i &margins)
Set the margins in pixels ordered top right bottom left The box will be drawn inside those margins,...
void ZoomAxes(int delta)
Change the scaling of the axes by a specified amount.
void LookUpY()
Adjust the rotation of the chart so that we are looking up the Y axis.
void SetDecorateAxes(bool b)
Set whether or not axes labels & tick marks should be drawn.
vtkNew< vtkTransform > Translation
This transform keeps track of how the data points have been panned within the chart.
Definition: vtkChartXYZ.h:568
void InitializeFutureBox()
Initialize the "future box" transform.
vtkNew< vtkTransform > PlotTransform
This transform translates and scales the plots' data points so that they appear within the axes of th...
Definition: vtkChartXYZ.h:552
bool CheckForSceneResize()
Check to see if the scene changed size since the last render.
void InitializeAxesBoundaryPoints()
Initialize a list of "test points".
vtkColor4ub GetAxisColor()
Set the color for the axes.
bool KeyPressEvent(const vtkContextKeyEvent &key) override
Key press event.
void ScaleUpAxes()
Scale up the axes when the scene gets larger.
void SetGeometry(const vtkRectf &bounds)
Set the geometry in pixel coordinates (origin and width/height).
virtual void SetAxis(int axisIndex, vtkAxis *axis)
Set the x (0), y (1) or z (2) axis.
void ComputeDataBounds()
Compute a bounding box for the data that is rendered within the axes.
void LookDownZ()
Adjust the rotation of the chart so that we are looking down the Z axis.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
vtkNew< vtkTextProperty > AxesTextProperty
The text properties of the axes.
Definition: vtkChartXYZ.h:622
bool MouseButtonPressEvent(const vtkContextMouseEvent &mouse) override
Mouse press event.
void RecalculateBounds()
Determine the XYZ bounds of the plots within this chart.
void SetFitToScene(bool b)
Set whether or not the chart should automatically resize itself to fill the scene.
void NewDetermineWhichAxesToLabel()
New style axis labelling, ensuring labelling is always at the edges of the chart in the most sensible...
bool MouseWheelEvent(const vtkContextMouseEvent &mouse, int delta) override
Mouse wheel event.
bool MouseMoveEvent(const vtkContextMouseEvent &mouse) override
Mouse move event.
AxisState
The state of an axis.
Definition: vtkChartXYZ.h:274
void LookDownY()
Adjust the rotation of the chart so that we are looking down the Y axis.
std::vector< vtkIdType > FreePlaces
These plots got removed (from Plots), try to reuse the free spot.
Definition: vtkChartXYZ.h:617
std::size_t GetPlotWidth() const
Gets the current width of the plot in pixels irrespective of the size-strategy used.
virtual void SetAnnotationLink(vtkAnnotationLink *link)
Set the vtkAnnotationLink for the chart.
void RecalculateTransform()
Use this chart's Geometry to set the endpoints of its axes.
int SceneWidth
The weight of the scene, as of the most recent call to Paint().
Definition: vtkChartXYZ.h:670
virtual vtkIdType AddPlot(vtkPlot3D *plot)
Adds a plot to the chart.
bool Hit(const vtkContextMouseEvent &mouse) override
Returns true if the transform is interactive, false otherwise.
std::size_t GetMarginLeft() const
Gets the current margin left in pixels irrespective of the size-strategy used.
bool Pan(const vtkContextMouseEvent &mouse)
Pan the data within the chart in response to a mouse movement.
Class for drawing 2D primitives to a graphical context.
Definition: vtkContext2D.h:59
Class for drawing 3D primitives to a graphical context.
Definition: vtkContext3D.h:43
base class for items that are part of a vtkContextScene.
data structure to represent key events.
data structure to represent mouse events.
a simple class to control print indentation
Definition: vtkIndent.h:38
provides a pen that draws the outlines of shapes drawn by vtkContext2D.
Definition: vtkPen.h:38
maintain a list of planes
Abstract class for 3D plots.
Definition: vtkPlot3D.h:35
Wrapper around std::string to keep symbols short.
Definition: vtkStdString.h:38
A table, which contains similar-typed columns of data.
Definition: vtkTable.h:68
represent text properties.
describes linear transformations via a 4x4 matrix
Definition: vtkTransform.h:59
dynamic, self-adjusting array of unsigned char
@ key
Definition: vtkX3D.h:257
@ color
Definition: vtkX3D.h:221
@ offset
Definition: vtkX3D.h:438
@ string
Definition: vtkX3D.h:490
int vtkIdType
Definition: vtkType.h:315
#define max(a, b)