You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
242 lines
8.0 KiB
C++
242 lines
8.0 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkHandleRepresentation.cxx
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
#include "vtkHandleRepresentation.h"
|
|
#include "vtkCoordinate.h"
|
|
#include "vtkInteractorObserver.h"
|
|
#include "vtkObjectFactory.h"
|
|
#include "vtkRenderer.h"
|
|
#include "vtkRenderWindow.h"
|
|
#include "vtkPointPlacer.h"
|
|
|
|
|
|
vtkCxxSetObjectMacro(vtkHandleRepresentation, PointPlacer, vtkPointPlacer );
|
|
|
|
//----------------------------------------------------------------------
|
|
vtkHandleRepresentation::vtkHandleRepresentation()
|
|
{
|
|
// Positions are maintained via a vtkCoordinate
|
|
this->DisplayPosition = vtkCoordinate::New();
|
|
this->DisplayPosition->SetCoordinateSystemToDisplay();
|
|
|
|
this->WorldPosition = vtkCoordinate::New();
|
|
this->WorldPosition->SetCoordinateSystemToWorld();
|
|
|
|
this->InteractionState = vtkHandleRepresentation::Outside;
|
|
this->Tolerance = 15;
|
|
this->ActiveRepresentation = 0;
|
|
this->Constrained = 0;
|
|
this->PointPlacer = vtkPointPlacer::New();
|
|
|
|
this->DisplayPositionTime.Modified();
|
|
this->WorldPositionTime.Modified();
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
vtkHandleRepresentation::~vtkHandleRepresentation()
|
|
{
|
|
this->DisplayPosition->Delete();
|
|
this->WorldPosition->Delete();
|
|
this->SetPointPlacer(NULL);
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
void vtkHandleRepresentation::SetDisplayPosition(double displyPos[3])
|
|
{
|
|
if (this->Renderer && this->PointPlacer)
|
|
{
|
|
if (this->PointPlacer->ValidateDisplayPosition( this->Renderer, displyPos ))
|
|
{
|
|
double worldPos[3], worldOrient[9];
|
|
if (this->PointPlacer->ComputeWorldPosition(
|
|
this->Renderer, displyPos, worldPos, worldOrient ))
|
|
{
|
|
this->DisplayPosition->SetValue(displyPos);
|
|
this->WorldPosition->SetValue(worldPos);
|
|
this->DisplayPositionTime.Modified();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this->DisplayPosition->SetValue(displyPos);
|
|
this->DisplayPositionTime.Modified();
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
void vtkHandleRepresentation::GetDisplayPosition(double pos[3])
|
|
{
|
|
// The position is really represented in the world position; the display
|
|
// position is a convenience to go back and forth between coordinate systems.
|
|
// Also note that the window size may have changed, so it's important to
|
|
// update the display position.
|
|
if ( this->Renderer && (this->WorldPositionTime > this->DisplayPositionTime ||
|
|
(this->Renderer->GetVTKWindow() &&
|
|
this->Renderer->GetVTKWindow()->GetMTime() > this->BuildTime)) )
|
|
{
|
|
int *p = this->WorldPosition->GetComputedDisplayValue(this->Renderer);
|
|
this->DisplayPosition->SetValue(p[0],p[1],0.0);
|
|
}
|
|
this->DisplayPosition->GetValue(pos);
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
double* vtkHandleRepresentation::GetDisplayPosition()
|
|
{
|
|
// The position is really represented in the world position; the display
|
|
// position is a convenience to go back and forth between coordinate systems.
|
|
// Also note that the window size may have changed, so it's important to
|
|
// update the display position.
|
|
if ( this->Renderer && (this->WorldPositionTime > this->DisplayPositionTime ||
|
|
(this->Renderer->GetVTKWindow() &&
|
|
this->Renderer->GetVTKWindow()->GetMTime() > this->BuildTime)) )
|
|
{
|
|
int *p = this->WorldPosition->GetComputedDisplayValue(this->Renderer);
|
|
this->DisplayPosition->SetValue(p[0],p[1],0.0);
|
|
}
|
|
return this->DisplayPosition->GetValue();
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
void vtkHandleRepresentation::SetWorldPosition(double pos[3])
|
|
{
|
|
if (this->Renderer && this->PointPlacer)
|
|
{
|
|
if (this->PointPlacer->ValidateWorldPosition( pos ))
|
|
{
|
|
this->WorldPosition->SetValue(pos);
|
|
this->WorldPositionTime.Modified();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this->WorldPosition->SetValue(pos);
|
|
this->WorldPositionTime.Modified();
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
void vtkHandleRepresentation::GetWorldPosition(double pos[3])
|
|
{
|
|
this->WorldPosition->GetValue(pos);
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
double* vtkHandleRepresentation::GetWorldPosition()
|
|
{
|
|
return this->WorldPosition->GetValue();
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
int vtkHandleRepresentation::CheckConstraint(vtkRenderer *vtkNotUsed(renderer),
|
|
double vtkNotUsed(pos)[2])
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
void vtkHandleRepresentation::SetRenderer(vtkRenderer *ren)
|
|
{
|
|
this->DisplayPosition->SetViewport(ren);
|
|
this->WorldPosition->SetViewport(ren);
|
|
this->Superclass::SetRenderer(ren);
|
|
|
|
// Okay this is weird. If a display position was set previously before
|
|
// the renderer was specified, then the coordinate systems are not
|
|
// synchronized.
|
|
if ( this->DisplayPositionTime > this->WorldPositionTime )
|
|
{
|
|
double p[3];
|
|
this->DisplayPosition->GetValue(p);
|
|
this->SetDisplayPosition(p); //side affect updated world pos
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
void vtkHandleRepresentation::DeepCopy(vtkProp *prop)
|
|
{
|
|
vtkHandleRepresentation *rep = vtkHandleRepresentation::SafeDownCast(prop);
|
|
if ( rep )
|
|
{
|
|
this->SetTolerance(rep->GetTolerance());
|
|
this->SetActiveRepresentation(rep->GetActiveRepresentation());
|
|
this->SetConstrained(rep->GetConstrained());
|
|
this->SetPointPlacer(rep->GetPointPlacer());
|
|
}
|
|
this->Superclass::ShallowCopy(prop);
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
void vtkHandleRepresentation::ShallowCopy(vtkProp *prop)
|
|
{
|
|
vtkHandleRepresentation *rep = vtkHandleRepresentation::SafeDownCast(prop);
|
|
if ( rep )
|
|
{
|
|
this->SetTolerance(rep->GetTolerance());
|
|
this->SetActiveRepresentation(rep->GetActiveRepresentation());
|
|
this->SetConstrained(rep->GetConstrained());
|
|
}
|
|
this->Superclass::ShallowCopy(prop);
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
vtkMTimeType vtkHandleRepresentation::GetMTime()
|
|
{
|
|
vtkMTimeType mTime=this->Superclass::GetMTime();
|
|
vtkMTimeType wMTime=this->WorldPosition->GetMTime();
|
|
mTime = ( wMTime > mTime ? wMTime : mTime );
|
|
vtkMTimeType dMTime=this->DisplayPosition->GetMTime();
|
|
mTime = ( dMTime > mTime ? dMTime : mTime );
|
|
|
|
return mTime;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
void vtkHandleRepresentation::PrintSelf(ostream& os, vtkIndent indent)
|
|
{
|
|
//Superclass typedef defined in vtkTypeMacro() found in vtkSetGet.h
|
|
this->Superclass::PrintSelf(os,indent);
|
|
|
|
double p[3];
|
|
this->GetDisplayPosition(p);
|
|
os << indent << "Display Position: (" << p[0] << ", "
|
|
<< p[1] << ", " << p[2] << ")\n";
|
|
|
|
this->GetWorldPosition(p);
|
|
os << indent << "World Position: (" << p[0] << ", "
|
|
<< p[1] << ", " << p[2] << ")\n";
|
|
|
|
os << indent << "Constrained: "
|
|
<< (this->Constrained ? "On" : "Off") << "\n";
|
|
|
|
os << indent << "Tolerance: " << this->Tolerance << "\n";
|
|
|
|
os << indent << "Active Representation: "
|
|
<< (this->ActiveRepresentation ? "On" : "Off") << "\n";
|
|
|
|
if ( this->PointPlacer )
|
|
{
|
|
os << indent << "PointPlacer:\n";
|
|
this->PointPlacer->PrintSelf( os, indent.GetNextIndent() );
|
|
}
|
|
else
|
|
{
|
|
os << indent << "PointPlacer: (none)\n";
|
|
}
|
|
|
|
// this->InteractionState is printed in superclass
|
|
// this is commented to avoid PrintSelf errors
|
|
}
|