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.
 
 
 
 
 
 

229 lines
5.6 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkIVWriter.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 "vtkIVWriter.h"
#include "vtkAbstractMapper.h"
#include "vtkCellArray.h"
#include "vtkLookupTable.h"
#include "vtkObjectFactory.h"
#include "vtkPolyData.h"
vtkCxxRevisionMacro(vtkIVWriter, "$Revision: 1.33 $");
vtkStandardNewMacro(vtkIVWriter);
void vtkIVWriter::WriteData()
{
FILE *fp;
// make sure the user specified a FileName
if ( this->FileName == NULL)
{
vtkErrorMacro(<< "Please specify FileName to use");
return;
}
// try opening the files
fp = fopen(this->FileName,"w");
if (!fp)
{
vtkErrorMacro(<< "unable to open OpenInventor file: " << this->FileName);
return;
}
//
// Write header
//
vtkDebugMacro("Writing OpenInventor file");
fprintf(fp,"#Inventor V2.0 ascii\n");
fprintf(fp,"# OpenInventor file written by the visualization toolkit\n\n");
this->WritePolyData(this->GetInput(), fp);
if (fclose(fp))
{
vtkErrorMacro(<< this->FileName
<< " did not close successfully. Check disk space.");
}
}
void vtkIVWriter::WritePolyData(vtkPolyData *pd, FILE *fp)
{
vtkPoints *points;
vtkIdType i;
vtkCellArray *cells;
vtkIdType npts = 0;
vtkIdType *indx = 0;
vtkUnsignedCharArray *colors=NULL;
int offset=0;
points = pd->GetPoints();
// create colors for vertices
vtkDataArray *scalars = vtkAbstractMapper::
GetScalars(pd, VTK_SCALAR_MODE_USE_POINT_DATA, 0, 0, NULL, offset);
if ( scalars )
{
vtkLookupTable *lut;
if ( (lut=scalars->GetLookupTable()) == NULL )
{
lut = vtkLookupTable::New();
lut->Build();
}
colors = lut->MapScalars(scalars,VTK_COLOR_MODE_DEFAULT,0);
if ( ! scalars->GetLookupTable() )
{
lut->Delete();
}
}
fprintf(fp,"Separator {\n");
// Point data (coordinates)
fprintf(fp,"\tCoordinate3 {\n");
fprintf(fp,"\t\tpoint [\n");
fprintf(fp,"\t\t\t");
for (i=0; i<points->GetNumberOfPoints(); i++)
{
double xyz[3];
points->GetPoint(i, xyz);
fprintf(fp, "%g %g %g, ", xyz[0], xyz[1], xyz[2]);
if (!((i+1)%2))
{
fprintf(fp, "\n\t\t\t");
}
}
fprintf(fp, "\n\t\t]");
fprintf(fp, "\t}\n");
// Per vertex coloring
fprintf(fp,"\tMaterialBinding {\n");
fprintf(fp,"\t\tvalue PER_VERTEX_INDEXED\n");
fprintf(fp,"\t}\n");
// Colors, if any
if (colors)
{
fprintf(fp,"\tMaterial {\n");
fprintf(fp,"\t\tdiffuseColor [\n");
fprintf(fp, "\t\t\t");
for (i=0; i<colors->GetNumberOfTuples(); i++)
{
unsigned char *rgba;
rgba = colors->GetPointer(4*i);
fprintf(fp, "%g %g %g, ", rgba[0]/255.0f,
rgba[1]/255.0f, rgba[2]/255.0f);
if (!((i+1)%2))
{
fprintf(fp, "\n\t\t\t");
}
}
fprintf(fp, "\n\t\t]\n");
fprintf(fp,"\t}\n");
colors->Delete();
}
// write out polys if any
if (pd->GetNumberOfPolys() > 0)
{
fprintf(fp,"\tIndexedFaceSet {\n");
fprintf(fp,"\t\tcoordIndex [\n");
cells = pd->GetPolys();
for (cells->InitTraversal(); cells->GetNextCell(npts,indx); )
{
fprintf(fp, "\t\t\t");
for (i = 0; i < npts; i++)
{
// treating vtkIdType as int
fprintf(fp,"%i, ", (int)indx[i]);
}
fprintf(fp,"-1,\n");
}
fprintf(fp,"\t\t]\n");
fprintf(fp,"\t}\n");
}
// write out lines if any
if (pd->GetNumberOfLines() > 0)
{
fprintf(fp,"\tIndexedLineSet {\n");
fprintf(fp,"\t\tcoordIndex [\n");
cells = pd->GetLines();
for (cells->InitTraversal(); cells->GetNextCell(npts,indx); )
{
fprintf(fp,"\t\t\t");
for (i = 0; i < npts; i++)
{
// treating vtkIdType as int
fprintf(fp,"%i, ", (int)indx[i]);
}
fprintf(fp,"-1,\n");
}
fprintf(fp,"\t\t]\n");
fprintf(fp,"\t}\n");
}
// write out verts if any
if (pd->GetNumberOfVerts() > 0)
{
fprintf(fp,"\tIndexdedPointSet {\n");
fprintf(fp,"\t\tcoordIndex [");
cells = pd->GetVerts();
for (cells->InitTraversal(); cells->GetNextCell(npts,indx); )
{
fprintf(fp,"\t\t\t");
for (i = 0; i < npts; i++)
{
// treating vtkIdType as int
fprintf(fp,"%i, ", (int)indx[i]);
}
fprintf(fp,"-1,\n");
}
fprintf(fp,"\t\t]\n");
fprintf(fp,"\t}\n");
}
// write out tstrips if any
if (pd->GetNumberOfStrips() > 0)
{
fprintf(fp,"\tIndexedTriangleStripSet {\n");
fprintf(fp,"\t\tcoordIndex [\n");
cells = pd->GetStrips();
for (cells->InitTraversal(); cells->GetNextCell(npts,indx); )
{
fprintf(fp,"\t\t\t");
for (i = 0; i < npts; i++)
{
// treating vtkIdType as int
fprintf(fp,"%i, ", (int)indx[i]);
}
fprintf(fp,"-1,\n");
}
fprintf(fp,"\t\t]\n");
fprintf(fp,"\t}\n");
}
fprintf(fp,"}\n"); // close the Shape
}
//----------------------------------------------------------------------------
void vtkIVWriter::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os,indent);
}