cgma
|
#include <FacetboolInterface.hpp>
Public Member Functions | |
FacetboolInterface () | |
~FacetboolInterface () | |
CubitStatus | webcut_FB (BodySM *bodysm_ptr, std::vector< double > &cutter_verts, std::vector< int > &cutter_connections, bool cutter_is_plane, CubitBoolean delete_bodies, CubitBoolean &intersects, DLIList< BodySM * > &results_list) |
CubitStatus | dofacetboolean (DLIList< BodySM * > &body_list, BodySM *&newBody, bool keep_old, const CubitFacetboolOp op) |
CubitStatus | dofacetboolean_subtract (BodySM *&tool_body, DLIList< BodySM * > &from_bodies, DLIList< BodySM * > &new_bodies, bool keep_old, bool *to_be_deleted, const CubitFacetboolOp op) |
CubitStatus | dofacetboolean_2bodies (BodySM *&body_in1, BodySM *&body_in2, BodySM *&body_out, bool keep_old, bool &intersection_found, const CubitFacetboolOp op) |
CubitStatus | FB_imprint_with_curves (BodySM *&body_in, BodySM *&body_out, bool keep_old) |
CubitStatus | dofacetboolean_2bodies_imprint (BodySM *&body_in1, BodySM *&body_in2, BodySM *&body_out1, BodySM *&body_out2, bool keep_old) |
CubitStatus | make_FB_edge_list (DLIList< Curve * > &ref_edge_list) |
void | get_edge_list_bbox (CubitBox &edge_list_bbox) |
Private Member Functions | |
CubitStatus | facetbody_to_facetbool (DLIList< FacetSurface * > &facet_surf_list, std::vector< double > &body_verts, std::vector< int > &body_connections, std::vector< int > *f_c_indices, std::vector< FacetSurface * > &fsurfarray, std::vector< FacetCurve * > &fcurvearray) |
int | findcurve (FacetCurve *curve, std::vector< FacetCurve * > &fcurvearray) |
void | make_persistents_webcut (BodySM *body_in, BodySM *body_out1, BodySM *body_out2, std::vector< FacetSurface * > &fsurfarray, std::vector< FacetCurve * > &fcurvearray, bool *surfs_in_intersection, bool *surfs_in_subtraction, bool *curves_in_intersection, bool *curves_in_subtraction) |
void | make_persistents_imprint (BodySM *body_in, BodySM *body_out1, std::vector< FacetSurface * > &fsurfarray, std::vector< FacetCurve * > &fcurvearray) |
void | make_persistents_boolean (BodySM *body_in, BodySM *body_out1, std::vector< FacetSurface * > &fsurfarray, std::vector< FacetCurve * > &fcurvearray, bool *surfs_in_intersection, bool *surfs_in_subtraction, bool *curves_in_intersection, bool *curves_in_subtraction, const CubitFacetboolOp op, bool body_1) |
void | make_persistent_curves (DLIList< FacetCurve * > fcurvelist, std::vector< FacetCurve * > &fcurvearray, int n, int which_parent=0) |
void | make_persistent_surfaces (DLIList< FacetSurface * > fsurfaceslist, std::vector< FacetSurface * > &fsurfarray, int n, int which_parent=0) |
int | find_coord (double xx, double yy, double zz) |
FSBoundingBox * | make_edge_bounding_box (int v0, int v1) |
CubitStatus | separate_lumps (BodySM *body_ptr, bool is_sheet_body) |
CubitStatus | separate_shells_into_bodies (BodySM *body_ptr, bool is_sheet_body, DLIList< BodySM * > &new_bodies) |
Private Attributes | |
std::vector< FB_Edge * > | FB_imprint_edges |
std::vector< FB_Coord * > | FB_imprint_edge_coords |
std::vector< FSBoundingBox * > | FB_imprint_edge_bboxes |
Definition at line 16 of file FacetboolInterface.hpp.
Definition at line 28 of file FacetboolInterface.cpp.
{ }
Definition at line 33 of file FacetboolInterface.cpp.
{ }
CubitStatus FacetboolInterface::dofacetboolean | ( | DLIList< BodySM * > & | body_list, |
BodySM *& | newBody, | ||
bool | keep_old, | ||
const CubitFacetboolOp | op | ||
) |
Definition at line 651 of file FacetboolInterface.cpp.
{ int k; BodySM *body_sm1, *body_sm2, *body_out; CubitStatus status = CUBIT_FAILURE; bool intersection_found = false; body_sm1 = body_list.get_and_step(); for ( k = body_list.size() - 1; k > 0; k-- ) { body_out =0; if(!body_sm1) body_sm1=body_list.get_and_step(); else{ body_sm2 = body_list.get_and_step(); status = dofacetboolean_2bodies(body_sm1,body_sm2,body_out,keep_old, intersection_found,op); if ( keep_old == false){ //if there was an intersection, we want to delete the two //original bodies if we are not keeping old. //Also, if we we were performing an INTERSECTION we //want to delete the two original bodies even if there was //no intersection between the two bodies (again if we //are not keeping originals). if(intersection_found == true || op == CUBIT_FB_INTERSECTION) { FacetQueryEngine::instance()-> delete_solid_model_entities(body_sm2); FacetQueryEngine::instance()-> delete_solid_model_entities(body_sm1); body_sm2=NULL; body_sm1=NULL; } //if we are not keeping old, we want to delete the second //body even if there was no intersection between the two //bodies (for a subtration). else if(op == CUBIT_FB_SUBTRACTION) { FacetQueryEngine::instance()-> delete_solid_model_entities(body_sm2); body_sm2=NULL; } } if ( body_out ) body_sm1 = body_out; } } newBody = body_sm1; return status; }
CubitStatus FacetboolInterface::dofacetboolean_2bodies | ( | BodySM *& | body_in1, |
BodySM *& | body_in2, | ||
BodySM *& | body_out, | ||
bool | keep_old, | ||
bool & | intersection_found, | ||
const CubitFacetboolOp | op | ||
) |
Definition at line 738 of file FacetboolInterface.cpp.
{ CubitStatus status; std::vector<double> body_verts; std::vector<double> body2_verts; std::vector<int> body_connections, newbodyfacets; std::vector<int> body2_connections, newbody2facets; std::vector<double> vertsout; std::vector<int> coordsout; std::vector<int> f_c_indices1; std::vector<int> f_c_indices2; std::vector<FacetSurface *> fsurfarray1, fsurfarray2; std::vector<FacetCurve *> fcurvearray1, fcurvearray2; std::vector<int> surfindex; std::vector<int> curveindex; DLIList <CubitFacet *>facet_list; DLIList <CubitPoint *>point_list; CubitPoint *new_point; CubitFacet *facet_ptr; std::vector<CubitPoint *> points; bool *surfs_in_intersection, *surfs_in_subtraction; bool *curves_in_intersection, *curves_in_subtraction; bool *surfs_in_intersection2, *surfs_in_subtraction2; bool *curves_in_intersection2, *curves_in_subtraction2; status = CUBIT_SUCCESS; intersection_found = true; bool is_sheet_body = false; Body *tmp_body_1 = CAST_TO(body_in1->topology_entity(), Body); Body *tmp_body_2 = CAST_TO(body_in2->topology_entity(), Body); //try to figure out if we are using sheet bodies //if it is ambiguous, print a warning. if(tmp_body_1 && tmp_body_1->is_sheet_body()){ is_sheet_body = true; } else if(tmp_body_2 && tmp_body_2->is_sheet_body()){ is_sheet_body = true; } if(tmp_body_1 && tmp_body_2 && tmp_body_1->is_sheet_body() != tmp_body_2->is_sheet_body()) { PRINT_WARNING("Geometric boolean requested for a sheet body and a non-sheet body.\n"); } FacetBody *fbody_ptr; fbody_ptr = dynamic_cast<FacetBody *>(body_in1); DLIList<FacetSurface*> facet_surf_list; fbody_ptr->get_surfaces(facet_surf_list); status = facetbody_to_facetbool(facet_surf_list,body_verts, body_connections,&f_c_indices1, fsurfarray1,fcurvearray1); facet_surf_list.clean_out(); fbody_ptr = dynamic_cast<FacetBody *>(body_in2); fbody_ptr->get_surfaces(facet_surf_list); status = facetbody_to_facetbool(facet_surf_list,body2_verts, body2_connections,&f_c_indices2, fsurfarray2,fcurvearray2); facet_surf_list.clean_out(); FBIntersect intersector; intersector.set_classify_flag(true); status = intersector.intersect(body_verts,body_connections, body2_verts,body2_connections, newbodyfacets,newbody2facets, &f_c_indices1, &f_c_indices2); std::vector<bool> is_body_1; status = intersector.gather_by_boolean(vertsout,coordsout, &surfindex,&curveindex,&is_body_1,op); // If there were no intersections if ( (vertsout.size() == 0) || (coordsout.size() == 0)) { intersection_found = false; return CUBIT_SUCCESS; } // If there was no body_out, we are just checking if there was any // intersection. If we got this far, there was -- so return. if ( &body_out == 0 ) return CUBIT_SUCCESS; surfs_in_intersection = new bool[1+fsurfarray1.size()]; surfs_in_subtraction = new bool[1+fsurfarray1.size()]; curves_in_intersection = new bool[1+fcurvearray1.size()]; curves_in_subtraction = new bool[1+fcurvearray1.size()]; surfs_in_intersection2 = new bool[1+fsurfarray2.size()]; surfs_in_subtraction2 = new bool[1+fsurfarray2.size()]; curves_in_intersection2 = new bool[1+fcurvearray2.size()]; curves_in_subtraction2 = new bool[1+fcurvearray2.size()]; unsigned int k; for ( k = 1; k < 1 + fsurfarray1.size(); k++ ) { surfs_in_subtraction[k] = surfs_in_intersection[k] = false; } for ( k = 1; k < 1 + fcurvearray1.size(); k++ ) { curves_in_subtraction[k] = curves_in_intersection[k] = false; } for ( k = 1; k < 1 + fsurfarray2.size(); k++ ) { surfs_in_subtraction2[k] = surfs_in_intersection2[k] = false; } for ( k = 1; k < 1 + fcurvearray2.size(); k++ ) { curves_in_subtraction2[k] = curves_in_intersection2[k] = false; } status = intersector.get_persistent_entity_info(surfs_in_intersection, curves_in_intersection,surfs_in_subtraction, curves_in_subtraction,op,1); // If op == unite, the curves ans surfs that are undamaged are those // for which xxx_in_intereseciton = 0 false and xxx_in_subtraction == true status = intersector.get_persistent_entity_info(surfs_in_intersection2, curves_in_intersection2,surfs_in_subtraction2, curves_in_subtraction2,op,2); for ( k = 0; k < vertsout.size(); k += 3 ) { new_point = (CubitPoint *) new CubitPointData( vertsout[k], vertsout[k+1], vertsout[k+2] ); points.push_back(new_point); } for ( k = 0; k < coordsout.size(); k += 3 ) { facet_ptr = new CubitFacetData( points[coordsout[k]], points[coordsout[k+1]], points[coordsout[k+2]] ); int cptr[3]; cptr[0] = curveindex[k]; cptr[1] = curveindex[k+1]; cptr[2] = curveindex[k+2]; TDFacetboolData::add_facetbool_facet( facet_ptr ); TDFacetboolData* td = TDFacetboolData::get(facet_ptr); td->set(surfindex[k/3],cptr[0],cptr[1],cptr[2],is_body_1[k/3], facet_ptr->is_backwards()); facet_list.append( facet_ptr ); } points.clear(); // clear out the points vector since we are through with it. FacetModifyEngine *fme = FacetModifyEngine::instance(); int interp_order; CubitBoolean smooth_non_manifold, split_surfaces; BodySM *body_ptr; interp_order = 0; smooth_non_manifold = CUBIT_TRUE; split_surfaces = CUBIT_FALSE; { ChollaEngine *cholla_ptr = NULL; status = fme->build_cholla_surfaces( facet_list, point_list, -1.0, interp_order, smooth_non_manifold, split_surfaces, cholla_ptr ); if( status == CUBIT_FAILURE ) return status; status = fme->finish_facet_Body( cholla_ptr, NULL, -1.0, interp_order, body_ptr); if( status == CUBIT_FAILURE ) return status; if ( cholla_ptr ) { cholla_ptr->delete_me(); delete cholla_ptr; } } if ( keep_old == false ) { make_persistents_boolean(body_in2,body_ptr,fsurfarray2,fcurvearray2, surfs_in_intersection2,surfs_in_subtraction2, curves_in_intersection2,curves_in_subtraction2,op,false); make_persistents_boolean(body_in1,body_ptr,fsurfarray1,fcurvearray1, surfs_in_intersection,surfs_in_subtraction, curves_in_intersection,curves_in_subtraction,op,true); } body_out = body_ptr; //separate the lumps in the "body_out", these will be converted to //separate volumes later in the code. status=separate_lumps(body_out,is_sheet_body); vertsout.clear(); coordsout.clear(); delete [] surfs_in_intersection; delete [] surfs_in_subtraction; delete [] curves_in_intersection; delete [] curves_in_subtraction; delete [] surfs_in_intersection2; delete [] surfs_in_subtraction2; delete [] curves_in_intersection2; delete [] curves_in_subtraction2; return status; }
CubitStatus FacetboolInterface::dofacetboolean_2bodies_imprint | ( | BodySM *& | body_in1, |
BodySM *& | body_in2, | ||
BodySM *& | body_out1, | ||
BodySM *& | body_out2, | ||
bool | keep_old | ||
) |
Definition at line 1426 of file FacetboolInterface.cpp.
{ CubitStatus status; std::vector<double> body_verts; std::vector<double> body2_verts; std::vector<int> body_connections, newbodyfacets; std::vector<int> body2_connections, newbody2facets; std::vector<double> vertsout1, vertsout2; std::vector<int> coordsout1, coordsout2; std::vector<int> f_c_indices1; std::vector<int> f_c_indices2; std::vector<FacetSurface *> fsurfarray1, fsurfarray2; std::vector<FacetCurve *> fcurvearray1, fcurvearray2; std::vector<int> surfindex1, surfindex2; std::vector<int> curveindex1, curveindex2; DLIList <CubitFacet *>facet_list; DLIList <CubitPoint *>point_list; CubitPoint *new_point; CubitFacet *facet_ptr; std::vector<CubitPoint *> points; FacetModifyEngine *fme = FacetModifyEngine::instance(); bool is_sheet_body = false; Body *tmp_body_1 = CAST_TO(body_in1->topology_entity(), Body); Body *tmp_body_2 = CAST_TO(body_in2->topology_entity(), Body); if(tmp_body_1 && tmp_body_1->is_sheet_body()){ is_sheet_body = true; } else if(tmp_body_2 && tmp_body_2->is_sheet_body()){ is_sheet_body = true; } if(tmp_body_1->is_sheet_body() != tmp_body_2->is_sheet_body()) { PRINT_WARNING("Geometric boolean requested for a sheet body and a non-sheet body.\n"); } FacetBody *fbody_ptr; fbody_ptr = dynamic_cast<FacetBody *>(body_in1); DLIList<FacetSurface*> facet_surf_list; fbody_ptr->get_surfaces(facet_surf_list); status = facetbody_to_facetbool(facet_surf_list,body_verts, body_connections,&f_c_indices1, fsurfarray1,fcurvearray1); facet_surf_list.clean_out(); fbody_ptr = dynamic_cast<FacetBody *>(body_in2); fbody_ptr->get_surfaces(facet_surf_list); status = facetbody_to_facetbool(facet_surf_list,body2_verts, body2_connections,&f_c_indices2, fsurfarray2,fcurvearray2); facet_surf_list.clean_out(); FBIntersect intersector; intersector.set_imprint(); status = intersector.intersect(body_verts,body_connections, body2_verts,body2_connections, newbodyfacets,newbody2facets, &f_c_indices1, &f_c_indices2); status = intersector.update_surfs_and_curves(vertsout1,coordsout1, &surfindex1,&curveindex1,1); status = intersector.update_surfs_and_curves(vertsout2,coordsout2, &surfindex2,&curveindex2,2); unsigned int k; for ( k = 0; k < vertsout1.size(); k += 3 ) { new_point = (CubitPoint *) new CubitPointData( vertsout1[k], vertsout1[k+1], vertsout1[k+2] ); points.push_back(new_point); } for ( k = 0; k < coordsout1.size(); k += 3 ) { facet_ptr = new CubitFacetData( points[coordsout1[k]], points[coordsout1[k+1]], points[coordsout1[k+2]] ); int cptr[3]; cptr[0] = curveindex1[k]; cptr[1] = curveindex1[k+1]; cptr[2] = curveindex1[k+2]; TDFacetboolData::add_facetbool_facet( facet_ptr ); TDFacetboolData* td = TDFacetboolData::get(facet_ptr); td->set(surfindex1[k/3],cptr[0],cptr[1],cptr[2],false, facet_ptr->is_backwards()); facet_list.append( facet_ptr ); } points.clear(); // clear out the points vector since we are through with it. double feature_angle; int interp_order; CubitBoolean smooth_non_manifold, split_surfaces; feature_angle = 135.0; interp_order = 0; smooth_non_manifold = CUBIT_TRUE; split_surfaces = CUBIT_FALSE; { ChollaEngine *cholla_ptr = NULL; status = fme->build_cholla_surfaces( facet_list, point_list, feature_angle, interp_order, smooth_non_manifold, split_surfaces, cholla_ptr ); if( status == CUBIT_FAILURE ) return status; status = fme->finish_facet_Body( cholla_ptr, NULL, feature_angle, interp_order, body_out1); if( status == CUBIT_FAILURE ) return status; if ( cholla_ptr ) { cholla_ptr->delete_me(); delete cholla_ptr; } } vertsout1.clear(); coordsout1.clear(); facet_list.clean_out(); for ( k = 0; k < vertsout2.size(); k += 3 ) { new_point = (CubitPoint *) new CubitPointData( vertsout2[k], vertsout2[k+1], vertsout2[k+2] ); points.push_back(new_point); } for ( k = 0; k < coordsout2.size(); k += 3 ) { facet_ptr = new CubitFacetData( points[coordsout2[k]], points[coordsout2[k+1]], points[coordsout2[k+2]] ); int cptr[3]; cptr[0] = curveindex2[k]; cptr[1] = curveindex2[k+1]; cptr[2] = curveindex2[k+2]; TDFacetboolData::add_facetbool_facet( facet_ptr ); TDFacetboolData* td = TDFacetboolData::get(facet_ptr); td->set(surfindex2[k/3],cptr[0],cptr[1],cptr[2],false, facet_ptr->is_backwards()); facet_list.append( facet_ptr ); } points.clear(); // clear out the points vector since we are through with it. { ChollaEngine *cholla_ptr = NULL; status = fme->build_cholla_surfaces( facet_list, point_list, feature_angle, interp_order, smooth_non_manifold, split_surfaces, cholla_ptr ); if( status == CUBIT_FAILURE ) return status; status = fme->finish_facet_Body( cholla_ptr, NULL, feature_angle, interp_order, body_out2); if( status == CUBIT_FAILURE ) return status; if ( cholla_ptr ) { cholla_ptr->delete_me(); delete cholla_ptr; } } if ( keep_old == false ) { make_persistents_imprint(body_in1,body_out1,fsurfarray1,fcurvearray1); make_persistents_imprint(body_in2,body_out2,fsurfarray2,fcurvearray2); } //separate the lumps in the "body_out1" and "body_out2", these will //be converted to separate volumes later in the code. status=separate_lumps(body_out1, is_sheet_body); status=separate_lumps(body_out2, is_sheet_body); vertsout2.clear(); coordsout2.clear(); return status; }
CubitStatus FacetboolInterface::dofacetboolean_subtract | ( | BodySM *& | tool_body, |
DLIList< BodySM * > & | from_bodies, | ||
DLIList< BodySM * > & | new_bodies, | ||
bool | keep_old, | ||
bool * | to_be_deleted, | ||
const CubitFacetboolOp | op | ||
) |
Definition at line 711 of file FacetboolInterface.cpp.
{ int k; BodySM *body_sm2, *body_out; CubitStatus status = CUBIT_FAILURE; bool intersection_found = false; for ( k = 0; k < from_bodies.size(); k++ ) { body_out = 0; body_sm2 = from_bodies.get_and_step(); status = dofacetboolean_2bodies(body_sm2,tool_body,body_out,keep_old, intersection_found,op); if ( (keep_old == false) && (intersection_found == true) ) { to_be_deleted[k] = true; } if ( (status == CUBIT_SUCCESS) && (body_out) ) new_bodies.append(body_out); } return status; }
CubitStatus FacetboolInterface::facetbody_to_facetbool | ( | DLIList< FacetSurface * > & | facet_surf_list, |
std::vector< double > & | body_verts, | ||
std::vector< int > & | body_connections, | ||
std::vector< int > * | f_c_indices, | ||
std::vector< FacetSurface * > & | fsurfarray, | ||
std::vector< FacetCurve * > & | fcurvearray | ||
) | [private] |
Definition at line 527 of file FacetboolInterface.cpp.
{ CubitStatus status; int mydebug = 0; if(mydebug){ GfxDebug::clear(); } int i, j, k, m, n, vtx[3], hashvalue, *hasharrayptr, hasharraysize, ifoundit; IntegerHash *hashobj; double xx, yy, zz, xval, yval, zval; FacetSurface *facet_surface; DLIList<CubitFacet*> facetlist; DLIList<CubitFacetEdge*> c_edgelist, f_edgelist; DLIList<FacetCurve *> curve_list; CubitPoint *point; CubitFacet *facet; FacetCurve *curve; CubitFacetEdge *c_edge, *edge; int numhashbins, c_index; numhashbins = 101; status = CUBIT_SUCCESS; hashobj = new IntegerHash(numhashbins,20); for ( i = 0; i < facet_surf_list.size(); i++ ) { facet_surface = facet_surf_list.get_and_step(); fsurfarray.push_back(facet_surface); facet_surface->get_my_facetedges(f_edgelist); for ( m = f_edgelist.size(); m > 0; m-- ) { edge = f_edgelist.get_and_step(); edge->set_flag(0); // Initialize edge flags. if(mydebug) edge->debug_draw(CUBIT_PINK_INDEX); } // Assume that each facet surf occurs only once, so there won't be // duplicates on fsarray. facetlist.clean_out(); facet_surface->tris(facetlist); curve_list.clean_out(); facet_surface->get_curves(curve_list); for ( m = 0; m < curve_list.size(); m++ ) { curve = curve_list.get_and_step(); c_index = findcurve(curve,fcurvearray); c_edgelist.clean_out(); curve->get_facets(c_edgelist); for ( n = c_edgelist.size(); n > 0; n-- ) { c_edge = c_edgelist.get_and_step(); c_edge->set_flag(c_index+1); if(mydebug) c_edge->debug_draw(CUBIT_RED_INDEX); } } int efindex[3]; for ( j = facetlist.size(); j > 0; j-- ) { facet = facetlist.get_and_step(); for ( k = 0; k < 3; k++ ) { point = facet->point(k); edge = facet->edge(k); if(mydebug){ if(edge->get_flag()){ edge->debug_draw(CUBIT_WHITE_INDEX); } } efindex[k] = edge->get_flag(); xx = point->x(); yy = point->y(); zz = point->z(); // Get a vertex number. hashvalue = FBDataUtil::makeahashvaluefrom_coord(xx,yy,zz,numhashbins); hasharrayptr = hashobj->getHashBin(hashvalue,&hasharraysize); ifoundit = -1; for ( m = 0; m < hasharraysize; m++ ) { n = hasharrayptr[m]; xval = body_verts[3*n]; yval = body_verts[3*n+1]; zval = body_verts[3*n+2]; if ( ( fabs(xval-xx) < 1.e-6 ) && ( fabs(yval-yy) < 1.e-6 ) && ( fabs(zval-zz) < 1.e-6 ) ) { ifoundit = n; break; } } if ( ifoundit == -1 ) { ifoundit = body_verts.size()/3; body_verts.push_back(xx); body_verts.push_back(yy); body_verts.push_back(zz); hashobj->addtoHashList(hashvalue,ifoundit); } vtx[k] = ifoundit; } body_connections.push_back(vtx[0]); body_connections.push_back(vtx[1]); body_connections.push_back(vtx[2]); f_c_indices->push_back(i+1); // put the surface index for the facet f_c_indices->push_back(efindex[2]); // edge indices for the facet f_c_indices->push_back(efindex[0]); f_c_indices->push_back(efindex[1]); } } if(mydebug) GfxDebug::mouse_xforms(); delete hashobj; return status; }
CubitStatus FacetboolInterface::FB_imprint_with_curves | ( | BodySM *& | body_in, |
BodySM *& | body_out, | ||
bool | keep_old | ||
) |
Definition at line 1317 of file FacetboolInterface.cpp.
{ CubitStatus status; FacetModifyEngine *fme = FacetModifyEngine::instance(); FacetBody *fbody_ptr; fbody_ptr = dynamic_cast<FacetBody *>(body_in); DLIList<FacetSurface*> facet_surf_list; fbody_ptr->get_surfaces(facet_surf_list); std::vector<double> body_verts; std::vector<int> body_connections, newbodyfacets; std::vector<int> f_c_indices; std::vector<FacetSurface *> fsurfarray; std::vector<FacetCurve *> fcurvearray; std::vector<double> vertsout; std::vector<int> coordsout; std::vector<int> surfindex; std::vector<int> curveindex; status = facetbody_to_facetbool(facet_surf_list,body_verts, body_connections,&f_c_indices, fsurfarray,fcurvearray); facet_surf_list.clean_out(); FBImprint imprinter; status = imprinter.imprint_body_curve(body_verts,body_connections, FB_imprint_edge_coords,FB_imprint_edges, FB_imprint_edge_bboxes,&f_c_indices); status = imprinter.update_surfs_and_curves(vertsout,coordsout, &surfindex,&curveindex); DLIList <CubitFacet *>facet_list; DLIList <CubitPoint *>point_list; CubitPoint *new_point; CubitFacet *facet_ptr; std::vector<CubitPoint *> points; unsigned int k; for ( k = 0; k < vertsout.size(); k += 3 ) { new_point = (CubitPoint *) new CubitPointData( vertsout[k], vertsout[k+1], vertsout[k+2] ); points.push_back(new_point); } for ( k = 0; k < coordsout.size(); k += 3 ) { facet_ptr = new CubitFacetData( points[coordsout[k]], points[coordsout[k+1]], points[coordsout[k+2]] ); int cptr[3]; cptr[0] = curveindex[k]; cptr[1] = curveindex[k+1]; cptr[2] = curveindex[k+2]; TDFacetboolData::add_facetbool_facet( facet_ptr ); TDFacetboolData* td = TDFacetboolData::get(facet_ptr); td->set(surfindex[k/3],cptr[0],cptr[1],cptr[2],false, facet_ptr->is_backwards()); facet_list.append( facet_ptr ); } points.clear(); // clear out the points vector since we are through with it. double feature_angle; int interp_order; CubitBoolean smooth_non_manifold, split_surfaces; feature_angle = 135.0; interp_order = 0; smooth_non_manifold = CUBIT_TRUE; split_surfaces = CUBIT_TRUE; { ChollaEngine *cholla_ptr = NULL; status = fme->build_cholla_surfaces( facet_list, point_list, feature_angle, interp_order, smooth_non_manifold, split_surfaces, cholla_ptr ); if( status == CUBIT_FAILURE ) return status; status = fme->finish_facet_Body( cholla_ptr, NULL, feature_angle, interp_order, body_out); if( status == CUBIT_FAILURE ) return status; if ( cholla_ptr ) { cholla_ptr->delete_me(); delete cholla_ptr; } } vertsout.clear(); coordsout.clear(); if ( keep_old == false ) { make_persistents_imprint(body_in,body_out,fsurfarray,fcurvearray); } return status; }
int FacetboolInterface::find_coord | ( | double | xx, |
double | yy, | ||
double | zz | ||
) | [private] |
Definition at line 1654 of file FacetboolInterface.cpp.
{ int value; unsigned int i; value = -1; for ( i = 0; i < FB_imprint_edge_coords.size(); i++ ) { if ( (fabs(FB_imprint_edge_coords[i]->coord[0] - xx) < GEOMETRY_RESABS) && (fabs(FB_imprint_edge_coords[i]->coord[1] - yy) < GEOMETRY_RESABS) && (fabs(FB_imprint_edge_coords[i]->coord[2] - zz) < GEOMETRY_RESABS) ) { value = (int)i; break; } } if ( value == -1 ) { value = FB_imprint_edge_coords.size(); FB_Coord *FBcoord = new FB_Coord(xx,yy,zz); FB_imprint_edge_coords.push_back(FBcoord); } return value; }
int FacetboolInterface::findcurve | ( | FacetCurve * | curve, |
std::vector< FacetCurve * > & | fcurvearray | ||
) | [private] |
Definition at line 945 of file FacetboolInterface.cpp.
{ unsigned int i; for ( i = 0; i < fcurvearray.size(); i++ ) { if ( fcurvearray[i] == curve ) { return i; } } fcurvearray.push_back(curve); return fcurvearray.size() - 1; }
void FacetboolInterface::get_edge_list_bbox | ( | CubitBox & | edge_list_bbox | ) |
Definition at line 1714 of file FacetboolInterface.cpp.
{ unsigned int i; double min[3],max[3]; min[0] = min[1] = min[2] = CUBIT_DBL_MAX - 1.0; max[0] = max[1] = max[2] = -CUBIT_DBL_MAX; for ( i = 0; i < FB_imprint_edge_coords.size(); i++ ) { min[0] = ( min[0] < FB_imprint_edge_coords[i]->coord[0] ) ? min[0] : FB_imprint_edge_coords[i]->coord[0]; min[1] = ( min[1] < FB_imprint_edge_coords[i]->coord[1] ) ? min[1] : FB_imprint_edge_coords[i]->coord[1]; min[2] = ( min[2] < FB_imprint_edge_coords[i]->coord[2] ) ? min[2] : FB_imprint_edge_coords[i]->coord[2]; max[0] = ( max[0] > FB_imprint_edge_coords[i]->coord[0] ) ? max[0] : FB_imprint_edge_coords[i]->coord[0]; max[1] = ( max[1] > FB_imprint_edge_coords[i]->coord[1] ) ? max[1] : FB_imprint_edge_coords[i]->coord[1]; max[2] = ( max[2] > FB_imprint_edge_coords[i]->coord[2] ) ? max[2] : FB_imprint_edge_coords[i]->coord[2]; } if ( (max[0] - min[0]) < 2.0*GEOMETRY_RESABS ) { min[0] -= GEOMETRY_RESABS; max[0] += GEOMETRY_RESABS; } if ( (max[1] - min[1]) < 2.0*GEOMETRY_RESABS ) { min[1] -= GEOMETRY_RESABS; max[1] += GEOMETRY_RESABS; } if ( (max[2] - min[2]) < 2.0*GEOMETRY_RESABS ) { min[2] -= GEOMETRY_RESABS; max[2] += GEOMETRY_RESABS; } CubitBox box(min,max); edge_list_bbox = box; }
FSBoundingBox * FacetboolInterface::make_edge_bounding_box | ( | int | v0, |
int | v1 | ||
) | [private] |
Definition at line 1677 of file FacetboolInterface.cpp.
{ FSBoundingBox *bb; double xmin, ymin, zmin, xmax, ymax, zmax; xmin = ( FB_imprint_edge_coords[v0]->coord[0] < FB_imprint_edge_coords[v1]->coord[0] ) ? FB_imprint_edge_coords[v0]->coord[0] : FB_imprint_edge_coords[v1]->coord[0]; ymin = ( FB_imprint_edge_coords[v0]->coord[1] < FB_imprint_edge_coords[v1]->coord[1] ) ? FB_imprint_edge_coords[v0]->coord[1] : FB_imprint_edge_coords[v1]->coord[1]; zmin = ( FB_imprint_edge_coords[v0]->coord[2] < FB_imprint_edge_coords[v1]->coord[2] ) ? FB_imprint_edge_coords[v0]->coord[2] : FB_imprint_edge_coords[v1]->coord[2]; xmax = ( FB_imprint_edge_coords[v0]->coord[0] > FB_imprint_edge_coords[v1]->coord[0] ) ? FB_imprint_edge_coords[v0]->coord[0] : FB_imprint_edge_coords[v1]->coord[0]; ymax = ( FB_imprint_edge_coords[v0]->coord[1] > FB_imprint_edge_coords[v1]->coord[1] ) ? FB_imprint_edge_coords[v0]->coord[1] : FB_imprint_edge_coords[v1]->coord[1]; zmax = ( FB_imprint_edge_coords[v0]->coord[2] > FB_imprint_edge_coords[v1]->coord[2] ) ? FB_imprint_edge_coords[v0]->coord[2] : FB_imprint_edge_coords[v1]->coord[2]; if ( (xmax - xmin) < 2.0*GEOMETRY_RESABS ) { xmin -= GEOMETRY_RESABS; xmax += GEOMETRY_RESABS; } if ( (ymax - ymin) < 2.0*GEOMETRY_RESABS ) { ymin -= GEOMETRY_RESABS; ymax += GEOMETRY_RESABS; } if ( (zmax - zmin) < 2.0*GEOMETRY_RESABS ) { zmin -= GEOMETRY_RESABS; zmax += GEOMETRY_RESABS; } bb = new FSBoundingBox(xmin, ymin, zmin, xmax, ymax, zmax); return bb; }
CubitStatus FacetboolInterface::make_FB_edge_list | ( | DLIList< Curve * > & | ref_edge_list | ) |
Definition at line 1618 of file FacetboolInterface.cpp.
{ CubitStatus success = CUBIT_SUCCESS; Curve *ref_edge_ptr; FacetCurve *cfcurve; CubitPoint *cfpoint; DLIList<CubitPoint *> cfpointlist; int i, j, lastvert, nextvert; CubitVector coords; ref_edge_list.reset(); for( i = ref_edge_list.size(); i > 0; i-- ) { ref_edge_ptr = ref_edge_list.get_and_step(); cfcurve = CAST_TO( ref_edge_ptr, FacetCurve); cfpointlist.clean_out(); cfcurve->get_points(cfpointlist); cfpoint = cfpointlist.get_and_step(); coords = cfpoint->coordinates(); lastvert = find_coord(coords.x(),coords.y(),coords.z()); for ( j = cfpointlist.size()-1; j > 0; j-- ) { cfpoint = cfpointlist.get_and_step(); coords = cfpoint->coordinates(); nextvert = find_coord(coords.x(),coords.y(),coords.z()); FB_Edge *FBedge = new FB_Edge(lastvert,nextvert,0,0,false); FSBoundingBox *bb = make_edge_bounding_box(lastvert,nextvert); lastvert = nextvert; FB_imprint_edges.push_back(FBedge); FB_imprint_edge_bboxes.push_back(bb); } } return success; }
void FacetboolInterface::make_persistent_curves | ( | DLIList< FacetCurve * > | fcurvelist, |
std::vector< FacetCurve * > & | fcurvearray, | ||
int | n, | ||
int | which_parent = 0 |
||
) | [private] |
Definition at line 1192 of file FacetboolInterface.cpp.
{ int k, m, jj; FacetCurve *fcurveorig, *fcurve2; int *marked3, index; bool ifoundit; FacetPoint *fpointorig, *fpoint2; DLIList<FacetPoint*> fpointlist, fpointlist2; CubitFacet *cfac; DLIList<CubitSimpleAttrib> csa_list; bool is_from_1, error; TDFacetboolData* tdf; fcurveorig = fcurvearray[n-1]; ifoundit = false; for ( k = fcurvelist.size(); k > 0; k-- ) { fcurve2 = fcurvelist.get_and_step(); if ( fcurve2->owner() ) continue; // If owner is already set, skip it. CurveFacetEvalTool *evaltool = fcurve2->get_eval_tool(); DLIList<CubitFacetEdge*> edgelist; CubitFacetEdge *cfedge; evaltool->get_facets(edgelist); cfedge = edgelist.get(); cfac = cfedge->adj_facet(0); index = cfac->edge_index(cfedge); tdf = TDFacetboolData::get(cfac); if ( which_parent ) { is_from_1 = tdf->parent_is_body_1(); if ( ( (is_from_1 == true) && (which_parent == 2) ) || ( (is_from_1 == false) && (which_parent == 1) ) ) continue; } marked3 = tdf->get_edge_indices(cfac->is_backwards()); if ( marked3[(index+1)%3] == n ) ifoundit = true; else { cfac = cfedge->adj_facet(1); if (cfac) { index = cfac->edge_index(cfedge); tdf = TDFacetboolData::get(cfac); if ( which_parent ) { is_from_1 = tdf->parent_is_body_1(); if ( ( (is_from_1 == true) && (which_parent == 2) ) || ( (is_from_1 == false) && (which_parent == 1) ) ) continue; } marked3 = tdf->get_edge_indices(cfac->is_backwards()); if ( marked3[(index+1)%3] == n ) ifoundit = true; } } if ( ifoundit == true ) { fpointlist.clean_out(); fpointlist2.clean_out(); fcurveorig->get_points(fpointlist); fcurve2->get_points(fpointlist2); for ( jj = fpointlist.size(); jj > 0; jj-- ) { error = false; fpointorig = fpointlist.get_and_step(); fpoint2 = fpointlist2.get_and_step(); while ( fpoint2->coordinates() != fpointorig->coordinates() ) { if ( fpointlist2.is_at_beginning() == CUBIT_TRUE ) { // PRINT_WARNING("Unable to make point on curve persistent.\n"); error = true; break; } fpoint2 = fpointlist2.get_and_step(); } if ( error == true ) continue; if ( fpointorig->owner() && !(fpoint2->owner()) ) { fpointorig->owner()->swap_bridge(fpointorig,fpoint2,false); fpointorig->get_simple_attribute(csa_list); for ( m = csa_list.size(); m > 0; m-- ) { const CubitSimpleAttrib& csa = csa_list.get_and_step(); fpoint2->append_simple_attribute_virt(csa); } } } if ( fcurveorig->owner() != 0 ) fcurveorig->owner()->swap_bridge(fcurveorig,fcurve2,false); fcurveorig->get_simple_attribute(csa_list); for ( m = csa_list.size(); m > 0; m-- ) { const CubitSimpleAttrib& csa = csa_list.get_and_step(); fcurve2->append_simple_attribute_virt(csa); } break; } } }
void FacetboolInterface::make_persistent_surfaces | ( | DLIList< FacetSurface * > | fsurfaceslist, |
std::vector< FacetSurface * > & | fsurfarray, | ||
int | n, | ||
int | which_parent = 0 |
||
) | [private] |
Definition at line 1281 of file FacetboolInterface.cpp.
{ DLIList<CubitSimpleAttrib> csa_list; int k, m; FacetSurface *fsorig, *fsurf2; bool is_from_1; fsorig = fsurfarray[n-1]; for ( k = fsurfaceslist.size(); k > 0; k-- ) { fsurf2 = fsurfaceslist.get_and_step(); DLIList<CubitFacet*> facet_list2; fsurf2->tris(facet_list2); CubitFacet* facet2 = facet_list2.get(); TDFacetboolData* tdf = TDFacetboolData::get(facet2); if ( which_parent ) { is_from_1 = tdf->parent_is_body_1(); if ( ( (is_from_1 == true) && (which_parent == 2) ) || ( (is_from_1 == false) && (which_parent == 1) ) ) continue; } int marked2 = tdf->get_surf_index(); if ( marked2 == n ) { if ( fsorig->owner() != 0 ) fsorig->owner()->swap_bridge(fsorig,fsurf2,false); fsorig->get_simple_attribute(csa_list); for ( m = csa_list.size(); m > 0; m-- ) { const CubitSimpleAttrib& csa = csa_list.get_and_step(); fsurf2->append_simple_attribute_virt(csa); } break; } } }
void FacetboolInterface::make_persistents_boolean | ( | BodySM * | body_in, |
BodySM * | body_out1, | ||
std::vector< FacetSurface * > & | fsurfarray, | ||
std::vector< FacetCurve * > & | fcurvearray, | ||
bool * | surfs_in_intersection, | ||
bool * | surfs_in_subtraction, | ||
bool * | curves_in_intersection, | ||
bool * | curves_in_subtraction, | ||
const CubitFacetboolOp | op, | ||
bool | body_1 | ||
) | [private] |
Definition at line 1095 of file FacetboolInterface.cpp.
{ unsigned int n; DLIList<CubitSimpleAttrib> csa_list; FacetBody *facet_body_in = CAST_TO(body_in, FacetBody); FacetBody *facet_body_out1 = CAST_TO(body_out1, FacetBody); int which_parent; bool bvalue1 = false, bvalue2 = false; if ( body_1 == true ) which_parent = 1; else which_parent = 2; switch (op) { case CUBIT_FB_UNION: bvalue1 = false; bvalue2 = true; break; case CUBIT_FB_INTERSECTION: bvalue2 = false; bvalue1 = true; break; case CUBIT_FB_SUBTRACTION: if ( body_1 == true ) { bvalue2 = false; bvalue1 = true; } else { bvalue1 = false; bvalue2 = true; } break; } // Fix the curves. DLIList<FacetCurve*> fcurvelist; facet_body_out1->get_curves(fcurvelist); for ( n = 1; n < 1 + fcurvearray.size(); n++ ) { if ( (curves_in_intersection[n] == bvalue1) && (curves_in_subtraction[n] == bvalue2) ) { make_persistent_curves(fcurvelist,fcurvearray,n,which_parent); } } // Fix the surfaces DLIList<FacetSurface*> fsurfaceslist; facet_body_out1->get_surfaces(fsurfaceslist); for ( n = 1; n < 1 + fsurfarray.size(); n++ ) { if ( (surfs_in_intersection[n] == bvalue1) && (surfs_in_subtraction[n] == bvalue2) ) { make_persistent_surfaces(fsurfaceslist,fsurfarray,n,which_parent); } } if ( body_1 == true ) { // Fix the lumps. FacetLump *florig, *fl2; DLIList<FacetLump*> flumplist, flumplist2; int k; facet_body_in->get_lumps(flumplist); facet_body_out1->get_lumps(flumplist2); florig = flumplist.get(); fl2 = flumplist2.get(); if ( florig->owner() ) { florig->owner()->swap_bridge(florig,fl2,false); florig->get_simple_attribute(csa_list); for ( k = csa_list.size(); k > 0; k-- ) { const CubitSimpleAttrib& csa = csa_list.get_and_step(); fl2->append_simple_attribute_virt(csa); } } // Fix the bodies. if ( facet_body_in->owner() ) { facet_body_in->owner()->swap_bridge(facet_body_in,facet_body_out1,false); facet_body_in->get_simple_attribute(csa_list); for ( k = csa_list.size(); k > 0; k-- ) { const CubitSimpleAttrib& csa = csa_list.get_and_step(); facet_body_out1->append_simple_attribute_virt(csa); } } } }
void FacetboolInterface::make_persistents_imprint | ( | BodySM * | body_in, |
BodySM * | body_out1, | ||
std::vector< FacetSurface * > & | fsurfarray, | ||
std::vector< FacetCurve * > & | fcurvearray | ||
) | [private] |
Definition at line 1037 of file FacetboolInterface.cpp.
{ DLIList<CubitSimpleAttrib> csa_list; FacetBody *facet_body_in = CAST_TO(body_in, FacetBody); FacetBody *facet_body_out1 = CAST_TO(body_out1, FacetBody); unsigned int n; // Fix the curves. DLIList<FacetCurve*> fcurvelist; facet_body_out1->get_curves(fcurvelist); for ( n = 1; n < 1 + fcurvearray.size(); n++ ) { make_persistent_curves(fcurvelist,fcurvearray,n,0); } // Fix the surfaces DLIList<FacetSurface*> fsurfaceslist; facet_body_out1->get_surfaces(fsurfaceslist); for ( n = 1; n < 1 + fsurfarray.size(); n++ ) { make_persistent_surfaces(fsurfaceslist,fsurfarray,n,0); } // Fix the lumps. FacetLump *florig, *fl2; DLIList<FacetLump*> flumplist, flumplist2; int k; facet_body_in->get_lumps(flumplist); facet_body_out1->get_lumps(flumplist2); florig = flumplist.get(); fl2 = flumplist2.get(); if ( florig->owner() ) { florig->owner()->swap_bridge(florig,fl2,false); florig->get_simple_attribute(csa_list); for ( k = csa_list.size(); k > 0; k-- ) { const CubitSimpleAttrib& csa = csa_list.get_and_step(); fl2->append_simple_attribute_virt(csa); } } // Fix the bodies. if ( facet_body_in->owner() ) { facet_body_in->owner()->swap_bridge(facet_body_in,facet_body_out1,false); facet_body_in->get_simple_attribute(csa_list); for ( k = csa_list.size(); k > 0; k-- ) { const CubitSimpleAttrib& csa = csa_list.get_and_step(); facet_body_out1->append_simple_attribute_virt(csa); } } }
void FacetboolInterface::make_persistents_webcut | ( | BodySM * | body_in, |
BodySM * | body_out1, | ||
BodySM * | body_out2, | ||
std::vector< FacetSurface * > & | fsurfarray, | ||
std::vector< FacetCurve * > & | fcurvearray, | ||
bool * | surfs_in_intersection, | ||
bool * | surfs_in_subtraction, | ||
bool * | curves_in_intersection, | ||
bool * | curves_in_subtraction | ||
) | [private] |
Definition at line 960 of file FacetboolInterface.cpp.
{ unsigned int k, n; DLIList<CubitSimpleAttrib> csa_list; FacetBody *facet_body_in = CAST_TO(body_in, FacetBody); FacetBody *facet_body_out1; FacetBody *facet_body_out2; facet_body_out1 = CAST_TO(body_out1, FacetBody); facet_body_out2 = CAST_TO(body_out2, FacetBody); // Fix the curves. DLIList<FacetCurve*> fcurvelist, fcurvelist2; facet_body_out1->get_curves(fcurvelist); facet_body_out2->get_curves(fcurvelist2); for ( n = 1; n < 1 + fcurvearray.size(); n++ ) { if ( (curves_in_intersection[n] == true) && (curves_in_subtraction[n] == false) ) { make_persistent_curves(fcurvelist,fcurvearray,n); } else if ( (curves_in_intersection[n] == false) && (curves_in_subtraction[n] == true) ) { make_persistent_curves(fcurvelist2,fcurvearray,n); } } // Fix the surfaces DLIList<FacetSurface*> fsurfaceslist, fsurfaceslist2; facet_body_out1->get_surfaces(fsurfaceslist); facet_body_out2->get_surfaces(fsurfaceslist2); for ( n = 1; n < 1 + fsurfarray.size(); n++ ) { if ( (surfs_in_intersection[n] == true) && (surfs_in_subtraction[n] == false) ) { make_persistent_surfaces(fsurfaceslist,fsurfarray,n); } else if ( (surfs_in_intersection[n] == false) && (surfs_in_subtraction[n] == true) ) { make_persistent_surfaces(fsurfaceslist2,fsurfarray,n); } } // Fix the lumps. FacetLump *florig, *fl2; DLIList<FacetLump*> flumplist, flumplist2; facet_body_in->get_lumps(flumplist); facet_body_out1->get_lumps(flumplist2); florig = flumplist.get(); fl2 = flumplist2.get(); if ( florig->owner() ) { florig->owner()->swap_bridge(florig,fl2,false); florig->get_simple_attribute(csa_list); for ( k = csa_list.size(); k > 0; k-- ) { const CubitSimpleAttrib& csa = csa_list.get_and_step(); fl2->append_simple_attribute_virt(csa); } } // Fix the bodies. if ( facet_body_in->owner() ) { facet_body_in->owner()->swap_bridge(facet_body_in,facet_body_out1,false); facet_body_in->get_simple_attribute(csa_list); for ( k = csa_list.size(); k > 0; k-- ) { const CubitSimpleAttrib& csa = csa_list.get_and_step(); facet_body_out1->append_simple_attribute_virt(csa); } } }
CubitStatus FacetboolInterface::separate_lumps | ( | BodySM * | body_ptr, |
bool | is_sheet_body | ||
) | [private] |
Definition at line 329 of file FacetboolInterface.cpp.
{ //get all the shells in 'body_ptr' DLIList<FacetShell*> facet_shells; FacetBody *facet_body = CAST_TO( body_ptr, FacetBody ); facet_body->get_shells( facet_shells ); // some shells here might contain more than one connected // patch of surfaces...which is illegal. Separate them into their own shells. bool created_shells = false; int k,i; for( k=facet_shells.size(); k--; ) { FacetShell *facet_shell = facet_shells.get_and_step(); DLIList<FacetSurface*> facet_surfs; facet_shell->get_surfaces( facet_surfs ); DLIList<FacetSurface*> connected_patch; int max_num_passes = facet_surfs.size(); int num_passes=0; //prevents infinite loop while( facet_surfs.size() && num_passes < max_num_passes ) { connected_patch.clean_out(); FacetQueryEngine::instance()->get_connected_patch( facet_surfs, connected_patch ); if( num_passes == 0 ) { int kk; for( kk=connected_patch.size(); kk--; ) { FacetSurface *f_surf = connected_patch.get_and_step(); if( is_sheet_body ) f_surf->set_shell_sense( facet_shell, CUBIT_UNKNOWN ); else f_surf->set_shell_sense( facet_shell, CUBIT_FORWARD ); } } else //extract surfaces out of current shell and make them into their own shell { facet_shell->disconnect_surfaces( connected_patch ); DLIList<Surface*> tmp_surfs; CAST_LIST( connected_patch, tmp_surfs, Surface ); ShellSM *shellsm_ptr; FacetModifyEngine::instance()->make_facet_shell(tmp_surfs, shellsm_ptr); if ( shellsm_ptr == NULL ) { PRINT_ERROR("Problems building facet based shell entity.\n"); } else { FacetShell *tmp_shell = static_cast<FacetShell*>(shellsm_ptr); int kk; //now for each surface, add sense wrt this new shell for( kk=tmp_surfs.size(); kk--;) { FacetSurface *tmp_facet_surf = CAST_TO(tmp_surfs.get_and_step(), FacetSurface); //if it's not a sheet body, tag the surfs wrt the shell, FORWARD if( is_sheet_body ) tmp_facet_surf->set_shell_sense( tmp_shell, CUBIT_UNKNOWN ); else tmp_facet_surf->set_shell_sense( tmp_shell, CUBIT_FORWARD ); } created_shells = true; FacetLump *facet_lump = static_cast<FacetLump*>( facet_shell->get_lump() ); facet_lump->add_shell( tmp_shell ); } } num_passes++; } } bool created_lumps = false; DLIList<FacetShell*> void_shells; int number_regions = 0; if( created_shells ) { //determine which shells are regions and which are voids //get a point we know is outside the body CubitBox bbox; CubitVector centroid; double vol; facet_body->mass_properties( centroid, vol ); FacetQueryEngine::instance()->create_facet_bounding_box( facet_body, bbox ); CubitVector point_outside = 2*(bbox.maximum() - centroid); point_outside = centroid + point_outside; facet_shells.clean_out(); facet_body->get_shells( facet_shells ); for( k=facet_shells.size(); k--; ) { FacetShell *facet_shell = facet_shells.get_and_step(); CubitPointContainment point_cont; point_cont = facet_shell->point_containment( point_outside ); if( point_cont == CUBIT_PNT_OUTSIDE ) number_regions++; else if( point_cont == CUBIT_PNT_INSIDE ) void_shells.append( facet_shell ); //is a region...if it is the second found region, should be //in its own lump if( number_regions>1 && point_cont == CUBIT_PNT_OUTSIDE ) { created_lumps = true; //remove this shell from its current Lump FacetLump *tmp_lump = static_cast<FacetLump*>(facet_shell->get_lump()); tmp_lump->remove_shell( facet_shell ); //make a new lump containing this shell Lump *new_lump; DLIList<ShellSM*> sm_shells; sm_shells.append( static_cast<ShellSM*>(facet_shell) ); FacetModifyEngine::instance()->make_facet_lump( sm_shells, new_lump ); //add lump to body facet_body->add_lump( static_cast<FacetLump*>(new_lump) ); } } } if( void_shells.size() && created_lumps ) { //the void shells are still in the original lump. We need to pair each //up with the region that encloses it //make a list of all the region (non-void) shells in the body DLIList<FacetShell*> region_shells; facet_body->get_shells( region_shells ); for(k=void_shells.size(); k--;) { if( region_shells.move_to( void_shells.get_and_step() ) ) region_shells.change_to( NULL ); } region_shells.remove_all_with_value( NULL ); //for each void lump...find the region that contains it for( k=void_shells.size(); k--; ) { FacetShell *void_shell = void_shells.get_and_step(); //get a point on the void DLIList<FacetSurface*> tmp_surfs; void_shell->get_surfaces( tmp_surfs ); CubitVector point_on_shell; DLIList<CubitFacet*> facet_list; tmp_surfs.get()->tris( facet_list ); point_on_shell = facet_list.get()->center(); //get the region that contains that point for( i=region_shells.size(); i--; ) { FacetShell *region_shell = region_shells.get_and_step(); tmp_surfs.clean_out(); region_shell->get_surfaces( tmp_surfs ); if( region_shell->point_containment( point_on_shell ) == CUBIT_PNT_INSIDE ) { //remove the void shell from it's lump FacetLump *tmp_lump = static_cast<FacetLump*>(void_shell->get_lump()); tmp_lump->remove_shell( void_shell ); //add the void shell to the region's lump tmp_lump = static_cast<FacetLump*>(region_shell->get_lump()); tmp_lump->add_shell( void_shell ); break; } } } } return CUBIT_SUCCESS; }
CubitStatus FacetboolInterface::separate_shells_into_bodies | ( | BodySM * | body_ptr, |
bool | is_sheet_body, | ||
DLIList< BodySM * > & | new_bodies | ||
) | [private] |
Definition at line 511 of file FacetboolInterface.cpp.
{ //first separate the body into its lumps if(!separate_lumps(body_ptr,is_sheet_body)) return CUBIT_FAILURE; //split out each lump into it's own body DLIList<BodySM*> split_bodies; FacetModifyEngine::instance()->split_body( body_ptr, split_bodies); new_bodies += split_bodies; return CUBIT_SUCCESS; }
CubitStatus FacetboolInterface::webcut_FB | ( | BodySM * | bodysm_ptr, |
std::vector< double > & | cutter_verts, | ||
std::vector< int > & | cutter_connections, | ||
bool | cutter_is_plane, | ||
CubitBoolean | delete_bodies, | ||
CubitBoolean & | intersects, | ||
DLIList< BodySM * > & | results_list | ||
) |
Definition at line 45 of file FacetboolInterface.cpp.
{ intersects = CUBIT_TRUE; DLIList<FacetSurface*> facet_surf_list; std::vector<double> body_verts; std::vector<int> body_connections, newbodyfacets; std::vector<int> newcutterfacets; std::vector<int> f_c_indices1; std::vector<FacetSurface *> fsurfarray; std::vector<FacetCurve *> fcurvearray; CubitStatus status; int mydebug = 0; FacetModifyEngine *fme = FacetModifyEngine::instance(); FacetBody *facet_body_ptr = CAST_TO(bodysm_ptr, FacetBody); facet_body_ptr->get_surfaces(facet_surf_list); status = facetbody_to_facetbool(facet_surf_list,body_verts, body_connections,&f_c_indices1, fsurfarray,fcurvearray); if( status == CUBIT_FAILURE ) return status; FBIntersect intersector; intersector.set_classify_flag(true); if ( cutter_is_plane == true ) intersector.set_body2_planar(); status = intersector.intersect(body_verts,body_connections, cutter_verts,cutter_connections, newbodyfacets,newcutterfacets, &f_c_indices1, 0); if( status == CUBIT_FAILURE ) return status; bool *surfs_in_intersection, *surfs_in_subtraction; bool *curves_in_intersection, *curves_in_subtraction; surfs_in_intersection = new bool[1+fsurfarray.size()]; surfs_in_subtraction = new bool[1+fsurfarray.size()]; curves_in_intersection = new bool[1+fcurvearray.size()]; curves_in_subtraction = new bool[1+fcurvearray.size()]; unsigned int k; for ( k = 1; k < 1 + fsurfarray.size(); k++ ) surfs_in_subtraction[k] = surfs_in_intersection[k] = false; for ( k = 1; k < 1 + fcurvearray.size(); k++ ) curves_in_subtraction[k] = curves_in_intersection[k] = false; status = intersector.get_persistent_entity_info(surfs_in_intersection, curves_in_intersection,surfs_in_subtraction, curves_in_subtraction,CUBIT_FB_INTERSECTION,1); if( status == CUBIT_FAILURE ) return status; facet_surf_list.reset(); std::vector<int> surfindex, surfindex2; std::vector<int> curveindex, curveindex2; std::vector<double> vertsout, vertsout2; std::vector<int> coordsout, coordsout2; status = intersector.gather_by_boolean(vertsout,coordsout, &surfindex,&curveindex,0, CUBIT_FB_INTERSECTION); if( status == CUBIT_FAILURE ) return status; status = intersector.gather_by_boolean(vertsout2,coordsout2, &surfindex2,&curveindex2,0, CUBIT_FB_SUBTRACTION); if( status == CUBIT_FAILURE ) return status; // If there were no intersections if ( (vertsout.size() == 0) || (coordsout.size() == 0) || (vertsout2.size() == 0) || (coordsout2.size() == 0) ) { intersects = CUBIT_FALSE; delete [] surfs_in_intersection; delete [] surfs_in_subtraction; delete [] curves_in_intersection; delete [] curves_in_subtraction; return CUBIT_SUCCESS; } CubitPoint *new_point; std::vector<CubitPoint *> points; for ( k = 0; k < vertsout.size(); k += 3 ) { new_point = (CubitPoint *) new CubitPointData( vertsout[k], vertsout[k+1], vertsout[k+2] ); points.push_back(new_point); } DLIList <CubitFacet *>facet_list; DLIList <CubitPoint *>point_list; CubitFacet *facet_ptr; if(mydebug) GfxDebug::clear(); for ( k = 0; k < coordsout.size(); k += 3 ) { facet_ptr = new CubitFacetData( points[coordsout[k]], points[coordsout[k+1]], points[coordsout[k+2]] ); int cptr[3]; cptr[0] = curveindex[k]; cptr[1] = curveindex[k+1]; cptr[2] = curveindex[k+2]; TDFacetboolData::add_facetbool_facet( facet_ptr ); TDFacetboolData* td = TDFacetboolData::get(facet_ptr); td->set(surfindex[k/3],cptr[0],cptr[1],cptr[2],false, facet_ptr->is_backwards()); if(mydebug){ facet_ptr->debug_draw(CUBIT_YELLOW_INDEX); CubitVector tmp1 = points[coordsout[k]]->coordinates(); CubitVector tmp2 = points[coordsout[k+1]]->coordinates(); CubitVector tmp3 = points[coordsout[k+2]]->coordinates(); if(cptr[0]){ GfxDebug::draw_line(tmp1, tmp2, CUBIT_WHITE_INDEX); } if(cptr[1]){ GfxDebug::draw_line(tmp2, tmp3, CUBIT_GREEN_INDEX); } if(cptr[2]){ GfxDebug::draw_line(tmp3, tmp1, CUBIT_BLUE_INDEX); } } facet_list.append( facet_ptr ); } if(mydebug){ GfxDebug::mouse_xforms(); } points.clear(); // clear out the points vector since we are through with it. double feature_angle; int interp_order; CubitBoolean smooth_non_manifold, split_surfaces; BodySM *body_ptr, *body_ptr2; //determine if original body is a sheet body Body *tmp_body = CAST_TO(bodysm_ptr->topology_entity(), Body); bool is_sheet_body = false; if( tmp_body->is_sheet_body() ) is_sheet_body = true; //mbrewer: This is not the best solution. For now, we are using // a no feature angle unless we are working with a sheet-body. For // sheet-bodies, however, we are not marking the vertices that // bound curves. Therefore, if we do not use a feature angle, curves // are not split correctly. The correct fix would be to mark // the vertices and maintain them through the webcut. if( is_sheet_body ) feature_angle = 135.0; else feature_angle = 0.0; interp_order = 0; smooth_non_manifold = CUBIT_TRUE; split_surfaces = CUBIT_FALSE; { ChollaEngine *cholla_ptr = NULL; status = fme->build_cholla_surfaces( facet_list, point_list, feature_angle, interp_order, smooth_non_manifold, split_surfaces, cholla_ptr ); if( status == CUBIT_FAILURE ) return status; status = fme->finish_facet_Body( cholla_ptr, NULL, feature_angle, interp_order, body_ptr); if( status == CUBIT_FAILURE ) return status; if ( cholla_ptr ) { cholla_ptr->delete_me(); delete cholla_ptr; } } DLIList<BodySM*> new_bodies; status = separate_shells_into_bodies( body_ptr, is_sheet_body, new_bodies ); if( status == CUBIT_FAILURE ) return status; for(k=new_bodies.size(); k--;) results_list.append( new_bodies.get_and_step() ); vertsout.clear(); coordsout.clear(); facet_list.clean_out(); for ( k = 0; k < vertsout2.size(); k += 3 ) { new_point = (CubitPoint *) new CubitPointData( vertsout2[k], vertsout2[k+1], vertsout2[k+2] ); points.push_back(new_point); } for ( k = 0; k < coordsout2.size(); k += 3 ) { facet_ptr = new CubitFacetData( points[coordsout2[k]], points[coordsout2[k+1]], points[coordsout2[k+2]] ); int cptr[3]; cptr[0] = curveindex2[k]; cptr[1] = curveindex2[k+1]; cptr[2] = curveindex2[k+2]; TDFacetboolData::add_facetbool_facet( facet_ptr ); TDFacetboolData* td = TDFacetboolData::get(facet_ptr); td->set(surfindex2[k/3],cptr[0],cptr[1],cptr[2],false, facet_ptr->is_backwards()); if(mydebug){ CubitVector tmp1 = points[coordsout2[k]]->coordinates(); CubitVector tmp2 = points[coordsout2[k+1]]->coordinates(); CubitVector tmp3 = points[coordsout2[k+2]]->coordinates(); if(cptr[0]){ GfxDebug::draw_line(tmp1, tmp2, CUBIT_WHITE_INDEX); } if(cptr[1]){ GfxDebug::draw_line(tmp2, tmp3, CUBIT_GREEN_INDEX); } if(cptr[2]){ GfxDebug::draw_line(tmp3, tmp1, CUBIT_BLUE_INDEX); } } facet_list.append( facet_ptr ); } points.clear(); // clear out the points vector since we are through with it. { ChollaEngine *cholla_ptr = NULL; status = fme->build_cholla_surfaces( facet_list, point_list, feature_angle, interp_order, smooth_non_manifold, split_surfaces, cholla_ptr ); if( status == CUBIT_FAILURE ) return status; status = fme->finish_facet_Body( cholla_ptr, NULL, feature_angle, interp_order, body_ptr2); if( status == CUBIT_FAILURE ) return status; if ( cholla_ptr ) { cholla_ptr->delete_me(); delete cholla_ptr; } } new_bodies.clean_out(); status = separate_shells_into_bodies( body_ptr2, is_sheet_body, new_bodies ); if( status == CUBIT_FAILURE ) return status; for(k=new_bodies.size(); k--;) results_list.append( new_bodies.get_and_step() ); if ( delete_bodies == CUBIT_TRUE ) make_persistents_webcut(bodysm_ptr,body_ptr,body_ptr2,fsurfarray,fcurvearray, surfs_in_intersection,surfs_in_subtraction, curves_in_intersection,curves_in_subtraction); vertsout2.clear(); coordsout2.clear(); delete [] surfs_in_intersection; delete [] surfs_in_subtraction; delete [] curves_in_intersection; delete [] curves_in_subtraction; return CUBIT_SUCCESS; }
std::vector<FSBoundingBox*> FacetboolInterface::FB_imprint_edge_bboxes [private] |
Definition at line 68 of file FacetboolInterface.hpp.
std::vector<FB_Coord*> FacetboolInterface::FB_imprint_edge_coords [private] |
Definition at line 67 of file FacetboolInterface.hpp.
std::vector<FB_Edge*> FacetboolInterface::FB_imprint_edges [private] |
Definition at line 66 of file FacetboolInterface.hpp.