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 vtkIncrementalOctreePointLocator;
00064 class vtkPointPlacer;
00065 class vtkPolyData;
00066
00067
00068
00069 class vtkContourRepresentationPoint
00070 {
00071 public:
00072 double WorldPosition[3];
00073 double NormalizedDisplayPosition[2];
00074 };
00075
00076 class vtkContourRepresentationNode
00077 {
00078 public:
00079 double WorldPosition[3];
00080 double WorldOrientation[9];
00081 double NormalizedDisplayPosition[2];
00082 int Selected;
00083 vtkstd::vector<vtkContourRepresentationPoint*> Points;
00084 };
00085
00086 class vtkContourRepresentationInternals
00087 {
00088 public:
00089 vtkstd::vector<vtkContourRepresentationNode*> Nodes;
00090 void ClearNodes()
00091 {
00092 for(unsigned int i=0;i<this->Nodes.size();i++)
00093 {
00094 for (unsigned int j=0;j<this->Nodes[i]->Points.size();j++)
00095 {
00096 delete this->Nodes[i]->Points[j];
00097 }
00098 this->Nodes[i]->Points.clear();
00099 delete this->Nodes[i];
00100 }
00101 this->Nodes.clear();
00102 }
00103 };
00104
00105
00106 class VTK_WIDGETS_EXPORT vtkContourRepresentation : public vtkWidgetRepresentation
00107 {
00108
00109 friend class vtkContourWidget;
00110
00111 public:
00113
00114 vtkTypeMacro(vtkContourRepresentation,vtkWidgetRepresentation);
00115 void PrintSelf(ostream& os, vtkIndent indent);
00117
00119
00121 virtual int AddNodeAtWorldPosition( double x, double y, double z);
00122 virtual int AddNodeAtWorldPosition( double worldPos[3] );
00123 virtual int AddNodeAtWorldPosition( double worldPos[3],
00124 double worldOrient[9] );
00126
00128
00131 virtual int AddNodeAtDisplayPosition( double displayPos[2] );
00132 virtual int AddNodeAtDisplayPosition( int displayPos[2] );
00133 virtual int AddNodeAtDisplayPosition( int X, int Y );
00135
00137
00140 virtual int ActivateNode( double displayPos[2] );
00141 virtual int ActivateNode( int displayPos[2] );
00142 virtual int ActivateNode( int X, int Y );
00144
00145
00146
00147
00148
00149
00150 virtual int SetActiveNodeToWorldPosition( double pos[3] );
00151 virtual int SetActiveNodeToWorldPosition( double pos[3],
00152 double orient[9] );
00153
00155
00159 virtual int SetActiveNodeToDisplayPosition( double pos[2] );
00160 virtual int SetActiveNodeToDisplayPosition( int pos[2] );
00161 virtual int SetActiveNodeToDisplayPosition( int X, int Y );
00163
00165
00166 virtual int ToggleActiveNodeSelected();
00167 virtual int GetActiveNodeSelected();
00168 virtual int GetNthNodeSelected(int);
00169 virtual int SetNthNodeSelected(int);
00171
00174 virtual int GetActiveNodeWorldPosition( double pos[3] );
00175
00178 virtual int GetActiveNodeWorldOrientation( double orient[9] );
00179
00182 virtual int GetActiveNodeDisplayPosition( double pos[2] );
00183
00185 virtual int GetNumberOfNodes();
00186
00189 virtual int GetNthNodeDisplayPosition( int n, double pos[2] );
00190
00193 virtual int GetNthNodeWorldPosition( int n, double pos[3] );
00194
00197 virtual int GetNthNodeWorldOrientation( int n, double orient[9] );
00198
00200
00205 virtual int SetNthNodeDisplayPosition( int n, int X, int Y );
00206 virtual int SetNthNodeDisplayPosition( int n, int pos[2] );
00207 virtual int SetNthNodeDisplayPosition( int n, double pos[2] );
00209
00211
00214 virtual int SetNthNodeWorldPosition( int n, double pos[3] );
00215 virtual int SetNthNodeWorldPosition( int n, double pos[3],
00216 double orient[9] );
00218
00221 virtual int GetNthNodeSlope( int idx, double slope[3] );
00222
00223
00224
00225
00226
00227
00228
00229
00230 virtual int GetNumberOfIntermediatePoints( int n );
00231
00233
00236 virtual int GetIntermediatePointWorldPosition( int n,
00237 int idx, double point[3] );
00239
00241
00244 virtual int AddIntermediatePointWorldPosition( int n,
00245 double point[3] );
00247
00250 virtual int DeleteLastNode();
00251
00254 virtual int DeleteActiveNode();
00255
00257 virtual int DeleteNthNode( int n );
00258
00260 virtual void ClearAllNodes();
00261
00264 virtual int AddNodeOnContour( int X, int Y );
00265
00267
00269 vtkSetClampMacro(PixelTolerance,int,1,100);
00270 vtkGetMacro(PixelTolerance,int);
00272
00274
00276 vtkSetClampMacro(WorldTolerance, double, 0.0, VTK_DOUBLE_MAX);
00277 vtkGetMacro(WorldTolerance, double);
00279
00280
00281 enum {
00282 Outside=0,
00283 Nearby
00284 };
00285
00286 enum {
00287 Inactive = 0,
00288 Translate,
00289 Shift,
00290 Scale
00291 };
00292
00293
00295
00297 vtkGetMacro( CurrentOperation, int );
00298 vtkSetClampMacro( CurrentOperation, int,
00299 vtkContourRepresentation::Inactive,
00300 vtkContourRepresentation::Scale );
00301 void SetCurrentOperationToInactive()
00302 { this->SetCurrentOperation( vtkContourRepresentation::Inactive ); }
00303 void SetCurrentOperationToTranslate()
00304 { this->SetCurrentOperation( vtkContourRepresentation::Translate ); }
00305 void SetCurrentOperationToShift()
00306 {this->SetCurrentOperation( vtkContourRepresentation::Shift ); }
00307 void SetCurrentOperationToScale()
00308 {this->SetCurrentOperation( vtkContourRepresentation::Scale ); }
00310
00311
00312
00313
00314
00315
00316 void SetPointPlacer( vtkPointPlacer * );
00317 vtkGetObjectMacro( PointPlacer, vtkPointPlacer );
00318
00320
00322 void SetLineInterpolator( vtkContourLineInterpolator *);
00323 vtkGetObjectMacro( LineInterpolator, vtkContourLineInterpolator );
00325
00327
00328 virtual void BuildRepresentation()=0;
00329 virtual int ComputeInteractionState(int X, int Y, int modified=0)=0;
00330 virtual void StartWidgetInteraction(double e[2])=0;
00331 virtual void WidgetInteraction(double e[2])=0;
00333
00335
00336 virtual void ReleaseGraphicsResources(vtkWindow *w)=0;
00337 virtual int RenderOverlay(vtkViewport *viewport)=0;
00338 virtual int RenderOpaqueGeometry(vtkViewport *viewport)=0;
00339 virtual int RenderTranslucentPolygonalGeometry(vtkViewport *viewport)=0;
00340 virtual int HasTranslucentPolygonalGeometry()=0;
00342
00344
00346 void SetClosedLoop( int val );
00347 vtkGetMacro( ClosedLoop, int );
00348 vtkBooleanMacro( ClosedLoop, int );
00350
00352
00354 virtual void SetShowSelectedNodes(int);
00355 vtkGetMacro( ShowSelectedNodes, int );
00356 vtkBooleanMacro( ShowSelectedNodes, int );
00358
00359
00361
00362 virtual vtkPolyData* GetContourRepresentationAsPolyData() = 0;
00363
00365
00368 void GetNodePolyData( vtkPolyData* poly );
00369
00370 vtkSetMacro(RebuildLocator,bool);
00371
00372 protected:
00373 vtkContourRepresentation();
00374 ~vtkContourRepresentation();
00375
00376
00377 int PixelTolerance;
00378 double WorldTolerance;
00379
00380 vtkPointPlacer *PointPlacer;
00381 vtkContourLineInterpolator *LineInterpolator;
00382
00383 int ActiveNode;
00384
00385 int CurrentOperation;
00386 int ClosedLoop;
00387
00388
00389 int ShowSelectedNodes;
00390
00391 vtkContourRepresentationInternals *Internal;
00392
00393 void AddNodeAtPositionInternal( double worldPos[3],
00394 double worldOrient[9], int displayPos[2] );
00395 void AddNodeAtPositionInternal( double worldPos[3],
00396 double worldOrient[9], double displayPos[2] );
00397 void SetNthNodeWorldPositionInternal( int n, double worldPos[3],
00398 double worldOrient[9] );
00399
00401
00403 void GetRendererComputedDisplayPositionFromWorldPosition( double worldPos[3],
00404 double worldOrient[9], int displayPos[2] );
00405 void GetRendererComputedDisplayPositionFromWorldPosition( double worldPos[3],
00406 double worldOrient[9], double displayPos[2] );
00408
00409 virtual void UpdateLines( int index );
00410 void UpdateLine( int idx1, int idx2 );
00411
00412 virtual int FindClosestPointOnContour( int X, int Y,
00413 double worldPos[3],
00414 int *idx );
00415
00416 virtual void BuildLines()=0;
00417
00418
00419
00420
00421
00422
00423 virtual int UpdateContour();
00424 vtkTimeStamp ContourBuildTime;
00425
00426 void ComputeMidpoint( double p1[3], double p2[3], double mid[3] )
00427 {
00428 mid[0] = (p1[0] + p2[0])/2;
00429 mid[1] = (p1[1] + p2[1])/2;
00430 mid[2] = (p1[2] + p2[2])/2;
00431 }
00432
00439 virtual void Initialize( vtkPolyData * );
00440
00443 vtkIncrementalOctreePointLocator *Locator;
00444
00447 void ResetLocator();
00448
00449 void BuildLocator();
00450
00451 bool RebuildLocator;
00452
00453
00454 private:
00455 vtkContourRepresentation(const vtkContourRepresentation&);
00456 void operator=(const vtkContourRepresentation&);
00457 };
00458
00459 #endif
00460