VTK
|
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: vtkSplineWidget.h 00005 00006 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 00007 All rights reserved. 00008 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00009 00010 This software is distributed WITHOUT ANY WARRANTY; without even 00011 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00012 PURPOSE. See the above copyright notice for more information. 00013 00014 =========================================================================*/ 00093 #ifndef __vtkSplineWidget_h 00094 #define __vtkSplineWidget_h 00095 00096 #include "vtk3DWidget.h" 00097 00098 class vtkActor; 00099 class vtkCellPicker; 00100 class vtkParametricSpline; 00101 class vtkParametricFunctionSource; 00102 class vtkPlaneSource; 00103 class vtkPoints; 00104 class vtkPolyData; 00105 class vtkProp; 00106 class vtkProperty; 00107 class vtkSphereSource; 00108 class vtkTransform; 00109 00110 #define VTK_PROJECTION_YZ 0 00111 #define VTK_PROJECTION_XZ 1 00112 #define VTK_PROJECTION_XY 2 00113 #define VTK_PROJECTION_OBLIQUE 3 00114 00115 class VTK_WIDGETS_EXPORT vtkSplineWidget : public vtk3DWidget 00116 { 00117 public: 00119 static vtkSplineWidget *New(); 00120 00121 vtkTypeMacro(vtkSplineWidget,vtk3DWidget); 00122 void PrintSelf(ostream& os, vtkIndent indent); 00123 00125 00126 virtual void SetEnabled(int); 00127 virtual void PlaceWidget(double bounds[6]); 00128 void PlaceWidget() 00129 {this->Superclass::PlaceWidget();} 00130 void PlaceWidget(double xmin, double xmax, double ymin, double ymax, 00131 double zmin, double zmax) 00132 {this->Superclass::PlaceWidget(xmin,xmax,ymin,ymax,zmin,zmax);} 00134 00136 00142 vtkSetMacro(ProjectToPlane,int); 00143 vtkGetMacro(ProjectToPlane,int); 00144 vtkBooleanMacro(ProjectToPlane,int); 00146 00149 void SetPlaneSource(vtkPlaneSource* plane); 00150 00151 vtkSetClampMacro(ProjectionNormal,int,VTK_PROJECTION_YZ,VTK_PROJECTION_OBLIQUE); 00152 vtkGetMacro(ProjectionNormal,int); 00153 void SetProjectionNormalToXAxes() 00154 { this->SetProjectionNormal(0); } 00155 void SetProjectionNormalToYAxes() 00156 { this->SetProjectionNormal(1); } 00157 void SetProjectionNormalToZAxes() 00158 { this->SetProjectionNormal(2); } 00159 void SetProjectionNormalToOblique() 00160 { this->SetProjectionNormal(3); } 00161 00163 00168 void SetProjectionPosition(double position); 00169 vtkGetMacro(ProjectionPosition, double); 00171 00178 void GetPolyData(vtkPolyData *pd); 00179 00181 00184 virtual void SetHandleProperty(vtkProperty*); 00185 vtkGetObjectMacro(HandleProperty, vtkProperty); 00186 virtual void SetSelectedHandleProperty(vtkProperty*); 00187 vtkGetObjectMacro(SelectedHandleProperty, vtkProperty); 00189 00191 00193 virtual void SetLineProperty(vtkProperty*); 00194 vtkGetObjectMacro(LineProperty, vtkProperty); 00195 virtual void SetSelectedLineProperty(vtkProperty*); 00196 vtkGetObjectMacro(SelectedLineProperty, vtkProperty); 00198 00200 00201 virtual void SetNumberOfHandles(int npts); 00202 vtkGetMacro(NumberOfHandles, int); 00204 00206 00208 void SetResolution(int resolution); 00209 vtkGetMacro(Resolution,int); 00211 00213 00219 virtual void SetParametricSpline(vtkParametricSpline*); 00220 vtkGetObjectMacro(ParametricSpline,vtkParametricSpline); 00222 00224 00226 void SetHandlePosition(int handle, double x, double y, double z); 00227 void SetHandlePosition(int handle, double xyz[3]); 00228 void GetHandlePosition(int handle, double xyz[3]); 00229 double* GetHandlePosition(int handle); 00231 00233 00238 void SetClosed(int closed); 00239 vtkGetMacro(Closed,int); 00240 vtkBooleanMacro(Closed,int); 00242 00246 int IsClosed(); 00247 00251 double GetSummedLength(); 00252 00257 void InitializeHandles(vtkPoints* points); 00258 00259 protected: 00260 vtkSplineWidget(); 00261 ~vtkSplineWidget(); 00262 00263 //BTX - manage the state of the widget 00264 int State; 00265 enum WidgetState 00266 { 00267 Start=0, 00268 Moving, 00269 Scaling, 00270 Spinning, 00271 Inserting, 00272 Erasing, 00273 Outside 00274 }; 00275 //ETX 00276 00277 //handles the events 00278 static void ProcessEvents(vtkObject* object, 00279 unsigned long event, 00280 void* clientdata, 00281 void* calldata); 00282 00283 // ProcessEvents() dispatches to these methods. 00284 void OnLeftButtonDown(); 00285 void OnLeftButtonUp(); 00286 void OnMiddleButtonDown(); 00287 void OnMiddleButtonUp(); 00288 void OnRightButtonDown(); 00289 void OnRightButtonUp(); 00290 void OnMouseMove(); 00291 00292 // Controlling vars 00293 int ProjectionNormal; 00294 double ProjectionPosition; 00295 int ProjectToPlane; 00296 vtkPlaneSource* PlaneSource; 00297 00298 // Projection capabilities 00299 void ProjectPointsToPlane(); 00300 void ProjectPointsToOrthoPlane(); 00301 void ProjectPointsToObliquePlane(); 00302 00303 // The spline 00304 vtkParametricSpline *ParametricSpline; 00305 vtkParametricFunctionSource *ParametricFunctionSource; 00306 int NumberOfHandles; 00307 int Closed; 00308 void BuildRepresentation(); 00309 00310 // The line segments 00311 vtkActor *LineActor; 00312 void HighlightLine(int highlight); 00313 int Resolution; 00314 00315 // Glyphs representing hot spots (e.g., handles) 00316 vtkActor **Handle; 00317 vtkSphereSource **HandleGeometry; 00318 void Initialize(); 00319 int HighlightHandle(vtkProp *prop); //returns handle index or -1 on fail 00320 virtual void SizeHandles(); 00321 void InsertHandleOnLine(double* pos); 00322 void EraseHandle(const int&); 00323 00324 // Do the picking 00325 vtkCellPicker *HandlePicker; 00326 vtkCellPicker *LinePicker; 00327 vtkActor *CurrentHandle; 00328 int CurrentHandleIndex; 00329 00330 // Methods to manipulate the spline. 00331 void MovePoint(double *p1, double *p2); 00332 void Scale(double *p1, double *p2, int X, int Y); 00333 void Translate(double *p1, double *p2); 00334 void Spin(double *p1, double *p2, double *vpn); 00335 00336 // Transform the control points (used for spinning) 00337 vtkTransform *Transform; 00338 00339 // Properties used to control the appearance of selected objects and 00340 // the manipulator in general. 00341 vtkProperty *HandleProperty; 00342 vtkProperty *SelectedHandleProperty; 00343 vtkProperty *LineProperty; 00344 vtkProperty *SelectedLineProperty; 00345 void CreateDefaultProperties(); 00346 00347 // For efficient spinning 00348 double Centroid[3]; 00349 void CalculateCentroid(); 00350 00351 private: 00352 vtkSplineWidget(const vtkSplineWidget&); //Not implemented 00353 void operator=(const vtkSplineWidget&); //Not implemented 00354 }; 00355 00356 #endif