|
cgma
|
#include <PartitionLumpImprint.hpp>
Definition at line 34 of file PartitionLumpImprint.hpp.
Definition at line 48 of file PartitionLumpImprint.cpp.
: lump(set_lump) { lump->get_all_children( entityList ); entityList.reset(); for( int i = 0; i < entityList.size(); i++ ) rTree.add(entityList.get_and_step()); entityList.append(lump); newSurface = 0; }
| CubitStatus PartitionLumpImprint::abort_imprint | ( | ) | [private] |
Definition at line 640 of file PartitionLumpImprint.cpp.
{
PRINT_ERROR("Loop-Volume imprint failed in PartitionLumpImprint\n"
"\tAttempting to restore state.\n");
clean_up_loop();
DLIList<PartitionCurve*> curves;
DLIList<PartitionPoint*> points;
CAST_LIST( newEntities, curves, PartitionCurve );
CAST_LIST( newEntities, points, PartitionPoint );
while( curves.size() )
{
PartitionCurve* curve = curves.pop();
// if num curves for the startpoint/endpoint equals one, this point will
// get cleaned up when the curve is deleted or removed
// so remove the point from the list of points to clean up
if (1 == curve->start_point()->num_curves())
points.remove(curve->start_point());
if (1 == curve->end_point()->num_curves())
points.remove(curve->end_point());
if( &(curve->sub_entity_set()) == &(lump->sub_entity_set()) )
delete curve;
else
PartitionEngine::instance().remove_curve(curve);
}
while( points.size() )
{
PartitionPoint* point = points.pop();
if( point->next_curve() == 0 )
delete point;
else if( dynamic_cast<PartPTCurve*>(point->next_curve()) )
PartitionEngine::instance().remove_point_curve(point);
else if( dynamic_cast<Curve*>(point->partitioned_entity()) )
PartitionEngine::instance().remove_point(point);
}
while( facetList.size() )
PartitionEngine::delete_facet( facetList.pop() );
return CUBIT_FAILURE;
}
| bool PartitionLumpImprint::add | ( | PartitionEntity * | entity | ) | [private] |
Definition at line 70 of file PartitionLumpImprint.cpp.
{
if( !entityList.append_unique(entity) )
return false;
rTree.add(entity);
return true;
}
| void PartitionLumpImprint::begin_loop | ( | DLIList< CubitPoint * > & | loop | ) | [private] |
Definition at line 166 of file PartitionLumpImprint.cpp.
{
loopPoints = points;
// associate each point with a geometric entity using rtree
DLIList<PartitionEntity*> closest_list;
CubitBox box;
loopPoints.reset();
for( int i = 0; i < loopPoints.size(); i++ )
{
CubitPoint* pt = loopPoints.next(i);
closest_list.clean_out();
CubitVector v = pt->coordinates();
box.reset( CubitVector( v.x() - DIST_TOL,
v.y() - DIST_TOL,
v.z() - DIST_TOL ),
CubitVector( v.x() + DIST_TOL,
v.y() + DIST_TOL,
v.z() + DIST_TOL ) );
rTree.find( box, closest_list );
PartitionEntity* closest = find_closest( v, closest_list );
if ( closest ) {
set_point_owner(pt, closest);
} else {
set_point_owner(pt, lump);
}
}
}
| void PartitionLumpImprint::clean_up_loop | ( | ) | [private] |
Definition at line 281 of file PartitionLumpImprint.cpp.
{
for( int i = entityList.size(); i--; )
entityList.get_and_step()->mark = 0;
entityList.reset();
loopPoints.clean_out();
pointAssoc.clear();
}
| CubitStatus PartitionLumpImprint::do_imprint | ( | ) | [private] |
Definition at line 1108 of file PartitionLumpImprint.cpp.
{
// partition curves
int i;
for( i = 0; i <= num_points(); i++ )
{
// If the point owner isn't a curve, skip it.
PartitionEntity* curr = point_owner(point(i));
PartitionCurve* curve = dynamic_cast<PartitionCurve*>(curr);
if( !curve )
continue;
// Split the curve at any point at which the polyline
// leaves the curve (except the end points, of course)
PartitionEntity* prev = point_owner(point(i-1));
PartitionEntity* next = point_owner(point(i+1));
if( (prev != curr &&
prev != curve->start_point() &&
prev != curve->end_point()) ||
(next != curr &&
next != curve->start_point() &&
next != curve->end_point()) )
{
if( !partitionCurve( point(i) ) )
return CUBIT_FAILURE;
}
}
// partition surfaces
// find position to start at
for( i = 0; i < num_points(); i++ )
if( point_owner(point(i)) != point_owner(point(i+1)) ||
!dynamic_cast<PartitionSurface*>(point_owner(point(i))) )
break;
// loop through all points
int index = i + 1;
for( i = 0; i <= num_points(); )
{
// loop until we are at a point on a surface
PartitionSurface* surf = 0;
while( i <= num_points() &&
!(surf = dynamic_cast<PartitionSurface*>(point_owner(point(index)))) )
{
i++;
index++;
}
if( i > num_points() )
break;
// need the previous point too
int prev_index = index - 1;
// find remaining points on surface
index++;
i++;
while( i <= num_points() && (point_owner(point(index)) == surf) )
{
index++;
i++;
}
// loop stoped past last point on surface
// store it and back up one.
int next_index = index;
index--;
i--;
// partition the surface
if( ! partitionSurface( prev_index, next_index ) )
return CUBIT_FAILURE;
}
// check for additional surface partitions where
// the polyline has points on the boundary but
// not the interior of the surface
for( i = 0; i <= num_points(); i++ )
{
PartitionPoint* pt1 = dynamic_cast<PartitionPoint*>(point_owner(point(i)));
PartitionPoint* pt2 = dynamic_cast<PartitionPoint*>(point_owner(point(i+1)));
if( !pt1 || !pt2 || pt1->common_curve(pt2) )
continue;
CubitVector close, midpt = (pt1->coordinates() + pt2->coordinates()) / 2;
PartitionSurface* surf = 0;
PartitionCurve* curve = 0;
double closest_dist = DIST_TOL_SQR;
while( (curve = pt1->next_curve(curve)) )
{
PartitionCoEdge* coedge = 0;
while( (coedge = curve->next_coedge(coedge)) )
{
PartitionSurface* surface = coedge->get_loop()->get_surface();
if( surface == surf )
continue;
bool surf_contains_pt2 = false;
PartitionCurve* curve2 = 0;
while( (curve2 = pt2->next_curve(curve2)) && !surf_contains_pt2 )
{
PartitionCoEdge* coedge2 = 0;
while( (coedge2 = curve2->next_coedge(coedge2)) )
{
if( coedge2->get_loop()->get_surface() == surface )
{
surf_contains_pt2 = true;
break;
}
}
}
if( ! surf_contains_pt2 )
continue;
surface->closest_point( midpt, &close );
double dist_sqr = (close - midpt).length_squared();
if( dist_sqr <= DIST_TOL_SQR &&
(!surf || dist_sqr < closest_dist) )
surf = surface;
closest_dist = dist_sqr;
}
}
int end = i + 1;
if( surf && !partitionSurface(i, end, surf) )
return CUBIT_FAILURE;
i = end - 1;
}
return CUBIT_SUCCESS;
}
| PartitionEntity * PartitionLumpImprint::find_closest | ( | const CubitVector & | pos, |
| DLIList< PartitionEntity * > & | list, | ||
| bool | use_tolerance = true |
||
| ) | [private] |
Definition at line 205 of file PartitionLumpImprint.cpp.
{
PartitionPoint* ppoint;
PartitionCurve* pcurve;
PartitionSurface* psurf;
closest_list.reset();
double closest_dist_sqr = use_tolerance ? DIST_TOL_SQR : CUBIT_DBL_MAX;
PartitionEntity* closest = 0;
int closest_dim = 3;
CubitVector c;
for( int i = closest_list.size(); i--; )
{
PartitionEntity* entity = closest_list.get_and_step();
int dim = 3;
if( (ppoint = dynamic_cast<PartitionPoint*>(entity)) )
{
c = ppoint->coordinates();
dim = 0;
}
else if( (pcurve = dynamic_cast<PartitionCurve*>(entity)) )
{
pcurve->closest_point_trimmed( pt, c );
dim = 1;
}
else if( (psurf = dynamic_cast<PartitionSurface*>(entity)) )
{
psurf->closest_point_trimmed( pt, c );
dim = 2;
}
else
assert(0);
// want the entity of smallest dimension within
// tolerance of point.
double dist_sqr = (pt - c).length_squared();
if ( use_tolerance )
{
if( (dim == closest_dim && dist_sqr < closest_dist_sqr) ||
(dim < closest_dim && dist_sqr <= DIST_TOL_SQR ) )
{
closest_dist_sqr = dist_sqr;
closest = entity;
closest_dim = dim;
}
}
else
{
double diff = closest_dist_sqr - dist_sqr;
if ( (dim > closest_dim && diff > DIST_TOL_SQR) ||
(dim == closest_dim && diff > 0.0 ) ||
(dim < closest_dim && diff > -DIST_TOL_SQR) )
{
closest_dist_sqr = dist_sqr;
closest = entity;
closest_dim = dim;
}
}
}
return closest;
}
| CubitStatus PartitionLumpImprint::get_curves | ( | DLIList< PartitionCoEdge * > & | result_list | ) | [private] |
Definition at line 1314 of file PartitionLumpImprint.cpp.
{
list.clean_out();
DLIList<CubitFacetEdgeData*> facet_edges, curve_edges;
CubitStatus result = CUBIT_SUCCESS;
// search for a vertex to begin at
int i;
PartitionPoint* pt = 0;
for( i = 0; i < num_points(); i++ )
if( (pt = dynamic_cast<PartitionPoint*>(point_owner(point(i)))) )
break;
if( !pt )
return CUBIT_FAILURE;
CubitPoint* prev_facet_pt = point(i);
int index = i + 1;
PartitionCurve* curve = 0;
for( i = 0; result && i < num_points(); i++, index++ )
{
CubitPoint* facet_pt = point(index);
CubitFacetEdgeData* edge =
dynamic_cast<CubitFacetEdgeData*>(prev_facet_pt->shared_edge( facet_pt ));
if ( !edge ) {
result = CUBIT_FAILURE;
break;
}
facet_edges.append(edge);
prev_facet_pt = facet_pt;
PartitionPoint* pt2;
PartitionCurve* curve2;
if( (pt2 = dynamic_cast<PartitionPoint*>(point_owner(point(index)))) )
{
if( curve )
{
if( curve->other_point(pt) != pt2 )
result = CUBIT_FAILURE;
}
else
{
//find common curves
curve = 0;
PartitionCurve* tmp_curve = 0;
while( (tmp_curve = pt->next_curve(tmp_curve) ) != NULL )
{
if ( tmp_curve->other_point(pt) != pt2 )
continue;
if( !curve )
{
curve = tmp_curve;
continue;
}
CubitVector mid = 0.5 * (pt->coordinates() + pt2->coordinates());
CubitVector cpt, tpt;
curve->closest_point( mid, cpt );
tmp_curve->closest_point( mid, tpt );
cpt -= mid;
tpt -= mid;
if ( cpt.length_squared() > tpt.length_squared() )
curve = tmp_curve;
}
if( !curve )
result = CUBIT_FAILURE;
}
if ( !result )
break;
CubitSense sense;
if ( curve->start_point() != curve->end_point() ) {
sense = curve->start_point() == pt ? CUBIT_FORWARD : CUBIT_REVERSED;
} else {
CubitVector junk, tangent;
facet_edges.last();
CubitVector es = facet_edges.get()->point(0)->coordinates();
CubitVector ee = facet_edges.get()->point(1)->coordinates();
curve->closest_point( 0.5*(es+ee), junk, &tangent );
sense = (ee-es)%tangent < 0.0 ? CUBIT_REVERSED : CUBIT_FORWARD;
}
PartitionCoEdge* new_coedge = new PartitionCoEdge( newSurface, sense );
curve->add(new_coedge);
list.append(new_coedge);
curve = 0;
pt = pt2;
facet_edges.append(0);
}
else
{
curve2 = dynamic_cast<PartitionCurve*>(point_owner(point(index)));
if( !curve2 || (curve && curve != curve2) )
result = CUBIT_FAILURE;
else
curve = curve2;
}
}
if ( result )
{
// seam facet edges
facet_edges.reset();
list.reset();
int used = facet_edges.size();
for ( i = list.size(); i--; )
{
PartitionCurve* curve = list.get_and_step()->get_curve();
curve_edges.clean_out();
CubitFacetEdgeData* edge;
while ( used-- && (edge = facet_edges.get_and_step()) )
curve_edges.append(edge);
assert(curve_edges.size());
if ( !seam_curve( curve_edges, curve, facetList ) )
{
result = CUBIT_FAILURE;
break;
}
}
}
if (result)
return CUBIT_SUCCESS;
while ( list.size() )
{
PartitionCoEdge* coedge = list.pop();
coedge->get_curve()->remove(coedge);
delete coedge;
}
return CUBIT_FAILURE;
}
| void PartitionLumpImprint::get_owned_points | ( | PartitionEntity * | owner, |
| DLIList< CubitPoint * > & | results | ||
| ) | [private] |
Definition at line 370 of file PartitionLumpImprint.cpp.
{
std::map<CubitPoint*,PartitionEntity*>::iterator itor = pointAssoc.begin();
for ( ; itor != pointAssoc.end(); ++itor )
if( itor->second == owner )
results.append(itor->first);
}
| PartitionSurface * PartitionLumpImprint::imprint | ( | DLIList< CubitFacet * > & | facets, |
| DLIList< PartitionEntity * > & | new_entities | ||
| ) |
Definition at line 389 of file PartitionLumpImprint.cpp.
{
init(&facets);
DLIList<CubitVector> empty_list;
return imprint( empty_list, new_list );
}
| PartitionSurface * PartitionLumpImprint::imprint | ( | DLIList< CubitFacetData * > & | facets, |
| DLIList< CubitVector > & | vtx_points, | ||
| DLIList< PartitionEntity * > & | new_entities | ||
| ) |
Definition at line 397 of file PartitionLumpImprint.cpp.
| PartitionSurface * PartitionLumpImprint::imprint | ( | DLIList< CubitVector > & | vtx_points, |
| DLIList< PartitionEntity * > & | new_entities | ||
| ) | [private] |
Definition at line 406 of file PartitionLumpImprint.cpp.
{
int i, j;
newSurface = new PartitionSurface( lump );
// Make vertices where requested.
DLIList<CubitPoint*> vtx_points, all_points;
for ( j = 0; j < 3; j++ )
for ( i = facetList.size(); i--; )
facetList.get_and_step()->point(j)->marked(1);
for ( j = 0; j < 3; j++ ) {
for ( i = facetList.size(); i--; ) {
if ( facetList.step_and_get()->point(j)->marked() ) {
facetList.get()->point(j)->marked(0);
all_points.append( facetList.get()->point(j) );
}
}
}
for ( i = vertices.size(); i--; )
{
double closest_sqr = CUBIT_DBL_MAX;
CubitPoint* closest_pt = 0;
CubitVector vect = vertices.get_and_step();
for ( j = all_points.size(); j--; )
{
CubitPoint* pt = all_points.step_and_get();
double dist_sqr = (pt->coordinates() - vect).length_squared();
if ( dist_sqr < closest_sqr )
{
closest_sqr = dist_sqr;
closest_pt = pt;
}
}
vtx_points.append( closest_pt );
}
// For each closed chain of boundary edges
DLIList<CubitFacetEdge*> pt_edges;
DLIList<CubitPoint*> chain, chain_verts;
int unused = boundaryEdges.size();
while( unused )
{
// find first edge
for ( i = boundaryEdges.size(); i--; )
if ( boundaryEdges.step_and_get()->marked() )
break;
if ( !boundaryEdges.get()->marked() )
break;
chain.clean_out();
chain_verts.clean_out();
CubitFacetEdge* edge = boundaryEdges.get();
edge->marked(0);
unused--;
CubitPoint* first_pt = edge->point(0);
CubitPoint* point = edge->point(1);
CubitFacet* facet = edge->adj_facet(0);
int edge_index = facet->edge_index(edge);
if ( facet->edge_use(edge_index) == -1 )
std::swap(first_pt, point);
while( point != first_pt )
{
chain.append( point );
if ( vtx_points.is_in_list(point) )
chain_verts.append(point);
pt_edges.clean_out();
point->edges(pt_edges);
for ( j = pt_edges.size(); j--; )
if ( pt_edges.step_and_get()->marked() )
break;
if ( !pt_edges.get()->marked() )
break;
edge = pt_edges.get();
edge->marked(0);
unused--;
point = edge->other_point(point);
}
if ( point != first_pt )
break;
chain.append( first_pt );
if ( vtx_points.is_in_list(first_pt) )
chain_verts.append(first_pt);
// remove edges from boundaryList that will be
// destroyed by merging with other facet edges.
for ( i = boundaryEdges.size(); i--; )
if( boundaryEdges.step_and_get()->marked() == 0 )
boundaryEdges.change_to(0);
boundaryEdges.remove_all_with_value(0);
PartitionLoop* new_loop = imprint( chain, chain_verts );
if (!new_loop)
{
unused = 1;
break;
}
newSurface->add(new_loop);
}
if ( !unused )
{
new_list = newEntities;
PartitionSurface* result = newSurface;
result->set_facet_data( facetList );
newSurface = 0;
return result;
}
abort_imprint();
return 0;
}
| PartitionLoop * PartitionLumpImprint::imprint | ( | DLIList< CubitPoint * > & | loop, |
| DLIList< CubitPoint * > & | vtx_points | ||
| ) | [private] |
Definition at line 545 of file PartitionLumpImprint.cpp.
{
begin_loop( loop );
DLIList<PartitionCoEdge*> results;
if( ! make_vertices( vtx_points ) )
{
PRINT_ERROR("PartitionLumpImprint::make_vertices() failed.\n");
return 0;
}
if( ! do_imprint() )
{
PRINT_ERROR("PartitionLumpImprint::do_imprint() failed.\n");
return 0;
}
if( ! make_volume_curves() )
{
PRINT_ERROR("PartitionLumpImprint::make_volume_curves() failed.\n");
return 0;
}
if( ! get_curves(results) )
{
PRINT_ERROR("PartitionLumpImprint::get_curves() failed.\n");
return 0;
}
//for ( int i = 0; i < results.size(); i++ )
// results.get_and_step()->draw_facets(CUBIT_RED_INDEX);
PartitionLoop* new_loop = new PartitionLoop;
results.reverse();
PartitionCoEdge* prev = 0;
while ( results.size() )
{
PartitionCoEdge* coe = results.pop();
new_loop->insert_after( coe, prev );
prev = coe;
}
clean_up_loop();
return new_loop;
}
| void PartitionLumpImprint::init | ( | DLIList< CubitFacet * > * | facets | ) | [private] |
Definition at line 89 of file PartitionLumpImprint.cpp.
{
int i, j, junk = 0;
PART_LUMP_PRINT("Beginning imprint\n");
boundaryEdges.clean_out();
newEntities.clean_out();
assert(newSurface == 0);
if ( facets )
{
// clear all marks
for ( i = facets->size(); i--; )
{
CubitFacet* facet = facets->get_and_step();
facet->point(0)->marked(0);
facet->point(1)->marked(0);
facet->point(2)->marked(0);
}
// copy facets
DLIList<CubitPointData*> new_facet_pts;
for ( i = facets->size(); i--; )
{
CubitFacet* facet = facets->get_and_step();
CubitPointData *pts[3];
for ( j = 0; j < 3; j++ )
{
CubitPoint* pt = facet->point(j);
if ( !pt->marked() )
{
pts[j] = new CubitPointData(pt->coordinates());
new_facet_pts.append(pts[j]);
pt->marked(new_facet_pts.size());
}
else
{
new_facet_pts.reset();
pts[j] = new_facet_pts.next(pt->marked()-1);
}
}
facetList.append( new CubitFacetData(pts[0], pts[1], pts[2], &junk ) );
}
// clear marks on input facets
for ( i = facets->size(); i--; )
{
CubitFacet* facet = facets->get_and_step();
facet->point(0)->marked(0);
facet->point(1)->marked(0);
facet->point(2)->marked(0);
}
}
// mark boundary edges with a 1, others with a 0
for ( i = facetList.size(); i--; )
{
CubitFacetData* facet = facetList.get_and_step();
for ( j = 0; j < 3; j++ )
facet->edge(j)->marked( facet->edge(j)->marked() + 1 );
}
for ( i = facetList.size(); i--; )
{
CubitFacetData* facet = facetList.get_and_step();
for ( j = 0; j < 3; j++ )
{
if ( facet->edge(j)->marked() == 1 )
boundaryEdges.append( facet->edge(j) );
facet->edge(j)->marked(0);
}
}
for ( i = boundaryEdges.size(); i--; )
boundaryEdges.get_and_step()->marked(1);
}
| CubitStatus PartitionLumpImprint::make_vertices | ( | DLIList< CubitPoint * > & | vtx_points | ) | [private] |
Definition at line 603 of file PartitionLumpImprint.cpp.
{
for( int i = 0; i < vtx_points.size(); i++ )
{
CubitPoint* pt = vtx_points.get_and_step();
PartitionEntity* entity = point_owner(pt);
if( !entity )
continue;
if( dynamic_cast<TBPoint*>(entity) ) {
; // already a point
}
else if( dynamic_cast<Curve*>(entity) ) {
if( !partitionCurve( pt ) )
return CUBIT_FAILURE;
}
else if( dynamic_cast<Surface*>(entity) ) {
if( !makePointCurve( pt ) )
return CUBIT_FAILURE;
}
else if( !makeFreePoint( pt ) ) {
return CUBIT_FAILURE;
}
}
return CUBIT_SUCCESS;
}
| CubitStatus PartitionLumpImprint::make_volume_curves | ( | ) | [private] |
Definition at line 1251 of file PartitionLumpImprint.cpp.
{
// start at any point not owned by the volume
int i;
for( i = 0; i <= num_points() && point_owner(point(i)) == lump; i++ );
// if everything is owned by the volume, make one vertex
if( point_owner(point(i)) == lump && !makeFreePoint(point(i)) )
return CUBIT_FAILURE;
// create free curves from points in volume interior
int index = i % num_points();
for( i = 0; i <= num_points(); )
{
// advance until a point in the volume interior
while( i <= num_points() && point_owner(point(index)) != lump )
{
i++;
index = (index + 1) % num_points();
}
if( i > num_points() )
break;
// vertex to begin curve is at previous index
int prev_index = (index + num_points() - 1) % num_points();
// advance util we find a point not in the volume interior
// (actually until a vertex possibly in the volume interior)
while( i <= num_points() && point_owner(point(index)) == lump )
{
i++;
index = (index + 1) % num_points();
}
// construct the curve
if( !makeFreeCurve( prev_index, index ) )
return CUBIT_FAILURE;
}
// create free curves where two points in are on vertices
// but there does not already exist a curve connecting the
// points
for( i = 0; i <= num_points(); i++ )
{
PartitionPoint* pt1 = dynamic_cast<PartitionPoint*>(point_owner(point(i)));
PartitionPoint* pt2 = dynamic_cast<PartitionPoint*>(point_owner(point(i+1)));
if( pt1 && pt2 && !pt1->common_curve(pt2) && !makeFreeCurve(i,i+1) )
return CUBIT_FAILURE;
}
return CUBIT_SUCCESS;
}
| CubitStatus PartitionLumpImprint::makeFreeCurve | ( | int | start_vert_point, |
| int | end_vert_point | ||
| ) | [private] |
Definition at line 1045 of file PartitionLumpImprint.cpp.
{
PartitionPoint* start_pt
= dynamic_cast<PartitionPoint*>(point_owner(point(start_id)));
PartitionPoint* end_pt
= dynamic_cast<PartitionPoint*>(point_owner(point(end_id)));
if( !start_pt || !end_pt )
return CUBIT_FAILURE;
PART_LUMP_PRINT("Creating free curve from point %p (%d) (%f,%f,%f)"
" to point %p (%d) (%f,%f,%f)\n",
(void*)start_pt, dynamic_cast<RefEntity*>(start_pt->topology_entity()) ?
dynamic_cast<RefEntity*>(start_pt->topology_entity())->id() : 0,
start_pt->coordinates().x(), start_pt->coordinates().y(), start_pt->coordinates().z(),
(void*)end_pt, dynamic_cast<RefEntity*>(end_pt->topology_entity()) ?
dynamic_cast<RefEntity*>(end_pt->topology_entity())->id() : 0,
end_pt->coordinates().x(), end_pt->coordinates().y(), end_pt->coordinates().z());
bool all_pts = false;
if( start_id == end_id )
{
end_id = (end_id+1)%num_points();
all_pts = true;
}
int i;
DLIList<CubitPoint*> points;
points.append( point(start_id) );
end_id %= num_points();
for( i = (start_id + 1) % num_points(); i != end_id; i = (i+1)%num_points() )
{
if( point_owner(point(i)) != lump )
return CUBIT_FAILURE;
points.append( point(i) );
}
points.append( point(all_pts ? start_id : end_id) );
DLIList<CubitVector*> curve_segments;
points.reset();
for( i = points.size(); i--; )
curve_segments.append( new CubitVector(points.get_and_step()->coordinates()));
SegmentedCurve* curve = new SegmentedCurve( lump, curve_segments );
while( curve_segments.size() )
delete curve_segments.pop();
curve->start_point(start_pt);
curve->end_point(end_pt);
add(curve);
newEntities.append(curve);
for( i = (start_id + 1) % num_points(); i != end_id; i = (i+1)%num_points() )
set_point_owner( point(i), curve );
return CUBIT_SUCCESS;
}
| CubitStatus PartitionLumpImprint::makeFreePoint | ( | CubitPoint * | pt | ) | [private] |
Definition at line 1022 of file PartitionLumpImprint.cpp.
{
PART_LUMP_PRINT("Creating free vertex at (%f,%f,%f)\n",
pt->coordinates().x(), pt->coordinates().y(), pt->coordinates().z() );
assert( point_owner(pt) == lump );
PartitionPoint* new_pt = new PartitionPoint( pt->coordinates(), lump );
add(new_pt);
newEntities.append(new_pt);
set_point_owner( pt, new_pt );
return CUBIT_SUCCESS;
}
| CubitStatus PartitionLumpImprint::makePointCurve | ( | CubitPoint * | pt | ) | [private] |
Definition at line 984 of file PartitionLumpImprint.cpp.
{
PartitionEntity* ent = point_owner(pt);
PartitionSurface* surf = dynamic_cast<PartitionSurface*>(ent);
CubitPointData* cpd =
PartitionEngine::instance().project_to_surface(surf, pt->coordinates());
PART_LUMP_PRINT("Creating vertex on surface %p (%d) at (%f,%f,%f)\n",
(void*)surf, dynamic_cast<RefEntity*>(surf->topology_entity()) ?
dynamic_cast<RefEntity*>(surf->topology_entity())->id() : 0,
pt->coordinates().x(), pt->coordinates().y(), pt->coordinates().z() );
PartitionPoint* new_point = 0;
if( cpd )
new_point = PartitionEngine::instance().insert_point_curve( surf, cpd );
if ( !new_point )
{
PRINT_ERROR("PartitionLumpImprint: point-curve creation failed.\n");
return CUBIT_FAILURE;
}
add(new_point);
newEntities.append(new_point);
pt->set(new_point->coordinates());
set_point_owner( pt, new_point );
return CUBIT_SUCCESS;
}
| int PartitionLumpImprint::num_points | ( | ) | const [inline, private] |
Definition at line 66 of file PartitionLumpImprint.hpp.
{ return loopPoints.size(); }
| CubitStatus PartitionLumpImprint::partitionCurve | ( | CubitPoint * | pt | ) | [private] |
Definition at line 697 of file PartitionLumpImprint.cpp.
{
// get entities
PartitionEntity* ent = point_owner(pt);
PartitionCurve* curve = dynamic_cast<PartitionCurve*>(ent);
assert(!!curve);
PART_LUMP_PRINT("Splitting curve %p (%d) at (%f,%f,%f)\n",
(void*)curve, dynamic_cast<RefEntity*>(curve->topology_entity()) ?
dynamic_cast<RefEntity*>(curve->topology_entity())->id() : 0,
pt->coordinates().x(), pt->coordinates().y(), pt->coordinates().z() );
// get list of associated points that will need to be moved
// to the new partition of the curve after the split.
double u_end = curve->u_from_position( pt->coordinates() );
DLIList<CubitPoint*> points_to_move;
get_owned_points( curve, points_to_move );
CubitPoint* curve_pt;
for( int i = points_to_move.size(); i--; )
{
curve_pt = points_to_move.step_and_get();
double u = curve->u_from_position( curve_pt->coordinates() );
if( u < u_end || curve_pt == pt )
points_to_move.change_to(0);
}
points_to_move.remove_all_with_value(0);
// partition curve
PartitionPoint* new_pt = new PartitionPoint( pt->coordinates(), curve );
PartitionCurve* new_curve =
PartitionEngine::instance().insert_point( curve, new_pt );
// partition failed
if( !new_curve )
{
delete new_pt;
return CUBIT_FAILURE;
}
// update internal lists
add(new_pt);
add(new_curve);
newEntities.append(new_pt);
pt->set( new_pt->coordinates() );
set_point_owner( pt, new_pt );
// update point associativity
while( points_to_move.size() )
set_point_owner( points_to_move.pop(), new_curve );
return CUBIT_SUCCESS;
}
| CubitStatus PartitionLumpImprint::partitionSurface | ( | int | first_point_id, |
| int | last_point_id, | ||
| PartitionSurface * | surf = 0 |
||
| ) | [private] |
Definition at line 761 of file PartitionLumpImprint.cpp.
{
PartitionEntity* start_owner = point_owner(point(first_point_id));
PartitionEntity* end_owner = point_owner(point(last_point_id));
PartitionPoint* start_point = dynamic_cast<PartitionPoint*>(start_owner);
PartitionPoint* end_point = dynamic_cast<PartitionPoint*>(end_owner);
if ( (start_owner != lump && !start_point) ||
(end_owner != lump && !end_point) ) {
PRINT_ERROR("Facet boundary too coarse to resolve imprint.\n");
return CUBIT_FAILURE;
}
int i, next_point_id = (first_point_id + 1) % num_points();
if( !surface )
{
assert(next_point_id != last_point_id);
surface = dynamic_cast<PartitionSurface*>(point_owner(point(next_point_id)));
assert(!!surface);
}
if ( PART_LUMP_DEBUG ) {
RefEntity* re = dynamic_cast<RefEntity*>(surface->topology_entity());
PART_LUMP_PRINT("Inserting curve into surface %p (%d)\n",
(void*)surface, re ? re->id() : 0 );
}
DLIList<CubitPoint*> segments;
first_point_id %= num_points();
int last_id = last_point_id % num_points();
int start, stop;
if ( start_point )
start = first_point_id;
else
start = next_point_id;
if ( end_point )
stop = (last_id + 1) % num_points();
else
stop = last_id;
if( start == last_id )
{
i = start;
do {
segments.append(point(i));
i = (i+1) % num_points();
} while( i != start );
segments.append(point(start));
}
else
{
for ( i = start; i != stop; i = (i + 1) % num_points() )
segments.append(point(i));
}
assert(surface&&start_owner&&end_owner && start_owner!=surface && end_owner!=surface );
DLIList<CubitVector*> segment_points;
segments.reset();
for ( i = segments.size(); i--; )
segment_points.append( new CubitVector( segments.get_and_step()->coordinates() ) );
DLIList<PartitionSurface*> input_list(1), new_surfs;
DLIList<PartitionCurve*> new_curves;
input_list.append(surface);
CubitStatus result = PartitionEngine::instance().
insert_curve( input_list, segment_points, new_surfs, new_curves );
while( segment_points.size() )
delete segment_points.pop();
if ( !result )
{
PRINT_ERROR("Surface partitioning failed in PartitionLumpImprint\n");
return CUBIT_FAILURE;
}
// Add all new geometry to 'entities'. Append everything except
// the surfaces to curves_and_points.
DLIList<PartitionEntity*> entities;
DLIList<PartitionPoint*> new_points;
// Do Surfaces
if( new_surfs.move_to( surface ) )
new_surfs.extract();
new_surfs.reset();
for ( i = new_surfs.size(); i--; )
entities.append(new_surfs.get_and_step());
// Get new points
for ( i = new_curves.size(); i--; )
{
new_curves.get()->start_point()->mark = 1;
new_curves.get()->end_point()->mark = 1;
new_curves.step();
}
if ( start_point )
start_point->mark = 0;
if ( end_point )
end_point->mark = 0;
for ( i = new_curves.size(); i--; )
{
if ( new_curves.get()->start_point()->mark )
{
PartitionPoint* pt = new_curves.get()->start_point();
pt->mark = 0;
new_points.append( pt );
entities.append( pt );
}
if ( new_curves.get()->end_point()->mark )
{
PartitionPoint* pt = new_curves.get()->end_point();
pt->mark = 0;
new_points.append( pt );
entities.append( pt );
}
entities.append( new_curves.get() );
new_curves.step();
}
// If first and/or last segment points were already
// associated with a vertex, don't search for a new
// entity to associate them with.
if( start_point ) {
segments.reset();
segments.remove();
}
if( end_point ) {
segments.pop();
}
// Associate split segments with points
for ( i = new_points.size(); i--; )
{
if (segments.size() == 0)
break;
PartitionPoint* vert = new_points.get_and_step();
CubitPoint* pt = 0;
segments.reset();
int closest_index = -1;
double closest_sqr = CUBIT_DBL_MAX;
for ( int j = 0; j < segments.size(); j++ )
{
pt = segments.get_and_step();
double dist_sqr = (pt->coordinates() - vert->coordinates()).length_squared();
if ( dist_sqr < closest_sqr ) {
closest_sqr = dist_sqr;
closest_index = j;
}
}
assert(closest_index >= 0);
segments.reset();
segments.step(closest_index);
pt = segments.extract();
assert(point_owner(pt) == surface);
pt->set( vert->coordinates() );
set_point_owner( pt, vert );
}
// Associate remaining segment points with curves
PartitionEntity* entity;
while( segments.size() )
{
CubitPoint* pt = segments.pop();
PartitionCurve* closest = 0;
double closest_sqr = CUBIT_DBL_MAX;
CubitVector pos;
for ( i = new_curves.size(); i--; )
{
PartitionCurve* curve = new_curves.get_and_step();
curve->closest_point_trimmed( pt->coordinates(), pos );
double dist_sqr = (pos - pt->coordinates()).length_squared();
if ( dist_sqr < closest_sqr )
{
closest_sqr = dist_sqr;
closest = curve;
}
}
assert(closest != NULL);
closest->closest_point( pt->coordinates(), pos );
pt->set(pos);
set_point_owner(pt, closest);
}
// append everything to newEntites and call add for each
newEntities += entities;
entities.reset();
for ( i = entities.size(); i--; )
add( entities.get_and_step() );
// now add the orignal surface to entities -- entities
// becomes the list of entities that other polyline points
// on the surface must lie on after the split
entities.append(surface);
// Associate any other points on the surface that
// haven't been used yet with the appropriate
// sub-region of the surface partitions.
DLIList<CubitPoint*> surf_points;
get_owned_points( surface, surf_points );
for ( i = surf_points.size(); i--; )
{
CubitPoint* pt = surf_points.get_and_step();
entity = find_closest( pt->coordinates(), entities, false );
assert(!!entity);
set_point_owner(pt, entity);
}
return CUBIT_SUCCESS;
}
| CubitPoint* PartitionLumpImprint::point | ( | int | point_id | ) | const [inline, private] |
Definition at line 63 of file PartitionLumpImprint.hpp.
{ return loopPoints.next(point_id); }
| PartitionEntity * PartitionLumpImprint::point_owner | ( | CubitPoint * | point | ) | [private] |
Definition at line 299 of file PartitionLumpImprint.cpp.
{
return pointAssoc[pt];
}
| CubitStatus PartitionLumpImprint::seam_curve | ( | DLIList< CubitFacetEdgeData * > & | edges, |
| PartitionCurve * | curve, | ||
| DLIList< CubitFacetData * > & | facets | ||
| ) | [private] |
Definition at line 1451 of file PartitionLumpImprint.cpp.
{
// Get start and end facet points for chain of edges
CubitPoint *start_point_t, *end_point_t;
if (edges.size() == 1)
{
start_point_t = edges.get()->point(0);
end_point_t = edges.get()->point(1);
}
else
{
edges.last();
end_point_t = edges.get()->shared_point( edges.prev() );
end_point_t = edges.get()->other_point( end_point_t );
edges.reset();
start_point_t = edges.get()->shared_point( edges.next() );
start_point_t = edges.get()->other_point( start_point_t );
}
CubitPointData* start_point = dynamic_cast<CubitPointData*>(start_point_t);
CubitPointData* end_point = dynamic_cast<CubitPointData*>( end_point_t);
assert(start_point && end_point);
// If list if edges is backwards on curve, reverse it
if (curve->start_point() == curve->end_point())
{
assert( start_point == end_point );
edges.reset();
CubitVector s = start_point->coordinates();
CubitVector e = edges.get()->other_point(start_point)->coordinates();
CubitVector j, t;
curve->closest_point ( 0.5 * (s + e), j, &t );
if ( (e - s) % t < 0.0 )
edges.reverse();
}
else
{
if (curve->start_point()->facet_point() == end_point ||
curve->end_point()->facet_point() == start_point)
{
std::swap(start_point, end_point);
edges.reverse();
}
else if (curve->start_point()->facet_point() != start_point &&
curve->end_point()->facet_point() != end_point)
{
double fwd = (curve->start_point()->coordinates() - start_point->coordinates()).length()
+ (curve->end_point()->coordinates() - end_point->coordinates()).length();
double rev = (curve->end_point()->coordinates() - start_point->coordinates()).length()
+ (curve->start_point()->coordinates() - end_point->coordinates()).length();
if (fwd > rev)
{
std::swap(start_point, end_point);
edges.reverse();
}
}
}
// Merge facet points at start and end vertices
if (curve->start_point()->facet_point() != start_point)
{
if (curve->start_point()->facet_point())
curve->start_point()->facet_point()->merge_points(start_point);
else
curve->start_point()->facet_point(start_point);
}
if (curve->start_point() != curve->end_point() &&
curve->end_point()->facet_point() != end_point)
{
if (curve->end_point()->facet_point())
curve->end_point()->facet_point()->merge_points(end_point);
else
curve->end_point()->facet_point(end_point);
}
// Now seam interior points/edges
return PartSurfFacetTool::seam_curve( edges, curve, facets );
}
| void PartitionLumpImprint::set_point_owner | ( | CubitPoint * | point, |
| PartitionEntity * | owner | ||
| ) | [private] |
Definition at line 313 of file PartitionLumpImprint.cpp.
{
CubitVector closest;
PartitionPoint* ppt = 0;
PartitionCurve* pcv = 0;
PartitionSurface* psf = 0;
if( 0 != (ppt = dynamic_cast<PartitionPoint*>(owner)) ) {
pt->set( ppt->coordinates() );
} else if( 0 != (pcv = dynamic_cast<PartitionCurve*>(owner)) ) {
pcv->closest_point( pt->coordinates(), closest );
pt->set( closest );
} else if( 0 != (psf = dynamic_cast<PartitionSurface*>(owner)) ) {
psf->closest_point( pt->coordinates(), &closest );
pt->set( closest );
}
if( DEBUG_FLAG(PART_LUMP_DEBUG) )
{
const char* type = 0;
int color = 0;
if( ppt ) {
type = "Point"; color = CUBIT_BLUE_INDEX;
} else if( pcv ) {
type = "Curve"; color = CUBIT_CYAN_INDEX;
} else if( psf ) {
type = "Surface"; color = CUBIT_YELLOW_INDEX;
} else {
type = "Lump"; color = CUBIT_RED_INDEX;
}
int index = -1;
if ( loopPoints.move_to(pt) )
index = loopPoints.get_index();
loopPoints.reset();
TopologyBridge* tb = dynamic_cast<TopologyBridge*>(owner);
RefEntity* re = dynamic_cast<RefEntity*>(tb->topology_entity());
PART_LUMP_PRINT("%d. (%f,%f,%f) -> %s %p (%d)\n", index,
pt->coordinates().x(), pt->coordinates().y(), pt->coordinates().z(),
type, (void*)owner, re?re->id():0 );
GfxDebug::draw_point( pt->coordinates(), color );
GfxDebug::flush();
}
pointAssoc[pt] = owner;
}
DLIList<CubitFacetEdge*> PartitionLumpImprint::boundaryEdges [private] |
Definition at line 99 of file PartitionLumpImprint.hpp.
DLIList<PartitionEntity*> PartitionLumpImprint::entityList [private] |
Definition at line 106 of file PartitionLumpImprint.hpp.
DLIList<CubitFacetData*> PartitionLumpImprint::facetList [private] |
Definition at line 98 of file PartitionLumpImprint.hpp.
DLIList<CubitPoint*> PartitionLumpImprint::loopPoints [private] |
Definition at line 100 of file PartitionLumpImprint.hpp.
PartitionLump* PartitionLumpImprint::lump [private] |
Definition at line 103 of file PartitionLumpImprint.hpp.
DLIList<PartitionEntity*> PartitionLumpImprint::newEntities [private] |
Definition at line 108 of file PartitionLumpImprint.hpp.
PartitionSurface* PartitionLumpImprint::newSurface [private] |
Definition at line 104 of file PartitionLumpImprint.hpp.
std::map<CubitPoint*,PartitionEntity*> PartitionLumpImprint::pointAssoc [private] |
Definition at line 101 of file PartitionLumpImprint.hpp.
RTree<PartitionEntity*> PartitionLumpImprint::rTree [private] |
Definition at line 105 of file PartitionLumpImprint.hpp.