cgma
|
#include <OCCQueryEngine.hpp>
Public Member Functions | |
void | copy_attributes (TopoDS_Shape &old_shape, TopoDS_Shape &new_shape) |
int | update_OCC_map (TopoDS_Shape &old_shape, TopoDS_Shape &new_shape) |
virtual | ~OCCQueryEngine () |
const char * | modeler_type () |
TopoDS_Shape * | get_TopoDS_Shape_of_entity (TopologyBridge *entity) |
void | body_attributes_for_writing (DLIList< OCCBody * > &OCC_bodies, BRep_Builder &B, TopoDS_Compound &Co, DLIList< OCCLump * > &single_lumps, DLIList< DLIList< CubitSimpleAttrib > * > &lists) |
int | get_major_version () |
int | get_minor_version () |
int | get_subminor_version () |
CubitString | get_engine_version_string () |
virtual const type_info & | entity_type_info () const |
virtual CubitBoolean | is_solid_modeler_type () const |
virtual CubitStatus | restore_transform (BodySM *body) |
virtual CubitStatus | get_graphics (Surface *surface_ptr, GMem *gMem, unsigned short normal_tolerance=15, double distance_tolerance=0, double longest_edge=0) const |
CubitStatus | get_graphics (TopoDS_Face *face_ptr, GMem *g_mem, unsigned short normal_tolerance=15, double distance_tolerance=0, double max_edge_length=0) const |
virtual CubitStatus | get_graphics (Curve *curve_ptr, GMem *gMem=NULL, double angle_tolerance=0, double distance_tolerance=0, double max_edge_length=0.0) const |
CubitStatus | get_graphics (TopoDS_Edge *edge_ptr, GMem *gMem=NULL, double angle_tolerance=0, double distance_tolerance=0, double max_edge_length=0) const |
virtual CubitStatus | fire_ray (CubitVector &origin, CubitVector &direction, DLIList< TopologyBridge * > &at_entity_list, DLIList< double > &ray_params, int max_hits=0, double ray_radius=0.0, DLIList< TopologyBridge * > *hit_entity_list=0) const |
virtual CubitStatus | get_isoparametric_points (Surface *, int &, int &, GMem *&) const |
virtual CubitStatus | get_u_isoparametric_points (Surface *ref_face_ptr, double v, int &n, GMem *&gMem) const |
virtual CubitStatus | get_v_isoparametric_points (Surface *ref_face_ptr, double u, int &n, GMem *&gMem) const |
virtual CubitStatus | transform_vec_position (CubitVector const &, BodySM *, CubitVector &) const |
virtual CubitStatus | get_intersections (Curve *, CubitVector &point1, CubitVector &, DLIList< CubitVector > &, CubitBoolean, CubitBoolean) |
virtual CubitStatus | get_intersections (Curve *, Curve *, DLIList< CubitVector > &, CubitBoolean, CubitBoolean) |
virtual CubitStatus | get_intersections (Curve *ref_edge, Surface *ref_face, DLIList< CubitVector > &intersection_list, CubitBoolean bounded=CUBIT_FALSE) |
virtual CubitStatus | entity_extrema (DLIList< GeometryEntity * > &ref_entity_list, const CubitVector *dir1, const CubitVector *dir2, const CubitVector *dir3, CubitVector &extrema, GeometryEntity *&extrema_entity_ptr) |
virtual CubitStatus | entity_entity_distance (GeometryEntity *ref_entity_ptr1, GeometryEntity *ref_entity_ptr2, CubitVector &pos1, CubitVector &pos2, double &distance) |
virtual CubitStatus | export_solid_model (DLIList< TopologyBridge * > &bridge_list, const char *file_name, Model_File_Type file_type, const CubitString &cubit_version, ModelExportOptions &export_options) |
virtual CubitStatus | export_solid_model (DLIList< TopologyBridge * > &ref_entity_list, char *&p_buffer, int &n_buffer_size, bool b_export_buffer) |
virtual CubitStatus | save_temp_geom_file (DLIList< TopologyBridge * > &ref_entity_list, const char *file_name, const CubitString &cubit_version, CubitString &created_file, CubitString &created_file_type) |
virtual CubitStatus | import_temp_geom_file (FILE *file_ptr, const char *file_name, Model_File_Type file_type, DLIList< TopologyBridge * > &bridge_list) |
virtual CubitStatus | import_solid_model (const char *file_name, Model_File_Type file_type, DLIList< TopologyBridge * > &imported_entities, ModelImportOptions &options) |
virtual CubitStatus | import_solid_model (DLIList< TopologyBridge * > &imported_entities, const char *pBuffer, const int n_buffer_size) |
CubitStatus | unhook_BodySM_from_OCC (BodySM *bodysm, bool remove_lower_entities=CUBIT_TRUE) const |
CubitStatus | unhook_Surface_from_OCC (Surface *surface) const |
CubitStatus | unhook_Curve_from_OCC (Curve *curve) const |
CubitStatus | unhook_Point_from_OCC (TBPoint *point) const |
void | bound_TopoDS_Shape (const TopoDS_Shape &aShape) |
virtual void | delete_solid_model_entities (DLIList< BodySM * > &body_list) const |
void | delete_bodies (DLIList< BodySM * > &body_list, bool remove_lower_entities=CUBIT_TRUE) const |
virtual CubitStatus | delete_solid_model_entities (GeometryEntity *ref_entity_ptr, bool remove_lower_entities) const |
virtual CubitStatus | delete_solid_model_entities (BodySM *body_ptr) const |
CubitStatus | delete_body (BodySM *body_ptr, bool remove_lower_entities=CUBIT_TRUE) const |
virtual CubitStatus | delete_solid_model_entities (Surface *surf_ptr) const |
virtual CubitStatus | delete_solid_model_entities (Curve *curve_ptr) const |
virtual CubitStatus | delete_solid_model_entities (TBPoint *point_ptr) const |
virtual double | get_sme_resabs_tolerance () const |
virtual double | set_sme_resabs_tolerance (double new_resabs) |
virtual CubitStatus | set_int_option (const char *opt_name, int val) |
virtual CubitStatus | set_dbl_option (const char *opt_name, double val) |
virtual CubitStatus | set_str_option (const char *opt_name, const char *val) |
CubitStatus | ensure_is_ascii_stl_file (FILE *fp, CubitBoolean &is_ascii) |
CubitStatus | create_super_bounding_box (DLIList< BodySM * > &body_list, CubitBox &super_box) |
CubitStatus | update_entity_shape (GeometryEntity *entity_ptr, BRepBuilderAPI_ModifyShape *aTranf, BRepAlgoAPI_BooleanOperation *op=NULL) |
void | set_TopoDS_Shape (TopologyBridge *tb, TopoDS_Shape &new_shape) |
CubitStatus | translate (BodySM *body, const CubitVector &offset) |
CubitStatus | rotate (BodySM *body, const CubitVector &axis, double angle) |
CubitStatus | scale (BodySM *body, double factor) |
CubitStatus | scale (BodySM *body, const CubitVector &factors) |
CubitStatus | reflect (BodySM *body, const CubitVector &axis) |
CubitStatus | translate (GeometryEntity *ent, const CubitVector &offset) |
CubitStatus | rotate (GeometryEntity *ent, const CubitVector &axis, double degrees) |
CubitStatus | scale (GeometryEntity *ent, double factor) |
CubitStatus | scale (GeometryEntity *ent, const CubitVector &factors) |
CubitStatus | reflect (GeometryEntity *ent, const CubitVector &axis) |
CubitStatus | get_connected_patch (DLIList< OCCSurface * > &remaining_surfs, DLIList< OCCSurface * > &output_patch) |
virtual CubitBoolean | bodies_overlap (BodySM *body_ptr_1, BodySM *body_ptr_2) const |
TopologyBridge * | occ_to_cgm (const TopoDS_Shape &shape) |
virtual CubitBoolean | volumes_overlap (Lump *lump1, Lump *lump2) const |
DLIList< TopologyBridge * > | populate_topology_bridge (TopoDS_Shape &aShape) |
BodySM * | populate_topology_bridge (const TopoDS_Compound &aShape) |
Lump * | populate_topology_bridge (const TopoDS_Solid &aShape, CubitBoolean build_body=CUBIT_FALSE) |
Surface * | populate_topology_bridge (const TopoDS_Face &aShape, CubitBoolean build_body=CUBIT_FALSE) |
Curve * | populate_topology_bridge (const TopoDS_Edge &aShape, CubitBoolean stand_along=CUBIT_FALSE) |
TBPoint * | populate_topology_bridge (const TopoDS_Vertex &aShape, CubitBoolean stand_along=CUBIT_FALSE) |
OCCShell * | populate_topology_bridge (const TopoDS_Shell &aShape, CubitBoolean standalone=CUBIT_FALSE) |
Handle (TDocStd_Document) MyDF | |
Static Public Member Functions | |
static OCCQueryEngine * | instance () |
Public Attributes | |
CubitBoolean | EXPORT_ATTRIB |
DLIList< OCCBody * > * | BodyList |
DLIList< OCCSurface * > * | SurfaceList |
DLIList< OCCLoop * > * | WireList |
DLIList< OCCCurve * > * | CurveList |
TDF_Label | mainLabel |
TopTools_DataMapOfShapeInteger * | OCCMap |
std::map< int, TopologyBridge * > * | OccToCGM |
std::map< int, TDF_Label > * | Shape_Label_Map |
Static Public Attributes | |
static int | iTotalTBCreated = 0 |
static int | total_coedges = 0 |
Protected Member Functions | |
OCCQueryEngine () | |
Private Member Functions | |
CubitStatus | import_solid_model (FILE *file_ptr, const char *, DLIList< TopologyBridge * > &imported_entities, CubitBoolean print_results=CUBIT_TRUE, const char *logfile_name=NULL, CubitBoolean heal_step=CUBIT_TRUE, CubitBoolean import_bodies=CUBIT_TRUE, CubitBoolean import_surfaces=CUBIT_TRUE, CubitBoolean import_curves=CUBIT_TRUE, CubitBoolean import_vertices=CUBIT_TRUE, CubitBoolean free_surfaces=CUBIT_TRUE) |
CubitStatus | unhook_Lump_from_OCC (Lump *lump) const |
CubitStatus | unhook_ShellSM_from_OCC (ShellSM *shell) const |
CubitStatus | unhook_CoEdges_from_OCC (DLIList< OCCCoEdge * > &coedges) const |
CubitStatus | unhook_LoopSM_from_OCC (LoopSM *loopsm) const |
CubitStatus | delete_loop (LoopSM *loopsm) const |
void | unhook_coedges_of_a_curve (OCCCurve *curve, OCCLoop *loop) const |
void | add_shape_to_map (TopoDS_Shape &sh, TopoDS_Shape &aShape, int ¤t_id) |
OCCLoop * | populate_topology_bridge (const TopoDS_Wire &aShape, CubitBoolean standalone=CUBIT_FALSE) |
CubitStatus | write_topology (const char *file_name, Model_File_Type file_type, DLIList< OCCBody * > &facet_bodies, DLIList< OCCSurface * > &facet_surfaces, DLIList< OCCCurve * > &facet_curves, DLIList< OCCPoint * > &facet_points) |
CubitStatus | write_topology (char *&p_buffer, int &n_buffer_size, bool b_export_buffer, DLIList< OCCBody * > &OCC_bodies, DLIList< OCCSurface * > &OCC_surfaces, DLIList< OCCCurve * > &OCC_curves, DLIList< OCCPoint * > &OCC_points) |
CubitBoolean | Write (const TopoDS_Shape &Sh, const Standard_CString File, TDF_Label label) |
CubitBoolean | Write (const TopoDS_Shape &Sh, char *&p_buffer, int &n_buffer_size, bool b_export_buffer, TDF_Label label) |
CubitBoolean | Read (TopoDS_Shape &Shapes, const Standard_CString File, TDF_Label label) |
CubitBoolean | Read (TopoDS_Shape &Sh, const char *pBuffer, const int n_buffer_size, TDF_Label label) |
Static Private Attributes | |
static OCCQueryEngine * | instance_ = NULL |
Friends | |
class | OCCSurface |
Definition at line 100 of file OCCQueryEngine.hpp.
OCCQueryEngine::~OCCQueryEngine | ( | ) | [virtual] |
Definition at line 188 of file OCCQueryEngine.cpp.
{ instance_ = NULL; delete OCCMap; delete OccToCGM; delete Shape_Label_Map; delete BodyList; delete WireList; delete SurfaceList; delete CurveList; }
OCCQueryEngine::OCCQueryEngine | ( | ) | [protected] |
Definition at line 166 of file OCCQueryEngine.cpp.
{ GeometryQueryTool::instance()->add_gqe( this ); OCCMap = new TopTools_DataMapOfShapeInteger; OccToCGM = new std::map<int, TopologyBridge*>; Shape_Label_Map = new std::map<int, TDF_Label>; BodyList = new DLIList<OCCBody*>; WireList = new DLIList<OCCLoop*>; SurfaceList = new DLIList<OCCSurface*>; CurveList = new DLIList<OCCCurve*>; CubitString name("Doc"); TCollection_ExtendedString xString((Standard_CString)name.c_str(), CUBIT_TRUE); MyDF = new TDocStd_Document(xString); mainLabel = MyDF->Main(); EXPORT_ATTRIB = CUBIT_TRUE; }
void OCCQueryEngine::add_shape_to_map | ( | TopoDS_Shape & | sh, |
TopoDS_Shape & | aShape, | ||
int & | current_id | ||
) | [private] |
Definition at line 1953 of file OCCQueryEngine.cpp.
{ //add the shape into map if(sh.IsNull()) return; if(!OCCMap->IsBound(sh) || OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end()) { DLIList<TopoDS_Shape*> list; //find the sh shape without aShape's location. TopLoc_Location L = aShape.Location(); TopoDS_Iterator it(aShape, Standard_True, Standard_False); TopoDS_Shape bare_shape; for(; it.More(); it.Next()) { TopoDS_Shape test_shape = it.Value(); test_shape.Move(L); if(sh.IsEqual(test_shape)) { bare_shape = it.Value(); break; } } if(!OCCMap->IsBound(sh)) { CubitBoolean shape_found = false; if(OCCMap->IsBound(bare_shape)) { current_id = OCCMap->Find(bare_shape); //There are two possiblities when coming here: //1. After OCCAttribute binds the bare_shape but not binds the topo. //2. The bare_shape is bound because it binds to a different topo. if( OccToCGM->find(current_id) == OccToCGM->end() ) { OCCMap->UnBind(bare_shape); std::map<int, TDF_Label>::iterator it = Shape_Label_Map->find(current_id); if(it != Shape_Label_Map->end()) { TDF_Label aLabel = (*it).second; Handle_TDataXtd_Shape attr_shape = TDataXtd_Shape::Set(aLabel, sh); } shape_found = true; } } if(!shape_found) { iTotalTBCreated++; current_id = iTotalTBCreated; } OCCMap->Bind(sh, current_id); } else current_id = OCCMap->Find(sh); } else current_id = OCCMap->Find(sh); }
CubitBoolean OCCQueryEngine::bodies_overlap | ( | BodySM * | body_ptr_1, |
BodySM * | body_ptr_2 | ||
) | const [virtual] |
Implements GeometryQueryEngine.
Definition at line 3666 of file OCCQueryEngine.cpp.
{ OCCBody *occ_body1 = CAST_TO(body_ptr_1, OCCBody); if (!occ_body1) { PRINT_ERROR("Can't calculate intersection of non-OCC bodies."); return CUBIT_FALSE; } OCCBody *occ_body2 = CAST_TO(body_ptr_2, OCCBody); if (!occ_body2) { PRINT_ERROR("Can't calculate intersection of non-OCC bodies."); return CUBIT_FALSE; } CubitBox box_1 = occ_body1->get_bounding_box(); CubitBox box_2 = occ_body2->get_bounding_box(); if ( !box_1.overlap( GEOMETRY_RESABS, box_2 ) ) return CUBIT_FALSE; TopoDS_Shape *shape1; occ_body1->get_TopoDS_Shape(shape1); TopoDS_Shape *shape2; occ_body2->get_TopoDS_Shape(shape2); //BRepAlgoAPI_Section calculates intersection between faces only. TopExp_Explorer Ex1, Ex2; for (Ex1.Init(*shape1, TopAbs_SOLID); Ex1.More(); Ex1.Next()) { TopoDS_Solid *posolid1 = new TopoDS_Solid; *posolid1 = TopoDS::Solid(Ex1.Current()); OCCLump * lump1 = new OCCLump(posolid1); for (Ex2.Init(*shape2, TopAbs_SOLID); Ex2.More(); Ex2.Next()) { TopoDS_Solid *posolid2 = new TopoDS_Solid; *posolid2 = TopoDS::Solid(Ex2.Current()); OCCLump * lump2 = new OCCLump(posolid2); CubitBoolean is_overlap = volumes_overlap(lump1, lump2); if(is_overlap) return CUBIT_TRUE; } } return CUBIT_FALSE; }
void OCCQueryEngine::body_attributes_for_writing | ( | DLIList< OCCBody * > & | OCC_bodies, |
BRep_Builder & | B, | ||
TopoDS_Compound & | Co, | ||
DLIList< OCCLump * > & | single_lumps, | ||
DLIList< DLIList< CubitSimpleAttrib > * > & | lists | ||
) |
Definition at line 1157 of file OCCQueryEngine.cpp.
{ //Add every shape to the compound OCCLump* lump = NULL; DLIList<CubitSimpleAttrib> body_csa_list; for (int i = 0; i < OCC_bodies.size(); i++) { OCCBody* body = OCC_bodies.get_and_step(); TopoDS_Compound *shape = body->get_TopoDS_Shape(); if (shape == NULL || shape->IsNull()) //single lump or sheet or shell body { DLIList<OCCSurface*> surfaces = body->my_sheet_surfaces(); DLIList<OCCShell*> shells = body->shells(); DLIList<Lump*> lumps = body->lumps(); if(surfaces.size() == 1) B.Add(Co,*(surfaces.get()->get_TopoDS_Face())); else if (shells.size() == 1) B.Add(Co,*(shells.get()->get_TopoDS_Shell())); else { lump = CAST_TO(lumps.get(), OCCLump); B.Add(Co, *(lump->get_TopoDS_Solid())); //if body has attributes, add them to the solid. DLIList<CubitSimpleAttrib> csa_list; body->get_simple_attribute(csa_list); body_csa_list.clean_out(); for(int i = 0; i < csa_list.size(); i++) { CubitSimpleAttrib body_csa = csa_list.get_and_step(); CubitString pre_fix("#SINGLELUMP%"); pre_fix += CubitString::number(i); body_csa.string_data_list().insert(body_csa.string_data_list().begin(), pre_fix); lump->append_simple_attribute_virt(body_csa); body_csa_list.append(body_csa); } if(csa_list.size() > 0) { single_lumps.append(lump); lists.append(new DLIList<CubitSimpleAttrib>(body_csa_list)); } } continue; } B.Add(Co, *shape); } }
void OCCQueryEngine::bound_TopoDS_Shape | ( | const TopoDS_Shape & | aShape | ) |
Definition at line 4065 of file OCCQueryEngine.cpp.
{ (iTotalTBCreated)++; switch (aShape.ShapeType()) { case TopAbs_COMPOUND: OCCMap->Bind(TopoDS::Compound(aShape), iTotalTBCreated); break; case TopAbs_SOLID: OCCMap->Bind(TopoDS::Solid(aShape), iTotalTBCreated); break; case TopAbs_SHELL: OCCMap->Bind(TopoDS::Shell(aShape), iTotalTBCreated); break; case TopAbs_FACE: OCCMap->Bind(TopoDS::Face(aShape), iTotalTBCreated); break; case TopAbs_WIRE: OCCMap->Bind(TopoDS::Wire(aShape), iTotalTBCreated); break; case TopAbs_EDGE: OCCMap->Bind(TopoDS::Edge(aShape), iTotalTBCreated); break; case TopAbs_VERTEX: OCCMap->Bind(TopoDS::Vertex(aShape), iTotalTBCreated); break; default: (iTotalTBCreated)--; } }
void OCCQueryEngine::copy_attributes | ( | TopoDS_Shape & | old_shape, |
TopoDS_Shape & | new_shape | ||
) |
Definition at line 3751 of file OCCQueryEngine.cpp.
{ if(new_shape.IsNull()) return; //update the attribute label tree DLIList<CubitSimpleAttrib> list; OCCAttribSet::get_attributes(old_shape, list); for(int i = 0; i < list.size(); i ++) { const CubitSimpleAttrib& s_attr = list.get_and_step(); TopAbs_ShapeEnum type = old_shape.ShapeType(); if(new_shape.ShapeType() < type) { TopTools_IndexedMapOfShape M; TopExp::MapShapes(new_shape, type, M); for(int j = 1; j <= M.Extent() ; j++ ) { TopoDS_Shape sub_shape = M(j); OCCAttribSet::append_attribute(s_attr, sub_shape); } } else OCCAttribSet::append_attribute(s_attr, new_shape); } }
CubitStatus OCCQueryEngine::create_super_bounding_box | ( | DLIList< BodySM * > & | body_list, |
CubitBox & | super_box | ||
) |
Definition at line 3462 of file OCCQueryEngine.cpp.
{ BodySM *bodySM; int i; CubitStatus status = CUBIT_SUCCESS; body_list.reset(); for ( i = 0; i < body_list.size(); i++ ) { bodySM = body_list.get_and_step(); OCCBody* occBody = CAST_TO(bodySM, OCCBody); super_box |= occBody->get_bounding_box(); } return status; }
void OCCQueryEngine::delete_bodies | ( | DLIList< BodySM * > & | body_list, |
bool | remove_lower_entities = CUBIT_TRUE |
||
) | const |
Definition at line 2605 of file OCCQueryEngine.cpp.
{ BodySM* BodyPtr = NULL; for (int i = 0; i < bodyList.size(); i++ ) { BodyPtr = bodyList.get_and_step(); this->delete_body(BodyPtr, remove_lower_entities); } return; }
CubitStatus OCCQueryEngine::delete_body | ( | BodySM * | body_ptr, |
bool | remove_lower_entities = CUBIT_TRUE |
||
) | const |
Definition at line 2714 of file OCCQueryEngine.cpp.
{ OCCBody* occ_body = static_cast<OCCBody*>(bodysm); if (!occ_body) return CUBIT_FAILURE; DLIList<Lump*> lumps; DLIList<ShellSM*> shell_list; DLIList<OCCSurface*> surfaces = occ_body->my_sheet_surfaces(); for(int i = 0; i <surfaces.size(); i++) { OCCSurface* occ_surface = surfaces.get_and_step(); occ_surface->set_body((OCCBody*)NULL); if(remove_lower_entities) { delete occ_surface->my_lump(); OCCShell* shell = occ_surface->my_shell(); delete_solid_model_entities(occ_surface); delete shell; } } DLIList<OCCShell*> shells = occ_body->shells(); for(int i = 0; i <shells.size(); i++) { OCCShell* occ_shell = shells.get_and_step(); occ_shell->set_body((OCCBody*)NULL); if(remove_lower_entities) { delete occ_shell->my_lump(); DLIList<TopologyBridge*> tb_surfaces; occ_shell->get_children_virt(tb_surfaces); unhook_ShellSM_from_OCC(occ_shell); for(int k = 0; k < tb_surfaces.size(); k++) delete_solid_model_entities(CAST_TO(tb_surfaces.get_and_step(), Surface)); delete occ_shell; } } DLIList<TopologyBridge*> children; lumps = occ_body->lumps(); int size = lumps.size(); for(int i =0; i < size; i++) { Lump* lump = lumps.get_and_step(); OCCLump* occ_lump = CAST_TO(lump, OCCLump); if (!occ_lump) continue; occ_lump->remove_body(); if(remove_lower_entities) { children.clean_out(); occ_lump->get_children_virt(children); for(int j = 0; j < children.size(); j++) { ShellSM* shell = CAST_TO(children.get_and_step(), ShellSM); if (shell) shell_list.append(shell); DLIList<TopologyBridge*> tb_surfaces; shell->get_children_virt(tb_surfaces); for(int k = 0; k < tb_surfaces.size(); k++) delete_solid_model_entities(CAST_TO(tb_surfaces.get_and_step(), Surface)); } } } CubitStatus stat = CUBIT_SUCCESS; stat = unhook_BodySM_from_OCC(bodysm, remove_lower_entities); if(remove_lower_entities) { for(int j = 0; j < shell_list.size(); j++) delete shell_list.get_and_step(); for(int i =0; i < lumps.size(); i++) delete lumps.get_and_step(); } BodyList->remove(occ_body); delete bodysm; return stat; }
CubitStatus OCCQueryEngine::delete_loop | ( | LoopSM * | loopsm | ) | const [private] |
Definition at line 3022 of file OCCQueryEngine.cpp.
{ OCCLoop* occ_loop = dynamic_cast<OCCLoop*>(loopsm); if (!occ_loop) return CUBIT_FAILURE; DLIList<OCCCoEdge*> children; children = occ_loop->coedges(); int size = children.size(); DLIList<Curve*> curves; while(size > 0) { OCCCoEdge* coedge = children.pop(); Curve* curve = coedge->curve(); curves.append_unique(curve); size = children.size(); } CubitStatus status = unhook_LoopSM_from_OCC(loopsm); for(int i = 0; i < curves.size(); i ++) { OCCCurve* occ_curve = CAST_TO(curves.get_and_step(), OCCCurve); unhook_coedges_of_a_curve(occ_curve, occ_loop); occ_curve->remove_loop(occ_loop); delete_solid_model_entities(occ_curve); } if (status) { WireList->remove(occ_loop); delete loopsm; } return status; }
void OCCQueryEngine::delete_solid_model_entities | ( | DLIList< BodySM * > & | body_list | ) | const [virtual] |
Implements GeometryQueryEngine.
Definition at line 2589 of file OCCQueryEngine.cpp.
{ delete_bodies(bodyList, true); }
CubitStatus OCCQueryEngine::delete_solid_model_entities | ( | GeometryEntity * | ref_entity_ptr, |
bool | remove_lower_entities | ||
) | const [virtual] |
Definition at line 2618 of file OCCQueryEngine.cpp.
{ //Lump Lump* lump = CAST_TO(ref_entity_ptr, Lump); if(lump != NULL) { BodySM* body = CAST_TO(lump, OCCLump)->get_body(); DLIList<Lump*> lumps = CAST_TO(body, OCCBody)->lumps(); if (remove_lower_entities) return delete_solid_model_entities(body); DLIList<TopologyBridge*> children; for(int i = 0; i < lumps.size(); i++) { lump = lumps.get_and_step(); CAST_TO(lump, OCCLump)->get_children_virt(children); } CubitStatus stat = this->unhook_BodySM_from_OCC(body); if(stat) { while (children.size()) delete children.pop(); while(lumps.size()) delete lumps.pop(); delete body; } return stat; } // Surface Surface* ref_face_ptr = CAST_TO(ref_entity_ptr, Surface); if (ref_face_ptr != NULL) { if (remove_lower_entities) return ( this->delete_solid_model_entities(ref_face_ptr) ); CubitStatus stat = this->unhook_Surface_from_OCC(ref_face_ptr); if(stat) delete ref_face_ptr; return stat; } // Curve Curve* ref_edge_ptr = CAST_TO(ref_entity_ptr, Curve); if (ref_edge_ptr != NULL) { if (remove_lower_entities) return ( this->delete_solid_model_entities(ref_edge_ptr)); CubitStatus stat = this->unhook_Curve_from_OCC(ref_edge_ptr); if(stat) delete ref_edge_ptr; return stat; } // Point TBPoint* ref_vertex_ptr = CAST_TO(ref_entity_ptr, TBPoint); if (ref_vertex_ptr != NULL) { return ( this->delete_solid_model_entities(ref_vertex_ptr) ); } // Oops! PRINT_ERROR("In OCCQueryEngine::delete_solid_model_entities\n" " Can only delete solid model entities underlying \n" "RefFaces, RefEdges and RefVertices.\n"); return CUBIT_FAILURE; }
CubitStatus OCCQueryEngine::delete_solid_model_entities | ( | BodySM * | body_ptr | ) | const [virtual] |
Implements GeometryQueryEngine.
Definition at line 2699 of file OCCQueryEngine.cpp.
{ return delete_body(bodysm, true); }
CubitStatus OCCQueryEngine::delete_solid_model_entities | ( | Surface * | surf_ptr | ) | const [virtual] |
Implements GeometryQueryEngine.
Definition at line 2944 of file OCCQueryEngine.cpp.
{ OCCSurface* fsurf = dynamic_cast<OCCSurface*>(surface); if (!fsurf) return CUBIT_FAILURE; OCCBody* sheet_body = fsurf->my_body(); if(sheet_body != NULL) BodyList->remove(sheet_body); double d = fsurf->measure(); if(d < 0.0) PRINT_WARNING("Negative area surface is being deleted. \n"); DLIList<TopologyBridge*> children; fsurf->get_children_virt(children); for(int i = 0; i < children.size(); i++) { LoopSM* loop = CAST_TO(children.get_and_step(), LoopSM); delete_loop(loop); } CubitStatus stat = unhook_Surface_from_OCC(surface); if (stat) delete surface; return stat; }
CubitStatus OCCQueryEngine::delete_solid_model_entities | ( | Curve * | curve_ptr | ) | const [virtual] |
Implements GeometryQueryEngine.
Definition at line 3135 of file OCCQueryEngine.cpp.
{ OCCCurve* fcurve = CAST_TO(curve, OCCCurve); if (!fcurve ) return CUBIT_FAILURE; if(fcurve->loops().size() > 0 && fcurve->loops().get() != NULL) return CUBIT_FAILURE; DLIList<TopologyBridge*> children; fcurve->get_children_virt(children); for(int i = 0; i < children.size(); i++) { TBPoint* point = CAST_TO(children.get_and_step(), TBPoint); CAST_TO(point, OCCPoint)->remove_curve(fcurve); delete_solid_model_entities(point); } CubitStatus stat = unhook_Curve_from_OCC(curve); if (!stat) return CUBIT_FAILURE; CurveList->remove(fcurve); delete fcurve; return stat; }
CubitStatus OCCQueryEngine::delete_solid_model_entities | ( | TBPoint * | point_ptr | ) | const [virtual] |
Implements GeometryQueryEngine.
Definition at line 3222 of file OCCQueryEngine.cpp.
{ OCCPoint* fpoint = dynamic_cast<OCCPoint*>(point); if (!fpoint) return CUBIT_FAILURE; if(fpoint->num_curves() > 0) return CUBIT_FAILURE; CubitStatus stat = unhook_Point_from_OCC(point); if(stat) delete point; return stat; }
CubitStatus OCCQueryEngine::ensure_is_ascii_stl_file | ( | FILE * | fp, |
CubitBoolean & | is_ascii | ||
) |
Definition at line 3377 of file OCCQueryEngine.cpp.
{ char line[128]=""; if (fgets(line, 128, fp)==NULL) { return CUBIT_FAILURE; } if (fgets(line, 128, fp)==NULL) { return CUBIT_FAILURE; } if (strlen(line)==127) { if (fgets(line, 128, fp)==NULL) { return CUBIT_FAILURE; } } unsigned int dummy_int=0; while (isspace(line[dummy_int])&& dummy_int<strlen(line)) dummy_int++; if (strlen(line)-dummy_int>5) { if (tolower(line[dummy_int++])=='f' && tolower(line[dummy_int++])=='a' && tolower(line[dummy_int++])=='c' && tolower(line[dummy_int++])=='e' && tolower(line[dummy_int])=='t') { if (fgets(line, 128, fp)==NULL) { return CUBIT_FAILURE; } dummy_int=0; while (isspace(line[dummy_int])&& dummy_int<strlen(line)) { dummy_int++; } if (strlen(line)-dummy_int>5) { if (tolower(line[dummy_int++])=='o' && tolower(line[dummy_int++])=='u' && tolower(line[dummy_int++])=='t' && tolower(line[dummy_int++])=='e' && tolower(line[dummy_int])=='r') { if (fgets(line, 128, fp)==NULL) { return CUBIT_FAILURE; } dummy_int=0; while (isspace(line[dummy_int])&& dummy_int<strlen(line)) { dummy_int++; } if (strlen(line)-dummy_int>6) { if (tolower(line[dummy_int++])=='v' && tolower(line[dummy_int++])=='e' && tolower(line[dummy_int++])=='r' && tolower(line[dummy_int++])=='t' && tolower(line[dummy_int++])=='e' && tolower(line[dummy_int])=='x') { is_ascii=CUBIT_TRUE; } } } } } } return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::entity_entity_distance | ( | GeometryEntity * | ref_entity_ptr1, |
GeometryEntity * | ref_entity_ptr2, | ||
CubitVector & | pos1, | ||
CubitVector & | pos2, | ||
double & | distance | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 754 of file OCCQueryEngine.cpp.
{ TopoDS_Shape * shape1; TopoDS_Shape * shape2; if ((shape1 = get_TopoDS_Shape_of_entity(entity1)) == NULL) { PRINT_ERROR( "problem occured getting OCC entity.\n" " Aborting.\n" ); return CUBIT_FAILURE; } if( (shape2 = get_TopoDS_Shape_of_entity( entity2 )) == NULL ) { PRINT_ERROR( "problem occured getting OCC entity.\n" " Aborting.\n"); return CUBIT_FAILURE; } BRepExtrema_DistShapeShape distShapeShape(*shape1, *shape2); //distShapeShape.Perform(); if (!distShapeShape.IsDone()) { PRINT_ERROR( "problem occured getting distance between OCC entities.\n" " Aborting.\n"); return CUBIT_FAILURE; } distance = distShapeShape.Value(); gp_Pnt pnt1 = distShapeShape.PointOnShape1(1); gp_Pnt pnt2 = distShapeShape.PointOnShape2(1); pos1 = CubitVector(pnt1.X(), pnt1.Y(), pnt1.Z()); pos2 = CubitVector(pnt2.X(), pnt2.Y(), pnt2.Z()); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::entity_extrema | ( | DLIList< GeometryEntity * > & | ref_entity_list, |
const CubitVector * | dir1, | ||
const CubitVector * | dir2, | ||
const CubitVector * | dir3, | ||
CubitVector & | extrema, | ||
GeometryEntity *& | extrema_entity_ptr | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 735 of file OCCQueryEngine.cpp.
{ //in OCC, the api_entity_extrema is used to calculate "possible //self-intersecting sweeping and to align lofting sections" PRINT_ERROR("There's no such call in OCC "); return CUBIT_FAILURE; }
const type_info & OCCQueryEngine::entity_type_info | ( | ) | const [virtual] |
Definition at line 225 of file OCCQueryEngine.cpp.
{ return typeid(OCCQueryEngine); }
CubitStatus OCCQueryEngine::export_solid_model | ( | DLIList< TopologyBridge * > & | bridge_list, |
const char * | file_name, | ||
Model_File_Type | file_type, | ||
const CubitString & | cubit_version, | ||
ModelExportOptions & | export_options | ||
) | [virtual] |
R CubitStatus R- CUBIT_SUCCESS/CUBIT_FAILURE I ref_entity_list I- A list of RefEntities to be exported or saved to a file. I file_name I- The name of the file to write to. I file_type I- An optional type of file.
Implements GeometryQueryEngine.
Definition at line 900 of file OCCQueryEngine.cpp.
{ if( file_type != OCC_TYPE && file_type != STEP_TYPE && file_type != IGES_TYPE) { //PRINT_ERROR("The specified file type, %s, is not supported!\n", filetype ); return CUBIT_FAILURE; } /* char* name = "write.iges.unit"; Standard_CString orig_unit; char* unit = "M"; if(strcmp( file_type, "IGES") == 0 && unit != NULL) { orig_unit = Interface_Static::CVal(name); Interface_Static::SetCVal (name, unit); } */ DLIList<OCCBody*> OCC_bodies; DLIList<OCCSurface*> OCC_surfaces; DLIList<OCCCurve*> OCC_curves; DLIList<OCCPoint*> OCC_points; DLIList<TopologyBridge*> ref_entities_handled; int i; //Collect all free entities (bodies, curves, vertices ) ref_entity_list.reset(); for(i=ref_entity_list.size(); i>0; i--) { TopologyBridge* ref_entity_ptr = ref_entity_list.get(); CubitBoolean handled = CUBIT_TRUE; //if it is a Vertex if( OCCPoint* pt = CAST_TO( ref_entity_ptr, OCCPoint) ) OCC_points.append( pt ); //if it is a Curve else if( OCCCurve* curve = CAST_TO( ref_entity_ptr, OCCCurve) ) OCC_curves.append( curve ); //if it is a surface else if( OCCSurface* surf = CAST_TO( ref_entity_ptr, OCCSurface) ) OCC_surfaces.append( surf ); //if it is a Body else if( OCCBody* body = CAST_TO( ref_entity_ptr, OCCBody ) ) OCC_bodies.append( body ); else handled = CUBIT_FALSE; if( handled == CUBIT_TRUE ) { ref_entities_handled.append( ref_entity_ptr ); ref_entity_list.change_to(NULL); } ref_entity_list.step(); } ref_entity_list.remove_all_with_value(NULL); int free_body_count = OCC_bodies.size(); int free_curve_count = OCC_curves.size(); int free_point_count = OCC_points.size(); int free_surface_count = OCC_surfaces.size(); //if nothing to write out...return if( free_body_count == 0 && free_surface_count == 0 && free_curve_count == 0 && free_point_count == 0) return CUBIT_SUCCESS; //save the facets (geometry info ) CubitStatus status; //write out topology and attributes status = write_topology( file_name, file_type, OCC_bodies, OCC_surfaces, OCC_curves, OCC_points ); /* //set the unit back. if(strcmp( file_type, "IGES") == 0 && unit != NULL) Interface_Static::SetCVal (name,orig_unit); */ if( status == CUBIT_FAILURE ) return CUBIT_FAILURE; if( free_body_count || free_surface_count || free_curve_count || free_point_count ) PRINT_INFO( "\nExported:" ); int flg = 0; if( free_body_count ) { if( flg )PRINT_INFO( " " );else flg=1; if( free_body_count == 1 ) PRINT_INFO( "%4d OCC Body to %s\n", free_body_count, file_name ); else PRINT_INFO( "%4d OCC Bodies to %s\n", free_body_count, file_name ); } if( free_surface_count ) { if( flg )PRINT_INFO( " " );else flg=1; if( free_surface_count == 1 ) PRINT_INFO( "%4d OCC Surface to %s\n", free_surface_count, file_name ); else PRINT_INFO( "%4d OCC Surface to %s\n", free_surface_count, file_name ); } if( free_curve_count ) { if( flg )PRINT_INFO( " " );else flg=1; if( free_curve_count == 1 ) PRINT_INFO( "%4d OCC Curve to %s\n", free_curve_count, file_name ); else PRINT_INFO( "%4d OCC Curves to %s\n", free_curve_count, file_name ); } if( free_point_count ) { if( flg )PRINT_INFO( " " );else flg=1; if( free_point_count == 1 ) PRINT_INFO( "%4d OCC Point to %s\n", free_point_count, file_name ); else PRINT_INFO( "%4d OCC Points to %s\n", free_point_count, file_name ); } PRINT_INFO( "\n" ); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::export_solid_model | ( | DLIList< TopologyBridge * > & | ref_entity_list, |
char *& | p_buffer, | ||
int & | n_buffer_size, | ||
bool | b_export_buffer | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 1039 of file OCCQueryEngine.cpp.
{ DLIList<OCCBody*> OCC_bodies; DLIList<OCCSurface*> OCC_surfaces; DLIList<OCCCurve*> OCC_curves; DLIList<OCCPoint*> OCC_points; DLIList<TopologyBridge*> ref_entities_handled; int i; //Collect all free entities (bodies, curves, vertices ) ref_entity_list.reset(); for(i=ref_entity_list.size(); i>0; i--) { TopologyBridge* ref_entity_ptr = ref_entity_list.get(); CubitBoolean handled = CUBIT_TRUE; //if it is a Vertex if( OCCPoint* pt = CAST_TO( ref_entity_ptr, OCCPoint) ) OCC_points.append( pt ); //if it is a Curve else if( OCCCurve* curve = CAST_TO( ref_entity_ptr, OCCCurve) ) OCC_curves.append( curve ); //if it is a surface else if( OCCSurface* surf = CAST_TO( ref_entity_ptr, OCCSurface) ) OCC_surfaces.append( surf ); //if it is a Body else if( OCCBody* body = CAST_TO( ref_entity_ptr, OCCBody ) ) OCC_bodies.append( body ); else handled = CUBIT_FALSE; if( handled == CUBIT_TRUE ) { ref_entities_handled.append( ref_entity_ptr ); ref_entity_list.change_to(NULL); } ref_entity_list.step(); } ref_entity_list.remove_all_with_value(NULL); int free_body_count = OCC_bodies.size(); int free_curve_count = OCC_curves.size(); int free_point_count = OCC_points.size(); int free_surface_count = OCC_surfaces.size(); //if nothing to write out...return if( free_body_count == 0 && free_surface_count == 0 && free_curve_count == 0 && free_point_count == 0) return CUBIT_SUCCESS; //save the facets (geometry info ) CubitStatus status; //write out topology and attributes status = write_topology( p_buffer, n_buffer_size, b_export_buffer, OCC_bodies, OCC_surfaces, OCC_curves, OCC_points); if( status == CUBIT_FAILURE ) return CUBIT_FAILURE; if( free_body_count || free_surface_count || free_curve_count || free_point_count ) { if (b_export_buffer) PRINT_INFO( "\nExported:" ); else PRINT_INFO( "\nSize checked:" ); } int flg = 0; if( free_body_count ) { if( flg )PRINT_INFO( " " );else flg=1; if( free_body_count == 1 ) PRINT_INFO( "%4d OCC Body to buffer\n", free_body_count ); else PRINT_INFO( "%4d OCC Bodies to buffer\n", free_body_count ); } if( free_surface_count ) { if( flg )PRINT_INFO( " " );else flg=1; if( free_surface_count == 1 ) PRINT_INFO( "%4d OCC Surface to buffer\n", free_surface_count ); else PRINT_INFO( "%4d OCC Surface to buffer\n", free_surface_count ); } if( free_curve_count ) { if( flg )PRINT_INFO( " " );else flg=1; if( free_curve_count == 1 ) PRINT_INFO( "%4d OCC Curve to buffer\n", free_curve_count ); else PRINT_INFO( "%4d OCC Curves to buffer\n", free_curve_count ); } if( free_point_count ) { if( flg )PRINT_INFO( " " );else flg=1; if( free_point_count == 1 ) PRINT_INFO( "%4d OCC Point to buffer\n", free_point_count ); else PRINT_INFO( "%4d OCC Points to buffer\n", free_point_count ); } PRINT_INFO( "\n" ); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::fire_ray | ( | CubitVector & | origin, |
CubitVector & | direction, | ||
DLIList< TopologyBridge * > & | at_entity_list, | ||
DLIList< double > & | ray_params, | ||
int | max_hits = 0 , |
||
double | ray_radius = 0.0 , |
||
DLIList< TopologyBridge * > * | hit_entity_list = 0 |
||
) | const [virtual] |
Implements GeometryQueryEngine.
Definition at line 3287 of file OCCQueryEngine.cpp.
{ CubitStatus status = CUBIT_SUCCESS; //- fire a ray at the specified body, returning the entities hit and //- the parameters along the ray; return CUBIT_FAILURE if error // - line body intersection. gp_Pnt p(origin.x(), origin.y(), origin.z()); gp_Dir dir(direction.x(), direction.y(), direction.z()); gp_Lin L(p, dir); TopoDS_Edge edge = BRepBuilderAPI_MakeEdge(L); for(int i = 0; i < at_entity_list.size(); i++) { TopologyBridge* tb = at_entity_list.get_and_step(); TopoDS_Shape *shape; OCCBody *occBody = CAST_TO(tb, OCCBody); if (occBody ) { occBody->get_TopoDS_Shape(shape); BRepExtrema_DistShapeShape distShapeShape(edge, *shape); //distShapeShape.Perform(); if (!distShapeShape.IsDone()) { PRINT_ERROR("Cannot calculate the intersection points for the input body.\n"); return CUBIT_FAILURE; } if (distShapeShape.Value() < get_sme_resabs_tolerance()) { int numPnt = distShapeShape.NbSolution(); for (int i = 1; i <= numPnt; i++) { double para; distShapeShape.ParOnEdgeS1(i , para); ray_params.append(para); } hit_entity_list_ptr->append(tb); } } } return status; }
CubitStatus OCCQueryEngine::get_connected_patch | ( | DLIList< OCCSurface * > & | remaining_surfs, |
DLIList< OCCSurface * > & | output_patch | ||
) |
CubitString OCCQueryEngine::get_engine_version_string | ( | ) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 215 of file OCCQueryEngine.cpp.
{ return CubitString("OpenCascade ") + OCC_VERSION_STRING; }
CubitStatus OCCQueryEngine::get_graphics | ( | Surface * | surface_ptr, |
GMem * | gMem, | ||
unsigned short | normal_tolerance = 15 , |
||
double | distance_tolerance = 0 , |
||
double | longest_edge = 0 |
||
) | const [virtual] |
Implements GeometryQueryEngine.
Definition at line 262 of file OCCQueryEngine.cpp.
{ // Because this may be unnecessarily called twice, // say there is one triangle. if (!g_mem) return CUBIT_SUCCESS; if(max_edge_length > get_sme_resabs_tolerance()) { PRINT_WARNING("OCC surface's tessilation doesn't consider edge_length.\n"); PRINT_WARNING("max_edge_length argument is ignored. \n"); } OCCSurface *occ_surface_ptr = CAST_TO(surface_ptr, OCCSurface); TopoDS_Face * Topo_Face = occ_surface_ptr->get_TopoDS_Face(); return get_graphics( Topo_Face, g_mem, normal_tolerance, distance_tolerance, max_edge_length ); }
CubitStatus OCCQueryEngine::get_graphics | ( | TopoDS_Face * | face_ptr, |
GMem * | g_mem, | ||
unsigned short | normal_tolerance = 15 , |
||
double | distance_tolerance = 0 , |
||
double | max_edge_length = 0 |
||
) | const |
Definition at line 285 of file OCCQueryEngine.cpp.
{ if (!face_ptr) return CUBIT_FAILURE; TopLoc_Location L; Handle_Poly_Triangulation facets = BRep_Tool::Triangulation(*face_ptr, L); gp_Trsf tf = L.Transformation(); if(facets.IsNull() || facets->NbTriangles() == 0) { //do triangulation if(distance_tolerance <= 0.0) distance_tolerance = 0.01; double angle = CUBIT_PI * normal_tolerance/180; BRepAdaptor_Surface asurface(*face_ptr); Bnd_Box aBox; BndLib_AddSurface::Add(asurface, Precision::Approximation(), aBox); BRepMesh_FastDiscret *myMesh = #if OCC_VERSION_MAJOR <= 6 && OCC_VERSION_MINOR < 8 new BRepMesh_FastDiscret(distance_tolerance, *face_ptr, aBox, angle, Standard_True, Standard_True); #else new BRepMesh_FastDiscret(*face_ptr, distance_tolerance, angle, aBox, Standard_True, Standard_True); #endif if (myMesh != NULL) delete myMesh; facets = BRep_Tool::Triangulation(*face_ptr, L); if(facets.IsNull() || facets->NbTriangles() == 0) { PRINT_ERROR("Can't get triangulation representation for this surface.\n"); return CUBIT_FAILURE; } } //if necessary, the face tolerance can be returned. now, no use. //double tol = BRep_Tool::Tolerance(*Topo_Face); int number_points = facets->NbNodes(); int number_triangles = facets->NbTriangles(); int number_facets = 4 * number_triangles; Poly_Array1OfTriangle triangles(0, number_triangles-1); triangles.Assign( facets->Triangles() ); int *facetList = new int[number_facets]; //needs to test that N1, N2, N3 index are starting from 0 to number_points-1 //otherwise needs to update either facetList or gPnts to make consistent. //It's possible also that N's starting from 1. int minN = 100; for (int i = 0; i < triangles.Length(); i++) { Poly_Triangle triangle = triangles.Value( i ); int N1, N2, N3; triangle.Get(N1, N2, N3); facetList[4 * i] = 3; facetList[4 * i + 1] = N1; minN = (minN < N1 ? minN : N1); facetList[4 * i + 2] = N2; minN = (minN < N2 ? minN : N2); facetList[4 * i + 3] = N3; minN = (minN < N3 ? minN : N3); } if(minN != 0) { //subtract the minN from the facetList for all i+1, i+2, i+3 points for (int i = 0; i < triangles.Length(); i++) { facetList[4 * i + 1] -= minN; facetList[4 * i + 2] -= minN; facetList[4 * i + 3] -= minN; } } g_mem->replace_facet_list( facetList, number_facets, number_facets); TColgp_Array1OfPnt points(0, number_points-1); points.Assign(facets->Nodes()); GPoint *gPnts= new GPoint[number_points]; for (int i = 0; i < number_points ; i ++) { gp_Pnt gp_pnt = points.Value(i); if( !L.IsIdentity()) gp_pnt.Transform(tf); GPoint gPnt; gPnt.x = gp_pnt.X(); gPnt.y = gp_pnt.Y(); gPnt.z = gp_pnt.Z(); gPnts[i] = gPnt; } g_mem->replace_point_list( gPnts, number_points, number_points ); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::get_graphics | ( | Curve * | curve_ptr, |
GMem * | gMem = NULL , |
||
double | angle_tolerance = 0 , |
||
double | distance_tolerance = 0 , |
||
double | max_edge_length = 0.0 |
||
) | const [virtual] |
Implements GeometryQueryEngine.
Definition at line 388 of file OCCQueryEngine.cpp.
{ // get the OCCCurve. OCCCurve *occ_curve_ptr = CAST_TO(curve_ptr,OCCCurve); assert (gMem); if(max_edge_length > get_sme_resabs_tolerance()) { PRINT_WARNING("OCC surface's tessilation doesn't consider edge_length.\n"); PRINT_WARNING("max_edge_length argument is ignored. \n"); } TopoDS_Edge *edge_ptr = occ_curve_ptr->get_TopoDS_Edge(); return get_graphics( edge_ptr, gMem, angle_tolerance, distance_tolerance, max_edge_length ); }
CubitStatus OCCQueryEngine::get_graphics | ( | TopoDS_Edge * | edge_ptr, |
GMem * | gMem = NULL , |
||
double | angle_tolerance = 0 , |
||
double | distance_tolerance = 0 , |
||
double | max_edge_length = 0 |
||
) | const |
Note: If the polygon is closed, the point of closure is repeated at the end of its table of nodes. Thus, on a closed triangle the function NbNodes returns 4?
Definition at line 411 of file OCCQueryEngine.cpp.
{ if (!edge_ptr) return CUBIT_FAILURE; //do tessellation if(distance_tolerance <= 0.0) distance_tolerance = 0.2; if(angle_tolerance == 0.0) angle_tolerance = 5; double angle = CUBIT_PI * angle_tolerance/180; BRepAdaptor_Curve acurve(*edge_ptr); GCPnts_TangentialDeflection *myMesh = new GCPnts_TangentialDeflection(acurve, angle, distance_tolerance); if (myMesh == NULL) { PRINT_ERROR("Can't tessellate for this curve.\n"); return CUBIT_FAILURE; } int num_points = myMesh->NbPoints(); GPoint *gPnts= new GPoint[num_points]; for (int i = 1; i <= num_points ; i ++) { gp_Pnt gp_pnt = myMesh->Value(i); GPoint gPnt; gPnt.x = gp_pnt.X(); gPnt.y = gp_pnt.Y(); gPnt.z = gp_pnt.Z(); gPnts[i-1] = gPnt; } gMem->replace_point_list( gPnts, num_points, num_points ); delete myMesh; return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::get_intersections | ( | Curve * | curve, |
CubitVector & | point1, | ||
CubitVector & | point2, | ||
DLIList< CubitVector > & | intscts, | ||
CubitBoolean | bounded, | ||
CubitBoolean | closest | ||
) | [virtual] |
Definition at line 605 of file OCCQueryEngine.cpp.
{ OCCCurve *occ_curve = CAST_TO(curve, OCCCurve); if (occ_curve == NULL) { PRINT_ERROR("Option not supported for non-occ based geometry.\n"); return CUBIT_FAILURE; } OCCPoint *pt1 = new OCCPoint(point1); OCCPoint *pt2 = new OCCPoint(point2); Curve *curve2 = OCCModifyEngine::instance()->make_Curve(pt1, pt2); if (curve2 == NULL) { PRINT_ERROR( "Unable to create OCC EDGE from points\n" ); return CUBIT_FAILURE; } OCCCurve *occ_curve2 = CAST_TO(curve2, OCCCurve); CubitStatus stat = get_intersections(occ_curve, occ_curve2, intscts, bounded, closest); delete_solid_model_entities(occ_curve2); return stat; }
CubitStatus OCCQueryEngine::get_intersections | ( | Curve * | curve1, |
Curve * | curve2, | ||
DLIList< CubitVector > & | intscts, | ||
CubitBoolean | bounded, | ||
CubitBoolean | closest | ||
) | [virtual] |
Definition at line 635 of file OCCQueryEngine.cpp.
{ //If this function has shortcomes in using BRepExtrema_DistShapeShape, //look also at IntTools_EdgeEdge. OCCCurve *occ_curve1 = CAST_TO(curve1, OCCCurve); if (occ_curve1 == NULL) { PRINT_ERROR("Option not supported for non-occ based geometry.\n"); return CUBIT_FAILURE; } OCCCurve *occ_curve2 = CAST_TO(curve2, OCCCurve); if (occ_curve2 == NULL) { PRINT_ERROR("Option not supported for non-occ based geometry.\n"); return CUBIT_FAILURE; } //currently, there's no effect on 'closest' argument or bounded. BRepExtrema_DistShapeShape distShapeShape( *(occ_curve1->get_TopoDS_Edge()), *(occ_curve2->get_TopoDS_Edge())); //distShapeShape.Perform(); if (!distShapeShape.IsDone()) { PRINT_ERROR("Cannot calculate the intersection points for the input curves.\n"); return CUBIT_FAILURE; } if (distShapeShape.Value() < get_sme_resabs_tolerance()) { int numPnt = distShapeShape.NbSolution(); for (int i = 1; i <= numPnt; i++) { gp_Pnt aPoint = distShapeShape.PointOnShape1(i); CubitVector cv(aPoint.X(), aPoint.Y(), aPoint.Z()); intscts.append(cv); } } return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::get_intersections | ( | Curve * | ref_edge, |
Surface * | ref_face, | ||
DLIList< CubitVector > & | intersection_list, | ||
CubitBoolean | bounded = CUBIT_FALSE |
||
) | [virtual] |
Definition at line 684 of file OCCQueryEngine.cpp.
{ // There's no effect of bounded = false. OCCCurve *occ_curve = CAST_TO(curve, OCCCurve); if (occ_curve == NULL) { PRINT_ERROR("Option not supported for non-occ based geometry.\n"); return CUBIT_FAILURE; } OCCSurface *occ_surface = CAST_TO(surface, OCCSurface); if (occ_surface == NULL) { PRINT_ERROR("Option not supported for non-occ based geometry.\n"); return CUBIT_FAILURE; } //currently, there's no effect on 'closest' argument or bounded. BRepExtrema_DistShapeShape distShapeShape(*(occ_curve->get_TopoDS_Edge()), *(occ_surface->get_TopoDS_Face())); //distShapeShape.Perform(); if (!distShapeShape.IsDone()) { PRINT_ERROR("Cannot calculate the intersection points for the input curve and surface.\n"); return CUBIT_FAILURE; } if (distShapeShape.Value() < get_sme_resabs_tolerance()) { int numPnt = distShapeShape.NbSolution(); for (int i = 1; i <= numPnt; i++) { gp_Pnt aPoint = distShapeShape.PointOnShape1(i); CubitVector cv(aPoint.X(), aPoint.Y(), aPoint.Z()); intscts.append(cv); } } return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::get_isoparametric_points | ( | Surface * | surface, |
int & | nu, | ||
int & | nv, | ||
GMem *& | g_mem | ||
) | const [virtual] |
Implements GeometryQueryEngine.
Definition at line 462 of file OCCQueryEngine.cpp.
{ OCCSurface* occ_surface = CAST_TO(surface, OCCSurface); TopoDS_Face* Tops_face = occ_surface->get_TopoDS_Face(); if (Tops_face == NULL) { PRINT_ERROR("This surface is not OCCSurface."); return CUBIT_FAILURE; } Handle_Geom_Surface HGeom_surface = BRep_Tool::Surface(*Tops_face); double u1, u2, v1, v2; BRepTools::UVBounds(*Tops_face, u1, u2, v1, v2); assert (nu > 1 && nv > 1); if(nu <= 1) nu = NUM_PTS_UV; if(nv <= 1) nv = NUM_PTS_UV; g_mem = new GMem[nu]; // calculate the nu curves double interval_u = (u2-u1)/double(nu-1); double interval_v = (v2 - v1)/(double)(nv - 1); for (int i = 0; i < nu; i++) { Handle_Geom_Curve HGeom_curve = HGeom_surface->UIso(u1 + i * interval_u); g_mem[i].allocate_polylines(nv-1); for (int j = 0; j < nv; j++) { gp_Pnt pnt = HGeom_curve->Value(v1 + j * interval_v); g_mem[i].point_list()[j].x = pnt.X(); g_mem[i].point_list()[j].y = pnt.Y(); g_mem[i].point_list()[j].z = pnt.Z(); } g_mem[i].pointListCount = nv; } return CUBIT_SUCCESS; }
int OCCQueryEngine::get_major_version | ( | ) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 200 of file OCCQueryEngine.cpp.
{
return OCC_VERSION_MAJOR;
}
int OCCQueryEngine::get_minor_version | ( | ) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 205 of file OCCQueryEngine.cpp.
{
return OCC_VERSION_MINOR;
}
double OCCQueryEngine::get_sme_resabs_tolerance | ( | ) | const [virtual] |
Implements GeometryQueryEngine.
Definition at line 3338 of file OCCQueryEngine.cpp.
{
return Precision::Confusion();
}
int OCCQueryEngine::get_subminor_version | ( | ) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 210 of file OCCQueryEngine.cpp.
{
return OCC_VERSION_MAINTENANCE;
}
TopoDS_Shape * OCCQueryEngine::get_TopoDS_Shape_of_entity | ( | TopologyBridge * | entity | ) |
Definition at line 793 of file OCCQueryEngine.cpp.
{ if (OCCBody * occ_body = CAST_TO( entity_ptr, OCCBody)) { TopoDS_Shape* theShape; occ_body->get_TopoDS_Shape(theShape); return theShape; } else if (OCCLump * lump_ptr = CAST_TO( entity_ptr,OCCLump)) { TopoDS_Solid * theSolid = lump_ptr->get_TopoDS_Solid(); if(theSolid) return (TopoDS_Shape*) theSolid; else { PRINT_ERROR("OCCLump without TopoDS_Solid at %s:%d.\n", __FILE__, __LINE__ ); return NULL; } } else if( OCCSurface * surface_ptr = CAST_TO( entity_ptr, OCCSurface)) { TopoDS_Face *theFace = surface_ptr->get_TopoDS_Face(); if(!theFace) { PRINT_ERROR("OCCSurface without TopoDS_Face at %s:%d.\n", __FILE__, __LINE__ ); return NULL; } return (TopoDS_Shape*) theFace; } else if( OCCCurve * curve_ptr = CAST_TO( entity_ptr, OCCCurve)) { TopoDS_Edge *theEdge = curve_ptr->get_TopoDS_Edge(); if (!theEdge) { PRINT_ERROR("OCCCurve without TopoDS_Edge at %s:%d.\n", __FILE__, __LINE__ ); return NULL; } return (TopoDS_Shape*) theEdge; } else if( OCCPoint * point_ptr = CAST_TO( entity_ptr, OCCPoint)) { TopoDS_Vertex *thePoint = point_ptr->get_TopoDS_Vertex(); if (!thePoint) { PRINT_ERROR("OCCPoint without TopoDS_Point at %s:%d.\n", __FILE__, __LINE__ ); return NULL; } return (TopoDS_Shape*) thePoint; } PRINT_ERROR("Non-OCC TopologyBridge at %s:%d.\n", __FILE__, __LINE__ ); return NULL; }
CubitStatus OCCQueryEngine::get_u_isoparametric_points | ( | Surface * | ref_face_ptr, |
double | v, | ||
int & | n, | ||
GMem *& | gMem | ||
) | const [virtual] |
Implements GeometryQueryEngine.
Definition at line 507 of file OCCQueryEngine.cpp.
{ OCCSurface* occ_surface = CAST_TO(surface, OCCSurface); TopoDS_Face* Tops_face = occ_surface->get_TopoDS_Face(); TopoDS_Face the_face; if (Tops_face == NULL) { PRINT_ERROR("This surface is not OCCSurface."); return CUBIT_FAILURE; } the_face = *Tops_face; Handle_Geom_Surface HGeom_surface = BRep_Tool::Surface(the_face); //n must be given to calculate the points. if (n <= 1) n = NUM_PTS_UV; double u1, u2, v1, v2; HGeom_surface->Bounds(u1, u2, v1, v2); double interval = (u2 - u1)/(n -1); Handle_Geom_Curve HGeom_curve = HGeom_surface->VIso(v); g_mem = new GMem; g_mem->allocate_polylines(n-1); for (int j = 0; j < n; j++) { gp_Pnt pnt = HGeom_curve->Value(u1 + j * interval); g_mem->point_list()[j].x = pnt.X(); g_mem->point_list()[j].y = pnt.Y(); g_mem->point_list()[j].z = pnt.Z(); } g_mem->pointListCount = n; return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::get_v_isoparametric_points | ( | Surface * | ref_face_ptr, |
double | u, | ||
int & | n, | ||
GMem *& | gMem | ||
) | const [virtual] |
Implements GeometryQueryEngine.
Definition at line 546 of file OCCQueryEngine.cpp.
{ OCCSurface* occ_surface = CAST_TO(surface, OCCSurface); TopoDS_Face* Tops_face = occ_surface->get_TopoDS_Face(); TopoDS_Face the_face; if (Tops_face == NULL) { PRINT_ERROR("This surface is not OCCSurface."); return CUBIT_FAILURE; } the_face = *Tops_face; Handle_Geom_Surface HGeom_surface = BRep_Tool::Surface(the_face); if (n <= 1) n = NUM_PTS_UV; double u1, u2, v1, v2; HGeom_surface->Bounds(u1, u2, v1, v2); double interval = (v2 - v1)/(n -1); Handle_Geom_Curve HGeom_curve = HGeom_surface->UIso(u); g_mem = new GMem; g_mem->allocate_polylines(n-1); for (int j = 0; j < n; j++) { gp_Pnt pnt = HGeom_curve->Value(v1 + j * interval); g_mem->point_list()[j].x = pnt.X(); g_mem->point_list()[j].y = pnt.Y(); g_mem->point_list()[j].z = pnt.Z(); } g_mem->pointListCount = n; return CUBIT_SUCCESS; }
OCCQueryEngine::Handle | ( | TDocStd_Document | ) |
CubitStatus OCCQueryEngine::import_solid_model | ( | const char * | file_name, |
Model_File_Type | file_type, | ||
DLIList< TopologyBridge * > & | imported_entities, | ||
ModelImportOptions & | import_options | ||
) | [virtual] |
R CubitStatus R- CUBIT_SUCCESS/CUBIT_FAILURE I file_ptr I- A pointer to the file to read (can be NULL for IGES and STEP files). I file_type I- Type of file.
Implements GeometryQueryEngine.
Definition at line 1511 of file OCCQueryEngine.cpp.
{ TopoDS_Shape *aShape = new TopoDS_Shape; //BRep_Builder aBuilder; if(file_type == OCC_TYPE) { Standard_Boolean result = Read(*aShape, (char*) file_name, mainLabel); if (result==0) return CUBIT_FAILURE; } #ifdef HAVE_OCC_STEP else if (file_type == STEP_TYPE) { STEPControl_Reader reader; /* char* name = "xstep.cascade.unit"; char* unit = "M"; Standard_CString orig_unit = Interface_Static::CVal(name); Interface_Static::SetCVal (name, unit); //this set is good for both step // and iges files. */ IFSelect_ReturnStatus stat = reader.ReadFile( (char*) file_name); /* //set the unit back. Interface_Static::SetCVal (name,orig_unit); */ if (stat != IFSelect_RetDone) { PRINT_INFO("%s: Cannot open file", file_name ); return CUBIT_FAILURE; } reader.TransferRoots(); *aShape = reader.OneShape(); } #endif #ifdef HAVE_OCC_IGES else if(file_type == IGES_TYPE) { IGESControl_Reader reader; /* char* name = "xstep.cascade.unit"; char* unit = "M"; Interface_Static::SetCVal (name, unit); //this set is good for both step // and iges files. */ const Standard_CString string1 = file_name; IFSelect_ReturnStatus stat = reader.ReadFile( string1); // Interface_Static::SetCVal (name, "MM"); if (stat != IFSelect_RetDone) { PRINT_INFO("%s: Cannot open file", file_name ); return CUBIT_FAILURE; } reader.TransferRoots(); *aShape = reader.OneShape(); } #endif else { PRINT_ERROR("File formats other than OCC, STEP and IGES are not supported by OCC\n"); return CUBIT_FAILURE; } //All read in shapes are wrapped inside a compound shape. Ignore this one TopoDS_Iterator it(*aShape); if(aShape->ShapeType() != TopAbs_COMPOUND) { imported_entities += populate_topology_bridge(*aShape); return CUBIT_SUCCESS; } for(;it.More();it.Next()) { TopoDS_Shape shape = it.Value(); imported_entities += populate_topology_bridge(shape); } return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::import_solid_model | ( | DLIList< TopologyBridge * > & | imported_entities, |
const char * | pBuffer, | ||
const int | n_buffer_size | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 1597 of file OCCQueryEngine.cpp.
{ TopoDS_Shape *aShape = new TopoDS_Shape; Standard_Boolean result = Read(*aShape, pBuffer, n_buffer_size, mainLabel); if (result==0) return CUBIT_FAILURE; //All read in shapes are wrapped inside a compound shape. Ignore this one TopoDS_Iterator it(*aShape); if(aShape->ShapeType() != TopAbs_COMPOUND) { imported_entities += populate_topology_bridge(*aShape); return CUBIT_SUCCESS; } for(;it.More();it.Next()) { TopoDS_Shape shape = it.Value(); imported_entities += populate_topology_bridge(shape); } return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::import_solid_model | ( | FILE * | file_ptr, |
const char * | , | ||
DLIList< TopologyBridge * > & | imported_entities, | ||
CubitBoolean | print_results = CUBIT_TRUE , |
||
const char * | logfile_name = NULL , |
||
CubitBoolean | heal_step = CUBIT_TRUE , |
||
CubitBoolean | import_bodies = CUBIT_TRUE , |
||
CubitBoolean | import_surfaces = CUBIT_TRUE , |
||
CubitBoolean | import_curves = CUBIT_TRUE , |
||
CubitBoolean | import_vertices = CUBIT_TRUE , |
||
CubitBoolean | free_surfaces = CUBIT_TRUE |
||
) | [private] |
CubitStatus OCCQueryEngine::import_temp_geom_file | ( | FILE * | file_ptr, |
const char * | file_name, | ||
Model_File_Type | file_type, | ||
DLIList< TopologyBridge * > & | bridge_list | ||
) | [virtual] |
Definition at line 1494 of file OCCQueryEngine.cpp.
{ ModelImportOptions M_O; return import_solid_model( file_name, file_type, bridge_list, M_O ); }
OCCQueryEngine * OCCQueryEngine::instance | ( | void | ) | [static] |
Definition at line 153 of file OCCQueryEngine.cpp.
{ if (instance_ == NULL ) { instance_ = new OCCQueryEngine; } return instance_; }
virtual CubitBoolean OCCQueryEngine::is_solid_modeler_type | ( | ) | const [inline, virtual] |
Definition at line 148 of file OCCQueryEngine.hpp.
{return CUBIT_FALSE;}
const char* OCCQueryEngine::modeler_type | ( | ) | [inline, virtual] |
Implements GeometryQueryEngine.
Definition at line 123 of file OCCQueryEngine.hpp.
{ return "OCC"; }
TopologyBridge * OCCQueryEngine::occ_to_cgm | ( | const TopoDS_Shape & | shape | ) |
Definition at line 2570 of file OCCQueryEngine.cpp.
{ if(!OCCMap->IsBound(shape)) return (TopologyBridge*) NULL; int k = OCCMap->Find(shape); return (OccToCGM->find(k))->second; }
DLIList< TopologyBridge * > OCCQueryEngine::populate_topology_bridge | ( | TopoDS_Shape & | aShape | ) |
Definition at line 1630 of file OCCQueryEngine.cpp.
{ DLIList<TopologyBridge*> tblist; // suitable to populate for a TopoDS_Compound shape. if ( aShape.ShapeType() == TopAbs_COMPOUND) tblist.append(populate_topology_bridge(TopoDS::Compound(aShape))); else if(aShape.ShapeType() == TopAbs_SOLID) { Lump *lump = populate_topology_bridge(TopoDS::Solid(aShape), CUBIT_TRUE); tblist.append(CAST_TO(lump, OCCLump)->get_body()); } else if(aShape.ShapeType() == TopAbs_SHELL) { OCCShell* shell = populate_topology_bridge(TopoDS::Shell(aShape), CUBIT_TRUE); tblist.append(shell->my_body()); } else if(aShape.ShapeType() == TopAbs_FACE) { Surface* face = populate_topology_bridge(TopoDS::Face(aShape), CUBIT_TRUE); if(face) tblist.append(CAST_TO(face, OCCSurface)->my_body()); } else if(aShape.ShapeType() == TopAbs_WIRE) populate_topology_bridge(TopoDS::Wire(aShape), CUBIT_TRUE); else if(aShape.ShapeType() == TopAbs_EDGE) tblist.append(populate_topology_bridge(TopoDS::Edge(aShape),CUBIT_TRUE)); else if(aShape.ShapeType() == TopAbs_VERTEX) tblist.append(populate_topology_bridge(TopoDS::Vertex(aShape), CUBIT_TRUE)); else PRINT_ERROR("Wrong topology type is given. \n"); tblist.remove_all_with_value(NULL); return tblist; }
BodySM * OCCQueryEngine::populate_topology_bridge | ( | const TopoDS_Compound & | aShape | ) |
Definition at line 1673 of file OCCQueryEngine.cpp.
{ if(aShape.IsNull()) return (BodySM*)NULL; OCCBody *body = (OCCBody*)NULL; if (!OCCMap->IsBound(aShape) || OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end()) { //check to see if this compound has only one lump which is already in //in another body. Unite operation will return a one lump compound. //Check also if this compound has only shells. which is or has faces that //are already in another body. Unite faces will return such shell. TopExp_Explorer Ex; int num_lumps = 0, num_shells = 0, num_faces = 0; TopoDS_Solid solid; for (Ex.Init(aShape, TopAbs_SOLID); Ex.More(); Ex.Next()) { num_lumps++; solid = TopoDS::Solid(Ex.Current()); } TopoDS_Shell shell; for (Ex.Init(aShape, TopAbs_SHELL, TopAbs_SOLID); Ex.More(); Ex.Next()) { num_shells++; shell = TopoDS::Shell(Ex.Current()); } TopoDS_Face face; for (Ex.Init(aShape, TopAbs_FACE, TopAbs_SHELL); Ex.More(); Ex.Next()) { num_faces++; face = TopoDS::Face(Ex.Current()); } if(num_faces + num_shells + num_lumps == 1) { if (num_faces == 1 && (!OCCMap->IsBound(face) || OccToCGM->find(OCCMap->Find(face)) == OccToCGM->end())) { Surface* surface = populate_topology_bridge(face, CUBIT_TRUE); return CAST_TO(surface, OCCSurface)->my_body(); } else if (num_shells == 1 && (!OCCMap->IsBound(shell)|| OccToCGM->find(OCCMap->Find(shell)) == OccToCGM->end())) { OCCShell* occ_shell = populate_topology_bridge(shell, CUBIT_TRUE); return occ_shell->my_body(); } else if( num_lumps == 1 && (!OCCMap->IsBound(solid) || OccToCGM->find(OCCMap->Find(solid)) == OccToCGM->end())) { Lump* lump= populate_topology_bridge(solid, CUBIT_TRUE); return CAST_TO(lump, OCCLump)->get_body(); } else //find existing body { int k; if(num_lumps == 1) { k = OCCMap->Find(solid); OCCLump* lump = (OCCLump*)(OccToCGM->find(k))->second; body = CAST_TO(lump->get_body(), OCCBody); } else if (num_shells == 1) { k = OCCMap->Find(shell); OCCShell* occ_shell = (OCCShell*)(OccToCGM->find(k))->second; body = occ_shell->my_body(); } else { k = OCCMap->Find(face); OCCSurface* occ_surface = (OCCSurface*) (OccToCGM->find(k))->second; body = occ_surface->my_body(); } } } else { TopoDS_Compound *comsolid = new TopoDS_Compound; *comsolid = aShape; body = new OCCBody(comsolid); int current_id; if(!OCCMap->IsBound(aShape)) { iTotalTBCreated++; current_id = iTotalTBCreated; OCCMap->Bind(aShape, current_id); } else current_id = OCCMap->Find(aShape); OccToCGM->insert(valType(current_id, (TopologyBridge*)body)); BodyList->append(body); } } else { int k = OCCMap->Find(aShape); body = (OCCBody*)(OccToCGM->find(k))->second; TopoDS_Compound compound = aShape; body->set_TopoDS_Shape(compound); } TopExp_Explorer Ex; DLIList<Lump*> lumps; for (Ex.Init(aShape, TopAbs_SOLID); Ex.More(); Ex.Next()) { TopoDS_Shape sh = Ex.Current(); Lump* lump = populate_topology_bridge(TopoDS::Solid(sh)); lumps.append(lump); CAST_TO(lump, OCCLump)->add_body(body); //add the solid shape into map TopoDS_Shape parent = aShape; int current_id; add_shape_to_map(sh, parent, current_id); if(!OCCMap->IsBound(sh) || OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end()) OccToCGM->insert(valType(current_id, (TopologyBridge*)lump)); } body->lumps(lumps); DLIList<OCCShell*> shells; for (Ex.Init(aShape, TopAbs_SHELL, TopAbs_SOLID);Ex.More(); Ex.Next()) { TopoDS_Shape sh = Ex.Current(); OCCShell * shell = populate_topology_bridge(TopoDS::Shell(sh)); OCCLump* lump = shell->my_lump(); if(lump == (OCCLump*)NULL) lump = new OCCLump(NULL, NULL, shell); lumps.append(lump); lump->add_body(body); shell->set_body(body); shell->set_lump(lump); shells.append(shell); TopoDS_Shape parent = aShape; int current_id; add_shape_to_map(sh, parent, current_id); if(!OCCMap->IsBound(sh) || OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end()) OccToCGM->insert(valType(current_id, (TopologyBridge*)shell)); } body->shells(shells); DLIList<OCCSurface*> surfaces; for (Ex.Init(aShape, TopAbs_FACE, TopAbs_SHELL);Ex.More(); Ex.Next()) { TopoDS_Shape sh = Ex.Current(); Surface* face = populate_topology_bridge(TopoDS::Face(sh)); OCCSurface *surface = CAST_TO(face, OCCSurface); OCCShell* shell = surface->my_shell(); if (shell == (OCCShell*) NULL) shell = new OCCShell(NULL, surface); OCCLump* lump = surface->my_lump(); if(lump == (OCCLump*) NULL) lump = new OCCLump(NULL, surface); lumps.append(lump); lump->add_body(body); surface->set_body(body); surface->set_lump(lump); surface->set_shell(shell); shell->set_body(body); shell->set_lump(lump); TopoDS_Shape parent = aShape; surfaces.append(surface); int current_id; add_shape_to_map(sh, parent, current_id); if(!OCCMap->IsBound(sh) || OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end()) OccToCGM->insert(valType(current_id, (TopologyBridge*)face)); } body->set_sheet_surfaces(surfaces); return body; }
Lump * OCCQueryEngine::populate_topology_bridge | ( | const TopoDS_Solid & | aShape, |
CubitBoolean | build_body = CUBIT_FALSE |
||
) |
Definition at line 1853 of file OCCQueryEngine.cpp.
{ if(aShape.IsNull()) return (Lump*)NULL; OCCLump *lump = NULL; OCCBody *body = NULL; int current_lump_number = 0; if (!OCCMap->IsBound(aShape) || OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end()) { TopoDS_Solid *posolid = new TopoDS_Solid; *posolid = aShape; lump = new OCCLump(posolid); if (build_body) { if(OCCMap->IsBound(aShape)) current_lump_number = OCCMap->Find(aShape); else { iTotalTBCreated++; current_lump_number = iTotalTBCreated; } body = new OCCBody(NULL, NULL, NULL, lump); DLIList<CubitSimpleAttrib> csa_list; lump->get_simple_attribute(csa_list); //if there's body attribute, append it to body and delete it from lump. for(int i = 0; i < csa_list.size(); i++) { const CubitSimpleAttrib& csa = csa_list.get_and_step(); CubitString type = csa.string_data_list()[0]; CubitString subtype = type.substr(0,12); if(subtype == "#SINGLELUMP%") { lump->remove_simple_attribute_virt(csa); CubitSimpleAttrib copy = csa; copy.string_data_list().erase(copy.string_data_list().begin()); body->append_simple_attribute_virt(copy); } } BodyList->append(body); lump->add_body(body); } } else { int k = OCCMap->Find(aShape); lump = (OCCLump*)(OccToCGM->find(k))->second; lump->set_TopoDS_Solid(aShape); body = static_cast<OCCBody*>(lump->get_body()); TopoDS_Shape *b_shape = NULL; if(body) body->get_TopoDS_Shape(b_shape); if (!body || b_shape == NULL) { if(body) BodyList->remove(body); body = new OCCBody(NULL, NULL, NULL, lump); BodyList->append(body); lump->add_body(body); } } TopoDS_Compound *shape = NULL; if(body) shape = body->get_TopoDS_Shape(); if(build_body && OCCMap->IsBound(aShape) && shape && !shape->IsNull()) { PRINT_ERROR("Single lump body shouldn't have Compound shape.\n"); return (Lump*) NULL; } TopExp_Explorer Ex; for (Ex.Init(aShape, TopAbs_SHELL); Ex.More(); Ex.Next()) { TopoDS_Shape sh = Ex.Current(); OCCShell* shell = populate_topology_bridge(TopoDS::Shell(sh)); shell->set_lump(lump); shell->set_body(body); TopoDS_Shape parent = aShape; int current_id; add_shape_to_map(sh, parent, current_id); if(!OCCMap->IsBound(sh) || OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end()) OccToCGM->insert(valType(current_id, (TopologyBridge*)shell)); } if(build_body && (!OCCMap->IsBound(aShape)|| OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end())) { if (!OCCMap->IsBound(aShape)) OCCMap->Bind(aShape, current_lump_number); OccToCGM->insert(valType(current_lump_number, (TopologyBridge*)lump)); } return lump; }
Surface * OCCQueryEngine::populate_topology_bridge | ( | const TopoDS_Face & | aShape, |
CubitBoolean | build_body = CUBIT_FALSE |
||
) |
Definition at line 2117 of file OCCQueryEngine.cpp.
{ if(aShape.IsNull()) return (Surface*)NULL; OCCSurface *surface = NULL; GProp_GProps myProps; BRepGProp::SurfaceProperties(aShape, myProps); double area = myProps.Mass(); double tol = get_sme_resabs_tolerance(); if(area < tol * tol && area > 0.) PRINT_WARNING("Generated a sliver surface. \n"); else if (area < 0.0) PRINT_WARNING("Generated a negative area surface. \n"); if (!OCCMap->IsBound(aShape) || OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end()) { TopoDS_Face *poface = new TopoDS_Face; *poface = aShape; surface = new OCCSurface(poface); SurfaceList->append(surface); surface->set_body(NULL); surface->set_lump(NULL); surface->set_shell(NULL); if(build_body) { OCCShell* shell = new OCCShell(NULL, surface); OCCLump* lump = new OCCLump(NULL, surface); OCCBody* body = new OCCBody(NULL, surface); surface->set_body(body); surface->set_lump(lump); surface->set_shell(shell); shell->set_body(body); shell->set_lump(lump); BodyList->append(body); int k; if(!OCCMap->IsBound(aShape)) { iTotalTBCreated++; k = iTotalTBCreated; OCCMap->Bind(*poface, iTotalTBCreated); } else k = OCCMap->Find(aShape); OccToCGM->insert(valType(k, (TopologyBridge*)surface)); } } else { int k = OCCMap->Find(aShape); surface = (OCCSurface*)(OccToCGM->find(k))->second; TopoDS_Face aFace(aShape); surface->set_TopoDS_Face(aFace); } TopExp_Explorer Ex; for (Ex.Init(aShape.Oriented(TopAbs_FORWARD), TopAbs_WIRE); Ex.More(); Ex.Next()) { TopoDS_Shape sh = Ex.Current(); OCCLoop* loop = populate_topology_bridge(TopoDS::Wire(sh)); /* if( aShape.Orientation() == TopAbs_REVERSED ) { DLIList<OCCCoEdge*> coedges_new = loop->coedges(); coedges_new.reverse(); //Reverse all coedges' senses. for (int i = 0; i < coedges_new.size(); i ++) { OCCCoEdge* coedge = coedges_new.get_and_step(); CubitSense sense = (coedge->sense() == CUBIT_FORWARD ? CUBIT_REVERSED : CUBIT_FORWARD); coedge->set_sense(sense); } loop->coedges(coedges_new); } */ TopoDS_Shape parent = aShape; int current_id; add_shape_to_map(sh, parent, current_id); if(!OCCMap->IsBound(sh) || OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end()) OccToCGM->insert(valType(current_id, (TopologyBridge*)loop)); } return surface; }
Curve * OCCQueryEngine::populate_topology_bridge | ( | const TopoDS_Edge & | aShape, |
CubitBoolean | stand_along = CUBIT_FALSE |
||
) |
Definition at line 2443 of file OCCQueryEngine.cpp.
{ if(aShape.IsNull()) return (Curve*)NULL; Curve *curve; GProp_GProps myProps; BRepGProp::LinearProperties(aShape, myProps); double length = myProps.Mass(); TopExp_Explorer Ex; if(length < get_sme_resabs_tolerance()) { //check if the two vertices are acctually the same point. CubitVector v[2]; int i = 0; for (Ex.Init(aShape, TopAbs_VERTEX); Ex.More(); Ex.Next()) { TopoDS_Vertex vt = TopoDS::Vertex(Ex.Current()); gp_Pnt pt = BRep_Tool::Pnt(vt); v[i] = CubitVector(pt.X(), pt.Y(), pt.Z()); i++; } if(v[0] == v[1]) return (Curve*) NULL; else PRINT_WARNING("Generated a sliver curve. \n"); } if (!OCCMap->IsBound(aShape) || OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end()) { TopoDS_Edge *poedge = new TopoDS_Edge; *poedge = aShape; curve = new OCCCurve(poedge); CurveList->append((OCCCurve*)curve); if(stand_along) { int k; if(!OCCMap->IsBound(aShape)) { iTotalTBCreated++; k = iTotalTBCreated; OCCMap->Bind(*poedge, iTotalTBCreated); } else k = OCCMap->Find(aShape); OccToCGM->insert(valType(k, (TopologyBridge*)curve)); } } else { int i = OCCMap->Find(aShape); curve = (Curve*)(OccToCGM->find(i))->second; CAST_TO(curve, OCCCurve)->set_TopoDS_Edge(aShape); } for (Ex.Init(aShape, TopAbs_VERTEX); Ex.More(); Ex.Next()) { TopoDS_Shape sh = Ex.Current(); /* bool alreadyWrapped=false; if(OCCMap->IsBound(sh)) { alreadyWrapped=true; }*/ TBPoint* point = populate_topology_bridge(TopoDS::Vertex(Ex.Current())); CAST_TO(point, OCCPoint)->add_curve(CAST_TO(curve, OCCCurve)); TopoDS_Shape parent = aShape; int current_id; add_shape_to_map(sh, parent, current_id); if(!OCCMap->IsBound(sh) || OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end()) OccToCGM->insert(valType(current_id, (TopologyBridge*)point)); /* if(alreadyWrapped) PRINT_INFO("Vertex Already Wrapped: "); else PRINT_INFO("Vertex Wrapped: "); PRINT_INFO(" Shape ID = %d", OCCMap->Find(sh) ); PRINT_INFO(" TBPoint Address: %p", point ); PRINT_INFO(" Shape Orientation: %s\n", sh.Orientation()==TopAbs_FORWARD ? "Forward" : "Reversed" ); */ } return curve; }
TBPoint * OCCQueryEngine::populate_topology_bridge | ( | const TopoDS_Vertex & | aShape, |
CubitBoolean | stand_along = CUBIT_FALSE |
||
) |
Definition at line 2534 of file OCCQueryEngine.cpp.
{ if(aShape.IsNull()) return (TBPoint*)NULL; OCCPoint *point; if (iTotalTBCreated == 0 || !OCCMap->IsBound(aShape) || OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end()) { TopoDS_Vertex *povertex = new TopoDS_Vertex; *povertex = aShape; point = new OCCPoint(povertex); if(stand_along) { int k; if(!OCCMap->IsBound(aShape)) { iTotalTBCreated++; k = iTotalTBCreated; OCCMap->Bind(*povertex, iTotalTBCreated); } else k = OCCMap->Find(aShape); OccToCGM->insert(valType(k, (TopologyBridge*)point)); } } else { int i = OCCMap->Find(aShape); point = (OCCPoint*)(OccToCGM->find(i))->second; point->set_TopoDS_Vertex(aShape); } return point; }
OCCShell * OCCQueryEngine::populate_topology_bridge | ( | const TopoDS_Shell & | aShape, |
CubitBoolean | standalone = CUBIT_FALSE |
||
) |
Definition at line 2015 of file OCCQueryEngine.cpp.
{ if(aShape.IsNull()) return (OCCShell*)NULL; OCCShell *shell ; if (!OCCMap->IsBound(aShape) || OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end()) { if(standalone) { //check if just has one Face,if so, don't make new shell. TopExp_Explorer Ex; int num_faces = 0; TopoDS_Face topo_face; for (Ex.Init(aShape, TopAbs_FACE); Ex.More(); Ex.Next()) { topo_face = TopoDS::Face(Ex.Current()); num_faces++; } if(num_faces == 1) { Surface* face = populate_topology_bridge(topo_face, standalone); return CAST_TO(face, OCCSurface)->my_shell(); } } TopoDS_Shell *poshell = new TopoDS_Shell; *poshell = aShape; shell = new OCCShell(poshell); shell->set_body(NULL); shell->set_lump(NULL); if(standalone) { OCCLump* lump = new OCCLump(NULL, NULL, shell); OCCBody* body = new OCCBody(NULL, NULL, shell); BodyList->append(body); shell->set_body(body); shell->set_lump(lump); int k; if(!OCCMap->IsBound(aShape)) { iTotalTBCreated++; k = iTotalTBCreated; OCCMap->Bind(*poshell, k); } else k = OCCMap->Find(aShape); OccToCGM->insert(valType(k, (TopologyBridge*)shell)); } } else { int k = OCCMap->Find(aShape); shell = (OCCShell*)(OccToCGM->find(k))->second; shell->set_TopoDS_Shell(aShape); } DLIList<OCCSurface*> memberSurfaces; TopExp_Explorer Ex; for (Ex.Init(aShape, TopAbs_FACE); Ex.More(); Ex.Next()) { TopoDS_Shape sh = Ex.Current(); TopoDS_Face topo_face = TopoDS::Face(sh); Surface* face = populate_topology_bridge(topo_face, CUBIT_FALSE); TopoDS_Shape parent = aShape; int current_id; add_shape_to_map(sh, parent, current_id); if(!OCCMap->IsBound(sh) || OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end()) OccToCGM->insert(valType(current_id, (TopologyBridge*)face)); if(!face) continue; OCCSurface *occ_surface = CAST_TO(face, OCCSurface); //check if surface was a sheet surface, delete it if so if(occ_surface->my_shell() != NULL && occ_surface->my_shell() != shell) { //if Sheet_body, delete this sheet body OCCBody* occ_body = occ_surface->my_body(); if(occ_body != NULL) { delete_solid_model_entities(occ_body); face = populate_topology_bridge(topo_face, CUBIT_FALSE); if(!face) continue; occ_surface = CAST_TO(face, OCCSurface); shell->set_sheet_surface(occ_surface); } } memberSurfaces.append(occ_surface); occ_surface->set_shell(shell); } shell->setMemberSurfaces(memberSurfaces); return shell; }
OCCLoop * OCCQueryEngine::populate_topology_bridge | ( | const TopoDS_Wire & | aShape, |
CubitBoolean | standalone = CUBIT_FALSE |
||
) | [private] |
Definition at line 2208 of file OCCQueryEngine.cpp.
{ if(aShape.IsNull()) return (OCCLoop*)NULL; BRepTools_WireExplorer Ex; OCCLoop *loop ; if (!OCCMap->IsBound(aShape) || OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end()) { TopoDS_Wire *powire = new TopoDS_Wire; *powire = aShape; loop = new OCCLoop(powire); if(standalone) { int k; if(!OCCMap->IsBound(aShape)) { iTotalTBCreated++; k = iTotalTBCreated; OCCMap->Bind(aShape, iTotalTBCreated); } else k = OCCMap->Find(aShape); OccToCGM->insert(valType(k, (TopologyBridge*)loop)); WireList->append(loop); } } else { int k = OCCMap->Find(aShape); loop = (OCCLoop*)(OccToCGM->find(k))->second; loop->set_TopoDS_Wire(aShape); } CubitVector v; DLIList <OCCCoEdge*> coedges_old, coedges_new; coedges_old = loop->coedges(); for (Ex.Init(aShape); Ex.More(); Ex.Next()) { const TopoDS_Edge& anEdgeForPop = Ex.Current(); TopoDS_Shape crv = anEdgeForPop; Curve* curve = populate_topology_bridge(anEdgeForPop); if(!curve) continue; TopoDS_Shape parent = aShape; int current_id; add_shape_to_map(crv, parent, current_id); if(!OCCMap->IsBound(crv) || OccToCGM->find(OCCMap->Find(crv)) == OccToCGM->end()) OccToCGM->insert(valType(current_id, (TopologyBridge*)curve)); OCCCurve *occ_curve = CAST_TO(curve, OCCCurve); DLIList<OCCLoop*> loops = occ_curve->loops(); CubitBoolean exist = CUBIT_FALSE; OCCCoEdge * coedge = NULL; int size = coedges_old.size(); CubitSense sense = (crv.Orientation() == TopAbs_FORWARD ? CUBIT_FORWARD : CUBIT_REVERSED); //for the cylinder side face, there are 4 coedges, 2 of them are seam //edges and should have opposite sense. for(int i = 0; i < coedges_new.size(); i++) { coedge = coedges_new.get_and_step(); Curve* test_c = coedge->curve(); if(test_c == curve) { if(sense == coedge->sense()) sense = (sense == CUBIT_FORWARD ? CUBIT_REVERSED : CUBIT_FORWARD); break; } } for(int i = 0; i < size; i++) { coedge = coedges_old.get_and_step(); if(coedge->curve() == curve && coedge->sense() == sense) { coedge->set_mark(1); exist = CUBIT_TRUE; coedge->set_sense(sense); coedges_new.append(coedge); break; } } if(!exist ) { //search through the curve loops for(int i = 0; i < loops.size() ; i++) { OCCLoop* occ_loop = loops.get_and_step(); TopoDS_Wire* wire = occ_loop->get_TopoDS_Wire(); if (size > 0 && (wire->IsNull() || !OCCMap->IsBound(*wire))) { DLIList<OCCCoEdge*> coedge_list = occ_loop->coedges(); for(int j = 0; j < coedge_list.size(); j++) { OCCCoEdge * test_coedge = coedge_list.get_and_step(); occ_loop->remove_coedge(test_coedge); occ_curve->remove_loop(occ_loop); delete test_coedge; } if(!wire->IsNull()) wire->Nullify(); WireList->remove(occ_loop); } } if(occ_curve->loops().size() == 2) { // If there are some assumptions made about manifold geometry . . . //there must be a loop which doesn't have this curve anymore //this is been found in subtract cases while one solid becomes //2 solid, and one face becomes two faces. One face uses/updates //the old face while the other face generates face and wire from //new. However, in order to uses the curves, the old curve is kept //as possible, so curve's loops get kept, but since it's going to //associate with new loop, the old loop should be removed from the //loop list. DLIList<OCCLoop*> old_loops = occ_curve->loops(); for (int i = 0; i < 2; i++) { int found = 0; OCCLoop* old_loop = old_loops.get_and_step(); TopoDS_Wire* thewire = old_loop->get_TopoDS_Wire(); if (thewire < (void*) 0x1000 || thewire->IsNull()) { found = 1; break; } DLIList<OCCCoEdge*> test_coedges = old_loop->coedges(); for(int j = 0; j < test_coedges.size() ; j++) { if(test_coedges.get()->curve() != curve) test_coedges.step(); else { found = 1; break; } } if(!found) occ_curve->remove_loop(old_loop); } } //for unite case, it's possible that the a curve has 3 coedges because //opencascade do not perform unite on surfaces. coedge = new OCCCoEdge( curve, loop, sense); coedges_new.append(coedge); occ_curve->add_loop(loop); } } //Double check edge sense to make sure it consists with loop direction //coedges size = 2 case is checked in the face level so the face normal will //be considered. if(coedges_new.size() > 2) { OCCCoEdge* coedge = coedges_new.get_and_step(); double d1, d1_, d2, d2_; OCCCoEdge* next_coedge = coedges_new.get(); //because of tolerance issue, now check current loop end vertices distance //compared with reversed loop's end vertices distance, which ever shorter //will be the direction. //current loop's parameter not using " _ ", reversed loop's parameter //uses " _ ". if (coedge->sense() == CUBIT_FORWARD) { d1 = coedge->curve()->end_param(); d1_ = coedge->curve()->start_param(); } else { d1 = coedge->curve()->start_param(); d1_ = coedge->curve()->end_param(); } if( next_coedge->sense() == CUBIT_FORWARD) { d2_ = next_coedge->curve()->end_param(); d2 = next_coedge->curve()->start_param(); } else { d2 = next_coedge->curve()->end_param(); d2_ = next_coedge->curve()->start_param(); } CubitVector v1, v1_, v2, v2_; coedge->curve()->position_from_u(d1, v1); coedge->curve()->position_from_u(d1_, v1_); next_coedge->curve()->position_from_u(d2, v2); next_coedge->curve()->position_from_u(d2_, v2_); if(v1.distance_between(v2) > v1_.distance_between(v2_)) { //Reverse all coedges' senses. for (int i = 0; i < coedges_new.size(); i ++) { coedge = coedges_new.get_and_step(); CubitSense sense = (coedge->sense() == CUBIT_FORWARD ? CUBIT_REVERSED : CUBIT_FORWARD); coedge->set_sense(sense); } } } /* if(aShape.Orientation() == TopAbs_REVERSED) coedges_new.reverse(); //Reverse all coedges' senses. for (int i = 0; i < coedges_new.size(); i ++) { OCCCoEdge* coedge = coedges_new.get_and_step(); CubitSense sense = (coedge->sense() == CUBIT_FORWARD ? CUBIT_REVERSED : CUBIT_FORWARD); coedge->set_sense(sense); } */ loop->coedges(coedges_new); //remove unused coedges for(int i = 0; i < coedges_old.size(); i++) { OCCCoEdge *coedge = coedges_old.get_and_step(); if(coedge->get_mark() == 0) delete coedge; else coedge->set_mark(0); } return loop; }
CubitBoolean OCCQueryEngine::Read | ( | TopoDS_Shape & | Shapes, |
const Standard_CString | File, | ||
TDF_Label | label | ||
) | [private] |
Definition at line 1455 of file OCCQueryEngine.cpp.
{ ifstream in( File ); if (in.fail()) { PRINT_INFO("%s: Cannot open file", File ); return CUBIT_FAILURE; } OCCShapeAttributeSet SS; SS.Read(in, CUBIT_TRUE); int nbshapes = SS.NbShapes(); if(!nbshapes) return CUBIT_FALSE; SS.Read(Sh,in,nbshapes, &label); return CUBIT_TRUE; }
CubitBoolean OCCQueryEngine::Read | ( | TopoDS_Shape & | Sh, |
const char * | pBuffer, | ||
const int | n_buffer_size, | ||
TDF_Label | label | ||
) | [private] |
Definition at line 1473 of file OCCQueryEngine.cpp.
{ // make buffer as input stream std::stringbuf sb; std::iostream is(&sb); is.write(pBuffer, n_buffer_size); // read from input stream OCCShapeAttributeSet SS; SS.Read(is, false); int nbshapes = SS.NbShapes(); if (!nbshapes) return CUBIT_FALSE; SS.Read(Sh, is, nbshapes, &label); return CUBIT_TRUE; }
CubitStatus OCCQueryEngine::reflect | ( | BodySM * | body, |
const CubitVector & | axis | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 235 of file OCCQueryEngine.cpp.
{ OCCBody *body = CAST_TO(bodysm, OCCBody); if (!body) { PRINT_ERROR("Attempt to reflect OCC-based geometry Body. This body is not OCCBody."); return CUBIT_FAILURE; } body->reflect( axis.x(), axis.y(), axis.z() ); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::reflect | ( | GeometryEntity * | ent, |
const CubitVector & | axis | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 3636 of file OCCQueryEngine.cpp.
{ TopoDS_Shape * shape; if ((shape = get_TopoDS_Shape_of_entity(entity)) == NULL) { PRINT_ERROR( "problem occured getting OCC entity.\n" " Aborting.\n" ); return CUBIT_FAILURE; } gp_Pnt aOrigin(0,0,0); gp_Dir aDir(v.x(), v.y(), v.z()); gp_Ax2 anAx2(aOrigin, aDir); gp_Trsf aTrsf; aTrsf.SetMirror(anAx2); BRepBuilderAPI_Transform aBRepTrsf(*shape, aTrsf); update_entity_shape(entity, &aBRepTrsf); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::restore_transform | ( | BodySM * | body | ) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 3480 of file OCCQueryEngine.cpp.
{ return CUBIT_FAILURE; }
CubitStatus OCCQueryEngine::rotate | ( | BodySM * | body, |
const CubitVector & | axis, | ||
double | angle | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 3490 of file OCCQueryEngine.cpp.
{ // a is in degree. OCCBody* occ_bod = dynamic_cast<OCCBody*>(body); a *= CUBIT_PI/180; return occ_bod ? occ_bod->rotate( v.x(), v.y(), v.z(), a ) : CUBIT_FAILURE; }
CubitStatus OCCQueryEngine::rotate | ( | GeometryEntity * | ent, |
const CubitVector & | axis, | ||
double | degrees | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 3571 of file OCCQueryEngine.cpp.
{ TopoDS_Shape * shape; if ((shape = get_TopoDS_Shape_of_entity(entity)) == NULL) { PRINT_ERROR( "problem occured getting OCC entity.\n" " Aborting.\n" ); return CUBIT_FAILURE; } gp_Pnt aOrigin(0,0,0); gp_Dir aDir(v.x(), v.y(), v.z()); gp_Ax1 anAxis(aOrigin, aDir); //a is angular value of rotation in radians gp_Trsf aTrsf; aTrsf.SetRotation(anAxis, a); BRepBuilderAPI_Transform aBRepTrsf(*shape, aTrsf); update_entity_shape(entity, &aBRepTrsf); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::save_temp_geom_file | ( | DLIList< TopologyBridge * > & | ref_entity_list, |
const char * | filename, | ||
const CubitString & | cubit_version, | ||
CubitString & | created_file, | ||
CubitString & | created_file_type | ||
) | [virtual] |
Saves out a temporary geometry file. Entities in list must all be of same modeling engine.
Implements GeometryQueryEngine.
Definition at line 864 of file OCCQueryEngine.cpp.
{ int size_before = ref_entity_list.size(); CubitString temp_filename(file_name); temp_filename += ".occ"; ModelExportOptions M_O; if( export_solid_model( ref_entity_list, temp_filename.c_str(), OCC_TYPE, cubit_version, M_O ) == CUBIT_FAILURE ) { PRINT_ERROR( "Error occured while trying to save temporary OCC_BASED_GEOMETRY file\n"); return CUBIT_FAILURE; } int size_after = ref_entity_list.size(); if( size_before > size_after ) { created_file += temp_filename; created_file_type += "OCC"; } return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::scale | ( | BodySM * | body, |
double | factor | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 3497 of file OCCQueryEngine.cpp.
{ OCCBody* facetbod = dynamic_cast<OCCBody*>(body); return facetbod ? facetbod->scale( factor ) : CUBIT_FAILURE; }
CubitStatus OCCQueryEngine::scale | ( | BodySM * | body, |
const CubitVector & | factors | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 3502 of file OCCQueryEngine.cpp.
{ OCCBody* facetbod = dynamic_cast<OCCBody*>(body); return facetbod ? facetbod->scale( f.x(), f.y(), f.z() ) : CUBIT_FAILURE; }
CubitStatus OCCQueryEngine::scale | ( | GeometryEntity * | ent, |
double | factor | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 3595 of file OCCQueryEngine.cpp.
{ TopoDS_Shape * shape; if ((shape = get_TopoDS_Shape_of_entity(entity)) == NULL) { PRINT_ERROR( "problem occured getting OCC entity.\n" " Aborting.\n" ); return CUBIT_FAILURE; } gp_Trsf aTrsf; aTrsf.SetScaleFactor(f); BRepBuilderAPI_Transform aBRepTrsf(*shape, aTrsf); update_entity_shape(entity, &aBRepTrsf); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::scale | ( | GeometryEntity * | ent, |
const CubitVector & | factors | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 3613 of file OCCQueryEngine.cpp.
{ TopoDS_Shape * shape; if ((shape = get_TopoDS_Shape_of_entity(entity)) == NULL) { PRINT_ERROR( "problem occured getting OCC entity.\n" " Aborting.\n" ); return CUBIT_FAILURE; } gp_GTrsf gTrsf; gTrsf.SetValue(1,1, v.x()); gTrsf.SetValue(2,2, v.y()); gTrsf.SetValue(3,3, v.z()); BRepBuilderAPI_GTransform gBRepTrsf(gTrsf); gBRepTrsf.Perform(*shape); update_entity_shape(entity, &gBRepTrsf); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::set_dbl_option | ( | const char * | opt_name, |
double | val | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 3357 of file OCCQueryEngine.cpp.
{ PRINT_ERROR("OCCQueryEngine::set_dbl_option not yet implemented.\n"); return CUBIT_FAILURE; }
CubitStatus OCCQueryEngine::set_int_option | ( | const char * | opt_name, |
int | val | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 3351 of file OCCQueryEngine.cpp.
{ PRINT_ERROR("OCCQueryEngine::set_int_option not yet implemented.\n"); return CUBIT_FAILURE; }
double OCCQueryEngine::set_sme_resabs_tolerance | ( | double | new_resabs | ) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 3344 of file OCCQueryEngine.cpp.
{ double old_p = get_sme_resabs_tolerance(); BRepBuilderAPI::Precision(p); return old_p; }
CubitStatus OCCQueryEngine::set_str_option | ( | const char * | opt_name, |
const char * | val | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 3363 of file OCCQueryEngine.cpp.
{ PRINT_ERROR("OCCQueryEngine::set_str_option not yet implemented.\n"); return CUBIT_FAILURE; }
void OCCQueryEngine::set_TopoDS_Shape | ( | TopologyBridge * | tb, |
TopoDS_Shape & | new_shape | ||
) |
Definition at line 4031 of file OCCQueryEngine.cpp.
{ BodySM* body = CAST_TO(tb, BodySM); if(body) return CAST_TO(body, OCCBody)->set_TopoDS_Shape(TopoDS::Compound(shape)); Lump* lump = CAST_TO(tb, Lump); if(lump) return CAST_TO(lump, OCCLump)->set_TopoDS_Solid(TopoDS::Solid(shape)); ShellSM* shell = CAST_TO(tb, ShellSM); if(shell) return CAST_TO(shell, OCCShell)->set_TopoDS_Shell(TopoDS::Shell(shape)); Surface* surface = CAST_TO(tb, Surface); if (surface) return CAST_TO(surface, OCCSurface)->set_TopoDS_Face(TopoDS::Face(shape)); LoopSM* loop = CAST_TO(tb, LoopSM); if(loop) return CAST_TO(loop, OCCLoop)->set_TopoDS_Wire(TopoDS::Wire(shape)); Curve* curve = CAST_TO(tb, Curve); if (curve) return CAST_TO(curve, OCCCurve)->set_TopoDS_Edge(TopoDS::Edge(shape)); TBPoint* point = CAST_TO(tb, TBPoint); if(point) return CAST_TO(point, OCCPoint)->set_TopoDS_Vertex(TopoDS::Vertex(shape)); }
CubitStatus OCCQueryEngine::transform_vec_position | ( | CubitVector const & | , |
BodySM * | , | ||
CubitVector & | |||
) | const [virtual] |
Implements GeometryQueryEngine.
Definition at line 589 of file OCCQueryEngine.cpp.
{ //Nobody is using this function in yet. PRINT_ERROR("Option not supported for OCC based geometry.\n"); return CUBIT_FAILURE; }
CubitStatus OCCQueryEngine::translate | ( | BodySM * | body, |
const CubitVector & | offset | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 3485 of file OCCQueryEngine.cpp.
{ OCCBody* theBody = dynamic_cast<OCCBody*>(body); return theBody ? theBody->move( d.x(), d.y(), d.z() ) : CUBIT_FAILURE; }
CubitStatus OCCQueryEngine::translate | ( | GeometryEntity * | ent, |
const CubitVector & | offset | ||
) | [virtual] |
Implements GeometryQueryEngine.
Definition at line 3517 of file OCCQueryEngine.cpp.
{ TopoDS_Shape * shape; if ((shape = get_TopoDS_Shape_of_entity(entity)) == NULL) { PRINT_ERROR( "problem occured getting OCC entity.\n" " Aborting.\n" ); return CUBIT_FAILURE; } gp_Vec aVec(v.x(), v.y(),v.z()); gp_Trsf aTrsf; aTrsf.SetTranslation(aVec); BRepBuilderAPI_Transform aBRepTrsf(*shape, aTrsf); update_entity_shape(entity, &aBRepTrsf); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::unhook_BodySM_from_OCC | ( | BodySM * | bodysm, |
bool | remove_lower_entities = CUBIT_TRUE |
||
) | const |
Definition at line 2800 of file OCCQueryEngine.cpp.
{ OCCBody* occ_body = dynamic_cast<OCCBody*>(bodysm); if (!occ_body) return CUBIT_FAILURE; TopoDS_Shape* shape = occ_body->get_TopoDS_Shape(); if (shape && !shape->IsNull()) { //remove the entry from label tree OCCAttribSet::remove_attribute(*shape) ; //remove the entry from the map int k; if(shape && !shape->IsNull() && OCCMap->IsBound(*shape)) { k = OCCMap->Find(*shape); OCCMap->UnBind(*shape); if(!OccToCGM->erase(k)) PRINT_ERROR("The OccBody and iCreatedTotal %i pair is not in the map!", k); } } DLIList<Lump*> lumps = occ_body->lumps(); for(int i =0; i < lumps.size()&& remove_lower_entities; i++) { Lump* lump = lumps.get_and_step(); //OCCLump* occ_lump = CAST_TO(lump, OCCLump); //if(occ_lump) // occ_lump->remove_body(); unhook_Lump_from_OCC(lump); } if (shape && !shape->IsNull()) shape->Nullify(); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::unhook_CoEdges_from_OCC | ( | DLIList< OCCCoEdge * > & | coedges | ) | const [private] |
Definition at line 3106 of file OCCQueryEngine.cpp.
void OCCQueryEngine::unhook_coedges_of_a_curve | ( | OCCCurve * | curve, |
OCCLoop * | loop | ||
) | const [private] |
Definition at line 4008 of file OCCQueryEngine.cpp.
{ DLIList<OCCCoEdge*> coedges; DLIList<OCCCoEdge *> children ; if (loop != NULL) children = loop->coedges(); else { DLIList<OCCLoop*> loops; loops = curve->loops(); for (int i = 0; i < loops.size(); i ++) children += loops.get_and_step()->coedges(); } for(int j = 0; j < children.size(); j++) { OCCCoEdge* coedge = children.get_and_step(); if (coedge->curve() == curve) coedges.append(coedge); } unhook_CoEdges_from_OCC(coedges); }
CubitStatus OCCQueryEngine::unhook_Curve_from_OCC | ( | Curve * | curve | ) | const |
Definition at line 3172 of file OCCQueryEngine.cpp.
{ OCCCurve* fcurve = dynamic_cast<OCCCurve*>(curve); if (!fcurve ) return CUBIT_FAILURE; DLIList<TopologyBridge*> children; fcurve->get_children_virt(children); for(int i = 0; i < children.size(); i++) { TBPoint* point = CAST_TO(children.get_and_step(), TBPoint); CAST_TO(point, OCCPoint)->remove_curve(fcurve); } unhook_coedges_of_a_curve(fcurve, NULL); fcurve->clean_loops(); TopoDS_Edge* edge = fcurve->get_TopoDS_Edge(); if (!edge) return CUBIT_FAILURE; //remove the entry from label tree OCCAttribSet::remove_attribute(*edge) ; //remove the entry from the map int k; if(edge && !edge->IsNull() && OCCMap->IsBound(*edge)) { k = OCCMap->Find(*edge); OCCMap->UnBind(*edge); if(!OccToCGM->erase(k)) PRINT_WARNING("The OccCurve and iCreatedTotal pair is not in the map!"); } CurveList->remove(fcurve); if(!edge->IsNull()) edge->Nullify(); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::unhook_LoopSM_from_OCC | ( | LoopSM * | loopsm | ) | const [private] |
Definition at line 3068 of file OCCQueryEngine.cpp.
{ OCCLoop* occ_loop = dynamic_cast<OCCLoop*>(loopsm); if (!occ_loop) return CUBIT_FAILURE; TopoDS_Wire* wire = occ_loop->get_TopoDS_Wire(); if(!wire) return CUBIT_FAILURE; //remove the entry from the map int k; if(OCCMap->IsBound(*wire)) { k = OCCMap->Find(*wire); OCCMap->UnBind(*wire); if(!OccToCGM->erase(k)) PRINT_ERROR("The OccLoop and iCreatedTotal pair is not in the map!"); } if(!wire->IsNull()) wire->Nullify(); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::unhook_Lump_from_OCC | ( | Lump * | lump | ) | const [private] |
Definition at line 2852 of file OCCQueryEngine.cpp.
{ if (lump == NULL) return CUBIT_FAILURE; OCCLump* occ_lump = dynamic_cast<OCCLump*>(lump); if (!occ_lump) return CUBIT_FAILURE; TopoDS_Solid* solid = occ_lump->get_TopoDS_Solid(); if(!solid) return CUBIT_FAILURE; //remove the entry from label tree OCCAttribSet::remove_attribute(*solid) ; //remove the entry from the map int k; if(OCCMap->IsBound(*solid)) { k = OCCMap->Find(*solid); OCCMap->UnBind(*solid); if(!OccToCGM->erase(k)) PRINT_ERROR("The OccLump and iCreatedTotal pair is not in the map!"); } DLIList<TopologyBridge*> children; occ_lump->get_children_virt(children); for(int i = 0; i < children.size(); i++) { ShellSM* shell = CAST_TO(children.get_and_step(), ShellSM); unhook_ShellSM_from_OCC(shell); } if (occ_lump->get_body() != NULL) BodyList->remove(CAST_TO(occ_lump->get_body(), OCCBody)); if(!solid->IsNull()) solid->Nullify(); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::unhook_Point_from_OCC | ( | TBPoint * | point | ) | const |
Definition at line 3248 of file OCCQueryEngine.cpp.
{ OCCPoint* fpoint = dynamic_cast<OCCPoint*>(point); if (!fpoint) return CUBIT_FAILURE; TopoDS_Vertex* vertex = fpoint->get_TopoDS_Vertex(); if (!vertex) return CUBIT_FAILURE; //remove the entry from label tree OCCAttribSet::remove_attribute(*vertex) ; //remove the entry from the map int k; if(OCCMap->IsBound(*vertex)) { k = OCCMap->Find(*vertex); OCCMap->UnBind(*vertex); if(!OccToCGM->erase(k)) PRINT_ERROR("The OccPoint and iCreatedTotal pair is not in the map!"); } if(!vertex->IsNull()) vertex->Nullify(); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::unhook_ShellSM_from_OCC | ( | ShellSM * | shell | ) | const [private] |
Definition at line 2906 of file OCCQueryEngine.cpp.
{ OCCShell* occ_shell = dynamic_cast<OCCShell*>(shell); if (!occ_shell) return CUBIT_FAILURE; TopoDS_Shell* Shell = occ_shell->get_TopoDS_Shell(); if(!Shell) return CUBIT_FAILURE; //remove the entry from the map int k; if(OCCMap->IsBound(*Shell)) { k = OCCMap->Find(*Shell); OCCMap->UnBind(*Shell); if(!OccToCGM->erase(k)) PRINT_ERROR("The OccShell and iCreatedTotal pair is not in the map!"); } if(!Shell->IsNull()) Shell->Nullify(); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::unhook_Surface_from_OCC | ( | Surface * | surface | ) | const |
Definition at line 2981 of file OCCQueryEngine.cpp.
{ OCCSurface* fsurf = dynamic_cast<OCCSurface*>(surface); if (!fsurf) return CUBIT_FAILURE; TopoDS_Face *face = fsurf->get_TopoDS_Face(); if(!face) return CUBIT_FAILURE; //remove the entry from label tree OCCAttribSet::remove_attribute(*face) ; //remove the entry from the map int k; if(OCCMap->IsBound(*face)) { k = OCCMap->Find(*face); OCCMap->UnBind(*face); if(!OccToCGM->erase(k)) PRINT_WARNING("The OccSurface and iCreatedTotal pair is not in the map!"); } SurfaceList->remove(fsurf); if(!face->IsNull()) face->Nullify(); return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::update_entity_shape | ( | GeometryEntity * | entity_ptr, |
BRepBuilderAPI_ModifyShape * | aTranf, | ||
BRepAlgoAPI_BooleanOperation * | op = NULL |
||
) |
Definition at line 3538 of file OCCQueryEngine.cpp.
{ if (OCCBody *body_ptr = CAST_TO( entity_ptr, OCCBody)) { body_ptr->update_OCC_entity(aBRepTrsf, op); return CUBIT_SUCCESS; } else if( OCCSurface *surface_ptr = CAST_TO( entity_ptr, OCCSurface)) { surface_ptr->update_OCC_entity(aBRepTrsf, op); return CUBIT_SUCCESS; } else if( OCCCurve *curve_ptr = CAST_TO( entity_ptr, OCCCurve)) { curve_ptr->update_OCC_entity(aBRepTrsf, op); return CUBIT_SUCCESS; } else if( OCCPoint *point_ptr = CAST_TO( entity_ptr, OCCPoint)) { point_ptr->update_OCC_entity(aBRepTrsf, op); return CUBIT_SUCCESS; } PRINT_ERROR("Non-OCC TopologyBridge at %s:%d.\n", __FILE__, __LINE__ ); return CUBIT_FAILURE; }
int OCCQueryEngine::update_OCC_map | ( | TopoDS_Shape & | old_shape, |
TopoDS_Shape & | new_shape | ||
) |
Definition at line 3780 of file OCCQueryEngine.cpp.
{ if (old_shape.IsNull() || !OCCMap->IsBound(old_shape) || old_shape.IsEqual(new_shape)) return -1; //update the attribute label tree int current_id = OCCMap->Find(old_shape); std::map<int, TDF_Label>::iterator it_lab = Shape_Label_Map->find(current_id); CubitBoolean newlyBound = CUBIT_FALSE; TopTools_IndexedMapOfShape M; TopoDS_Shape new_subshape; new_subshape.Nullify(); if(old_shape.ShapeType() == TopAbs_SOLID) TopExp::MapShapes(new_shape, TopAbs_SOLID, M); else if (old_shape.ShapeType() == TopAbs_SHELL) TopExp::MapShapes(new_shape, TopAbs_SHELL, M); else if (old_shape.ShapeType() == TopAbs_FACE) TopExp::MapShapes(new_shape, TopAbs_FACE, M); if(it_lab != Shape_Label_Map->end()) { CubitBoolean isNewShapeBound = CUBIT_FALSE; if(old_shape.ShapeType() > TopAbs_COMPOUND && !new_shape.IsNull() && new_shape.ShapeType() == TopAbs_COMPOUND && M.Extent() == 1) { new_subshape = M(1); isNewShapeBound = OCCMap->IsBound(new_subshape); copy_attributes(old_shape, new_subshape); Shape_Label_Map->erase(current_id); if(isNewShapeBound != OCCMap->IsBound(new_subshape)) newlyBound = CUBIT_TRUE; } else { isNewShapeBound = OCCMap->IsBound(new_shape); copy_attributes(old_shape, new_shape); Shape_Label_Map->erase(current_id); if(isNewShapeBound != OCCMap->IsBound(new_shape)) newlyBound = CUBIT_TRUE; } } //update CGM-OCC map int k = current_id; assert (k > 0 && k <= iTotalTBCreated); std::map<int, TopologyBridge*>::iterator it = OccToCGM->find(k); TopologyBridge* tb = NULL; if (it != OccToCGM->end()) tb = (*it).second; //unless just changing location, if the TShape is going to change, remove //old curve_list . CubitBoolean curve_removed = CUBIT_FALSE; if(old_shape.ShapeType() == TopAbs_VERTEX && !new_shape.IsPartner(old_shape)) { //remove the curve list associated with the vertex too. GeometryEntity* ge = CAST_TO(tb, GeometryEntity); if (ge) { OCCPoint* test_p = CAST_TO(ge, OCCPoint); if(test_p) { test_p->clear_curves(); curve_removed = CUBIT_TRUE; } } } OCCMap->UnBind(old_shape); if(new_subshape.IsNull()) new_subshape = new_shape; if (tb && TopAbs_SOLID == old_shape.ShapeType() && !new_shape.IsNull() && TopAbs_COMPOUND == new_shape.ShapeType() && M.Extent() > 1) { OccToCGM->erase(k); GeometryEntity* ge = CAST_TO(tb, GeometryEntity); if(ge) delete_solid_model_entities( ge, CUBIT_TRUE); return k; } else if(tb && TopAbs_FACE == old_shape.ShapeType() && !new_shape.IsNull() && TopAbs_COMPOUND == new_shape.ShapeType() && M.Extent() > 1) { GeometryEntity* ge = CAST_TO(tb, GeometryEntity); if(ge) { OCCSurface *face = CAST_TO(ge, OCCSurface); OCCShell* shell = face->my_shell(); if (shell) { TopoDS_Shell* shape = shell->get_TopoDS_Shell(); assert(!shape ); if (shape) { PRINT_ERROR("Unexpected non-NULL TopoDS_Shell pointer.\n"); return -1; } } OCCLump* lump = face->my_lump(); if(lump) { TopoDS_Solid* shape = lump->get_TopoDS_Solid(); assert(!shape ); if (shape) { PRINT_ERROR("Unexpected non-NULL TopoDS_Solid pointer.\n"); return -1; } delete lump; } OCCBody* body = face->my_body(); if (body) delete body; delete_solid_model_entities(ge, CUBIT_TRUE); if(shell) delete shell; } return k; } else if (tb && ((!new_subshape.IsNull() && !old_shape.IsSame(new_subshape)&& OCCMap->IsBound(new_subshape) && OccToCGM->find(OCCMap->Find(new_subshape))!= OccToCGM->end()) || new_subshape.IsNull())) //already has a TB built on new_shape { //delete the second TB corresponding to old_shape OccToCGM->erase(k); GeometryEntity* ge = CAST_TO(tb, GeometryEntity); if(ge) { //PRINT_INFO("TB: %p\n",ge); Lump* lump = CAST_TO(ge, Lump); if(lump) { BodySM* body = CAST_TO(lump,OCCLump)->get_body(); if(body) { //OCCBody* occ_body = CAST_TO(body, OCCBody); //TopoDS_Compound* pshape = occ_body->get_TopoDS_Shape(); //if(!pshape || pshape->IsNull()) delete_solid_model_entities(body); } } else { OCCPoint* test_p = CAST_TO(ge, OCCPoint); if(test_p) test_p->clear_curves(); delete_solid_model_entities( ge, CUBIT_FALSE ); } } else { ShellSM * shell = CAST_TO(tb, ShellSM); if(shell) { DLIList<OCCSurface*> memberSurfaces; OCCShell* occShell = CAST_TO(shell, OCCShell); memberSurfaces = occShell->getMemberSurfaces(); while (memberSurfaces.size()) { OCCSurface* memberSurf = memberSurfaces.pop(); if (SurfaceList->is_in_list(memberSurf)) // if the surface has not been unhooked and deleted memberSurf->set_shell((OCCShell*)NULL); } OCCLump* lump = CAST_TO(shell, OCCShell)->my_lump(); if(lump && (lump->get_TopoDS_Solid() == NULL || !OCCMap->IsBound(*(lump->get_TopoDS_Solid())))) { delete CAST_TO(shell, OCCShell)->my_body(); delete lump; } unhook_ShellSM_from_OCC(shell); delete shell; return k; } LoopSM* loop = CAST_TO(tb, LoopSM); if(loop) { DLIList<OCCCoEdge*> children; children = CAST_TO(loop, OCCLoop)->coedges(); while(children.size()) { OCCCoEdge* coedge = children.pop(); CAST_TO(coedge->curve(), OCCCurve)->remove_loop(CAST_TO(loop, OCCLoop)); delete (OCCCoEdge*)coedge; } unhook_LoopSM_from_OCC(loop); delete loop; return k; } } } else { //if the new_shape is bounded in copy_attribute, unbind it and rebind to //the old k if(newlyBound) { int new_k = OCCMap->Find(new_subshape); TDF_Label aLabel; CubitBoolean found = CUBIT_FALSE; OCCAttribSet::FindShape(new_subshape, aLabel, found); assert(found); Shape_Label_Map->erase(new_k); Shape_Label_Map->insert(labType(k, aLabel)); OCCMap->UnBind(new_subshape); } if(!OCCMap->IsBound(new_subshape)) OCCMap->Bind(new_subshape, k); if(tb && !curve_removed) set_TopoDS_Shape(tb, new_subshape); } return k; }
CubitBoolean OCCQueryEngine::volumes_overlap | ( | Lump * | lump1, |
Lump * | lump2 | ||
) | const [virtual] |
Implements GeometryQueryEngine.
Definition at line 3713 of file OCCQueryEngine.cpp.
{ OCCLump *occ_lump1 = CAST_TO(lump1, OCCLump); if (!occ_lump1) { PRINT_ERROR("Can't calculate intersection of non-OCC solids."); return CUBIT_FALSE; } OCCLump *occ_lump2 = CAST_TO(lump2, OCCLump); if (!occ_lump2) { PRINT_ERROR("Can't calculate intersection of non-OCC solids."); return CUBIT_FALSE; } CubitBox box_1 = occ_lump1->bounding_box(); CubitBox box_2 = occ_lump2->bounding_box(); if ( !box_1.overlap( GEOMETRY_RESABS, box_2 ) ) return CUBIT_FALSE; TopoDS_Shape *shape1 = (TopoDS_Shape*)(occ_lump1->get_TopoDS_Solid()); TopoDS_Shape *shape2 = (TopoDS_Shape*)(occ_lump2->get_TopoDS_Solid()); //BRepAlgoAPI_Section calculates intersection between faces only. TopExp_Explorer Ex1, Ex2; for (Ex1.Init(*shape1, TopAbs_FACE); Ex1.More(); Ex1.Next()) { for (Ex2.Init(*shape2, TopAbs_FACE); Ex2.More(); Ex2.Next()) { BRepAlgoAPI_Section section(Ex1.Current(), Ex2.Current()); if (section.HasGenerated()) return CUBIT_TRUE; } } return CUBIT_FALSE; }
CubitBoolean OCCQueryEngine::Write | ( | const TopoDS_Shape & | Sh, |
const Standard_CString | File, | ||
TDF_Label | label | ||
) | [private] |
Definition at line 1398 of file OCCQueryEngine.cpp.
{ ofstream os; os.open(File, ios::out); if (!os.rdbuf()->is_open()) return Standard_False; CubitBoolean isGood = (os.good() && !os.eof()); if(!isGood) return isGood; OCCShapeAttributeSet SS; SS.Add(Sh); os << "DBRep_DrawableShape\n"; // for easy Draw read SS.Write(os); isGood = os.good(); if(isGood ) SS.Write(Sh,os,&label); os.flush(); isGood = os.good(); os.close(); isGood = os.good() && isGood; return isGood; }
CubitBoolean OCCQueryEngine::Write | ( | const TopoDS_Shape & | Sh, |
char *& | p_buffer, | ||
int & | n_buffer_size, | ||
bool | b_export_buffer, | ||
TDF_Label | label | ||
) | [private] |
Definition at line 1426 of file OCCQueryEngine.cpp.
{ // make buffer as ouput stream std::stringbuf sb; std::iostream os(&sb); OCCShapeAttributeSet SS; // write to output stream SS.Add(Sh); os << "DBRep_DrawableShape\n"; // for easy Draw read SS.Write(os); CubitBoolean isGood = os.good(); if (!isGood) return isGood; SS.Write(Sh,os,&label); isGood = os.good(); if (!isGood) return isGood; n_buffer_size = os.rdbuf()->pubseekoff(0, std::ios_base::end, std::ios::out); // get real geometries from output stream to buffer if (b_write_buffer) os.read(pBuffer, n_buffer_size); return CUBIT_TRUE; }
CubitStatus OCCQueryEngine::write_topology | ( | const char * | file_name, |
Model_File_Type | file_type, | ||
DLIList< OCCBody * > & | facet_bodies, | ||
DLIList< OCCSurface * > & | facet_surfaces, | ||
DLIList< OCCCurve * > & | facet_curves, | ||
DLIList< OCCPoint * > & | facet_points | ||
) | [private] |
Definition at line 1218 of file OCCQueryEngine.cpp.
{ int i; //Create a compound shape to export BRep_Builder B; TopoDS_Compound Co; B.MakeCompound(Co); //Add every shape to the compound DLIList<OCCLump*> single_lumps; DLIList< DLIList<CubitSimpleAttrib>*> lists; OCCLump* lump = NULL; if(OCC_bodies.size() > 0) body_attributes_for_writing(OCC_bodies, B, Co, single_lumps, lists); for (i = 0; i < OCC_surfaces.size(); i++) { TopoDS_Face *face = OCC_surfaces.get_and_step()->get_TopoDS_Face(); B.Add(Co, *face); } //Add standalone wires to the export BRep file for (i = 0; i < WireList->size(); i++) { TopoDS_Wire *wire = WireList->get_and_step()->get_TopoDS_Wire(); B.Add(Co, *wire); } for (i = 0; i < OCC_curves.size(); i++) { TopoDS_Edge *edge = OCC_curves.get_and_step()->get_TopoDS_Edge(); B.Add(Co, *edge); } for (i = 0; i < OCC_points.size(); i++) { TopoDS_Vertex *vertex = OCC_points.get_and_step()->get_TopoDS_Vertex(); B.Add(Co, *vertex); } if(file_type == OCC_TYPE) { TDF_Label label; if(EXPORT_ATTRIB) label = mainLabel; CubitBoolean result = Write(Co, const_cast<char*>(file_name),label); //remove the body attributes from lump for (int i = 0; i < single_lumps.size(); i++) { lump = single_lumps.get_and_step(); DLIList<CubitSimpleAttrib>* p_csas = lists.get_and_step(); for(int j = 0 ; j < p_csas->size(); j ++) { const CubitSimpleAttrib& csa = p_csas->get_and_step(); lump->remove_simple_attribute_virt(csa); } delete p_csas; } if(!result) return CUBIT_FAILURE; } #ifdef HAVE_OCC_STEP else if(file_type == STEP_TYPE) { STEPControl_Writer writer; writer.Model( Standard_True); writer.Transfer(Co, STEPControl_AsIs ); IFSelect_ReturnStatus stat = writer.Write( (char*) file_name); if (stat != IFSelect_RetDone) { PRINT_INFO("%s: Cannot open file", file_name ); return CUBIT_FAILURE; } } #endif #ifdef HAVE_OCC_IGES else if (file_type == IGES_TYPE) // IGES file { IGESControl_Writer writer; writer.AddShape(Co); writer.ComputeModel(); Standard_Boolean stat = writer.Write( (char*) file_name); if (!stat ) { PRINT_INFO("%s: Cannot open file", file_name ); return CUBIT_FAILURE; } } #endif else { PRINT_ERROR("File formats other than OCC, STEP and IGES are not supported by OCC.\n"); return CUBIT_FAILURE; } return CUBIT_SUCCESS; }
CubitStatus OCCQueryEngine::write_topology | ( | char *& | p_buffer, |
int & | n_buffer_size, | ||
bool | b_export_buffer, | ||
DLIList< OCCBody * > & | OCC_bodies, | ||
DLIList< OCCSurface * > & | OCC_surfaces, | ||
DLIList< OCCCurve * > & | OCC_curves, | ||
DLIList< OCCPoint * > & | OCC_points | ||
) | [private] |
Definition at line 1325 of file OCCQueryEngine.cpp.
{ int i; //Create a compound shape to export BRep_Builder B; TopoDS_Compound Co; B.MakeCompound(Co); //Add every shape to the compound DLIList<OCCLump*> single_lumps; DLIList< DLIList<CubitSimpleAttrib>*> lists; OCCLump* lump = NULL; if(OCC_bodies.size() > 0) body_attributes_for_writing(OCC_bodies, B, Co, single_lumps, lists); for (i = 0; i < OCC_surfaces.size(); i++) { TopoDS_Face *face = OCC_surfaces.get_and_step()->get_TopoDS_Face(); B.Add(Co, *face); } //Add standalone wires to the export BRep file for (i = 0; i < WireList->size(); i++) { TopoDS_Wire *wire = WireList->get_and_step()->get_TopoDS_Wire(); B.Add(Co, *wire); } for (i = 0; i < OCC_curves.size(); i++) { TopoDS_Edge *edge = OCC_curves.get_and_step()->get_TopoDS_Edge(); B.Add(Co, *edge); } for (i = 0; i < OCC_points.size(); i++) { TopoDS_Vertex *vertex = OCC_points.get_and_step()->get_TopoDS_Vertex(); B.Add(Co, *vertex); } //if(strcmp(file_type, "OCC") == 0) //{ TDF_Label label; if(EXPORT_ATTRIB) label = mainLabel; if(!Write(Co, p_buffer, n_buffer_size, b_export_buffer, label)) return CUBIT_FAILURE; //remove the body attributes from lump for (int i = 0; i < single_lumps.size(); i++) { lump = single_lumps.get_and_step(); DLIList<CubitSimpleAttrib>* p_csas = lists.get_and_step(); for(int j = 0 ; j < p_csas->size(); j ++) { const CubitSimpleAttrib& csa = p_csas->get_and_step(); lump->remove_simple_attribute_virt(csa); } delete p_csas; } return CUBIT_SUCCESS; }
friend class OCCSurface [friend] |
Definition at line 104 of file OCCQueryEngine.hpp.
Definition at line 410 of file OCCQueryEngine.hpp.
Definition at line 413 of file OCCQueryEngine.hpp.
Definition at line 114 of file OCCQueryEngine.hpp.
OCCQueryEngine * OCCQueryEngine::instance_ = NULL [static, private] |
Definition at line 464 of file OCCQueryEngine.hpp.
int OCCQueryEngine::iTotalTBCreated = 0 [static] |
Definition at line 419 of file OCCQueryEngine.hpp.
TDF_Label OCCQueryEngine::mainLabel |
Definition at line 415 of file OCCQueryEngine.hpp.
TopTools_DataMapOfShapeInteger* OCCQueryEngine::OCCMap |
Definition at line 416 of file OCCQueryEngine.hpp.
std::map<int, TopologyBridge*>* OCCQueryEngine::OccToCGM |
Definition at line 417 of file OCCQueryEngine.hpp.
std::map<int, TDF_Label>* OCCQueryEngine::Shape_Label_Map |
Definition at line 418 of file OCCQueryEngine.hpp.
Definition at line 411 of file OCCQueryEngine.hpp.
int OCCQueryEngine::total_coedges = 0 [static] |
Definition at line 420 of file OCCQueryEngine.hpp.
Definition at line 412 of file OCCQueryEngine.hpp.