Cloned library of VTK-5.0.0 with extra build files for internal package management.
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.
 
 
 
 
 
 

144 lines
3.8 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkMCubesWriter.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 "vtkMCubesWriter.h"
#include "vtkByteSwap.h"
#include "vtkCellArray.h"
#include "vtkObjectFactory.h"
#include "vtkPointData.h"
#include "vtkPolyData.h"
vtkCxxRevisionMacro(vtkMCubesWriter, "$Revision: 1.34 $");
vtkStandardNewMacro(vtkMCubesWriter);
// Create object.
vtkMCubesWriter::vtkMCubesWriter()
{
this->LimitsFileName = NULL;
}
vtkMCubesWriter::~vtkMCubesWriter()
{
if ( this->LimitsFileName )
{
delete [] this->LimitsFileName;
}
}
static void WriteMCubes(FILE *fp, vtkPoints *pts, vtkDataArray *normals,
vtkCellArray *polys);
static void WriteLimits(FILE *fp, double *bounds);
// Write out data in MOVIE.BYU format.
void vtkMCubesWriter::WriteData()
{
vtkPoints *pts;
vtkDataArray *normals;
vtkCellArray *polys;
vtkPolyData *input=this->GetInput();
polys = input->GetPolys();
pts = input->GetPoints();
if (pts == NULL || polys == NULL )
{
vtkErrorMacro(<<"No data to write!");
return;
}
normals = input->GetPointData()->GetNormals();
if (normals == NULL )
{
vtkErrorMacro(<<"No normals to write!: use vtkPolyDataNormals to generate them");
return;
}
if ( this->FileName == NULL)
{
vtkErrorMacro(<< "Please specify FileName to write");
return;
}
vtkDebugMacro("Writing MCubes tri file");
FILE *fp;
if ((fp = fopen(this->FileName, "w")) == NULL)
{
vtkErrorMacro(<< "Couldn't open file: " << this->FileName);
return;
}
WriteMCubes (fp, pts, normals, polys);
fclose (fp);
if (this->LimitsFileName)
{
vtkDebugMacro("Writing MCubes limits file");
if ((fp = fopen(this->LimitsFileName, "w")) == NULL)
{
vtkErrorMacro(<< "Couldn't open file: " << this->LimitsFileName);
return;
}
WriteLimits (fp, input->GetBounds ());
fclose (fp);
}
}
void WriteMCubes(FILE *fp, vtkPoints *pts, vtkDataArray *normals,
vtkCellArray *polys)
{
typedef struct {float x[3], n[3];} pointType;
pointType point;
int i;
vtkIdType npts;
vtkIdType *indx = 0;
// Write out triangle polygons. In not a triangle polygon, create
// triangles.
//
double p[3], n[3];
for (polys->InitTraversal(); polys->GetNextCell(npts,indx); )
{
for (i=0; i < 3; i++)
{
pts->GetPoint(indx[i],p);
normals->GetTuple(indx[i],n);
point.x[0] = (float)p[0];
point.x[1] = (float)p[1];
point.x[2] = (float)p[2];
point.n[0] = (float)n[0];
point.n[1] = (float)n[1];
point.n[2] = (float)n[2];
vtkByteSwap::SwapWrite4BERange((float *) (&point),6,fp);
}
}
}
void WriteLimits(FILE *fp, double *bounds)
{
float fbounds[6];
fbounds[0] = (float)bounds[0];
fbounds[1] = (float)bounds[1];
fbounds[2] = (float)bounds[2];
fbounds[3] = (float)bounds[3];
fbounds[4] = (float)bounds[4];
fbounds[5] = (float)bounds[5];
vtkByteSwap::SwapWrite4BERange((float *) fbounds,6,fp);
vtkByteSwap::SwapWrite4BERange((float *) fbounds,6,fp);
}
void vtkMCubesWriter::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os,indent);
os << indent << "Limits File Name: "
<< (this->LimitsFileName ? this->LimitsFileName : "(none)") << "\n";
}