[cgma-dev] r2276 - cgm/trunk/geom/OCC
janehu at mcs.anl.gov
janehu at mcs.anl.gov
Thu Nov 20 15:17:58 CST 2008
Author: janehu
Date: 2008-11-20 15:17:58 -0600 (Thu, 20 Nov 2008)
New Revision: 2276
Modified:
cgm/trunk/geom/OCC/OCCDrawTool.cpp
cgm/trunk/geom/OCC/OCCQueryEngine.cpp
cgm/trunk/geom/OCC/OCCQueryEngine.hpp
Log:
Partial fix for user reported error in OCCDrawTool, and some minor changes.
Modified: cgm/trunk/geom/OCC/OCCDrawTool.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCDrawTool.cpp 2008-11-19 19:06:22 UTC (rev 2275)
+++ cgm/trunk/geom/OCC/OCCDrawTool.cpp 2008-11-20 21:17:58 UTC (rev 2276)
@@ -70,7 +70,7 @@
for (ii=1; ii<=M.Extent(); ii++)
{
TopologyBridge *face = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
- OCCSurface *occ_face = CAST_TO(occ_face, OCCSurface);
+ OCCSurface *occ_face = CAST_TO(face, OCCSurface);
Face_list.append_unique(occ_face->get_TopoDS_Face());
}
int i;
@@ -181,6 +181,9 @@
GMem g_mem;
int num_points;
OCCQueryEngine *OQE = OCCQueryEngine::instance();
+ double tol = OQE->get_sme_resabs_tolerance();
+ if (curve->get_arc_length() < tol)
+ return CUBIT_SUCCESS;
// get the graphics
CubitStatus stat;
stat = OQE->get_graphics( curve, num_points, &g_mem );
Modified: cgm/trunk/geom/OCC/OCCQueryEngine.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCQueryEngine.cpp 2008-11-19 19:06:22 UTC (rev 2275)
+++ cgm/trunk/geom/OCC/OCCQueryEngine.cpp 2008-11-20 21:17:58 UTC (rev 2276)
@@ -31,8 +31,11 @@
#include "Poly_Triangle.hxx"
#include "BRepAlgoAPI_BooleanOperation.hxx"
#include "Handle_Poly_Triangulation.hxx"
+#include "BRepAdaptor_Curve.hxx"
+#include "BndLib_Add3dCurve.hxx"
#include "Poly_Polygon3D.hxx"
#include "Handle_Poly_Polygon3D.hxx"
+#include "BRepMesh_FastDiscret.hxx"
#include "OCCQueryEngine.hpp"
#include "OCCModifyEngine.hpp"
#include "Poly_Triangulation.hxx"
@@ -269,15 +272,32 @@
TopLoc_Location L;
Handle_Poly_Triangulation facets = BRep_Tool::Triangulation(*Topo_Face, L);
+ if(facets.IsNull())
+ {
+ //do triangulation
+ double deflection = 0.01;
+ double angle = 0.5;
+ BRepAdaptor_Surface asurface(*Topo_Face);
+ Bnd_Box aBox;
+ BndLib_AddSurface::Add(asurface, Precision::Approximation(), aBox);
+ BRepMesh_FastDiscret *myMesh =
+ new BRepMesh_FastDiscret(deflection, *Topo_Face, aBox, angle, Standard_True, Standard_True);
+ if (myMesh != NULL) delete myMesh;
+ facets = BRep_Tool::Triangulation(*Topo_Face, L);
+ if(facets.IsNull())
+ {
+ PRINT_ERROR("Can't get triangulation representation for this surface.\n");
+ return CUBIT_FAILURE;
+ }
+ }
//if necessary, the face tolerance can be returned. now, no use.
//double tol = BRep_Tool::Tolerance(*Topo_Face);
number_points = facets->NbNodes();
number_triangles = facets->NbTriangles();
- assert(number_points == 3 * number_triangles);
number_facets = 4 * number_triangles;
- Poly_Array1OfTriangle triangles(0, number_facets-1);
+ Poly_Array1OfTriangle triangles(0, number_triangles-1);
triangles.Assign( facets->Triangles() );
int *facetList = new int[number_facets];
//needs to test that N1, N2, N3 index are starting from 0 to number_points-1
@@ -337,20 +357,28 @@
if (!Topo_Edge)
return CUBIT_FAILURE;
- TopLoc_Location L;
- Handle_Poly_Polygon3D facets = BRep_Tool::Polygon3D(*Topo_Edge, L);
+ //do triangulation
+ double deflection = 0.01;
+ double angle = 0.5;
+ BRepAdaptor_Curve acurve(*Topo_Edge);
+ Bnd_Box aBox;
+ BndLib_Add3dCurve::Add(acurve, Precision::Approximation(), aBox);
+ BRepMesh_FastDiscret *myMesh =
+ new BRepMesh_FastDiscret(deflection, *Topo_Edge, aBox, angle, Standard_True, Standard_True);
+ if (myMesh == NULL)
+ {
+ PRINT_ERROR("Can't get triangulation representation for this curve.\n");
+ return CUBIT_FAILURE;
+ }
+ num_points = myMesh->NbVertices();
- num_points = facets->NbNodes();
- TColgp_Array1OfPnt points(0, num_points-1);
- points.Assign(facets->Nodes());
-
//! Note: If the polygon is closed, the point of closure is
//! repeated at the end of its table of nodes. Thus, on a closed
//! triangle the function NbNodes returns 4.
GPoint *gPnts= new GPoint[num_points];
- for (int i = 0; i < num_points ; i ++)
+ for (int i = 1; i <= num_points ; i ++)
{
- gp_Pnt gp_pnt = points.Value(i);
+ gp_Pnt gp_pnt = myMesh->Pnt(i);
GPoint gPnt;
gPnt.x = gp_pnt.X();
gPnt.y = gp_pnt.Y();
@@ -359,6 +387,7 @@
}
gMem->replace_point_list( gPnts, num_points, num_points );
+ delete myMesh;
return CUBIT_SUCCESS;
}
@@ -1871,7 +1900,7 @@
// Creation Date : 12/12/07
//-------------------------------------------------------------------------
CubitStatus
-OCCQueryEngine::unhook_CoFaces_from_OCC( DLIList<OCCCoFace*> cofaces) const
+OCCQueryEngine::unhook_CoFaces_from_OCC( DLIList<OCCCoFace*>& cofaces) const
{
int size = cofaces.size();
while(size > 0)
@@ -2051,7 +2080,7 @@
// Creation Date : 12/12/07
//-------------------------------------------------------------------------
CubitStatus
-OCCQueryEngine::unhook_CoEdges_from_OCC( DLIList<OCCCoEdge*> coedges) const
+OCCQueryEngine::unhook_CoEdges_from_OCC( DLIList<OCCCoEdge*>& coedges) const
{
int size = coedges.size();
while(size > 0)
Modified: cgm/trunk/geom/OCC/OCCQueryEngine.hpp
===================================================================
--- cgm/trunk/geom/OCC/OCCQueryEngine.hpp 2008-11-19 19:06:22 UTC (rev 2275)
+++ cgm/trunk/geom/OCC/OCCQueryEngine.hpp 2008-11-20 21:17:58 UTC (rev 2276)
@@ -274,8 +274,8 @@
CubitStatus unhook_Lump_from_OCC( Lump* lump ) const;
CubitStatus unhook_ShellSM_from_OCC( ShellSM* shell ) const;
- CubitStatus unhook_CoEdges_from_OCC( DLIList<OCCCoEdge*> coedges) const;
- CubitStatus unhook_CoFaces_from_OCC( DLIList<OCCCoFace*> cofaces) const;
+ CubitStatus unhook_CoEdges_from_OCC( DLIList<OCCCoEdge*>& coedges) const;
+ CubitStatus unhook_CoFaces_from_OCC( DLIList<OCCCoFace*>& cofaces) const;
CubitStatus unhook_LoopSM_from_OCC( LoopSM* loopsm) const;
CubitStatus delete_loop( LoopSM* loopsm)const;
void unhook_cofaces_of_a_surface(OCCSurface* surface)const;
More information about the cgma-dev
mailing list