You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
517 lines
13 KiB
517 lines
13 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkCursor3D.cxx,v $
|
|
|
|
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 "vtkCursor3D.h"
|
|
|
|
#include "vtkCellArray.h"
|
|
#include "vtkInformation.h"
|
|
#include "vtkInformationVector.h"
|
|
#include "vtkObjectFactory.h"
|
|
#include "vtkPolyData.h"
|
|
|
|
#include <math.h>
|
|
|
|
vtkCxxRevisionMacro(vtkCursor3D, "$Revision: 1.45 $");
|
|
vtkStandardNewMacro(vtkCursor3D);
|
|
|
|
// Construct with model bounds = (-1,1,-1,1,-1,1), focal point = (0,0,0),
|
|
// all parts of cursor visible, and wrapping off.
|
|
vtkCursor3D::vtkCursor3D()
|
|
{
|
|
vtkPoints *pts;
|
|
|
|
this->Focus = vtkPolyData::New();
|
|
pts = vtkPoints::New();
|
|
pts->Allocate(1);
|
|
pts->vtkPoints::InsertPoint(0, 0.0, 0.0, 0.0);
|
|
this->Focus->SetPoints(pts);
|
|
pts->Delete();
|
|
|
|
this->ModelBounds[0] = -1.0;
|
|
this->ModelBounds[1] = 1.0;
|
|
this->ModelBounds[2] = -1.0;
|
|
this->ModelBounds[3] = 1.0;
|
|
this->ModelBounds[4] = -1.0;
|
|
this->ModelBounds[5] = 1.0;
|
|
|
|
this->FocalPoint[0] = 0.0;
|
|
this->FocalPoint[1] = 0.0;
|
|
this->FocalPoint[2] = 0.0;
|
|
|
|
this->Outline = 1;
|
|
this->Axes = 1;
|
|
this->XShadows = 1;
|
|
this->YShadows = 1;
|
|
this->ZShadows = 1;
|
|
this->Wrap = 0;
|
|
this->TranslationMode = 0;
|
|
|
|
this->SetNumberOfInputPorts(0);
|
|
}
|
|
|
|
vtkCursor3D::~vtkCursor3D()
|
|
{
|
|
this->Focus->Delete();
|
|
}
|
|
|
|
int vtkCursor3D::RequestData(
|
|
vtkInformation *vtkNotUsed(request),
|
|
vtkInformationVector **vtkNotUsed(inputVector),
|
|
vtkInformationVector *outputVector)
|
|
{
|
|
// get the info object
|
|
vtkInformation *outInfo = outputVector->GetInformationObject(0);
|
|
|
|
// get the ouptut
|
|
vtkPolyData *output = vtkPolyData::SafeDownCast(
|
|
outInfo->Get(vtkDataObject::DATA_OBJECT()));
|
|
|
|
int i;
|
|
int numPts=0, numLines=0;
|
|
vtkPoints *newPts;
|
|
vtkCellArray *newLines;
|
|
double x[3];
|
|
vtkIdType ptIds[2];
|
|
|
|
// Check bounding box and origin
|
|
//
|
|
if ( this->Wrap )
|
|
{
|
|
for (i=0; i<3; i++)
|
|
{
|
|
this->FocalPoint[i] = this->ModelBounds[2*i] +
|
|
fmod((double)(this->FocalPoint[i]-this->ModelBounds[2*i]),
|
|
(double)(this->ModelBounds[2*i+1]-this->ModelBounds[2*i]));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (i=0; i<3; i++)
|
|
{
|
|
if ( this->FocalPoint[i] < this->ModelBounds[2*i] )
|
|
{
|
|
this->FocalPoint[i] = this->ModelBounds[2*i];
|
|
}
|
|
if ( this->FocalPoint[i] > this->ModelBounds[2*i+1] )
|
|
{
|
|
this->FocalPoint[i] = this->ModelBounds[2*i+1];
|
|
}
|
|
}
|
|
}
|
|
|
|
// Allocate storage
|
|
//
|
|
if (this->Axes)
|
|
{
|
|
numPts += 6;
|
|
numLines += 3;
|
|
}
|
|
|
|
if (this->Outline)
|
|
{
|
|
numPts += 8;
|
|
numLines += 12;
|
|
}
|
|
|
|
if (this->XShadows)
|
|
{
|
|
numPts += 8;
|
|
numLines += 4;
|
|
}
|
|
|
|
if (this->YShadows)
|
|
{
|
|
numPts += 8;
|
|
numLines += 4;
|
|
}
|
|
|
|
if (this->ZShadows)
|
|
{
|
|
numPts += 8;
|
|
numLines += 4;
|
|
}
|
|
|
|
if ( numPts )
|
|
{
|
|
newPts = vtkPoints::New();
|
|
newPts->Allocate(numPts);
|
|
newLines = vtkCellArray::New();
|
|
newLines->Allocate(newLines->EstimateSize(numLines,2));
|
|
}
|
|
else
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
// Create axes
|
|
//
|
|
if ( this->Axes )
|
|
{
|
|
x[0] = this->ModelBounds[0];
|
|
x[1] = this->FocalPoint[1];
|
|
x[2] = this->FocalPoint[2];
|
|
ptIds[0] = newPts->InsertNextPoint(x);
|
|
|
|
x[0] = this->ModelBounds[1];
|
|
x[1] = this->FocalPoint[1];
|
|
x[2] = this->FocalPoint[2];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
x[0] = this->FocalPoint[0];
|
|
x[1] = this->ModelBounds[2];
|
|
x[2] = this->FocalPoint[2];
|
|
ptIds[0] = newPts->InsertNextPoint(x);
|
|
|
|
x[0] = this->FocalPoint[0];
|
|
x[1] = this->ModelBounds[3];
|
|
x[2] = this->FocalPoint[2];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
x[0] = this->FocalPoint[0];
|
|
x[1] = this->FocalPoint[1];
|
|
x[2] = this->ModelBounds[4];
|
|
ptIds[0] = newPts->InsertNextPoint(x);
|
|
|
|
x[0] = this->FocalPoint[0];
|
|
x[1] = this->FocalPoint[1];
|
|
x[2] = this->ModelBounds[5];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
}
|
|
|
|
// Create outline
|
|
//
|
|
if ( this->Outline )
|
|
{
|
|
// First triad
|
|
x[0] = this->ModelBounds[0];
|
|
x[1] = this->ModelBounds[2];
|
|
x[2] = this->ModelBounds[4];
|
|
ptIds[0] = newPts->InsertNextPoint(x);
|
|
|
|
x[0] = this->ModelBounds[1];
|
|
x[1] = this->ModelBounds[2];
|
|
x[2] = this->ModelBounds[4];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
x[0] = this->ModelBounds[0];
|
|
x[1] = this->ModelBounds[3];
|
|
x[2] = this->ModelBounds[4];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
x[0] = this->ModelBounds[0];
|
|
x[1] = this->ModelBounds[2];
|
|
x[2] = this->ModelBounds[5];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
// Second triad
|
|
x[0] = this->ModelBounds[1];
|
|
x[1] = this->ModelBounds[3];
|
|
x[2] = this->ModelBounds[5];
|
|
ptIds[0] = newPts->InsertNextPoint(x);
|
|
|
|
x[0] = this->ModelBounds[0];
|
|
x[1] = this->ModelBounds[3];
|
|
x[2] = this->ModelBounds[5];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
x[0] = this->ModelBounds[1];
|
|
x[1] = this->ModelBounds[2];
|
|
x[2] = this->ModelBounds[5];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
x[0] = this->ModelBounds[1];
|
|
x[1] = this->ModelBounds[3];
|
|
x[2] = this->ModelBounds[4];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
// Fill in remaining lines
|
|
x[0] = this->ModelBounds[1];
|
|
x[1] = this->ModelBounds[2];
|
|
x[2] = this->ModelBounds[4];
|
|
ptIds[0] = newPts->InsertNextPoint(x);
|
|
|
|
x[0] = this->ModelBounds[1];
|
|
x[1] = this->ModelBounds[3];
|
|
x[2] = this->ModelBounds[4];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
x[0] = this->ModelBounds[1];
|
|
x[1] = this->ModelBounds[2];
|
|
x[2] = this->ModelBounds[5];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
x[0] = this->ModelBounds[0];
|
|
x[1] = this->ModelBounds[3];
|
|
x[2] = this->ModelBounds[4];
|
|
ptIds[0] = newPts->InsertNextPoint(x);
|
|
|
|
x[0] = this->ModelBounds[1];
|
|
x[1] = this->ModelBounds[3];
|
|
x[2] = this->ModelBounds[4];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
x[0] = this->ModelBounds[0];
|
|
x[1] = this->ModelBounds[3];
|
|
x[2] = this->ModelBounds[5];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
|
|
x[0] = this->ModelBounds[0];
|
|
x[1] = this->ModelBounds[2];
|
|
x[2] = this->ModelBounds[5];
|
|
ptIds[0] = newPts->InsertNextPoint(x);
|
|
|
|
x[0] = this->ModelBounds[1];
|
|
x[1] = this->ModelBounds[2];
|
|
x[2] = this->ModelBounds[5];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
x[0] = this->ModelBounds[0];
|
|
x[1] = this->ModelBounds[3];
|
|
x[2] = this->ModelBounds[5];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
}
|
|
|
|
// Create x-shadows
|
|
//
|
|
if ( this->XShadows )
|
|
{
|
|
for (i=0; i<2; i++)
|
|
{
|
|
x[0] = this->ModelBounds[i];
|
|
x[1] = this->ModelBounds[2];
|
|
x[2] = this->FocalPoint[2];
|
|
ptIds[0] = newPts->InsertNextPoint(x);
|
|
|
|
x[0] = this->ModelBounds[i];
|
|
x[1] = this->ModelBounds[3];
|
|
x[2] = this->FocalPoint[2];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
x[0] = this->ModelBounds[i];
|
|
x[1] = this->FocalPoint[1];
|
|
x[2] = this->ModelBounds[4];
|
|
ptIds[0] = newPts->InsertNextPoint(x);
|
|
|
|
x[0] = this->ModelBounds[i];
|
|
x[1] = this->FocalPoint[1];
|
|
x[2] = this->ModelBounds[5];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
}
|
|
}
|
|
|
|
// Create y-shadows
|
|
//
|
|
if ( this->YShadows )
|
|
{
|
|
for (i=0; i<2; i++)
|
|
{
|
|
x[0] = this->ModelBounds[0];
|
|
x[1] = this->ModelBounds[i+2];
|
|
x[2] = this->FocalPoint[2];
|
|
ptIds[0] = newPts->InsertNextPoint(x);
|
|
|
|
x[0] = this->ModelBounds[1];
|
|
x[1] = this->ModelBounds[i+2];
|
|
x[2] = this->FocalPoint[2];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
x[0] = this->FocalPoint[0];
|
|
x[1] = this->ModelBounds[i+2];
|
|
x[2] = this->ModelBounds[4];
|
|
ptIds[0] = newPts->InsertNextPoint(x);
|
|
|
|
x[0] = this->FocalPoint[0];
|
|
x[1] = this->ModelBounds[i+2];
|
|
x[2] = this->ModelBounds[5];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
}
|
|
}
|
|
|
|
// Create z-shadows
|
|
//
|
|
if ( this->ZShadows )
|
|
{
|
|
for (i=0; i<2; i++)
|
|
{
|
|
x[0] = this->ModelBounds[0];
|
|
x[1] = this->FocalPoint[1];
|
|
x[2] = this->ModelBounds[i+4];
|
|
ptIds[0] = newPts->InsertNextPoint(x);
|
|
|
|
x[0] = this->ModelBounds[1];
|
|
x[1] = this->FocalPoint[1];
|
|
x[2] = this->ModelBounds[i+4];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
|
|
x[0] = this->FocalPoint[0];
|
|
x[1] = this->ModelBounds[2];
|
|
x[2] = this->ModelBounds[i+4];
|
|
ptIds[0] = newPts->InsertNextPoint(x);
|
|
|
|
x[0] = this->FocalPoint[0];
|
|
x[1] = this->ModelBounds[3];
|
|
x[2] = this->ModelBounds[i+4];
|
|
ptIds[1] = newPts->InsertNextPoint(x);
|
|
newLines->InsertNextCell(2,ptIds);
|
|
}
|
|
}
|
|
|
|
// Update ourselves and release memory
|
|
//
|
|
this->Focus->GetPoints()->SetPoint(0,this->FocalPoint);
|
|
|
|
output->SetPoints(newPts);
|
|
newPts->Delete();
|
|
|
|
output->SetLines(newLines);
|
|
newLines->Delete();
|
|
|
|
return 1;
|
|
}
|
|
|
|
// Set the boundary of the 3D cursor.
|
|
void vtkCursor3D::SetModelBounds(double xmin, double xmax,
|
|
double ymin, double ymax,
|
|
double zmin, double zmax)
|
|
{
|
|
if ( xmin != this->ModelBounds[0] || xmax != this->ModelBounds[1] ||
|
|
ymin != this->ModelBounds[2] || ymax != this->ModelBounds[3] ||
|
|
zmin != this->ModelBounds[4] || zmax != this->ModelBounds[5] )
|
|
{
|
|
this->Modified();
|
|
|
|
this->ModelBounds[0] = xmin; this->ModelBounds[1] = xmax;
|
|
this->ModelBounds[2] = ymin; this->ModelBounds[3] = ymax;
|
|
this->ModelBounds[4] = zmin; this->ModelBounds[5] = zmax;
|
|
|
|
for (int i=0; i<3; i++)
|
|
{
|
|
if ( this->ModelBounds[2*i] > this->ModelBounds[2*i+1] )
|
|
{
|
|
this->ModelBounds[2*i] = this->ModelBounds[2*i+1];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void vtkCursor3D::SetFocalPoint(double x[3])
|
|
{
|
|
if ( x[0] == this->FocalPoint[0] && x[1] == this->FocalPoint[1] &&
|
|
x[2] == this->FocalPoint[2] )
|
|
{
|
|
return;
|
|
}
|
|
|
|
this->Modified();
|
|
|
|
double v[3];
|
|
for (int i=0; i<3; i++)
|
|
{
|
|
v[i] = x[i] - this->FocalPoint[i];
|
|
this->FocalPoint[i] = x[i];
|
|
|
|
if ( this->TranslationMode )
|
|
{
|
|
this->ModelBounds[2*i] += v[i];
|
|
this->ModelBounds[2*i+1] += v[i];
|
|
}
|
|
else if ( this->Wrap ) //wrap
|
|
{
|
|
this->FocalPoint[i] = this->ModelBounds[2*i] +
|
|
fmod((double)(this->FocalPoint[i]-this->ModelBounds[2*i]),
|
|
(double)(this->ModelBounds[2*i+1]-this->ModelBounds[2*i]));
|
|
}
|
|
else //clamp
|
|
{
|
|
if ( x[i] < this->ModelBounds[2*i] )
|
|
{
|
|
this->FocalPoint[i] = this->ModelBounds[2*i];
|
|
}
|
|
if ( x[i] > this->ModelBounds[2*i+1] )
|
|
{
|
|
this->FocalPoint[i] = this->ModelBounds[2*i+1];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void vtkCursor3D::SetModelBounds(double bounds[6])
|
|
{
|
|
this->SetModelBounds(bounds[0], bounds[1], bounds[2], bounds[3], bounds[4],
|
|
bounds[5]);
|
|
}
|
|
|
|
// Turn every part of the 3D cursor on.
|
|
void vtkCursor3D::AllOn()
|
|
{
|
|
this->OutlineOn();
|
|
this->AxesOn();
|
|
this->XShadowsOn();
|
|
this->YShadowsOn();
|
|
this->ZShadowsOn();
|
|
}
|
|
|
|
// Turn every part of the 3D cursor off.
|
|
void vtkCursor3D::AllOff()
|
|
{
|
|
this->OutlineOff();
|
|
this->AxesOff();
|
|
this->XShadowsOff();
|
|
this->YShadowsOff();
|
|
this->ZShadowsOff();
|
|
}
|
|
|
|
void vtkCursor3D::PrintSelf(ostream& os, vtkIndent indent)
|
|
{
|
|
this->Superclass::PrintSelf(os,indent);
|
|
|
|
os << indent << "ModelBounds: \n";
|
|
os << indent << " Xmin,Xmax: (" << this->ModelBounds[0] << ", " << this->ModelBounds[1] << ")\n";
|
|
os << indent << " Ymin,Ymax: (" << this->ModelBounds[2] << ", " << this->ModelBounds[3] << ")\n";
|
|
os << indent << " Zmin,Zmax: (" << this->ModelBounds[4] << ", " << this->ModelBounds[5] << ")\n";
|
|
|
|
os << indent << "Focal Point: (" << this->FocalPoint[0] << ", "
|
|
<< this->FocalPoint[1] << ", "
|
|
<< this->FocalPoint[2] << ")\n";
|
|
|
|
os << indent << "Outline: " << (this->Outline ? "On\n" : "Off\n");
|
|
os << indent << "Axes: " << (this->Axes ? "On\n" : "Off\n");
|
|
os << indent << "XShadows: " << (this->XShadows ? "On\n" : "Off\n");
|
|
os << indent << "YShadows: " << (this->YShadows ? "On\n" : "Off\n");
|
|
os << indent << "ZShadows: " << (this->ZShadows ? "On\n" : "Off\n");
|
|
os << indent << "Wrap: " << (this->Wrap ? "On\n" : "Off\n");
|
|
os << indent << "Translation Mode: "
|
|
<< (this->TranslationMode ? "On\n" : "Off\n");
|
|
}
|
|
|