VTK  9.3.20240416
vtkControlPointsItem.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 
19 #ifndef vtkControlPointsItem_h
20 #define vtkControlPointsItem_h
21 
22 #include "vtkPlot.h"
23 
24 #include "vtkChartsCoreModule.h" // For export macro
25 #include "vtkCommand.h" // For vtkCommand enum
26 #include "vtkSmartPointer.h" // For SmartPointer
27 #include "vtkVector.h" // For vtkVector2f
28 #include <string> // Used by GetControlPointLabel
29 
30 VTK_ABI_NAMESPACE_BEGIN
31 class vtkCallbackCommand;
32 class vtkContext2D;
33 class vtkControlPointsAddPointItem;
35 class vtkPoints2D;
36 class vtkTransform2D;
37 
38 class VTKCHARTSCORE_EXPORT vtkControlPointsItem : public vtkPlot
39 {
40 public:
41  vtkTypeMacro(vtkControlPointsItem, vtkPlot);
42  void PrintSelf(ostream& os, vtkIndent indent) override;
43 
44  // Events fires by this class (and subclasses).
45  // \li CurrentPointChangedEvent is fired when the current point index is changed.
46  // \li CurrentPointEditEvent is fired to request the application to show UI to
47  // edit the current point.
48  // \li vtkCommand::StartEvent and vtkCommand::EndEvent is fired
49  // to mark groups of changes to control points.
50  enum
51  {
52  CurrentPointChangedEvent = vtkCommand::UserEvent,
53  CurrentPointEditEvent
54  };
55 
60  void GetBounds(double bounds[4]) override;
61 
63 
68  vtkSetVector4Macro(UserBounds, double);
69  vtkGetVector4Macro(UserBounds, double);
71 
73 
78  vtkSetVector4Macro(ValidBounds, double);
79  vtkGetVector4Macro(ValidBounds, double);
81 
83 
87  vtkGetMacro(ScreenPointRadius, float);
88  vtkSetMacro(ScreenPointRadius, float);
90 
92 
96  vtkGetMacro(DrawPoints, bool);
97  vtkSetMacro(DrawPoints, bool);
98  vtkBooleanMacro(DrawPoints, bool);
100 
106  bool Paint(vtkContext2D* painter) override;
107 
111  void SelectPoint(vtkIdType pointId);
112 
118  void SelectPoint(double* currentPoint);
119 
124 
128  void DeselectPoint(vtkIdType pointId);
129 
135  void DeselectPoint(double* currentPoint);
136 
141 
147 
153  void ToggleSelectPoint(double* currentPoint);
154 
158  bool SelectPoints(const vtkVector2f& min, const vtkVector2f& max) override;
159 
164 
169  vtkIdType FindPoint(double* pos);
170 
176  bool IsOverPoint(double* pos, vtkIdType pointId);
177 
182 
188  void GetControlPointsIds(vtkIdTypeArray* ids, bool excludeFirstAndLast = false) const;
189 
191 
196  vtkSetMacro(StrokeMode, bool);
197  vtkGetMacro(StrokeMode, bool);
199 
201 
207  vtkSetMacro(SwitchPointsMode, bool);
208  vtkGetMacro(SwitchPointsMode, bool);
210 
212 
216  vtkSetMacro(EndPointsXMovable, bool);
217  vtkGetMacro(EndPointsXMovable, bool);
218  vtkSetMacro(EndPointsYMovable, bool);
219  vtkGetMacro(EndPointsYMovable, bool);
220  virtual bool GetEndPointsMovable();
222 
224 
228  vtkSetMacro(EndPointsRemovable, bool);
229  vtkGetMacro(EndPointsRemovable, bool);
231 
233 
237  vtkSetMacro(ShowLabels, bool);
238  vtkGetMacro(ShowLabels, bool);
240 
242 
245  vtkSetStringMacro(LabelFormat);
246  vtkGetStringMacro(LabelFormat);
248 
254  virtual vtkIdType AddPoint(double* newPos) = 0;
255 
261  virtual vtkIdType RemovePoint(double* pos) = 0;
262 
268 
273 
277  virtual vtkIdType GetNumberOfPoints() const = 0;
278 
284  virtual void GetControlPoint(vtkIdType index, double* point) const = 0;
285 
290  virtual void SetControlPoint(vtkIdType index, double* point) = 0;
291 
301 
307  void MovePoints(const vtkVector2f& translation, bool dontMoveFirstAndLast = false);
308 
317  void SpreadPoints(float factor, vtkIdTypeArray* pointIds);
318 
324  void SpreadPoints(float factor, bool dontSpreadFirstAndLast = false);
325 
331 
336 
338 
341  vtkGetObjectMacro(SelectedPointPen, vtkPen);
343 
345 
349  vtkGetObjectMacro(SelectedPointBrush, vtkBrush);
351 
353 
359  vtkGetMacro(UseAddPointItem, bool);
360  vtkSetMacro(UseAddPointItem, bool);
361  vtkBooleanMacro(UseAddPointItem, bool);
363 
369 
374  void ResetBounds();
375 
377 
380  bool MouseButtonPressEvent(const vtkContextMouseEvent& mouse) override;
381  bool MouseDoubleClickEvent(const vtkContextMouseEvent& mouse) override;
382  bool MouseButtonReleaseEvent(const vtkContextMouseEvent& mouse) override;
383  bool MouseMoveEvent(const vtkContextMouseEvent& mouse) override;
384  bool KeyPressEvent(const vtkContextKeyEvent& key) override;
385  bool KeyReleaseEvent(const vtkContextKeyEvent& key) override;
387 
388 protected:
391 
393 
394  void StartChanges();
395  void EndChanges();
398  void Interaction();
400  int GetInteractionsCount() const;
401  virtual void emitEvent(unsigned long event, void* params = nullptr) = 0;
402 
403  static void CallComputePoints(
404  vtkObject* sender, unsigned long event, void* receiver, void* params);
405 
407 
411  virtual void ComputePoints();
414 
420  bool Hit(const vtkContextMouseEvent& mouse) override;
421 
423 
427  bool ClampValidDataPos(double pos[2]);
428  bool ClampValidScreenPos(double pos[2]);
430 
432 
438  virtual void DrawPoint(vtkContext2D* painter, vtkIdType index);
440 
441  void SetCurrentPointPos(const vtkVector2f& newPos);
445 
448 
449  void Stroke(const vtkVector2f& newPos);
450  virtual void EditPoint(float vtkNotUsed(tX), float vtkNotUsed(tY));
451 
456 
457  void AddPointId(vtkIdType addedPointId);
458 
464 
469 
476  virtual void ComputeBounds(double* bounds);
477 
481  int BlockUpdates = 0;
482  int StartedInteractions = 0;
483  int StartedChanges = 0;
484  vtkIdType CurrentPoint = -1;
485 
486  double Bounds[4] = { 0., -1., 0., -1. };
487  double UserBounds[4] = { 0., -1., 0., -1. };
488  double ValidBounds[4] = { 0., -1., 0., -1. };
489 
491  float ScreenPointRadius = 6.f;
492 
493  bool DrawPoints = true;
494  bool StrokeMode = false;
495  bool SwitchPointsMode = false;
496  bool MouseMoved = false;
497  bool EnforceValidFunction = true;
498  vtkIdType PointToDelete = -1;
499  bool PointAboutToBeDeleted = false;
500  vtkIdType PointToToggle = -1;
501  bool PointAboutToBeToggled = false;
502  bool InvertShadow = false;
503  bool EndPointsXMovable = true;
504  bool EndPointsYMovable = true;
505  bool EndPointsRemovable = true;
506  bool ShowLabels = false;
507  char* LabelFormat = nullptr;
508 
509 private:
511  void operator=(const vtkControlPointsItem&) = delete;
512 
513  void ComputeBounds();
514 
515  vtkIdType RemovePointId(vtkIdType removedPointId);
516 
517  bool UseAddPointItem = false;
519 };
520 VTK_ABI_NAMESPACE_END
521 #endif
provides a brush that fills shapes drawn by vtkContext2D.
Definition: vtkBrush.h:89
supports function callbacks
Class for drawing 2D primitives to a graphical context.
Definition: vtkContext2D.h:69
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.
vtkNew< vtkCallbackCommand > Callback
virtual vtkIdType RemovePoint(double *pos)=0
Remove a point of the function.
virtual void DrawPoint(vtkContext2D *painter, vtkIdType index)
Internal function that paints a collection of points and optionally excludes some.
bool MouseButtonReleaseEvent(const vtkContextMouseEvent &mouse) override
Mouse and key events.
static void CallComputePoints(vtkObject *sender, unsigned long event, void *receiver, void *params)
vtkNew< vtkBrush > SelectedPointBrush
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
bool MouseDoubleClickEvent(const vtkContextMouseEvent &mouse) override
Mouse and key events.
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()
If EndPointsMovable is false, the two end points will not be moved.
vtkIdType RemovePoint(vtkIdType pointId)
Remove a point give its id.
bool KeyPressEvent(const vtkContextKeyEvent &key) override
Mouse and key events.
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.
void Stroke(const vtkVector2f &newPos)
virtual std::string GetControlPointLabel(vtkIdType index)
Generate label for a control point.
virtual vtkMTimeType GetControlPointsMTime()=0
Must be reimplemented by subclasses to calculate the points to draw.
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)
Internal function that paints a collection of points and optionally excludes some.
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
Mouse and key events.
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.
void GetControlPointsIds(vtkIdTypeArray *ids, bool excludeFirstAndLast=false) const
Utility function that returns an array of all the control points IDs Typically: [0,...
vtkNew< vtkTransform2D > ControlPointsTransform
void DeselectPoint(vtkIdType pointId)
Unselect a point by its ID.
bool ClampValidScreenPos(double pos[2])
Clamp the given 2D pos into the bounds of the function.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
vtkNew< vtkPen > SelectedPointPen
bool MouseMoveEvent(const vtkContextMouseEvent &mouse) override
Mouse and key events.
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:108
abstract base class for most VTK objects
Definition: vtkObject.h:162
provides a pen that draws the outlines of shapes drawn by vtkContext2D.
Definition: vtkPen.h:78
a vtkContextItem that draws handles around a point of a piecewise function
Abstract class for 2D plots.
Definition: vtkPlot.h:153
represent and manipulate 2D points
Definition: vtkPoints2D.h:27
describes linear transformations via a 3x3 matrix
const std::string pointIds
@ point
Definition: vtkX3D.h:236
@ key
Definition: vtkX3D.h:257
@ translation
Definition: vtkX3D.h:232
@ index
Definition: vtkX3D.h:246
@ string
Definition: vtkX3D.h:490
int vtkIdType
Definition: vtkType.h:315
vtkTypeUInt32 vtkMTimeType
Definition: vtkType.h:270
#define max(a, b)