cgma
GeometryModifyEngine.hpp
Go to the documentation of this file.
00001 //-------------------------------------------------------------------------
00002 // Filename      : GeometryModifyEngine.hpp
00003 //
00004 // Purpose       : Define the interface for all solid model modify
00005 //                 engines.
00006 //
00007 // Special Notes : This is an abstract base class.
00008 //
00009 // Creator       : Tim Tautges
00010 //
00011 // Creation Date : 2/01
00012 //
00013 // Owner         : Tim Tautges
00014 //-------------------------------------------------------------------------
00015 
00016 #ifndef GEOMETRY_MODIFY_ENGINE_HPP 
00017 #define GEOMETRY_MODIFY_ENGINE_HPP
00018 
00019 #include "CubitDefines.h"
00020 #include "GeometryDefines.h"
00021 #include "CGMGeomConfigure.h"
00022 #include "FacetShapeDefs.hpp"
00023 
00024 #include <map>
00025 #include "CubitVector.hpp"
00026 
00027 class CubitPlane;
00028 template <class X> class DLIList;
00029 
00030 class TopologyBridge;
00031 class TBPoint;
00032 class Curve; 
00033 class Surface;
00034 class Lump;
00035 class BodySM;
00036 class LoopSM;
00037 class GeometryEntity;
00038 class GeometryQueryEngine;
00039 class CubitBox;
00040 
00041 class CUBIT_GEOM_EXPORT GeometryModifyEngine
00042 {
00043 
00044    public:
00045 
00046   virtual ~GeometryModifyEngine() {}
00047     //- virtual destructor
00048 
00049   virtual bool supports_interoperability() = 0;
00050     //- Returns whether intermixing of real and virtual geometry operations
00051     //- is supported for the current geometry kernel.
00052 
00053   virtual bool supports_facets() { return false; }
00054     //- Returns whether creation of surfaces from facet data is supported
00055 
00056   virtual TBPoint* make_Point( CubitVector const& position ) const = 0;
00057     //R TBPoint*
00058     //R- Returned pointer to a TBPoint object.
00059     //I position
00060     //I- Input coordinates of the point to be created.
00061     //- This function creates a TBPoint, given coordinates.  The particular
00062     //- type of TBPoint object that is created depends on the specific
00063     //- modeling engine.  For example, if the engine
00064     //- is OCCGeometryEngine, then a PointOCC is created and returned.
00065 
00066   virtual Curve* make_Curve(Curve *curve_ptr,
00067     std::map<TopologyBridge*, TopologyBridge*> *old_tb_to_new_tb = NULL) const = 0;
00068     //- creates a curve from an existing curve.  This creates totally
00069     //- new topology.  This function is useful for constructing geometry
00070     //- from existing geometry.
00071     //- The old_to_new_map is an optional parameter that maps all
00072     //- the entities of the original to those of the copy.
00073   
00074   virtual Curve* make_Curve( TBPoint const* point1_ptr,
00075                              TBPoint const* point2_ptr,
00076                              Surface* ref_face_ptr,
00077                              const CubitVector *third_point = NULL) const = 0;
00078     //- Create a curve exactly on the give ref_face.
00079     //- Make sure the points are on the underlying surface.
00080 
00081   virtual Curve* make_Curve( DLIList<CubitVector*>& point_list,
00082                              DLIList<CubitVector*>& point_tangents) const = 0;
00083 
00084   virtual Curve* make_Curve( GeometryType curve_type,
00085                              TBPoint const* point1_ptr,
00086                              TBPoint const* point2_ptr,
00087                              DLIList<CubitVector*>& vector_list,
00088                              Surface* ref_face_ptr = NULL) const = 0;
00089   
00090   virtual Curve* make_Curve( GeometryType curve_type,
00091                              TBPoint const* point1_ptr,
00092                              TBPoint const* point2_ptr,
00093                              CubitVector const* intermediate_point_ptr) const = 0;
00094     //R Curve*
00095     //R- Returned pointer to a Curve object.
00096     //I curve_type 
00097     //I- The type of curve to be created.
00098     //I point1_ptr, point2_ptr
00099     //I- Input end points of the curve to be created.
00100     //I intermediate_point_ptr
00101     //I- The coordinates of an intermediate point required for the
00102     //I- generation of the curve.
00103     //I vector_list
00104     //I- Input list of CubitVectors. The new Curve interpolates these
00105     //I- positions.
00106     //I ref_face_ptr
00107     //I- If the optional Surface pointer is provided, then the input
00108     //I- locations (CubitVectors) are moved to the surface of the 
00109     //I- Surface before interpolation is done.
00110     //I- NOTE: The end Points are *not* moved to the surface. Only the
00111     //I-       (intermediate) points are.
00112     //- This function creates a Curve, of type, curve_type, given 
00113     //- the end points of the curve and an intermediate point or a set
00114     //- of points to interpolate through.
00115     //- The particular type of Curve object 
00116     //- that is created depends on the specific modeling engine.  For 
00117     //- example, if the engine is OCCGeometryEngine, then a CurveOCC
00118     //- is created and returned.
00119     //-
00120     //- NOTE on some hideous programming
00121     //-   This function not only creates the Curve, but also
00122     //-   creates the VGI entities Chain and CoVertexes that
00123     //-   will be connected up with the RefEdge. For the sake
00124     //-   of expediency we are assuming that this function is
00125     //-   called when RefEdge needs to be made from RefVertices.
00126     //-
00127     //- This function creates non-linear curves (e.g., elliptic and 
00128     //- parabolic curves. curve_type indicates what type of curve is
00129     //- required.
00130     //- 
00131     //- Elliptical:
00132     //- The portion of the ellipse (circle) that is generated goes from
00133     //- point1 to point2.
00134     //-
00135     //- Parabolic:
00136     //- Construct a parabolic arc from 3 points. intermediate_point is the 
00137     //- peak of the parabola - in this case, the point which is equidistant 
00138     //- from the start and end points of the parabola. The 3 points must form
00139     //- an isosceles triangle. This definition limits the user to generation 
00140     //- of the tip of parabolic shapes only.
00141    virtual Curve* make_elliptical_Curve( TBPoint const* point1,
00142                                          TBPoint const* point2,
00143                                          CubitVector &center_point, 
00144                                          double start_angle,
00145                                          double end_angle,
00146                                          CubitSense sense) const;
00147  
00148   
00149   virtual Surface* make_Surface(
00150     Surface *old_surface_ptr,
00151     std::map< TopologyBridge*, TopologyBridge* > *old_tb_to_new_tb = NULL ) const = 0;
00152     //R Surface*
00153     //R- Pointer to a newly created Surface object.
00154     //R- old_to_new_map
00155     //R- an optional parameter that maps all the entities of
00156     //R- the original to those of the copy.
00157     //I Surface*
00158     //I- The surface from which we want to create a new one.
00159     //- This function creates a new surface from an existing one.
00160     //- The new surface is attached to  geometry.  The
00161     //- goemetry is attached to a full data structure, loop, lump, bodies..
00162 
00163     virtual BodySM* make_extended_sheet( DLIList<Surface*> &surface_list,
00164                                          CubitBox *clip_box = NULL,
00165                                          bool preview = false ) const = 0;
00166     //R BodySM*
00167     //R- Pointer to a newly created BodySM object.
00168     //I surface_list
00169     //I- The surface_list from which we want to create an extended sheet.
00170     //I clip_box
00171     //I- An optional bounding box to clip the resultant sheet body by.
00172     //I preview
00173     //I- If true just draw the extended sheet instead of creating it
00174     //- This function creates a sheet body by extending the input surfaces.
00175     //- The result can be optionally clipped to fit inside of the given
00176     //- bounding box.
00177   
00178   virtual Surface* make_Surface( GeometryType surface_type, 
00179                                  DLIList<Curve*>& curve_list,
00180                                  Surface *old_surface_ptr = NULL,
00181                                  bool check_edges = true ) const = 0;
00182     //R Surface*
00183     //R- Pointer to a newly created Surface object.
00184     //I surface_type
00185     //I- The type of surface to be created.
00186     //I curve_list
00187     //I- list of curves to be used as the bounds of the Surface
00188     //- This function creates a Surface, of type, surface_type, given 
00189     //- the list of curves.
00190     //- The particular type of Surface object created depends on the 
00191     //- specific modeling engine.  For example, if the engine is 
00192     //- OCCGeometryEngine, then a SurfaceOCC is created.
00193   
00194   //virtual CubitStatus stitch_surfs(
00195    //                     DLIList<BodySM*> &surf_bodies,
00196    //                     BodySM *& stitched_Body )const= 0;
00197    //I List of surface_bodys you want stitched together
00198    //IO If stitching of FACEs is successful, stitched_Body is resultant BodySM.
00199    //   Means that all surfaces could be stitched together, forming a single BODY,
00200    //   but not a single FACE.
00201    //returns CUBIT_SUCCESS if stitching was successful, other return FAILURE
00202 
00203   virtual Lump* make_Lump( DLIList<Surface*>& surface_list ) const = 0;
00204     //R Lump*
00205     //R- Pointer to a newly created Lump object.
00206     //I lump_type
00207     //I- The type of surface to be created.
00208     //I surface_list
00209     //I- list of surfaces to be used as the bounds of the Lump
00210     //- This function creates a Lump, of type, lump_type, given 
00211     //- the list of surfaces.
00212     //- The particular type of Lump object created depends on the 
00213     //- specific modeling engine.  For example, if the engine is 
00214     //- OCCGeometryEngine, then a LumpOCC is created.
00215     //-
00216     //- NOTE on some hideous programming
00217     //-   This function not only creates the Lump, but also
00218     //-   creates the VGI entities Shell and CoFaces that
00219     //-   will be connected up with the RefVolume. For the sake
00220     //-   of expediency we are assuming that this function is
00221     //-   called when RefVolume needs to be made from Surfaces.
00222     //-
00223 
00224   virtual BodySM* make_BodySM( Surface * ) const = 0;
00225   
00226   virtual BodySM* make_BodySM( DLIList<Lump*>& /*lump_list*/ ) const = 0;
00227     //R BodySM*
00228     //R- Pointer to a newly created BodySM object.
00229     //I lump_list
00230     //I- list of lumps to be used to create the BodySM
00231     //- This function creates a BodySM given the list of lumps.
00232     //- The particular type of BodySM object created depends on the 
00233     //- specific modeling engine.  For example, if the engine is 
00234     //- OCCGeometryEngine, then a BodyOCC is created. Non-solid
00235     //- model based engines can use the default implementation 
00236     //- to return a NULL pointer.
00237     //-
00238     //- NOTE on some hideous programming
00239     //-   This function not only creates the Lump, but also
00240     //-   creates the VGI entities CoVolumes that
00241     //-   will be connected up with the Body. For the sake
00242     //-   of expediency we are assuming that this function is
00243     //-   called when Body needs to be made from RefVolumes.
00244     //-
00245   
00246 #ifdef KCM_MESH_TO_GEOM
00247      virtual CubitStatus mesh2brep(std::vector<double> &xvals,
00248                         std::vector<double> &yvals,
00249                         std::vector<double> &zvals,
00250                         std::vector<unsigned int> &tri_connectivity,
00251                         DLIList<BodySM*> &new_body_sms) const = 0;
00252     //I hex_list
00253     //I- List of hexes input by user
00254     //I tet_list
00255     //I- List of tets input by user
00256     //I face_list
00257     //I- List of quad faces input by user
00258     //I tri_list
00259     //I- List of tris input by user
00260     //R new_body_sms
00261     //R- List of new BodySM pointers.
00262     //- This function creates a real brep models from the mesh
00263     //- entities.  Any of the lists can be populated or filled
00264     //- and the function will do what it can.
00265 #endif 
00266      
00267      //HEADER- Functions for creation of primitives
00268       virtual BodySM* sphere(double radius) const = 0 ;
00269       //R Body*
00270       //R- A pointer to a newly created Body
00271       //I radius
00272       //I- Radius of the sphere
00273       //- Creates a sphere and assigns it to a Body.
00274       //- Returns pointer to the newly created body.
00275 
00276       virtual BodySM* brick ( double wid, double dep, double hi ) const = 0 ;
00277       //R Body*
00278       //R- A pointer to a newly created Body
00279       //I wid
00280       //I- Width of the brick
00281       //I dep
00282       //I- Depth of the brick
00283       //I hi
00284       //I- Height of the brick
00285       //- Creates a cuboid and assigns it to a Body.
00286       //- Returns pointer to the newly created body.
00287 
00288       virtual BodySM* brick( const CubitVector &center, 
00289                              const CubitVector axes[3],
00290                              const CubitVector &extension) const = 0 ;
00291       //R Body*
00292       //R- A pointer to a newly created Body
00293       //I center
00294       //I- Center location of the brick
00295       //I axes
00296       //I- XYZ axes of brick
00297       //I extension
00298       //I- Size of brick, equivalent to 1/2 width, height, depth
00299       //- Creates a cuboid and assigns it to a Body.
00300       //- Returns pointer to the newly created body.
00301 
00302       virtual BodySM* prism( double height, int sides, double major, 
00303                            double minor) const = 0 ;
00304       //- Creates a prism and assigns it to a Body $
00305       //- {height, major, minor} input height, major and minor radii. $
00306       //- {sides} input number of sides. Must be >= 3.
00307       //- Returns the ID of the new Body or CUBIT_FAILURE
00308 
00309       virtual BodySM* pyramid( double height, int sides, double major, 
00310                              double minor, double top=0.0) const = 0 ;
00311       //- Creates an  pyramid and assigns it to a Body $
00312       //- {height, major, minor} input height, major and minor radii. $
00313       //- {sides} input number of sides. Must be >= 3.
00314       //- {top} radius at top of pyramid.
00315       //- Returns the ID of the new Body or CUBIT_FAILURE
00316 
00317       virtual BodySM* cylinder( double hi, double r1, double r2, 
00318                               double r3 ) const = 0 ;
00319       //- Creates an  frustum and assigns it to a Body $
00320       //- {hi} input height $
00321       //- {r1} input radius in x-direction at base $
00322       //- {r2} input radius in y-direction at base $
00323       //- {r3} input radius in x-direction at top
00324       //- Returns the ID of the new Body or CUBIT_FAILURE
00325 
00326       virtual BodySM* torus( double r1, double r2 ) const = 0 ;
00327       //- Creates an  torus and assigns it to a Body $
00328       //- {r1} input major_radius $
00329       //- {r2} input minor_radius
00330       //- Returns the ID of the new Body or CUBIT_FAILURE 
00331 
00332       virtual BodySM* planar_sheet ( const CubitVector& p1,
00333                                      const CubitVector& p2,
00334                                      const CubitVector& p3,
00335                                      const CubitVector& p4 ) const = 0;
00336       //- Creates a solid body consisting of a planar sheet (no volume)
00337       //- {p1} - 1st corner of the sheet
00338       //- {p2} - 2nd corner of the sheet
00339       //- {p3} - 3rd corner of the sheet
00340       //- {p4} - 4th corner of the sheet
00341 
00342       virtual BodySM* copy_body ( BodySM* body_sm,
00343         std::map<TopologyBridge*, TopologyBridge*> *old_tb_to_new_tb = NULL ) const = 0;
00344       //R Body*
00345       //R- A pointer to the newly created body
00346       //R- old_to_new_map
00347       //R- an optional parameter that maps all the entities of
00348       //R- the original to those of the copy.
00349       //I bodyPtr
00350       //I- A pointer to the body to be copied
00351       //- This function makes a copy of the input Body and returns a
00352       //- pointer to the newly created copy. The input Body and the newly
00353       //- created Body are geometrically identical.
00354 
00355       virtual BodySM* create_body( VolumeFacets& volume, std::map<FacetShapes*, GeometryEntity*>& entity_map,
00356                                    const FacetPointSet& points, int interp_order) const = 0;
00357       //- creates a body with a volume from facet data
00358       //- VolumeFacets is populated with return data to associate sets of facets with newly created geometry entities
00359       
00360       //HEADER- Functions for boolean operations
00361 
00362       virtual CubitStatus subtract(DLIList<BodySM*> &tool_body_list,
00363                                    DLIList<BodySM*> &from_bodies,
00364                                    DLIList<BodySM*> &new_bodies,
00365                                    bool imprint = false, 
00366                                    bool keep_old = false) const = 0;
00367   
00368       virtual CubitStatus imprint(BodySM* BodyPtr1, BodySM* BodyPtr2,
00369                                   BodySM*& newBody1, BodySM*& newBody2,
00370                                   bool keep_old) const = 0;
00371 
00372       virtual CubitStatus imprint(DLIList<BodySM*> &from_body_list,
00373                                   DLIList<BodySM*> &new_from_body_list,
00374                                   bool keep_old,
00375                                   DLIList<TopologyBridge*> *new_tbs = NULL,
00376                                   DLIList<TopologyBridge*> *att_tbs = NULL) const = 0;
00377 
00378       virtual CubitStatus imprint( DLIList<BodySM*> &body_list,
00379                                    DLIList<Curve*> &ref_edge_list,
00380                                    DLIList<BodySM*>& new_body_list,
00381                                    DLIList<TopologyBridge*> &temporary_bridges,
00382                                    bool keep_old_body,
00383                                    bool show_messages= true) const = 0;
00384       //- Imprints a list of Bodies with a list of RefEdges.  All
00385       //- entities must be  entities.  Useful for splitting
00386       //- surfaces.  If edge pierces a surface a hardpoint will
00387       //- result at the pierce location.
00388 
00389       virtual CubitStatus imprint( DLIList<Surface*> &ref_face_list,
00390                                    DLIList<Curve*> &ref_edge_list,
00391                                    DLIList<TopologyBridge*> &temporary_bridges,
00392                                    DLIList<BodySM*>& new_body_list,
00393                                    bool keep_old_body ) const = 0;
00394       //- Imprints a list of Surfaces with a list of RefEdges.  This is
00395       //- useful if the user has a curve which spans several surfaces on 
00396       //- a body and only wants to imprint to selected surfaces.  Algorithm 
00397       //- does not support imprinting to free surfaces.
00398 
00399       virtual CubitStatus imprint( DLIList<Surface*> &surface_list,
00400                                    DLIList<DLIList<Curve*>*> &curve_lists_list,
00401                                    BodySM*& new_body,
00402                                    bool keep_old_body,
00403                                    bool expand = true,
00404                                    DLIList<TopologyBridge*> *new_tbs = NULL,
00405                                    DLIList<TopologyBridge*> *att_tbs = NULL ) const = 0;
00406       //- Imprints a list of Surfaces with list of Curves, sorted per
00407       //- Surface (ie., curve_lists_list is same length as surface_list).
00408       //- All input surfaces must be from the same body.
00409 
00410       virtual CubitStatus imprint( DLIList<BodySM*> &body_list,
00411                                    DLIList<CubitVector> &vector_list,
00412                                    DLIList<BodySM*>& new_body_list,
00413                                    bool keep_old_body,
00414                                    DLIList<TopologyBridge*> *new_tbs = NULL,
00415                                    DLIList<TopologyBridge*> *att_tbs = NULL,
00416                                    double *tol_in = NULL,
00417                                    bool clean_up_slivers = true) const = 0;
00418       //- Imprints a list of bodies with a list of vectors.  Useful for
00419       //- splitting curves and creating hardpoints on surfaces.
00420 
00421       virtual CubitStatus tolerant_imprint(DLIList<Surface*> &surfs_in,
00422                              DLIList<BodySM*> &new_bodysm_list) const = 0;
00423       virtual CubitStatus tolerant_imprint_surface_with_curves(
00424                                              Surface *surface_to_imprint,
00425                                              DLIList<Curve*> &curves,
00426                                              DLIList<TopologyBridge*> &temporary_bridges,
00427                                              BodySM *&new_body,
00428                                              DLIList<TopologyBridge*> *new_tbs = NULL,
00429                                              DLIList<TopologyBridge*> *att_tbs = NULL ) const = 0; 
00430 
00431       virtual CubitStatus tolerant_imprint( DLIList<BodySM*> &bodies_in,
00432                                             DLIList<BodySM*> &new_bodies,
00433                                             double overlap_tol,
00434                                             double imprint_tol,
00435                                    DLIList<TopologyBridge*> *new_tbs = NULL,
00436                                    DLIList<TopologyBridge*> *att_tbs = NULL ) const = 0;
00437 
00438       virtual CubitStatus imprint_projected_edges( 
00439                                        DLIList<Surface*> &ref_face_list,
00440                                        DLIList<Curve*> &ref_edge_list,
00441                                        DLIList<BodySM*>& new_body_list,
00442                                        DLIList<Curve*>& kept_free_edges,
00443                                        bool keep_old_body,
00444                                        bool keep_free_edges) const = 0;
00445       //- Imprints a list of Surfaces with a list of projected RefEdges.  
00446 
00447       virtual CubitStatus imprint_projected_edges(
00448                                        DLIList<Surface*> &ref_face_list,
00449                                        DLIList<BodySM*> &body_list,
00450                                        DLIList<Curve*> &ref_edge_list,
00451                                        DLIList<BodySM*>& new_body_list,
00452                                        bool keep_old_body,
00453                                        bool keep_free_edges) const = 0;
00454       //- Imprints a list of Bodies with a list of RefEdges which are projected
00455       //- to a list of Surfaces
00456       virtual CubitStatus remove_topology(DLIList<Curve*> &curves_to_remove,
00457                                        DLIList<Surface*> &surfs_to_remove,
00458                                        double backoff_distance,
00459                                        double small_edge_size,
00460                                        DLIList<BodySM*> &new_bodysm_list,
00461                                        CubitBoolean preview) const = 0;
00462 
00463       virtual CubitStatus project_edges( 
00464                              DLIList<Surface*> &ref_face_list,
00465                              DLIList<Curve*> &ref_edge_list_in,
00466                              DLIList<Curve*> &ref_edge_list_new,
00467                              bool print_error = true ) const = 0;
00468       //- Projects list RefEdges to a list of Surfaces
00469       
00470       virtual CubitStatus curve_surface_intersection( Surface *surface, 
00471                                                       Curve* curve,
00472                                                       DLIList<Curve*> &new_curves ) const = 0;
00473   
00474       virtual CubitStatus intersect(BodySM* tool_body_ptr,
00475                                     DLIList<BodySM*> &from_bodies,
00476                                     DLIList<BodySM*> &new_bodies,
00477                                     bool keep_old = false,
00478                                     bool preview = false ) const = 0;
00479       //R CubitStatus
00480       //R- CUBIT_SUCCESS/CUBIT_FAILURE
00481       //I BodyPtr1, BodyPtr2
00482       //I- Two Body pointers that will be Booleaned
00483       //O newBody (or newBody1, newBody2 for imprint)
00484       //O- The new Body build by boolean operation on two Bodys.
00485       //O- for imprint, the output is two Bodies.
00486       //- These functions perform boolean operations on two Bodys and 
00487       //- return the result through the output arguments. If the
00488       //- boolean operations fails at any stage, a NULL value is assigned 
00489       //- to the output argument(s) and the function returns 
00490       //- CUBIT_FAILURE. If everything goes well, the function returns 
00491       //- CUBIT_SUCCESS. The original Bodys are left untouched during the
00492       //- boolean operation. The boolean operation is carried out on 
00493       //- copies of the original Bodys.
00494 
00495       virtual CubitStatus chop( DLIList<BodySM*> &bodies, 
00496                               DLIList<BodySM*> &intersectBodies,
00497                               DLIList<BodySM*> &outsideBodies, 
00498                               BodySM*& leftoversBody,
00499                               bool keep_old = false,
00500                               bool nonreg = false) const = 0;
00501     //R CubitStatus
00502     //R-the result of the chop operation: Success or Failure
00503     //I bodies
00504     //I-DLIList<Body*>: a list of Body pointers that will be united
00505     //O intersectBody, outsideBody, leftoversBody
00506     //O- new Bodies build by chop operation on the list of  Body pointers.
00507     //- This function performs a chop of a tool body on a blank body  and returns 
00508     //- the result through the output argument intersectBody, outsideBody, leftoversBody. If the chop
00509     //- operation went through OK, the function returns CUBIT_SUCCESS. If,
00510     //- for some reason, the chop operation did not go well, the output
00511     //- argument is assigned a NULL value and the function returns 
00512     //- CUBIT_FAILURE. In either case, the original Bodys are left 
00513     //- untouched. 
00514       
00515 
00516       virtual CubitStatus thicken( DLIList<BodySM*>& bodies, 
00517                                    DLIList<BodySM*>& new_body_list,
00518                                    double depth,
00519                                    bool both = false) const = 0;
00520     //R CubitStatus
00521     //R-the result of the thicken operation: Success or Failure
00522     //I bodies
00523     //I-DLIList<Body*>: a list of Body pointers that will be thicken
00524     //O intersectBody, outsideBody, leftoversBody
00525     //O- new Bodies build by thicken operation on the list of  Body pointers.
00526     //- This function performs a thicken of sheet bodies and returns 
00527     //- the result through the output argument in_out_body. If the thicken
00528     //- operation went through OK, the function returns CUBIT_SUCCESS. If,
00529     //- for some reason, the thicken operation did not go well, the output
00530     //- argument is assigned a NULL value and the function returns 
00531     //- CUBIT_FAILURE.
00532 
00533      virtual CubitStatus flip_normals( DLIList<Surface*>& face_list ) const = 0;
00534     //R CubitStatus
00535     //R-the result of the flip_normal operation: Success or Failure
00536     //I bodies
00537     //I-DLIList<Surface*>: a list of Face pointers that will be fliped
00538     //O- If the flip operation went through OK, the function returns CUBIT_SUCCESS. If,
00539     //- for some reason, the flip operation did not go well, the output
00540     //- returns CUBIT_FAILURE.
00541       
00542      virtual CubitStatus hollow(DLIList<BodySM*>& bodies,
00543                                 DLIList<Surface*>& surfs_to_remove,
00544                                 DLIList<BodySM*>& new_bodies,
00545                                 double depth) const = 0;
00546      //R CubitStatus
00547     //R-the result of the hollow operation: Success or Failure
00548     //I body
00549     //I- for OCC: a list of solid BodySM's that will be hollowed into a list of
00550     //I- thick solids.
00551     //I- surfs_to_remove: the faces to be removed from the original solid (OCC).
00552     //O- new Bodies build by hollow operation on the  body pointers.
00553     //- This function performs a hollow of solid body and returns
00554     //- the result through the output argument in_out_body. If the hollow
00555     //- operation went through OK, the function returns CUBIT_SUCCESS. If,
00556     //- for some reason, the hollow operation did not go well, the output
00557     //- argument is assigned a NULL value and the function returns
00558     //- CUBIT_FAILURE.
00559       
00560     virtual void get_possible_invalid_tbs(DLIList<TopologyBridge*> &bridges_in,
00561                              DLIList<TopologyBridge*> &bridges_out) = 0;
00562     virtual CubitStatus unite( DLIList<BodySM*> &bodies, 
00563                                DLIList<BodySM*> &newBodies,
00564                            bool keep_old = false) const = 0;
00565       //R CubitStatus
00566       //R- CUBIT_SUCCESS/CUBIT_FAILURE
00567       //I bodies
00568       //I- A list of Bodys that will be united
00569       //O newBody 
00570       //O- The new Body built by the unite operation on the list of Bodys.
00571       //- This function performs a unite of a list of Bodys and returns 
00572       //- the result through the output argument, "newBody". If the unite
00573       //- operation went through OK, the function returns CUBIT_SUCCESS. If,
00574       //- for some reason, the unite operation did not go well, the output
00575       //- argument is assigned a NULL value and the function returns 
00576       //- CUBIT_FAILURE. In either case, the original Bodys are left 
00577       //- untouched.
00578 
00579       //HEADER- Sweep-related functions. All of these are implemented only for 
00580       //HEADER- RefEntities whose underlying geometry is represented by a solid
00581       //HEADER- model such as occ.
00582       
00583       virtual CubitStatus  sweep_translational(
00584                                       DLIList<GeometryEntity*>& ref_ent_list,
00585                                       DLIList<BodySM*>& result_body_list,
00586                                       const CubitVector& sweep_vector,
00587                                       double draft_angle,
00588                                       int draft_type,
00589                                       bool switchside,
00590                                       bool rigid,
00591                                       bool anchor_entity=CUBIT_FALSE,
00592                                       bool keep_old=CUBIT_FALSE ) const = 0;
00593 
00594       virtual CubitStatus sweep_helical(
00595                                       DLIList<GeometryEntity*>& ref_ent_list,
00596                                       DLIList<BodySM*>& result_body_list,
00597                                       CubitVector &location,
00598                                       CubitVector &direction,
00599                                       double &thread_distance,
00600                                       double &angle,
00601                                       bool right_handed,
00602                                       bool anchor_entity=CUBIT_FALSE,
00603                                       bool keep_old=CUBIT_FALSE ) const;
00604       
00605       virtual CubitStatus  sweep_perpendicular(
00606                                       DLIList<GeometryEntity*>& ref_ent_list,
00607                                       DLIList<BodySM*>& result_body_list,
00608                                       double distance,
00609                                       double draft_angle,
00610                                       int draft_type,
00611                                       bool switchside,
00612                                       bool rigid,
00613                                       bool anchor_entity=CUBIT_FALSE,
00614                                       bool keep_old=CUBIT_FALSE ) const = 0;
00615 
00616        virtual CubitStatus  sweep_rotational(
00617                                    DLIList<GeometryEntity*>& ref_ent_list,
00618                                    DLIList<BodySM*>& result_body_list,
00619                                    const CubitVector& point,
00620                                    const CubitVector& direction,
00621                                    double angle,                                   
00622                                    int steps = 0,
00623                                    double draft_angle = 0.0,
00624                                    int draft_type = 0,
00625                                    bool switchside = false,
00626                                    bool make_solid = false,
00627                                    bool rigid = false,
00628                                    bool anchor_entity=CUBIT_FALSE,
00629                                    bool keep_old=CUBIT_FALSE ) const = 0;
00630 
00631       virtual CubitStatus sweep_along_curve( 
00632                                    DLIList<GeometryEntity*>& ref_ent_list,
00633                                    DLIList<BodySM*>& result_body_list,
00634                                    DLIList<Curve*>& ref_edge_list,
00635                                    double draft_angle = 0.0,
00636                                    int draft_type = 0,
00637                                    bool rigid = false,
00638                                    bool anchor_entity=CUBIT_FALSE,
00639                                    bool keep_old=CUBIT_FALSE ) const= 0;
00640 
00641       virtual CubitStatus sweep_to_body(
00642                                    DLIList<Curve*> curve_list,
00643                                    BodySM *target_body,
00644                                    CubitVector distance, 
00645                                    DLIList<BodySM*> &new_bodies,
00646                                    bool unite) const = 0;
00647       virtual CubitStatus sweep_to_body(
00648                                    Surface  *source_surface,
00649                                    BodySM *target_body,
00650                                    CubitVector distance, 
00651                                    DLIList<BodySM*> &new_bodies ) const = 0;
00652      
00653 
00654       virtual CubitStatus scale( BodySM *&body, const CubitVector& factors ) = 0;
00655 
00656       //HEADER- Webcut-related functions
00657       virtual CubitStatus webcut( DLIList<BodySM*>& webcut_body_list, 
00658                                   const CubitVector &v1,
00659                                   const CubitVector &v2,
00660                                   const CubitVector &v3,
00661                                   DLIList<BodySM*>& neighbor_imprint_list,
00662                                   DLIList<BodySM*>& results_list,
00663                                   ImprintType imprint_type = NO_IMPRINT,
00664                                   bool preview = false) const = 0;
00665       //R int
00666       //R- Number of bodies that were webcut ( >= 0 )
00667       //I webcut_body_list
00668       //I- The list of bodies to be webcut
00669       //I plane
00670       //I- The plane to be used for webcutting.
00671       //I merge
00672       //I- A flag to decide whether the new bodies created by the
00673       //I- webcutting process should be merged or not.
00674       //I imprint
00675       //I- A flag to decide whether the new bodies created by the
00676       //I- webcutting process should be imprinted or not.
00677       //- This function webcuts a list of bodies through a plane.
00678       //- The newly created bodies are merged and imprinted depeding on 
00679       //- the respective flags.
00680 
00681       virtual CubitStatus webcut(DLIList<BodySM*>& webcut_body_list, 
00682                                  BodySM const* tool_body,
00683                                  DLIList<BodySM*>& neighbor_imprint_list,
00684                                  DLIList<BodySM*>& results_list,
00685                                  ImprintType imprint_type = NO_IMPRINT,
00686                                  bool preview = false) const = 0 ;
00687       //R int       
00688       //R- Number of bodies that were webcut ( >= 0 )
00689       //I webcut_body_list
00690       //I- The list of bodies to be webcut
00691       //I tool_body
00692       //I- The body to be used for webcutting.
00693       //I merge
00694       //I- A flag to decide whether the new bodies created by the
00695       //I- webcutting process should be merged or not.
00696       //I imprint
00697       //I- A flag to decide whether the new bodies created by the
00698       //I- webcutting process should be imprinted or not.
00699       //- This function webcuts a list of bodies using another body
00700       //- as the webcutting tool. The newly created bodies are 
00701       //- merged and imprinted depeding on the respective flags.
00702 
00703       virtual CubitStatus webcut_across_translate( 
00704                                               DLIList<BodySM*>& body_list, 
00705                                               Surface* plane_surf1,
00706                                               Surface* plane_surf2,
00707                                               DLIList<BodySM*>& neighbor_imprint_list,
00708                                               DLIList<BodySM*>& results_list, 
00709                                               ImprintType imprint_type = NO_IMPRINT,
00710                                               bool preview = false) const = 0;
00711      
00712           
00713         //- R status
00714       //- R-results_list of bodies affected, or created from webcut.
00715       //- I- Bodies to be webcut, plane to define cuts, and imprint merge flags.
00716       //- This is an experimental function, hooked to the Cat GUI for making
00717       //- bodies one to one sweeps.
00718 
00719       virtual CubitStatus webcut_with_sheet(DLIList<BodySM*>& webcut_body_list,
00720                                             BodySM *sheet_body,
00721                                             DLIList<BodySM*>& neighbor_imprint_list,
00722                                             DLIList<BodySM*> &new_bodies,
00723                                             ImprintType imprint_type = NO_IMPRINT,
00724                                             bool preview = false) = 0;
00725       //- webcuts a body using a sheet body.
00726       //- It splits the sheet into two single sided bodies.
00727       //- it then subtracts this with the webcut body.
00728       //- The result is splitting the webcut_body into halves.
00729       //- if the webcut body is a topological torus, this routine
00730       //- will fail...
00731   
00732       virtual CubitStatus webcut_with_extended_sheet(
00733                                             DLIList<BodySM*> &webcut_body_list,
00734                                             DLIList<Surface*> &surface_list,
00735                                             DLIList<BodySM*>& neighbor_imprint_list,
00736                                             DLIList<BodySM*> &new_bodies,
00737                                             int &num_cut,
00738                                             ImprintType imprint_type = NO_IMPRINT,
00739                                             bool preview = false) = 0;
00740       //- creates a sheet by extending the given surfaces then webcuts using
00741       //- this sheet.(see webcut_with_sheet).
00742  
00743       virtual CubitStatus webcut_with_sweep_surfaces(
00744                             DLIList<BodySM*> &blank_bodies,
00745                             DLIList<Surface*> &surfaces,
00746                             const CubitVector& sweep_vector,
00747                             bool sweep_perp, 
00748                             bool through_all,
00749                             bool outward,
00750                             bool up_to_next, 
00751                             Surface *stop_surf, 
00752                             Curve *curve_to_sweep_along, 
00753                             DLIList<BodySM*>& neighbor_imprint_list,
00754                             DLIList<BodySM*> &results_list,
00755                             ImprintType imprint_type = NO_IMPRINT,
00756                             CubitBoolean preview = false) = 0;
00757 
00758       virtual CubitStatus webcut_with_sweep_curves(
00759                             DLIList<BodySM*> &blank_bodies,
00760                             DLIList<Curve*> &curves,
00761                             const CubitVector& sweep_vector,
00762                             bool through_all, 
00763                             Surface *stop_surf, 
00764                             Curve *curve_to_sweep_along, 
00765                             DLIList<BodySM*>& neighbor_imprint_list,
00766                             DLIList<BodySM*> &results_list,
00767                             ImprintType imprint_type = NO_IMPRINT,
00768                             CubitBoolean preview = false) = 0;
00769 
00770       virtual CubitStatus webcut_with_sweep_curves_rotated(
00771                             DLIList<BodySM*> &blank_bodies,
00772                             DLIList<Curve*> &curves,
00773                             const CubitVector &point,
00774                             const CubitVector &sweep_axis,
00775                             double angle,
00776                             Surface *stop_surf, 
00777                             DLIList<BodySM*>& neighbor_imprint_list,
00778                             DLIList<BodySM*> &results_list,
00779                             ImprintType imprint_type = NO_IMPRINT,
00780                             CubitBoolean preview = false) = 0;
00781 
00782       virtual CubitStatus webcut_with_sweep_surfaces_rotated(
00783                             DLIList<BodySM*> &blank_bodies,
00784                             DLIList<Surface*> &surfaces,
00785                             const CubitVector &point, 
00786                             const CubitVector &sweep_axis, 
00787                             double angle, 
00788                             Surface *stop_surf, 
00789                             bool up_to_next, 
00790                             DLIList<BodySM*>& neighbor_imprint_list,
00791                             DLIList<BodySM*> &results_list,
00792                             ImprintType imprint_type = NO_IMPRINT,
00793                             CubitBoolean preview = false) = 0;
00794 
00795       virtual CubitStatus webcut_with_cylinder( 
00796                                         DLIList<BodySM*> &webcut_body_list,                                                                       double radius,
00797                                         const CubitVector &axis,
00798                                         const CubitVector &center,
00799                                         DLIList<BodySM*>& neighbor_imprint_list,
00800                                         DLIList<BodySM*>& results_list,
00801                                         ImprintType imprint_type = NO_IMPRINT,
00802                                         CubitBoolean preview = false) = 0;
00803       //- webcuts a body using a cylinder give the input parameters.
00804 
00805       virtual CubitStatus webcut_with_brick( 
00806                                      DLIList<BodySM*>& webcut_body_list, 
00807                                      const CubitVector &center, 
00808                                      const CubitVector axes[3], 
00809                                      const CubitVector &extension,
00810                                      DLIList<BodySM*>& neighbor_imprint_list,
00811                                      DLIList<BodySM*> &results_list,
00812                                      ImprintType imprint_type = NO_IMPRINT,
00813                                      CubitBoolean preview = false) = 0;
00823       virtual CubitStatus webcut_with_planar_sheet( 
00824                                             DLIList<BodySM*>& webcut_body_list, 
00825                                             const CubitVector &center, 
00826                                             const CubitVector axes[2],
00827                                             double width, double height,
00828                                             DLIList<BodySM*>& neighbor_imprint_list,
00829                                             DLIList<BodySM*> &results_list,
00830                                             ImprintType imprint_type = NO_IMPRINT,
00831                                             bool preview = false) = 0;
00838       virtual CubitStatus webcut_with_curve_loop(
00839                                          DLIList<BodySM*> &webcut_body_list,
00840                                          DLIList<Curve*> &ref_edge_list,
00841                                          DLIList<BodySM*>& neighbor_imprint_list,
00842                                          DLIList<BodySM*>& results_list,
00843                                          ImprintType imprint_type = NO_IMPRINT,
00844                                          bool preview = false) = 0;
00845       //- webcuts a body list using a temp sheet body created from the curve loop
00846 
00847 
00848       virtual CubitStatus section( DLIList<BodySM*> &section_body_list,
00849                                    const CubitVector &point_1,
00850                                    const CubitVector &point_2,
00851                                    const CubitVector &point_3,
00852                                    DLIList<BodySM*>& new_body_list,
00853                                    bool keep_normal_side,
00854                                    bool keep_old = false,
00855                                    bool keep_both_sides = false) = 0;
00856       //- Section will cut a list a bodies and keep a side of the bodies.
00857       //- The bodies are cut with a planar surface (surface will be extended).
00858   
00859       virtual CubitStatus split_body( BodySM *body_ptr,
00860                                       DLIList<BodySM*> &new_bodies ) = 0;
00861       //- Splits a body with multiple volumes into multiple bodies
00862       //- each having only one volume.
00863 
00864       virtual CubitStatus split_free_curve( Curve *curve,
00865                                         DLIList<CubitVector> &split_locations,
00866                                         DLIList<Curve*> &new_curves );
00867 
00868       virtual CubitStatus separate_surfaces( DLIList<Surface*> &surf_list,
00869                                              DLIList<BodySM*> &new_bodies ) = 0;
00870       //- Separates surfaces from sheet bodies into separate bodies.  Connected
00871       //- surfaces will remain connected but be placed in a new body.
00872   
00873       virtual CubitStatus reverse_body( BodySM *body_to_reverse ) = 0;
00874       //- Reverse body (turn it inside-out).
00875   
00876       virtual CubitStatus split_periodic( BodySM *body_ptr,
00877                                           BodySM *&new_body ) = 0;
00878       //- Splits the periodic surfaces along the 0 and PI/2's periods.
00879 
00880       virtual CubitStatus regularize_body( BodySM *body_ptr,
00881                                            BodySM *&new_body_ptr ) = 0;
00882       //- Removes all unnecessary faces, edges and vertices from the body.   
00883       
00884         virtual CubitStatus regularize_entity( GeometryEntity *old_entity_ptr,  
00885                                              BodySM *&new_body_ptr) = 0;
00886       //- Removes all all unnessesary faces, curves, vertices and associated
00887       //- data from a refentity.
00888         virtual CubitStatus test_regularize_entity( GeometryEntity *old_entity_ptr) = 0;
00889    
00890       virtual CubitStatus offset_curves( DLIList<Curve*>& ref_edge_list, 
00891                                          DLIList<Curve*>& result_curve_list,
00892                                          double offset_distance, 
00893                                          const CubitVector& offset_direction, 
00894                                          int gap_type = 1 ) = 0;
00895       //- Creates curves offset from a chain of curves.  The offset direction is
00896       //- only used if there is one linear curve.  Otherwise, the offset direction
00897       //- is calculated by occ (the cross product of the wires tangent and the
00898       //- planar normal).  The gap type is 0 - rounded, 1 - extended, 2 - natural.
00899 
00900       virtual CubitStatus  split_curve( Curve* curve_to_split,
00901                                         const CubitVector& split_location,
00902                                         DLIList<Curve*>& created_curves ) = 0;
00903       //- Splits a curve at the specified location.
00904       //- the single passed in curve is split into two curves at the split location
00905       //- the two resulting curves are added to the passed in list
00906       
00907       
00908       virtual Curve* trim_curve( Curve* trim_curve, 
00909                                       const CubitVector& trim_vector, 
00910                                       const CubitVector& keep_vector,
00911                                       bool keep_old = false ) = 0;
00912       //- Trims or extends a curve, up to the trim_vector.  If trimming, the 
00913       //- keep_vector determines which side of the curve to keep.  If the curve 
00914       //- is not free, the curve is automatically copied before trimming (so
00915       //- a new curve results).
00916 
00917       virtual CubitStatus create_solid_bodies_from_surfs( 
00918                                       DLIList<Surface*> &ref_face_list, 
00919                                       DLIList<BodySM*> &new_bodies,
00920                                       bool keep_old = false,
00921                                       bool heal = true,
00922                                       bool sheet = false ) const = 0;
00923       //- Creates a single body from a set of faces.  The faces can only be attached
00924       //- to bodies if they are sheet bodies.  It is assumed that the calling code will
00925       //- check for this, ie GeometryTool.
00926 
00927       virtual Curve* create_arc(const CubitVector& position,
00928                                double radius,
00929                                double start_angle,
00930                                double end_angle,
00931                                CubitVector plane,
00932                                CubitBoolean preview = CUBIT_FALSE )=0;
00933 
00934       virtual Curve* create_arc_radius(const CubitVector &center,
00935                            TBPoint* ref_vertex_start,
00936                            TBPoint* ref_vertex_end, 
00937                            const CubitVector &normal,
00938                            double radius,
00939                            bool full = false,
00940                            CubitBoolean preview = CUBIT_FALSE )=0;
00941 
00942       virtual Curve* create_arc_three( TBPoint* pt1, 
00943                                        TBPoint* pt2,
00944                                        TBPoint* pt3,
00945                                        bool full = false,
00946                                        CubitBoolean preview = CUBIT_FALSE  ) = 0;
00947       virtual Curve* create_arc_three( Curve* curve1,
00948                                        Curve* curve2,
00949                                        Curve* curve3,
00950                                        bool full = false,
00951                                        CubitBoolean preview = CUBIT_FALSE  ) = 0;
00952   
00953       virtual Curve* create_arc_center_edge( TBPoint* point1,
00954                                              TBPoint* point2,
00955                                              TBPoint* point3,
00956                                              const CubitVector &normal,
00957                                              double radius = CUBIT_DBL_MAX,
00958                                              bool full = false,
00959                                              CubitBoolean preview = CUBIT_FALSE  ) = 0;
00960 
00961       //- Methods to create arcs.  First uses 3 points on arc, next creates arc
00962       //- tangent to 3 curves, last creates arc using center and two points on arc.
00963       //- If full option is specified, a full circle is created.
00964 
00965       virtual CubitStatus create_curve_combine( DLIList<Curve*>& curve_list, 
00966                                     Curve *&new_curve_ptr ) = 0;
00967       //-  Uses the solid modeller to create a new RefEdge that is a combination 
00968       //- of the input chain of edges.  
00969       //-
00970    
00971       virtual Curve* create_curve_helix( CubitVector &location,
00972                                            CubitVector &direction,
00973                                            CubitVector &start_point,
00974                                            double &thread_distance,
00975                                            double &angle,
00976                                            bool right_handed) const; 
00977 
00978   
00979       virtual GeometryQueryEngine *get_gqe() = 0;
00983       virtual CubitBoolean is_modify_engine(const TopologyBridge *) const 
00984         {return CUBIT_FALSE;};
00988       virtual CubitStatus get_offset_intersections( 
00989                                Curve* ref_edge1, 
00990                                Curve* ref_edge2,
00991                                DLIList<CubitVector>& intersection_list,
00992                                double offset = 0.0, 
00993                                bool ext_first = true ) = 0;
00994     //- Finds the intersections of a certain distance (offset) between two
00995     //- curves.  The two curves must lie in a plane.  The first curve is offset 
00996     //- the offset distance in both directions, and the bounded intersections with 
00997     //- the second curve are found.  The first curve and optionally be extended
00998     //- to infinity for the intersection calculation.  The intent of the function
00999     //- is so that the user can create a point on a curve a certain distance
01000     //- from another curve, as in specifying a reference location for a gage 
01001     //- diameter on an arc in an engineering drawing.
01002 
01003   virtual CubitStatus get_offset_intersections( 
01004                                Curve* ref_edge_ptr, 
01005                                Surface* ref_face_ptr,
01006                                DLIList<CubitVector> &intersection_list,
01007                                double offset = 0.0, 
01008                                bool ext_surf = true ) = 0;
01009     //- Finds intersections (points) of the curve and surface.  The surface can 
01010     //- be offset - it is offset to each side and intersections are found.  By
01011     //- default the surface is extended to infinity (if possible) and the 
01012     //- intersections are found.  The function allocates the CubitVectors in 
01013     //- the returned list, so be sure to free them.
01014   
01015   virtual CubitStatus surface_intersection( Surface *surface1_ptr,
01016                                             Surface *surface2_ptr,
01017                                             DLIList<Curve*> &inter_graph,
01018                                             const double tol) const = 0;
01019     //- Finds the intersection of two bodies defined by the curves of the
01020     //- intersection graph.
01021 
01022   virtual CubitStatus get_mid_plane( const CubitVector &point_1,
01023                                            const CubitVector &point_2,
01024                                      const CubitVector &point_3,
01025                                            BodySM *body_to_trim_to,
01026                                            BodySM *&midplane_body ) const = 0;
01027     //- Finds the mid plane described by the 3 points and trims
01028     //- it to the body.  It returns the mid planes as part of the 
01029     //- midplane_body
01030 
01031   virtual CubitStatus get_spheric_mid_surface( Surface *surface_ptr1,
01032                            Surface *surface_ptr2,
01033                            BodySM *body_to_trim_to,
01034                            BodySM *&midsurface_body ) const = 0;
01035 
01036   virtual CubitStatus get_conic_mid_surface( Surface *surface_ptr1,
01037                            Surface *surface_ptr2,
01038                            BodySM *body_to_trim_to,
01039                            BodySM *&midsurface_body ) const = 0;
01040 
01041   virtual CubitStatus get_toric_mid_surface( Surface *surface_ptr1,
01042                            Surface *surface_ptr2,
01043                            BodySM *body_to_trim_to,
01044                            BodySM *&midsurface_body ) const = 0;
01045 
01046  virtual CubitStatus tweak_bend(  DLIList<BodySM*> &bend_bodies,
01047                                   DLIList<BodySM*> &new_bodysm_list,
01048                                   CubitVector& neutral_root,
01049                                   CubitVector& bend_axis,
01050                                   CubitVector& bend_direction,
01051                                   double radius,
01052                                   double angle,
01053                                   DLIList<CubitVector>& bend_regions,
01054                                   double width = -1,
01055                                   CubitBoolean center_bend = CUBIT_FALSE,
01056                                   int num_points = 0,
01057                                   CubitBoolean keep_old_body = CUBIT_FALSE,
01058                                   CubitBoolean preview = CUBIT_FALSE ) const = 0;
01059 
01060   virtual CubitStatus tweak_chamfer( DLIList<Curve*> &curve_list, 
01061                                      double left_offset,
01062                                      DLIList<BodySM*> &new_bodysm_list,
01063                                      double right_offset = -1.0,
01064                                      CubitBoolean keep_old_body = CUBIT_FALSE,
01065                                      CubitBoolean preview = CUBIT_FALSE ) const = 0;
01072   virtual CubitStatus tweak_chamfer( DLIList<TBPoint*> &point_list, 
01073                                      double offset1, 
01074                                      DLIList<BodySM*> &new_bodysm_list,
01075                                      Curve *edge1 = NULL,
01076                                      double offset2 = -1.0,
01077                                      Curve *edge2 = NULL,
01078                                      double offset3 = -1.0,
01079                                      Curve *edge3 = NULL,
01080                                      CubitBoolean keep_old_body = CUBIT_FALSE,
01081                                      CubitBoolean preview = CUBIT_FALSE ) const = 0;
01089   virtual CubitStatus tweak_fillet( DLIList<Curve*> &curve_list, 
01090                                     double radius,
01091                                     DLIList<BodySM*> &new_bodysm_list,
01092                                     CubitBoolean keep_old_body = CUBIT_FALSE,
01093                                     CubitBoolean preview = CUBIT_FALSE ) const = 0;
01097   virtual CubitStatus tweak_fillet( Curve *curve_ptr, 
01098                                     double start_radius,
01099                                     double end_radius,
01100                                     BodySM *&new_bodysm_ptr,
01101                                     CubitBoolean keep_old_body = CUBIT_FALSE,
01102                                     CubitBoolean preview = CUBIT_FALSE ) const = 0;
01107   virtual CubitStatus tweak_fillet( DLIList<TBPoint*> &point_list, 
01108                                     double radius,
01109                                     DLIList<BodySM*> &new_bodysm_list,
01110                                     CubitBoolean keep_old_body = CUBIT_FALSE,
01111                                     CubitBoolean preview = CUBIT_FALSE ) const = 0;
01115   virtual CubitStatus tweak_move( DLIList<Surface*> &surface_list,
01116                                   const CubitVector &delta,
01117                                   DLIList<BodySM*> &new_bodysm_list,
01118                                   CubitBoolean keep_old_body = CUBIT_FALSE,
01119                                   CubitBoolean preview = CUBIT_FALSE ) const = 0;
01123   virtual CubitStatus tweak_move( DLIList<Curve*> &curve_list,
01124                                   const CubitVector &delta,
01125                                   DLIList<BodySM*> &new_bodysm_list,
01126                                   CubitBoolean keep_old_body = CUBIT_FALSE,
01127                                   CubitBoolean preview = CUBIT_FALSE ) const = 0;
01131   virtual CubitStatus tweak_offset( DLIList<Surface*> &surface_list,
01132                                     double offset_distance,
01133                                     DLIList<Surface*> *add_surface_list_ptr, 
01134                                     DLIList<double> *add_offset_list_ptr,
01135                                     DLIList<BodySM*> &new_bodysm_list,
01136                                     CubitBoolean keep_old_body = CUBIT_FALSE,
01137                                     CubitBoolean preview = CUBIT_FALSE ) const = 0;
01142   virtual CubitStatus tweak_offset( DLIList<Curve*> &curve_list,
01143                                     double offset_distance,
01144                                     DLIList<Curve*> *add_curve_list_ptr, 
01145                                     DLIList<double> *add_offset_list_ptr,
01146                                     DLIList<BodySM*> &new_bodysm_list,
01147                                     CubitBoolean keep_old_body = CUBIT_FALSE,
01148                                     CubitBoolean preview = CUBIT_FALSE ) const = 0;
01153   virtual CubitStatus tweak_remove( DLIList<Surface*> &surface_list,
01154                                     DLIList<BodySM*> &new_bodysm_list,
01155                                     CubitBoolean extend_adjoining = CUBIT_TRUE,
01156                                     CubitBoolean keep_old_body = CUBIT_FALSE,
01157                                     CubitBoolean preview = CUBIT_FALSE ) const = 0;
01162   virtual CubitStatus tweak_remove( DLIList<Curve*> &curve_list,
01163                                     DLIList<BodySM*> &new_bodysm_list, 
01164                                     CubitBoolean keep_old_body = CUBIT_FALSE,
01165                                     CubitBoolean preview = CUBIT_FALSE ) const = 0;
01171   virtual CubitStatus tweak_target( DLIList<Surface*> &surface_list,
01172                                     DLIList<Surface*> &target_surf_list,
01173                                     DLIList<BodySM*> &new_bodysm_list,
01174                                     CubitBoolean extend_flg = CUBIT_TRUE,
01175                                     CubitPlane *limit_plane = NULL,
01176                                     CubitBoolean reverse_flg = CUBIT_FALSE,
01177                                     CubitBoolean keep_old_body = CUBIT_FALSE,
01178                                     CubitBoolean preview = CUBIT_FALSE ) const = 0;
01190   virtual CubitStatus tweak_target( DLIList<Curve*> &curve_list,
01191                                     DLIList<Surface*> &target_surf_list, 
01192                                     DLIList<BodySM*> &new_bodysm_list,
01193                                     CubitBoolean extend_flg = CUBIT_TRUE,
01194                                     CubitPlane *limit_plane = NULL,
01195                                     CubitBoolean reverse_flg = CUBIT_FALSE,
01196                                     CubitBoolean keep_old_body = CUBIT_FALSE,
01197                                     CubitBoolean preview = CUBIT_FALSE,
01198                                     double max_area_increase = 0 ) const = 0;
01213   virtual CubitStatus tweak_target( DLIList<Curve*> &curve_list,
01214                                     DLIList<Curve*> &target_curve_list, 
01215                                     DLIList<BodySM*> &new_bodysm_list,
01216                                     CubitBoolean extend_flg = CUBIT_TRUE,
01217                                     CubitPlane *limit_plane = NULL,
01218                                     CubitBoolean reverse_flg = CUBIT_FALSE,
01219                                     CubitBoolean keep_old_body = CUBIT_FALSE,
01220                                     CubitBoolean preview = CUBIT_FALSE,
01221                                     double max_area_increase = 0) const = 0;
01235   virtual CubitStatus tweak_target( TBPoint *point_ptr,
01236                                     DLIList<Surface*> &modify_surface_list,
01237                                     CubitVector &target_loc,
01238                                     BodySM *&new_bodysm_ptr,
01239                                     CubitBoolean keep_old_body = CUBIT_FALSE,
01240                                     CubitBoolean preview = CUBIT_FALSE ) const = 0;
01249   virtual CubitStatus remove_curve_slivers( BodySM *bodies, double lengthlimit ) const = 0;
01250 
01251   virtual CubitStatus create_net_surface( DLIList<Surface*>& ref_face_list, BodySM *& new_body,
01252                                           DLIList<DLIList<CubitVector*>*> &vec_lists_u, 
01253                                           DLIList<DLIList<CubitVector*>*> &vec_lists_v, 
01254                                           double net_tol = 1e-3, CubitBoolean heal = CUBIT_TRUE ) const = 0;
01255 
01256   virtual CubitStatus create_net_surface( DLIList<Curve*>& u_curves, DLIList<Curve*>& v_curves,
01257                                           BodySM *& new_body, double net_tol = 1e-3,
01258                                           CubitBoolean heal = CUBIT_TRUE ) const = 0;
01259 
01260   virtual CubitStatus create_offset_surface( Surface* ref_face_ptr, BodySM*& new_body, double offset_distance ) const = 0;
01261 
01262   virtual CubitStatus create_offset_sheet( DLIList<Surface*> &surface_list,
01263                                            double offset_distance,
01264                                            DLIList<Surface*> *add_surface_list_ptr,
01265                                            DLIList<double> *add_offset_list_ptr,
01266                                            DLIList<BodySM*> &new_body_list,
01267                                            CubitBoolean preview = CUBIT_FALSE ) const = 0;
01276   virtual CubitStatus create_offset_body( BodySM* body_ptr, BodySM*& new_body, double offset_distance ) const = 0;
01277 
01278   virtual CubitStatus create_skin_surface( DLIList<Curve*>& curves, BodySM*& new_body,
01279                                            DLIList<Curve*>& guides) const = 0;
01280 
01281     
01282 
01283 
01284   virtual CubitStatus loft_surfaces_to_body( DLIList<Surface*> &surfaces,
01285                                              DLIList<double> &takeoff_factor_list,
01286                                              DLIList<Surface*> &takeoff_vector_surface_list,
01287                                              DLIList<CubitVector> &surface_takeoff_vector_list,
01288                                              DLIList<Curve*> &takeoff_vector_curve_list,
01289                                              DLIList<CubitVector> &curve_takeoff_vector_list,
01290                                              DLIList<Curve*> &guides,
01291                                              DLIList<TBPoint*> &match_vertices_list,
01292                                              BodySM*& new_body,
01293                                              CubitBoolean global_guides,
01294                                              CubitBoolean closed,
01295                                              CubitBoolean show_matching_curves,
01296                                              CubitBoolean preview
01297                                              ) const = 0;
01298 
01299 
01300 
01301   virtual CubitStatus create_surface( DLIList<CubitVector*>& vec_list,
01302                                       BodySM *&new_body, Surface *ref_face_ptr, 
01303                                          CubitBoolean project_points ) const = 0;
01304 
01305   virtual CubitStatus create_parallelogram_surface( TBPoint *pt1, 
01306                                                     TBPoint *pt2,
01307                                                     TBPoint *pt3,
01308                                                     BodySM *&sheet_body) const;
01309 
01310   virtual CubitStatus create_rectangle_surface( double width, 
01311                                                 double height,
01312                                                 CubitVector plane,
01313                                                 BodySM *&sheet_body) const;
01314 
01315   virtual CubitStatus create_circle_surface( TBPoint *pt1, 
01316                                              CubitVector center_point,
01317                                              TBPoint *pt3,
01318                                              BodySM *&sheet_body) const;
01319 
01320   virtual CubitStatus create_circle_surface( TBPoint *pt1, 
01321                                              TBPoint *pt3,
01322                                              CubitVector center_point,
01323                                              BodySM *&sheet_body) const;
01324 
01325   virtual CubitStatus create_circle_surface( double radius,  
01326                                              CubitVector plane,
01327                                              BodySM *&sheet_body) const;
01328 
01329   virtual CubitStatus create_ellipse_surface( TBPoint *pt1, 
01330                                               TBPoint *pt3,
01331                                               CubitVector center_point,
01332                                               BodySM *&sheet_body) const;
01333 
01334   virtual CubitStatus create_ellipse_surface( double major_radius, 
01335                                               double minor_radius, 
01336                                               CubitVector plane, 
01337                                               BodySM *&sheet_body) const;
01338 
01339   virtual CubitStatus create_surface( DLIList<TBPoint*> &points,
01340                                       BodySM *&new_body,
01341                                       Surface *on_surface ) const = 0;
01342 
01343   virtual CubitStatus create_weld_surface( CubitVector &root,
01344                                            Surface *ref_face1, double leg1, Surface *ref_face2, double leg2,
01345                                            BodySM *&new_body ) const = 0;
01346 
01347   virtual CubitBoolean bodies_interfering( BodySM *body1,  BodySM *body2 ) const {return CUBIT_FALSE;}
01348 
01349   virtual CubitStatus stitch( DLIList<BodySM*> &bodies_to_stitch,
01350                       DLIList<BodySM*> &new_bodies,
01351                       bool tighten_gaps,
01352                       double tolerance )const = 0; 
01353 
01354   protected: 
01355   
01356   private:
01357 
01358 };
01359 
01360 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines