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.
330 lines
8.2 KiB
C++
330 lines
8.2 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkFinitePlaneRepresentation.h
|
|
|
|
Copyright (c)
|
|
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 vtkFinitePlaneRepresentation
|
|
* @brief represent the vtkFinitePlaneWidget.
|
|
*
|
|
* This class is a concrete representation for the vtkFinitePlaneWidget. It
|
|
* represents a plane with three handles: one on two faces, plus a
|
|
* center handle. Through interaction with the widget, the plane
|
|
* representation can be arbitrarily positioned and modified in the 3D space.
|
|
*
|
|
* To use this representation, you normally use the PlaceWidget() method
|
|
* to position the widget at a specified region in space.
|
|
*
|
|
* @sa
|
|
* vtkFinitePlaneWidget vtkImplicitPlaneWidget2
|
|
*/
|
|
|
|
#ifndef vtkFinitePlaneRepresentation_h
|
|
#define vtkFinitePlaneRepresentation_h
|
|
|
|
#include "vtkInteractionWidgetsModule.h" // For export macro
|
|
#include "vtkWidgetRepresentation.h"
|
|
|
|
class vtkActor;
|
|
class vtkBox;
|
|
class vtkCellPicker;
|
|
class vtkConeSource;
|
|
class vtkFeatureEdges;
|
|
class vtkLineSource;
|
|
class vtkPolyData;
|
|
class vtkPolyDataMapper;
|
|
class vtkProperty;
|
|
class vtkSphereSource;
|
|
class vtkTransform;
|
|
class vtkTubeFilter;
|
|
|
|
class VTKINTERACTIONWIDGETS_EXPORT vtkFinitePlaneRepresentation : public vtkWidgetRepresentation
|
|
{
|
|
public:
|
|
/**
|
|
* Instantiate the class.
|
|
*/
|
|
static vtkFinitePlaneRepresentation* New();
|
|
|
|
//@{
|
|
/**
|
|
* Standard vtkObject methods
|
|
*/
|
|
vtkTypeMacro(vtkFinitePlaneRepresentation, vtkWidgetRepresentation);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
//@}
|
|
|
|
/**
|
|
* Grab the polydata that defines the plane. The polydata contains a single
|
|
* polygon.
|
|
*/
|
|
void GetPolyData(vtkPolyData* pd);
|
|
|
|
//@{
|
|
/**
|
|
* Get the handle properties (the little balls are the handles). The
|
|
* properties of the handles, when selected or normal, can be
|
|
* specified.
|
|
*/
|
|
vtkGetObjectMacro(V1HandleProperty, vtkProperty);
|
|
vtkGetObjectMacro(V2HandleProperty, vtkProperty);
|
|
vtkGetObjectMacro(SelectedHandleProperty, vtkProperty);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get the plane properties. The
|
|
* properties of the plane when selected and normal can be
|
|
* set.
|
|
*/
|
|
vtkGetObjectMacro(PlaneProperty, vtkProperty);
|
|
vtkGetObjectMacro(SelectedPlaneProperty, vtkProperty);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Turn on/off tubing of the wire outline of the plane. The tube thickens
|
|
* the line by wrapping with a vtkTubeFilter.
|
|
*/
|
|
vtkSetMacro(Tubing, bool);
|
|
vtkGetMacro(Tubing, bool);
|
|
vtkBooleanMacro(Tubing, bool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Enable/disable the drawing of the plane. In some cases the plane
|
|
* interferes with the object that it is operating on (i.e., the
|
|
* plane interferes with the cut surface it produces producing
|
|
* z-buffer artifacts.)
|
|
*/
|
|
void SetDrawPlane(bool plane);
|
|
vtkGetMacro(DrawPlane, bool);
|
|
vtkBooleanMacro(DrawPlane, bool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Switches handles (the spheres) on or off by manipulating the underlying
|
|
* actor visibility.
|
|
*/
|
|
void SetHandles(bool handles);
|
|
virtual void HandlesOn();
|
|
virtual void HandlesOff();
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* These are methods that satisfy vtkWidgetRepresentation's API.
|
|
*/
|
|
void PlaceWidget(double bounds[6]) override;
|
|
void BuildRepresentation() override;
|
|
int ComputeInteractionState(int X, int Y, int modify = 0) override;
|
|
void StartWidgetInteraction(double e[2]) override;
|
|
void WidgetInteraction(double e[2]) override;
|
|
double* GetBounds() override;
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Methods supporting, and required by, the rendering process.
|
|
*/
|
|
void ReleaseGraphicsResources(vtkWindow*) override;
|
|
int RenderOpaqueGeometry(vtkViewport*) override;
|
|
int RenderTranslucentPolygonalGeometry(vtkViewport*) override;
|
|
vtkTypeBool HasTranslucentPolygonalGeometry() override;
|
|
//@}
|
|
|
|
vtkSetClampMacro(InteractionState, int, Outside, Pushing);
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the origin of the plane.
|
|
*/
|
|
void SetOrigin(double x, double y, double z);
|
|
void SetOrigin(double x[3]);
|
|
vtkGetVector3Macro(Origin, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the normal to the plane.
|
|
*/
|
|
void SetNormal(double x, double y, double z);
|
|
void SetNormal(double x[3]);
|
|
vtkGetVector3Macro(Normal, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the v1 vector of the plane.
|
|
*/
|
|
void SetV1(double x, double y);
|
|
void SetV1(double x[2]);
|
|
vtkGetVector2Macro(V1, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the v2 vector of the plane.
|
|
*/
|
|
void SetV2(double x, double y);
|
|
void SetV2(double x[2]);
|
|
vtkGetVector2Macro(V2, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Sets the visual appearance of the representation based on the
|
|
* state it is in. This state is usually the same as InteractionState.
|
|
*/
|
|
virtual void SetRepresentationState(int);
|
|
vtkGetMacro(RepresentationState, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get the properties on the normal (line and cone).
|
|
*/
|
|
vtkGetObjectMacro(NormalProperty, vtkProperty);
|
|
vtkGetObjectMacro(SelectedNormalProperty, vtkProperty);
|
|
//@}
|
|
|
|
// Methods to manipulate the plane
|
|
void TranslateOrigin(double* p1, double* p2);
|
|
void MovePoint1(double* p1, double* p2);
|
|
void MovePoint2(double* p1, double* p2);
|
|
void Push(double* p1, double* p2);
|
|
void Rotate(int X, int Y, double* p1, double* p2, double* vpn);
|
|
|
|
enum _InteractionState
|
|
{
|
|
Outside = 0,
|
|
MoveOrigin,
|
|
ModifyV1,
|
|
ModifyV2,
|
|
Moving,
|
|
Rotating,
|
|
Pushing
|
|
};
|
|
|
|
/*
|
|
* Register internal Pickers within PickingManager
|
|
*/
|
|
void RegisterPickers() override;
|
|
|
|
protected:
|
|
vtkFinitePlaneRepresentation();
|
|
~vtkFinitePlaneRepresentation() override;
|
|
|
|
virtual void CreateDefaultProperties();
|
|
|
|
// Size the glyphs representing hot spots (e.g., handles)
|
|
virtual void SizeHandles();
|
|
|
|
void SetHighlightNormal(int highlight);
|
|
void SetHighlightPlane(int highlight);
|
|
void SetHighlightHandle(vtkProp* prop);
|
|
|
|
double LastEventPosition[3];
|
|
|
|
// the representation state
|
|
int RepresentationState;
|
|
|
|
// the origin
|
|
vtkSphereSource* OriginGeometry;
|
|
vtkPolyDataMapper* OriginMapper;
|
|
vtkActor* OriginActor;
|
|
double Origin[3];
|
|
|
|
// the normal
|
|
double Normal[3];
|
|
|
|
// the previous normal
|
|
double PreviousNormal[3];
|
|
|
|
// the rotation transform
|
|
vtkTransform* Transform;
|
|
|
|
// the X Vector
|
|
vtkSphereSource* V1Geometry;
|
|
vtkPolyDataMapper* V1Mapper;
|
|
vtkActor* V1Actor;
|
|
double V1[3];
|
|
|
|
// the Y Vector
|
|
vtkSphereSource* V2Geometry;
|
|
vtkPolyDataMapper* V2Mapper;
|
|
vtkActor* V2Actor;
|
|
double V2[3];
|
|
|
|
// The + normal cone
|
|
vtkConeSource* ConeSource;
|
|
vtkPolyDataMapper* ConeMapper;
|
|
vtkActor* ConeActor;
|
|
|
|
// The + normal line
|
|
vtkLineSource* LineSource;
|
|
vtkPolyDataMapper* LineMapper;
|
|
vtkActor* LineActor;
|
|
|
|
// The - normal cone
|
|
vtkConeSource* ConeSource2;
|
|
vtkPolyDataMapper* ConeMapper2;
|
|
vtkActor* ConeActor2;
|
|
|
|
// The - normal line
|
|
vtkLineSource* LineSource2;
|
|
vtkPolyDataMapper* LineMapper2;
|
|
vtkActor* LineActor2;
|
|
|
|
// The finite plane
|
|
vtkPolyData* PlanePolyData;
|
|
vtkPolyDataMapper* PlaneMapper;
|
|
vtkActor* PlaneActor;
|
|
|
|
// Optional tubes are represented by extracting boundary edges
|
|
vtkFeatureEdges* Edges;
|
|
vtkTubeFilter* EdgesTuber;
|
|
vtkPolyDataMapper* EdgesMapper;
|
|
vtkActor* EdgesActor;
|
|
bool Tubing; // control whether tubing is on
|
|
bool DrawPlane; // control whether plane is on
|
|
|
|
// Picking objects
|
|
vtkCellPicker* HandlePicker;
|
|
vtkActor* CurrentHandle;
|
|
|
|
// Transform the planes (used for rotations)
|
|
vtkTransform* TransformRotation;
|
|
|
|
// Support GetBounds() method
|
|
vtkBox* BoundingBox;
|
|
|
|
// Properties used to control the appearance of selected objects and
|
|
// the manipulator in general.
|
|
vtkProperty* OriginHandleProperty;
|
|
vtkProperty* V1HandleProperty;
|
|
vtkProperty* V2HandleProperty;
|
|
vtkProperty* SelectedHandleProperty;
|
|
vtkProperty* PlaneProperty;
|
|
vtkProperty* SelectedPlaneProperty;
|
|
vtkProperty* NormalProperty;
|
|
vtkProperty* SelectedNormalProperty;
|
|
|
|
private:
|
|
vtkFinitePlaneRepresentation(const vtkFinitePlaneRepresentation&) = delete;
|
|
void operator=(const vtkFinitePlaneRepresentation&) = delete;
|
|
};
|
|
|
|
#endif
|