cgma
|
#include <PartitionShell.hpp>
Definition at line 11 of file PartitionShell.hpp.
Definition at line 7 of file PartitionShell.cpp.
: myLump(0), lumpNext(0), firstCoSurf(0) { }
PartitionShell::~PartitionShell | ( | ) | [virtual] |
Definition at line 11 of file PartitionShell.cpp.
{ assert( !myLump ); remove_all_surfaces(); }
CubitStatus PartitionShell::add | ( | PartitionCoSurf * | cosurf | ) |
Definition at line 17 of file PartitionShell.cpp.
{ if( cosurf->myShell || cosurf->shellNext ) { assert(!cosurf->myShell && !cosurf->shellNext); return CUBIT_FAILURE; } cosurf->myShell = this; cosurf->shellNext = firstCoSurf; firstCoSurf = cosurf; return CUBIT_SUCCESS; }
PartitionCoSurf * PartitionShell::add | ( | PartitionSurface * | surf, |
CubitSense | sense | ||
) |
Definition at line 60 of file PartitionShell.cpp.
{ PartitionCoSurf* new_cos = new PartitionCoSurf( sense ); if( !surf->add(new_cos) || !this->add(new_cos) ) { delete new_cos; new_cos = 0; } return new_cos; }
void PartitionShell::append_simple_attribute_virt | ( | const CubitSimpleAttrib & | ) | [virtual] |
PartitionCoSurf * PartitionShell::find_first | ( | const PartitionSurface * | surface | ) | const |
Definition at line 71 of file PartitionShell.cpp.
{ PartitionCoSurf* cos = firstCoSurf; while( cos && cos->get_surface() != surf ) cos = cos->shellNext; return cos; }
PartitionCoSurf * PartitionShell::find_next | ( | const PartitionCoSurf * | cosurf | ) | const |
Definition at line 78 of file PartitionShell.cpp.
{ PartitionCoSurf* cos = prev->shellNext; while( cos && cos->get_surface() != prev->get_surface() ) cos = cos->shellNext; return cos; }
CubitSense PartitionShell::find_sense | ( | const PartitionSurface * | surface | ) | const |
Definition at line 85 of file PartitionShell.cpp.
{ PartitionCoSurf* cos = find_first( surf ); if( ! cos ) return CUBIT_UNKNOWN; CubitSense result = cos->sense(); while( (cos = find_next( cos )) ) if( cos->sense() != result ) return CUBIT_UNKNOWN; return result; }
void PartitionShell::get_children_virt | ( | DLIList< TopologyBridge * > & | children | ) | [virtual] |
Implements TopologyBridge.
Definition at line 126 of file PartitionShell.cpp.
{ PartitionCoSurf* cos = 0; while( (cos = next_co_surface( cos )) ) if( cos->get_surface() ) children.append_unique( cos->get_surface() ); }
GeometryQueryEngine * PartitionShell::get_geometry_query_engine | ( | ) | const [virtual] |
Implements TopologyBridge.
Definition at line 136 of file PartitionShell.cpp.
{ return VirtualQueryEngine::instance(); }
PartitionLump * PartitionShell::get_lump | ( | ) | const [inline] |
Definition at line 65 of file PartitionShell.hpp.
{ return myLump; }
void PartitionShell::get_parents_virt | ( | DLIList< TopologyBridge * > & | parents | ) | [virtual] |
Implements TopologyBridge.
Definition at line 120 of file PartitionShell.cpp.
CubitStatus PartitionShell::get_simple_attribute | ( | DLIList< CubitSimpleAttrib > & | ) | [virtual] |
Implements TopologyBridge.
Definition at line 147 of file PartitionShell.cpp.
{ return CUBIT_FAILURE; }
CubitStatus PartitionShell::get_simple_attribute | ( | const CubitString & | , |
DLIList< CubitSimpleAttrib > & | |||
) | [virtual] |
Implements TopologyBridge.
Definition at line 149 of file PartitionShell.cpp.
{ return CUBIT_FAILURE; }
bool PartitionShell::is_nonmanifold | ( | PartitionSurface * | surface | ) | const |
Definition at line 221 of file PartitionShell.cpp.
{ int count = 0; PartitionCoSurf* cosurf = 0; while ((cosurf = surf->next_co_surface( cosurf ))) if (cosurf->get_shell() == this) count++; return count != 1; }
int PartitionShell::layer | ( | ) | const [virtual] |
Reimplemented from TopologyBridge.
Definition at line 134 of file PartitionShell.cpp.
CubitStatus PartitionShell::mass_properties | ( | CubitVector & | centroid, |
double & | volume | ||
) |
Definition at line 232 of file PartitionShell.cpp.
{ PartitionCoSurf* cosurf = 0; DLIList<CubitFacetData*> facets; CubitVector p1, p2, p3, normal; const CubitVector p0(0.0, 0.0, 0.0); centroid.set(0.0, 0.0, 0.0 ); volume = 0.0; while ((cosurf = next_co_surface( cosurf ))) { if (is_nonmanifold( cosurf->get_surface() )) continue; facets.clean_out(); cosurf->get_surface()->get_facet_data( facets ); for (int i = facets.size(); i--; ) { CubitFacet* facet = facets.step_and_get(); p1 = facet->point(0)->coordinates(); p2 = facet->point(1)->coordinates(); p3 = facet->point(2)->coordinates(); normal = (p3 - p1) * (p2 - p1); double two_area = normal.length(); if (two_area > CUBIT_RESABS ) { if (cosurf->sense() == CUBIT_REVERSED) normal = -normal; normal /= two_area; double height = normal % (p0 - p1); double vol = two_area * height; volume += vol; centroid += vol * (p0 + p1 + p2 + p3); } } } if (volume > CUBIT_RESABS) centroid /= 4.0 * volume; volume /= 6.0; return CUBIT_SUCCESS; }
PartitionCoSurf * PartitionShell::next_co_surface | ( | const PartitionCoSurf * | prev = 0 | ) | const [inline] |
Definition at line 69 of file PartitionShell.hpp.
{ return !prev ? firstCoSurf : prev->myShell == this ? prev->shellNext : 0; }
Definition at line 166 of file PartitionShell.cpp.
{ // Find closest cosurface to passed point PartitionCoSurf* cosurf = 0; PartitionCoSurf* closest = 0; double dist_to_closest = CUBIT_DBL_MAX; CubitVector pt_on_surface; while( (cosurf = next_co_surface(cosurf)) ) { PartitionSurface* surf = cosurf->get_surface(); // Ignore surfaces that occur more than once in the // shell. bool skip = false; PartitionCoSurf* surf_cosurf = 0; while( (surf_cosurf = surf->next_co_surface(surf_cosurf)) ) { if( surf_cosurf->get_shell() == this && surf_cosurf != cosurf ) { skip = true; break; } } if( skip ) continue; surf->closest_point_trimmed( pt, pt_on_surface ); double dist_sqr = (pt - pt_on_surface).length_squared(); if( dist_sqr < dist_to_closest ) { closest = cosurf; dist_to_closest = dist_sqr; } } if( !closest ) return CUBIT_PNT_UNKNOWN; // already printed error messages above if( dist_to_closest < (GEOMETRY_RESABS*GEOMETRY_RESABS) ) // point is on shell return CUBIT_PNT_BOUNDARY; CubitVector normal; closest->get_surface()->closest_point_trimmed( pt, pt_on_surface ); closest->get_surface()->closest_point( pt_on_surface, 0, &normal ); if( closest->sense() == CUBIT_REVERSED ) normal *= -1.0; pt_on_surface -= pt; if ( pt_on_surface.length_squared() < GEOMETRY_RESABS*GEOMETRY_RESABS ) return CUBIT_PNT_BOUNDARY; return (normal % pt_on_surface) > 0.0 ? CUBIT_PNT_INSIDE : CUBIT_PNT_OUTSIDE; }
void PartitionShell::print_debug_info | ( | const char * | prefix = 0 | ) | const |
Definition at line 153 of file PartitionShell.cpp.
{ }
CubitStatus PartitionShell::remove | ( | PartitionCoSurf * | cosurf | ) |
Definition at line 31 of file PartitionShell.cpp.
{ if( cosurf->myShell != this ) { assert( cosurf->myShell == this ); return CUBIT_FAILURE; } if( cosurf == firstCoSurf ) { firstCoSurf->shellNext = cosurf->shellNext; firstCoSurf = firstCoSurf->shellNext; } else { PartitionCoSurf* prev = firstCoSurf; while( prev && prev->shellNext != cosurf ) prev = prev->shellNext; if( !prev ) { assert(0); return CUBIT_FAILURE; } prev->shellNext = cosurf->shellNext; } cosurf->myShell = 0; cosurf->shellNext = 0; return CUBIT_SUCCESS; }
void PartitionShell::remove_all_simple_attribute_virt | ( | ) | [virtual] |
void PartitionShell::remove_all_surfaces | ( | DLIList< PartitionSurface * > * | removed = 0 | ) |
Definition at line 102 of file PartitionShell.cpp.
{ while( PartitionCoSurf* cosurf = firstCoSurf ) { if( cosurf->get_surface() ) { if( list ) list->append( cosurf->get_surface() ); cosurf->get_surface()->remove( cosurf ); } remove( cosurf ); delete cosurf; } if( list ) list->uniquify_ordered(); }
void PartitionShell::remove_simple_attribute_virt | ( | const CubitSimpleAttrib & | ) | [virtual] |
friend class PartitionLump [friend] |
Definition at line 13 of file PartitionShell.hpp.
PartitionCoSurf* PartitionShell::firstCoSurf [private] |
Definition at line 62 of file PartitionShell.hpp.
PartitionShell* PartitionShell::lumpNext [private] |
Definition at line 60 of file PartitionShell.hpp.
PartitionLump* PartitionShell::myLump [private] |
Definition at line 59 of file PartitionShell.hpp.