diff --git a/src/osgDB/Registry.cpp b/src/osgDB/Registry.cpp index 6579240af..4b609af61 100644 --- a/src/osgDB/Registry.cpp +++ b/src/osgDB/Registry.cpp @@ -444,6 +444,11 @@ Registry::Registry() addFileExtensionAlias("modified", "revisions"); + // STEP/IGES file mappings + addFileExtensionAlias("stp", "opencascade"); + addFileExtensionAlias("step", "opencascade"); + addFileExtensionAlias("igs", "opencascade"); + addFileExtensionAlias("iges", "opencascade"); // add built-in mime-type extension mappings diff --git a/src/osgPlugins/CMakeLists.txt b/src/osgPlugins/CMakeLists.txt index 2ee6b37b1..84fd1e6e8 100644 --- a/src/osgPlugins/CMakeLists.txt +++ b/src/osgPlugins/CMakeLists.txt @@ -154,7 +154,7 @@ IF(FBX_FOUND AND OSG_CPP_EXCEPTIONS_AVAILABLE) ENDIF() IF(OPENCASCADE_FOUND) - ADD_SUBDIRECTORY(iges) + ADD_SUBDIRECTORY(OpenCASCADE) ENDIF() ADD_SUBDIRECTORY(bvh) diff --git a/src/osgPlugins/iges/CMakeLists.txt b/src/osgPlugins/OpenCASCADE/CMakeLists.txt similarity index 71% rename from src/osgPlugins/iges/CMakeLists.txt rename to src/osgPlugins/OpenCASCADE/CMakeLists.txt index 3501104f1..be97e5274 100644 --- a/src/osgPlugins/iges/CMakeLists.txt +++ b/src/osgPlugins/OpenCASCADE/CMakeLists.txt @@ -1,11 +1,11 @@ INCLUDE_DIRECTORIES(${OPENCASCADE_INCLUDE_DIR}) SET(TARGET_SRC - ReaderWriterIGES.cpp + ReaderWriterOpenCASCADE.cpp ) SET(TARGET_H - ReaderWriterIGES.h + ReaderWriterOpenCASCADE.h ) SET(TARGET_LIBRARIES_VARS OPENCASCADE_LIBRARY) @@ -14,4 +14,4 @@ SET(TARGET_LIBRARIES_VARS OPENCASCADE_LIBRARY) set (CMAKE_CXX_STANDARD 11) #### end var setup ### -SETUP_PLUGIN(iges) +SETUP_PLUGIN(opencascade) diff --git a/src/osgPlugins/OpenCASCADE/ReaderWriterOpenCASCADE.cpp b/src/osgPlugins/OpenCASCADE/ReaderWriterOpenCASCADE.cpp new file mode 100644 index 000000000..080c504dd --- /dev/null +++ b/src/osgPlugins/OpenCASCADE/ReaderWriterOpenCASCADE.cpp @@ -0,0 +1,428 @@ +/**************************************************************************** + * + * + * Copyright 2010-2013, VizExpertsIndia Pvt. Ltd. (unpublished) + * + * All rights reserved. This notice is intended as a precaution against + * inadvertent publication and does not imply publication or any waiver + * of confidentiality. The year included in the foregoing notice is the + * year of creation of the work. No part of this work may be used, + * reproduced, or transmitted in any form or by any means without the prior + * written permission of Vizexperts India Pvt Ltd. + * + * + *************************************************************************** + */ + +/// \file ReaderWritterOpenCASCADE.cpp +/// \brief implementation file for osgdb plugin for IGES format +/// contains implementation of ReaderWritterOpenCASCADE class +/// \author Abhishek Bansal + +#include "ReaderWriterOpenCASCADE.h" + +#include + +// OpenCascade Headers +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include + +#include + +// osg headers +#include +#include + +#include +#include + +//#define _LOG_DEBUG_ + +REGISTER_OSGPLUGIN(OpenCASCADE, ReaderWritterOpenCASCADE) + +ReaderWritterOpenCASCADE::ReaderWritterOpenCASCADE() +{ + OSG_NOTICE<<"ReaderWritterOpenCASCADE::ReaderWritterOpenCASCADE()"< ReaderWritterOpenCASCADE::OCCTKReader::_createGeometryFromShape(TopoDS_Shape& shape, const osg::Vec3& geomColor, gp_Trsf& transformation) +{ + // vector to save vertices + osg::ref_ptr vertexList = new osg::Vec3Array(); + // vector to save _colorTool + osg::ref_ptr colorList = new osg::Vec3Array(); + + // create one osg primitive set + osg::ref_ptr triangleStrip = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0); + unsigned int noOfTriangles = 0; + + osg::ref_ptr geom = new osg::Geometry; + if(!shape.IsNull()) + { + // clean any previous triangulation + BRepTools::Clean(shape); + + //_healShape(shape); + + #ifdef _LOG_DEBUG_ + std::cout << std::endl << "Building a Mesh !!" ; + #endif + + /// call to incremental mesh on this shape + /// \todo not sure why this 1 is passed. Its called deflection BTW + /// need to find a way to calculate it + double linearDeflection = 1.0; + BRepMesh_IncrementalMesh(shape, linearDeflection); + + ///iterate faces + // this variable will help in keeping track of face indices + unsigned int index = 0; + for (TopExp_Explorer ex(shape, TopAbs_FACE); ex.More(); ex.Next()) + { + TopoDS_Face face = TopoDS::Face(ex.Current()); + TopLoc_Location location; + + /// triangulate current face + Handle (Poly_Triangulation) triangulation = BRep_Tool::Triangulation(face, location); + if (!triangulation.IsNull()) + { + int noOfNodes = triangulation->NbNodes(); + + // Store vertices. Build vertex array here + for(int j = 1; j <= triangulation->NbNodes(); j++) + { + // populate vertex list + // Ref: http://www.opencascade.org/org/forum/thread_16694/?forum=3 + gp_Pnt pt = (triangulation->Nodes())(j).Transformed(transformation * location.Transformation()); + vertexList->push_back(osg::Vec3(pt.X(), pt.Y(), pt.Z())); + + // populate color list + colorList->push_back(geomColor); + } + + /// now we need to get face indices for triangles + // get list of triangle first + const Poly_Array1OfTriangle& triangles = triangulation->Triangles(); + + //No of triangles in this triangulation + noOfTriangles = triangulation->NbTriangles(); + + Standard_Integer v1, v2, v3; + for (unsigned int j = 1; j <= noOfTriangles; j++) + { + /// If face direction is reversed then we add verticews in reverse order + /// order of vertices is important for normal calculation later + if (face.Orientation() == TopAbs_REVERSED) + { + triangles(j).Get(v1, v3, v2); + } + else + { + triangles(j).Get(v1, v2, v3); + } + triangleStrip->push_back(index + v1 - 1); + triangleStrip->push_back(index + v2 - 1); + triangleStrip->push_back(index + v3 - 1); + } + index = index + noOfNodes; + } + } + + #ifdef _LOG_DEBUG_ + std::cout << "Creating a geometry.." << std::endl; + #endif + + geom->setVertexArray(vertexList.get()); + + geom->setColorArray(colorList.get()); + geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX); + + #ifdef _LOG_DEBUG_ + std::cout << "Adding Primitive set" << std::endl; + #endif + + geom->addPrimitiveSet(triangleStrip); + } + + return geom; +} + +/// \brief this function is single point of contact for this class. +/// it takes path of IGES file and returns an OpenSceneGraph Geode +/// which directly can be used anywhere. It calculates normals using osgUtil::smoother +osg::ref_ptr ReaderWritterOpenCASCADE::OCCTKReader::igesToOSGGeode(const std::string& filePath) +{ + // XDE: Extended Data Exchange + // OCAF: OpenCascade Application Technology Framework + /// Getting an XDE document + Handle(TDocStd_Document) doc; + XCAFApp_Application::GetApplication()->NewDocument("MDTV-XCAF", doc); + + std::string ext = osgDB::getLowerCaseFileExtension(filePath); + if (ext=="stp" || ext=="step") + { + OSG_NOTICE<<"Using STEPCAFControl_Reader to read file : "<Main()); + + // To query, edit, or initialize a Document to handle Colors of XCAF + _colorTool = XCAFDoc_DocumentTool::ColorTool(doc->Main()); + + // free shape sequence + // get sequence of free shape lables + TDF_LabelSequence freeShapes; + _assembly->GetFreeShapes(freeShapes); + + if(freeShapes.Length() == 0) + { + std::cout << "No Shapes found" << endl; + return NULL; + } + else + { + std::cout << std::endl << "No of Free Shapes: " << freeShapes.Length(); + } + + _modelGeode = new osg::Geode(); + /// send all root nodes for recursive traversing + /// find transformation as it will be needed for location calculation later + for (int i = 1; i <= freeShapes.Length(); i++) + { + Handle(XCAFDoc_Location) attribute; + gp_Trsf transformation; + freeShapes.Value(i).FindAttribute(XCAFDoc_Location::GetID(), attribute); + if(attribute.IsNull() == Standard_False) + { + TopLoc_Location location = attribute->Get(); + transformation = location.Transformation(); + } + _traverse(freeShapes.Value(i), transformation); + } + + /// calculate normals + #ifdef _LOG_DEBUG_ + std::cout << "Calculating Normals" << std::endl; + #endif + + osgUtil::SmoothingVisitor sv; + _modelGeode->accept(sv); + + return _modelGeode; +} + +/// \brief recursively traverse opencascade assembly structure and build a osg geode +/// this function also finds color for leaf node shapes and calculates transformation from parent +/// to leaf +/// \param shapeTree its a OCT(OpenCascade Technology) XDE document label which might contain children or referred shapes +/// \param transformation contains transformation matrix to be applied +/// \note Simple Shape: is a shape which is not a compound. Its can be a free or non free shape +/// \note Support Thread: http://www.opencascade.org/org/forum/thread_25512/?forum=3 +void ReaderWritterOpenCASCADE::OCCTKReader::_traverse(const TDF_Label &shapeTree, gp_Trsf& transformation) +{ + TDF_Label referredShape; + /// find if current shape referes some shape. if it does then traverse that + /// else it is a simple shape and do visualize that simple shape + if(_assembly->GetReferredShape(shapeTree, referredShape)) + { + Handle(XCAFDoc_Location) attribute; + referredShape.FindAttribute(XCAFDoc_Location::GetID(), attribute); + if(attribute.IsNull() == Standard_False) + { + TopLoc_Location location = attribute->Get(); + transformation *= location.Transformation(); + } + + /// if referred shape has children traverse them first else + /// travese the shape itself + if(referredShape.HasChild()) + { + TDF_ChildIterator it; + for(it.Initialize(referredShape); it.More(); it.Next()) + { + _traverse(it.Value(), transformation); + } + } + else + { + #ifdef _LOG_DEBUG_ + std::cout << std::endl << "No children found"; + #endif + _traverse(referredShape, transformation); + } + } + else + { + /// Find out if this simple shape has any color store that color as color of geometry + Quantity_Color color; + osg::Vec3 geomColor = osg::Vec3(.7, .7, .7); + if(_colorTool->GetColor(shapeTree, XCAFDoc_ColorGen, color) || + _colorTool->GetColor(shapeTree, XCAFDoc_ColorSurf, color) || + _colorTool->GetColor(shapeTree, XCAFDoc_ColorCurv, color) ) + { + #ifdef _LOG_DEBUG_ + std::cout << std::endl << "Free Shape has a color !! " << color.Red() << " " << color.Green() << " "<< color.Blue(); + #endif + geomColor = osg::Vec3(color.Red(),color.Green(), color.Blue()); + } + + TopoDS_Shape shape = _assembly->GetShape(shapeTree); + + Handle(XCAFDoc_Location) attribute; + shapeTree.FindAttribute(XCAFDoc_Location::GetID(), attribute); + if(attribute.IsNull() == Standard_False) + { + TopLoc_Location location = attribute->Get(); + transformation *= location.Transformation(); + } + + osg::ref_ptr geom = _createGeometryFromShape(shape, geomColor, transformation); + /// add this geometry to model geode + if(geom.valid()) + { + _modelGeode->addDrawable(geom); + } + else + { + std::cout << std::endl << "Invalid Geometry found !!"; + } + } +} diff --git a/src/osgPlugins/iges/ReaderWriterIGES.cpp b/src/osgPlugins/iges/ReaderWriterIGES.cpp deleted file mode 100644 index 75f156764..000000000 --- a/src/osgPlugins/iges/ReaderWriterIGES.cpp +++ /dev/null @@ -1,432 +0,0 @@ -/**************************************************************************** - * - * - * Copyright 2010-2013, VizExpertsIndia Pvt. Ltd. (unpublished) - * - * All rights reserved. This notice is intended as a precaution against - * inadvertent publication and does not imply publication or any waiver - * of confidentiality. The year included in the foregoing notice is the - * year of creation of the work. No part of this work may be used, - * reproduced, or transmitted in any form or by any means without the prior - * written permission of Vizexperts India Pvt Ltd. - * - * - *************************************************************************** - */ - -/// \file ReaderWriterIGES.cpp -/// \brief implementation file for osgdb plugin for IGES format -/// contains implementation of ReaderWriterIGES class -/// \author Abhishek Bansal - -#include "ReaderWriterIGES.h" - -#include - -// OpenCascade Headers -#include -#include - -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include -#include - -#include -#include - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include -#include - -#include - -// osg headers -#include -#include - -#include -#include - -//#define _LOG_DEBUG_ - -namespace IGES -{ - REGISTER_OSGPLUGIN(iges, ReaderWriterIGES) - - ReaderWriterIGES::ReaderWriterIGES() - { - OSG_NOTICE<<"ReaderWriterIGES::ReaderWriterIGES()"< ReaderWriterIGES::IGESReader::_createGeometryFromShape(TopoDS_Shape& shape, const osg::Vec3& geomColor, gp_Trsf& transformation) - { - // vector to save vertices - osg::ref_ptr vertexList = new osg::Vec3Array(); - // vector to save _colorTool - osg::ref_ptr colorList = new osg::Vec3Array(); - - // create one osg primitive set - osg::ref_ptr triangleStrip = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0); - unsigned int noOfTriangles = 0; - - osg::ref_ptr geom = new osg::Geometry; - if(!shape.IsNull()) - { - // clean any previous triangulation - BRepTools::Clean(shape); - - //_healShape(shape); - - #ifdef _LOG_DEBUG_ - std::cout << std::endl << "Building a Mesh !!" ; - #endif - - /// call to incremental mesh on this shape - /// \todo not sure why this 1 is passed. Its called deflection BTW - /// need to find a way to calculate it - double linearDeflection = 1.0; - BRepMesh_IncrementalMesh(shape, linearDeflection); - - ///iterate faces - // this variable will help in keeping track of face indices - unsigned int index = 0; - for (TopExp_Explorer ex(shape, TopAbs_FACE); ex.More(); ex.Next()) - { - TopoDS_Face face = TopoDS::Face(ex.Current()); - TopLoc_Location location; - - /// triangulate current face - Handle (Poly_Triangulation) triangulation = BRep_Tool::Triangulation(face, location); - if (!triangulation.IsNull()) - { - int noOfNodes = triangulation->NbNodes(); - - // Store vertices. Build vertex array here - for(int j = 1; j <= triangulation->NbNodes(); j++) - { - // populate vertex list - // Ref: http://www.opencascade.org/org/forum/thread_16694/?forum=3 - gp_Pnt pt = (triangulation->Nodes())(j).Transformed(transformation * location.Transformation()); - vertexList->push_back(osg::Vec3(pt.X(), pt.Y(), pt.Z())); - - // populate color list - colorList->push_back(geomColor); - } - - /// now we need to get face indices for triangles - // get list of triangle first - const Poly_Array1OfTriangle& triangles = triangulation->Triangles(); - - //No of triangles in this triangulation - noOfTriangles = triangulation->NbTriangles(); - - Standard_Integer v1, v2, v3; - for (unsigned int j = 1; j <= noOfTriangles; j++) - { - /// If face direction is reversed then we add verticews in reverse order - /// order of vertices is important for normal calculation later - if (face.Orientation() == TopAbs_REVERSED) - { - triangles(j).Get(v1, v3, v2); - } - else - { - triangles(j).Get(v1, v2, v3); - } - triangleStrip->push_back(index + v1 - 1); - triangleStrip->push_back(index + v2 - 1); - triangleStrip->push_back(index + v3 - 1); - } - index = index + noOfNodes; - } - } - - #ifdef _LOG_DEBUG_ - std::cout << "Creating a geometry.." << std::endl; - #endif - - geom->setVertexArray(vertexList.get()); - - geom->setColorArray(colorList.get()); - geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX); - - #ifdef _LOG_DEBUG_ - std::cout << "Adding Primitive set" << std::endl; - #endif - - geom->addPrimitiveSet(triangleStrip); - } - - return geom; - } - - /// \brief this function is single point of contact for this class. - /// it takes path of IGES file and returns an OpenSceneGraph Geode - /// which directly can be used anywhere. It calculates normals using osgUtil::smoother - osg::ref_ptr ReaderWriterIGES::IGESReader::igesToOSGGeode(const std::string& filePath) - { - // XDE: Extended Data Exchange - // OCAF: OpenCascade Application Technology Framework - /// Getting an XDE document - Handle(TDocStd_Document) doc; - XCAFApp_Application::GetApplication()->NewDocument("MDTV-XCAF", doc); - - std::string ext = osgDB::getLowerCaseFileExtension(filePath); - if (ext=="stp" || ext=="step") - { - OSG_NOTICE<<"Using STEPCAFControl_Reader to read file : "<Main()); - - // To query, edit, or initialize a Document to handle Colors of XCAF - _colorTool = XCAFDoc_DocumentTool::ColorTool(doc->Main()); - - // free shape sequence - // get sequence of free shape lables - TDF_LabelSequence freeShapes; - _assembly->GetFreeShapes(freeShapes); - - if(freeShapes.Length() == 0) - { - std::cout << "No Shapes found" << endl; - return NULL; - } - else - { - std::cout << std::endl << "No of Free Shapes: " << freeShapes.Length(); - } - - _modelGeode = new osg::Geode(); - /// send all root nodes for recursive traversing - /// find transformation as it will be needed for location calculation later - for (int i = 1; i <= freeShapes.Length(); i++) - { - Handle(XCAFDoc_Location) attribute; - gp_Trsf transformation; - freeShapes.Value(i).FindAttribute(XCAFDoc_Location::GetID(), attribute); - if(attribute.IsNull() == Standard_False) - { - TopLoc_Location location = attribute->Get(); - transformation = location.Transformation(); - } - _traverse(freeShapes.Value(i), transformation); - } - - /// calculate normals - #ifdef _LOG_DEBUG_ - std::cout << "Calculating Normals" << std::endl; - #endif - - osgUtil::SmoothingVisitor sv; - _modelGeode->accept(sv); - - return _modelGeode; - } - - /// \brief recursively traverse opencascade assembly structure and build a osg geode - /// this function also finds color for leaf node shapes and calculates transformation from parent - /// to leaf - /// \param shapeTree its a OCT(OpenCascade Technology) XDE document label which might contain children or referred shapes - /// \param transformation contains transformation matrix to be applied - /// \note Simple Shape: is a shape which is not a compound. Its can be a free or non free shape - /// \note Support Thread: http://www.opencascade.org/org/forum/thread_25512/?forum=3 - void ReaderWriterIGES::IGESReader::_traverse(const TDF_Label &shapeTree, gp_Trsf& transformation) - { - TDF_Label referredShape; - /// find if current shape referes some shape. if it does then traverse that - /// else it is a simple shape and do visualize that simple shape - if(_assembly->GetReferredShape(shapeTree, referredShape)) - { - Handle(XCAFDoc_Location) attribute; - referredShape.FindAttribute(XCAFDoc_Location::GetID(), attribute); - if(attribute.IsNull() == Standard_False) - { - TopLoc_Location location = attribute->Get(); - transformation *= location.Transformation(); - } - - /// if referred shape has children traverse them first else - /// travese the shape itself - if(referredShape.HasChild()) - { - TDF_ChildIterator it; - for(it.Initialize(referredShape); it.More(); it.Next()) - { - _traverse(it.Value(), transformation); - } - } - else - { - #ifdef _LOG_DEBUG_ - std::cout << std::endl << "No children found"; - #endif - _traverse(referredShape, transformation); - } - } - else - { - /// Find out if this simple shape has any color store that color as color of geometry - Quantity_Color color; - osg::Vec3 geomColor = osg::Vec3(.7, .7, .7); - if(_colorTool->GetColor(shapeTree, XCAFDoc_ColorGen, color) || - _colorTool->GetColor(shapeTree, XCAFDoc_ColorSurf, color) || - _colorTool->GetColor(shapeTree, XCAFDoc_ColorCurv, color) ) - { - #ifdef _LOG_DEBUG_ - std::cout << std::endl << "Free Shape has a color !! " << color.Red() << " " << color.Green() << " "<< color.Blue(); - #endif - geomColor = osg::Vec3(color.Red(),color.Green(), color.Blue()); - } - - TopoDS_Shape shape = _assembly->GetShape(shapeTree); - - Handle(XCAFDoc_Location) attribute; - shapeTree.FindAttribute(XCAFDoc_Location::GetID(), attribute); - if(attribute.IsNull() == Standard_False) - { - TopLoc_Location location = attribute->Get(); - transformation *= location.Transformation(); - } - - osg::ref_ptr geom = _createGeometryFromShape(shape, geomColor, transformation); - /// add this geometry to model geode - if(geom.valid()) - { - _modelGeode->addDrawable(geom); - } - else - { - std::cout << std::endl << "Invalid Geometry found !!"; - } - } - } - -} // namespace diff --git a/src/osgPlugins/iges/ReaderWriterIGES.h b/src/osgPlugins/iges/ReaderWriterIGES.h deleted file mode 100644 index 5e0a836d7..000000000 --- a/src/osgPlugins/iges/ReaderWriterIGES.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * IGES importer for OpenSceneGraph. - * Copyright (c)2013 VizExperts India Pvt. Ltd. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _READERWRITERIGES_H_ -#define _READERWRITERIGES_H_ - -/// \file ReaderWriterIGES.h -/// \brief header file for creating osgdb plugin for IGES format -/// \author Abhishek Bansal, Engineer Graphics, vizExperts India Pvt. Ltd. - -#ifdef WIN32 -/// \brief preproccessor macro required for compilation with open cascade -/// \todo not sure what it does -#define WNT -#endif - -#include - -#include -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include - -/// \class ReaderWriterIGES -/// \brief contains implementation of reading IGES models -/// depends on OpenCascade library -/// this code was written with version 6.6.0 -/// \todo enabling/disabling Healing can be added as reader writer options - -namespace IGES -{ - class ReaderWriterIGES: public osgDB::ReaderWriter - { - public: - /// \brief constructor - ReaderWriterIGES(); - - /// \brief returns class name - virtual const char* className() const { return "STEP/IGES Reader"; } - - virtual osgDB::ReaderWriter::ReadResult readNode(const std::string& fileName, const osgDB::ReaderWriter::Options*) const; - - virtual osgDB::ReaderWriter::WriteResult writeNode(const osg::Node&, const std::string&, const Options* =NULL) const ; - - private: - - /// \brief following class will contain all reading related functionality - /// \detail this class uses OCT XDE module to read IGES file. XDE mechanism is needed - /// to find out colors and transformation of sub shapes. - /// normal IGESReader wasn't giving very good results with shapes. Edges weren't sharp enough - /// and also there is no way in which we can get color information with that - /// \Note Go through XDE user guide and IGES User guide supplied with - /// \todo OSG automatic normal calculation is not working good for few mnodels - /// try to get from XDE document only - class IGESReader - { - public: - - /// \brief this function is single point of contact for this class. - /// it takes path of IGES file and returns an OpenSceneGraph Geode - /// which directly can be used anywhere. It calculates normals using osgUtil::smoother - osg::ref_ptr igesToOSGGeode(const std::string& filePath); - - private: - - /// \brief heals a opencascade shape - /// \detail http://www.opencascade.org/org/forum/thread_12716/?forum=3 - /// Usually IGES files suffer from precision problems (when transfering from - /// one CAD system to another).It might be the case that faces are not sewed - /// properly, or do not have the right precision, and so the tesselator does - /// not treat them like "sewed". this needs to be done for sewing - /// \param[in,out] shape opencascade shape to be healed - void _healShape(TopoDS_Shape& shape); - - /// \brief recursively traverse opencascade assembly structure and build a osg geode - /// this function also finds color for leaf node shapes and calculates transformation from parent - /// to leaf - /// \param[in] shapeTree its a OCT(OpenCascade Technology) XDE document label which might contain children or referred shapes - /// \param[in] transformation contains transformation matrix to be applied - void _traverse(const TDF_Label &shapeTree, gp_Trsf& transformation); - - - /// \brief takes and OpenCascadeShape and returns OSG geometry(drawable), which further can be added to a geode - /// \detail it iterates shape and breaks it into faces, builds vertex list, color list and creates geometry - /// transformation is applied to each vertex before storing it into vertex list - /// all vertices are assigned same color - /// \param[in] shape shape to be converted in geometry. Not a const because it needs to be modified if healing - /// is enabled - /// \param[in] color color of geometry - /// \param[in] transformation matrix with which vertex position has to be transformed - osg::ref_ptr _createGeometryFromShape(TopoDS_Shape& shape, const osg::Vec3& color, gp_Trsf& transformation); - - private: - - /// \bried XDE document color tool it stores all colors in color table - /// and used to get color from a label - Handle(XCAFDoc_ColorTool) _colorTool; - - /// \brief geode to contain full model - osg::ref_ptr _modelGeode; - - /// \brief shape tool instance to deal with shapes(simple shapes), referredShape, children etc - Handle (XCAFDoc_ShapeTool) _assembly; - }; - }; -} // namespace - -#endif // _READERWRITERIGES_H_