00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00056 #ifndef __vtkContourRepresentation_h
00057 #define __vtkContourRepresentation_h
00058
00059 #include "vtkWidgetRepresentation.h"
00060 #include <vtkstd/vector>
00061
00062 class vtkContourLineInterpolator;
00063 class vtkPointPlacer;
00064 class vtkPolyData;
00065
00066
00067
00068 class vtkContourRepresentationPoint
00069 {
00070 public:
00071 double WorldPosition[3];
00072 double NormalizedDisplayPosition[2];
00073 };
00074
00075 class vtkContourRepresentationNode
00076 {
00077 public:
00078 double WorldPosition[3];
00079 double WorldOrientation[9];
00080 double NormalizedDisplayPosition[2];
00081 int Selected;
00082 vtkstd::vector<vtkContourRepresentationPoint*> Points;
00083 };
00084
00085 class vtkContourRepresentationInternals
00086 {
00087 public:
00088 vtkstd::vector<vtkContourRepresentationNode*> Nodes;
00089 void ClearNodes()
00090 {
00091 for(unsigned int i=0;i<this->Nodes.size();i++)
00092 {
00093 for (unsigned int j=0;j<this->Nodes[i]->Points.size();j++)
00094 {
00095 delete this->Nodes[i]->Points[j];
00096 }
00097 this->Nodes[i]->Points.clear();
00098 delete this->Nodes[i];
00099 }
00100 this->Nodes.clear();
00101 }
00102 };
00103
00104
00105 class VTK_WIDGETS_EXPORT vtkContourRepresentation : public vtkWidgetRepresentation
00106 {
00107
00108 friend class vtkContourWidget;
00109
00110 public:
00112
00113 vtkTypeMacro(vtkContourRepresentation,vtkWidgetRepresentation);
00114 void PrintSelf(ostream& os, vtkIndent indent);
00116
00118
00120 virtual int AddNodeAtWorldPosition( double x, double y, double z);
00121 virtual int AddNodeAtWorldPosition( double worldPos[3] );
00122 virtual int AddNodeAtWorldPosition( double worldPos[3],
00123 double worldOrient[9] );
00125
00127
00130 virtual int AddNodeAtDisplayPosition( double displayPos[2] );
00131 virtual int AddNodeAtDisplayPosition( int displayPos[2] );
00132 virtual int AddNodeAtDisplayPosition( int X, int Y );
00134
00136
00139 virtual int ActivateNode( double displayPos[2] );
00140 virtual int ActivateNode( int displayPos[2] );
00141 virtual int ActivateNode( int X, int Y );
00143
00144
00145
00146
00147
00148
00149 virtual int SetActiveNodeToWorldPosition( double pos[3] );
00150 virtual int SetActiveNodeToWorldPosition( double pos[3],
00151 double orient[9] );
00152
00154
00158 virtual int SetActiveNodeToDisplayPosition( double pos[2] );
00159 virtual int SetActiveNodeToDisplayPosition( int pos[2] );
00160 virtual int SetActiveNodeToDisplayPosition( int X, int Y );
00162
00164
00165 virtual int ToggleActiveNodeSelected();
00166 virtual int GetActiveNodeSelected();
00167 virtual int GetNthNodeSelected(int);
00168 virtual int SetNthNodeSelected(int);
00170
00173 virtual int GetActiveNodeWorldPosition( double pos[3] );
00174
00177 virtual int GetActiveNodeWorldOrientation( double orient[9] );
00178
00181 virtual int GetActiveNodeDisplayPosition( double pos[2] );
00182
00184 virtual int GetNumberOfNodes();
00185
00188 virtual int GetNthNodeDisplayPosition( int n, double pos[2] );
00189
00192 virtual int GetNthNodeWorldPosition( int n, double pos[3] );
00193
00196 virtual int GetNthNodeWorldOrientation( int n, double orient[9] );
00197
00199
00204 virtual int SetNthNodeDisplayPosition( int n, int X, int Y );
00205 virtual int SetNthNodeDisplayPosition( int n, int pos[2] );
00206 virtual int SetNthNodeDisplayPosition( int n, double pos[2] );
00208
00210
00213 virtual int SetNthNodeWorldPosition( int n, double pos[3] );
00214 virtual int SetNthNodeWorldPosition( int n, double pos[3],
00215 double orient[9] );
00217
00220 virtual int GetNthNodeSlope( int idx, double slope[3] );
00221
00222
00223
00224
00225
00226
00227
00228
00229 virtual int GetNumberOfIntermediatePoints( int n );
00230
00232
00235 virtual int GetIntermediatePointWorldPosition( int n,
00236 int idx, double point[3] );
00238
00240
00243 virtual int AddIntermediatePointWorldPosition( int n,
00244 double point[3] );
00246
00249 virtual int DeleteLastNode();
00250
00253 virtual int DeleteActiveNode();
00254
00256 virtual int DeleteNthNode( int n );
00257
00259 virtual void ClearAllNodes();
00260
00263 virtual int AddNodeOnContour( int X, int Y );
00264
00266
00268 vtkSetClampMacro(PixelTolerance,int,1,100);
00269 vtkGetMacro(PixelTolerance,int);
00271
00273
00275 vtkSetClampMacro(WorldTolerance, double, 0.0, VTK_DOUBLE_MAX);
00276 vtkGetMacro(WorldTolerance, double);
00278
00279
00280 enum {
00281 Outside=0,
00282 Nearby
00283 };
00284
00285 enum {
00286 Inactive = 0,
00287 Translate,
00288 Shift,
00289 Scale
00290 };
00291
00292
00294
00296 vtkGetMacro( CurrentOperation, int );
00297 vtkSetClampMacro( CurrentOperation, int,
00298 vtkContourRepresentation::Inactive,
00299 vtkContourRepresentation::Scale );
00300 void SetCurrentOperationToInactive()
00301 { this->SetCurrentOperation( vtkContourRepresentation::Inactive ); }
00302 void SetCurrentOperationToTranslate()
00303 { this->SetCurrentOperation( vtkContourRepresentation::Translate ); }
00304 void SetCurrentOperationToShift()
00305 {this->SetCurrentOperation( vtkContourRepresentation::Shift ); }
00306 void SetCurrentOperationToScale()
00307 {this->SetCurrentOperation( vtkContourRepresentation::Scale ); }
00309
00310
00311
00312
00313
00314
00315 void SetPointPlacer( vtkPointPlacer * );
00316 vtkGetObjectMacro( PointPlacer, vtkPointPlacer );
00317
00319
00321 void SetLineInterpolator( vtkContourLineInterpolator *);
00322 vtkGetObjectMacro( LineInterpolator, vtkContourLineInterpolator );
00324
00326
00327 virtual void BuildRepresentation()=0;
00328 virtual int ComputeInteractionState(int X, int Y, int modified=0)=0;
00329 virtual void StartWidgetInteraction(double e[2])=0;
00330 virtual void WidgetInteraction(double e[2])=0;
00332
00334
00335 virtual void ReleaseGraphicsResources(vtkWindow *w)=0;
00336 virtual int RenderOverlay(vtkViewport *viewport)=0;
00337 virtual int RenderOpaqueGeometry(vtkViewport *viewport)=0;
00338 virtual int RenderTranslucentPolygonalGeometry(vtkViewport *viewport)=0;
00339 virtual int HasTranslucentPolygonalGeometry()=0;
00341
00343
00345 void SetClosedLoop( int val );
00346 vtkGetMacro( ClosedLoop, int );
00347 vtkBooleanMacro( ClosedLoop, int );
00349
00351
00353 virtual void SetShowSelectedNodes(int);
00354 vtkGetMacro( ShowSelectedNodes, int );
00355 vtkBooleanMacro( ShowSelectedNodes, int );
00357
00359
00360 virtual vtkPolyData* GetContourRepresentationAsPolyData() = 0;
00361
00363
00366 void GetNodePolyData( vtkPolyData* poly );
00367
00368
00369 protected:
00370 vtkContourRepresentation();
00371 ~vtkContourRepresentation();
00372
00373
00374 int PixelTolerance;
00375 double WorldTolerance;
00376
00377 vtkPointPlacer *PointPlacer;
00378 vtkContourLineInterpolator *LineInterpolator;
00379
00380 int ActiveNode;
00381
00382 int CurrentOperation;
00383 int ClosedLoop;
00384
00385
00386 int ShowSelectedNodes;
00387
00388 vtkContourRepresentationInternals *Internal;
00389
00390 void AddNodeAtPositionInternal( double worldPos[3],
00391 double worldOrient[9], int displayPos[2] );
00392 void AddNodeAtPositionInternal( double worldPos[3],
00393 double worldOrient[9], double displayPos[2] );
00394 void SetNthNodeWorldPositionInternal( int n, double worldPos[3],
00395 double worldOrient[9] );
00396
00398
00400 void GetRendererComputedDisplayPositionFromWorldPosition( double worldPos[3],
00401 double worldOrient[9], int displayPos[2] );
00402 void GetRendererComputedDisplayPositionFromWorldPosition( double worldPos[3],
00403 double worldOrient[9], double displayPos[2] );
00405
00406 void UpdateLines( int index );
00407 void UpdateLine( int idx1, int idx2 );
00408
00409 virtual int FindClosestPointOnContour( int X, int Y,
00410 double worldPos[3],
00411 int *idx );
00412
00413 virtual void BuildLines()=0;
00414
00415
00416
00417
00418
00419
00420 virtual int UpdateContour();
00421 vtkTimeStamp ContourBuildTime;
00422
00423 void ComputeMidpoint( double p1[3], double p2[3], double mid[3] )
00424 {
00425 mid[0] = (p1[0] + p2[0])/2;
00426 mid[1] = (p1[1] + p2[1])/2;
00427 mid[2] = (p1[2] + p2[2])/2;
00428 }
00429
00436 virtual void Initialize( vtkPolyData * );
00437
00438 private:
00439 vtkContourRepresentation(const vtkContourRepresentation&);
00440 void operator=(const vtkContourRepresentation&);
00441 };
00442
00443 #endif
00444