cgma
|
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <math.h>
#include <sstream>
#include "GeometryModifyTool.hpp"
#include "CubitDefines.h"
#include "GeometryDefines.h"
#include "GeometryEntity.hpp"
#include "GeometryQueryTool.hpp"
#include "MergeTool.hpp"
#include "SurfaceOverlapTool.hpp"
#include "GeometryQueryEngine.hpp"
#include "OldUnmergeCode.hpp"
#include "GeometryModifyEngine.hpp"
#include "AnalyticGeometryTool.hpp"
#include "DAG.hpp"
#include "TopologyBridge.hpp"
#include "ModelQueryEngine.hpp"
#include "CADefines.hpp"
#include "GeomMeasureTool.hpp"
#include "LocalToleranceTool.hpp"
#include "RefEntity.hpp"
#include "RefEntityFactory.hpp"
#include "RefEntityName.hpp"
#include "BasicTopologyEntity.hpp"
#include "RefVertex.hpp"
#include "RefEdge.hpp"
#include "RefFace.hpp"
#include "RefVolume.hpp"
#include "CoVertex.hpp"
#include "CoEdge.hpp"
#include "CoFace.hpp"
#include "CoVolume.hpp"
#include "Chain.hpp"
#include "Loop.hpp"
#include "Shell.hpp"
#include "Body.hpp"
#include "Lump.hpp"
#include "Surface.hpp"
#include "Curve.hpp"
#include "Point.hpp"
#include "BodySM.hpp"
#include "ShellSM.hpp"
#include "LoopSM.hpp"
#include "CoEdgeSM.hpp"
#include "CubitAttrib.hpp"
#include "CubitVector.hpp"
#include "CubitPlane.hpp"
#include "CubitTransformMatrix.hpp"
#include "GfxPreview.hpp"
#include "AppUtil.hpp"
#include "DLIList.hpp"
#include "CubitMessage.hpp"
#include "SettingHandler.hpp"
#include "CastTo.hpp"
#include "CpuTimer.hpp"
#include "BridgeManager.hpp"
#include "SplitSurfaceTool.hpp"
#include "OffsetSplitTool.hpp"
#include "AutoMidsurfaceTool.hpp"
#include "TDSurfaceOverlap.hpp"
#include "GfxDebug.hpp"
#include "CubitUndo.hpp"
Go to the source code of this file.
Functions | |
CubitStatus | prepare_surface_sweep (DLIList< BodySM * > &blank_bodies, DLIList< Surface * > &surfaces, const CubitVector &sweep_vector, bool sweep_perp, bool through_all, bool outward, bool up_to_next, Surface *stop_surf, Curve *curve_to_sweep_along, BodySM *&cutting_tool_ptr, const CubitVector *point=NULL, double *angle=NULL) |
CubitStatus | webcut_w_cylinder (DLIList< BodySM * > &webcut_body_list, double radius, const CubitVector &axis, const CubitVector ¢er, DLIList< BodySM * > &neighbor_imprint_list, DLIList< BodySM * > &results_list, ImprintType imprint_type=NO_IMPRINT) |
CubitStatus | get_planar_mid_surface (RefFace *ref_face1, RefFace *ref_face2, BodySM *body_sm_to_trim_to, BodySM *&midsurface_body_sm, GeometryModifyEngine *gme_ptr) |
CubitStatus get_planar_mid_surface | ( | RefFace * | ref_face1, |
RefFace * | ref_face2, | ||
BodySM * | body_sm_to_trim_to, | ||
BodySM *& | midsurface_body_sm, | ||
GeometryModifyEngine * | gme_ptr | ||
) |
Definition at line 12267 of file GeometryModifyTool.cpp.
{ CubitVector normal_1, normal_2, point_1, point_2, point_3; CubitPlane plane_1, plane_2; CubitVector p_mid, n_mid; point_1 = ref_face1->center_point(); point_2 = ref_face2->center_point(); normal_1 = ref_face1->normal_at(point_1); normal_2 = ref_face2->normal_at(point_2); plane_1 = CubitPlane(normal_1,point_1); plane_2 = CubitPlane(normal_2,point_2); if(point_1 == point_2) { PRINT_ERROR( "In GeometryModifyTool:: get_planar_mid_surface\n" " Since both surfaces share the same point, the midsurface is not well-defined\n"); return CUBIT_FAILURE; } else { CubitVector temp1 = point_2; temp1 = plane_1.project(temp1); temp1 -= point_2; if ( temp1.length_squared() < GEOMETRY_RESABS*GEOMETRY_RESABS ) { PRINT_ERROR("In GeometryModifyTool:: get_planar_mid_surface\n" " Since both planes are the same, the midsurface is not well-defined.\n"); return CUBIT_FAILURE; } } if ( ( normal_1.about_equal( normal_2 ) ) || ( (-normal_1).about_equal( normal_2 ) ) ) { p_mid = (point_1+point_2)/2; n_mid = plane_1.normal(); } else { CubitVector direction_of_line; plane_1.intersect(plane_2,p_mid,direction_of_line); direction_of_line.normalize(); // Find if point_1 and point_2 are on the line of intersection // If they are, then the mid-plane is not well-defined CubitVector p1 = point_1-p_mid; CubitVector p2 = point_2-p_mid; p1.normalize(); p2.normalize(); if(p1==direction_of_line || p1==-direction_of_line) { PRINT_ERROR("In GeometryModifyTool:: get_planar_mid_surface\n" " P1 is on the line of intersection.\n"); return CUBIT_FAILURE; } if(p2==direction_of_line || p2==-direction_of_line) { PRINT_ERROR("In GeometryModifyTool:: get_planar_mid_surface\n" " P2 is on the line of intersection.\n"); return CUBIT_FAILURE; } CubitVector v1 = p1 - (p1%direction_of_line)*direction_of_line; v1.normalize(); CubitVector v2 = p2 - (p2%direction_of_line)*direction_of_line; v2.normalize(); n_mid = v1 - v2; n_mid.normalize(); } CubitPlane mid_plane(n_mid, p_mid); point_1 = p_mid; //find three points that will define the infinite plane from the //mid plane.through the point in any direction just not along the //normal direction CubitVector Xdir(1,0,0), Ydir(0,1,0); CubitVector direction1; if ( ( ! n_mid.about_equal( Xdir ) ) && ( ! (-n_mid).about_equal( Xdir ) ) ) direction1 = Xdir + n_mid; else direction1 = Ydir + n_mid; point_2 = p_mid + direction1; point_2 = mid_plane.project(point_2); direction1 = point_2-point_1; CubitVector direction2 = direction1*n_mid; point_3 = point_1 + direction2; CubitStatus ret = gme_ptr->get_mid_plane(point_1, point_2, point_3, body_sm_to_trim_to, midsurface_body_sm ); return ret; }
CubitStatus prepare_surface_sweep | ( | DLIList< BodySM * > & | blank_bodies, |
DLIList< Surface * > & | surfaces, | ||
const CubitVector & | sweep_vector, | ||
bool | sweep_perp, | ||
bool | through_all, | ||
bool | outward, | ||
bool | up_to_next, | ||
Surface * | stop_surf, | ||
Curve * | curve_to_sweep_along, | ||
BodySM *& | cutting_tool_ptr, | ||
const CubitVector * | point = NULL , |
||
double * | angle = NULL |
||
) |
Definition at line 21363 of file GeometryModifyTool.cpp.
{ GeometryModifyEngine* gme = GeometryModifyTool::instance()-> get_engine(blank_bodies.get()); if(surfaces.size() == 0 ) return CUBIT_FAILURE; DLIList<GeometryEntity*> ref_ent_list; Surface * temp_face = NULL; for(int i = 0; i < surfaces.size(); i++) { //copy the faces before sweep temp_face = gme->make_Surface(surfaces.get_and_step()); if (temp_face) ref_ent_list.append((GeometryEntity*)temp_face); } BodySM* to_body = NULL; CubitStatus stat = CUBIT_SUCCESS; if(up_to_next && blank_bodies.size() > 1) //unite all bland_bodies { DLIList<BodySM*> newBodies; DLIList<BodySM*> copied_bodies; for(int i = 0; i < blank_bodies.size(); i++) copied_bodies.append(gme->copy_body(blank_bodies.get_and_step())); stat = gme->unite(copied_bodies, newBodies); if(stat == CUBIT_FAILURE) { PRINT_ERROR("Cannot use 'up_to_next' option with specified geometry\n"); PRINT_INFO("Try the 'stop surface <id>' option instead\n"); return stat; } to_body = newBodies.get(); } else if(up_to_next && blank_bodies.size() == 1) to_body = gme->copy_body(blank_bodies.get()); DLIList<BodySM*> swept_bodies; if (point && angle) //sweep_surface_rotated stat = gme->sweep_rotational(ref_ent_list,swept_bodies,*point, sweep_vector, *angle,0, 0.0,0,false,false, false,stop_surf, to_body); else { CubitVector tmp_sweep_vector = sweep_vector; //get model bbox info...will scale sweep vector by its diagonal //so that we go far enough if( through_all || stop_surf || up_to_next) { CubitBox bounding_box = GeometryQueryTool::instance()->model_bounding_box(); tmp_sweep_vector.normalize(); tmp_sweep_vector*=(2*bounding_box.diagonal().length()); } //see if we're sweeping along a specified curve if( curve_to_sweep_along ) { DLIList<Curve*> curves_to_sweep_along; curves_to_sweep_along.append(curve_to_sweep_along); stat = gme->sweep_along_curve(ref_ent_list, swept_bodies, curves_to_sweep_along, 0.0,0,false,stop_surf, to_body); } else if (sweep_perp ) stat = gme->sweep_perpendicular(ref_ent_list, swept_bodies, tmp_sweep_vector.length(),0.0,0,!outward,false, stop_surf, to_body); else stat = gme->sweep_translational(ref_ent_list, swept_bodies, tmp_sweep_vector,0.0,0, false, false, stop_surf, to_body); } if(stat == CUBIT_FAILURE || swept_bodies.size() == 0) { //delete copied faces GeometryEntity * temp_entity = NULL; for(int i = ref_ent_list.size();i--;) { temp_entity = ref_ent_list.get_and_step(); if (temp_entity) gme->get_gqe()->delete_solid_model_entities( (Surface*)temp_entity); } return stat; } //if there are more than 1, unite them all DLIList<BodySM*> newBodies; if (swept_bodies.size() > 1) stat = gme->unite(swept_bodies, newBodies); else newBodies = swept_bodies; if(stat == CUBIT_FAILURE || newBodies.size()!= 1) { PRINT_ERROR("webcut tool body is not created from occ.\n"); //delete the swept_bodies BodySM* tmp_body = NULL; for (int i = swept_bodies.size(); i--;) { tmp_body= swept_bodies.get_and_step(); if (tmp_body) gme->get_gqe()->delete_solid_model_entities(tmp_body); } //delete copied faces GeometryEntity * temp_entity = NULL; for(int i = ref_ent_list.size();i--;) { temp_entity = ref_ent_list.get_and_step(); if (temp_entity) gme->get_gqe()->delete_solid_model_entities( (Surface*)temp_entity); } return CUBIT_FAILURE; } cutting_tool_ptr = newBodies.get(); return stat; }
CubitStatus webcut_w_cylinder | ( | DLIList< BodySM * > & | webcut_body_list, |
double | radius, | ||
const CubitVector & | axis, | ||
const CubitVector & | center, | ||
DLIList< BodySM * > & | neighbor_imprint_list, | ||
DLIList< BodySM * > & | results_list, | ||
ImprintType | imprint_type = NO_IMPRINT |
||
) |
Definition at line 21993 of file GeometryModifyTool.cpp.
{ GeometryModifyEngine* gme = 0; gme = GeometryModifyTool::instance()-> get_engine(webcut_body_list.get()); assert(gme); double max_size = 0.; //lets find the distance to the center for each body and take //the max. double curr; CubitVector cent_bod; CubitBox bounding_box; BodySM *body_ptr; bounding_box = webcut_body_list[0]->bounding_box(); cent_bod = bounding_box.center(); cent_bod = cent_bod - center; curr = cent_bod.length(); if ( curr > max_size ) max_size = curr; for ( int ii = webcut_body_list.size()-1; ii > 0; ii-- ) { body_ptr = webcut_body_list[ii]; bounding_box |= body_ptr->bounding_box(); cent_bod = body_ptr->bounding_box().center(); cent_bod = cent_bod - center; curr = cent_bod.length(); if ( curr > max_size ) max_size = curr; } curr = bounding_box.diagonal().length(); if ( curr > max_size ) max_size = curr; double height = 0.0; if ( center.x() > max_size ) { height = 500.0 * center.x(); } else if ( center.y() > max_size ) { height = 500.0 * center.y(); } else if ( center.z() > max_size ) { height = 500.0 * center.z(); } else { height = 500.0 * max_size; } //lets make certain we have a valid height.. if ( height < GEOMETRY_RESABS ) { height = 500.0; } BodySM *cutting_tool_ptr = gme->cylinder( height, radius, radius, radius ); if( cutting_tool_ptr == NULL ) return CUBIT_FAILURE; //transform the cyclinder to cernter and axis // The current frustum is centered on the z axis. CubitVector axis2(0., 0., 1.0 ); //now find the normal to the current axis and axis we want to be //at. This normal is where we will rotate about. CubitVector normal_axis = axis2 * axis; if ( normal_axis.length() > CUBIT_RESABS ) { //angle in degrees. double angle = normal_axis.vector_angle( axis2, axis ); gme->get_gqe()->rotate(cutting_tool_ptr, normal_axis, angle); } gme->get_gqe()->translate(cutting_tool_ptr, center); CubitStatus stat = gme->webcut( webcut_body_list, cutting_tool_ptr, neighbor_imprint_list, results_list, imprint_type) ; // Delete the BodySM that was created to be used as a tool gme->get_gqe()->delete_solid_model_entities(cutting_tool_ptr) ; return stat; }