View Issue Details Jump to Notes ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0001748VTK(No Category)public2005-04-05 18:032016-08-12 09:54
Reporterjohn platt 
Assigned ToJohn Biddiscombe 
PrioritylowSeverityminorReproducibilityalways
StatusclosedResolutionmoved 
PlatformOSOS Version
Product Version 
Target VersionFixed in Version 
Summary0001748: Tensor glyphs always scaled
DescriptionTensor 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.
TagsNo tags attached.
Project
Type
Attached Files

 Relationships

  Notes
(0036780)
Kitware Robot (administrator)
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.

 Issue History
Date Modified Username Field Change
2011-06-16 13:11 Zack Galbreath Category => (No Category)
2016-08-12 09:54 Kitware Robot Note Added: 0036780
2016-08-12 09:54 Kitware Robot Status expired => closed
2016-08-12 09:54 Kitware Robot Resolution open => moved


Copyright © 2000 - 2018 MantisBT Team