MantisBT - VTK
View Issue Details
0001748VTK(No Category)public2005-04-05 18:032016-08-12 09:54
john platt 
John Biddiscombe 
lowminoralways
closedmoved 
 
 
0001748: Tensor glyphs always scaled
Tensor glyphs are always scaled irrespective of the Scaling ivar.
Memory leak if there is no data to glyph.
Extend the scaling options.



vtkTensorGlyph.h
----------------


Replace

  // Description:
  // Turn on/off scaling of glyph with eigenvalues.
  vtkSetMacro(Scaling,int);

By

  // Description:
  // Turn on/off scaling of the glyphs. The source glyphs can be scaled by the composite
  // factor (eigenvalue*ScaleFactor). The ScaleMode controls the use of the eigenvalues in
  // the composite factor. By default, scaling is on.
  vtkSetMacro(Scaling,int);


Insert

//BTX
  enum
  {
      SCALE_BY_EIGENVALUES,
      DATA_SCALING_OFF,
  };
//ETX

  // Description:
  // Include or exclude the eigenvalues in the composite scale factor. By default, the
  // eigenvalues are included and the glyphs will be scaled by (eigenvalue*ScaleFactor).
  vtkSetClampMacro(ScaleMode, int, SCALE_BY_EIGENVALUES, DATA_SCALING_OFF);
  vtkGetMacro(ScaleMode,int);
  void SetScaleModeToScaleByEigenvalues()
    {this->SetScaleMode(SCALE_BY_EIGENVALUES);};
  void SetScaleModeToDataScalingOff()
    {this->SetScaleMode(DATA_SCALING_OFF);};
  const char* GetScaleModeAsString();


Insert

  // Description:
  // Specify scale factors for each principal direction. The first scale factor is paired
  // with the most positive eigenvalue. If scale factors are not specified, the single
  // ScaleFactor is used for all directions.
  vtkSetVector3Macro(ScaleFactors,double);
  vtkGetVector3Macro(ScaleFactors,double);

New ivars

  int ScaleMode; // Include the eigenvalues in the geometry scaling
  double ScaleFactors[3]; // Scale factors for ThreeGlyphs

Insert

    
// Description:
// Return the method of scaling as a descriptive character string.
inline const char* vtkTensorGlyph::GetScaleModeAsString( void )
{
  if ( this->ScaleMode == SCALE_BY_EIGENVALUES )
    {
    return "ScaleByEigenvalues";
    }
  else
    {
    return "DataScalingOff";
    }
}


vtkTensorGlyph.cxx
------------------

vtkTensorGlyph()

Add

  this->ScaleMode = SCALE_BY_EIGENVALUES;

and after ScaleFactor has been set

  this->ScaleFactors[0] = ScaleFactor;
  this->ScaleFactors[1] = ScaleFactor;
  this->ScaleFactors[2] = ScaleFactor;


Execute()

Move the 3 lines

  pts = new vtkIdType[this->GetSource()->GetMaxCellSize()];
  trans = vtkTransform::New();
  matrix = vtkMatrix4x4::New();

to after

  if ( !inTensors || numPts < 1 )
    {
    vtkErrorMacro(<<"No data to glyph!");
    return;
    }

This prevents memory leaks when there is no data to glyph.


Replace

    // compute scale factors
    w[0] *= this->ScaleFactor;
    w[1] *= this->ScaleFactor;
    w[2] *= this->ScaleFactor;

    if ( this->ClampScaling )
    
by

    // compute scale factors
    if ( SCALE_BY_EIGENVALUES == this->ScaleMode )
      {
       // Include the eigenvalues (or vector norms) in the scale factor.
       w[0] *= this->ScaleFactors[0];
       w[1] *= this->ScaleFactors[1];
       w[2] *= this->ScaleFactors[2];
      }
    else
      {
       // Exclude tensor data from the scale factor.
       w[0] = this->ScaleFactors[0];
       w[1] = this->ScaleFactors[1];
       w[2] = this->ScaleFactors[2];
      }
    
    if ( this->ClampScaling && (DATA_SCALING_OFF != this->ScaleMode) )

Replace

      if (this->ThreeGlyphs)
        {
        trans->Scale(w[eigen_dir], this->ScaleFactor, this->ScaleFactor);
        }
      else
        {
        trans->Scale(w[0], w[1], w[2]);
        }

by
    
      // Apply the scaling.
      if ( this->Scaling )
        {
        if (this->ThreeGlyphs)
          {
          trans->Scale(w[eigen_dir], this->ScaleFactor, this->ScaleFactor);
          }
        else
          {
          trans->Scale(w[0], w[1], w[2]);
          }
        }


PrintSelf(ostream& os, vtkIndent indent)

Insert

  os << indent << "Scale Mode: " << this->ScaleMode << endl;
  os << indent << "ScaleFactors: (" << this->ScaleFactors[0] << ", " << this->ScaleFactors[1] << ", " <<

                                                     this->ScaleFactors[2] << ")\n";


Thanks.
No tags attached.
Issue History
2011-06-16 13:11Zack GalbreathCategory => (No Category)
2016-08-12 09:54Kitware RobotNote Added: 0036780
2016-08-12 09:54Kitware RobotStatusexpired => closed
2016-08-12 09:54Kitware RobotResolutionopen => moved

Notes
(0036780)
Kitware Robot   
2016-08-12 09:54   
Resolving issue as `moved`.

This issue tracker is no longer used. Further discussion of this issue may take place in the current VTK Issues page linked in the banner at the top of this page.