[prev in list] [next in list] [prev in thread] [next in thread]
List: vtk-developers
Subject: [vtk-developers] vtkCheckerboardRepresentation fixes?
From: <dean.inglis () camris ! ca>
Date: 2007-02-27 1:46:27
Message-ID: 5occgs$1290fk () toip35-bus ! srvr ! bell ! ca
[Download RAW message or body]
three bugs(?) with vtkCheckerboardRepresentation,
first two relate to how companion sliders are updated in
void vtkCheckerboardRepresentation::SliderValueChanged(int sliderNum)
1)when interacting with the sliders, one slider's partner
appears to lag behind since its value is being updated as
an integer (cast from a double) and not as a double
2) the sliders only update for an x-y image plane configuration
Since this widget uses a ref to a vtkImageActor, which can
only assume x-y,y-z, x-z planar configuration, we can keep an ivar
for "orthoAxis" defined in BuildRepresentation
<snip>
double bounds[6];
double o[3];
vtkImageData *image = this->ImageActor->GetInput();
image->Update();
image->GetBounds(bounds);
image->GetOrigin(o);
if ( image->GetDataDimension() != 2 )
{
vtkErrorMacro(<<" requires a 2D image");
return;
}
double t0 = bounds[1]-bounds[0];
double t1 = bounds[3]-bounds[2];
double t2 = bounds[5]-bounds[4];
this->OrthoAxis = ( t0 < t1 ? (t0 < t2 ? 0 : 2) : (t1 < t2 ? 1 : 2) )
<snip>
and revise SliderValueChanged to:
//----------------------------------------------------------------------
void vtkCheckerboardRepresentation::SliderValueChanged(int sliderNum)
{
int *numDivisions = this->Checkerboard->GetNumberOfDivisions();
int value;
int div[] = {1,1,1};
if ( sliderNum == vtkCheckerboardRepresentation::TopSlider )
{
value = static_cast<int>(this->TopRepresentation->GetValue());
this->BottomRepresentation->SetValue(this->TopRepresentation->GetValue()); // \
fixes lagging following switch ( this->OrthoAxis )
{
case 0: div[1] = value; div[2] = numDivisions[2]; break;
case 1: div[0] = value; div[2] = numDivisions[2]; break;
case 2: div[0] = value; div[1] = numDivisions[1]; break;
}
this->Checkerboard->SetNumberOfDivisions(div);
}
else if ( sliderNum == vtkCheckerboardRepresentation::RightSlider )
{
value = static_cast<int>(this->RightRepresentation->GetValue());
this->LeftRepresentation->SetValue(this->RightRepresentation->GetValue());
switch ( this->OrthoAxis )
{
case 0: div[1] = numDivisions[1]; div[2] = value; break;
case 1: div[0] = numDivisions[0]; div[2] = value; break;
case 2: div[0] = numDivisions[0]; div[1] = value; break;
}
this->Checkerboard->SetNumberOfDivisions(div);
}
else if ( sliderNum == vtkCheckerboardRepresentation::BottomSlider )
{
value = static_cast<int>(this->BottomRepresentation->GetValue());
this->TopRepresentation->SetValue(this->BottomRepresentation->GetValue());
switch ( this->OrthoAxis )
{
case 0: div[1] = value; div[2] = numDivisions[2]; break;
case 1: div[0] = value; div[2] = numDivisions[2]; break;
case 2: div[0] = value; div[1] = numDivisions[1]; break;
}
this->Checkerboard->SetNumberOfDivisions(div);
}
else if ( sliderNum == vtkCheckerboardRepresentation::LeftSlider )
{
value = static_cast<int>(this->LeftRepresentation->GetValue());
this->RightRepresentation->SetValue(this->LeftRepresentation->GetValue());
switch ( this->OrthoAxis )
{
case 0: div[1] = numDivisions[1]; div[2] = value; break;
case 1: div[0] = numDivisions[0]; div[2] = value; break;
case 2: div[0] = numDivisions[0]; div[1] = value; break;
}
this->Checkerboard->SetNumberOfDivisions(div);
}
}
Third bug deals with BuildRepresentation. The widget, I think,
should wrap the sliders around/along the boundary of the image actor.
If so, then the image actor bounds should be used, at least
to get the right z-offset of an x-y plane, for example, rather than the
image origin to define the Point1 and Point2 Coordinates of the constituent sliders, \
since for slices other than those at the origin (e.g., clip a slice from a 3D volume)
the sliders may appear offset normal from the image actor plane:
<snip>
if ( this->OrthoAxis == 0 ) //x-axis
{
this->TopRepresentation->GetPoint1Coordinate()->SetValue(bounds[0], o[1]+o1, \
o[2]+t2); // use bounds instead of image origin \
this->TopRepresentation->GetPoint2Coordinate()->SetValue(bounds[0], o[1]+t1-o1, \
o[2]+t2); this->TopRepresentation->SetValue(numDivisions[1]);
this->RightRepresentation->GetPoint1Coordinate()->SetValue(bounds[0], o[1]+t1, \
o[2]+o2); this->RightRepresentation->GetPoint2Coordinate()->SetValue(bounds[0], \
o[1]+t1, o[2]+t2-o2); this->RightRepresentation->SetValue(numDivisions[2]);
this->BottomRepresentation->GetPoint1Coordinate()->SetValue(bounds[0], o[1]+o1, \
o[2]); this->BottomRepresentation->GetPoint2Coordinate()->SetValue(bounds[0], \
o[1]+t1-o1, o[2]); this->BottomRepresentation->SetValue(numDivisions[1]);
this->LeftRepresentation->GetPoint1Coordinate()->SetValue(bounds[0], o[1], \
o[2]+o2); this->LeftRepresentation->GetPoint2Coordinate()->SetValue(bounds[0], o[1], \
o[2]+t2-o2); this->LeftRepresentation->SetValue(numDivisions[2]);
}
<snip>
Any thoughts? Are there objections to committing these changes?
Dean
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic