VTK  9.0.3
vtkControlPointsItem.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkControlPointsItem.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
15 
28 #ifndef vtkControlPointsItem_h
29 #define vtkControlPointsItem_h
30 
31 #include "vtkChartsCoreModule.h" // For export macro
32 #include "vtkCommand.h" // For vtkCommand enum
33 #include "vtkPlot.h"
34 #include "vtkSmartPointer.h" // for SmartPointer
35 #include "vtkVector.h" // For vtkVector2f
36 
37 class vtkCallbackCommand;
38 class vtkContext2D;
39 class vtkControlPointsAddPointItem;
41 class vtkPoints2D;
42 class vtkTransform2D;
43 
44 class VTKCHARTSCORE_EXPORT vtkControlPointsItem : public vtkPlot
45 {
46 public:
47  vtkTypeMacro(vtkControlPointsItem, vtkPlot);
48  void PrintSelf(ostream& os, vtkIndent indent) override;
49 
50  // Events fires by this class (and subclasses).
51  // \li CurrentPointChangedEvent is fired when the current point index is changed.
52  // \li CurrentPointEditEvent is fired to request the application to show UI to
53  // edit the current point.
54  // \li vtkCommand::StartEvent and vtkCommand::EndEvent is fired
55  // to mark groups of changes to control points.
56  enum
57  {
58  CurrentPointChangedEvent = vtkCommand::UserEvent,
59  CurrentPointEditEvent
60  };
61 
66  void GetBounds(double bounds[4]) override;
67 
69 
74  vtkSetVector4Macro(UserBounds, double);
75  vtkGetVector4Macro(UserBounds, double);
77 
79 
84  vtkSetVector4Macro(ValidBounds, double);
85  vtkGetVector4Macro(ValidBounds, double);
87 
89 
93  vtkGetMacro(ScreenPointRadius, float);
94  vtkSetMacro(ScreenPointRadius, float);
96 
102  bool Paint(vtkContext2D* painter) override;
103 
107  void SelectPoint(vtkIdType pointId);
108 
114  void SelectPoint(double* currentPoint);
115 
120 
124  void DeselectPoint(vtkIdType pointId);
125 
131  void DeselectPoint(double* currentPoint);
132 
137 
143 
149  void ToggleSelectPoint(double* currentPoint);
150 
154  bool SelectPoints(const vtkVector2f& min, const vtkVector2f& max) override;
155 
160 
165  vtkIdType FindPoint(double* pos);
166 
172  bool IsOverPoint(double* pos, vtkIdType pointId);
173 
178 
184  void GetControlPointsIds(vtkIdTypeArray* ids, bool excludeFirstAndLast = false) const;
185 
187 
192  vtkGetMacro(StrokeMode, bool);
194 
196 
202  vtkSetMacro(SwitchPointsMode, bool);
203  vtkGetMacro(SwitchPointsMode, bool);
205 
207 
211  vtkSetMacro(EndPointsXMovable, bool);
212  vtkGetMacro(EndPointsXMovable, bool);
213  vtkSetMacro(EndPointsYMovable, bool);
214  vtkGetMacro(EndPointsYMovable, bool);
215  virtual bool GetEndPointsMovable();
217 
219 
223  vtkSetMacro(EndPointsRemovable, bool);
224  vtkGetMacro(EndPointsRemovable, bool);
226 
228 
232  vtkSetMacro(ShowLabels, bool);
233  vtkGetMacro(ShowLabels, bool);
235 
237 
240  vtkSetStringMacro(LabelFormat);
241  vtkGetStringMacro(LabelFormat);
243 
249  virtual vtkIdType AddPoint(double* newPos) = 0;
250 
256  virtual vtkIdType RemovePoint(double* pos) = 0;
257 
263 
267  inline void RemoveCurrentPoint();
268 
272  virtual vtkIdType GetNumberOfPoints() const = 0;
273 
279  virtual void GetControlPoint(vtkIdType index, double* point) const = 0;
280 
285  virtual void SetControlPoint(vtkIdType index, double* point) = 0;
286 
296 
302  void MovePoints(const vtkVector2f& translation, bool dontMoveFirstAndLast = false);
303 
312  void SpreadPoints(float factor, vtkIdTypeArray* pointIds);
313 
319  void SpreadPoints(float factor, bool dontSpreadFirstAndLast = false);
320 
326 
331 
333 
336  vtkGetObjectMacro(SelectedPointPen, vtkPen);
338 
340 
344  vtkGetObjectMacro(SelectedPointBrush, vtkBrush);
346 
348 
354  vtkGetMacro(UseAddPointItem, bool);
355  vtkSetMacro(UseAddPointItem, bool);
356  vtkBooleanMacro(UseAddPointItem, bool);
358 
364 
369  void ResetBounds();
370 
372 
375  bool MouseButtonPressEvent(const vtkContextMouseEvent& mouse) override;
376  bool MouseDoubleClickEvent(const vtkContextMouseEvent& mouse) override;
377  bool MouseButtonReleaseEvent(const vtkContextMouseEvent& mouse) override;
378  bool MouseMoveEvent(const vtkContextMouseEvent& mouse) override;
379  bool KeyPressEvent(const vtkContextKeyEvent& key) override;
380  bool KeyReleaseEvent(const vtkContextKeyEvent& key) override;
382 
383 protected:
386 
388 
389  void StartChanges();
390  void EndChanges();
393  void Interaction();
395  int GetInteractionsCount() const;
396  virtual void emitEvent(unsigned long event, void* params = nullptr) = 0;
397 
398  static void CallComputePoints(
399  vtkObject* sender, unsigned long event, void* receiver, void* params);
400 
402 
406  virtual void ComputePoints();
409 
415  bool Hit(const vtkContextMouseEvent& mouse) override;
416 
418 
422  bool ClampValidDataPos(double pos[2]);
423  bool ClampValidScreenPos(double pos[2]);
425 
427 
433  virtual void DrawPoint(vtkContext2D* painter, vtkIdType index);
435 
436  void SetCurrentPointPos(const vtkVector2f& newPos);
440 
441  inline vtkVector2f GetSelectionCenterOfMass() const;
443 
444  void Stroke(const vtkVector2f& newPos);
445  virtual void EditPoint(float vtkNotUsed(tX), float vtkNotUsed(tY));
446 
451 
452  void AddPointId(vtkIdType addedPointId);
453 
459 
464 
471  virtual void ComputeBounds(double* bounds);
472 
480 
481  double Bounds[4];
482  double UserBounds[4];
483  double ValidBounds[4];
484 
487 
501  char* LabelFormat;
502 
503 private:
505  void operator=(const vtkControlPointsItem&) = delete;
506 
507  void ComputeBounds();
508 
509  vtkIdType RemovePointId(vtkIdType removedPointId);
510 
511  bool UseAddPointItem = false;
513 };
514 
515 //-----------------------------------------------------------------------------
517 {
518  this->RemovePoint(this->GetCurrentPoint());
519 }
520 
521 //-----------------------------------------------------------------------------
523 {
524  return this->GetCenterOfMass(this->Selection);
525 }
526 
527 #endif
provides a brush that fills shapes drawn by vtkContext2D.
Definition: vtkBrush.h:38
supports function callbacks
Class for drawing 2D primitives to a graphical context.
Definition: vtkContext2D.h:53
data structure to represent key events.
data structure to represent mouse events.
Abstract class for control points items.
void SetCurrentPoint(vtkIdType index)
Sets the current point selected.
virtual vtkIdType RemovePoint(double *pos)=0
Remove a point of the function.
virtual void DrawPoint(vtkContext2D *painter, vtkIdType index)
bool MouseButtonReleaseEvent(const vtkContextMouseEvent &mouse) override
Mouse button release event.
static void CallComputePoints(vtkObject *sender, unsigned long event, void *receiver, void *params)
void SpreadPoints(float factor, bool dontSpreadFirstAndLast=false)
Utility function to spread all the control points of a given factor If dontSpreadFirstAndLast is true...
bool IsEndPointPicked()
Return true if any of the end points is current point or part of the selection.
~vtkControlPointsItem() override
vtkCallbackCommand * Callback
bool MouseDoubleClickEvent(const vtkContextMouseEvent &mouse) override
Mouse button double click event.
virtual void ComputeBounds(double *bounds)
Compute the bounds for this item.
void DeselectPoint(double *currentPoint)
Utility function that unselects a point providing its coordinates.
virtual void GetControlPoint(vtkIdType index, double *point) const =0
Returns the x and y coordinates as well as the midpoint and sharpness of the control point correspond...
vtkIdType GetCurrentPoint() const
Returns the current point ID selected or -1 if there is no point current.
bool Paint(vtkContext2D *painter) override
Paint the points with a fixed size (cosmetic) which doesn't depend on the scene zoom factor.
void AddPointId(vtkIdType addedPointId)
bool MouseButtonPressEvent(const vtkContextMouseEvent &mouse) override
Mouse and key events.
void ToggleSelectPoint(double *currentPoint)
Utility function that toggles the selection a point providing its coordinates.
void ToggleSelectPoint(vtkIdType pointId)
Toggle the selection of a point by its ID.
virtual void SetControlPoint(vtkIdType index, double *point)=0
Sets the x and y coordinates as well as the midpoint and sharpness of the control point corresponding...
void MovePoints(const vtkVector2f &translation, bool dontMoveFirstAndLast=false)
Utility function to move all the control points of the given translation If dontMoveFirstAndLast is t...
void StartInteractionIfNotStarted()
void ResetBounds()
Recompute the bounds next time they are requested.
bool IsPointRemovable(vtkIdType pointId)
Return true if the point is removable.
bool SelectPoints(const vtkVector2f &min, const vtkVector2f &max) override
Select all points in the specified rectangle.
virtual void ComputePoints()
Must be reimplemented by subclasses to calculate the points to draw.
virtual bool GetEndPointsMovable()
vtkIdType RemovePoint(vtkIdType pointId)
Remove a point give its id.
bool KeyPressEvent(const vtkContextKeyEvent &key) override
Key press event.
void GetBounds(double bounds[4]) override
Bounds of the item, typically the bound of all the control points except if custom bounds have been s...
vtkVector2f GetSelectionCenterOfMass() const
void MoveCurrentPoint(const vtkVector2f &translation)
void SpreadPoints(float factor, vtkIdTypeArray *pointIds)
Spread the points referred by pointIds If factor > 0, points are moved away from each other.
virtual vtkIdType AddPoint(double *newPos)=0
Add a point to the function.
virtual void emitEvent(unsigned long event, void *params=nullptr)=0
vtkIdType FindPoint(double *pos)
Returns the vtkIdType of the point given its coordinates and a tolerance based on the screen point si...
void RemoveCurrentPoint()
Remove the current point.
void SelectPoint(double *currentPoint)
Utility function that selects a point providing its coordinates.
bool Hit(const vtkContextMouseEvent &mouse) override
Returns true if the supplied x, y are within the bounds or on a control point.
vtkTransform2D * Transform
void Stroke(const vtkVector2f &newPos)
virtual vtkMTimeType GetControlPointsMTime()=0
void SelectAllPoints()
Select all the points.
vtkIdType SetPointPos(vtkIdType point, const vtkVector2f &newPos)
void DrawUnselectedPoints(vtkContext2D *painter)
Internal function that paints a collection of points and optionally excludes some.
bool IsOverPoint(double *pos, vtkIdType pointId)
Returns true if pos is above the pointId point, false otherwise.
vtkIdType MovePoint(vtkIdType point, const vtkVector2f &translation)
void DeselectAllPoints()
Unselect all the previously selected points.
void DrawSelectedPoints(vtkContext2D *painter)
virtual vtkIdType GetNumberOfPoints() const =0
Returns the total number of points.
vtkVector2f GetCenterOfMass(vtkIdTypeArray *pointIDs) const
bool ClampValidDataPos(double pos[2])
Clamp the given 2D pos into the bounds of the function.
void SetCurrentPointPos(const vtkVector2f &newPos)
vtkPlot * GetAddPointItem()
Item dedicated to add point, to be added below all other items.
void SelectPoint(vtkIdType pointId)
Select a point by its ID.
bool KeyReleaseEvent(const vtkContextKeyEvent &key) override
Key release event.
vtkIdType GetControlPointId(double *pos)
Returns the id of the control point exactly matching pos, -1 if not found.
void MovePoints(const vtkVector2f &translation, vtkIdTypeArray *pointIds)
Move the points referred by pointIds by a given translation.
int GetInteractionsCount() const
vtkIdType GetNumberOfSelectedPoints() const
Return the number of selected points.
virtual vtkStdString GetControlPointLabel(vtkIdType index)
Generate label for a control point.
void GetControlPointsIds(vtkIdTypeArray *ids, bool excludeFirstAndLast=false) const
Utility function that returns an array of all the control points IDs Typically: [0,...
void DeselectPoint(vtkIdType pointId)
Unselect a point by its ID.
bool ClampValidScreenPos(double pos[2])
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
bool MouseMoveEvent(const vtkContextMouseEvent &mouse) override
Mouse move event.
virtual void EditPoint(float vtkNotUsed(tX), float vtkNotUsed(tY))
dynamic, self-adjusting array of vtkIdType
a simple class to control print indentation
Definition: vtkIndent.h:34
abstract base class for most VTK objects
Definition: vtkObject.h:54
provides a pen that draws the outlines of shapes drawn by vtkContext2D.
Definition: vtkPen.h:37
a vtkContextItem that draws handles around a point of a piecewise function
Abstract class for 2D plots.
Definition: vtkPlot.h:47
vtkIdTypeArray * Selection
Selected indices for the table the plot is rendering.
Definition: vtkPlot.h:481
represent and manipulate 2D points
Definition: vtkPoints2D.h:34
Wrapper around std::string to keep symbols short.
Definition: vtkStdString.h:35
describes linear transformations via a 3x3 matrix
@ point
Definition: vtkX3D.h:242
@ key
Definition: vtkX3D.h:263
@ translation
Definition: vtkX3D.h:238
@ index
Definition: vtkX3D.h:252
int vtkIdType
Definition: vtkType.h:338
vtkTypeUInt32 vtkMTimeType
Definition: vtkType.h:293
#define max(a, b)