|
cgma
|
#include <PartitionLump.hpp>
Definition at line 25 of file PartitionLump.hpp.
| PartitionLump::PartitionLump | ( | Lump * | real_lump | ) |
Definition at line 9 of file PartitionLump.cpp.
: listHead(0) { assert( dynamic_cast<SubEntitySet*>(real_lump->owner()) == 0 ); new SubEntitySet( real_lump, this ); }
| PartitionLump::PartitionLump | ( | PartitionLump * | split_from | ) |
Definition at line 16 of file PartitionLump.cpp.
: listHead(0) { split_from->sub_entity_set().add_partition( this ); }
| PartitionLump::~PartitionLump | ( | ) | [virtual] |
Definition at line 22 of file PartitionLump.cpp.
{
remove_all_shells();
}
| CubitStatus PartitionLump::add | ( | PartitionShell * | shell | ) |
Definition at line 33 of file PartitionLump.cpp.
| void PartitionLump::append_simple_attribute_virt | ( | const CubitSimpleAttrib & | csa | ) | [virtual] |
Implements TopologyBridge.
Definition at line 105 of file PartitionLump.cpp.
{ sub_entity_set().add_attribute( this, csa ); }
| CubitBox PartitionLump::bounding_box | ( | void | ) | const [virtual] |
Implements PartitionEntity.
Definition at line 142 of file PartitionLump.cpp.
{
return real_lump() ? real_lump()->bounding_box() : CubitBox();
}
| TopologyBridge * PartitionLump::find_parent_body | ( | ) | const |
Definition at line 238 of file PartitionLump.cpp.
{
if( get_body() )
return get_body();
Lump* lump = real_lump();
if(!lump) return 0;
DLIList<TopologyBridge*> list;
lump->get_parents_virt(list);
return list.size() ? list.get() : 0;
}
| PartitionShell * PartitionLump::first_shell | ( | ) | const [inline] |
Definition at line 83 of file PartitionLump.hpp.
{ return listHead; }
| void PartitionLump::get_all_children | ( | DLIList< PartitionEntity * > & | result | ) |
Definition at line 285 of file PartitionLump.cpp.
{
PartitionShell* shell = 0;
while( (shell = next_shell(shell)) )
{
PartitionCoSurf* cosurf = 0;
while( (cosurf = shell->next_co_surface(cosurf)) )
{
PartitionSurface* surface = cosurf->get_surface();
list.append( surface );
PartitionLoop* loop = 0;
while( (loop = surface->next_loop(loop)) )
{
PartitionCoEdge* coedge = loop->first_coedge();
do {
PartitionCurve* curve = coedge->get_curve();
list.append( curve );
list.append( curve->start_point() );
list.append( curve->end_point() );
coedge = loop->next_coedge( coedge );
} while( coedge != loop->first_coedge() );
}
}
}
int i;
for( i = list.size(); i--; )
list.step_and_get()->mark = 0;
for( i = list.size(); i--; )
list.step_and_get()->mark++;
for( i = list.size(); i--; )
{
list.step_and_get()->mark--;
if( list.get()->mark != 0 )
list.change_to(0);
}
list.remove_all_with_value(0);
}
| PartitionBody * PartitionLump::get_body | ( | ) | const |
Definition at line 235 of file PartitionLump.cpp.
{ return sub_entity_set().body(); }
| void PartitionLump::get_children_virt | ( | DLIList< TopologyBridge * > & | list | ) | [virtual] |
Implements TopologyBridge.
Definition at line 88 of file PartitionLump.cpp.
{
PartitionShell* shell = first_shell();
while( shell )
{
list.append( shell );
shell = next_shell( shell );
}
}
| GeometryQueryEngine * PartitionLump::get_geometry_query_engine | ( | ) | const [virtual] |
Implements TopologyBridge.
Definition at line 98 of file PartitionLump.cpp.
{
return VirtualQueryEngine::instance();
}
| void PartitionLump::get_parents_virt | ( | DLIList< TopologyBridge * > & | list | ) | [virtual] |
Implements TopologyBridge.
Definition at line 77 of file PartitionLump.cpp.
{
if( get_body() )
list.append( get_body() );
else
{
real_lump()->get_parents_virt( list );
// PartitionEngine::fix_up_query_results( list );
}
}
| CubitStatus PartitionLump::get_simple_attribute | ( | DLIList< CubitSimpleAttrib > & | list | ) | [virtual] |
Implements TopologyBridge.
Definition at line 111 of file PartitionLump.cpp.
{
sub_entity_set().get_attributes( this, list );
return CUBIT_SUCCESS;
}
| CubitStatus PartitionLump::get_simple_attribute | ( | const CubitString & | name, |
| DLIList< CubitSimpleAttrib > & | list | ||
| ) | [virtual] |
Implements TopologyBridge.
Definition at line 116 of file PartitionLump.cpp.
{
sub_entity_set().get_attributes( this, name.c_str(), list );
return CUBIT_SUCCESS;
}
| int PartitionLump::layer | ( | ) | const [inline, virtual] |
Reimplemented from TopologyBridge.
Definition at line 51 of file PartitionLump.hpp.
{ return sub_entity_set().get_owner_layer(); }
| CubitStatus PartitionLump::mass_properties | ( | CubitVector & | volume_centrioid, |
| double & | volume | ||
| ) | [virtual] |
Implements Lump.
Definition at line 333 of file PartitionLump.cpp.
{
PartitionShell* shell = 0;
CubitVector s_cent;
double s_vol;
volume = 0.0;
centroid.set( 0.0, 0.0, 0.0 );
while ((shell = next_shell( shell )))
{
if (CUBIT_SUCCESS != shell->mass_properties( s_cent, s_vol ))
return CUBIT_FAILURE;
centroid += s_vol * s_cent;
volume += s_vol;
}
if (volume > CUBIT_RESABS)
centroid /= volume;
else
centroid.set( 0.0, 0.0, 0.0 );
return CUBIT_SUCCESS;
}
| double PartitionLump::measure | ( | ) | [virtual] |
Implements GeometryEntity.
Definition at line 147 of file PartitionLump.cpp.
{
// Calculate volume of this lump from surface facets.
// Volume is calculated as the sum of the signed
// volumes of the tetrahedrons formed by this point
// with triagle.
CubitVector p0 = bounding_box().center();
double result = 0.0;
PartitionShell* shell = 0;
PartitionCoSurf* cosurf = 0;
DLIList<CubitFacetData*> facets;
CubitVector p1, normal;
// calculate area around this point
while ( (shell = next_shell(shell)) )
{
// mark surfaces with a count of how many times they
// occur in the shell
cosurf = 0;
while ( (cosurf = shell->next_co_surface(cosurf)) )
cosurf->get_surface()->mark = 0;
cosurf = 0;
while ( (cosurf = shell->next_co_surface(cosurf)) )
cosurf->get_surface()->mark++;
// calculate partial area for each surface
cosurf = 0;
while ( (cosurf = shell->next_co_surface(cosurf)) )
{
PartitionSurface* surf = cosurf->get_surface();
// skip non-manifold surfaces
if( surf->mark > 1 ) continue;
facets.clean_out();
surf->get_facet_data( facets );
for ( int i = facets.size(); i--; )
{
// Tetrahedron volume is Ah/3
// Calculate 2Ah and add to result.
// Divide result by 6 when all done.
CubitFacet* facet = facets.step_and_get();
p1 = facet->point(0)->coordinates();
normal = (facet->point(2)->coordinates() - p1)
* (facet->point(1)->coordinates() - p1);
// Triangle area is 1/2 length of edge product
double two_area = normal.length();
if ( two_area > CUBIT_RESABS )
{
// Calculating signed area - need to
// reverse facet normal for reversed
// cosurfaces.
if ( cosurf->sense() == CUBIT_REVERSED )
normal = -normal;
// Make normal a unit vector. Already
// calculated length, so reuse that
// value.
normal /= two_area;
// This is where the signed part of the
// calculation comes in. If normal is
// in opposite direction as the vector
// (p0-p1), then the height is negative.
double height = normal % (p0 - p1);
// Add the signed height value times
// twice the triangle area to result.
result += two_area * height;
}
}
}
// clear marks
cosurf = 0;
while ( (cosurf = shell->next_co_surface(cosurf)) )
cosurf->get_surface()->mark = 0;
}
// Calculated 2Ah for each tetrahedron, so divide
// by 6 to get Ah/3.
return result / 6.0;
}
| PartitionShell * PartitionLump::next_shell | ( | PartitionShell * | after_this = 0 | ) | const [inline] |
Definition at line 86 of file PartitionLump.hpp.
| void PartitionLump::notify_split | ( | FacetEntity * | , |
| FacetEntity * | |||
| ) | [virtual] |
| CubitPointContainment PartitionLump::point_containment | ( | const CubitVector & | pos, |
| double | tolerance = -1 |
||
| ) |
Definition at line 356 of file PartitionLump.cpp.
{
PartitionCoSurf* closest_surf = NULL;
double closest_dist = CUBIT_DBL_MAX;
CubitVector closest, normal;
PartitionShell* shell = 0;
while ((shell = next_shell( shell )))
{
PartitionCoSurf* cosurf = 0;
while ((cosurf = shell->next_co_surface( cosurf )))
{
PartitionSurface* surf = cosurf->get_surface();
if (!shell->is_nonmanifold( surf ))
{
surf->closest_point( pos, &closest );
double dist = (pos - closest).length_squared();
if (dist < closest_dist)
{
closest_dist = dist;
closest_surf = cosurf;
}
}
}
}
if (!closest_surf)
return CUBIT_PNT_UNKNOWN;
if( tolerance < 0 )
tolerance = GEOMETRY_RESABS;
closest_surf->get_surface()->closest_point( pos, &closest, &normal );
if ((closest - pos).length_squared() < tolerance * tolerance )
return CUBIT_PNT_BOUNDARY;
if (closest_surf->sense() == CUBIT_REVERSED)
normal = -normal;
double dot = normal % (closest - pos);
return dot < CUBIT_RESABS ? CUBIT_PNT_OUTSIDE :
dot > CUBIT_RESABS ? CUBIT_PNT_INSIDE :
CUBIT_PNT_UNKNOWN;
}
| Lump * PartitionLump::real_lump | ( | ) | const |
Definition at line 27 of file PartitionLump.cpp.
{
return dynamic_cast<Lump*>(partitioned_entity());
}
| CubitStatus PartitionLump::remove | ( | PartitionShell * | shell | ) |
Definition at line 42 of file PartitionLump.cpp.
{
if( shell->myLump != this )
return CUBIT_FAILURE;
if( listHead == shell )
{
listHead = shell->lumpNext;
}
else
{
PartitionShell* sh = listHead;
while( sh && sh->lumpNext != shell )
sh = sh->lumpNext;
assert( sh && sh->lumpNext == shell );
sh->lumpNext = shell->lumpNext;
}
shell->myLump = 0;
shell->lumpNext = 0;
return CUBIT_SUCCESS;
}
| void PartitionLump::remove_all_shells | ( | ) |
Definition at line 65 of file PartitionLump.cpp.
{
while( listHead )
{
CubitStatus s = remove( listHead );
assert( s );
if (CUBIT_SUCCESS != s) {
PRINT_ERROR("Failed to remove all shells.\n");
}
}
}
| void PartitionLump::remove_all_simple_attribute_virt | ( | ) | [virtual] |
Implements TopologyBridge.
Definition at line 109 of file PartitionLump.cpp.
{ sub_entity_set().rem_all_attrib( this ); }
| void PartitionLump::remove_simple_attribute_virt | ( | const CubitSimpleAttrib & | csa | ) | [virtual] |
Implements TopologyBridge.
Definition at line 107 of file PartitionLump.cpp.
{ sub_entity_set().rem_attribute( this, csa ); }
| void PartitionLump::reverse_sense | ( | ) | [virtual] |
Implements PartitionEntity.
Definition at line 126 of file PartitionLump.cpp.
{
PartitionShell* shell = 0;
while( (shell = next_shell(shell)) )
{
PartitionCoSurf* cosurf = 0;
while( (cosurf = shell->next_co_surface( cosurf )) )
{
bool reversed = (cosurf->sense() == CUBIT_REVERSED);
cosurf->sense( reversed ? CUBIT_FORWARD : CUBIT_REVERSED );
}
}
}
| CubitStatus PartitionLump::save | ( | CubitSimpleAttrib & | attrib | ) | [virtual] |
Implements PartitionEntity.
Definition at line 251 of file PartitionLump.cpp.
{
DLIList<int> surf_list;
PartitionShell* shell = 0;
while( (shell = next_shell(shell)) )
{
PartitionCoSurf* cosurf = 0;
int cosurf_count = 0;
while( (cosurf = shell->next_co_surface(cosurf)) )
cosurf_count++;
surf_list.append(cosurf_count);
cosurf = 0;
while( (cosurf = shell->next_co_surface(cosurf)) )
{
PartitionSurface* surf = cosurf->get_surface();
int set_id = 0;
int surf_id = surf->sub_entity_set().get_id(surf);
if( &(surf->sub_entity_set()) != &sub_entity_set() )
set_id = surf->sub_entity_set().get_unique_id();
if ( cosurf->sense() == CUBIT_REVERSED )
surf_id = -surf_id;
surf_list.append( set_id );
surf_list.append( surf_id );
}
}
int id = sub_entity_set().get_id(this);
return sub_entity_set().save_geometry( id, 3, 0, 0, &surf_list, 0, attrib );
}
| void PartitionLump::transform | ( | const CubitTransformMatrix & | ) | [virtual] |
friend class PartitionBody [friend] |
Definition at line 29 of file PartitionLump.hpp.
PartitionShell* PartitionLump::listHead [private] |
Definition at line 80 of file PartitionLump.hpp.