[cgma-dev] r1433 - cgm/trunk/geom/OCC
janehu at mcs.anl.gov
janehu at mcs.anl.gov
Fri Nov 30 12:26:07 CST 2007
Author: janehu
Date: 2007-11-30 12:26:07 -0600 (Fri, 30 Nov 2007)
New Revision: 1433
Modified:
cgm/trunk/geom/OCC/OCCBody.cpp
cgm/trunk/geom/OCC/OCCBody.hpp
cgm/trunk/geom/OCC/OCCCoEdge.cpp
cgm/trunk/geom/OCC/OCCCoEdge.hpp
cgm/trunk/geom/OCC/OCCCurve.cpp
cgm/trunk/geom/OCC/OCCCurve.hpp
cgm/trunk/geom/OCC/OCCLoop.cpp
cgm/trunk/geom/OCC/OCCLoop.hpp
cgm/trunk/geom/OCC/OCCLump.cpp
cgm/trunk/geom/OCC/OCCLump.hpp
cgm/trunk/geom/OCC/OCCPoint.cpp
cgm/trunk/geom/OCC/OCCQueryEngine.cpp
cgm/trunk/geom/OCC/OCCQueryEngine.hpp
cgm/trunk/geom/OCC/OCCShell.cpp
cgm/trunk/geom/OCC/OCCShell.hpp
cgm/trunk/geom/OCC/OCCSurface.cpp
Log:
updated get_parent_virt and point_containment for lump and solid, there's some difficulties to find point_containment for curve and surface, will continue on those next week.
Modified: cgm/trunk/geom/OCC/OCCBody.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCBody.cpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCBody.cpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -27,7 +27,6 @@
#include "CubitSimpleAttrib.hpp"
#include "OCCQueryEngine.hpp"
#include "DLIList.hpp"
-#include "FacetEvalTool.hpp"
#include "Surface.hpp"
#include "OCCSurface.hpp"
#include "CubitTransformMatrix.hpp"
@@ -37,7 +36,6 @@
#include "OCCLoop.hpp"
#include "OCCShell.hpp"
#include "OCCLump.hpp"
-#include "CubitFacetEdge.hpp"
#include "OCCModifyEngine.hpp"
#include "OCCAttrib.hpp"
@@ -51,6 +49,8 @@
#include "TopExp_Explorer.hxx"
#include "BRep_Builder.hxx"
#include "TopoDS.hxx"
+#include "GProp_GProps.hxx"
+#include "BRepGProp.hxx"
//-------------------------------------------------------------------------
// Purpose : A constructor with a list of lumps that are attached.
//
@@ -86,7 +86,7 @@
OCCBody::~OCCBody()
{
- //Not sure what to do..
+ disconnect_all_lumps();
}
GeometryQueryEngine* OCCBody::get_geometry_query_engine() const
@@ -116,6 +116,10 @@
CubitStatus OCCBody::restore_attribs( FILE *file_ptr, unsigned int endian )
{ return attribSet.restore_attributes( file_ptr, endian ); }
+CubitStatus OCCBody::get_transforms( CubitTransformMatrix &tfm )
+{
+ return CUBIT_SUCCESS;
+}
//----------------------------------------------------------------
@@ -153,7 +157,7 @@
// Author: Jane Hu
//----------------------------------------------------------------
CubitStatus OCCBody::rotate( double x, double y, double z,
- double angle )//in radians
+ double angle )//in radians
{
gp_Pnt aOrigin(0,0,0);
gp_Dir aDir(x, y, z);
@@ -195,35 +199,11 @@
double scale_factor_y,
double scale_factor_z )
{
- PRINT_ERROR("non-uniform scaling is not performed on OCC bodies");
+ PRINT_ERROR("non-uniform scaling is not supported on OCC bodies");
return CUBIT_FAILURE;
}
//----------------------------------------------------------------
-// Function: restore
-// Description: restore the body and its child entities
-// to its original coordinates using the inverse
-// transformation matrix
-//
-// Author: sjowen
-//----------------------------------------------------------------
-CubitStatus OCCBody::restore()
-{
- // invert the transformation matrix and apply to entities
- // (assumes an orthogonal matrix (ie. no shear or non-uniform scaling)
-
- CubitTransformMatrix inverse_mat;
- inverse_mat = myTransforms.inverse();
-
- CubitStatus stat = transform( inverse_mat, CUBIT_TRUE );
-
- if (stat == CUBIT_SUCCESS)
- myTransforms.set_to_identity();
-
- return stat;
-}
-
-//----------------------------------------------------------------
// Function: reflect
// Description: reflect the body about a exis
//
@@ -270,32 +250,6 @@
return boundingbox ;
}
-//----------------------------------------------------------------
-// Function: transform
-// Description: transform the body based on a transformation matrix
-// main function for applying transformations to
-// facet-based bodies
-//
-// Author: sjowen
-//----------------------------------------------------------------
-CubitStatus OCCBody::transform( CubitTransformMatrix &tfmat,
- CubitBoolean is_rotation )
-{
- return CUBIT_SUCCESS;
-}
-
-CubitStatus OCCBody::get_transforms( CubitTransformMatrix &tfm )
-{
- tfm = myTransforms;
- return CUBIT_SUCCESS;
-}
-
-CubitStatus OCCBody::set_transforms( CubitTransformMatrix tfm )
-{
- myTransforms = tfm;
- return CUBIT_SUCCESS;
-}
-
int OCCBody::validate(const CubitString &, DLIList <TopologyEntity*>&)
{
PRINT_ERROR("This option is not available for mesh defined geometry.\n");
@@ -311,7 +265,7 @@
TopExp::MapShapes(*myTopoDSShape, TopAbs_SOLID, M);
int ii;
for (ii=1; ii<=M.Extent(); ii++) {
- TopologyBridge *lump = OCCQueryEngine::occ_to_cgm(M(ii));
+ TopologyBridge *lump = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
lumps.append_unique(lump);
}
}
@@ -346,38 +300,19 @@
//
// Special Notes :
//
-// Creator : Jason Kraftcheck
+// Author : Jane Hu
//
-// Creation Date : 05/10/04
+// Creation Date : 11/30/07
//-------------------------------------------------------------------------
CubitStatus OCCBody::mass_properties( CubitVector& centroid,
- double& volume )
+ double& volume )
{
- centroid.set( 0.0, 0.0, 0.0 );
- volume = 0.0;
+ GProp_GProps myProps;
+ BRepGProp::VolumeProperties(*myTopoDSShape, myProps);
+ volume = myProps.Mass();
+ gp_Pnt pt = myProps.CentreOfMass();
+ centroid.set(pt.X(), pt.Y(), pt.Z());
- DLIList<OCCLump*> lumps (myLumps.size());
- CAST_LIST( myLumps, lumps, OCCLump );
- assert( myLumps.size() == lumps.size() );
- for (int i = lumps.size(); i--; )
- {
- CubitVector cent;
- double vol;
- if (CUBIT_SUCCESS != lumps.get_and_step()->mass_properties(cent,vol))
- return CUBIT_FAILURE;
- centroid += vol*cent;
- volume += vol;
- }
- if (volume > CUBIT_RESABS)
- {
- centroid /= volume;
- }
- else
- {
- centroid.set( 0.0, 0.0, 0.0 );
- volume = 0.0;
- }
-
return CUBIT_SUCCESS;
}
@@ -392,14 +327,14 @@
//-------------------------------------------------------------------------
CubitPointContainment OCCBody::point_containment( const CubitVector &point )
{
- CubitPointContainment pc_value;
- OCCLump *facet_lump;
+ CubitPointContainment pc_value;
+ OCCLump *lump;
int i;
for(i=myLumps.size(); i--;)
{
- facet_lump = dynamic_cast<OCCLump*>(myLumps.get_and_step());
- pc_value = facet_lump->point_containment( point );
+ lump = dynamic_cast<OCCLump*>(myLumps.get_and_step());
+ pc_value = lump->point_containment( point );
if( pc_value == CUBIT_PNT_INSIDE )
return CUBIT_PNT_INSIDE;
else if( pc_value == CUBIT_PNT_BOUNDARY )
Modified: cgm/trunk/geom/OCC/OCCBody.hpp
===================================================================
--- cgm/trunk/geom/OCC/OCCBody.hpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCBody.hpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -62,6 +62,12 @@
TopoDS_CompSolid *get_TopoDS_Shape() {return myTopoDSShape; }
+ virtual CubitStatus get_transforms( CubitTransformMatrix &tfm );
+ //R CubitStatus
+ //R- CUBIT_SUCCESS/CUBIT_FAILURE
+ //I BODYPtr
+ //- return the transformation matrix for this body
+
virtual void append_simple_attribute_virt(CubitSimpleAttrib*);
//R void
//I
@@ -144,24 +150,6 @@
CubitStatus reflect(double,double,double);
//- reflect about an axis
- virtual CubitStatus restore();
- //R CubitStatus
- //R- CUBIT_SUCCESS/FAILURE
- //- Restore the ACIS BODY by replacing the transformation matrix
- //- associated with it with a unit matrix
-
- CubitStatus get_transforms( CubitTransformMatrix &tfm );
- //R CubitStatus
- //R- CUBIT_SUCCESS/CUBIT_FAILURE
- //I BODYPtr
- //- return the transformation matrix for this body
-
- CubitStatus set_transforms( CubitTransformMatrix tfm );
- //R CubitStatus
- //R- CUBIT_SUCCESS/CUBIT_FAILURE that myTransforms was
- // set correctly
- //I BODYPtr
-
int validate(const CubitString &, DLIList <TopologyEntity*>&);
//- does an api_entity_check for the body.
@@ -183,13 +171,7 @@
protected:
private:
- CubitStatus transform( CubitTransformMatrix &tfmat, CubitBoolean is_rotation );
- // main function for applying transforms to facet-based bodies
- void init_edge_flags( DLIList<Surface *>&surf_list, int flag );
- // set the flags on the facet edges
-
- CubitTransformMatrix myTransforms;
DLIList<Lump*> myLumps;
//List of the attached lumps for the traversal functions.
OCCAttribSet attribSet;
Modified: cgm/trunk/geom/OCC/OCCCoEdge.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCCoEdge.cpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCCoEdge.cpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -39,9 +39,9 @@
// ********** BEGIN PUBLIC FUNCTIONS **********
-OCCCoEdge::OCCCoEdge( TopoDS_Edge* edge, Curve *curv_ptr,
+OCCCoEdge::OCCCoEdge( Curve *curv_ptr,
LoopSM *loop_ptr, CubitSense sense )
- : myTopoDSEdge(edge), myCurve(curv_ptr),
+ : myCurve(curv_ptr),
myLoop(loop_ptr),edgeSense(sense)
{
}
@@ -57,108 +57,9 @@
//-------------------------------------------------------------------------
OCCCoEdge::~OCCCoEdge()
{
- myTopoDSEdge = (TopoDS_Edge*) NULL;
- myCurve = (Curve *) NULL;
- myLoop = (LoopSM *)NULL;
}
-//-------------------------------------------------------------------------
-// Purpose : Get geometry modeling engine: OCCQueryEngine
-//
-// Special Notes :
-//
-// Creator : Steve Owen
-//
-// Creation Date : 07/18/00
-//-------------------------------------------------------------------------
-GeometryQueryEngine* OCCCoEdge::get_geometry_query_engine() const
-{
- return OCCQueryEngine::instance();
-}
-//-------------------------------------------------------------------------
-// Purpose : The purpose of this function is to append a
-// attribute to the OSME. The name is attached to the
-// underlying solid model entity this one points to.
-//
-//
-// Special Notes :
-//
-// Creator : Steve Owen
-//
-// Creation Date : 07/18/00
-//-------------------------------------------------------------------------
-void OCCCoEdge::append_simple_attribute_virt(CubitSimpleAttrib* /*csattrib_ptr*/)
-{
- //PRINT_ERROR("OCCCoEdge::append_simple_attribute_virt not implemented\n");
- return;
-}
-
-
-//-------------------------------------------------------------------------
-// Purpose : The purpose of this function is to remove a simple
-// attribute attached to this geometry entity. The name is
-// removed from the underlying BODY this points to.
-//
-// Special Notes :
-//
-// Creator : Steve Owen
-//
-// Creation Date : 07/18/00
-//-------------------------------------------------------------------------
-void OCCCoEdge::remove_simple_attribute_virt(CubitSimpleAttrib* /*csattrib_ptr*/)
-{
- //PRINT_ERROR("OCCCoEdge::remove_simple_attribute_virt not implemented\n");
- return;
-}
-
-//-------------------------------------------------------------------------
-// Purpose : The purpose of this function is to remove all simple
-// attributes attached to this geometry entity. Also
-// removes lingering GTC attributes.
-//
-//
-// Special Notes :
-//
-// Creator : Steve Owen
-//
-// Creation Date : 07/18/00
-//-------------------------------------------------------------------------
-void OCCCoEdge::remove_all_simple_attribute_virt()
-{
- //PRINT_ERROR("OCCCoEdge::remove_all_simple_attribute_virt not implemented\n");
- return;
-}
-
-//-------------------------------------------------------------------------
-// Purpose : The purpose of this function is to get the
-// attributes attached to this geometry entity. The name is
-// attached to the underlying BODY this points to.
-//
-// Special Notes :
-//
-// Creator : Steve Owen
-//
-// Creation Date : 07/18/00
-//-------------------------------------------------------------------------
-CubitStatus OCCCoEdge::get_simple_attribute(DLIList<CubitSimpleAttrib*>&
- /*cubit_simple_attrib_list*/)
-{
- //PRINT_ERROR("OCCCoEdge::get_simple_attribute not implemented\n");
- return CUBIT_FAILURE;
-}
-CubitStatus OCCCoEdge::get_simple_attribute(const CubitString&,
- DLIList<CubitSimpleAttrib*>&)
- { return CUBIT_FAILURE; }
-
-void OCCCoEdge::get_parents_virt( DLIList<TopologyBridge*>& parents )
- { parents.append( myLoop ); }
-
-void OCCCoEdge::get_children_virt( DLIList<TopologyBridge*>& children )
- { children.append( myCurve ); }
-
-
-
// ********** END PUBLIC FUNCTIONS **********
// ********** BEGIN PROTECTED FUNCTIONS **********
Modified: cgm/trunk/geom/OCC/OCCCoEdge.hpp
===================================================================
--- cgm/trunk/geom/OCC/OCCCoEdge.hpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCCoEdge.hpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -39,93 +39,31 @@
// ********** END FORWARD DECLARATIONS **********
-class OCCCoEdge : public CoEdgeSM
+class OCCCoEdge
{
public:
- OCCCoEdge(TopoDS_Edge *theEdge,
- Curve *curv_ptr, LoopSM *loop_ptr, CubitSense sense);
+ OCCCoEdge(Curve *curv_ptr, LoopSM *loop_ptr, CubitSense sense);
//- A constructor
virtual ~OCCCoEdge() ;
//- The destructor
- virtual GeometryQueryEngine*
- get_geometry_query_engine() const;
- //R GeometryQueryEngine*
- //R- A pointer to the geometric modeling engine associated with
- //R- the object.
- //- This function returns a pointer to the geometric modeling engine
- //- associated with the object.
-
- virtual void append_simple_attribute_virt(CubitSimpleAttrib*);
- //R void
- //I
- //I-
- //I- that is to be appended to this OSME object.
- //- The purpose of this function is to append a
- //- attribute to the OSME. The is attached to each of the
- //- underlying solid model entities this one points to.
-
- virtual void remove_simple_attribute_virt(CubitSimpleAttrib*);
- //R void
- //I CubitSimpleAttrib*
- //I- A reference to a CubitSimpleAttrib object which is the object
- //I- that is to be removed to this OSME object.
- //- The purpose of this function is to remove a simple
- //- attribute from the OSME. The attribute is attached to each of the
- //- underlying solid model entities this one points to.
-
- virtual void remove_all_simple_attribute_virt();
- //R void
- //I-
- //- The purpose of this function is to remove all simple
- //- attributes from the OSME.
-
- virtual CubitStatus get_simple_attribute(DLIList<CubitSimpleAttrib*>&);
- virtual CubitStatus get_simple_attribute(const CubitString& name,
- DLIList<CubitSimpleAttrib*>&);
- //R CubitSimpleAttrib*
- //R- the returned cubit simple attribute.
- //- The purpose of this function is to get the attributes
- //- of the geometry entity. The name is attached to the underlying solid
- //- model entity(ies) this one points to.
- //- MJP Note:
- //- This is the code that implements the requirement that names
- //- of VGI Entities propagate across solid model boolean
- //- operations. The success of this relies, of course, on the underlying
- //- solid modeler being able to propagate attributes across
- //- such operations on its entities. If it cannot, then "names"
- //- of VGI entities will not propagate.
-
- virtual void get_parents_virt(DLIList<TopologyBridge*>&);
- virtual void get_children_virt(DLIList<TopologyBridge*>&);
-
inline CubitSense sense(){return edgeSense;}
//- returns the sense of the underlying coedge wrt the underlying edge
- inline void add_loop( LoopSM *loop_ptr )
- { myLoop = loop_ptr; }
- //- set the loop pointer that this coedge is asociated
-
- void reverse_sense();
-
inline Curve *curve()
{return myCurve;}
//- get the curve associated with this coedge
- inline LoopSM* get_loop() const { return myLoop; }
+ inline LoopSM* loop() const { return myLoop; }
- inline TopoDS_Edge * get_TopoDS_Edge(){return myTopoDSEdge;}
- void remove_loop() {myLoop = (LoopSM*) NULL;}
-
protected:
private:
LoopSM *myLoop;
Curve *myCurve;
CubitSense edgeSense;
- TopoDS_Edge *myTopoDSEdge;
};
Modified: cgm/trunk/geom/OCC/OCCCurve.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCCurve.cpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCCurve.cpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -97,7 +97,7 @@
//-------------------------------------------------------------------------
OCCCurve::~OCCCurve()
{
-
+ assert(myLoopList->size() == 0);
}
//-------------------------------------------------------------------------
@@ -701,7 +701,7 @@
void OCCCurve::get_parents_virt( DLIList<TopologyBridge*>& parents )
- {/* CAST_LIST_TO_PARENT( myCoEdges, parents );*/ }
+ { CAST_LIST_TO_PARENT( *myLoopList, parents ); }
void OCCCurve::get_children_virt( DLIList<TopologyBridge*>& children )
{
@@ -709,16 +709,16 @@
TopExp::MapShapes(*myTopoDSEdge, TopAbs_VERTEX, M);
TopologyBridge *point1, *point2;
if (M.Extent()==1) {
- point1 = OCCQueryEngine::occ_to_cgm(M(1));
+ point1 = OCCQueryEngine::instance()->occ_to_cgm(M(1));
children.append_unique(point1);
} else if (M.Extent()==2) {
if ( fabs(BRep_Tool::Parameter(TopoDS::Vertex(M(1)), *myTopoDSEdge)-start_param()) >
fabs(BRep_Tool::Parameter(TopoDS::Vertex(M(2)), *myTopoDSEdge)-start_param()) ) {
- point1 = OCCQueryEngine::occ_to_cgm(M(2));
- point2 = OCCQueryEngine::occ_to_cgm(M(1));
+ point1 = OCCQueryEngine::instance()->occ_to_cgm(M(2));
+ point2 = OCCQueryEngine::instance()->occ_to_cgm(M(1));
} else {
- point1 = OCCQueryEngine::occ_to_cgm(M(1));
- point2 = OCCQueryEngine::occ_to_cgm(M(2));
+ point1 = OCCQueryEngine::instance()->occ_to_cgm(M(1));
+ point2 = OCCQueryEngine::instance()->occ_to_cgm(M(2));
}
if (point1 == point2) {
children.append_unique(point1);
@@ -771,7 +771,7 @@
TopExp::MapShapes(*myTopoDSEdge, TopAbs_VERTEX, M);
int ii;
for (ii=M.Extent(); ii>0; ii--) {
- TopologyBridge *point = OCCQueryEngine::occ_to_cgm(M(ii));
+ TopologyBridge *point = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
result_list.append_unique(dynamic_cast<OCCPoint*>(point));
}
}
Modified: cgm/trunk/geom/OCC/OCCCurve.hpp
===================================================================
--- cgm/trunk/geom/OCC/OCCCurve.hpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCCurve.hpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -49,7 +49,10 @@
virtual ~OCCCurve() ;
//- The destructor
-
+ void add_loop(OCCLoop* loop) { myLoopList->append_unique(loop);}
+ DLIList<OCCLoop*> *loops() {return myLoopList;}
+ void remove_loop(OCCLoop* loop) {myLoopList->remove(loop);}
+
virtual void append_simple_attribute_virt(CubitSimpleAttrib*);
//R void
//I
@@ -320,29 +323,13 @@
private:
- CubitSense get_relative_curve_sense();
- //R CubitSense
- //R- Returned sense value
- //- Returns the sense of the RefEdge with respect to the underlying
- //- facet curve.
-
void adjust_periodic_parameter(double& param);
- CubitSense sense_;
- //- The sense of the RefEdge that owns this Curve with respect
- //- to the positive sense of the first EDGE in EDGEPtrList_.
- //- When a Curve is first constructed, this value is arbitrarily
- //- set to CUBIT_FORWARD.
- //- MJP NOTE:
- //- Not only does the RefEdge have a sense wrt its Curve, but each
- //- ACIS EDGE has a sense wrt its underlying "curve" object.
-
OCCAttribSet attribSet;
//List of OCCAttrib*'s instead of CubitSimpleAttribs
- friend void run_test_function();
-
TopoDS_Edge *myTopoDSEdge;
+ DLIList<OCCLoop*> *myLoopList;
bool periodic;
};
Modified: cgm/trunk/geom/OCC/OCCLoop.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCLoop.cpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCLoop.cpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -30,6 +30,9 @@
#include <TopTools_IndexedMapOfShape.hxx>
#include "TopExp_Explorer.hxx"
#include "TopoDS.hxx"
+#include "TopTools_ListIteratorOfListOfShape.hxx"
+#include "TopTools_DataMapOfShapeInteger.hxx"
+#include "TopTools_IndexedDataMapOfShapeListOfShape.hxx"
// ********** END CUBIT INCLUDES **********
// ********** BEGIN STATIC DECLARATIONS **********
@@ -38,7 +41,7 @@
// ********** BEGIN PUBLIC FUNCTIONS **********
//-------------------------------------------------------------------------
-// Purpose : The constructor with a pointer to the FacetEvalTool.
+// Purpose : The constructor with a pointer to the TopoDS_Wire.
//
// Special Notes :
//
@@ -56,18 +59,28 @@
//-------------------------------------------------------------------------
OCCLoop::~OCCLoop()
{
+ disconnect_all_curves();
+}
+
+//-------------------------------------------------------------------------
+// Purpose : Tear down topology
+//
+// Special Notes :
+//
+// Creator : Jane Hu
+//
+// Creation Date : 11/29/07
+//-------------------------------------------------------------------------
+void OCCLoop::disconnect_all_curves()
+{
myCoEdgeList.reset();
for (int i = myCoEdgeList.size(); i--; )
{
OCCCoEdge* coedge = myCoEdgeList.get_and_step();
- if (coedge)
- {
- assert(coedge->get_loop() == this);
- delete coedge;
- }
+ assert(coedge->loop() == this);
+ OCCCurve* curve = CAST_TO(coedge->curve(), OCCCurve);
+ curve->remove_loop(this);
}
-
- myTopoDSWire = (TopoDS_Wire *) NULL;
myCoEdgeList.clean_out();
}
@@ -135,7 +148,30 @@
{ return CUBIT_FAILURE; }
void OCCLoop::get_parents_virt( DLIList<TopologyBridge*>& parents )
- { /*parents.append( mySurface )*/; }
+{
+ OCCQueryEngine* oqe = (OCCQueryEngine*) get_geometry_query_engine();
+ OCCSurface * surf = NULL;
+ DLIList <OCCSurface* > *surfs = oqe->SurfaceList;
+ TopTools_IndexedDataMapOfShapeListOfShape M;
+ for(int i = 0; i < surfs->size(); i++)
+ {
+ surf = surfs->get_and_step();
+ TopExp::MapShapesAndAncestors(*(surf->get_TopoDS_Face()),
+ TopAbs_WIRE, TopAbs_FACE, M);
+ const TopTools_ListOfShape& ListOfShapes =
+ M.FindFromKey(*(get_TopoDS_Wire()));
+ if (!ListOfShapes.IsEmpty())
+ {
+ TopTools_ListIteratorOfListOfShape it(ListOfShapes) ;
+ for (;it.More(); it.Next())
+ {
+ TopoDS_Face Face = TopoDS::Face(it.Value());
+ int k = oqe->OCCMap->Find(Face);
+ parents.append((OCCSurface*)(oqe->OccToCGM->find(k))->second);
+ }
+ }
+ }
+}
void OCCLoop::get_children_virt( DLIList<TopologyBridge*>& children )
{
@@ -143,7 +179,7 @@
TopExp::MapShapes(*myTopoDSWire, TopAbs_EDGE, M);
int ii;
for (ii=1; ii<=M.Extent(); ii++) {
- TopologyBridge *curve = OCCQueryEngine::occ_to_cgm(M(ii));
+ TopologyBridge *curve = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
children.append_unique(curve);
}
}
Modified: cgm/trunk/geom/OCC/OCCLoop.hpp
===================================================================
--- cgm/trunk/geom/OCC/OCCLoop.hpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCLoop.hpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -37,14 +37,13 @@
public :
OCCLoop( TopoDS_Wire *theLoop );
- inline void add_coedge(OCCCoEdge * coedge) {myCoEdgeList.append(coedge);}
- void add_coedges(DLIList<OCCCoEdge *> coedges)
- {myCoEdgeList = coedges;}
- void remove_coedge(OCCCoEdge * coedge){myCoEdgeList.remove(coedge);}
+ void coedges(DLIList<OCCCoEdge *> coedges) {myCoEdgeList = coedges;}
DLIList<OCCCoEdge*> coedges() {return myCoEdgeList;}
+ void disconnect_all_curves();
+
inline TopoDS_Wire* get_TopoDS_Wire() {return myTopoDSWire;}
virtual ~OCCLoop() ;
@@ -107,7 +106,7 @@
private:
TopoDS_Wire *myTopoDSWire;
- DLIList<OCCCoEdge *>myCoEdgeList;
+ DLIList<OCCCoEdge *> myCoEdgeList;
};
Modified: cgm/trunk/geom/OCC/OCCLump.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCLump.cpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCLump.cpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -41,6 +41,10 @@
#include "BRepBndLib.hxx"
#include "GProp_GProps.hxx"
#include "BRepGProp.hxx"
+#include "BOP_SolidClassifier.hxx"
+#include "TopExp_Explorer.hxx"
+#include "TopoDS.hxx"
+#include "BRep_Tool.hxx"
// ********** END CUBIT INCLUDES **********
// ********** BEGIN FORWARD DECLARATIONS **********
@@ -53,7 +57,7 @@
// ********** BEGIN PUBLIC FUNCTIONS **********
//-------------------------------------------------------------------------
-// Purpose : The constructor with a pointer to the owning shells and body.
+// Purpose : The constructor with a pointer to TopoDS_Solid
//
// Special Notes :
//
@@ -195,7 +199,7 @@
TopExp::MapShapes(*myTopoDSSolid, TopAbs_SHELL, M);
int ii;
for (ii=1; ii<=M.Extent(); ii++) {
- TopologyBridge *shell = OCCQueryEngine::occ_to_cgm(M(ii));
+ TopologyBridge *shell = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
shellsms.append_unique(shell);
}
}
@@ -204,21 +208,26 @@
CubitPointContainment OCCLump::point_containment( const CubitVector &point )
{
- CubitPointContainment pc_value;
- OCCShell *facet_shell;
+ BOP_SolidClassifier ps;
+ TopoDS_Solid * solid = get_TopoDS_Solid();
+ gp_Pnt pnt(point.x(), point.y(), point.z());
+
+ //use face tolerance at the tolerence to see if the point is on.
+ TopExp_Explorer Ex;
+ Ex.Init(*solid, TopAbs_FACE, TopAbs_SOLID);
+ TopoDS_Face face = TopoDS::Face(Ex.Current());
+
+ double dtol = BRep_Tool::Tolerance(face);
+ TopAbs_State state = ps.Classify(*solid, pnt, dtol);
+
+ if (state == TopAbs_IN)
+ return CUBIT_PNT_INSIDE;
+ else if (state == TopAbs_OUT)
+ return CUBIT_PNT_OUTSIDE;
+ else if (state == TopAbs_ON)
+ return CUBIT_PNT_BOUNDARY;
- int i;
- for(i=myShells.size(); i--;)
- {
- facet_shell = dynamic_cast<OCCShell*>(myShells.get_and_step());
- pc_value = facet_shell->point_containment( point );
- if( pc_value == CUBIT_PNT_OUTSIDE )
- return CUBIT_PNT_OUTSIDE;
- else if( pc_value == CUBIT_PNT_BOUNDARY )
- return CUBIT_PNT_BOUNDARY;
- }
-
- return CUBIT_PNT_INSIDE;
+ return CUBIT_PNT_UNKNOWN;
}
Modified: cgm/trunk/geom/OCC/OCCLump.hpp
===================================================================
--- cgm/trunk/geom/OCC/OCCLump.hpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCLump.hpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -45,13 +45,11 @@
OCCLump(TopoDS_Solid *theSolid);
- OCCLump(DLIList<ShellSM*> &my_shells,
- BodySM *body_sm_ptr = NULL);
- //Pass in a list of shells attached to this lump if you have them.
- //Also pass in the body that this lump belongs to.
virtual ~OCCLump();
//- The destructor
+ BodySM* body() {return myBodyPtr;}
+
void add_body(BodySM* new_body)
{myBodyPtr = new_body;}
@@ -151,7 +149,6 @@
protected:
private:
- DLIList<ShellSM*> myShells;
BodySM *myBodyPtr;
TopoDS_Solid *myTopoDSSolid;
Modified: cgm/trunk/geom/OCC/OCCPoint.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCPoint.cpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCPoint.cpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -19,11 +19,18 @@
// ********** BEGIN CUBIT INCLUDES **********
#include "config.h"
#include "OCCPoint.hpp"
+#include "OCCCurve.hpp"
#include "OCCQueryEngine.hpp"
#include "CastTo.hpp"
#include "OCCAttribSet.hpp"
#include "CubitSimpleAttrib.hpp"
#include "BRep_Tool.hxx"
+#include "TopExp.hxx"
+#include "TopoDS_Edge.hxx"
+#include "TopoDS.hxx"
+#include "TopTools_ListIteratorOfListOfShape.hxx"
+#include "TopTools_DataMapOfShapeInteger.hxx"
+#include "TopTools_IndexedDataMapOfShapeListOfShape.hxx"
// ********** END CUBIT INCLUDES **********
@@ -216,7 +223,30 @@
void OCCPoint::get_parents_virt( DLIList<TopologyBridge*>& parents )
- { }
+{
+ OCCQueryEngine* oqe = (OCCQueryEngine*) get_geometry_query_engine();
+ OCCCurve * curve = NULL;
+ DLIList <OCCCurve* > *curves = oqe->CurveList;
+ TopTools_IndexedDataMapOfShapeListOfShape M;
+ for(int i = 0; i < curves->size(); i++)
+ {
+ curve = curves->get_and_step();
+ TopExp::MapShapesAndAncestors(*(curve->get_TopoDS_Edge()),
+ TopAbs_VERTEX, TopAbs_EDGE, M);
+ const TopTools_ListOfShape& ListOfShapes =
+ M.FindFromKey(*(get_TopoDS_Vertex()));
+ if (!ListOfShapes.IsEmpty())
+ {
+ TopTools_ListIteratorOfListOfShape it(ListOfShapes) ;
+ for (;it.More(); it.Next())
+ {
+ TopoDS_Edge Edge = TopoDS::Edge(it.Value());
+ int k = oqe->OCCMap->Find(Edge);
+ parents.append((OCCPoint*)(oqe->OccToCGM->find(k))->second);
+ }
+ }
+ }
+}
void OCCPoint::get_children_virt( DLIList<TopologyBridge*>& )
{ }
Modified: cgm/trunk/geom/OCC/OCCQueryEngine.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCQueryEngine.cpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCQueryEngine.cpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -38,8 +38,6 @@
#include "Shell.hpp"
#include "Loop.hpp"
#include "Chain.hpp"
-#include "CoEdge.hpp"
-#include "CoFace.hpp"
#include "RefVolume.hpp"
#include "RefFace.hpp"
#include "RefEdge.hpp"
@@ -110,15 +108,17 @@
const int OCCQueryEngine::OCCQE_MINOR_VERSION = 2;
const int OCCQueryEngine::OCCQE_SUBMINOR_VERSION = 0;
-TopTools_DataMapOfShapeInteger *OCCQueryEngine::OCCMap = new TopTools_DataMapOfShapeInteger;
-DLIList<OCCBody*> *OCCQueryEngine::BodyList = new DLIList<OCCBody*>;
-DLIList<OCCSurface*> *OCCQueryEngine::SurfaceList = new DLIList<OCCSurface*>;
-DLIList<OCCCurve*> *OCCQueryEngine::CurveList = new DLIList<OCCCurve*>;
+TopTools_DataMapOfShapeInteger *OCCMap = new TopTools_DataMapOfShapeInteger;
-std::map<int, TopologyBridge*>* OCCQueryEngine::OccToCGM = new std::map<int, TopologyBridge*>;
+std::map<int, TopologyBridge*>* OccToCGM = new std::map<int, TopologyBridge*>;
+
+DLIList<OCCBody*> *BodyList = new DLIList<OCCBody*>;
+DLIList<OCCSurface*> *SurfaceList = new DLIList<OCCSurface*>;
+DLIList<OCCCurve*> *CurveList = new DLIList<OCCCurve*>;
+
typedef std::map<int, TopologyBridge*>::value_type valType;
-int OCCQueryEngine::iTotalTBCreated = 0;
-CubitBoolean OCCQueryEngine::PRINT_RESULT = CUBIT_FALSE;
+int iTotalTBCreated = 0;
+CubitBoolean *PRINT_RESULT = CUBIT_FALSE;
//================================================================================
// Description:
// Author :
@@ -997,7 +997,7 @@
BRep_Builder aBuilder;
Standard_Boolean result = BRepTools::Read(*aShape, (char*) file_name, aBuilder);
if (result==0) return CUBIT_FAILURE;
- PRINT_RESULT = print_results;
+ *PRINT_RESULT = print_results;
imported_entities = populate_topology_bridge(*aShape);
return CUBIT_SUCCESS;
@@ -1038,9 +1038,9 @@
OCCBody *body;
if (!OCCMap->IsBound(*posolid))
{
- if(PRINT_RESULT)
+ if(*PRINT_RESULT)
PRINT_INFO("Adding Bodies.\n");
- iTotalTBCreated++;
+ (iTotalTBCreated)++;
body = new OCCBody(posolid);
OCCMap->Bind(*posolid, iTotalTBCreated);
OccToCGM->insert(valType(iTotalTBCreated,
@@ -1073,7 +1073,7 @@
OCCBody *body;
if (!OCCMap->IsBound(*posolid))
{
- if(PRINT_RESULT)
+ if(*PRINT_RESULT)
PRINT_INFO("Adding solids.\n");
iTotalTBCreated++;
lump = new OCCLump(posolid);
@@ -1106,7 +1106,7 @@
OCCShell *shell ;
if (!OCCMap->IsBound(*poshell))
{
- if(PRINT_RESULT)
+ if(*PRINT_RESULT)
PRINT_INFO("Adding shells.\n");
iTotalTBCreated++;
shell = new OCCShell(poshell);
@@ -1121,13 +1121,8 @@
}
TopExp_Explorer Ex;
- DLIList<Surface *> surfaces;
for (Ex.Init(aShape, TopAbs_FACE); Ex.More(); Ex.Next())
- {
- Surface* face = populate_topology_bridge(TopoDS::Face(Ex.Current()));
- surfaces.append(face);
- }
- shell->add_surfaces(surfaces);
+ populate_topology_bridge(TopoDS::Face(Ex.Current()));
return shell;
}
@@ -1138,7 +1133,7 @@
OCCSurface *surface;
if (!OCCMap->IsBound(*poface))
{
- if(PRINT_RESULT)
+ if(*PRINT_RESULT)
PRINT_INFO("Adding faces.\n");
iTotalTBCreated++;
surface = new OCCSurface(poface);
@@ -1155,7 +1150,8 @@
}
TopExp_Explorer Ex;
for (Ex.Init(aShape, TopAbs_WIRE); Ex.More(); Ex.Next())
- populate_topology_bridge(TopoDS::Wire(Ex.Current()));
+ populate_topology_bridge(TopoDS::Wire(Ex.Current()));
+
return surface;
}
@@ -1166,7 +1162,7 @@
OCCLoop *loop ;
if (!OCCMap->IsBound(*powire))
{
- if(PRINT_RESULT)
+ if(*PRINT_RESULT)
PRINT_INFO("Adding loops.\n");
iTotalTBCreated++;
loop = new OCCLoop(powire);
@@ -1183,15 +1179,16 @@
BRepTools_WireExplorer Ex;
DLIList <OCCCoEdge*> coedges;
for (Ex.Init(aShape); Ex.More(); Ex.Next())
- {
- Curve* curve = populate_topology_bridge(Ex.Current()) ;
+ {
+ Curve* curve = populate_topology_bridge(Ex.Current());
OCCCurve *occ_curve = CAST_TO(curve, OCCCurve);
- TopoDS_Edge *edge = occ_curve->get_TopoDS_Edge( );
- OCCCoEdge * coedge = new OCCCoEdge(edge, curve, loop,
- (Ex.Orientation()== TopAbs_FORWARD ? CUBIT_FORWARD : CUBIT_REVERSED));
+ OCCCoEdge * coedge = new OCCCoEdge( curve, loop,
+ (Ex.Orientation()== TopAbs_FORWARD ? CUBIT_FORWARD : CUBIT_REVERSED));
coedges.append(coedge);
- }
- loop->add_coedges(coedges);
+ occ_curve->add_loop(loop);
+ }
+ loop->coedges(coedges);
+
return loop;
}
@@ -1202,7 +1199,7 @@
*poedge = aShape;
if (!OCCMap->IsBound(*poedge))
{
- if(PRINT_RESULT)
+ if(*PRINT_RESULT)
PRINT_INFO("Adding edges.\n");
iTotalTBCreated++;
curve = new OCCCurve(poedge);
@@ -1230,7 +1227,7 @@
*povertex = aShape;
if (!OCCMap->IsBound(*povertex))
{
- if(PRINT_RESULT)
+ if(*PRINT_RESULT)
PRINT_INFO("Adding vertices.\n");
iTotalTBCreated++;
point = new OCCPoint(povertex);
@@ -1272,7 +1269,6 @@
{
BodyPtr = bodyList.get_and_step();
this->delete_solid_model_entities(BodyPtr);
- BodyList->remove((OCCBody*)BodyPtr);
}
return;
@@ -1290,11 +1286,11 @@
CubitStatus
OCCQueryEngine::delete_solid_model_entities( BodySM* bodysm ) const
{
- OCCBody* fbody = dynamic_cast<OCCBody*>(bodysm);
- if (!fbody)
+ OCCBody* occ_body = dynamic_cast<OCCBody*>(bodysm);
+ if (!occ_body)
return CUBIT_FAILURE;
- TopoDS_Shape* shape = fbody->get_TopoDS_Shape();
+ TopoDS_Shape* shape = occ_body->get_TopoDS_Shape();
if (!shape)
return CUBIT_FAILURE;
@@ -1308,9 +1304,23 @@
if(!OCCMap->UnBind(*shape))
PRINT_ERROR("The OccBody and TopoDS_Shape pair is not in the map!");
+ OCCBody* occ_body_find = (OCCBody*)(OccToCGM->find(k))->second;
+ BodyList->remove(occ_body_find);
+
if(!OccToCGM->erase(k))
PRINT_ERROR("The OccBody and TopoDS_Shape pair is not in the map!");
}
+
+ else //check for all lumps for deletion, this body was generated
+ //by its OCCLumps
+ {
+ for(int i =0; i < occ_body->lumps().size(); i++)
+ {
+ Lump* lump = occ_body->lumps().get_and_step();
+ delete_solid_model_entities(lump);
+ }
+ }
+
// Remove the links between OCC and Cubit
// unhook_ENTITY_from_VGI(shape);
@@ -1321,6 +1331,48 @@
}
//-------------------------------------------------------------------------
+// Purpose : Delete a OCClumps and child entities.
+//
+// Special Notes :
+//
+// Creator : Jane Hu
+//
+// Creation Date : 11/29/07
+//-------------------------------------------------------------------------
+CubitStatus
+OCCQueryEngine::delete_solid_model_entities( Lump* lump ) const
+{
+ OCCLump* occ_lump = dynamic_cast<OCCLump*>(lump);
+ if (!occ_lump)
+ return CUBIT_FAILURE;
+
+ TopoDS_Solid* solid = occ_lump->get_TopoDS_Solid();
+
+ if(!solid)
+ return CUBIT_FAILURE;
+
+ //remove the entry from the map
+ int k;
+ if(OCCMap->IsBound(*solid))
+ {
+ k = OCCMap->Find(*solid);
+
+ if(!OCCMap->UnBind(*solid))
+ PRINT_ERROR("The OccSurface and TopoDS_Face pair is not in the map!");
+
+ if(!OccToCGM->erase(k))
+ PRINT_ERROR("The OccSurface and TopoDS_Face pair is not in the map!");
+ }
+
+ // Remove the links between OCC and Cubit
+ // unhook_ENTITY_from_VGI(face);
+
+ BodyList->remove(CAST_TO(occ_lump->body(), OCCBody));
+ delete solid;
+ delete lump;
+ return CUBIT_SUCCESS;
+}
+//-------------------------------------------------------------------------
// Purpose : Delete a OCCSurface and child entities.
//
// Special Notes :
@@ -1350,6 +1402,8 @@
if(!OCCMap->UnBind(*face))
PRINT_ERROR("The OccSurface and TopoDS_Face pair is not in the map!");
+ SurfaceList->remove((OCCSurface*)(OccToCGM->find(k))->second);
+
if(!OccToCGM->erase(k))
PRINT_ERROR("The OccSurface and TopoDS_Face pair is not in the map!");
}
@@ -1357,7 +1411,6 @@
// Remove the links between OCC and Cubit
// unhook_ENTITY_from_VGI(face);
- SurfaceList->remove((OCCSurface*)surface);
delete face;
delete surface;
return CUBIT_SUCCESS;
@@ -1392,6 +1445,7 @@
if(!OCCMap->UnBind(*edge))
PRINT_ERROR("The OccCurve and TopoDS_Edge pair is not in the map!");
+ CurveList->remove((OCCCurve*)(OccToCGM->find(k))->second);
if(!OccToCGM->erase(k))
PRINT_ERROR("The OccCurve and TopoDS_Edge pair is not in the map!");
}
@@ -1399,7 +1453,6 @@
// Remove the links between OCC and Cubit
//unhook_ENTITY_from_VGI(edge);
- CurveList->remove((OCCCurve*) curve);
delete edge;
delete curve;
return CUBIT_SUCCESS;
@@ -1639,11 +1692,12 @@
}
const char* fqe_xform_err = "Transform not implemented for OCC geometry.\n";
+
CubitStatus OCCQueryEngine::restore_transform( BodySM* body )
{
- OCCBody* facetbod = dynamic_cast<OCCBody*>(body);
- return facetbod ? facetbod->restore( ) : CUBIT_FAILURE;
+ return CUBIT_FAILURE;
}
+
CubitStatus OCCQueryEngine::translate( BodySM* body, const CubitVector& d )
{
OCCBody* theBody = dynamic_cast<OCCBody*>(body);
Modified: cgm/trunk/geom/OCC/OCCQueryEngine.hpp
===================================================================
--- cgm/trunk/geom/OCC/OCCQueryEngine.hpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCQueryEngine.hpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -121,6 +121,10 @@
int get_subminor_version();
CubitString get_engine_version_string();
+
+ //static DLIList<OCCBody*> BodyList ;
+ //static DLIList<OCCSurface*> SurfaceList ;
+ //static DLIList<OCCCurve*> CurveList ;
//HEADER- RTTI and safe casting functions.
@@ -134,6 +138,8 @@
//R- This is not a solid modeling engine.
//HEADER- Functions for importing and exporting solid models.
+ virtual CubitStatus restore_transform( BodySM* body );
+
virtual CubitStatus get_graphics( Surface* surface_ptr,
int& number_triangles,
int& number_points,
@@ -253,6 +259,8 @@
CubitBoolean import_curves = CUBIT_TRUE,
CubitBoolean import_vertices = CUBIT_TRUE,
CubitBoolean free_surfaces = CUBIT_TRUE);
+
+ CubitStatus delete_solid_model_entities( Lump* lump ) const;
public:
virtual void delete_solid_model_entities(DLIList<BodySM*>& body_list) const;
//- Deletes all solid model entities associated with the Bodies in
@@ -286,8 +294,6 @@
DLIList<BodySM*>& body_list,
CubitBox& super_box );
- CubitStatus restore_transform( BodySM* body );
-
CubitStatus translate( BodySM* body, const CubitVector& offset );
CubitStatus rotate ( BodySM* body, const CubitVector& axis, double angle );
CubitStatus scale ( BodySM* body, double factor );
@@ -314,7 +320,7 @@
//- are overlaping. The full intersect Boolean is needed to see if
//- the bodies actually overlap and don't just touch.
- static TopologyBridge* occ_to_cgm(TopoDS_Shape shape);
+ TopologyBridge* occ_to_cgm(TopoDS_Shape shape);
virtual CubitBoolean volumes_overlap (Lump *lump1, Lump *lump2 ) const ;
@@ -326,11 +332,11 @@
Curve* populate_topology_bridge(TopoDS_Edge aShape);
Point* populate_topology_bridge(TopoDS_Vertex aShape);
- static DLIList<OCCBody*> *BodyList ;
- static DLIList<OCCSurface*> *SurfaceList ;
- static DLIList<OCCCurve*> *CurveList ;
- static TopTools_DataMapOfShapeInteger* OCCMap;
- static std::map<int, TopologyBridge*>* OccToCGM;
+ DLIList<OCCBody*> *BodyList ;
+ DLIList<OCCSurface*> *SurfaceList ;
+ DLIList<OCCCurve*> *CurveList ;
+ TopTools_DataMapOfShapeInteger* OCCMap;
+ std::map<int, TopologyBridge*>* OccToCGM;
protected:
@@ -347,10 +353,10 @@
DLIList<OCCCurve*> &facet_curves,
DLIList<OCCPoint*> &facet_points );
+ int iTotalTBCreated ;
+ CubitBoolean *PRINT_RESULT;
- static int iTotalTBCreated ;
static OCCQueryEngine* instance_;
- static CubitBoolean PRINT_RESULT;
//- static pointer to unique instance of this class
static const int OCCQE_MAJOR_VERSION;
Modified: cgm/trunk/geom/OCC/OCCShell.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCShell.cpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCShell.cpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -69,7 +69,8 @@
//
//-------------------------------------------------------------------------
OCCShell::~OCCShell()
-{}
+{
+}
//-------------------------------------------------------------------------
@@ -112,8 +113,9 @@
//-------------------------------------------------------------------------
void OCCShell::get_parents_virt( DLIList<TopologyBridge*>& parents )
{
+ OCCQueryEngine* oqe = (OCCQueryEngine*) get_geometry_query_engine();
OCCBody * body = NULL;
- DLIList <OCCBody* > *bodies = OCCQueryEngine::BodyList;
+ DLIList <OCCBody* > *bodies = oqe->BodyList;
TopTools_IndexedDataMapOfShapeListOfShape M;
for(int i = 0; i < bodies->size(); i++)
{
@@ -128,8 +130,8 @@
for (;it.More(); it.Next())
{
TopoDS_Solid Solid = TopoDS::Solid(it.Value());
- int k = OCCQueryEngine::OCCMap->Find(Solid);
- parents.append((OCCLump*)(OCCQueryEngine::OccToCGM->find(k))->second);
+ int k = oqe->OCCMap->Find(Solid);
+ parents.append((OCCLump*)(oqe->OccToCGM->find(k))->second);
}
}
}
@@ -142,147 +144,12 @@
TopExp::MapShapes(*myTopoDSShell, TopAbs_FACE, M);
int ii;
for (ii=1; ii<=M.Extent(); ii++) {
- TopologyBridge *surface = OCCQueryEngine::occ_to_cgm(M(ii));
+ TopologyBridge *surface = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
children.append_unique(surface);
}
}
-//-------------------------------------------------------------------------
-// Purpose : Tear down topology
-//
-// Special Notes :
-//
-// Creator : Jason Kraftcheck
-//
-// Creation Date : 09/29/03
-//-------------------------------------------------------------------------
-void OCCShell::disconnect_all_surfaces()
-{
-}
-//-------------------------------------------------------------------------
-// Purpose : Determines if point is contained within shell
-//
-// Special Notes : If the shell is a void, it contains all points it doesn't enclose
-//
-// Creator : Corey Ernst
-//
-// Creation Date : 09/01/04
-//-------------------------------------------------------------------------
-CubitPointContainment OCCShell::point_containment( const CubitVector &input_point )
-{
- //just to avoid crashes, make sure we have surfaces in this list.
- if(mySurfs.size() < 1){
- return CUBIT_PNT_OUTSIDE;
- }
- CubitVector closest_location, point = input_point;
- OCCSurface *closest_surf = dynamic_cast<OCCSurface*>(mySurfs.get_and_step());
- OCCSurface *tmp_surf;
- closest_surf->closest_point_trimmed( point, closest_location );
- double shortest_dist = point.distance_between( closest_location );
-
- int i;
- //Look through all this shell's surfaces to find the closest
- //surface to input_point
-
- for(i=mySurfs.size()-1; i--;)
- {
- CubitVector tmp_closest_location;
- tmp_surf = dynamic_cast<OCCSurface*>(mySurfs.get_and_step());
- tmp_surf->closest_point_trimmed( point, tmp_closest_location );
-
- double tmp_shortest_dist = point.distance_between( tmp_closest_location );
- if( tmp_shortest_dist < shortest_dist )
- {
- closest_location = tmp_closest_location;
- closest_surf = tmp_surf;
- shortest_dist = tmp_shortest_dist;
- }
- }
-
- //determine if it's on the surface, inside or outside
- if( shortest_dist <= GEOMETRY_RESABS )
- return CUBIT_PNT_BOUNDARY;
-
- //find the closest facet on that surface to input_point
- CubitFacet *closest_facet ;
- //= closest_surf->get_eval_tool()->closest_facet( closest_location );
-
- //get the coordinates of the closest point
- CubitPoint *pt1, *pt2;
- closest_facet->closest_point_trimmed( point, closest_location, pt1, pt2 );
-
- CubitVector normal;
- CubitPoint *on_point = NULL;
- //case 1: point is closest to an edge of the facet
- if( pt1 || pt2 )
- {
- //only returned one, so the it is closest to a node
- if(!pt2){
- on_point = pt1;
- }
- else if(!pt1){
- on_point = pt2;
- }
- else{//double-check that we are not closest to a single node
-
- if((pt1->coordinates().distance_between(closest_location)) <= GEOMETRY_RESABS )
- on_point = pt1;
- else if((pt2->coordinates().distance_between(closest_location)) <= GEOMETRY_RESABS )
- on_point = pt2;
- }
-
- if( on_point )
- {
- //get all facets that share this point
- DLIList<CubitFacet*> facets_sharing_point;
- on_point->facets( facets_sharing_point );
-
- for(i=facets_sharing_point.size(); i--; )
- normal += facets_sharing_point.get_and_step()->normal();
-
- //average the normals of all these facets
- normal /= facets_sharing_point.size();
- }
- else
- {
- //case 2: get the 2 normals of the 2 neighboring facets and average them
- int index;
- CubitFacetEdge *shared_facet_edge;
- shared_facet_edge = closest_facet->edge_from_pts( pt1, pt2, index);
- CubitFacet *other_facet = shared_facet_edge->other_facet( closest_facet );
- if(!other_facet){
- PRINT_ERROR("Edge is not connected to two facets.\n");
- normal = closest_facet->normal();
- }
- else{
- normal = ( closest_facet->normal() + other_facet->normal() ) / 2;
- }
- }
- }
- else
- {
- //case 3: just get the normal of this facet
- normal = closest_facet->normal();
- }
-
-// if ( closest_surf->get_relative_surface_sense() == CUBIT_REVERSED )
-// {
-// PRINT_WARNING("mbrewer: This shouldn't happen anymore.\n");
-// normal = -1.0*( normal );
-// }
-
- ShellSM *shell_sm = static_cast<ShellSM*>(this);
- if( closest_surf->get_shell_sense( shell_sm ) == CUBIT_REVERSED )
- {
- normal = -1.0*( normal );
- }
- if( (point-closest_location)%(normal) > 0 )
- return CUBIT_PNT_OUTSIDE;
- else
- return CUBIT_PNT_INSIDE;
-}
-
// ********** END PUBLIC FUNCTIONS **********
// ********** BEGIN PROTECTED FUNCTIONS **********
Modified: cgm/trunk/geom/OCC/OCCShell.hpp
===================================================================
--- cgm/trunk/geom/OCC/OCCShell.hpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCShell.hpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -42,7 +42,6 @@
public:
OCCShell(TopoDS_Shell *theShell);
- OCCShell(DLIList<Surface *> surfaces);
virtual ~OCCShell() ;
//- Destructor.
@@ -98,25 +97,18 @@
//- such operations on its entities. If it cannot, then "names"
//- of VGI entities will not propagate.
- CubitPointContainment point_containment( const CubitVector &point );
-
virtual void get_parents_virt( DLIList<TopologyBridge*>& parents );
virtual void get_children_virt( DLIList<TopologyBridge*>& children );
- void add_surfaces(DLIList <Surface *> surfaces);
+ void surfaces(DLIList <Surface *> surfaces);
DLIList <Surface *> surfaces();
- void add_surface(Surface * surface);
- void get_surfaces( DLIList<OCCSurface*>& surfaces );
-
- void disconnect_surfaces( DLIList<OCCSurface*> &surfs_to_disconnect );
void disconnect_all_surfaces();
protected:
private:
TopoDS_Shell *myTopoDSShell;
- DLIList <Surface *> mySurfs;
};
Modified: cgm/trunk/geom/OCC/OCCSurface.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCSurface.cpp 2007-11-29 21:37:49 UTC (rev 1432)
+++ cgm/trunk/geom/OCC/OCCSurface.cpp 2007-11-30 18:26:07 UTC (rev 1433)
@@ -61,7 +61,9 @@
#include <BRepLProp_SLProps.hxx>
#include <BRepGProp.hxx>
#include <GProp_GProps.hxx>
-
+#include "TopTools_ListIteratorOfListOfShape.hxx"
+#include "TopTools_DataMapOfShapeInteger.hxx"
+#include "TopTools_IndexedDataMapOfShapeListOfShape.hxx"
// ********** END OpenCascade INCLUDES **********
@@ -560,7 +562,30 @@
}
void OCCSurface::get_parents_virt( DLIList<TopologyBridge*>& parents )
- { /*CAST_LIST_TO_PARENT( myShells, parents );*/ }
+{
+ OCCQueryEngine* oqe = (OCCQueryEngine*) get_geometry_query_engine();
+ OCCBody * body = NULL;
+ DLIList <OCCBody* > *bodies = oqe->BodyList;
+ TopTools_IndexedDataMapOfShapeListOfShape M;
+ for(int i = 0; i < bodies->size(); i++)
+ {
+ body = bodies->get_and_step();
+ TopExp::MapShapesAndAncestors(*(body->get_TopoDS_Shape()),
+ TopAbs_FACE, TopAbs_SHELL, M);
+ const TopTools_ListOfShape& ListOfShapes =
+ M.FindFromKey(*(get_TopoDS_Face()));
+ if (!ListOfShapes.IsEmpty())
+ {
+ TopTools_ListIteratorOfListOfShape it(ListOfShapes) ;
+ for (;it.More(); it.Next())
+ {
+ TopoDS_Shell Shell = TopoDS::Shell(it.Value());
+ int k = oqe->OCCMap->Find(Shell);
+ parents.append((OCCShell*)(oqe->OccToCGM->find(k))->second);
+ }
+ }
+ }
+}
void OCCSurface::get_children_virt( DLIList<TopologyBridge*>& children )
{
@@ -568,8 +593,8 @@
TopExp::MapShapes(*myTopoDSFace, TopAbs_WIRE, M);
int ii;
for (ii=1; ii<=M.Extent(); ii++) {
- TopologyBridge *loop = OCCQueryEngine::occ_to_cgm(M(ii));
- children.append_unique(loop);
+ TopologyBridge *loop = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
+ children.append_unique(loop);
}
}
@@ -586,8 +611,8 @@
TopExp::MapShapes(*myTopoDSFace, TopAbs_WIRE, M);
int ii;
for (ii=1; ii<=M.Extent(); ii++) {
- TopologyBridge *loop = OCCQueryEngine::occ_to_cgm(M(ii));
- result_list.append_unique(dynamic_cast<OCCLoop*>(loop));
+ TopologyBridge *loop = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
+ result_list.append_unique(dynamic_cast<OCCLoop*>(loop));
}
}
More information about the cgma-dev
mailing list