VRUT::STLWriter Class Reference

Class for writing STL files. More...

#include <stlwriter.h>

List of all members.

Public Member Functions

 STLWriter (wxBufferedOutputStream *_outputStream, const Scene *_scene)
 ~STLWriter ()
 Class destructor.
void Write (bool saveBinary)
 Write STL stream.

Private Member Functions

void writeASCII ()
 Write as ASCII.
void writeBinary ()
 Write as binary data.

Private Attributes

wxOutputStream * outputStream
 Input stream.
const Scenescene
 Scene container to be built.
std::vector< STLBinaryfacets


Detailed Description

Class for writing STL files.

Definition at line 22 of file stlwriter.h.


Constructor & Destructor Documentation

STLWriter::STLWriter ( wxBufferedOutputStream *  _outputStream,
const Scene _scene 
)

Class constructor

Parameters:
[in] _outputStream Stream to read data from
[in] _scene Scene to asve

Definition at line 18 of file stlwriter.cpp.

00018                                                                                  : outputStream(_outputStream), scene(_scene)
00019 {
00020 }

STLWriter::~STLWriter (  ) 

Class destructor.

Is called by wxWidgets itself on wxApp end but it doesn't work in dynamic library

Definition at line 22 of file stlwriter.cpp.

00023 {
00025 }


Member Function Documentation

void STLWriter::writeASCII (  )  [private]

Write as ASCII.

Definition at line 27 of file stlwriter.cpp.

00028 {
00029        TextWriter textWriter((wxBufferedOutputStream *)outputStream);
00030        //write header
00031        textWriter.Write("solid ")->Write(scene->GetName())->Write("\n");
00032 
00033        //write facets
00034        for (std::vector<STLBinary>::const_iterator facetIT = facets.begin(); facetIT != facets.end(); facetIT++)
00035        {
00036               textWriter.Write("   facet normal ")->Write(facetIT->norm, 3, " ")->Write("\n      outer loop\n         vertex ");
00037               textWriter.Write(facetIT->vert1, 3, " ")->Write("\n         vertex ")->Write(facetIT->vert2, 3, " ");
00038               textWriter.Write("\n         vertex ")->Write(facetIT->vert3, 3, " ")->Write("\n      endloop\n   endfacet\n");
00039        }
00040        
00041        //write tail
00042        textWriter.Write("endsolid ")->Write(scene->GetName())->Write("\n");
00043 }

void STLWriter::writeBinary (  )  [private]

Write as binary data.

Definition at line 45 of file stlwriter.cpp.

00046 {
00047        //write header
00048        char header[80];
00049        strncpy(header, scene->GetName().mb_str(wxConvISO8859_1), 80);
00050        outputStream->Write(header, 80);
00051        unsigned long count = (unsigned long)facets.size();
00052        outputStream->Write(&count, 4);
00053 
00054        //write facets
00055        wxString facet;
00056        for (std::vector<STLBinary>::const_iterator facetIT = facets.begin(); facetIT != facets.end(); facetIT++)
00057        {
00058               outputStream->Write(&(*facetIT), 50);
00059        }
00060 }

void STLWriter::Write ( bool  saveBinary  ) 

Write STL stream.

Definition at line 62 of file stlwriter.cpp.

00063 {
00064        //build facets list
00065        std::vector<NODE_ID> nodes;
00066        scene->GetNodeIDs(&nodes);
00067 
00068        for (std::vector<NODE_ID>::const_iterator nodeIt = nodes.begin();
00069               nodeIt != nodes.end(); nodeIt++)
00070        {
00071               const SceneNode * node = scene->GetNode(*nodeIt);
00072               if (!node || !node->IsOfType(SceneNode::GEOMETRY))
00073                      continue;
00074               scene->UpdateTransformation(*nodeIt);
00075 
00076               const Geometry * geom = scene->GetGeometry(((const GeometryNode *)node)->GetGeometryID());
00077               if (geom && geom->type == Geometry::GEOMETRY_TRIANGLE)
00078               {
00079                      std::vector<Triangle> triangles = geom->Triangulate();
00080                      MATRIX transf(*node->GetWorldTransMatrix());
00081                      for (size_t i=0; i<triangles.size(); i++)
00082                      {
00083                             STLBinary facet;
00084                             memcpy(facet.vert1, transf.TransformCoord(triangles.at(i).v1)._v, sizeof(float)*3);
00085                             memcpy(facet.vert2, transf.TransformCoord(triangles.at(i).v2)._v, sizeof(float)*3);
00086                             memcpy(facet.vert3, transf.TransformCoord(triangles.at(i).v3)._v, sizeof(float)*3);
00087                             memcpy(facet.norm, (VECTOR3(facet.vert2) - VECTOR3(facet.vert1)).Cross(VECTOR3(facet.vert3) - VECTOR3(facet.vert1)).Normalize()._v, sizeof(float)*3);
00088                             if (_isnan(facet.norm[0]) || _isnan(facet.norm[1]) || _isnan(facet.norm[2]))
00089                                    continue;//skip degenerated triangles
00090                             facet.attr[0]=0;
00091                             facet.attr[1]=0;
00092                             facets.push_back(facet);
00093                      }
00094               }
00095        }
00096        if (saveBinary)
00097               writeBinary();
00098        else
00099               writeASCII();
00100 }


Member Data Documentation

wxOutputStream* VRUT::STLWriter::outputStream [private]

Input stream.

Definition at line 26 of file stlwriter.h.

const Scene* VRUT::STLWriter::scene [private]

Scene container to be built.

Definition at line 28 of file stlwriter.h.

std::vector<STLBinary> VRUT::STLWriter::facets [private]

Definition at line 29 of file stlwriter.h.


The documentation for this class was generated from the following files:

Generated on Tue Mar 10 14:41:41 2009 for VRUT by  doxygen 1.5.5