* Fixed the OCC XDE Interface for BREP and IGES Files

* Added stricter error checking for face colour extraction
* Improved consistency of OCC geometry and mesh colours across file formats
This commit is contained in:
Philippose Rajan 2009-02-23 23:10:00 +00:00
parent 3271c2f5ae
commit 78736845ca
3 changed files with 378 additions and 272 deletions

View File

@ -1092,43 +1092,55 @@ namespace netgen
} }
OCCGeometry * LoadOCC_IGES (const char * filename)
// Philippose - 23/02/2009
/* Special IGES File load function including the ability
to extract individual surface colours via the extended
OpenCascade XDE and XCAF Feature set.
*/
OCCGeometry *LoadOCC_IGES(const char *filename)
{ {
OCCGeometry * occgeo; OCCGeometry *occgeo;
occgeo = new OCCGeometry; occgeo = new OCCGeometry;
IGESControl_Reader reader; // Initiate a dummy XCAF Application to handle the IGES XCAF Document
static Handle_XCAFApp_Application dummy_app = XCAFApp_Application::GetApplication();
// Create an XCAF Document to contain the IGES file itself
Handle_TDocStd_Document iges_doc;
// Check if a IGES File is already open under this handle, if so, close it to prevent
// Segmentation Faults when trying to create a new document
if(dummy_app->NbDocuments() > 0)
{
dummy_app->GetDocument(1,iges_doc);
dummy_app->Close(iges_doc);
}
dummy_app->NewDocument ("IGES-XCAF",iges_doc);
IGESCAFControl_Reader reader;
Standard_Integer stat = reader.ReadFile((char*)filename); Standard_Integer stat = reader.ReadFile((char*)filename);
// pre OCC52-times: // Enable transfer of colours
// Standard_Integer stat = reader.LoadFile((char*)filename); reader.SetColorMode(Standard_True);
// reader.Clear();
reader.Transfer(iges_doc);
reader.TransferRoots(); // Tranlate IGES -> OCC // Read in the shape(s) and the colours present in the IGES File
Handle_XCAFDoc_ShapeTool iges_shape_contents = XCAFDoc_DocumentTool::ShapeTool(iges_doc->Main());
Handle_XCAFDoc_ColorTool iges_colour_contents = XCAFDoc_DocumentTool::ColorTool(iges_doc->Main());
// pre OCC52-times: TDF_LabelSequence iges_shapes;
// reader.TransferRoots(Standard_False); // Tranlate IGES -> OCC iges_shape_contents->GetShapes(iges_shapes);
//reader.PrintTransferInfo(IFSelect_FailAndWarn,IFSelect_ListByItem);
// For the IGES Reader, all the shapes can be exported as one compund shape
// using the "OneShape" member
occgeo->shape = reader.OneShape(); occgeo->shape = reader.OneShape();
occgeo->face_colours = iges_colour_contents;
occgeo->changed = 1; occgeo->changed = 1;
occgeo->BuildFMap(); occgeo->BuildFMap();
//
// Handle(ShapeFix_Shape) sfs = new ShapeFix_Shape;
// sfs->Init(occgeo->shape);
// sfs->Perform();
// Handle(ShapeFix_Wireframe) sfwf = new ShapeFix_Wireframe(occgeo->shape);
// //sfwf->DropSmallEdgesMode() = Standard_True;
// sfwf->FixSmallEdges();
// sfwf->FixWireGaps();
//
// occgeo->BuildVisualizationMesh(); // occgeo->BuildVisualizationMesh();
occgeo->CalcBoundingBox(); occgeo->CalcBoundingBox();
PrintContents (occgeo); PrintContents (occgeo);
@ -1138,13 +1150,65 @@ namespace netgen
// Philippose - 29/01/2009
/* Special STEP File load function including the ability // Philippose - 23/02/2009
// The LOADOCC_IGES Function has been replaced by the one
// above, which also includes support for the OpenCascade
// XDE Features.
//
//OCCGeometry * LoadOCC_IGES (const char * filename)
//{
// OCCGeometry * occgeo;
// occgeo = new OCCGeometry;
// IGESControl_Reader reader;
// Standard_Integer stat = reader.ReadFile((char*)filename);
// // pre OCC52-times:
// // Standard_Integer stat = reader.LoadFile((char*)filename);
// // reader.Clear();
// reader.TransferRoots(); // Tranlate IGES -> OCC
// // pre OCC52-times:
// // reader.TransferRoots(Standard_False); // Tranlate IGES -> OCC
// //reader.PrintTransferInfo(IFSelect_FailAndWarn,IFSelect_ListByItem);
// occgeo->shape = reader.OneShape();
// occgeo->changed = 1;
// occgeo->BuildFMap();
// //
// // Handle(ShapeFix_Shape) sfs = new ShapeFix_Shape;
// // sfs->Init(occgeo->shape);
// // sfs->Perform();
// // Handle(ShapeFix_Wireframe) sfwf = new ShapeFix_Wireframe(occgeo->shape);
// // //sfwf->DropSmallEdgesMode() = Standard_True;
// // sfwf->FixSmallEdges();
// // sfwf->FixWireGaps();
// //
// // occgeo->BuildVisualizationMesh();
// occgeo->CalcBoundingBox();
// PrintContents (occgeo);
// return occgeo;
//}
// Philippose - 29/01/2009
/* Special STEP File load function including the ability
to extract individual surface colours via the extended to extract individual surface colours via the extended
OpenCascade XDE and XCAF Feature set. OpenCascade XDE and XCAF Feature set.
*/ */
OCCGeometry * LoadOCC_STEP (const char * filename) OCCGeometry * LoadOCC_STEP (const char * filename)
{ {
OCCGeometry * occgeo; OCCGeometry * occgeo;
occgeo = new OCCGeometry; occgeo = new OCCGeometry;
@ -1179,7 +1243,7 @@ OCCGeometry * LoadOCC_STEP (const char * filename)
TDF_LabelSequence step_shapes; TDF_LabelSequence step_shapes;
step_shape_contents->GetShapes(step_shapes); step_shape_contents->GetShapes(step_shapes);
/* /*
// List out the available colours in the STEP File as Colour Names // List out the available colours in the STEP File as Colour Names
TDF_LabelSequence allColours; TDF_LabelSequence allColours;
stepColourContents->GetColors(allColours); stepColourContents->GetColors(allColours);
@ -1190,8 +1254,10 @@ OCCGeometry * LoadOCC_STEP (const char * filename)
stepColourContents->GetColor(allColours.Value(i),col); stepColourContents->GetColor(allColours.Value(i),col);
cout << "Colour [" << i << "] = " << col.StringName(col.Name()) << endl; cout << "Colour [" << i << "] = " << col.StringName(col.Name()) << endl;
} }
*/ */
// For the STEP File Reader in OCC, the 1st Shape contains the entire
// compound geometry as one shape
occgeo->shape = step_shape_contents->GetShape(step_shapes.Value(1)); occgeo->shape = step_shape_contents->GetShape(step_shapes.Value(1));
occgeo->face_colours = step_colour_contents; occgeo->face_colours = step_colour_contents;
occgeo->changed = 1; occgeo->changed = 1;
@ -1202,72 +1268,72 @@ OCCGeometry * LoadOCC_STEP (const char * filename)
PrintContents (occgeo); PrintContents (occgeo);
return occgeo; return occgeo;
} }
// Philippose - 29/01/2009 // Philippose - 29/01/2009
// The LOADOCC_STEP Function has been replaced by the one // The LOADOCC_STEP Function has been replaced by the one
// above, which also includes support for the OpenCascade // above, which also includes support for the OpenCascade
// XDE Features. // XDE Features.
// //
// OCCGeometry * LoadOCC_STEP (const char * filename) // OCCGeometry * LoadOCC_STEP (const char * filename)
// { // {
// OCCGeometry * occgeo; // OCCGeometry * occgeo;
// occgeo = new OCCGeometry; // occgeo = new OCCGeometry;
// //
// STEPControl_Reader reader; // STEPControl_Reader reader;
// Standard_Integer stat = reader.ReadFile((char*)filename); // Standard_Integer stat = reader.ReadFile((char*)filename);
// Standard_Integer nb = reader.NbRootsForTransfer(); // Standard_Integer nb = reader.NbRootsForTransfer();
// reader.TransferRoots (); // Tranlate STEP -> OCC // reader.TransferRoots (); // Tranlate STEP -> OCC
// //
// //
// //
// occgeo->shape = reader.OneShape(); // occgeo->shape = reader.OneShape();
// occgeo->changed = 1; // occgeo->changed = 1;
// occgeo->BuildFMap(); // occgeo->BuildFMap();
// // // //
// //Handle(ShapeFix_Shape) sfs = new ShapeFix_Shape; // //Handle(ShapeFix_Shape) sfs = new ShapeFix_Shape;
// //sfs->Init(occgeo->shape); // //sfs->Init(occgeo->shape);
// //sfs->Perform(); // //sfs->Perform();
// //Handle(ShapeFix_Wireframe) sfwf = new ShapeFix_Wireframe(occgeo->shape); // //Handle(ShapeFix_Wireframe) sfwf = new ShapeFix_Wireframe(occgeo->shape);
// //sfwf->FixSmallEdges(); // //sfwf->FixSmallEdges();
// //sfwf->FixWireGaps(); // //sfwf->FixWireGaps();
// //
// //
// //
// /* // /*
// // JS // // JS
// TopoDS_Compound aRes; // TopoDS_Compound aRes;
// BRep_Builder aBuilder; // BRep_Builder aBuilder;
// aBuilder.MakeCompound (aRes); // aBuilder.MakeCompound (aRes);
// //
// for (TopExp_Explorer exp(occgeo->shape, TopAbs_SOLID); exp.More(); exp.Next()) // for (TopExp_Explorer exp(occgeo->shape, TopAbs_SOLID); exp.More(); exp.Next())
// { // {
// aBuilder.Add (aRes, exp.Current()); // aBuilder.Add (aRes, exp.Current());
// cout << "solid" << endl; // cout << "solid" << endl;
// } // }
// //
// for (TopExp_Explorer exp(aRes, TopAbs_SOLID); exp.More(); exp.Next()) // for (TopExp_Explorer exp(aRes, TopAbs_SOLID); exp.More(); exp.Next())
// { // {
// cout << "compound has shapes solid" << endl; // cout << "compound has shapes solid" << endl;
// } // }
// occgeo->shape = aRes; // occgeo->shape = aRes;
// occgeo->changed = 1; // occgeo->changed = 1;
// occgeo->BuildFMap(); // occgeo->BuildFMap();
// */ // */
// //
// //
// occgeo->BuildVisualizationMesh(); // occgeo->BuildVisualizationMesh();
// PrintContents (occgeo); // PrintContents (occgeo);
// //
// return occgeo; // return occgeo;
// } // }
OCCGeometry * LoadOCC_BREP (const char * filename) OCCGeometry *LoadOCC_BREP (const char *filename)
{ {
OCCGeometry * occgeo; OCCGeometry * occgeo;
occgeo = new OCCGeometry; occgeo = new OCCGeometry;
@ -1276,12 +1342,17 @@ OCCGeometry * LoadOCC_STEP (const char * filename)
Standard_Boolean result = BRepTools::Read(occgeo->shape, const_cast<char*> (filename),aBuilder); Standard_Boolean result = BRepTools::Read(occgeo->shape, const_cast<char*> (filename),aBuilder);
// cout << "Writing VRML" << endl; // cout << "Writing VRML" << endl;
// VrmlAPI::Write(occgeo->shape,"test.vrml"); // VrmlAPI::Write(occgeo->shape,"test.vrml");
// cout << "Writing STL" << endl; // cout << "Writing STL" << endl;
// StlAPI::Write(occgeo->shape,"test.stl"); // StlAPI::Write(occgeo->shape,"test.stl");
// Philippose - 23/02/2009
// Fixed a bug in the OpenCascade XDE Colour handling when
// opening BREP Files, since BREP Files have no colour data.
// Hence, the face_colours Handle needs to be created as a NULL handle.
occgeo->face_colours = Handle_XCAFDoc_ColorTool::Handle_XCAFDoc_ColorTool();
occgeo->face_colours.Nullify();
occgeo->changed = 1; occgeo->changed = 1;
occgeo->BuildFMap(); occgeo->BuildFMap();
// occgeo->BuildVisualizationMesh(); // occgeo->BuildVisualizationMesh();
@ -1291,6 +1362,9 @@ OCCGeometry * LoadOCC_STEP (const char * filename)
return occgeo; return occgeo;
} }
char * shapesname[] = char * shapesname[] =
{" ", "CompSolids", "Solids", "Shells", {" ", "CompSolids", "Solids", "Shells",
@ -1303,6 +1377,9 @@ OCCGeometry * LoadOCC_STEP (const char * filename)
char * orientationstring[] = char * orientationstring[] =
{"+", "-"}; {"+", "-"};
void OCCGeometry :: RecursiveTopologyTree (const TopoDS_Shape & sh, void OCCGeometry :: RecursiveTopologyTree (const TopoDS_Shape & sh,
stringstream & str, stringstream & str,
TopAbs_ShapeEnum l, TopAbs_ShapeEnum l,
@ -1371,6 +1448,9 @@ OCCGeometry * LoadOCC_STEP (const char * filename)
} }
} }
void OCCGeometry :: GetTopologyTree (stringstream & str) void OCCGeometry :: GetTopologyTree (stringstream & str)
{ {
cout << "Building topology tree ... " << flush; cout << "Building topology tree ... " << flush;

View File

@ -994,10 +994,10 @@ namespace netgen
glDisable (GL_COLOR_MATERIAL); glDisable (GL_COLOR_MATERIAL);
GLfloat matcol[] = { 0, 1, 0, 1 }; GLfloat matcol[] = { 1, 1, 0, 1 };
GLfloat matcolsel[] = { 1, 0, 0, 1 }; GLfloat matcolsel[] = { 1, 0, 0, 1 };
#ifdef PARALLEL #ifdef PARALLEL
GLfloat mat_coll_transp[] = { 0, 1, 0, 0.3 }; GLfloat mat_coll_transp[] = { 1, 1, 0, 0.3 };
GLfloat mat_coll_transp_sel[] = { 1, 0, 0, 0.3 }; GLfloat mat_coll_transp_sel[] = { 1, 0, 0, 0.3 };
#endif #endif
@ -1041,10 +1041,24 @@ namespace netgen
{ {
TopoDS_Face face = TopoDS::Face(occgeometry->fmap(el.GetIndex())); TopoDS_Face face = TopoDS::Face(occgeometry->fmap(el.GetIndex()));
Quantity_Color face_colour; Quantity_Color face_colour;
occgeometry->face_colours->GetColor(face,XCAFDoc_ColorSurf,face_colour); // Philippose - 23/02/2009
// Check to see if colours have been extracted first!!
// Forum bug-fox (Jean-Yves - 23/02/2009)
if(!(occgeometry->face_colours.IsNull())
&&(occgeometry->face_colours->GetColor(face,XCAFDoc_ColorSurf,face_colour)))
{
matcol[0] = face_colour.Red(); matcol[0] = face_colour.Red();
matcol[1] = face_colour.Green(); matcol[1] = face_colour.Green();
matcol[2] = face_colour.Blue(); matcol[2] = face_colour.Blue();
}
else
{
matcol[0] = 1.0;
matcol[1] = 1.0;
matcol[2] = 0.0;
}
matcol[3] = 1.0; matcol[3] = 1.0;
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matcol); glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matcol);
} }

View File

@ -541,12 +541,24 @@ namespace netgen
// Philippose - 30/01/2009 // Philippose - 30/01/2009
// OpenCascade XDE Support // OpenCascade XDE Support
Quantity_Color face_colour; Quantity_Color face_colour;
occgeometry->face_colours->GetColor(face,XCAFDoc_ColorSurf,face_colour); // Philippose - 23/02/2009
// Check to see if colours have been extracted first!!
// Forum bug-fox (Jean-Yves - 23/02/2009)
if(!(occgeometry->face_colours.IsNull())
&& (occgeometry->face_colours->GetColor(face,XCAFDoc_ColorSurf,face_colour)))
{
mat_col[0] = face_colour.Red(); mat_col[0] = face_colour.Red();
mat_col[1] = face_colour.Green(); mat_col[1] = face_colour.Green();
mat_col[2] = face_colour.Blue(); mat_col[2] = face_colour.Blue();
} }
else else
{
mat_col[0] = 1.0;
mat_col[1] = 1.0;
mat_col[2] = 0.0;
}
}
else
{ {
mat_col[0] = 0.8; mat_col[0] = 0.8;
mat_col[1] = 0.2; mat_col[1] = 0.2;