Author: janehu Date: 2007-10-10 11:21:08 -0500 (Wed, 10 Oct 2007) New Revision: 1305 Modified: cgm/trunk/geom/OCC/OCCBody.cpp cgm/trunk/geom/OCC/OCCBody.hpp cgm/trunk/geom/OCC/OCCCoEdge.cpp cgm/trunk/geom/OCC/OCCCurve.cpp cgm/trunk/geom/OCC/OCCCurve.hpp cgm/trunk/geom/OCC/OCCLoop.cpp cgm/trunk/geom/OCC/OCCLump.cpp cgm/trunk/geom/OCC/OCCLump.hpp cgm/trunk/geom/OCC/OCCModifyEngine.cpp cgm/trunk/geom/OCC/OCCModifyEngine.hpp cgm/trunk/geom/OCC/OCCParamTool.cpp cgm/trunk/geom/OCC/OCCPoint.cpp cgm/trunk/geom/OCC/OCCPoint.hpp cgm/trunk/geom/OCC/OCCQueryEngine.cpp cgm/trunk/geom/OCC/OCCQueryEngine.hpp cgm/trunk/geom/OCC/OCCShell.cpp cgm/trunk/geom/OCC/OCCShell.hpp cgm/trunk/geom/OCC/OCCSurface.cpp cgm/trunk/geom/OCC/OCCSurface.hpp Log: First version for OCCPoint*, which is a GeometryEntity. Plannig to add OCCVertex* for corresponding topology entity later. -JH Modified: cgm/trunk/geom/OCC/OCCBody.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCBody.cpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCBody.cpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -14,8 +14,8 @@ // ********** BEGIN STANDARD INCLUDES ********** #include <assert.h> // ********** END STANDARD INCLUDES ********** +#include "config.h" - // ********** BEGIN CUBIT INCLUDES ********** #include "CubitDefines.h" #include "CubitString.hpp" @@ -98,365 +98,7 @@ //---------------------------------------------------------------- BodySM* OCCBody::copy() { - CubitStatus rv; - - // ----------Copy the points on the body------------------------ - - int ii; - DLIList<OCCPoint*> point_list; - get_points(point_list); - DLIList<Point*> copy_points; - point_list.reset(); - Point *point_ptr; - Point *point_copy; - for(ii=0; ii<point_list.size(); ii++) - { - point_ptr = point_list.get_and_step(); - CubitVector temp_vector = point_ptr->coordinates(); - - rv = OCCModifyEngine::instance()->make_facet_point(temp_vector, - point_copy); - if(rv != CUBIT_SUCCESS) - { - PRINT_ERROR("Couldn't copy points"); - return (BodySM *)NULL; - } - copy_points.append( point_copy ); - } - - // ------------------Copy the curves------------------------- - - int jj; - DLIList<OCCCurve*> curve_list; - get_curves( curve_list ); - DLIList<Curve*> copy_curves; - curve_list.reset(); - Curve *curve_ptr, *curve_copy; - Curve *curvsm_copy = NULL; - OCCCurve *fcurve; - Point *ptsm_ptr; - Point *start_ptr, *end_ptr, *copy_start = NULL, *copy_end = NULL; - for (ii=0; ii<curve_list.size(); ii++) - { - curve_ptr = curve_list.get_and_step(); - fcurve = CAST_TO( curve_ptr, OCCCurve ); - start_ptr = fcurve->start_point(); - end_ptr = fcurve->end_point(); - int found0 = 0; - int found1 = 0; - - // find the end points - - point_list.reset(); - copy_points.reset(); - for (jj=0; jj<point_list.size() && (!found0 || !found1); jj++) - { - point_ptr = point_list.get_and_step(); - ptsm_ptr = CAST_TO(point_ptr, Point); - point_copy = copy_points.get_and_step(); - if (ptsm_ptr == start_ptr) - { - copy_start = point_copy; - found0 = 1; - } - if (ptsm_ptr == end_ptr) - { - copy_end = point_copy; - found1 = 1; - } - } - - // create the new curve and update the points - - rv = OCCModifyEngine::instance()->make_facet_curve(copy_start, - copy_end, - curve_copy); - if(rv != CUBIT_SUCCESS) - { - PRINT_ERROR("Couldn't copy curves"); - return (BodySM *)NULL; - } - curvsm_copy = CAST_TO(curve_copy, Curve); - copy_curves.append( curvsm_copy ); - } - - // ------------------copy coedges----------------------- - - DLIList<OCCCoEdge*> coedge_list; - get_coedges( coedge_list ); - DLIList<CoEdgeSM*> copy_coedges; - coedge_list.reset(); - Curve *curvsm_ptr; - CoEdgeSM *coedge_ptr, *coedge_copy; - OCCCoEdge *fcoedge; - for (ii=0; ii<coedge_list.size(); ii++) - { - coedge_ptr = coedge_list.get_and_step(); - fcoedge = CAST_TO( coedge_ptr, OCCCoEdge ); - Curve *curve_at_coedge = fcoedge->curve(); - int found = 0; - - // find the associated curve - - curve_list.reset(); - copy_curves.reset(); - for (jj=0; jj<curve_list.size() && !found; jj++) - { - curve_ptr = curve_list.get_and_step(); - curvsm_ptr = CAST_TO(curve_ptr, Curve); - curvsm_copy = copy_curves.get_and_step(); - if (curve_at_coedge == curvsm_ptr) - { - found = 1; - } - } - - // create the new coedge - - CubitSense sense = fcoedge->sense(); - rv = OCCModifyEngine::instance()->make_facet_coedge(curvsm_copy, - sense, coedge_copy); - if(rv != CUBIT_SUCCESS) - { - PRINT_ERROR("Couldn't copy coedge"); - return (BodySM *)NULL; - } - copy_coedges.append( coedge_copy ); - } - - // ----------------------copy loops-------------------------- - - int kk; - DLIList<OCCLoop*> loop_list; - get_loops( loop_list ); - DLIList<LoopSM*> copy_loops; - loop_list.reset(); - LoopSM *loop_ptr, *loop_copy; - OCCLoop *floop; - for (ii=0; ii<loop_list.size(); ii++) - { - floop = loop_list.get_and_step(); - DLIList<OCCCoEdge *>coedges_on_loop; - floop->get_coedges(coedges_on_loop); - DLIList<CoEdgeSM *>copy_coedges_on_loop; - - // find all associated coedges on the loop - - for(kk=0; kk<coedges_on_loop.size(); kk++) - { - int found = 0; - coedge_list.reset(); - copy_coedges.reset(); - CoEdgeSM *coedge_on_loop = coedges_on_loop.get_and_step(); - for (jj=0; jj<coedge_list.size() && !found; jj++) - { - coedge_ptr = coedge_list.get_and_step(); - coedge_copy = copy_coedges.get_and_step(); - if (coedge_on_loop == coedge_ptr) - { - found = 1; - copy_coedges_on_loop.append(coedge_copy); - } - } - } - - // create the new loop - - rv = OCCModifyEngine::instance()->make_facet_loop(copy_coedges_on_loop, - loop_copy); - if(rv != CUBIT_SUCCESS) - { - PRINT_ERROR("Couldn't copy loops"); - return (BodySM *)NULL; - } - copy_loops.append( loop_copy ); - } - - // ----------------------copy surfaces-------------------------- - - DLIList<OCCSurface*> surface_list; - get_surfaces(surface_list); - DLIList<Surface*> copy_surfaces; - surface_list.reset(); - Surface *surface_ptr, *surface_copy; - OCCSurface *fsurface; - for (ii=0; ii<surface_list.size(); ii++) - { - fsurface = surface_list.get_and_step(); - DLIList<OCCLoop *>loops_on_surface; - fsurface->get_loops(loops_on_surface); - DLIList<LoopSM *>copy_loops_on_surface; - - // find all associated loops on the surface - - for(kk=0; kk<loops_on_surface.size(); kk++) - { - int found = 0; - loop_list.reset(); - copy_loops.reset(); - LoopSM *loop_on_surface = loops_on_surface.get_and_step(); - for (jj=0; jj<loop_list.size() && !found; jj++) - { - loop_ptr = loop_list.get_and_step(); - loop_copy = copy_loops.get_and_step(); - if (loop_on_surface == loop_ptr) - { - found = 1; - copy_loops_on_surface.append(loop_copy); - } - } - } - - // create the new surface - - DLIList<CubitFacet*>facet_list; - DLIList<CubitPoint*>cpoint_list; - rv = fsurface->copy_facets( facet_list, cpoint_list ); - if (rv != CUBIT_SUCCESS) - { - return (BodySM *)NULL; - } - int interp_order = fsurface->interp_order(); - double min_dot = fsurface->min_dot(); - const CubitEvaluatorData *eval_data = fsurface->evaluator_data(); - CubitBoolean use_point_addresses = CUBIT_FALSE; - rv = OCCModifyEngine::instance()->make_facet_surface(eval_data, - facet_list, - cpoint_list, - copy_loops_on_surface, - interp_order, - min_dot, - surface_copy, - use_point_addresses); - if(rv != CUBIT_SUCCESS) - { - PRINT_ERROR("Couldn't copy surfaces"); - return (BodySM *)NULL; - } - copy_surfaces.append( surface_copy ); - } - - // ----------------------copy shells-------------------------- - - DLIList<OCCShell*> shell_list; - get_shells(shell_list); - DLIList<ShellSM*> copy_shells; - shell_list.reset(); - ShellSM *shell_ptr, *shell_copy; - OCCShell *fshell; - for (ii=0; ii<shell_list.size(); ii++) - { - fshell = shell_list.get_and_step(); - DLIList<OCCSurface *>surfaces_on_shell; - fshell->get_surfaces(surfaces_on_shell); - DLIList<Surface *>copy_surfaces_on_shell; - - // find all associated loops on the surface - - for(kk=0; kk<surfaces_on_shell.size(); kk++) - { - int found = 0; - surface_list.reset(); - copy_surfaces.reset(); - Surface *surface_on_shell = surfaces_on_shell.get_and_step(); - for (jj=0; jj<surface_list.size() && !found; jj++) - { - surface_ptr = surface_list.get_and_step(); - surface_copy = copy_surfaces.get_and_step(); - if (surface_on_shell == surface_ptr) - { - found = 1; - copy_surfaces_on_shell.append(surface_copy); - } - } - } - - // create the new shell - - rv = OCCModifyEngine::instance()->make_facet_shell(copy_surfaces_on_shell, - shell_copy); - if(rv != CUBIT_SUCCESS) - { - PRINT_ERROR("Couldn't copy shell"); - return (BodySM *)NULL; - } - - // set the sense of the surfaces on the shell - copy from the old shell - - OCCShell *fshell_copy = CAST_TO(shell_copy, OCCShell); - surfaces_on_shell.reset(); - copy_surfaces_on_shell.reset(); - for (kk=0; kk<surfaces_on_shell.size(); kk++) - { - Surface *surface_on_shell = surfaces_on_shell.get_and_step(); - Surface *copy_surface_on_shell = copy_surfaces_on_shell.get_and_step(); - fsurface = CAST_TO( surface_on_shell, OCCSurface ); - CubitSense sense = fsurface->get_shell_sense(fshell); - OCCSurface *copy_fsurface = CAST_TO( copy_surface_on_shell, OCCSurface ); - copy_fsurface->set_shell_sense( fshell_copy, sense ); - } - copy_shells.append( shell_copy ); - } - - // ----------------------copy lumps-------------------------- - - DLIList<OCCLump*> lump_list; - get_lumps(lump_list); - DLIList<Lump*> copy_lumps; - lump_list.reset(); - Lump *lump_copy; - OCCLump *flump; - for (ii=0; ii<lump_list.size(); ii++) - { - flump = lump_list.get_and_step(); - DLIList<OCCShell *>shells_on_lump; - flump->get_shells(shells_on_lump); - DLIList<ShellSM *>copy_shells_on_lump; - - // find all associated loops on the surface - - for(kk=0; kk<shells_on_lump.size(); kk++) - { - int found = 0; - shell_list.reset(); - copy_shells.reset(); - ShellSM *shell_on_lump = shells_on_lump.get_and_step(); - for (jj=0; jj<shell_list.size() && !found; jj++) - { - shell_ptr = shell_list.get_and_step(); - shell_copy = copy_shells.get_and_step(); - if (shell_on_lump == shell_ptr) - { - found = 1; - copy_shells_on_lump.append(shell_copy); - } - } - } - - // create the new lump - - rv = OCCModifyEngine::instance()->make_facet_lump(copy_shells_on_lump, - lump_copy); - if(rv != CUBIT_SUCCESS) - { - PRINT_ERROR("Couldn't copy lump"); - return (BodySM *)NULL; - } - copy_lumps.append( lump_copy ); - } - - // ----------------------copy body-------------------------- - - BodySM *body_copy; - rv = OCCModifyEngine::instance()->make_facet_body(copy_lumps, - body_copy); - if(rv != CUBIT_SUCCESS) - { - PRINT_ERROR("Couldn't copy lump"); - return (BodySM *)NULL; - } - - return (BodySM*)body_copy; + return (BodySM*)NULL; } //---------------------------------------------------------------- // Function: can_be_deleted @@ -662,177 +304,9 @@ CubitStatus OCCBody::transform( CubitTransformMatrix &tfmat, CubitBoolean is_rotation ) { - int ii; - - // get the list of surfaces on the body - - DLIList<OCCSurface *>surf_list; - get_surfaces( surf_list ); - Surface *surf; - OCCSurface *fsurf; - FacetEvalTool *ftool; -#ifdef BOYD17 - CubitBox box; -#endif - //CubitVector min, max; - - // go through all the surfaces and collect the list of all points. - // (some may be listed on multiple surfaces) - - DLIList<CubitPoint *>point_list; - for (ii=0; ii<surf_list.size(); ii++) - { - surf = surf_list.get_and_step(); - fsurf = CAST_TO( surf, OCCSurface ); - fsurf->get_my_points( point_list ); - } - - // unmark all the points so we can keep track of the ones that have - // already been transformed - - CubitPoint *cp; - for (ii=0; ii<point_list.size(); ii++) - { - cp = point_list.get_and_step(); - cp->marked( 0 ); - } - - // transform the points - - //CubitVector norm, du, dv; - for (ii=0; ii<point_list.size(); ii++) - { - cp = point_list.get_and_step(); - if (!cp->marked()) - { - cp->transform( tfmat ); - if (is_rotation) - cp->rotate_normal( tfmat ); - cp->marked( 1 ); - } - } - - // check the vertices - make sure they are transformed - - OCCPoint *fpt; - Point *pt; - DLIList<OCCPoint*>gpoint_list; - get_points(gpoint_list); - for (ii=0; ii<gpoint_list.size(); ii++) - { - pt = gpoint_list.get_and_step(); - fpt = CAST_TO( pt, OCCPoint ); - - // only transform the point if it isn't already part of the facets - // (they could be points by themselves) - - cp = fpt->get_cubit_point(); - if (cp->num_adj_facets() == 0) - { - cp->transform( tfmat ); - if (is_rotation) - cp->rotate_normal( tfmat ); - } - } - - // reset the bounding box and update the facet normal and plane - - // init flags on edges to 0 - DLIList<Surface*> tmp_surf_list( surf_list.size() ); - CAST_LIST_TO_PARENT( surf_list, tmp_surf_list ); - init_edge_flags( tmp_surf_list, 0 ); - for (ii=0; ii<surf_list.size(); ii++) - { - surf = surf_list.get_and_step(); - fsurf = CAST_TO( surf, OCCSurface ); - - // if we are using a bspline representation, then we also need to - // transform the control points on the edges and facets - - ftool = fsurf->get_eval_tool(); - if (ftool->interp_order() == 4) - { - ftool->transform_control_points( tfmat ); - } - ftool->reset_bounding_box(); - - DLIList<CubitFacet *>flist; - DLIList<CubitPoint *>plist; - fsurf->get_my_facets( flist, plist); - int jj; - CubitFacet *facet_ptr; - for (jj=0; jj<flist.size(); jj++) - { - facet_ptr = flist.get_and_step(); - facet_ptr->update_plane(); - facet_ptr->reset_bounding_box(); - } - - // if this facet surface has a primitive evaluator, then we need - // to tell it about the transformation also. - fsurf->add_transformation( tfmat ); - - //re-calculate the area of the surface in case it changed - fsurf->update_measurement(); - } - init_edge_flags( tmp_surf_list, 0 ); - - // Some transforms (those incorporating reflections) - // invert the geometry. Correct for it. - // -- jason k. - if ( tfmat.sub_matrix(3,3).determinant() < 0.0 ) - { - // Flip CoFace senses - DLIList<OCCShell*> shells; - get_shells( shells ); - //modified. mbrewer. doing both a reverse and a - //reverse_surfaces. the latter actually changes the - // underlying surfaces so that the normals can all - // still be outward pointing. It automatically changes - // the sense, therefore we also still need excplicity - // call reverse so that sense is corrected. - while (shells.size()){ - shells.get()->reverse_surfaces(); - shells.pop()->reverse(); - } - } - return CUBIT_SUCCESS; } -//---------------------------------------------------------------- -// Function: init_edge_flags -// Description: set the flags on the facet edges -// Note: Only done for facet eval tool with order 4 interpolation -// Author: sjowen -//---------------------------------------------------------------- -void OCCBody::init_edge_flags( DLIList<Surface *>&surf_list, - int ) -{ - int ii, jj; - Surface *surf; - OCCSurface *fsurf; - FacetEvalTool *ftool; - CubitFacetEdge *edge_ptr; - - for (ii=0; ii<surf_list.size(); ii++) - { - DLIList<CubitFacetEdge*>edge_list; - surf = surf_list.get_and_step(); - fsurf = CAST_TO( surf, OCCSurface ); - ftool = fsurf->get_eval_tool(); - if (ftool->interp_order() == 4) - { - ftool->get_edges( edge_list ); - for (jj=0; jj<edge_list.size(); jj++) - { - edge_ptr = edge_list.get_and_step(); - edge_ptr->set_flag( 0 ); - } - } - } -} - CubitStatus OCCBody::get_transforms( CubitTransformMatrix &tfm ) { tfm = myTransforms; Modified: cgm/trunk/geom/OCC/OCCBody.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCBody.hpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCBody.hpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -11,8 +11,8 @@ // //------------------------------------------------------------------------- -#ifndef FACET_BODY_HPP -#define FACET_BODY_HPP +#ifndef OCC_BODY_HPP +#define OCC_BODY_HPP // ********** BEGIN STANDARD INCLUDES ********** // ********** END STANDARD INCLUDES ********** @@ -47,8 +47,8 @@ public: OCCBody(TopoDS_Shape *theShape); - OCCBody(DLIList<Lump*> &myLumps); - //- Constructor with a pointer to a ACIS BODY. + OCCBody(DLIList<Lump*>& my_lumps); + virtual ~OCCBody() ; //- The destructor. Modified: cgm/trunk/geom/OCC/OCCCoEdge.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCCoEdge.cpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCCoEdge.cpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -14,7 +14,7 @@ // ********** BEGIN STANDARD INCLUDES ********** // ********** END STANDARD INCLUDES ********** - +#include "config.h" // ********** BEGIN CUBIT INCLUDES ********** #include "CubitDefines.h" #include "CastTo.hpp" Modified: cgm/trunk/geom/OCC/OCCCurve.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCCurve.cpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCCurve.cpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -15,7 +15,7 @@ // ********** BEGIN STANDARD INCLUDES ********** // ********** END STANDARD INCLUDES ********** - +#include "config.h" // ********** BEGIN CUBIT INCLUDES ********** #include "CastTo.hpp" Modified: cgm/trunk/geom/OCC/OCCCurve.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCCurve.hpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCCurve.hpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -22,7 +22,7 @@ #include "CubitDefines.h" #include "Curve.hpp" #include "OCCAttribSet.hpp" -#include <TopoDS_Edge.hxx> +#include "TopoDS_Edge.hxx" // ********** END CUBIT INCLUDES ********** // ********** BEGIN FORWARD DECLARATIONS ********** Modified: cgm/trunk/geom/OCC/OCCLoop.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCLoop.cpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCLoop.cpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -11,6 +11,7 @@ // // Owner : Steven J. Owen //------------------------------------------------------------------------- +#include "config.h" #include "CastTo.hpp" #include "OCCLoop.hpp" Modified: cgm/trunk/geom/OCC/OCCLump.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCLump.cpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCLump.cpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -12,8 +12,7 @@ // ********** BEGIN STANDARD INCLUDES ********** #include <assert.h> // ********** END STANDARD INCLUDES ********** - - +#include "config.h" // ********** BEGIN CUBIT INCLUDES ********** #include "OCCQueryEngine.hpp" #include "OCCLump.hpp" @@ -214,7 +213,7 @@ PRINT_ERROR("Facet lump has surfaces that aren't facets?"); return 1; } - facet_surface->get_my_facets(bounding_facets, bounding_points); + //facet_surface->get_my_facets(bounding_facets, bounding_points); } } double volume, curr_facet_area, summation = 0.0; @@ -398,7 +397,7 @@ { surf_facets.clean_out(); junk.clean_out(); - surf->get_my_facets( surf_facets, junk ); + //surf->get_my_facets( surf_facets, junk ); facets += surf_facets; for (int j = surf_facets.size(); j--; ) Modified: cgm/trunk/geom/OCC/OCCLump.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCLump.hpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCLump.hpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -20,8 +20,8 @@ #include "CubitDefines.h" #include "Lump.hpp" #include "OCCAttribSet.hpp" - -#include <TopoDS_Solid.hxx> +#include <stdio.h> +#include "TopoDS_Solid.hxx" // ********** END CUBIT INCLUDES ********** // ********** BEGIN FORWARD DECLARATIONS ********** Modified: cgm/trunk/geom/OCC/OCCModifyEngine.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCModifyEngine.cpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCModifyEngine.cpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -13,10 +13,10 @@ // // Owner : John Fowler //------------------------------------------------------------------------- - +#include "config.h" +#include "gp_Pnt.hxx" #include "OCCModifyEngine.hpp" #include "OCCQueryEngine.hpp" - #include "CubitMessage.hpp" #include "CubitDefines.h" @@ -55,9 +55,7 @@ #include "FBDataUtil.hpp" #include "FBIntersect.hpp" #include "IntegerHash.hpp" -#include "FacetboolInterface.hpp" #include "CpuTimer.hpp" -#include "ProgressTool.hpp" #include "AppUtil.hpp" #include "SphereEvaluator.hpp" #include "CylinderEvaluator.hpp" @@ -99,10 +97,13 @@ // Author : John Fowler // Date : 10/02 //=============================================================================== -Point* OCCModifyEngine::make_Point( CubitVector const& /*point*/) const +Point* OCCModifyEngine::make_Point( CubitVector const& point) const { - PRINT_ERROR("Option not supported for mesh based geometry.\n"); - return (Point*) NULL; + gp_Pnt pt(point.x(), point.y(), point.z()); + + OCCPoint *occ_pt = new OCCPoint(pt); + return CAST_TO(occ_pt, Point); + } //=============================================================================== @@ -231,211 +232,8 @@ BodySM* OCCModifyEngine::make_BodySM( DLIList<Lump*>& /*lump_list*/ ) const {return NULL ;} -//=============================================================================== -// Function : fillinedge -// Member Type: PRIVATE -// Description: put points on this edge of triangle to be refined -// Author : John Fowler -// Date : 11/02 -//=============================================================================== -void OCCModifyEngine::fillinedge( - int *edge, - int numpointsonanedge, - double radius, - STD(vector)<CubitPoint *>& points) const -{ - int numintervals, i; - double xbegin, ybegin, zbegin, xend, yend, zend, xincr, yincr, zincr; - double dist; - CubitPoint *new_point; - - numintervals = numpointsonanedge - 1; - if ( numintervals < 1 ) return; - xbegin = points[edge[0]]->x(); - ybegin = points[edge[0]]->y(); - zbegin = points[edge[0]]->z(); - xend = points[edge[numintervals]]->x(); - yend = points[edge[numintervals]]->y(); - zend = points[edge[numintervals]]->z(); - xincr = (xend-xbegin)/(double)(numintervals); - yincr = (yend-ybegin)/(double)(numintervals); - zincr = (zend-zbegin)/(double)(numintervals); - for ( i = 0; i < numintervals - 1; i++ ) { - xbegin += xincr; - ybegin += yincr; - zbegin += zincr; - dist = sqrt(xbegin*xbegin + ybegin*ybegin + zbegin*zbegin); - new_point = (CubitPoint *) new CubitPointData( xbegin*radius/dist, ybegin*radius/dist, - zbegin*radius/dist ); - edge[i+1] = points.size(); // get the point number - points.push_back(new_point); - } - -} - //=============================================================================== -// Function : refinetriangle -// Member Type: PRIVATE -// Description: add internal points and make connections for this triangle -// Author : John Fowler -// Date : 11/02 -//=============================================================================== -void OCCModifyEngine::refinetriangle( - int level, - int numpointsonanedge, - int *iedge1, - int *iedge2, - int *iedge3, - int isign1, - int isign2, - int isign3, - double radius, - STD(vector)<CubitPoint *>& points, - DLIList<CubitFacet *>& facet_list) const -{ -int i, numintervals, icount, j, jcount; -int ntris; -int iedge1cnt, iedge2cnt, iedge3cnt; - -int increment, trissofar, i1s, i2s, i1e; -int nverts1, nverts; -double dlev; -int *vertnumarray, index, iskip; -CubitFacet *facet_ptr; -CubitPoint *new_point; - double x1inc, y1inc, z1inc, x2inc, y2inc, z2inc; - double xstart, ystart, zstart, xend, yend, zend, dist; - double xinternalinc, yinternalinc, zinternalinc; - - numintervals = numpointsonanedge - 1; - iedge1cnt = ( isign1 == 1 ) ? 0 : numintervals; - iedge2cnt = ( isign2 == 1 ) ? 0 : numintervals; - iedge3cnt = ( isign3 == 1 ) ? 0 : numintervals; - - index = points.size(); - dlev = 1. + (double)level; - nverts1 = (int)(0.5*(dlev+1.)*dlev); - - ntris = (level+1)*(level+1); - dlev += 1.; - nverts = (int)(0.5*(dlev+1.)*dlev); - vertnumarray = new int[nverts]; - -// Put the point numbers for the interior points into vertnumarray. - if ( numintervals > 2 ) { // numintervals must be at least 3 to make interior points - jcount = 1; - icount = 2; - for ( i = 2; i < numintervals; i++ ) { - icount += 2; - for ( j = 0; j < jcount; j++ ) { - vertnumarray[icount] = index++; - icount += 1; - } - jcount += 1; - } - } - i = 3; - - iskip = 2; - vertnumarray[0] = iedge1[iedge1cnt]; iedge1cnt += isign1; - vertnumarray[1] = iedge1[iedge1cnt]; iedge1cnt += isign1; - iedge2cnt += isign2; - vertnumarray[2] = iedge2[iedge2cnt]; iedge2cnt += isign2; - - while ( i < nverts1 ) { - vertnumarray[i] = iedge1[iedge1cnt]; iedge1cnt += isign1; - vertnumarray[i+iskip] = iedge2[iedge2cnt]; iedge2cnt += isign2; - i += iskip+1; - iskip += 1; - } - for ( i = nverts1; i < nverts; i++ ) { - vertnumarray[i] = iedge3[iedge3cnt]; iedge3cnt += isign3; - } - - -//! Make the internal points, and put them on the sphere. - - if ( numintervals > 2 ) { - int i1first, i1last, i2first, i2last; - if ( isign1 == 1 ) { - i1first = 0; i1last = numintervals; - } else { - i1last = 0; i1first = numintervals; - } - if ( isign2 == 1 ) { - i2first = 0; i2last = numintervals; - } else { - i2last = 0; i2first = numintervals; - } - x1inc = (points[iedge1[i1last]]->x() - points[iedge1[i1first]]->x())/numintervals; - y1inc = (points[iedge1[i1last]]->y() - points[iedge1[i1first]]->y())/numintervals; - z1inc = (points[iedge1[i1last]]->z() - points[iedge1[i1first]]->z())/numintervals; - x2inc = (points[iedge2[i2last]]->x() - points[iedge2[i2first]]->x())/numintervals; - y2inc = (points[iedge2[i2last]]->y() - points[iedge2[i2first]]->y())/numintervals; - z2inc = (points[iedge2[i2last]]->z() - points[iedge2[i2first]]->z())/numintervals; - - icount = 2; - jcount = 1; - for ( i = 2; i < numintervals; i++ ) { - xstart = points[iedge1[i1first]]->x() + (double)i*x1inc; - ystart = points[iedge1[i1first]]->y() + (double)i*y1inc; - zstart = points[iedge1[i1first]]->z() + (double)i*z1inc; - xend = points[iedge2[i2first]]->x() + (double)i*x2inc; - yend = points[iedge2[i2first]]->y() + (double)i*y2inc; - zend = points[iedge2[i2first]]->z() + (double)i*z2inc; - xinternalinc = (xend-xstart)/(icount); - yinternalinc = (yend-ystart)/(icount); - zinternalinc = (zend-zstart)/(icount); - for ( j = 0; j < jcount; j++ ) { - xstart += xinternalinc; - ystart += yinternalinc; - zstart += zinternalinc; - - dist = sqrt(xstart*xstart + ystart*ystart + zstart*zstart); - new_point = (CubitPoint *) new CubitPointData( xstart*radius/dist, - ystart*radius/dist, - zstart*radius/dist ); - points.push_back(new_point); - } - icount += 1; - jcount += 1; - } - - } - -//! Make the connections. - increment = trissofar = 0; - i1s = 0; - i2s = 1; - while ( trissofar < ntris ) { - i1e = i1s + increment; - while ( i1s < i1e) { - facet_ptr = new CubitFacetData( points[vertnumarray[i1s]], - points[vertnumarray[i2s]], - points[vertnumarray[i2s+1]] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[vertnumarray[i1s]], - points[vertnumarray[i2s+1]], - points[vertnumarray[i1s+1]] ); - facet_list.append( facet_ptr ); - i1s++; - i2s++; - trissofar += 2; - } - facet_ptr = new CubitFacetData( points[vertnumarray[i1s]], - points[vertnumarray[i2s]], - points[vertnumarray[i2s+1]] ); - facet_list.append( facet_ptr ); - increment++; - trissofar++; - i1s++; - i2s += 2; - } - delete [] vertnumarray; -} - -//=============================================================================== // Function : sphere // Member Type: PUBLIC // Description: build a sphere with facets @@ -444,145 +242,10 @@ //=============================================================================== BodySM* OCCModifyEngine::sphere(double radius) const { - CubitStatus rv = CUBIT_SUCCESS; - DLIList <CubitFacet *>facet_list; - DLIList <CubitPoint *>point_list; - CubitPoint *new_point; - double feature_angle; - int i, interp_order; - CubitBoolean smooth_non_manifold, split_surfaces; - BodySM *body_ptr = NULL; - STD(vector)<CubitPoint *> points; -//! We use a vector for the points because when refining the triangles, we will -//! need fast random access to them. After all of the points have been made, -//! they will go onto the DLIList point_list. Then the points vector will be -//! deleted. -//! xp and yp are the fundamental units for an icosahedron. - const double xp = 0.525731112119133606*radius, zp = 0.850650808352039932*radius; -//! Makes an icosahedron and then refines the triangles as they are made. Number -//! of levels is given by the variable "level". - int level, numpointsonanedge; - int *edge[30]; -//! 20 faces in an icosahedron. const int basefacets[][] holds the connections. -//! 30 edges in an icosahedron. const int edgeendverts[][] holds the edge endpoints. -/* - const int basefacets[20][3] = { {0,1,2},{0,2,3},{3,2,4},{2,5,4}, - {2,1,5},{5,1,6},{5,6,7},{4,5,7}, - {4,7,8},{8,7,9},{9,7,6},{9,6,10}, - {9,10,11},{11,10,0},{0,10,1},{10,6,1}, - {3,11,0},{3,8,11},{3,4,8},{9,11,8} }; -*/ - const int edgeendverts[30][2] = { {0,1},{0,2},{0,3},{0,11},{0,10},{1,2}, - {1,5},{1,6},{1,10},{2,3},{2,4},{2,5}, - {3,4},{3,8},{3,11},{4,5},{4,7},{4,8}, - {5,6},{5,7},{6,7},{6,9},{6,10},{7,8}, - {7,9},{8,9},{8,11},{9,10},{9,11},{10,11} }; -//! triedges[][] holds the three edges for each of the 20 triangles. A minus sign means -//! that the edge will be traversed backward. To accommodate a zero, one has been added -//! to the magnitude of the edge. So, for example, the first triangle has edges 0, 5, and 1, -//! with the last being traversed from end to beginning. - const int triedges[20][3] = { {1,2,6},{2,3,10},{-10,13,11},{12,11,-16,}, - {-6,12,7,},{-7,19,8,},{19,20,21},{16,17,20}, - {17,18,24,},{-24,26,25},{-25,-22,-21},{-22,28,23}, - {28,29,30},{-30,-4,-5},{5,1,-9},{-23,-9,-8}, - {15,-3,-4},{14,15,27},{13,14,18},{29,-26,-27} }; -//! 12 points in an icosahedron. svert[][] holds these. - const double svert[12][3] = { {-xp,0.,zp}, {xp,0.,zp}, {0.,zp,xp}, {-zp, xp, 0.}, - {0.,zp,-xp}, {zp,xp,0.}, {zp,-xp,0.}, {xp,0.,-zp}, - {-xp,0.,-zp}, {0.,-zp,-xp}, {0.,-zp,xp}, {-zp,-xp,0.} }; - - level = 7; // gives a sphere with 642 vertices and 1280 triangles. - // Eventually this should be user-selectable. - numpointsonanedge = 2 + level; - - for ( i = 0; i < 30; i++ ) { // make the edges - edge[i] = new int[numpointsonanedge]; - edge[i][0] = edgeendverts[i][0]; - edge[i][numpointsonanedge-1] = edgeendverts[i][1]; - } - - for ( i = 0; i < 12; i++ ) { // make the icosahedron vertices - new_point = (CubitPoint *) new CubitPointData( svert[i][0],svert[i][1],svert[i][2] ); - points.push_back(new_point); - } - - for ( i = 0; i < 30; i++ ) { // put points on the edges - fillinedge(edge[i], numpointsonanedge, radius, points); - } - - int sign1, sign2, sign3, edg1, edg2, edg3; - for ( i = 0; i < 20; i++ ) { // refine the 20 triangles - edg1 = ( triedges[i][0] > 0 ) ? triedges[i][0] - 1 : -triedges[i][0] - 1; - edg2 = ( triedges[i][1] > 0 ) ? triedges[i][1] - 1 : -triedges[i][1] - 1; - edg3 = ( triedges[i][2] > 0 ) ? triedges[i][2] - 1 : -triedges[i][2] - 1; -//! sign1, etc., says in which direction to traverse an edge - sign1 = ( triedges[i][0] > 0 ) ? 1 : -1; - sign2 = ( triedges[i][1] > 0 ) ? 1 : -1; - sign3 = ( triedges[i][2] > 0 ) ? 1 : -1; - - refinetriangle(level,numpointsonanedge,edge[edg1],edge[edg2],edge[edg3], - sign1,sign2,sign3,radius,points,facet_list); - } - -//! Put the points in point_list and then delete the points vector. - for ( unsigned int z = 0; z < points.size(); z++ ) { - point_list.append(points[z]); - } - - points.clear(); - - for ( i = 0; i < 30; i++ ) delete[] edge[i]; - feature_angle = -1.0; - interp_order = 0; - smooth_non_manifold = CUBIT_TRUE; - split_surfaces = CUBIT_FALSE; - - ChollaEngine *cholla_ptr = NULL; - OCCModifyEngine *fme = const_cast<OCCModifyEngine *> (this); - rv = fme->build_cholla_surfaces( facet_list, - point_list, - feature_angle, - interp_order, - smooth_non_manifold, - split_surfaces, - cholla_ptr ); - if ( rv == CUBIT_SUCCESS ) - { - CubitEvaluatorData **sphere_data; - - set_sphere_eval_data( cholla_ptr, radius, sphere_data ); - - finish_facet_Body( cholla_ptr, - (const CubitEvaluatorData **)sphere_data, - feature_angle, - interp_order, - body_ptr); - - if ( cholla_ptr ) - { - cholla_ptr->delete_me(); - delete cholla_ptr; - } - if ( sphere_data[0] ) delete sphere_data[0]; - delete sphere_data; - } - return body_ptr; + return (BodySM*) NULL; } -void OCCModifyEngine::set_sphere_eval_data -( - ChollaEngine *cholla_ptr, - double radius, - CubitEvaluatorData **&eval_data ) const -{ - eval_data = new CubitEvaluatorData*; - SphereEvaluatorData *data = new SphereEvaluatorData; - data->radius = radius; - data->center.set( 0.0, 0.0, 0.0 ); - eval_data[0] = data; -} - //=============================================================================== // Function : brick // Member Type: PUBLIC @@ -592,257 +255,10 @@ //=============================================================================== BodySM* OCCModifyEngine::brick( double wid, double dep, double hi ) const { - CubitStatus rv = CUBIT_SUCCESS; - double xmin, xmax, ymin, ymax, zmin, zmax; - DLIList <CubitFacet *>facet_list; - DLIList <CubitPoint *>point_list; - CubitPoint *new_point; - CubitFacet *facet_ptr; - int i, numpoints, numtris; - double feature_angle; - int interp_order; - CubitBoolean smooth_non_manifold, split_surfaces; - BodySM *body_ptr = NULL; - STD(vector)<CubitPoint *> points; - - numpoints = 14; - numtris = 24; - - xmin = -0.5*wid; - xmax = 0.5*wid; - ymin = -0.5*dep; - ymax = 0.5*dep; - zmin = -0.5*hi; - zmax = 0.5*hi; - - new_point = (CubitPoint *) new CubitPointData( xmin,ymin,zmin ); - points.push_back(new_point); - new_point = (CubitPoint *) new CubitPointData( xmax,ymin,zmin ); - points.push_back(new_point); - new_point = (CubitPoint *) new CubitPointData( xmax,ymin,zmax ); - points.push_back(new_point); - new_point = (CubitPoint *) new CubitPointData( xmin,ymin,zmax ); - points.push_back(new_point); - new_point = (CubitPoint *) new CubitPointData( xmin,ymax,zmin ); - points.push_back(new_point); - new_point = (CubitPoint *) new CubitPointData( xmax,ymax,zmin ); - points.push_back(new_point); - new_point = (CubitPoint *) new CubitPointData( xmax,ymax,zmax ); - points.push_back(new_point); - new_point = (CubitPoint *) new CubitPointData( xmin,ymax,zmax ); - points.push_back(new_point); - new_point = (CubitPoint *) new CubitPointData( 0.5*(xmin+xmax),0.5*(ymin+ymax),zmin ); - points.push_back(new_point); - new_point = (CubitPoint *) new CubitPointData( xmax,0.5*(ymin+ymax),0.5*(zmin+zmax) ); - points.push_back(new_point); - new_point = (CubitPoint *) new CubitPointData( 0.5*(xmin+xmax),0.5*(ymin+ymax),zmax ); - points.push_back(new_point); - new_point = (CubitPoint *) new CubitPointData( xmin,0.5*(ymin+ymax),0.5*(zmin+zmax) ); - points.push_back(new_point); - new_point = (CubitPoint *) new CubitPointData( 0.5*(xmin+xmax),ymin,0.5*(zmin+zmax) ); - points.push_back(new_point); - new_point = (CubitPoint *) new CubitPointData( 0.5*(xmin+xmax),ymax,0.5*(zmin+zmax) ); - points.push_back(new_point); - - for ( i = 0; i < numpoints; i++ ) { - point_list.append(points[i]); - } - - // bottom face - facet_ptr = new CubitFacetData( points[0],points[1], points[12] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[1],points[2], points[12] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[2],points[3], points[12] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[3],points[0], points[12] ); - // back face - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[1],points[0], points[8] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[5],points[1], points[8] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[4],points[5], points[8] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[0],points[4], points[8] ); - facet_list.append( facet_ptr ); - // left face - facet_ptr = new CubitFacetData( points[0],points[3], points[11] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[3],points[7], points[11] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[7],points[4], points[11] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[4],points[0], points[11] ); - facet_list.append( facet_ptr ); - // top face - facet_ptr = new CubitFacetData( points[7],points[6], points[13] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[6],points[5], points[13] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[5],points[4], points[13] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[4],points[7], points[13] ); - facet_list.append( facet_ptr ); - // right face - facet_ptr = new CubitFacetData( points[1],points[5], points[9] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[5],points[6], points[9] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[6],points[2], points[9] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[2],points[1], points[9] ); - facet_list.append( facet_ptr ); - // front face - facet_ptr = new CubitFacetData( points[3],points[2], points[10] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[2],points[6], points[10] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[6],points[7], points[10] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[7],points[3], points[10] ); - facet_list.append( facet_ptr ); - - points.clear(); // clear out the points vector since we are through with it. - - feature_angle = 100.0; - interp_order = 0; - smooth_non_manifold = CUBIT_TRUE; - split_surfaces = CUBIT_FALSE; - - ChollaEngine *cholla_ptr = NULL; - OCCModifyEngine *fme = const_cast<OCCModifyEngine *> (this); - rv = fme->build_cholla_surfaces( facet_list, - point_list, - feature_angle, - interp_order, - smooth_non_manifold, - split_surfaces, - cholla_ptr ); - if ( rv == CUBIT_SUCCESS ) - { - finish_facet_Body( cholla_ptr, - NULL, - feature_angle, - interp_order, - body_ptr); - if ( cholla_ptr ) - { - cholla_ptr->delete_me(); - delete cholla_ptr; - } - - } - return body_ptr; + return (BodySM*)NULL; } -//=============================================================================== -// Function : finish_facet_Body -// Member Type: PRIVATE -// Description: general function for creating a facet-based Body given a closed -// set of facets -// Author : John Fowler -// Date : 10/02 -//=============================================================================== -CubitStatus OCCModifyEngine::finish_facet_Body( ChollaEngine *&cholla_ptr, - const CubitEvaluatorData **eval_data, - double feature_angle, - int interp_order, - BodySM *&bodysm_ptr) const -{ - DLIList<Surface *> surface_list; - ShellSM *shell_ptr; - DLIList<ShellSM*> shell_list; - Lump *lump_ptr; - DLIList<Lump*> lump_list; - CubitStatus rv; - DLIList<ChollaSurface *> cholla_surface_list; - DLIList<ChollaCurve *> cholla_curve_list; - DLIList<ChollaPoint *> cholla_point_list; - cholla_ptr->get_curves( cholla_curve_list ); - cholla_ptr->get_surfaces( cholla_surface_list ); - cholla_ptr->get_points( cholla_point_list ); - - CubitBoolean use_feature_angle; - if (feature_angle < 0.0) - use_feature_angle = CUBIT_FALSE; - else - use_feature_angle = CUBIT_TRUE; - - GeometryQueryTool *gti = GeometryQueryTool::instance(); - - OCCModifyEngine *fme = const_cast<OCCModifyEngine *> (this); - - rv = fme->build_cholla_geometry( eval_data, - cholla_surface_list, - cholla_curve_list, - cholla_point_list, - use_feature_angle, - feature_angle, - interp_order, surface_list ); - - if ( surface_list.size() == 0 || rv != CUBIT_SUCCESS ) - { - PRINT_ERROR("Problems building facet based surfaces.\n"); - rv = CUBIT_FAILURE; - goto end_brick; - } - - // make a body out of it - rv = fme->make_facet_shell(surface_list,shell_ptr); - if ( shell_ptr == NULL || rv != CUBIT_SUCCESS ) - { - PRINT_ERROR("Problems building facet based shell entity.\n"); - rv = CUBIT_FAILURE; - goto end_brick; - } - //Set the sense for the surfaces (will be cofaces) on this shell. - //Assumption: The sense is always forward when creating geom from facets. - // (This may not be correct -especially with multiple shells in a body) - int ii; - OCCShell* facet_shell; - facet_shell = CAST_TO( shell_ptr, OCCShell ); - for( ii = surface_list.size(); ii > 0; ii-- ) - { - Surface* surf = surface_list.get_and_step(); - OCCSurface* facet_surf = CAST_TO( surf, OCCSurface ); - facet_surf->set_shell_sense( facet_shell, CUBIT_FORWARD ); - } - - shell_list.append(shell_ptr); - rv = fme->make_facet_lump(shell_list,lump_ptr); - if ( lump_ptr == NULL || rv != CUBIT_SUCCESS ) - { - PRINT_ERROR("Problems building facet based lump entity.\n"); - rv = CUBIT_FAILURE; - goto end_brick; - } - lump_list.append(lump_ptr); - rv = fme->make_facet_body(lump_list,bodysm_ptr); - - if ( rv != CUBIT_SUCCESS ) - { - PRINT_ERROR("Problems building facet based body entity.\n"); - rv = CUBIT_FAILURE; - goto end_brick; - } - - PRINT_INFO("Body successfully created.\n"); - PRINT_INFO(" Number of vertices = %d\n", gti->num_ref_vertices()); - PRINT_INFO(" Number of edges = %d\n", gti->num_ref_edges()); - PRINT_INFO(" Number of faces = %d\n", gti->num_ref_faces()); - PRINT_INFO(" Number of volumes = %d\n", gti->num_ref_volumes()); - PRINT_INFO(" Number of bodies = %d\n", gti->num_bodies()); - - return rv; - -end_brick: - bodysm_ptr = (BodySM *)NULL; - return rv; - -} - //=============================================================================== // Function : brick // Member Type: PUBLIC @@ -895,207 +311,10 @@ //=============================================================================== BodySM* OCCModifyEngine::cylinder( double hi, double r1, double r2, double r3 ) const { - CubitStatus rv = CUBIT_SUCCESS; - DLIList <CubitFacet *>facet_list; - DLIList <CubitPoint *>point_list; - CubitPoint *new_point; - CubitFacet *facet_ptr; - int i, j, numpoints; - double feature_angle; - int interp_order; - CubitBoolean smooth_non_manifold, split_surfaces; - BodySM *body_ptr = NULL; - STD(vector)<CubitPoint *> points; - int reslevel; // relative level of resolution - int nl; // number of axial divisions - int nr; // number of radil divisions - double cfac, rinc, linc; - double x, y, z; - int istart, iend, V3, pend; - double zoffset, lpos, rpos, xrad, yrad; - double rad_ratio = 1.0; - - reslevel = 4; - nl = reslevel; - nr = 8*reslevel; - - rinc = 360.0/(double)nr; - linc = hi/(double)nl; - cfac = CUBIT_PI/180.; - - if ( r3 > 0.0 ) { - // Cylinder: - numpoints = (nl + 1)*nr + 2; - istart = 0; iend = nl+1; - V3 = (nl+1)*nr; - pend = nl; - rad_ratio = r2/r1; - } else { - // Cone: - numpoints = nl*nr + 2; - istart = 0; iend = nl; - V3 = nl*nr; - pend = nl-1; - } - - // Make the points. - - zoffset = 0.0; - lpos = -0.5*hi; - xrad = r1; - yrad = r2; - for ( i = istart; i < iend; i++ ) { - rpos = 10.0; - xrad = zoffset*r3/hi + (hi - zoffset)*r1/hi; - yrad = zoffset*r3*rad_ratio/hi + (hi - zoffset)*r2/hi; - for ( j = 0; j < nr; j++ ) { - x = xrad*cos(cfac*rpos); - y = yrad*sin(cfac*rpos); - z = lpos; - new_point = (CubitPoint *) new CubitPointData( x,y,z ); - points.push_back(new_point); - rpos += rinc; - } - lpos += linc; - zoffset += linc; - } - // Add the two apoint on the axis at the ends. - new_point = (CubitPoint *) new CubitPointData( 0.,0.,-0.5*hi ); - points.push_back(new_point); - new_point = (CubitPoint *) new CubitPointData( 0.,0.,0.5*hi ); - points.push_back(new_point); - - for ( i = 0; i < numpoints; i++ ) { - point_list.append(points[i]); - } - - // Make the triangles. - int vertnum; - vertnum = 0; - for ( i = 0; i < pend; i++ ) { - for ( j = 0; j < nr-1; j++ ) { - facet_ptr = new CubitFacetData( points[vertnum+j],points[vertnum+j+1], points[vertnum+j+nr] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[vertnum+j+1],points[vertnum+j+1+nr], points[vertnum+j+nr] ); - facet_list.append( facet_ptr ); - } - facet_ptr = new CubitFacetData( points[vertnum],points[vertnum+nr], points[vertnum+2*nr-1] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[vertnum+nr-1],points[vertnum], points[vertnum+2*nr-1] ); - facet_list.append( facet_ptr ); - vertnum += nr; - } - - // Endcap(s) - for ( i = 0; i < nr-1; i++ ) { // top cap - facet_ptr = new CubitFacetData( points[vertnum+i],points[vertnum+i+1], points[V3+1] ); - facet_list.append( facet_ptr ); - } - facet_ptr = new CubitFacetData( points[nr-1+vertnum],points[vertnum], points[V3+1] ); - facet_list.append( facet_ptr ); - - for ( i = 0; i < nr-1; i++ ) { // bottom cap - facet_ptr = new CubitFacetData( points[i+1],points[i], points[V3] ); - facet_list.append( facet_ptr ); - } - facet_ptr = new CubitFacetData( points[0],points[nr-1], points[V3] ); - facet_list.append( facet_ptr ); - - points.clear(); // clear out the points vector since we are through with it. - - feature_angle = 135.0; - interp_order = 0; - smooth_non_manifold = CUBIT_TRUE; - split_surfaces = CUBIT_FALSE; - - ChollaEngine *cholla_ptr = NULL; - OCCModifyEngine *fme = const_cast<OCCModifyEngine *> (this); - rv = fme->build_cholla_surfaces( facet_list, - point_list, - feature_angle, - interp_order, - smooth_non_manifold, - split_surfaces, - cholla_ptr ); - - if ( rv == CUBIT_SUCCESS ) - { - CubitEvaluatorData **cyl_data = NULL; - - set_cylinder_eval_data( cholla_ptr, hi, r1, r2, r3, cyl_data ); - finish_facet_Body( cholla_ptr, - (const CubitEvaluatorData**)cyl_data, - feature_angle, - interp_order, - body_ptr); - if ( cholla_ptr ) - { - cholla_ptr->delete_me(); - delete cholla_ptr; - } - if ( cyl_data ) - { - if ( cyl_data[0] ) delete cyl_data[0]; - if ( cyl_data[1] ) delete cyl_data[1]; - if ( cyl_data[2] ) delete cyl_data[2]; - delete []cyl_data; - } - } - return body_ptr; + PRINT_ERROR("Option not supported for mesh based geometry.\n"); + return (BodySM*) NULL; } -void OCCModifyEngine::set_cylinder_eval_data -( - ChollaEngine *cholla_ptr, - double height, - double base_radius_xdir, - double base_radius_ydir, - double top_radius, - CubitEvaluatorData **&eval_data ) const -{ - DLIList<ChollaSurface *> cholla_surface_list; - cholla_ptr->get_surfaces( cholla_surface_list ); - cholla_surface_list.reset(); - - eval_data = NULL; - - if ( cholla_surface_list.size() != 3 ) - { - // This cylinder/cone is shaped quite unusually such that the cholla engine - // found more than 3 faces on it. This is likely because it is quite smashed - // in the minor radius direction. As such, there is not a cylindrical - // surface so exit. - - return; - } - - eval_data = new CubitEvaluatorData* [3]; - eval_data[0] = - eval_data[1] = - eval_data[2] = NULL; - - int isurf; - for ( isurf = 0; isurf < cholla_surface_list.size(); isurf++ ) - { - eval_data[isurf] = NULL; - DLIList<ChollaCurve*> cholla_curve_list; - ChollaSurface *csurf = cholla_surface_list.get_and_step(); - csurf->get_curves( cholla_curve_list ); - if ( cholla_curve_list.size() == 2 ) - { - // this is the cylindrical face around the cylinder. - CylinderEvaluatorData *data = new CylinderEvaluatorData; - data->height = height; - data->height = height; - data->base_radius_x = base_radius_xdir; - data->base_radius_y = base_radius_ydir; - data->top_radius = top_radius; - - eval_data[isurf] = data; - } - } -} - //=============================================================================== // Function : torus // Member Type: PUBLIC @@ -1105,101 +324,8 @@ //=============================================================================== BodySM* OCCModifyEngine::torus( double r1, double r2 ) const { - CubitStatus rv = CUBIT_SUCCESS; - DLIList <CubitFacet *>facet_list; - DLIList <CubitPoint *>point_list; - CubitPoint *new_point; - CubitFacet *facet_ptr; - int numpoints; - double feature_angle; -int interp_order; -CubitBoolean smooth_non_manifold, split_surfaces; - BodySM *body_ptr = NULL; - STD(vector)<CubitPoint *> points; - int reslevel; // relative level of resolution - double theta, thetainc, phi, phiinc, x, z, xp, yp, zp, rmajor, rminor; - int numtheta, numphi, i, j; - - reslevel = 4; - numtheta = 8*reslevel; - numphi = 8*reslevel; - numpoints = numtheta*numphi; - rmajor = r1; - rminor = r2; - thetainc = 2.*CUBIT_PI/(double)numtheta; - phiinc = 2.*CUBIT_PI/(double)numphi; - phi = 0.; - -// Make the points in the y=0 plane - for ( j = 0; j < numphi; j++ ) { - theta = 0.; - for ( i = 0; i < numtheta; i++ ) { - x = rmajor + rminor*cos(theta); - z = rminor*sin(theta); -// Rotate around the z axis - xp = x*cos(phi); - zp = z; - yp = x*sin(phi); - new_point = (CubitPoint *) new CubitPointData( xp,yp,zp ); - points.push_back(new_point); - theta += thetainc; - } - phi += phiinc; - } - - for ( i = 0; i < numpoints; i++ ) { - point_list.append(points[i]); - } -// Make the triangles - int m, k, m2, numtris; - m = numtheta; - numtris = 0; - for ( j = 0; j < numphi; j++ ) { - if ( j == numphi-1 ) m2 = 0; - else m2 = m; - for ( i = 0; i < numtheta; i++ ) { - k = (i+1)%numtheta; - facet_ptr = new CubitFacetData( points[i+m-numtheta], points[m2+i], points[m2+k] ); - facet_list.append( facet_ptr ); - facet_ptr = new CubitFacetData( points[i+m-numtheta], points[m2+k], points[m-numtheta+k] ); - facet_list.append( facet_ptr ); - numtris += 2; - } - m += numtheta; - } - - points.clear(); // clear out the points vector since we are through with it. - - feature_angle = 135.0; - interp_order = 0; - smooth_non_manifold = CUBIT_TRUE; - split_surfaces = CUBIT_FALSE; - - ChollaEngine *cholla_ptr = NULL; - OCCModifyEngine *fme = const_cast<OCCModifyEngine *> (this); - rv = fme->build_cholla_surfaces( facet_list, - point_list, - feature_angle, - interp_order, - smooth_non_manifold, - split_surfaces, - cholla_ptr ); - - - if ( rv == CUBIT_SUCCESS ) - { - finish_facet_Body( cholla_ptr, - NULL, - feature_angle, - interp_order, - body_ptr); - if ( cholla_ptr ) - { - cholla_ptr->delete_me(); - delete cholla_ptr; - } - } - return body_ptr; + PRINT_ERROR("Option not supported for mesh based geometry.\n"); + return (BodySM*) NULL; } //=============================================================================== @@ -1231,6 +357,14 @@ return (BodySM*) NULL; } +CubitStatus OCCModifyEngine::stitch_surfs( + DLIList<BodySM*>& surf_bodies, + BodySM*& stitched_body) const +{ + PRINT_ERROR("Option not supported for mesh based geometry.\n"); + return CUBIT_SUCCESS; +} + //=============================================================================== // Function : subtract // Member Type: PUBLIC @@ -1241,43 +375,10 @@ CubitStatus OCCModifyEngine::subtract(DLIList<BodySM*> &tool_body_list, DLIList<BodySM*> &from_bodies, DLIList<BodySM*> &new_bodies, + bool /*imprint*/, bool keep_old) const { - - CubitStatus status = CUBIT_FAILURE; - int i; - BodySM *tool_body, *from_body; - FacetboolInterface *fbint; - CubitFacetboolOp op; - - bool *to_be_deleted = new bool[from_bodies.size()]; - - op = CUBIT_FB_SUBTRACTION; - - from_bodies.reset(); - tool_body_list.reset(); - - for ( i = 0; i < from_bodies.size(); i++ ) to_be_deleted[i] = false; - - for ( i = tool_body_list.size(); i > 0; i-- ) { - tool_body = tool_body_list.get_and_step(); - fbint = new FacetboolInterface; - status = fbint->dofacetboolean_subtract(tool_body,from_bodies,new_bodies, - keep_old,to_be_deleted,op); - delete fbint; - OCCQueryEngine::instance()->delete_solid_model_entities(tool_body); - } - - for ( i = 0; i < from_bodies.size(); i++ ) { - from_body = from_bodies.get_and_step(); - if ( to_be_deleted[i] == true ) - OCCQueryEngine::instance()->delete_solid_model_entities(from_body); - } - - delete [] to_be_deleted; - - return status; - + return CUBIT_SUCCESS; } //=============================================================================== @@ -1304,63 +405,12 @@ //=============================================================================== CubitStatus OCCModifyEngine::imprint(DLIList<BodySM*> &from_body_list , DLIList<BodySM*> &new_from_body_list, - bool keep_old) const + bool keep_old, + DLIList<TopologyBridge*>* , + DLIList<TopologyBridge*>*) const { CubitStatus success = CUBIT_SUCCESS; - // total number of imprints to be done - const int num_bodies = from_body_list.size(); -// int total_imprints = (num_bodies *(num_bodies-1))/2; - int i, j; - CubitBox bbox1, bbox2; - STD(vector)<BodySM*> bodies_vector; - for ( i = 0; i < from_body_list.size(); i++ ) - bodies_vector.push_back(from_body_list.get_and_step()); - - // pass in keep_old to the delete_owner_attrib flag; if we're not keeping - // old bodies, we want to keep the owner attrib, so we can pick up entities - // that didn't change -// bool delete_attribs = - (GeometryModifyTool::instance()->get_new_ids() || keep_old); - - from_body_list.reset(); - for (i = 0; success && i < num_bodies - 1; i++) { - for (j = i + 1; j < num_bodies; j++) { - BodySM *Body_Ptr1 = bodies_vector[i]; - success = OCCQueryEngine::instance()->create_facet_bounding_box( - Body_Ptr1, - bbox1); - - if (CubitMessage::instance()->Interrupt()) - { - success = CUBIT_FAILURE; - break; - } - BodySM *Body_Ptr2 = bodies_vector[j]; - success = OCCQueryEngine::instance()->create_facet_bounding_box( - Body_Ptr2, - bbox2); - if (bbox1.overlap(GEOMETRY_RESABS, bbox2)) { - FacetboolInterface *FBInt = new FacetboolInterface; - BodySM *out_Body_Ptr1, *out_Body_Ptr2; - FBInt->dofacetboolean_2bodies_imprint(Body_Ptr1,Body_Ptr2, - out_Body_Ptr1,out_Body_Ptr2, - keep_old); - delete FBInt; - instance()->get_gqe()->delete_solid_model_entities(bodies_vector[i]); - instance()->get_gqe()->delete_solid_model_entities(bodies_vector[j]); - bodies_vector[i] = out_Body_Ptr1; - bodies_vector[j] = out_Body_Ptr2; - } - - } - } - - from_body_list.reset(); - for ( i = 0; i < from_body_list.size(); i++ ) { - new_from_body_list.append(bodies_vector[i]); - } - return success; } @@ -1378,36 +428,6 @@ bool show_messages) const { CubitStatus success = CUBIT_SUCCESS; -// bool delete_attribs = - (GeometryModifyTool::instance()->get_new_ids() || keep_old); - int i; - CubitBox edge_list_bbox, bbox2; - const int num_bodies = body_list.size(); - - FacetboolInterface *FBInt = new FacetboolInterface; - - FBInt->make_FB_edge_list(ref_edge_list); - FBInt->get_edge_list_bbox(edge_list_bbox); - - for (i = 0; success && i < num_bodies; i++) { - BodySM *Body_Ptr = body_list.next(i); - success = OCCQueryEngine::instance()->create_facet_bounding_box( - Body_Ptr, - bbox2); - if (edge_list_bbox.overlap(GEOMETRY_RESABS, bbox2)) { - BodySM *new_body; - FBInt->FB_imprint_with_curves(Body_Ptr,new_body,keep_old); - new_body_list.append(new_body); - } - } - - delete FBInt; - - body_list.reset(); - for ( i = 0; i < body_list.size(); i++ ) { - instance()->get_gqe()->delete_solid_model_entities(body_list.get_and_step()); - } - return success; } @@ -1453,7 +473,9 @@ CubitStatus OCCModifyEngine::imprint( DLIList<BodySM*> &/*body_list*/, DLIList<CubitVector*> &/*vector_list*/, DLIList<BodySM*>& /*new_body_list*/, - bool keep_old /*keep_old_body*/ ) const + bool keep_old /*keep_old_body*/, + DLIList<TopologyBridge*>*, + DLIList<TopologyBridge*>* ) const { PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; @@ -1524,34 +546,8 @@ bool keep_old) const { - CubitStatus status = CUBIT_FAILURE; - int i; - BodySM *from_body, *newBody; - FacetboolInterface *fbint; - CubitFacetboolOp op; - DLIList<BodySM*> bodies; - - op = CUBIT_FB_INTERSECTION; - fbint = new FacetboolInterface; - - from_bodies.reset(); - for ( i = from_bodies.size(); i > 0; i-- ) { - bodies.clean_out(); - bodies.append(tool_body_ptr); - from_body = from_bodies.get_and_step(); - bodies.append(from_body); - fbint = new FacetboolInterface; - status = fbint->dofacetboolean(bodies,newBody,keep_old,op); - delete fbint; - if ( status == CUBIT_SUCCESS && newBody) new_bodies.append(newBody); - } - - return status; - -/* PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; -*/ } //=============================================================================== @@ -1568,44 +564,8 @@ bool keep_old , bool nonreg) const { -//Note: there is never any leftover body. -FacetboolInterface *fbint; -CubitFacetboolOp op; -bool keep_old_this = keep_old; -CubitStatus status; -BodySM *body_1, *body_2; -bool intersection_found; -BodySM* intersectBody = NULL; -BodySM* outsideBody = NULL; - - if ( bodies.size() > 2 ) { - PRINT_ERROR("Chop not yet supported for more than two bodies.\n"); - return CUBIT_FAILURE; - } - body_1 = bodies.get_and_step(); - body_2 = bodies.get(); - op = CUBIT_FB_INTERSECTION; - fbint = new FacetboolInterface; - status = fbint->dofacetboolean_2bodies(body_2,body_1,intersectBody, - keep_old_this,intersection_found,op); - intersectBodies.append( intersectBody ); - - delete fbint; - op = CUBIT_FB_SUBTRACTION; - fbint = new FacetboolInterface; - status = fbint->dofacetboolean_2bodies(body_1,body_2,outsideBody, - keep_old_this,intersection_found,op); - outsideBodies.append( outsideBody ); - - delete fbint; - - if ( keep_old == false ) { - OCCQueryEngine::instance()->delete_solid_model_entities(body_1); - OCCQueryEngine::instance()->delete_solid_model_entities(body_2); - } - - return status; - + PRINT_ERROR("Option not supported for mesh based geometry.\n"); + return CUBIT_FAILURE; } //=============================================================================== @@ -1619,25 +579,8 @@ DLIList<BodySM*> &newBodies, bool keep_old) const { - -CubitStatus status; -FacetboolInterface *fbint; -CubitFacetboolOp op; - - op = CUBIT_FB_UNION; - fbint = new FacetboolInterface; - - BodySM *newBody = NULL; - status = fbint->dofacetboolean(bodies,newBody,keep_old,op); - - newBodies.append( newBody ); - delete fbint; - return status; -/* PRINT_ERROR("Option not supported for mesh based geometry.\n"); - return CUBIT_FAILURE; -*/ - + return CUBIT_FAILURE; } @@ -1686,7 +629,9 @@ double /*draft_angle*/, int /*draft_type*/, bool /*switchside*/, - bool /*rigid*/) const + bool /*rigid*/, + Surface* stop_surf, + BodySM* to_body) const { PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; @@ -1706,7 +651,9 @@ double /*draft_angle*/, int /*draft_type*/, bool /*switchside*/, - bool /*rigid*/) const + bool /*rigid*/, + Surface* stop_surf, + BodySM* to_body) const { PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; @@ -1730,7 +677,9 @@ int /*draft_type*/, bool /*switchside*/, bool /*make_solid*/, - bool /*rigid*/) const + bool /*rigid*/, + Surface* stop_surf, + BodySM* to_body) const { PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; @@ -1749,7 +698,9 @@ DLIList<Curve*>& /*ref_edge_list*/, double /*draft_angle*/, int /*draft_type*/, - bool /*rigid*/) const + bool /*rigid*/, + Surface* stop_surf, + BodySM* to_body) const { PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; @@ -1771,113 +722,8 @@ DLIList<BodySM*>& results_list, bool imprint ) const { - -CubitBox super_bbox; -CubitStatus status; -int i; - - CubitBoolean delete_bodies = (GeometryModifyTool::instance()->get_new_ids() ? - CUBIT_FALSE : CUBIT_TRUE); - -// Find the bounding box of all of the bodies. This will be used to make -// the cutting plane. - - - status = OCCQueryEngine::instance()->create_super_facet_bounding_box(webcut_body_list, - super_bbox); - -// Find the size of the cutting plane (x,y) in terms of super_bbox. - DLIList<CubitVector> intersection_points; - FBDataUtil::intersect_plane_with_boundingbox(super_bbox, - v1,v2,v3,intersection_points); - int numpts = intersection_points.size();; - if ( numpts < 3 ) { - PRINT_INFO("INFO: Cutting Tool overlaps the original volume,\n" - " Or cutting plane does not pass through volume.\n" - " The original volume is unaffected.\n" ); - - return CUBIT_FAILURE; - } -double xsize, ysize, xcen, ycen, zcen; -double xmin, ymin, zmin, xmax, ymax, zmax, xx, yy, zz; - xmin = ymin = zmin = CUBIT_DBL_MAX; - xmax = ymax = zmax = -xmin + 1; - xcen = ycen = zcen = 0.0; - for ( i = 0; i < numpts; i++ ) { - xx = intersection_points[i].x(); - yy = intersection_points[i].y(); - zz = intersection_points[i].z(); - - xcen += xx; - ycen += yy; - zcen += zz; - - xmin = (xmin < xx ) ? xmin : xx; - ymin = (ymin < yy ) ? ymin : yy; - zmin = (zmin < zz ) ? zmin : zz; - xmax = (xmax > xx ) ? xmax : xx; - ymax = (ymax > yy ) ? ymax : yy; - zmax = (zmax > zz ) ? zmax : zz; - } - xcen /= numpts; ycen /= numpts; zcen /= numpts; - - // Could do this better by rotating the intersection points into the - // x-y plane and then getting xsize and ysize. Factor of 1.3 is just - // to make sure that the plane extends beyond the bodies. - xsize = ysize = 1.3*sqrt( (xmax-xmin)*(xmax-xmin) + - (ymax-ymin)*(ymax-ymin) + - (zmax-zmin)*(zmax-zmin) ); - STD(vector)<double> cutter_verts; - STD(vector)<int> cutter_connections; - int numx, numy; - numx = 20; - numy = 20; - // Make the cutter surface. - status = FBDataUtil::FBmake_xy_plane(cutter_verts, cutter_connections, - xsize, ysize, numx, numy); - CubitVector va, vb; - va = v1 - v2; - vb = v3 - v2; - CubitVector rotate_to; - - rotate_to = vb*va; - rotate_to.normalize(); - CubitVector center_pt(xcen,ycen,zcen); - status = FBDataUtil::rotate_FB_object(cutter_verts,rotate_to,center_pt); - FacetboolInterface *fbint; - bool cutter_is_plane = true; - // Now make the facetbool objects for the bodies. - webcut_body_list.reset(); -BodySM *body_sm; - - for ( i = webcut_body_list.size(); i > 0; i-- ) { - CubitBoolean intersects; - body_sm = webcut_body_list.get_and_step(); - fbint = new FacetboolInterface; - status = fbint->webcut_FB(body_sm,cutter_verts,cutter_connections, - cutter_is_plane,delete_bodies, - intersects,results_list); - delete fbint; - if ( status == CUBIT_FAILURE ) - { - PRINT_ERROR(" Unable to perform webcut.\n" ); - return CUBIT_FAILURE; - } - - if ( status == CUBIT_SUCCESS && intersects ) - { - instance()->get_gqe()->delete_solid_model_entities(body_sm); - } - else - { - PRINT_INFO("INFO: Cutting Tool overlaps the original volume,\n" - " Or cutting plane does not pass through volume.\n" - " The original volume is unaffected.\n" ); - } - } - - return status; - + PRINT_ERROR("Option not supported for mesh based geometry.\n"); + return CUBIT_FAILURE; } //=============================================================================== @@ -1960,75 +806,8 @@ DLIList<BodySM*>& results_list, bool imprint ) { - -CubitBox super_bbox; -CubitStatus status; -int i; -CubitVector bodies_center, my_center, diagonal, my_axis; - - CubitBoolean delete_bodies = (GeometryModifyTool::instance()->get_new_ids() ? - CUBIT_FALSE : CUBIT_TRUE); - - status = OCCQueryEngine::instance()->create_super_facet_bounding_box( - webcut_body_list,super_bbox); - STD(vector)<double> cutter_verts; - STD(vector)<int> cutter_connections; - int nr, nz; - double length; - - diagonal = super_bbox.diagonal(); -// length = 2.3*diagonal.length() + 2.0*center.length(); - bodies_center = super_bbox.center(); - length = 3.*sqrt((bodies_center.x() - center.x())*(bodies_center.x() - center.x()) + - (bodies_center.y() - center.y())*(bodies_center.y() - center.y()) + - (bodies_center.z() - center.z())*(bodies_center.z() - center.z()) ); - length += 3.*diagonal.length(); - //length = sqrt(length*length + radius*radius); - // bodies_center += center; - - nr = 30; - nz = 5; - - // Make the cutter surface. - status = FBDataUtil::FBmake_cylinder(cutter_verts, cutter_connections, - radius, length, nr, nz); - my_center = center; - my_axis = axis; - status = FBDataUtil::rotate_FB_object(cutter_verts,my_axis,my_center); - - FacetboolInterface *fbint; - bool cutter_is_plane = false; - // Now make the facetbool objects for the bodies. - webcut_body_list.reset(); - BodySM* body_sm; - for ( i = webcut_body_list.size(); i > 0; i-- ) { - CubitBoolean intersects; - body_sm = webcut_body_list.get_and_step(); - fbint = new FacetboolInterface; - status = fbint->webcut_FB(body_sm,cutter_verts,cutter_connections, - cutter_is_plane,delete_bodies, - intersects,results_list); - delete fbint; - if ( status == CUBIT_FAILURE ) - { - PRINT_ERROR(" Unable to perform webcut.\n" ); - return CUBIT_FAILURE; - } - - if ( status == CUBIT_SUCCESS && intersects ) - { - instance()->get_gqe()->delete_solid_model_entities(body_sm); - } - else - { - PRINT_INFO("INFO: Cutting Tool overlaps the original volume,\n" - " Or cutting plane does not pass through volume.\n" - " The original volume is unaffected.\n" ); - } - } - - return status; - + PRINT_ERROR("Option not supported for mesh based geometry.\n"); + return CUBIT_FAILURE; } //=============================================================================== @@ -2117,35 +896,6 @@ CubitStatus OCCModifyEngine::split_body( BodySM *body_ptr, DLIList<BodySM*> &new_bodies ) { - //get the all lumps of input body - DLIList<Lump*> lumps; - body_ptr->lumps( lumps ); - - if( lumps.size() == 1 ) - { - new_bodies.append( body_ptr ); - return CUBIT_SUCCESS; - } - - //for each lump except one first one, create a new body - DLIList<Lump*> single_lump; - lumps.reset(); - lumps.step(); - int i; - OCCBody *tmp_facet_body = static_cast<OCCBody*>( body_ptr ); - for( i=lumps.size()-1; i--; ) - { - BodySM *bodysm_ptr; - single_lump.clean_out(); - tmp_facet_body->remove_lump( static_cast<OCCLump*>(lumps.get())); - single_lump.append( lumps.get_and_step() ); - make_facet_body(single_lump, bodysm_ptr); - if( bodysm_ptr ) - new_bodies.append(bodysm_ptr); - } - - new_bodies.append( body_ptr ); - return CUBIT_SUCCESS; } @@ -2159,19 +909,6 @@ //=============================================================================== CubitStatus OCCModifyEngine::reverse_body( BodySM* body_ptr ) { - OCCBody* body = dynamic_cast<OCCBody*>(body_ptr); - if (0 == body) - { - PRINT_ERROR("Non-facet body in FME::reverse.\n"); - return CUBIT_FAILURE; - } - - // Flip CoFace senses - DLIList<OCCShell*> shells; - body->get_shells( shells ); - while (shells.size()) - shells.pop()->reverse(); - return CUBIT_SUCCESS; } @@ -2259,108 +996,11 @@ // Author : Steve Owen // Date : 9/11/03 //=============================================================================== -CubitStatus OCCModifyEngine::create_body_from_surfs(DLIList<Surface*> & ref_face_list, - BodySM *& new_body, - bool keep_old, - bool heal) const +CubitStatus OCCModifyEngine::create_solid_bodies_from_surfs(DLIList<Surface*> & ref_face_list, + DLIList<BodySM*>& new_bodies, + bool keep_old, + bool heal) const { - // get the facets from the faces - - int ii; - Surface *surf_ptr; - OCCSurface *fsurf_ptr; - DLIList<CubitFacet *> facet_list; - DLIList<CubitPoint *> point_list; -#ifdef BOYD17 - DLIList<CubitFacetEdge *>edge_list; -#endif - - if (heal) - { - PRINT_WARNING("\"heal\" option for facet-based geometry is not supported.\n"); - } - - ref_face_list.reset(); - for(ii=0; ii<ref_face_list.size(); ii++) - { - surf_ptr = ref_face_list.get_and_step(); - fsurf_ptr = dynamic_cast<OCCSurface *>(surf_ptr); - assert(fsurf_ptr != NULL); - if (fsurf_ptr == NULL) - return CUBIT_FAILURE; - point_list.clean_out(); - fsurf_ptr->get_my_facets( facet_list, point_list ); - } - - // copy the facets - - DLIList<CubitFacet *> new_facet_list; - DLIList<CubitPoint *> new_point_list; - DLIList<CubitFacetEdge *> new_edge_list; - FacetDataUtil::copy_facets( facet_list, new_facet_list, new_point_list, new_edge_list ); - - // generate new geometry - - const char *file_name = NULL; - CubitBoolean use_feature_angle = CUBIT_FALSE; - double feature_angle = 0.0; - int interp_order = 0; - double tol=0.0; - CubitBoolean smooth_non_manifold = CUBIT_FALSE; - CubitBoolean split_surfaces = CUBIT_FALSE; - CubitBoolean stitch = CUBIT_TRUE; - CubitBoolean improve = CUBIT_TRUE; - DLIList <CubitQuadFacet *> quad_facet_list; - DLIList<Surface *> surface_list; - FacetFileFormat file_format = FROM_FACET_LIST; - CubitStatus rv = - OCCQueryEngine::instance()->import_facets( file_name, - use_feature_angle, - feature_angle, - tol, - interp_order, - smooth_non_manifold, - split_surfaces, - stitch, - improve, - quad_facet_list, - new_facet_list, - surface_list, - file_format ); - - if (rv == CUBIT_SUCCESS) - { - surf_ptr = surface_list.get(); - new_body = surf_ptr->bodysm(); - - // delete the old model - - if (!keep_old) - { - DLIList<BodySM*> mybody_list; - DLIList<BodySM*> body_list; - for(ii=0; ii<ref_face_list.size(); ii++) - { - mybody_list.clean_out(); - surf_ptr = ref_face_list.get_and_step(); - surf_ptr->bodysms(mybody_list); - if (mybody_list.size() == 1) - { - body_list.append_unique( mybody_list.get() ); - } - } - if (body_list.size() > 0) - { - OCCQueryEngine::instance()->delete_solid_model_entities(body_list); - //GeometryQueryTool::instance()->delete_Body( body_list ); - } - } - } - else - { - new_body = NULL; - } - return CUBIT_SUCCESS; } @@ -2509,6 +1149,33 @@ return CUBIT_FAILURE; } +CubitStatus OCCModifyEngine::get_spheric_mid_surface( Surface* surface_ptr1, + Surface* surface_ptr2, + BodySM* body_to_trim_to, + BodySM*& midsurface_body ) const +{ + PRINT_ERROR("Option not supported for mesh based geometry.\n"); + return CUBIT_FAILURE; +} + +CubitStatus OCCModifyEngine::get_conic_mid_surface( Surface* surface_ptr1, + Surface* surface_ptr2, + BodySM* body_to_trim_to, + BodySM*& midsurface_body ) const +{ + PRINT_ERROR("Option not supported for mesh based geometry.\n"); + return CUBIT_FAILURE; +} + +CubitStatus OCCModifyEngine::get_toric_mid_surface( Surface* surface_ptr1, + Surface* surface_ptr2, + BodySM* body_to_trim_to, + BodySM*& midsurface_body ) const +{ + PRINT_ERROR("Option not supported for mesh based geometry.\n"); + return CUBIT_FAILURE; +} + //============================================================================= // Function : tweak_chamfer // Member Type: PUBLIC @@ -2624,7 +1291,8 @@ CubitStatus OCCModifyEngine::tweak_move( DLIList<Surface*> & /*surface_list*/, const CubitVector & /*delta*/, DLIList<BodySM*> & /*new_bodysm_list*/, - CubitBoolean /*keep_old_body*/ ) const + CubitBoolean /*keep_old_body*/ , + CubitBoolean show_preview) const { PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; @@ -2640,7 +1308,8 @@ CubitStatus OCCModifyEngine::tweak_move( DLIList<Curve*> & /*curve_list*/, const CubitVector & /*delta*/, DLIList<BodySM*> & /*new_bodysm_list*/, - CubitBoolean /*keep_old_body*/ ) const + CubitBoolean /*keep_old_body*/, + CubitBoolean show_preview ) const { PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; @@ -2657,7 +1326,8 @@ CubitStatus OCCModifyEngine::tweak_offset( DLIList<Surface*> & /*surface_list*/, double /*offset_distance*/, DLIList<BodySM*> & /*new_bodysm_list*/, - CubitBoolean /*keep_old_body*/ ) const + CubitBoolean /*keep_old_body*/, + CubitBoolean show_preview ) const { PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; @@ -2674,7 +1344,8 @@ CubitStatus OCCModifyEngine::tweak_offset( DLIList<Curve*> & /*curve_list*/, double /*offset_distance*/, DLIList<BodySM*> & /*new_bodysm_list*/, - CubitBoolean /*keep_old_body*/ ) const + CubitBoolean /*keep_old_body*/, + CubitBoolean show_preview ) const { PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; @@ -2692,7 +1363,8 @@ DLIList<BodySM*> & /*new_bodysm_list*/, CubitBoolean /*extend_adjoining*/, CubitBoolean /*keep_surface*/, - CubitBoolean /*keep_old_body*/ ) const + CubitBoolean /*keep_old_body*/, + CubitBoolean show_preview ) const { PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; @@ -2708,7 +1380,8 @@ //============================================================================= CubitStatus OCCModifyEngine::tweak_remove( DLIList<Curve*> & /*curve_list*/, DLIList<BodySM*> & /*new_bodysm_list*/, - CubitBoolean /*keep_old_body*/ ) const + CubitBoolean /*keep_old_body*/, + CubitBoolean show_preview ) const { PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; @@ -2723,10 +1396,11 @@ // Date : //============================================================================= CubitStatus OCCModifyEngine::tweak_target( DLIList<Surface*> & /*surface_list*/, - Surface * /*target_surf_ptr*/, - DLIList<BodySM*> & /*new_bodysm_list*/, + DLIList<Surface*> & , + DLIList<BodySM*> & /*new_bodysm_list*/, CubitBoolean /*reverse_flg*/, - CubitBoolean /*keep_old_body*/ ) const + CubitBoolean /*keep_old_body*/, + CubitBoolean show_preview ) const { PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; @@ -2741,9 +1415,11 @@ // Date : //============================================================================= CubitStatus OCCModifyEngine::tweak_target( DLIList<Curve*> & /*curve_list*/, - Surface * /*target_surf_ptr*/, - DLIList<BodySM*> & /*new_bodysm_list*/, - CubitBoolean /*keep_old_body*/ ) const + DLIList<Surface*> & /*target_surfs*/, + DLIList<BodySM*> & /*new_bodysm_list*/, + CubitBoolean , + CubitBoolean /*keep_old_body*/, + CubitBoolean show_preview ) const { PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; @@ -2759,14 +1435,23 @@ // Date : //============================================================================= CubitStatus OCCModifyEngine::tweak_target( DLIList<Curve*> & /*curve_list*/, - Curve * /*target_curve_ptr*/, - DLIList<BodySM*> & /*new_bodysm_list*/, - CubitBoolean /*keep_old_body*/ ) const + DLIList<Curve*> & /*target_curve_ptr*/, + DLIList<BodySM*> & /*new_bodysm_list*/, + CubitBoolean, + CubitBoolean /*keep_old_body*/, + CubitBoolean show_preview ) const { PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; } +CubitStatus OCCModifyEngine::remove_curve_slivers( BodySM* /*body*/, + double /*lengthlimit*/ ) const +{ + PRINT_ERROR("Option not supported for mesh based geometry.\n"); + return CUBIT_FAILURE; +} + //================================================================================ // Description: Creates a net surface. // Author : Tyronne Lim @@ -2820,8 +1505,7 @@ BodySM*& new_bodysm, double offset_distance ) const { - return OCCModifyEngine::instance()-> - create_shell_offset( body_ptr, new_bodysm, offset_distance ); + return CUBIT_FAILURE; } //================================================================================ @@ -2906,1672 +1590,6 @@ return CUBIT_FAILURE; } -//================================================================================ -// Facet-based geometry entities -// Methods for building specific facet-based geometry entities -//================================================================================ - -//================================================================================ -// Function : make_facet_point -// Member Type: PUBLIC -// Description: create a new facet point given a pointer to the -// associated CubitPoint -// Author : sjowen -// Date : 12/28/00 -//================================================================================ -CubitStatus OCCModifyEngine::make_facet_point( CubitPoint *thePoint, - Point *&new_point_ptr ) -{ - //We don't know in this function what to attach it to, so do that later. - DLIList<Curve*> curves; - - OCCPoint *new_facet_point = new OCCPoint( thePoint, curves ); - - new_point_ptr = (Point*) new_facet_point; - - return CUBIT_SUCCESS; -} - -//================================================================================ -// Function : make_facet_point -// Member Type: PUBLIC -// Description: create a new facet point given its location -// Author : sjowen -// Date : 12/6/00 -//================================================================================ -CubitStatus OCCModifyEngine::make_facet_point( CubitVector &location, - Point *&new_point_ptr ) -{ - //We don't know in this function what to attach it to, so do that later. - DLIList<Curve*> curves; - - OCCPoint *new_facet_point = new OCCPoint( location, curves ); - - new_point_ptr = (Point*) new_facet_point; - - return CUBIT_SUCCESS; -} - -//================================================================================ -// Function : make_facet_curve -// Member Type: PUBLIC -// Description: create a new facet curve -// (Assumes the curve will have an associated parent surface. -// Evaluations will be done on the surface -- uses the same -// order evaluations as the surface) -// Author : sjowen -// Date : 12/6/00 -//================================================================================ -CubitStatus OCCModifyEngine::make_facet_curve( Point *start_ptr, - Point *end_ptr, - Curve *&new_curve_ptr, - CurveFacetEvalTool *eval_tool_ptr) -{ - - //We don't know in this function what to attach it to, so do that later. - DLIList<CoEdgeSM*> coedgesms; - - OCCCurve *new_facet_curv = new OCCCurve( eval_tool_ptr, start_ptr, - end_ptr, coedgesms ); - new_curve_ptr = (Curve*) new_facet_curv; - - OCCPoint *facet_start_point = CAST_TO( start_ptr, OCCPoint ); - OCCPoint *facet_end_point = CAST_TO( end_ptr, OCCPoint ); - facet_start_point->add_curve( new_curve_ptr ); - facet_end_point->add_curve( new_curve_ptr ); - - return CUBIT_SUCCESS; -} - -//================================================================================ -// Function : make_facet_curve -// Member Type: PUBLIC -// Description: create a new facet curve given its edge facets -// (this can be used for generating a facet curve representation -// that does not have a parent surface associated -- currently -// only linear evaluations are possible) -// Author : sjowen -// Date : 2/17/01 -//================================================================================ -CubitStatus OCCModifyEngine::make_facet_curve( - Point *start_ptr, // endpoints on the curve - Point *end_ptr, - DLIList<CubitFacetEdge*> &edge_list, // the ordered facet edges on this curve - DLIList<CubitPoint*> &point_list, // the ordered points on this curve - Curve *&new_curve_ptr, // return the new curve pointer - CurveFacetEvalTool *curve_facet_tool ) -{ - if ( curve_facet_tool == NULL ) - { - curve_facet_tool = new CurveFacetEvalTool; - CubitStatus status = curve_facet_tool->initialize( edge_list, point_list ); - if ( status != CUBIT_SUCCESS ) - { - return status; - } - } - if (!curve_facet_tool) - return CUBIT_FAILURE; - - //We don't know in this function what to attach it to, so do that later. - DLIList<CoEdgeSM*> coedgesms; - - OCCCurve *new_facet_curv = new OCCCurve( curve_facet_tool, start_ptr, - end_ptr, coedgesms ); - new_curve_ptr = (Curve*) new_facet_curv; - - OCCPoint *facet_start_point = CAST_TO( start_ptr, OCCPoint ); - OCCPoint *facet_end_point = CAST_TO( end_ptr, OCCPoint ); - facet_start_point->add_curve( new_curve_ptr ); - facet_end_point->add_curve( new_curve_ptr ); - - return CUBIT_SUCCESS; -} - -//================================================================================ -// Function : make_facet_coedge -// Member Type: PUBLIC -// Description: create a new facet coedge -// Author : sjowen -// Date : 12/6/00 -//================================================================================ -CubitStatus OCCModifyEngine::make_facet_coedge( Curve *curv_ptr, - CubitSense sense, - CoEdgeSM *&new_coedge_ptr ) -{ - //We don't know in this function what to attach it to, so do that later. - LoopSM *loop_ptr = NULL; - - //Now create a new loop. - - OCCCoEdge *new_facet_coedge = new OCCCoEdge(curv_ptr, loop_ptr, sense); - - new_coedge_ptr = (CoEdgeSM*) new_facet_coedge; - - OCCCurve *facet_curve = CAST_TO( curv_ptr, OCCCurve ); - facet_curve->add_coedge( new_coedge_ptr ); - - return CUBIT_SUCCESS; -} - -//================================================================================ -// Function : make_facet_loop -// Member Type: PUBLIC -// Description: create a new facet loop -// Author : sjowen -// Date : 12/6/00 -//================================================================================ -CubitStatus OCCModifyEngine::make_facet_loop( DLIList<CoEdgeSM*> &coedge_list, - LoopSM *&new_loop_ptr ) -{ - //We don't know in this function what to attach it to, so do that later. - Surface *surf_ptr = NULL; - - //Now create a new loop. - - OCCLoop *new_facet_loop = new OCCLoop(surf_ptr, coedge_list ); - - new_loop_ptr = (LoopSM*) new_facet_loop; - int ii; - for ( ii = coedge_list.size(); ii > 0; ii-- ) - { - CoEdgeSM* coedge_ptr = coedge_list.get_and_step(); - OCCCoEdge *facet_coedge = CAST_TO(coedge_ptr, OCCCoEdge); - facet_coedge->add_loop(new_loop_ptr); - } - return CUBIT_SUCCESS; -} - -//================================================================================ -// Function : make_facet_surface -// Member Type: PUBLIC -// Description: create a new facet surface from Quad facets -// Author : sjowen -// Date : 12/6/00 -//================================================================================ -CubitStatus OCCModifyEngine::make_facet_surface( - DLIList<CubitQuadFacet*> &quad_facet_list, - DLIList<CubitPoint*> &point_list, - DLIList<LoopSM*> &my_loops, - int interp_order, - double min_dot, - Surface *&new_surface_ptr) -{ - CubitQuadFacet *qfacet; - DLIList<CubitFacet*> facet_list; - int ii; - - quad_facet_list.reset(); - for (ii=0; ii<quad_facet_list.size(); ii++) - { - qfacet = quad_facet_list.get_and_step(); - facet_list.append( qfacet->get_tri_facet( 0 ) ); - facet_list.append( qfacet->get_tri_facet( 1 ) ); - } - return make_facet_surface( NULL, facet_list, point_list, my_loops, - interp_order, min_dot, new_surface_ptr ); -} - -//================================================================================ -// Function : make_facet_surface -// Member Type: PUBLIC -// Description: create a new facet surface -// Author : sjowen -// Date : 12/6/00 -//================================================================================ -CubitStatus OCCModifyEngine::make_facet_surface( const CubitEvaluatorData *eval_data, - DLIList<CubitFacet*> &facet_list, - DLIList<CubitPoint*> &point_list, - DLIList<LoopSM*> &my_loops, - int interp_order, - double min_dot, - Surface *&new_surface_ptr, - CubitBoolean use_point_addresses, - FacetEvalTool *facet_eval_tool) -{ - //Create a new surface given the facets and point list. - if (facet_eval_tool == NULL) - { - facet_eval_tool = new FacetEvalTool(facet_list, point_list, - interp_order, min_dot ); - } - - //We don't know in this function what to attach it to, so do that later. - DLIList<ShellSM*> shellsms; - OCCSurface *new_facet_surf; - - //Now create a new surface. - if ( eval_data && eval_data->ask_type() == SPHERE_SURFACE_TYPE ) - { - new_facet_surf = new OCCSurface( (const SphereEvaluatorData*)eval_data, - facet_eval_tool, - shellsms, - my_loops ); - } - else if ( eval_data && eval_data->ask_type() == CONE_SURFACE_TYPE ) - { - new_facet_surf = new OCCSurface( (const CylinderEvaluatorData*)eval_data, - facet_eval_tool, - shellsms, - my_loops ); - } - else - { - new_facet_surf = new OCCSurface( facet_eval_tool, - shellsms, my_loops ); - } - - new_surface_ptr = (Surface*) new_facet_surf; - int ii; - for ( ii = my_loops.size(); ii > 0; ii-- ) - { - LoopSM* loop_ptr = my_loops.get_and_step(); - OCCLoop *facet_loop = CAST_TO(loop_ptr, OCCLoop); - facet_loop->add_surface(new_surface_ptr); -#ifdef BOYD17 - DLIList<CoEdgeSM*> coedges; -#endif - } - - // generate the curve facet evaluaion tools for each of the curves on this - // surface - they are based on the surface evaluation tool - - DLIList<OCCCoEdge*> coedges; - new_facet_surf->get_coedges( coedges ); - for (ii=0; ii<coedges.size(); ii++) - { - OCCCoEdge *coedgesm_ptr = coedges.get_and_step(); - DLIList<OCCCurve*> curve_list; - coedgesm_ptr->get_curves( curve_list ); - OCCCurve *facet_curve =curve_list.get(); - CurveFacetEvalTool *eval_tool = facet_curve->get_eval_tool(); - if (eval_tool == NULL) - { - Point *start_point = facet_curve->start_point(); - Point *end_point = facet_curve->end_point(); - OCCCoEdge *facet_coedge_ptr = CAST_TO( coedgesm_ptr, OCCCoEdge ); - CubitSense sense = facet_coedge_ptr->get_sense(); - - CubitStatus status = CUBIT_SUCCESS; - eval_tool = new CurveFacetEvalTool; - if (!use_point_addresses) - { - CubitVector temp_vec1 = start_point->coordinates(); - CubitVector temp_vec2 = end_point->coordinates(); - status = eval_tool->initialize( facet_eval_tool, - temp_vec1, - temp_vec2, - sense ); - if ( status != CUBIT_SUCCESS ) - { - return status; - } - } - else - { - OCCPoint *start_facet_pt_ptr = CAST_TO( start_point, OCCPoint ); - OCCPoint *end_facet_pt_ptr = CAST_TO( end_point, OCCPoint ); - CubitPoint *start_pt = start_facet_pt_ptr->get_cubit_point(); - CubitPoint *end_pt = end_facet_pt_ptr->get_cubit_point(); - status = eval_tool->initialize( facet_eval_tool, - start_pt, - end_pt, - sense ); - if ( status != CUBIT_SUCCESS ) - { - return status; - } - } - if( !eval_tool->has_good_curve_data() ) - return CUBIT_FAILURE; - facet_curve->set_eval_tool( eval_tool ); - } - } - return CUBIT_SUCCESS; -} - -//================================================================================ -// Function : make_facet_shell -// Member Type: PUBLIC -// Description: create a new facet shell -// Author : sjowen -// Date : 12/6/00 -//================================================================================ -CubitStatus OCCModifyEngine::make_facet_shell(DLIList<Surface*> &surface_list, - ShellSM *&new_shell_ptr) -{ - - Lump* my_lump = NULL; - OCCShell *new_facet_shell = new OCCShell(my_lump, surface_list); - new_shell_ptr = (ShellSM*) new_facet_shell; - int ii; - for ( ii = surface_list.size(); ii > 0; ii-- ) - { - Surface* surface_ptr = surface_list.get_and_step(); - OCCSurface *facet_surface = CAST_TO(surface_ptr, OCCSurface); - facet_surface->add_shell(new_shell_ptr); - } - return CUBIT_SUCCESS; -} - -//================================================================================ -// Function : make_facet_lump -// Member Type: PUBLIC -// Description: create a new facet lump -// Author : sjowen -// Date : 12/6/00 -//================================================================================ -CubitStatus OCCModifyEngine::make_facet_lump(DLIList<ShellSM*> &shell_list, - Lump *&new_lump_ptr) -{ - - OCCLump *new_facet_lump = new OCCLump(shell_list); - new_lump_ptr = (Lump*) new_facet_lump; - int ii; - for ( ii = shell_list.size(); ii > 0; ii-- ) - { - ShellSM* shell_ptr = shell_list.get_and_step(); - OCCShell *facet_shell = CAST_TO(shell_ptr, OCCShell); - facet_shell->add_lump(new_lump_ptr); - } - return CUBIT_SUCCESS; -} - -//================================================================================ -// Function : make_facet_body -// Member Type: PUBLIC -// Description: create a new facet body -// Author : sjowen -// Date : 12/6/00 -//================================================================================ -CubitStatus OCCModifyEngine::make_facet_body(DLIList<Lump*> &lump_list, - BodySM *&new_body_ptr) -{ - - OCCBody *new_facet_body = new OCCBody(lump_list); - new_body_ptr = (BodySM*) new_facet_body; - //Now attach the lower entites. - - int ii; - for ( ii = lump_list.size(); ii > 0; ii-- ) - { - Lump* lump_ptr = lump_list.get_and_step(); - OCCLump *facet_lump = CAST_TO(lump_ptr, OCCLump); - facet_lump->add_body(new_body_ptr); - } - return CUBIT_SUCCESS; -} - -//================================================================================ -// Function : build_facet_surface -// Member Type: PUBLIC -// Description: same as build_facet_surface below, but takes a list of quad facets -// Author : sjowen -// Date : 4/30/01 -//================================================================================ -CubitStatus OCCModifyEngine::build_facet_surface( - DLIList<CubitQuadFacet *> &quad_facet_list, - DLIList<CubitPoint *>&point_list, // fills this in if not provided - double feature_angle, - int interp_order, - CubitBoolean smooth_non_manifold, - CubitBoolean split_surfaces, - DLIList<Surface *> &surface_list) -{ - CubitQuadFacet *qfacet; - DLIList<CubitFacet*> facet_list; - int ii; - - quad_facet_list.reset(); - for (ii=0; ii<quad_facet_list.size(); ii++) - { - qfacet = quad_facet_list.get_and_step(); - facet_list.append( qfacet->get_tri_facet( 0 ) ); - facet_list.append( qfacet->get_tri_facet( 1 ) ); - } - return build_facet_surface( NULL, facet_list, point_list, feature_angle, - interp_order, smooth_non_manifold, - split_surfaces, surface_list ); -} - -//================================================================================ -// Function : build_facet_surface -// Member Type: PUBLIC -// Description: same as build_facet_surface below, both quad and triangle facets -// Author : sjowen -// Date : 4/30/01 -//================================================================================ -CubitStatus OCCModifyEngine::build_facet_surface( - DLIList<CubitQuadFacet *> &quad_facet_list, - DLIList<CubitFacet *> &tri_facet_list, - DLIList<CubitPoint *>&point_list, // fills this in if not provided - double feature_angle, - int interp_order, - CubitBoolean smooth_non_manifold, - CubitBoolean split_surfaces, - DLIList<Surface *> &surface_list) -{ - CubitStatus rv = CUBIT_SUCCESS; - CubitQuadFacet *qfacet; - DLIList<CubitFacet*> facet_list; - int ii; - quad_facet_list.reset(); - for (ii=0; ii<quad_facet_list.size(); ii++) - { - qfacet = quad_facet_list.get_and_step(); - facet_list.append( qfacet->get_tri_facet( 0 ) ); - facet_list.append( qfacet->get_tri_facet( 1 ) ); - } - facet_list += tri_facet_list; - - rv = build_facet_surface( NULL, facet_list, point_list, feature_angle, - interp_order, smooth_non_manifold, - split_surfaces, surface_list ); - return rv; -} - -//================================================================================ -// Function : build_cholla_surfaces -// Member Type: PUBLIC -// Description: create one or more surfaces from the list of facets. Also creates -// the lower order entities. Generate curves (split surfaces), based -// on feature angle. If feature_angle < 0 then ignore feature_angle -// Note : This function is the main interface for Cubit to the Cholla library -// Author : sjowen -// Date : 4/26/01 -//================================================================================ -CubitStatus OCCModifyEngine::build_cholla_surfaces -( - DLIList<CubitFacet *> facet_list, - DLIList<CubitPoint *> point_list, // fills this in if not provided - double feature_angle, - int interp_order, - CubitBoolean smooth_non_manifold, - CubitBoolean split_surfaces, - ChollaEngine *&cholla_ptr -) -{ - CubitStatus rv = CUBIT_SUCCESS; - - // generate the edge and point lists from the facets - - DLIList<CubitFacetEdge *> edge_list; - DLIList<FacetEntity*> pe_list; - DLIList<FacetEntity *> pf_list; - FacetDataUtil::get_edges( facet_list, edge_list ); - if (facet_list.size() > 0 && point_list.size() == 0) - FacetDataUtil::get_points( facet_list, point_list ); - - CAST_LIST( point_list, pf_list, FacetEntity ); - CAST_LIST( edge_list, pe_list, FacetEntity ); - - // create the surfaces - - if (rv == CUBIT_SUCCESS) - { - DLIList<FacetEntity*> facet_entity_list; - CAST_LIST( facet_list, facet_entity_list, FacetEntity ); - cholla_ptr = new ChollaEngine( facet_entity_list, - pe_list, pf_list ); - CubitBoolean use_feature_angle; - if (feature_angle < 0.0) - use_feature_angle = CUBIT_FALSE; - else - use_feature_angle = CUBIT_TRUE; - rv = cholla_ptr->create_geometry( use_feature_angle, feature_angle, - interp_order, smooth_non_manifold, - split_surfaces ); - } - return rv; -} -//================================================================================ -// Function : build_facet_surface -// Member Type: PUBLIC -// Description: create one or more surfaces from the list of facets. Also creates -// the lower order entities. Generate curves (split surfaces), based -// on feature angle. If feature_angle < 0 then ignore feature_angle -// Note : This function is the main interface for Cubit to the Cholla library -// Author : sjowen -// Date : 4/26/01 -//================================================================================ -CubitStatus OCCModifyEngine::build_facet_surface( - const CubitEvaluatorData **eval_data, - DLIList<CubitFacet *> &facet_list, - DLIList<CubitPoint *> &point_list, // fills this in if not provided - double feature_angle, - int interp_order, - CubitBoolean smooth_non_manifold, - CubitBoolean split_surfaces, - DLIList<Surface *> &surface_list) -{ - CubitStatus rv = CUBIT_SUCCESS; - - // generate the edge and point lists from the facets - - DLIList<CubitFacetEdge *> edge_list; - DLIList<FacetEntity*> pe_list; - DLIList<FacetEntity *> pf_list; - FacetDataUtil::get_edges( facet_list, edge_list ); - if (point_list.size() == 0) - FacetDataUtil::get_points( facet_list, point_list ); - - CAST_LIST( point_list, pf_list, FacetEntity ); - CAST_LIST( edge_list, pe_list, FacetEntity ); - - // create the surfaces - - if (rv == CUBIT_SUCCESS) - { - DLIList<FacetEntity*> facet_entity_list; - CAST_LIST( facet_list, facet_entity_list, FacetEntity ); - ChollaEngine *cholla_ptr = new ChollaEngine( facet_entity_list, - pe_list, pf_list ); - cholla_ptr->set_flip_flag(CUBIT_TRUE); - CubitBoolean use_feature_angle; - if (feature_angle < 0.0) - use_feature_angle = CUBIT_FALSE; - else - use_feature_angle = CUBIT_TRUE; - rv = cholla_ptr->create_geometry( use_feature_angle, feature_angle, - interp_order, smooth_non_manifold, - split_surfaces ); - - // make CUBIT geometry out of the Cholla entities - - if (rv == CUBIT_SUCCESS) - { - DLIList<ChollaSurface *> cholla_surface_list; - cholla_ptr->get_surfaces( cholla_surface_list ); - DLIList<ChollaCurve *> cholla_curve_list; - cholla_ptr->get_curves( cholla_curve_list ); - DLIList<ChollaPoint *> cholla_point_list; - cholla_ptr->get_points( cholla_point_list ); - rv = build_cholla_geometry(eval_data, cholla_surface_list, cholla_curve_list, - cholla_point_list, use_feature_angle, - feature_angle, interp_order, surface_list); - } - cholla_ptr->delete_me(); - delete cholla_ptr; - } - return rv; -} - -//=============================================================================== -// Function : build_cholla_geometry -// Member Type: PRIVATE -// Description: build the CUBIT geometry based on the Facet entity class lists -// Author : sjowen -// Date : 10/02 -//=============================================================================== -CubitStatus OCCModifyEngine::build_cholla_geometry( - const CubitEvaluatorData **eval_data, - DLIList<ChollaSurface*> &cholla_surface_list, - DLIList<ChollaCurve*> &cholla_curve_list, - DLIList<ChollaPoint*> &cholla_point_list, - CubitBoolean use_feature_angle, - double feature_angle, - int interp_order, - DLIList<Surface *> &surface_list) -{ - CubitStatus stat = CUBIT_SUCCESS; - - //- convert feature angle to a dot product - - double min_dot = 0.0; - if (use_feature_angle) - { - if (feature_angle > 180.0) feature_angle = 180.0; - if (feature_angle < 0.0) feature_angle = 0.0; - double rad_angle = (180.0 - feature_angle) * CUBIT_PI / 180.0; - min_dot = cos( rad_angle ); - } - - // build the CUBIT geometry based on Cholla entities - - stat = build_cholla_point_geometry( cholla_point_list ); - - if (stat == CUBIT_SUCCESS) - stat = build_cholla_curve_geometry( cholla_curve_list ); - - if (stat == CUBIT_SUCCESS) - stat = build_cholla_surface_geometry( eval_data, - cholla_surface_list, - interp_order, min_dot, - surface_list); - - return stat; -} - -//=============================================================================== -// Function : build_cholla_point_geometry -// Member Type: PRIVATE -// Description: From the cholla point list, create geometric points for each -// Author : sjowen -// Date : 10/02 -//=============================================================================== -CubitStatus OCCModifyEngine::build_cholla_point_geometry( - DLIList<ChollaPoint*> &cholla_point_list ) -{ - CubitStatus stat = CUBIT_SUCCESS; - int kk; - //int mydebug = 0; - for ( kk = cholla_point_list.size(); kk > 0; kk-- ) - { - ChollaPoint *chpnt_ptr = cholla_point_list.get_and_step(); - Point *point_ptr = (Point *)chpnt_ptr->get_geometric_point(); - if (point_ptr == NULL) - { - FacetEntity *facet_ptr = chpnt_ptr->get_facets(); - CubitPoint *cp_ptr = CAST_TO( facet_ptr, CubitPoint ); - Point *point = NULL; - stat = make_facet_point( cp_ptr, point ); - if ( point == NULL || stat != CUBIT_SUCCESS ) - { - PRINT_ERROR("Problems building mesh based points.\n"); - return stat; - } - point_ptr = (Point *)point; - chpnt_ptr->assign_geometric_point((void *)point_ptr); - } - } - return stat; -} - -//=============================================================================== -// Function : build_cholla_curve_geometry -// Member Type: PRIVATE -// Description: From the cholla curve list, create geometric curves for each -// Author : sjowen -// Date : 10/02 -//=============================================================================== -CubitStatus OCCModifyEngine::build_cholla_curve_geometry( - DLIList<ChollaCurve*> &cholla_curve_list ) -{ - CubitStatus stat = CUBIT_SUCCESS; - int kk; - for ( kk = cholla_curve_list.size(); kk > 0; kk-- ) - { - ChollaCurve *chcurv_ptr = cholla_curve_list.get_and_step(); - Curve *curv_ptr = (Curve *)chcurv_ptr->get_geometric_curve(); - if (curv_ptr == NULL) - { - DLIList<ChollaPoint*> fpoint_list = chcurv_ptr->get_points( ); - ChollaPoint *fpm0_ptr = fpoint_list.get_and_step(); - ChollaPoint *fpm1_ptr = fpoint_list.get_and_step(); - CubitPoint *start_point, *end_point; - chcurv_ptr->get_ends( start_point, end_point ); - if (fpm0_ptr->get_facets() != start_point) - { - ChollaPoint *temp_ptr; - temp_ptr = fpm0_ptr; - fpm0_ptr = fpm1_ptr; - fpm1_ptr = temp_ptr; - } - Point *start_ptr = (Point *) fpm0_ptr->get_geometric_point(); - Point *end_ptr = (Point *) fpm1_ptr->get_geometric_point(); - - // if this is a curve without a parent surface then handle it - // differently. (Curves with parents use the surface to evaluate to - // With only a curve, it must evaluate to the curve) - - DLIList<ChollaSurface*> fsm_list = chcurv_ptr->get_surfaces(); - if (fsm_list.size() == 0) - { - DLIList<FacetEntity*> facet_list; - DLIList<CubitPoint*> point_list; // needs to be filled in - facet_list = chcurv_ptr->get_facet_list(); - DLIList<CubitFacetEdge*> edge_list; - CAST_LIST( facet_list, edge_list, CubitFacetEdge ); - if (stat != CUBIT_SUCCESS) - return stat; - - // the CurveFacetEvalTool was computed in Cholla. Retreive it - // and pass it to make_facet_curve so it can store it with the - // new curve - CurveFacetEvalTool *eval_tool_ptr = chcurv_ptr->get_eval_tool(); - if (eval_tool_ptr == NULL) - return CUBIT_FAILURE; - stat = make_facet_curve( start_ptr, end_ptr, - edge_list, point_list, - curv_ptr, eval_tool_ptr ); - if (stat == CUBIT_SUCCESS) - { - Curve *curvsm_ptr = CAST_TO( curv_ptr, Curve ); - GeometryQueryTool::instance()->make_free_RefEdge( curvsm_ptr ); - } - } - else - { - CurveFacetEvalTool *eval_tool_ptr = chcurv_ptr->get_eval_tool(); - if (eval_tool_ptr == NULL) - return CUBIT_FAILURE; - stat = make_facet_curve( start_ptr, end_ptr, - curv_ptr, eval_tool_ptr ); - if ( curv_ptr == NULL || stat != CUBIT_SUCCESS ) - { - PRINT_ERROR("Problems building mesh based curves.\n"); - return stat; - } - } - chcurv_ptr->assign_geometric_curve((void *)curv_ptr); - } - } - return stat; -} - -//=============================================================================== -// Function : build_cholla_loop_geometry -// Member Type: PRIVATE -// Description: From the cholla curve list of a surface, create geometric loops -// Author : sjowen -// Date : 10/02 -//=============================================================================== -CubitStatus OCCModifyEngine::build_cholla_loop_geometry( - DLIList<ChollaCurve*> &cholla_curve_list, // curves on a surface - ChollaSurface *chsurf_ptr, // the surface - DLIList<LoopSM*> &loop_list, // append to this loop list - int &ncurves, // number of curves used - int debug_draw ) -{ - - // find the first unused curve on the list. Use that as the starting curve - // in the loop - - ncurves = 0; - CubitStatus stat = CUBIT_SUCCESS; - int ii, jj; - int found = 0; - ChollaCurve *chcurv_ptr = NULL; - for(ii=0; ii<cholla_curve_list.size() && !found; ii++) - { - chcurv_ptr = cholla_curve_list.get_and_step(); - if (chcurv_ptr->get_flag() == 0) - found = 1; - } - if (!found) - return CUBIT_FAILURE; // all the curves have already been used in this surface - - // get the orientation of this curve w.r.t. this surface - - CubitSense orientation; - stat = ChollaEngine::determine_curve_orientation( chsurf_ptr, - chcurv_ptr, orientation ); - if (orientation == CUBIT_UNKNOWN || stat == CUBIT_FAILURE) - return CUBIT_FAILURE; - - CubitPoint *start_ptr, *end_ptr; - chcurv_ptr->get_ends( start_ptr, end_ptr ); - - // create a new coedge - - CoEdgeSM *coedge_ptr = NULL; - Curve *curv_ptr = (Curve *)chcurv_ptr->get_geometric_curve(); - stat = make_facet_coedge( curv_ptr, orientation, coedge_ptr ); - if ( coedge_ptr == NULL || stat != CUBIT_SUCCESS ) - { - PRINT_ERROR("Problems building mesh based coedges.\n"); - return stat; - } - - if (debug_draw) - { - CubitVector s = start_ptr->coordinates(); - CubitVector e = end_ptr->coordinates(); - CubitSense sense = coedge_ptr->sense(); - if (sense == CUBIT_FORWARD) - GfxDebug::draw_line(s, e, CUBIT_GREEN); - else - GfxDebug::draw_line(s, e, CUBIT_RED); - - GfxDebug::draw_point(s, CUBIT_GREEN); - GfxDebug::draw_label(0, s.x(), s.y(), s.z(), CUBIT_GREEN); - - GfxDebug::draw_point(e, CUBIT_RED); - GfxDebug::draw_label(1, e.x(), e.y(), e.z(), CUBIT_RED); - - GfxDebug::flush(); - debug_draw=debug_draw; - } - - // start a list of coedges for this loop - - DLIList<CoEdgeSM*> coedge_list; - coedge_list.append( coedge_ptr ); - chcurv_ptr->set_flag(1); - ChollaCurve *last_chcurv_ptr = chcurv_ptr; - - // loop through and determine the rest of the coedges based on the - // orientation of the first curve in the loop - - chcurv_ptr->get_ends( start_ptr, end_ptr ); - FacetEntity *n0_ptr, *n1_ptr; - if (orientation == CUBIT_FORWARD) - { - n0_ptr = start_ptr; - n1_ptr = end_ptr; - } - else - { - n1_ptr = start_ptr; - n0_ptr = end_ptr; - } - - while (n0_ptr != n1_ptr) - { - - // find the next curve in the loop - - int ntimes = 0; - found = 0; - while(!found) - { - for ( jj = 0; jj < cholla_curve_list.size() && !found; jj++) - { - chcurv_ptr = cholla_curve_list.get_and_step(); - if (last_chcurv_ptr != chcurv_ptr && (chcurv_ptr->get_flag() == 0 || ntimes > 0)) - { - chcurv_ptr->get_ends( start_ptr, end_ptr ); - if (start_ptr == n1_ptr) - { - found = 1; - orientation = CUBIT_FORWARD; - n1_ptr = end_ptr; - } - else if (end_ptr == n1_ptr) - { - found = 1; - orientation = CUBIT_REVERSED; - n1_ptr = start_ptr; - } - } - } - if (!found) - { - - // in this special case - we have gone through the whole list without - // finding the next curve on the loop. In the first pass we have assumed - // that each curve is only used once. This may not be the case. Go - // back and see of we can find a curve that has already been used that - // will work. If we fail the second time through, then we fail! - - ntimes++; - if (ntimes > 1) - // return CUBIT_FAILURE; // didn't find the next curve in the loop - // DEBUG ONLY -- THIS NEEDS TO BE FIXED - goto create_loop; - } - } - - // create a new coedge - - coedge_ptr = NULL; - curv_ptr = (Curve *)chcurv_ptr->get_geometric_curve(); - stat = make_facet_coedge( curv_ptr, orientation,coedge_ptr ); - if ( coedge_ptr == NULL || stat != CUBIT_SUCCESS ) - { - PRINT_ERROR("Problems building mesh based coedges.\n"); - return stat; - } - - if (debug_draw) - { - CubitVector s = start_ptr->coordinates(); - CubitVector e = end_ptr->coordinates(); - CubitSense sense = coedge_ptr->sense(); - if (sense == CUBIT_FORWARD) - GfxDebug::draw_line(s, e, CUBIT_GREEN); - else - GfxDebug::draw_line(s, e, CUBIT_RED); - - GfxDebug::draw_point(s, CUBIT_GREEN); - GfxDebug::draw_label(0, s.x(), s.y(), s.z(), CUBIT_GREEN); - - GfxDebug::draw_point(e, CUBIT_RED); - GfxDebug::draw_label(1, e.x(), e.y(), e.z(), CUBIT_RED); - - GfxDebug::flush(); - debug_draw=debug_draw; - } - coedge_list.append( coedge_ptr ); - if (coedge_list.size() > 2*cholla_curve_list.size()) - return CUBIT_FAILURE; // more curves in the loop than their are curves ???? - chcurv_ptr->set_flag(1); - last_chcurv_ptr = chcurv_ptr; - } - - // create the loop - -create_loop: - LoopSM *loop_ptr = NULL; - stat = make_facet_loop( coedge_list, loop_ptr ); - if ( coedge_ptr == NULL || stat != CUBIT_SUCCESS ) - { - PRINT_ERROR("Problems building mesh based loops.\n"); - return stat; - } - loop_list.append( loop_ptr ); - ncurves = coedge_list.size(); - - return stat; -} - -//=============================================================================== -// Function : build_cholla_surface_geometry (PRIVATE) -// Member Type: PRIVATE -// Description: From the facet surface list, create geometric surface, -// loops and coedges for each surface in the list -// Author : sjowen -// Date : 10/02 -//=============================================================================== -CubitStatus OCCModifyEngine::build_cholla_surface_geometry( - const CubitEvaluatorData **eval_data, - DLIList<ChollaSurface*> &cholla_surface_list, - int interp_order, - double min_dot, - DLIList<Surface *> &surface_list) -{ - CubitStatus stat = CUBIT_SUCCESS; - int ii, isurface; - - // make sure the facet flags have been reset - - ChollaCurve *chcurv_ptr; - cholla_surface_list.reset(); - for ( isurface = 0; isurface < cholla_surface_list.size(); isurface++ ) - { - ChollaSurface *chsurf_ptr = cholla_surface_list.get_and_step(); - chsurf_ptr->reset_facet_flags(); - } - - // now loop through surfaces and create them - - int mydebug = 0; - cholla_surface_list.reset(); - for ( isurface = 0; isurface < cholla_surface_list.size(); isurface++ ) - { - const CubitEvaluatorData *surf_eval_data = eval_data == NULL ? NULL : eval_data[isurface]; - int num_curves = 0; - ChollaSurface *chsurf_ptr = cholla_surface_list.get_and_step(); - - DLIList<ChollaCurve*> chcurve_list; - chsurf_ptr->get_curves( chcurve_list ); - - // init flags for curves on this surface - - for (ii=0; ii< chcurve_list.size(); ii++) - { - chcurv_ptr = chcurve_list.get_and_step(); - chcurv_ptr->set_flag(0); - if (mydebug) - { - chcurv_ptr->debug_draw(); - } - } - - // generate loops - keep going until we have used all the curves in the list - - DLIList<LoopSM*> loop_list; - int debug_draw = 0; - while (num_curves < chcurve_list.size()) - { - int ncurves = 0; - stat = build_cholla_loop_geometry( chcurve_list, chsurf_ptr, - loop_list, ncurves, debug_draw ); - if (stat != CUBIT_SUCCESS) - { - PRINT_ERROR("Can't build geometric loop from facets\n"); - return stat; - } - num_curves += ncurves; - } - - // create the surface - - Surface *surf_ptr = (Surface *)chsurf_ptr->get_geometric_surface(); - if (surf_ptr == NULL) - { - DLIList<FacetEntity*> facet_entity_list; - DLIList<CubitPoint*> point_list; - chsurf_ptr->get_points(point_list); - chsurf_ptr->get_facets(facet_entity_list); - DLIList<CubitFacet*> facet_list; - CAST_LIST( facet_entity_list, facet_list, CubitFacet ); - FacetEvalTool *eval_tool_ptr = chsurf_ptr->get_eval_tool(); - if (eval_tool_ptr == NULL) - return CUBIT_FAILURE; - stat = make_facet_surface(surf_eval_data, facet_list,point_list,loop_list, - interp_order,min_dot,surf_ptr, CUBIT_TRUE, eval_tool_ptr); - if ( surf_ptr == NULL || stat != CUBIT_SUCCESS ) - { - PRINT_ERROR("Problems building mesh based surfaces.\n"); - return stat; - } - chsurf_ptr->assign_geometric_surface((void *)surf_ptr); - surface_list.append(surf_ptr); - } - } - return stat; -} - -//================================================================================ -// Description: improve the facets on a surface -// Author : Steve Owen -// Date : 8/28/2003 -//================================================================================ -CubitStatus OCCModifyEngine::improve_facets( RefFace *ref_face_ptr ) -{ - //CubitStatus rv = CUBIT_SUCCESS; - - // This must be a facet-based surface - return now if it isn't - - Surface *surf_ptr = ref_face_ptr->get_surface_ptr(); - OCCSurface *fsurf_ptr = dynamic_cast<OCCSurface *>(surf_ptr); - if (fsurf_ptr == NULL) - { - PRINT_ERROR("Couldn't improve facets on surface %d. It is not a facet-based geometry.\n", - ref_face_ptr->id()); - return CUBIT_FAILURE; - } - - CubitPoint *point_ptr; - DLIList<CubitPoint *> point_list; - DLIList<CubitFacet *> facet_list; - DLIList<CubitFacetEdge *> edge_list; - - // get the facets from the facet-based surface - - fsurf_ptr->get_my_facets(facet_list, point_list); - FacetDataUtil::get_edges(facet_list, edge_list); - - // compute normals if necessary - - int ii; - for (ii=0; ii<point_list.size(); ii++) - { - point_ptr = point_list.get_and_step(); - point_ptr->normal(); - } - - // main clean loop - - CubitFacet *facet0, *facet1; - CubitFacetData *cfacet0, *cfacet1; - CubitPoint *pt0, *pt1, *pt2, *pt3; - CubitFacetEdge *edge; - CubitFacetEdgeData *cedge; - int nflip = 0; - CubitVector n0, n1, n2, n3; - CubitVector c0, c1, c2, c3; - double q0, q1, q2, q3; - CubitVector nt0, nt1, nt2, nt3; - DLIList<CubitFacet *>adj_facets; - int nedges = edge_list.size(); - for(ii=0; ii<nedges; ii++) - { - edge = edge_list.get(); - - // can't be a feature (edge is on a curve) - if(edge->is_feature()) - { - edge_list.step(); - continue; - } - - pt0 = edge->point(0); - pt1 = edge->point(1); - adj_facets.clean_out(); - edge->facets( adj_facets ); - - // must be 2 adjacent facets. - if (adj_facets.size() != 2) - { - edge_list.step(); - continue; - } - facet0 = adj_facets.get_and_step(); - facet1 = adj_facets.get(); - - // get the adjacent vertices, make sure we are oriented correctly - // - swap pt0 and pt1 if necessary - pt2 = facet0->next_node(pt1); - if(pt2 == pt0) - { - pt2 = pt0; - pt0 = pt1; - pt1 = pt2; - pt2 = facet0->next_node(pt1); - } - pt3 = facet1->next_node(pt0); - - // get the normals from the vertices - n0 = pt0->normal( facet0 ); - n1 = pt1->normal( facet0 ); - n2 = pt2->normal( facet0 ); - n3 = pt3->normal( facet1 ); - c0 = pt0->coordinates(); - c1 = pt1->coordinates(); - c2 = pt2->coordinates(); - c3 = pt3->coordinates(); - - // compute triangle normals by averaging vertices - nt0 = n0 + n1 + n2; - nt0.normalize(); - nt1 = n0 + n1 + n3; - nt1.normalize(); - nt2 = n0 + n2 + n3; - nt2.normalize(); - nt3 = n1 + n2 + n3; - nt3.normalize(); - - // compute quality for each of the four tris... 2 existing tris - // and the two potential tris if we flip - q0 = FacetDataUtil::quality(c0, c1, c2, nt0); - q1 = FacetDataUtil::quality(c1, c0, c3, nt1); - q2 = FacetDataUtil::quality(c0, c3, c2, nt2); - q3 = FacetDataUtil::quality(c1, c2, c3, nt3); - q0 = CUBIT_MIN( q0, q1 ); - q2 = CUBIT_MIN( q2, q3 ); - if (q2 > q0) - { - // flip - - facet_list.remove( facet0 ); // these take too long - find another way to remove them - facet_list.remove( facet1 ); - edge_list.change_to(NULL); - - cfacet0 = dynamic_cast<CubitFacetData *>( facet0 ); - cfacet1 = dynamic_cast<CubitFacetData *>( facet1 ); - cedge = dynamic_cast<CubitFacetEdgeData *>( edge ); - - delete cfacet0; - delete cfacet1; - delete cedge; - - // get edges - - CubitFacetEdge *e[4]; - e[0] = pt2->get_edge( pt0 ); - e[1] = pt0->get_edge( pt3 ); - e[2] = pt3->get_edge( pt1 ); - e[3] = pt1->get_edge( pt2 ); - cedge = new CubitFacetEdgeData( pt2, pt3 ); - edge = dynamic_cast<CubitFacetEdge *>( cedge ); - - cfacet0 = new CubitFacetData( edge, e[0], e[1] ); - cfacet1 = new CubitFacetData( edge, e[2], e[3] ); - facet0 = dynamic_cast<CubitFacet *>( cfacet0 ); - facet1 = dynamic_cast<CubitFacet *>( cfacet1 ); - - edge_list.append( edge ); - facet_list.append( facet0 ); - facet_list.append( facet1 ); - - nflip++; - } - edge_list.step(); - } - edge_list.remove_all_with_value(NULL); - assert(edge_list.size() == nedges); - if (nflip > 0) - { - fsurf_ptr->get_eval_tool()->replace_facets(facet_list); - } - return CUBIT_SUCCESS; -} - - -//================================================================================ -// Description: smooth the facets on a surface -// Author : Steve Owen -// Date : 8/28/2003 -// Note: free_laplacian = TRUE will not project the node back to a tangent plane -// free_laplacian = FALSE will project to local tangent plane -//================================================================================ -CubitStatus OCCModifyEngine::smooth_facets( RefFace *ref_face_ptr, int niter, - CubitBoolean free_laplacian ) -{ - CubitStatus rv = CUBIT_SUCCESS; - - // This must be a facet-based surface - return now if it isn't - - Surface *surf_ptr = ref_face_ptr->get_surface_ptr(); - OCCSurface *fsurf_ptr = dynamic_cast<OCCSurface *>(surf_ptr); - if (fsurf_ptr == NULL) - { - PRINT_ERROR("Couldn't smooth facets on surface %d. It is not a facet-based geometry.\n", - ref_face_ptr->id()); - return CUBIT_FAILURE; - } - - CubitPoint *point_ptr; - DLIList<CubitPoint *>point_list; - - // get the points from the facet-basec surface - - fsurf_ptr->get_my_points(point_list); - - // compute normals if necessary - - int ii, jj; - for (ii=0; ii<point_list.size(); ii++) - { - point_ptr = point_list.get_and_step(); - point_ptr->normal(); - point_ptr->marked(0); - } - - // get the points on the facet curves associated with this surface - - DLIList<CubitPoint *>cpoint_list; - OCCCurve *fcurv_ptr; - Curve *curv_ptr; - - int idx; - DLIList<Curve *> curves; - fsurf_ptr->curves(curves); - OCCCurve **fcurve_array = new OCCCurve * [curves.size()]; - for (ii=0; ii<curves.size(); ii++) - { - idx = ii+1; - curv_ptr = curves.get_and_step(); - fcurv_ptr = dynamic_cast<OCCCurve *>(curv_ptr); - if (!fcurv_ptr) - { - PRINT_ERROR("Couldn't smooth facets on surface %d. At least one of it curves is not a facet-based geometry.\n", - ref_face_ptr->id()); - return CUBIT_FAILURE; - } - - // mark the points on the curve with the index of the curve in the array - // this will allow us to project the point back to the owning curve - - cpoint_list.clean_out(); - fcurv_ptr->get_points(cpoint_list); - for (jj=0; jj<cpoint_list.size(); jj++) - { - point_ptr = cpoint_list.get_and_step(); - point_ptr->marked( idx ); - } - fcurve_array[idx-1] = fcurv_ptr; - - // mark the vertices with a negative value so we don't touch them - - DLIList<Point *> verts; - fcurv_ptr->points(verts); - for(jj=0; jj<verts.size(); jj++) - { - Point *vert = verts.get_and_step(); - OCCPoint *fvert = dynamic_cast<OCCPoint *> (vert); - fvert->get_cubit_point()->marked(-1); - } - } - - // laplacian smoothing - - DLIList<CubitPoint *> adj_points; - int iter, nadj; - CubitPoint *adj_point_ptr; - CubitVector new_location; - - for (iter = 0; iter < niter; iter++) - { - for (ii=0; ii<point_list.size(); ii++) - { - point_ptr = point_list.get_and_step(); - - // don't smooth points at vertices - - if (point_ptr->marked() >= 0) - { - adj_points.clean_out(); - point_ptr->adjacent_points( adj_points ); - new_location.set(0.0, 0.0, 0.0); - nadj=0; - for (jj = 0; jj<adj_points.size(); jj++) - { - adj_point_ptr = adj_points.get_and_step(); - if (point_ptr->marked()) // is on a curve - { - // only use points on the same curve to influence the new location - if (point_ptr->marked() == adj_point_ptr->marked()) - { - new_location += adj_point_ptr->coordinates(); - nadj++; - } - } - - // interior nodes use all adjacent points - else - { - new_location += adj_point_ptr->coordinates(); - nadj++; - } - } - new_location /= nadj; - - // project it to a tangent plane defined at the point. - // except if we are on a curve or we're using free-laplacian option - if (!free_laplacian && point_ptr->marked() == 0) - new_location = point_ptr->project_to_tangent_plane( new_location ); - - // for points on a curve project to the curve definition - if(point_ptr->marked() != 0) - { - const CubitVector temp = new_location; - fcurve_array[point_ptr->marked()-1]->closest_point( temp, - new_location ); - } - - if (point_ptr->check_inverted_facets(new_location) == CUBIT_SUCCESS) - { - point_ptr->set(new_location); - } - } - } - - // update the normals - - for (ii=0; ii<point_list.size(); ii++) - { - point_ptr = point_list.get_and_step(); - point_ptr->compute_avg_normal(); - } - } - - return rv; -} - -//================================================================================ -// Description: create a shell that is the normal offset of the given shell -// Author : Steve Owen -// Date : 8/28/2003 -//================================================================================ -CubitStatus OCCModifyEngine::create_shell_offset( BodySM *bodysm_ptr, - BodySM *&new_bodysm, double offset ) -{ - // check that this is a facet body - - OCCBody *fbody_ptr = dynamic_cast<OCCBody *>(bodysm_ptr); - if (fbody_ptr == NULL) - { - PRINT_ERROR("Body is not a facet-based geometry. This command is intended for use with facetted models\n"); - return CUBIT_FAILURE; - } - - // The facet and point lists - - DLIList<CubitPoint *> point_list; - DLIList<CubitFacet *> facet_list; - - // get the surfaces. Check that they are also all facet bodies - - int ii; - Surface *surf_ptr; - OCCSurface *fsurf_ptr; - DLIList<Surface *> surface_list; - fbody_ptr->surfaces( surface_list ); - for (ii=0; ii<surface_list.size(); ii++) - { - surf_ptr = surface_list.get_and_step(); - fsurf_ptr = dynamic_cast<OCCSurface *>(surf_ptr); - if (fsurf_ptr == NULL) - { - PRINT_ERROR("At least one of the surfaces in Body is not facet-based geometry.\n" - "This command is intended for use with facetted models\n"); - return CUBIT_FAILURE; - } - fsurf_ptr->get_my_facets(facet_list, point_list); - } - - // create an array of points so we can reference them quickly when generating new facets - - CubitPoint **points = new CubitPoint * [point_list.size()]; - - // make a unique set of points - - int id = 0; - CubitPoint *point_ptr; - for (ii=0; ii < point_list.size(); ii++) - { - point_list.get_and_step()->marked(1); - } - for (ii=0; ii<point_list.size(); ii++) - { - point_ptr = point_list.get_and_step(); - if (point_ptr->marked() == 1) - { - point_ptr->marked(0); - points[id] = point_ptr; - point_ptr->set_id( id ); - id ++; - } - } - int npoints = id; - - // get the curves and mark any point on a curve as non-smoothable. - - int jj; - Curve *curv_ptr; - OCCCurve *fcurv_ptr; - DLIList<Curve *> curve_list; - fbody_ptr->curves( curve_list ); - for(ii=0; ii<curve_list.size(); ii++) - { - curv_ptr = curve_list.get_and_step(); - fcurv_ptr = dynamic_cast<OCCCurve *>(curv_ptr); - if (fcurv_ptr == NULL) - { - PRINT_ERROR("At least one of the curves in Body is not a facet-based geometry.\n" - "This command is intended for use with facetted models\n"); - return CUBIT_FAILURE; - } - point_list.clean_out(); - fcurv_ptr->get_points( point_list ); - for(jj=0; jj<point_list.size(); jj++) - { - point_ptr = point_list.get_and_step(); - point_ptr->marked(1); - } - } - - // smooth the normals to reduce chance of overlap on concave regions - - CubitVector new_normal, normal; - const int niter = 3; - int iter, nadj; - CubitPoint *adj_point_ptr; - DLIList<CubitPoint *> adj_points; - - for (iter = 0; iter < niter; iter++) - { - for (ii=0; ii<npoints; ii++) - { - point_ptr = points[ii]; - - // don't smooth points on curves - - if (point_ptr->marked() != 1) - { - adj_points.clean_out(); - point_ptr->adjacent_points( adj_points ); - new_normal.set(0.0, 0.0, 0.0); - nadj = adj_points.size(); - for (jj = 0; jj<nadj; jj++) - { - adj_point_ptr = adj_points.get_and_step(); - new_normal += adj_point_ptr->normal(); - } - new_normal.normalize(); - point_ptr->normal(new_normal); - } - } - } - - // generate a new set of points offset from the original - - CubitPointData *new_point; - CubitVector new_location; - CubitPoint **new_points = new CubitPoint * [npoints]; - for (ii=0; ii<npoints; ii++) - { - point_ptr = points[ii]; - new_location = point_ptr->coordinates() + point_ptr->normal() * offset; - new_point = new CubitPointData( new_location ); - new_point->set_id( ii ); - new_points[ii] = (CubitPoint *) new_point; - } - - // generate triangles for the new shell - - DLIList<CubitFacet *> fix_list; - DLIList<CubitFacet *> orig_list; - double dot; - double mindot = 1.0; - CubitFacet *facet_ptr, *new_facet_ptr; - DLIList<CubitFacet *> new_facet_list; - CubitPoint *p0, *p1, *p2; - CubitPoint *np0, *np1, *np2; - for(ii=0; ii<facet_list.size(); ii++) - { - facet_ptr = facet_list.get_and_step(); - facet_ptr->points( p0, p1, p2 ); - np0 = new_points[p0->id()]; - np1 = new_points[p1->id()]; - np2 = new_points[p2->id()]; - new_facet_ptr = (CubitFacet *) new CubitFacetData( np0, np1, np2 ); - new_facet_list.append( new_facet_ptr ); - - // compare normals to see if we inverted anything - - normal = facet_ptr->normal(); - new_normal = new_facet_ptr->normal(); - dot = normal % new_normal; - if (dot < mindot) mindot = dot; - if (dot < 0.707) - { - new_facet_ptr->marked(1); - fix_list.append( new_facet_ptr ); - orig_list.append( facet_ptr ); - } - } - - // go back and try to uninvert tris if needed - - int kk; - DLIList<CubitFacet *> problem_list; - if (fix_list.size() > 0) - { - CubitVector new_location; - for (iter = 0; iter < niter; iter++) - { - for (ii=0; ii<fix_list.size(); ii++) - { - facet_ptr = fix_list.get_and_step(); - point_list.clean_out(); - facet_ptr->points( point_list ); - for (jj=0; jj<point_list.size(); jj++) - { - point_ptr = point_list.get_and_step(); - - // don't smooth marked points - - if (point_ptr->marked() != 1) - { - adj_points.clean_out(); - point_ptr->adjacent_points( adj_points ); - new_location.set(0.0, 0.0, 0.0); - nadj = adj_points.size(); - for (kk = 0; kk<nadj; kk++) - { - adj_point_ptr = adj_points.get_and_step(); - new_location += adj_point_ptr->coordinates(); - } - new_location /= nadj; - point_ptr->set(new_location); - } - } - } - } - - // see if it worked - - fix_list.reset(); - orig_list.reset(); - for(ii=0; ii<fix_list.size(); ii++) - { - new_facet_ptr = fix_list.get_and_step(); - facet_ptr = orig_list.get_and_step(); - new_facet_ptr->update_plane(); - new_normal = new_facet_ptr->normal(); - normal = facet_ptr->normal(); - dot = normal % new_normal; - if (dot < 0.707) - { - problem_list.append( new_facet_ptr ); - } - } - } - - // set the normals back the way they were and clean up - - for (ii=0; ii<npoints; ii++) - { - point_ptr = points[ii]; - point_ptr->compute_avg_normal(); - } - delete [] points; - delete [] new_points; - - // build the geometry - - const char *file_name = NULL; - CubitBoolean use_feature_angle = CUBIT_TRUE; - double feature_angle = 0.0; - int interp_order = 0; - CubitBoolean smooth_non_manifold = CUBIT_TRUE; - CubitBoolean split_surfaces = CUBIT_FALSE; - CubitBoolean stitch = CUBIT_FALSE; - CubitBoolean improve = CUBIT_FALSE; - DLIList<CubitQuadFacet *> quad_facet_list; - DLIList<Surface *> new_surface_list; - FacetFileFormat file_format = FROM_FACET_LIST; - - CubitStatus rv = - OCCQueryEngine::instance()->import_facets( file_name, use_feature_angle, feature_angle, 0.0, - interp_order, smooth_non_manifold, - split_surfaces, stitch, improve, quad_facet_list, - new_facet_list, new_surface_list, file_format ); - - if(problem_list.size() > 0) - { - PRINT_WARNING("Offset process on facet body, may have resulted in %d overalapping facets.\n" - "Check results carefully. Problem facet(s) are displayed in red.)\n", - problem_list.size()); - for (ii=0; ii<problem_list.size(); ii++) - { - facet_ptr = problem_list.get_and_step(); - GfxDebug::draw_facet(facet_ptr, CUBIT_RED); - } - GfxDebug::flush(); - } - - if( new_surface_list.size() ) - { - new_bodysm = new_surface_list.get()->bodysm(); - if( !new_bodysm ) - { - PRINT_ERROR("Problem offsetting Body\n"); - return CUBIT_FAILURE; - } - } - else - { - PRINT_ERROR("Problem offsetting Body\n"); - return CUBIT_FAILURE; - } - return rv; -} - CubitStatus OCCModifyEngine::webcut_with_sweep_surfaces( DLIList<BodySM*> &blank_bodies, DLIList<Surface*> &surfaces, @@ -4638,7 +1656,9 @@ } CubitStatus OCCModifyEngine::tolerant_imprint( DLIList<BodySM*> &bodies_in, - DLIList<BodySM*> &new_bodies ) const + DLIList<BodySM*> &new_bodies, + DLIList<TopologyBridge*>*, + DLIList<TopologyBridge*>* ) const { PRINT_ERROR("Option not supported for mesh based geometry.\n"); return CUBIT_FAILURE; Modified: cgm/trunk/geom/OCC/OCCModifyEngine.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCModifyEngine.hpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCModifyEngine.hpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -137,9 +137,14 @@ virtual BodySM* copy_body ( BodySM* bodyPtr) const ; + virtual CubitStatus stitch_surfs( + DLIList<BodySM*>& surf_bodies, + BodySM*& stitched_body)const; + virtual CubitStatus subtract(DLIList<BodySM*> &tool_body_list, DLIList<BodySM*> &from_bodies, DLIList<BodySM*> &new_bodies, + bool imprint = false, bool keep_old = false) const; virtual CubitStatus imprint(BodySM* BodyPtr1, BodySM* BodyPtr2, @@ -148,7 +153,9 @@ virtual CubitStatus imprint(DLIList<BodySM*> &from_body_list, DLIList<BodySM*> &new_from_body_list, - bool keep_old) const; + bool keep_old, + DLIList<TopologyBridge*> *new_tbs = NULL, + DLIList<TopologyBridge*> *att_tbs = NULL) const; virtual CubitStatus imprint( DLIList<BodySM*> &body_list, DLIList<Curve*> &ref_edge_list, @@ -169,7 +176,9 @@ virtual CubitStatus imprint( DLIList<BodySM*> &body_list, DLIList<CubitVector*> &vector_list, DLIList<BodySM*>& new_body_list, - bool keep_old_body ) const; + bool keep_old_body, + DLIList<TopologyBridge*> *new_tbs = NULL, + DLIList<TopologyBridge*> *att_tbs = NULL ) const; virtual CubitStatus imprint_projected_edges( DLIList<Surface*> &ref_face_list, DLIList<Curve*> &ref_edge_list, @@ -219,7 +228,9 @@ double draft_angle, int draft_type, bool switchside, - bool rigid) const; + bool rigid, + Surface *stop_surf = NULL, + BodySM *stop_body = NULL) const; virtual CubitStatus sweep_perpendicular( DLIList<GeometryEntity*>& ref_ent_list, @@ -228,7 +239,9 @@ double draft_angle, int draft_type, bool switchside, - bool rigid) const; + bool rigid, + Surface* stop_surf = NULL, + BodySM *stop_body = NULL) const; virtual CubitStatus sweep_rotational( DLIList<GeometryEntity*>& ref_ent_list, @@ -241,7 +254,9 @@ int draft_type = 0, bool switchside = CUBIT_FALSE, bool make_solid = CUBIT_FALSE, - bool rigid = CUBIT_FALSE ) const; + bool rigid = CUBIT_FALSE, + Surface *stop_surf = NULL, + BodySM *stop_body = NULL ) const; virtual CubitStatus sweep_along_curve( DLIList<GeometryEntity*>& ref_ent_list, @@ -249,7 +264,9 @@ DLIList<Curve*>& ref_edge_list, double draft_angle = 0.0, int draft_type = 0, - bool rigid = CUBIT_FALSE ) const; + bool rigid = CUBIT_FALSE, + Surface *stop_surf = NULL, + BodySM *stop_body = NULL ) const; virtual CubitStatus webcut_with_sweep_surfaces( @@ -389,8 +406,8 @@ const CubitVector& keep_vector, bool keep_old = false ); - virtual CubitStatus create_body_from_surfs(DLIList<Surface*> &ref_face_list, - BodySM *&new_body, + virtual CubitStatus create_solid_bodies_from_surfs(DLIList<Surface*> &ref_face_list, + DLIList<BodySM*> &new_bodies, bool keep_old = false, bool heal = false) const; @@ -447,6 +464,20 @@ BodySM *body_to_trim_to, BodySM *&midplane_body ) const; + virtual CubitStatus get_spheric_mid_surface( Surface *surface_ptr1, + Surface *surface_ptr2, + BodySM *body_to_trim_to, + BodySM *&midsurface_body ) const; + + virtual CubitStatus get_conic_mid_surface( Surface *surface_ptr1, + Surface *surface_ptr2, + BodySM *body_to_trim_to, + BodySM *&midsurface_body ) const; + + virtual CubitStatus get_toric_mid_surface( Surface *surface_ptr1, + Surface *surface_ptr2, + BodySM *body_to_trim_to, + BodySM *&midsurface_body ) const; virtual CubitStatus tweak_chamfer( DLIList<Curve*> &curve_list, double left_offset, DLIList<BodySM*> &new_bodysm_list, @@ -504,21 +535,24 @@ virtual CubitStatus tweak_move( DLIList<Surface*> &surface_list, const CubitVector &delta, DLIList<BodySM*> &new_bodysm_list, - CubitBoolean keep_old_body = CUBIT_FALSE ) const; + CubitBoolean keep_old_body = CUBIT_FALSE, + CubitBoolean preview = CUBIT_FALSE ) const; /**< Tweak specified faces of a volume or volumes along a vector. */ virtual CubitStatus tweak_move( DLIList<Curve*> &curve_list, const CubitVector &delta, DLIList<BodySM*> &new_bodysm_list, - CubitBoolean keep_old_body = CUBIT_FALSE ) const; + CubitBoolean keep_old_body = CUBIT_FALSE, + CubitBoolean preview = CUBIT_FALSE ) const; /**< Tweak specified curves of a sheet body along a vector. */ virtual CubitStatus tweak_offset( DLIList<Surface*> &surface_list, double offset_distance, DLIList<BodySM*> &new_bodysm_list, - CubitBoolean keep_old_body = CUBIT_FALSE ) const; + CubitBoolean keep_old_body = CUBIT_FALSE, + CubitBoolean preview = CUBIT_FALSE ) const; /**< Tweak specified faces of a volume or volumes by offsetting those faces * by the offset distance. */ @@ -526,7 +560,8 @@ virtual CubitStatus tweak_offset( DLIList<Curve*> &curve_list, double offset_distance, DLIList<BodySM*> &new_bodysm_list, - CubitBoolean keep_old_body = CUBIT_FALSE ) const; + CubitBoolean keep_old_body = CUBIT_FALSE, + CubitBoolean preview = CUBIT_FALSE ) const; /**< Tweak specified curves of a sheet body or bodies by offsetting those * curves by the offset distance. */ @@ -535,45 +570,54 @@ DLIList<BodySM*> &new_bodysm_list, CubitBoolean extend_adjoining = CUBIT_TRUE, CubitBoolean keep_surface = CUBIT_FALSE, - CubitBoolean keep_old_body = CUBIT_FALSE ) const; + CubitBoolean keep_old_body = CUBIT_FALSE, + CubitBoolean preview = CUBIT_FALSE ) const; /**< Remove surfaces from a body or bodies and then extend the adjoining * surfaces to fill the gap or remove the hole. */ virtual CubitStatus tweak_remove( DLIList<Curve*> &curve_list, DLIList<BodySM*> &new_bodysm_list, - CubitBoolean keep_old_body = CUBIT_FALSE ) const; + CubitBoolean keep_old_body = CUBIT_FALSE, + CubitBoolean preview = CUBIT_FALSE ) const; /**< Remove curves from a sheet body or bodies and then extend the remaining * curves to fill the gap. If an internal loop of curves is removed the * hole is removed. */ virtual CubitStatus tweak_target( DLIList<Surface*> &surface_list, - Surface *target_surf_ptr, + DLIList<Surface*> &target_surfs, DLIList<BodySM*> &new_bodysm_list, CubitBoolean reverse_flg = CUBIT_FALSE, - CubitBoolean keep_old_body = CUBIT_FALSE ) const; + CubitBoolean keep_old_body = CUBIT_FALSE, + CubitBoolean preview = CUBIT_FALSE ) const; /**< Tweak specified faces of a volume or volumes up to a target surface. */ virtual CubitStatus tweak_target( DLIList<Curve*> &curve_list, - Surface *target_surf_ptr, + DLIList<Surface*> &target_surfs, DLIList<BodySM*> &new_bodysm_list, - CubitBoolean keep_old_body = CUBIT_FALSE ) const; + CubitBoolean /*reverse_flg*/, + CubitBoolean keep_old_body = CUBIT_FALSE, + CubitBoolean preview = CUBIT_FALSE ) const; /**< Tweak specified edges of a surface or set of surfaces (in sheet * bodies) up to a target surface. This essentially extends or * trims the attached surfaces of the sheet body. */ virtual CubitStatus tweak_target( DLIList<Curve*> &curve_list, - Curve *target_curve_ptr, + DLIList<Curve*> &target_curves, DLIList<BodySM*> &new_bodysm_list, - CubitBoolean keep_old_body = CUBIT_FALSE ) const; + CubitBoolean reverse_flg = CUBIT_FALSE, + CubitBoolean keep_old_body = CUBIT_FALSE, + CubitBoolean preview = CUBIT_FALSE ) const; /**< Tweak specified edges of a sheet body or bodies up to a target curve * that is part of a sheet body. The target is a surface created by * thickening the owning surface of the target curve. */ + virtual CubitStatus remove_curve_slivers( BodySM *body, double lengthlimit ) const; + virtual CubitStatus create_net_surface( DLIList<Surface*>& ref_face_list, BodySM *& new_body, DLIList<DLIList<CubitVector*>*> &vec_lists_u, DLIList<DLIList<CubitVector*>*> &vec_lists_v, @@ -618,211 +662,15 @@ Surface *ref_face1, double leg1, Surface *ref_face2, double leg2, BodySM *&new_body ) const; - //-------------------------------------------------------------- - //- Methods for building specific facet-based geometry entities - //-------------------------------------------------------------- - CubitStatus make_facet_point( CubitPoint *thePoint, - Point *&new_point_ptr ); - CubitStatus make_facet_point( CubitVector &location, - Point *&new_point_ptr ); - //- create a new facet point - - CubitStatus make_facet_curve( Point *start_ptr, - Point *end_ptr, - Curve *&new_curve_ptr, - CurveFacetEvalTool *eval_tool_ptr = NULL); - CubitStatus make_facet_curve( Point *start_ptr, - Point *end_ptr, - DLIList<CubitFacetEdge*> &edge_list, - DLIList<CubitPoint*> &point_list, - Curve *&new_curve_ptr, - CurveFacetEvalTool *eval_tool_ptr = NULL); - //- create a new facet curve - - CubitStatus make_facet_coedge( Curve *curv_ptr, - CubitSense sense, - CoEdgeSM *&new_coedge_ptr ); - //- create a new facet coedge - - CubitStatus make_facet_loop( DLIList<CoEdgeSM*> &coedge_list, - LoopSM *&new_loop_ptr ); - //- create a new facet loop - - CubitStatus make_facet_surface(const CubitEvaluatorData *eval_data, - DLIList<CubitFacet*> &facet_list, - DLIList<CubitPoint*> &point_list, - DLIList<LoopSM*> &my_loops, - int interp_order, - double min_dot, - Surface *&new_surface_ptr, - CubitBoolean use_point_addresses = CUBIT_TRUE, - FacetEvalTool *eval_tool_ptr = NULL); - //-creates a new OCCSurface given the points and facet list. - - CubitStatus make_facet_surface(DLIList<CubitQuadFacet*> &facet_list, - DLIList<CubitPoint*> &point_list, - DLIList<LoopSM*> &my_loops, - int interp_order, - double min_dot, - Surface *&new_surface_ptr); - //-creates a new OCCSurface given the points and quad facet list. - - CubitStatus make_facet_shell(DLIList<Surface*> &surface_list, - ShellSM *&new_shell_ptr); - //-creates a new shell, given the list of surfaces. - - CubitStatus make_facet_lump(DLIList<ShellSM*> &shell_list, - Lump*& new_lump_ptr); - //-creates a new lump, given the list of shells. - - CubitStatus make_facet_body(DLIList<Lump*> &lump_list, - BodySM *&new_body_ptr); - //-creates a new body, given the list of lump. - - CubitStatus build_facet_surface( const CubitEvaluatorData **eval_data, - DLIList<CubitFacet *> &facet_list, - DLIList<CubitPoint *> &point_list, - double feature_angle, - int interp_order, - CubitBoolean smooth_non_manifold, - CubitBoolean split_surfaces, - DLIList<Surface *> &surface_list); - CubitStatus build_facet_surface( DLIList<CubitQuadFacet *> &qfacet_list, - DLIList<CubitFacet *> &tfacet_list, - DLIList<CubitPoint *> &point_list, - double feature_angle, - int interp_order, - CubitBoolean smooth_non_manifold, - CubitBoolean split_surfaces, - DLIList<Surface *> &surface_list); - CubitStatus build_facet_surface( DLIList<CubitQuadFacet *> &facet_list, - DLIList<CubitPoint *> &point_list, - double feature_angle, - int interp_order, - CubitBoolean smooth_non_manifold, - CubitBoolean split_surfaces, - DLIList<Surface *> &surface_list); - //- creates one or more new OCCSurfaces with all of its lower - //- order entities. Use an optional feature_angle to break - //- surface - - CubitStatus smooth_facets( RefFace *ref_face_ptr, int niter, CubitBoolean free_laplacian ); - //- attempt to clean up facets by smoothing the points on the surface - CubitStatus create_shell_offset( BodySM *bodysm_ptr, BodySM *&new_bodysm, double offset ); - // create a shell offset from body - CubitStatus improve_facets( RefFace *ref_face_ptr ); - // improve the facets by local swaps - - CubitStatus build_cholla_surfaces( DLIList<CubitFacet *> facet_list, - DLIList<CubitPoint *> point_list, - double feature_angle, - int interp_order, - CubitBoolean smooth_non_manifold, - CubitBoolean split_surfaces, - ChollaEngine *&cholla_ptr ); - -/* virtual CubitStatus finish_facet_Body( - GeometryType surface_type, - const CubitEvaluatorData *eval_data, - DLIList <CubitFacet *>facet_list, - DLIList <CubitPoint *>point_list, - double feature_angle, - int interp_order, - CubitBoolean smooth_non_manifold, - CubitBoolean split_surfaces, - BodySM *&body_ptr) const; -*/ - virtual CubitStatus finish_facet_Body( ChollaEngine *&cholla_ptr, - const CubitEvaluatorData **eval_data, - double feature_angle, - int interp_order, - BodySM *&bodysm_ptr) const; - - void set_sphere_eval_data( ChollaEngine *cholla_ptr, - double radius, - CubitEvaluatorData **&eval_data ) const; - - void set_cylinder_eval_data( ChollaEngine *cholla_ptr, - double height, - double base_radius_xdir, - double base_radius_ydir, - double top_radius, - CubitEvaluatorData **&eval_data ) const; - - // non-virtual specific functions for building facet-based geometry - // from Cholla geometry - - CubitStatus build_cholla_geometry( - const CubitEvaluatorData **eval_data, - DLIList<ChollaSurface*> &cholla_surface_list, - DLIList<ChollaCurve*> &cholla_curve_list, - DLIList<ChollaPoint*> &cholla_point_list, - CubitBoolean use_feature_angle, - double feature_angle, - int interp_order, - DLIList<Surface *> &surface_list); - // build the CUBIT geometry based on the Cholla entity class lists - - CubitStatus build_cholla_point_geometry( - DLIList<ChollaPoint*> &cholla_point_list ); - // From the cholla point list, create geometric points for each - - CubitStatus build_cholla_curve_geometry( - DLIList<ChollaCurve*> &cholla_curve_list ); - // From the cholla curve list, create geometric curves for each - - CubitStatus build_cholla_surface_geometry( - const CubitEvaluatorData **eval_data, - DLIList<ChollaSurface*> &cholla_surface_list, - int interp_order, - double min_dot, - DLIList<Surface *> &surface_list); - // From the facet surface list, create geometric surface, - // loops and coedges for each surface in the list - CubitStatus tolerant_imprint( DLIList<BodySM*> &bodies_in, - DLIList<BodySM*> &new_bodies ) const; + DLIList<BodySM*> &new_bodies, + DLIList<TopologyBridge*>*, + DLIList<TopologyBridge*>* ) const; protected: private: - CubitStatus build_cholla_loop_geometry( - DLIList<ChollaCurve*> &cholla_curve_list, - ChollaSurface *chsurf_ptr, - DLIList<LoopSM*> &loop_list, - int &ncurves, - int debug_draw = 0 ); - // From the cholla curve list of a surface, create geometric loops - - void fillinedge( - int *edge, - int numpointsonanedge, - double radius, -#ifdef CANT_USE_STD - vector<CubitPoint *>& points) const; -#else - std::vector<CubitPoint *>& points) const; -#endif - //! Put points on this edge of a triangle being refined. - - void refinetriangle( - int level, - int numpointsonanedge, - int *iedge1, - int *iedge2, - int *iedge3, - int isign1, - int isign2, - int isign3, - double radius, -#ifdef CANT_USE_STD - vector<CubitPoint *>& points, -#else - std::vector<CubitPoint *>& points, -#endif - DLIList<CubitFacet *>& facet_list) const; - //! add internal points and make connections for this triangle } ; #endif Modified: cgm/trunk/geom/OCC/OCCParamTool.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCParamTool.cpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCParamTool.cpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -6,6 +6,7 @@ // //=================================================================================== +#include "config.h" #include "OCCParamTool.hpp" #include "CastTo.hpp" @@ -203,7 +204,7 @@ double compare_tol; // find best compare_tol - fetool = CAST_TO(refSurf, OCCSurface)->get_eval_tool(); + //fetool = CAST_TO(refSurf, OCCSurface)->get_eval_tool(); compare_tol = 1e-3*(fetool->bounding_box().diagonal().length()); // locate point @@ -333,8 +334,8 @@ CubitStatus rv = CUBIT_SUCCESS; DLIList<CubitFacet *> facet_list; - int tool_id = surf->get_eval_tool()->tool_id(); - surf->get_eval_tool()->get_facets(facet_list); + int tool_id /*= surf->get_eval_tool()->tool_id()*/; + //surf->get_eval_tool()->get_facets(facet_list); tri_ptr = facet_list.get(); // loop until we find something @@ -397,7 +398,7 @@ CubitStatus rv = CUBIT_SUCCESS; DLIList<CubitFacet *> facet_list; - surf->get_eval_tool()->get_facets(facet_list); + //surf->get_eval_tool()->get_facets(facet_list); // loop until we find something Modified: cgm/trunk/geom/OCC/OCCPoint.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCPoint.cpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCPoint.cpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -17,27 +17,13 @@ // ********** END STANDARD INCLUDES ********** // ********** BEGIN CUBIT INCLUDES ********** -#include "CubitMessage.hpp" +#include "config.h" #include "OCCPoint.hpp" -#include "OCCAttrib.hpp" -#include "CubitPoint.hpp" -#include "CubitPointData.hpp" -#include "RefVertex.hpp" #include "OCCQueryEngine.hpp" #include "CastTo.hpp" -#include "Curve.hpp" +#include "BRep_Tool.hxx" -#include "OCCBody.hpp" -#include "OCCLump.hpp" -#include "OCCShell.hpp" -#include "OCCSurface.hpp" -#include "OCCLoop.hpp" -#include "OCCCoEdge.hpp" -#include "OCCCurve.hpp" - -#include <BRep_Tool.hxx> - // ********** END CUBIT INCLUDES ********** // ********** BEGIN STATIC DECLARATIONS ********** @@ -46,103 +32,30 @@ // ********** BEGIN PUBLIC FUNCTIONS ********** //------------------------------------------------------------------------- -// Purpose : The constructor with a pointer to the associated VERTEX . -// +// Purpose : The constructor with a pointer to the location +// // Special Notes : // -// Creator : Steve Owen +// Creator : Jane Hu // -// Creation Date : 07/16/00 +// Creation Date : 10/08/07 //------------------------------------------------------------------------- -OCCPoint::OCCPoint( CubitVector &location, DLIList<Curve*> &curves ) +OCCPoint::OCCPoint( CubitVector &location ) { - assert(0); - myPoint = (CubitPoint *) new CubitPointData( location ); - myCurves += curves; - iCreated = CUBIT_TRUE; + myPoint = gp_Pnt( location.x(), location.y(), location.z()); } //------------------------------------------------------------------------- -// Purpose : The constructor with a pointer to the associated CubitPoint . -// -// Special Notes : -// -// Creator : Steve Owen -// -// Creation Date : 12/28/00 -//------------------------------------------------------------------------- -OCCPoint::OCCPoint( CubitPoint *thePoint, DLIList<Curve*> &curves ) -{ - assert(0); - myPoint = thePoint; - myCurves += curves; - iCreated = CUBIT_FALSE; -} - -//------------------------------------------------------------------------- -// Purpose : The constructor with a pointer to the associated CubitPoint . -// -// Special Notes : Was make especially for save/restore -// -// Creator : Corey Ernst -// -// Creation Date : 02/03/03 -//------------------------------------------------------------------------- -OCCPoint::OCCPoint( CubitPoint *thePoint ) -{ - assert(0); - myPoint = thePoint; - iCreated = CUBIT_FALSE; -} - -//------------------------------------------------------------------------- -// Purpose : The constructor with a pointer to the associated TopoDS_Vertex . -// -// Special Notes : -// -// Creator : Steve Owen -// -// Creation Date : 12/28/00 -//------------------------------------------------------------------------- -OCCPoint::OCCPoint( TopoDS_Vertex *thePoint, DLIList<Curve*> &curves ) -{ - assert(0); - myTopoDSVertex = thePoint; - myCurves += curves; - iCreated = CUBIT_FALSE; -} - -//------------------------------------------------------------------------- -// Purpose : The constructor with a pointer to the associated TopoDS_Vertex . -// -// Special Notes : Was make especially for save/restore -// -// Creator : Corey Ernst -// -// Creation Date : 02/03/03 -//------------------------------------------------------------------------- -OCCPoint::OCCPoint( TopoDS_Vertex *thePoint ) -{ - myTopoDSVertex = thePoint; - iCreated = CUBIT_FALSE; -} - -//------------------------------------------------------------------------- // Purpose : The destructor. // // Special Notes : // -// Creator : Steve Owen +// Creator : Jane Hu // -// Creation Date : 07/16/00 +// Creation Date : 10/08/07 //------------------------------------------------------------------------- OCCPoint::~OCCPoint() { - if (iCreated && myPoint != NULL) - { - delete myPoint; - } - myPoint = NULL; } //------------------------------------------------------------------------- @@ -158,7 +71,7 @@ // Creation Date : 07/16/00 //------------------------------------------------------------------------- void OCCPoint::append_simple_attribute_virt(CubitSimpleAttrib *csa) - { attribSet.append_attribute(csa); } + { /*attribSet.append_attribute(csa); */} //------------------------------------------------------------------------- // Purpose : The purpose of this function is to remove a simple @@ -172,7 +85,7 @@ // Creation Date : 07/16/00 //------------------------------------------------------------------------- void OCCPoint::remove_simple_attribute_virt(CubitSimpleAttrib *csa) - { attribSet.remove_attribute(csa); } + { /*attribSet.remove_attribute(csa);*/ } //------------------------------------------------------------------------- // Purpose : The purpose of this function is to remove all simple @@ -187,7 +100,7 @@ // Creation Date : 07/16/00 //------------------------------------------------------------------------- void OCCPoint::remove_all_simple_attribute_virt() - { attribSet.remove_all_attributes(); } + { /*attribSet.remove_all_attributes();*/ } //------------------------------------------------------------------------- // Purpose : The purpose of this function is to get the @@ -202,34 +115,75 @@ //------------------------------------------------------------------------- CubitStatus OCCPoint::get_simple_attribute(DLIList<CubitSimpleAttrib*>& csa_list) - { return attribSet.get_attributes(csa_list); } + { /*return attribSet.get_attributes(csa_list);*/ + return CUBIT_SUCCESS; + } + CubitStatus OCCPoint::get_simple_attribute(const CubitString& name, DLIList<CubitSimpleAttrib*>& csa_list ) - { return attribSet.get_attributes( name, csa_list ); } + { /*return attribSet.get_attributes( name, csa_list );*/ + return CUBIT_SUCCESS; + } CubitStatus OCCPoint::save_attribs( FILE *file_ptr ) - { return attribSet.save_attributes(file_ptr); } + { //return attribSet.save_attributes(file_ptr); + return CUBIT_SUCCESS; + } CubitStatus OCCPoint::restore_attribs( FILE *file_ptr, unsigned int endian ) - { return attribSet.restore_attributes(file_ptr, endian); } + { //return attribSet.restore_attributes(file_ptr, endian); + return CUBIT_SUCCESS; + } +gp_Pnt OCCPoint::get_gp()const +{ + return myPoint; +} + +void OCCPoint::set_gp(const gp_Pnt gp_point) +{ + myPoint = gp_point; +} //------------------------------------------------------------------------- // Purpose : Returns the coordinates of this Point. // // Special Notes : // -// Creator : Steve Owen +// Creator : Jane Hu // -// Creation Date : 07/16/00 +// Creation Date : 10/08/07 //------------------------------------------------------------------------- CubitVector OCCPoint::coordinates() const { - gp_Pnt Point = BRep_Tool::Pnt(*myTopoDSVertex); - CubitVector p(Point.X(), Point.Y(), Point.Z()); + CubitVector p(myPoint.X(), myPoint.Y(), myPoint.Z()); return p; } +void OCCPoint::set_coord(CubitVector &location ) +{ + myPoint.SetCoord(location.x(), location.y(), location.z()); +} + +void OCCPoint::set_coord(double x, double y, double z) +{ + myPoint.SetCoord(x, y, z); +} + +CubitBoolean OCCPoint::is_equal(const OCCPoint & other, double Tol) +{ + return myPoint.IsEqual(other.get_gp(), Tol); +} + +double OCCPoint::distance(const OCCPoint & other) +{ + return myPoint.Distance(other.get_gp()); +} + +double OCCPoint::SquareDistance (const OCCPoint & other) +{ + return myPoint.SquareDistance(other.get_gp()); +} //------------------------------------------------------------------------- // Purpose : Get geometry modeling engine: AcisGeometryEngine // @@ -261,185 +215,11 @@ } -/* -void OCCPoint::bodysms(DLIList<BodySM*> &bodies) -{ - int ii; - for ( ii = myCurves.size(); ii > 0; ii-- ) - { - myCurves.get_and_step()->bodysms(bodies); - } -} - -void OCCPoint::lumps(DLIList<Lump*> &lumps) -{ - int ii; - for ( ii = myCurves.size(); ii > 0; ii-- ) - { - myCurves.get_and_step()->lumps(lumps); - } -} - -void OCCPoint::shellsms(DLIList<ShellSM*> &shellsms) -{ - int ii; - for ( ii = myCurves.size(); ii > 0; ii-- ) - { - myCurves.get_and_step()->shellsms(shellsms); - } -} - -void OCCPoint::surfaces(DLIList<Surface*> &surfaces) -{ - int ii; - for ( ii = myCurves.size(); ii > 0; ii-- ) - { - myCurves.get_and_step()->surfaces(surfaces); - } -} - -void OCCPoint::loopsms(DLIList<LoopSM*> &loopsms) -{ - int ii; - for ( ii = myCurves.size(); ii > 0; ii-- ) - { - myCurves.get_and_step()->loopsms(loopsms); - } -} - -void OCCPoint::coedgesms(DLIList<CoEdgeSM*> &coedgesms) -{ - int ii; - for ( ii = myCurves.size(); ii > 0; ii-- ) - { - myCurves.get_and_step()->coedgesms(coedgesms); - } -} - - -void OCCPoint::curves(DLIList<Curve*> &curves) -{ - int ii; - for ( ii = myCurves.size(); ii > 0; ii-- ) - { - curves.append_unique( myCurves.get_and_step() ); - } -} - -void OCCPoint::points(DLIList<Point*> &points) -{ - points.append_unique( this ); -} -*/ - - void OCCPoint::get_parents_virt( DLIList<TopologyBridge*>& parents ) - { CAST_LIST_TO_PARENT( myCurves, parents ); } + { } void OCCPoint::get_children_virt( DLIList<TopologyBridge*>& ) { } - -void OCCPoint::get_lumps( DLIList<OCCLump*>& result_list ) -{ - DLIList<OCCShell*> shell_list; - get_shells( shell_list ); - shell_list.reset(); - for ( int i = shell_list.size(); i--; ) - { - OCCShell* shell = shell_list.get_and_step(); - shell->get_lumps( result_list ); - OCCLump* lump = dynamic_cast<OCCLump*>(shell->get_lump()); - if (lump) - result_list.append_unique(lump); - } -} - -void OCCPoint::get_shells( DLIList<OCCShell*>& result_list ) -{ - DLIList<OCCSurface*> surface_list; - DLIList<OCCShell*> temp_list; - get_surfaces( surface_list ); - surface_list.reset(); - for ( int i = surface_list.size(); i--; ) - { - OCCSurface* surface = surface_list.get_and_step(); - temp_list.clean_out(); - surface->get_shells( temp_list ); - result_list.merge_unique( temp_list ); - } -} - -void OCCPoint::get_surfaces( DLIList<OCCSurface*>& result_list ) -{ - DLIList<OCCLoop*> loop_list; - get_loops( loop_list ); - loop_list.reset(); - for ( int i = loop_list.size(); i--; ) - { - OCCLoop* loop = loop_list.get_and_step(); - OCCSurface* surface = dynamic_cast<OCCSurface*>(loop->get_surface()); - if (surface) - result_list.append_unique(surface); - } -} - -void OCCPoint::get_loops( DLIList<OCCLoop*>& result_list ) -{ - DLIList<OCCCoEdge*> coedge_list; - get_coedges( coedge_list ); - coedge_list.reset(); - for ( int i = coedge_list.size(); i--; ) - { - OCCCoEdge* coedge = coedge_list.get_and_step(); - OCCLoop* loop = dynamic_cast<OCCLoop*>(coedge->get_loop()); - if (loop) - result_list.append_unique(loop); - } -} - -void OCCPoint::get_coedges( DLIList<OCCCoEdge*>& result_list ) -{ - DLIList<OCCCurve*> curve_list; - get_curves( curve_list ); - curve_list.reset(); - for ( int i = curve_list.size(); i--; ) - curve_list.get_and_step()->get_coedges( result_list ); -} - -void OCCPoint::get_curves( DLIList<OCCCurve*>& result_list ) -{ - myCurves.reset(); - for ( int i = 0; i < myCurves.size(); i++ ) - if ( OCCCurve* curve = dynamic_cast<OCCCurve*>(myCurves.next(i)) ) - result_list.append(curve); -} - -//------------------------------------------------------------------------- -// Purpose : Tear down topology -// -// Special Notes : -// -// Creator : Jason Kraftcheck -// -// Creation Date : 09/29/03 -//------------------------------------------------------------------------- -CubitStatus OCCPoint::disconnect_curve (OCCCurve* curve) -{ - assert(0); - if (!myCurves.move_to(curve)) - return CUBIT_FAILURE; - myCurves.remove(); - - if (curve->start_point() == this) - curve->remove_start_point(); - - if (curve->end_point() == this) - curve->remove_end_point(); - - return CUBIT_SUCCESS; -} - - // ********** END PUBLIC FUNCTIONS ********** // ********** BEGIN PROTECTED FUNCTIONS ********** Modified: cgm/trunk/geom/OCC/OCCPoint.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCPoint.hpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCPoint.hpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -12,80 +12,47 @@ // Owner : Steven J. Owen //------------------------------------------------------------------------- -#ifndef POINT_FACET_HPP -#define POINT_FACET_HPP +#ifndef POINT_OCCPOINT_HPP +#define POINT_OCCPOINT_HPP // ********** BEGIN STANDARD INCLUDES ********** // ********** END STANDARD INCLUDES ********** // ********** BEGIN CUBIT INCLUDES ********** -#include "CubitDefines.h" #include "Point.hpp" -#include "OCCAttribSet.hpp" -#include <TopoDS_Vertex.hxx> -#include <gp_Pnt.hxx> - +#include <stdio.h> +#include "gp_Pnt.hxx" // ********** END CUBIT INCLUDES ********** // ********** BEGIN FORWARD DECLARATIONS ********** -class TopologyEntity; class CubitSimpleAttrib; -class RefVertex; -class RefVolume; -class RefVolume; -class CubitPoint; class OCCAttrib; - -class OCCBody; -class OCCLump; -class OCCShell; -class OCCSurface; -class OCCLoop; -class OCCCoEdge; -class OCCCurve; - // ********** END FORWARD DECLARATIONS ********** class OCCPoint : public Point { private: - DLIList<Curve*> myCurves; - CubitPoint *myPoint; - CubitBoolean iCreated; - TopoDS_Vertex *myTopoDSVertex; + gp_Pnt myPoint; - OCCAttribSet attribSet; - //List of OCCAttrib*'s instead of CubitSimpleAttribs - public : - OCCPoint(CubitVector &location, DLIList<Curve*> &curves ); + OCCPoint(CubitVector &location ); //I- CubitVector &location //I- location of point (creates a CubiPoint). //I- DLIList<Curve*> curves //I- curves attaced to point - OCCPoint(CubitPoint *thePoint, DLIList<Curve*> &curves ); - //I- CubitPoint *thePoint - //I- pointer to the CubitPoint associated with OCCPoint - //I- DLIList<Curve*> curves - //I- curves attaced to point - - OCCPoint(CubitPoint *thePoint ); - //I- CubitPoint *thePoint - //I- pointer to the CubitPoint associated with OCCPoint - - OCCPoint(TopoDS_Vertex *thePoint, DLIList<Curve*> &curves ); - //I- TopoDS_Vertex *thePoint + OCCPoint(gp_Pnt& thePoint ):myPoint(thePoint){}; + //I- gp_Pnt *thePoint //I- pointer to the TopoDS_Vertex associated with OCCPoint //I- DLIList<Curve*> curves //I- curves attaced to point - OCCPoint(TopoDS_Vertex *thePoint ); - //I- TopoDS_Vertex *thePoint - //I- pointer to the TopoDS_Vertex associated with OCCPoint - + gp_Pnt get_gp()const; + void set_gp( const +gp_Pnt gp_ptr); + // - get/set the gp_Pnt associated with this object virtual ~OCCPoint(); //- The destructor @@ -94,51 +61,19 @@ // make a new copy of this point and return it #endif - virtual void append_simple_attribute_virt(CubitSimpleAttrib*); - //R void - //I - //I- - //I- that is to be appended to this OSME object. - //- The purpose of this function is to append a - //- attribute to the OSME. The is attached to each of the - //- underlying solid model entities this one points to. - - virtual void remove_simple_attribute_virt(CubitSimpleAttrib*); - //R void - //I CubitSimpleAttrib* - //I- A reference to a CubitSimpleAttrib object which is the object - //I- that is to be removed to this OSME object. - //- The purpose of this function is to remove a simple - //- attribute from the OSME. The attribute is attached to each of the - //- underlying solid model entities this one points to. - - virtual void remove_all_simple_attribute_virt(); - //R void - //I- - //- The purpose of this function is to remove all simple - //- attributes from the OSME. - - virtual CubitStatus get_simple_attribute(DLIList<CubitSimpleAttrib*>&); - virtual CubitStatus get_simple_attribute(const CubitString& name, - DLIList<CubitSimpleAttrib*>&); - //R CubitSimpleAttrib* - //R- the returned cubit simple attribute. - //- The purpose of this function is to get the attributes - //- of the geometry entity. The name is attached to the underlying solid - //- model entity(ies) this one points to. - //- MJP Note: - //- This is the code that implements the requirement that names - //- of VGI Entities propagate across solid model boolean - //- operations. The success of this relies, of course, on the underlying - //- solid modeler being able to propagate attributes across - //- such operations on its entities. If it cannot, then "names" - //- of VGI entities will not propagate. - virtual CubitVector coordinates() const; //R CubitVector //R- Contains the coordinate values {x y z} of this Point //- Returns the spatial coordinates of this Point. + virtual void set_coord(CubitVector &location ); + virtual void set_coord(double x, double y, double z); + + CubitBoolean is_equal(const OCCPoint & other, double Tol); + + double distance(const OCCPoint & other); + double SquareDistance (const OCCPoint & other); + virtual CubitBox bounding_box() const ; // see comments in GeometryEntity.hpp @@ -150,44 +85,20 @@ //- This function returns a pointer to the geometric modeling engine //- associated with the object. -#ifdef BOYD14 - CubitStatus move( CubitVector &delta ); - //- Move the first vertex's point by the delta. -#endif - - void add_curve( Curve* curv_ptr ) - { myCurves.append_unique( curv_ptr ); } - // associate this point with a curve - - CubitPoint *get_cubit_point() - { return myPoint; } - // return the CubitPoint associated with this facet point - - CubitStatus save_attribs( FILE* file_ptr ); - // Write FactAttribs out to file - - CubitStatus restore_attribs( FILE* file_ptr, unsigned int endian ); - // Read FactAttribs from file - void get_parents_virt( DLIList<TopologyBridge*>& parents ); void get_children_virt( DLIList<TopologyBridge*>& children ); -#ifdef BOYD14 - void get_bodies ( DLIList<OCCBody *>& bodies ); -#endif - void get_lumps ( DLIList<OCCLump *>& lumps ); - void get_shells ( DLIList<OCCShell *>& shells ); - void get_surfaces( DLIList<OCCSurface*>& surfaces ); - void get_loops ( DLIList<OCCLoop *>& loops ); - void get_coedges ( DLIList<OCCCoEdge *>& coedges ); - void get_curves ( DLIList<OCCCurve *>& curves ); -#ifdef BOYD14 - void get_points ( DLIList<OCCPoint *>& points ); -#endif + virtual void append_simple_attribute_virt(CubitSimpleAttrib*); + virtual void remove_simple_attribute_virt(CubitSimpleAttrib*); + virtual void remove_all_simple_attribute_virt(); + virtual CubitStatus get_simple_attribute(DLIList<CubitSimpleAttrib*>&); + virtual CubitStatus get_simple_attribute(const CubitString&, + DLIList<CubitSimpleAttrib*>&); - CubitStatus disconnect_curve( OCCCurve* curve ); - - inline bool has_parent_curve() const { return myCurves.size() > 0; } + CubitStatus save_attribs( FILE *file_ptr ); + + CubitStatus restore_attribs( FILE *file_ptr, unsigned int endian ); + }; Modified: cgm/trunk/geom/OCC/OCCQueryEngine.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCQueryEngine.cpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCQueryEngine.cpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -13,9 +13,11 @@ // Creation Date : 7/17/00 // //------------------------------------------------------------------------- +#include "config.h" +#include "BRep_Tool.hxx" +#include "gp_Pnt.hxx" #include "OCCQueryEngine.hpp" #include "OCCModifyEngine.hpp" -#include "FacetboolInterface.hpp" #include "TopologyEntity.hpp" #include "TopologyBridge.hpp" #include "RefEntity.hpp" @@ -67,7 +69,6 @@ #include "KDDTree.hpp" #include "RTree.hpp" #include "FacetDataUtil.hpp" -#include "GridSearchTree.hpp" #include <stdio.h> #include <errno.h> @@ -364,69 +365,7 @@ return CUBIT_SUCCESS; } -CubitStatus OCCQueryEngine::get_connected_patch( - DLIList<OCCSurface*>& remaining_surfs, - DLIList<OCCSurface*>& output_patch ) -{ - DLIList<OCCSurface*> stack, curve_surfs; - STD(set)<OCCSurface*> marked; - DLIList<OCCCurve*> curves; - int debug_this = 0; - if(debug_this){ - GfxDebug::clear(); - } - int i; - for (i = remaining_surfs.size(); i--; ) - marked.insert( remaining_surfs.get_and_step() ); - // Choose one surface to start with - OCCSurface* surf = remaining_surfs.pop(); - marked.erase( surf ); - stack.append( surf ); - - // Get all connected surfaces - while( stack.size() ) - { - surf = stack.pop(); - if(debug_this){ - surf->get_eval_tool()->debug_draw_facets(CUBIT_BLUE); - GfxDebug::mouse_xforms(); - } - output_patch.append( surf ); - - surf->get_curves( curves ); - while (curves.size()) - { - OCCCurve* curve = curves.pop(); - curve->get_surfaces( curve_surfs ); - if(debug_this && curve_surfs.size() < 2){ - PRINT_INFO("Curve is not connected to 2 surfaces.\n"); - curve->get_eval_tool()->debug_draw_facet_edges(CUBIT_MAGENTA); - } - - - while (curve_surfs.size()) - { - OCCSurface* curve_surf = curve_surfs.pop(); - if (marked.erase(curve_surf)) - stack.append( curve_surf ); - } - } - } - - // Remove output surfaces from input list - // At this point, "marked" contains all the surfaces not in "ouput_patch" - remaining_surfs.last(); - for (i = remaining_surfs.size(); i--; ) - if (marked.find(remaining_surfs.step_and_get()) == marked.end()) - remaining_surfs.change_to( 0 ); - remaining_surfs.remove_all_with_value( 0 ); - - return CUBIT_SUCCESS; - -} - - //================================================================================ // Description: // Author : @@ -438,61 +377,9 @@ int& number_facets, GMem* gMem, unsigned short , + double, double ) const { - // get the OCCSurface. - int i; - OCCSurface *facet_surf_ptr = CAST_TO(surface_ptr,OCCSurface); - if( ! facet_surf_ptr ) - return CUBIT_FAILURE; - - // get the facets for the surface - DLIList<CubitFacet*> surface_facets; - DLIList<CubitPoint*> surface_points; - facet_surf_ptr->get_my_facets(surface_facets, surface_points); - - // set return values, and if GMem is NULL return - // (caller just wanted to know the counts.) - number_facets = surface_facets.size() * 4; - number_points = surface_points.size(); - number_triangles = surface_facets.size(); - if( !gMem ) - return CUBIT_SUCCESS; - - - // Allocate space in GMem - gMem->allocate_tri(surface_facets.size()); - gMem->fListCount = number_facets; - gMem->pointListCount = number_points; - - // Copy points to GMem - surface_points.reset(); - GPoint* pt_itor = gMem->point_list(); - for ( i = 0; i < number_points; i++ ) - { - CubitPoint* point = surface_points.get_and_step(); - pt_itor->x = (float)point->x(); - pt_itor->y = (float)point->y(); - pt_itor->z = (float)point->z(); - point->marked(i); - pt_itor++; - } - - // Copy facets to Gmem - surface_facets.reset(); - int* f_itor = gMem->facet_list(); - for ( i = 0; i < number_triangles; i++ ) - { - *(f_itor++) = 3; - CubitFacet* facet = surface_facets.get_and_step(); - for ( int j = 0; j < 3; j++ ) - *(f_itor++) = facet->point(j)->marked(); - } - - // cleanup - while( surface_points.size() ) - surface_points.pop()->marked(0); - return CUBIT_SUCCESS; } @@ -507,54 +394,8 @@ double /*tolerance*/ ) const { // get the OCCCurve. - OCCCurve *facet_curv_ptr = CAST_TO(curve_ptr,OCCCurve); + //OCCCurve *facet_curv_ptr = CAST_TO(curve_ptr,OCCCurve); - DLIList<CubitFacetEdge*> curve_facets; - facet_curv_ptr->get_facets(curve_facets); - int number_facets = curve_facets.size(); - DLIList<CubitPoint*> curve_points; - facet_curv_ptr->get_points(curve_points); - curve_points.reset(); - curve_facets.reset(); - num_points = curve_points.size(); - GPoint *new_point_list = new GPoint[num_points]; - int *new_facet_list = new int [number_facets*3]; - int ii; - for ( ii = 0; ii < num_points; ii++ ) - { - new_point_list[ii].x = curve_points.get()->x(); - new_point_list[ii].y = curve_points.get()->y(); - new_point_list[ii].z = curve_points.get()->z(); - //mark the point with the index into the point list. - //This is very important to make sure we can index these - //points when we do the facet array. - curve_points.get_and_step()->marked(ii); - } - for ( ii = 0; ii < number_facets; ii++ ) - { - //All our facets are segments. So the first value is 2. - int index_count = 3*ii; - new_facet_list[index_count] = 2; - int jj = index_count + 1; - int ll, kk; - CubitFacetEdge *facet_ptr = curve_facets.get_and_step(); - CubitPoint *temp_point; - for ( kk = jj, ll = 0; kk < jj+2; kk++, ll++) - { - temp_point = facet_ptr->point(ll); - int index_to_point = temp_point->marked(); - if ( index_to_point < 0 || index_to_point > num_points ) - { - PRINT_ERROR("Bad logic in converting edge facets to drawing facets.\n"); - return CUBIT_FAILURE; - } - new_facet_list[kk] = index_to_point; - } - } - gMem->replace_point_list(new_point_list, num_points, num_points); - gMem->replace_facet_list(new_facet_list, number_facets*3, number_facets*3); - gMem->points_consolidated(CUBIT_TRUE); - return CUBIT_SUCCESS; } @@ -971,9 +812,8 @@ for( i=0; i<facet_points.size(); i++) { OCCPoint *curr_point = facet_points.get_and_step(); - int id = curr_point->get_cubit_point()->id(); - file_writer.Write( reinterpret_cast<UnsignedInt32*>(&id), 1 ); + //file_writer.Write( reinterpret_cast<UnsignedInt32*>(&id), 1 ); if( curr_point->save_attribs(file_ptr) == CUBIT_FAILURE ) return CUBIT_FAILURE; } @@ -1118,7 +958,7 @@ data_to_write[1] = 1; // get output id of FacetEvalTool - data_to_write[2] = curr_surface->get_eval_tool()->get_output_id(); + //data_to_write[2] = curr_surface->get_eval_tool()->get_output_id(); // get Shell Sense stuff CubitSense sense0; @@ -1317,425 +1157,6 @@ DLIList<TopologyBridge*> &imported_entities ) { - //get file pointer - unsigned int size; - unsigned int i, j; - int id, k; - - OCCPoint **facet_points; - OCCCurve **facet_curves; - OCCCoEdge **facet_coedges; - OCCLoop **facet_loops; - OCCSurface **facet_surfaces; - OCCShell **facet_shells; - OCCLump **facet_lumps; - OCCBody **facet_bodies; - - OCCPoint *tmp_point; - OCCCurve *tmp_curve; - OCCCoEdge *tmp_coedge; - OCCLoop *tmp_loop; - OCCSurface *tmp_surf; - OCCShell *tmp_shell; - OCCLump *tmp_lump; - OCCBody*tmp_body; - - int num_facet_points = 0; - int num_facet_curves = 0; - int num_facet_coedges = 0; - int num_facet_loops = 0; - int num_facet_surfaces = 0; - int num_facet_shells = 0; - int num_facet_lumps = 0; - int num_facet_bodies = 0; - - //create a wrapper object for writing - CIOWrapper file_reader( endian, file_ptr ); - - //-----------------Read OCCPoints------------------ - // Read number of OCCPoints - file_reader.Read( &size, 1 ); - // Allocate memory for OCCPoints - facet_points = new OCCPoint*[size]; - for(i=0; i<size; i++) - { - file_reader.Read( reinterpret_cast<UnsignedInt32*>(&id), 1 ); - if( id >= num_points || id < 0 ) - { - delete [] facet_points; - return CUBIT_FAILURE; - } - - tmp_point = new OCCPoint( points_array[ id ] ); - if( tmp_point == NULL ) - return CUBIT_FAILURE; - - num_facet_points++; - facet_points[i] = tmp_point; - tmp_point->restore_attribs( file_ptr, endian ); - } - - //-----------------Read FacetCurves------------------ - //Read number of FacetCurves - file_reader.Read( &size, 1 ); - // Allocate memory for FacetCurves - facet_curves = new OCCCurve*[size]; - for(i=0; i<size; i++) - { - int data[4]; - file_reader.Read( reinterpret_cast<UnsignedInt32*>(data), 4 ); - if( data[0] >= num_facet_points || data[0] < 0 || - data[1] >= num_facet_points || data[1] < 0 || - data[3] >= num_cfet || data[3] < 0 ) - { - delete [] facet_curves; - return CUBIT_FAILURE; - } - - CubitSense sense; - if (data[2] == -1 ) - sense = CUBIT_UNKNOWN; - else - sense = data[2] ? CUBIT_REVERSED : CUBIT_FORWARD; - - tmp_curve = new OCCCurve( cfev_array[ data[3] ], facet_points[ data[0] ], - facet_points[ data[1] ], sense ); - if( tmp_curve == NULL ) - return CUBIT_FAILURE; - - // Add curve to OCCPoints - facet_points[data[0]]->add_curve( tmp_curve ); - facet_points[data[1]]->add_curve( tmp_curve ); - - num_facet_curves++; - facet_curves[i] = tmp_curve; - tmp_curve->restore_attribs( file_ptr, endian ); - } - - //-----------------Read OCCCoEdges------------------ - //Read number of OCCCoEdges - file_reader.Read( &size, 1 ); - facet_coedges = new OCCCoEdge*[ size ]; - for(i=0; i<size; i++) - { - int data[2]; - file_reader.Read( reinterpret_cast<unsigned int*>(data), 2 ); - - if( data[0] >= num_facet_curves || data[0] < 0 ) - { - delete [] facet_coedges; - return CUBIT_FAILURE; - } - - CubitSense sense; - if (data[1] == -1 ) - sense = CUBIT_UNKNOWN; - else - sense = data[1] ? CUBIT_REVERSED : CUBIT_FORWARD; - - tmp_coedge = new OCCCoEdge( facet_curves[ data[0] ], sense ); - if( tmp_coedge == NULL ) - return CUBIT_FAILURE; - - facet_coedges[i] = tmp_coedge; - num_facet_coedges++; - - // Add OCCCoEdge to OCCCurve - facet_curves[ data[0] ]->add_coedge( tmp_coedge ); - } - - //-----------------Read OCCLoops------------------ - //Read number of OCCLoops - file_reader.Read( &size, 1 ); - DLIList<CoEdgeSM*> temp_coedge_list; - facet_loops = new OCCLoop*[ size ]; - for(i=0; i<size; i++) - { - temp_coedge_list.clean_out(); - - unsigned int num_coedges = 0; - file_reader.Read( &num_coedges, 1); - - int* coedge_ids = new int[ num_coedges]; - file_reader.Read( (unsigned*)coedge_ids, num_coedges ); - - for( j=0; j<num_coedges; j++) - { - if( coedge_ids[j] >= num_facet_coedges || coedge_ids[j] < 0 ) - { - delete [] facet_loops; - return CUBIT_FAILURE; - } - temp_coedge_list.append( facet_coedges[ coedge_ids[j] ] ); - } - - tmp_loop = new OCCLoop( temp_coedge_list ); - if( tmp_loop == NULL) - return CUBIT_FAILURE; - - num_facet_loops++; - facet_loops[i] = tmp_loop; - - for( j=0; j<num_coedges; j++) - facet_coedges[ coedge_ids[j] ]->add_loop( tmp_loop ); - - delete [] coedge_ids; - } - - //-----------------Read OCCSurfaces------------------ - //Read number of OCCSurfaces - file_reader.Read( &size, 1 ); - facet_surfaces = new OCCSurface*[size]; - DLIList<LoopSM*> temp_loops; - for(i=0; i<size; i++) - { - temp_loops.clean_out(); - int data[6]; - file_reader.Read( (unsigned int*)data, 6); - - CubitSense sense, sense0, sense1; - if (data[0] == -1 ) - sense = CUBIT_UNKNOWN; - else - sense = data[0] ? CUBIT_REVERSED : CUBIT_FORWARD; - - CubitBoolean useFacets; - useFacets = data[1] ? CUBIT_TRUE : CUBIT_FALSE; - - // make sure FacetEvalTool ID is in range - if( data[2] >= num_fet || data[2] < 0 ) - { - delete [] facet_surfaces; - return CUBIT_FAILURE; - } - - if (data[3] == -1 ) - sense0 = CUBIT_UNKNOWN; - else - sense0 = data[3] ? CUBIT_REVERSED : CUBIT_FORWARD; - - if (data[4] == -1 ) - sense1 = CUBIT_UNKNOWN; - else - sense1 = data[4] ? CUBIT_REVERSED : CUBIT_FORWARD; - - int num_loops = data[5]; - int* loop_ids = new int[ num_loops ]; - file_reader.Read( (unsigned*)loop_ids, num_loops ); - - for( k=0; k<num_loops; k++) - { - if( loop_ids[k] >= num_facet_loops || - loop_ids[k] < 0 ) - { - delete [] loop_ids; - return CUBIT_FAILURE; - } - temp_loops.append( facet_loops[ loop_ids[k] ] ); - } - tmp_surf = new OCCSurface( fev_array[ data[2] ], - sense, sense0, - useFacets, temp_loops ); - if( tmp_surf == NULL) - return CUBIT_FAILURE; - - facet_surfaces[i] = tmp_surf; - num_facet_surfaces++; - - // Add OCCSurface to OCCLoops - for( k=0; k<num_loops; k++) - facet_loops[ loop_ids[k] ]->add_surface( tmp_surf ); - - delete [] loop_ids; - tmp_surf->restore_attribs( file_ptr, endian ); - } - - //-----------------Read OCCShells------------------ - //Read number of OCCShells - file_reader.Read( &size, 1 ); - facet_shells = new OCCShell*[size]; - DLIList<Surface*> temp_surfs; - for(i=0; i<size; i++) - { - temp_surfs.clean_out(); - unsigned int num_surfs = 0; - file_reader.Read( &num_surfs, 1 ); - - int* surface_ids = new int[ num_surfs ]; - file_reader.Read( (unsigned*)surface_ids, num_surfs ); - - for( j=0; j<num_surfs; j++) - { - if( surface_ids[j] >= num_facet_surfaces || - surface_ids[j] < 0 ) - { - delete [] facet_shells; - return CUBIT_FAILURE; - } - - temp_surfs.append( facet_surfaces[ surface_ids[j] ] ); - } - - tmp_shell = new OCCShell( temp_surfs ); - facet_shells[i] = tmp_shell; - num_facet_shells++; - - // Add this shell to surfaces - for( j=0; j<num_surfs; j++) - facet_surfaces[ surface_ids[j] ]->add_shell( tmp_shell ); - - delete [] surface_ids; - } - - //-----------------Read OCCLumps------------------ - //Read number of OCCLumps - file_reader.Read( &size, 1 ); - facet_lumps = new OCCLump*[size]; - DLIList<ShellSM*> temp_shells; - for(i=0; i<size; i++) - { - temp_shells.clean_out(); - - unsigned int num_shells = 0; - file_reader.Read( &num_shells, 1 ); - - int* shell_ids = new int[ num_shells ]; - file_reader.Read( (unsigned*)shell_ids, num_shells ); - - for( j=0; j<num_shells; j++) - { - if( shell_ids[j] >= num_facet_shells ) - { - delete [] facet_lumps; - return CUBIT_FAILURE; - } - temp_shells.append( facet_shells[ shell_ids[j] ] ); - } - - tmp_lump = new OCCLump( temp_shells ); - if( tmp_lump == NULL ) - return CUBIT_FAILURE; - - facet_lumps[i] = tmp_lump; - num_facet_lumps++; - - for( j=0; j<num_shells; j++) - facet_shells[ shell_ids[j] ]->add_lump( tmp_lump ); - - delete [] shell_ids; - tmp_lump->restore_attribs( file_ptr, endian ); - } - - //-----------------Read FacetBodies ------------------ - //Read number of FacetBodies - file_reader.Read( &size, 1 ); - facet_bodies = new OCCBody*[size]; - DLIList<Lump*> temp_lumps; - for(i=0; i<size; i++) - { - temp_lumps.clean_out(); - - unsigned int num_lumps= 0; - file_reader.Read( &num_lumps, 1 ); - - int* lump_ids = new int[ num_lumps ]; - file_reader.Read( (unsigned*)lump_ids, num_lumps ); - - for( j=0; j<num_lumps; j++) - { - if( lump_ids[j] >= num_facet_lumps ) - { - delete [] facet_bodies; - return CUBIT_FAILURE; - } - temp_lumps.append( facet_lumps[ lump_ids[j] ] ); - } - - tmp_body = new OCCBody( temp_lumps ); - if( tmp_body == NULL ) - return CUBIT_FAILURE; - - facet_bodies[i] = tmp_body; - num_facet_bodies++; - - // Add this OCCBody to OCCLumps - for( j=0; j<num_lumps; j++) - facet_lumps[ lump_ids[j] ]->add_body( tmp_body ); - - delete [] lump_ids; - - //read in trans matrix - unsigned int rows_and_cols[2]; - file_reader.Read( rows_and_cols, 2 ); - - unsigned int num_rows = rows_and_cols[0]; - unsigned int num_cols = rows_and_cols[1]; - - if( num_rows || num_cols) - { - CubitTransformMatrix trans_matrix; - - double *trans_matrix_array; - trans_matrix_array = new double[ num_rows*num_cols ]; - file_reader.Read( trans_matrix_array, num_rows*num_cols ); - - unsigned c; - for(j=0; j<num_rows; j++ ) - { - for(c=0; c<num_cols; c++) - trans_matrix.add(j,c, trans_matrix_array[(j*num_cols)+c] ); - } - tmp_body->set_transforms( trans_matrix ); - delete [] trans_matrix_array; - } - tmp_body->restore_attribs( file_ptr, endian ); - } - - // Here is where we determine if the entites are free or not - // bodies, all bodies are free - for(k=0; k<num_facet_bodies; k++) - imported_entities.append( facet_bodies[k] ); - - // surfaces are free if they are not in a shell - DLIList<OCCShell*> shell_list; - for(k=0; k<num_facet_surfaces; k++) - { - shell_list.clean_out(); - facet_surfaces[k]->get_shells( shell_list ); - if( shell_list.size() == 0 ) - imported_entities.append( facet_surfaces[k] ); - } - - // curves are free if they are not associate with a coedge - DLIList<OCCCoEdge*> coedge_list; - for(k=0; k<num_facet_curves; k++) - { - coedge_list.clean_out(); - facet_curves[k]->get_coedges( coedge_list ); - if( coedge_list.size() == 0 ) - imported_entities.append( facet_curves[k] ); - } - - // points are free if they are not associate with a curve - DLIList<OCCCurve*> curve_list; - for(k=0; k<num_facet_points; k++) - { - curve_list.clean_out(); - facet_points[k]->get_curves( curve_list ); - if( curve_list.size() == 0 ) - imported_entities.append( facet_points[k] ); - } - - // clean up - delete [] facet_points; - delete [] facet_curves; - delete [] facet_coedges; - delete [] facet_loops; - delete [] facet_surfaces; - delete [] facet_shells; - delete [] facet_lumps; - delete [] facet_bodies; - return CUBIT_SUCCESS; } @@ -1921,14 +1342,14 @@ OCCPoint *point; if (!OCCMap->IsBound(*povertex)) { printf("Adding vertex\n"); - point = new OCCPoint(povertex); + gp_Pnt pt = BRep_Tool::Pnt(*povertex); + point = new OCCPoint(pt); CGMList->append(point); // imported_entities.append(point); OCCMap->Bind(*povertex, CGMList->where_is_item(point)); } else { point = (OCCPoint*)(*CGMList)[OCCMap->Find(*povertex)]; } - point->add_curve(curve); } return CUBIT_SUCCESS; } @@ -2040,256 +1461,11 @@ { CubitStatus rv = CUBIT_SUCCESS; - CubitFacet **facets = NULL; - CubitFacetEdge **edges = NULL; - - // read facets from the file and build arrays of facet entities - - rv = read_facets( fp, endian, - num_facets, num_edges, num_points, - facets, edges, points ); - - // create the CurveFacetEvalTools and FacetEval Tools - - if (rv != CUBIT_FAILURE ) - { - rv = restore_eval_tools( fp, endian, - num_facets, num_edges, num_points, - facets, edges, points, - num_cfet, num_fet, - cfet_array, fet_array ); - } - - if (facets != NULL) - delete [] facets; - if(edges != NULL) - delete [] edges; return rv; } -//=============================================================================== -// Function : read_facets -// Member Type: PUBLIC -// Description: read facets from the file and create facet entities -// Author : sjowen -// Date : 1/26/03 -//=============================================================================== -CubitStatus OCCQueryEngine::read_facets( - FILE *fp, - unsigned int endian, - int &num_facets, - int &num_edges, - int &num_points, - CubitFacet **&facets, - CubitFacetEdge **&edges, - CubitPoint **&points ) -{ - - NCubitFile::CIOWrapper cio(endian, fp ); - int ii; - - // read points - UnsignedInt32 npoints; - double uu,vv,ss; - cio.Read(&npoints, 1); - num_points = (int)npoints; - if (num_points > 0) - { - double* coord_array = new double [num_points * 3]; - double* uvs_array = new double [num_points * 3]; - cio.Read(coord_array, npoints*3); - cio.Read(uvs_array, npoints*3); - - // create CubitPoints - CubitPoint *point_ptr; - //CubitVector normal; - points = new CubitPoint * [num_points]; - for(ii=0; ii<num_points; ii++) - { - point_ptr = (CubitPoint *) new CubitPointData( coord_array[ii*3], - coord_array[ii*3+1], - coord_array[ii*3+2] ); - points[ii] = point_ptr; - uu = uvs_array[ii*3]; - vv = uvs_array[ii*3+1]; - ss = uvs_array[ii*3+2]; - point_ptr->set_uvs(uu, vv, ss); - } - - //Clean up - delete [] coord_array; - delete [] uvs_array; - } - - - //Read in Normals - int nnormals; - cio.Read(reinterpret_cast<UnsignedInt32*>(&nnormals), 1); - if( nnormals > 0 ) - { - double* normal_array = new double [nnormals * 3]; - int* normal_ids = new int[nnormals * 3]; - cio.Read(normal_array, nnormals * 3); - cio.Read(reinterpret_cast<UnsignedInt32*>(normal_ids), nnormals); - CubitVector normal; - for(ii=0; ii<nnormals; ii++) - { - normal.x( normal_array[ii*3] ); - normal.y( normal_array[ii*3+1] ); - normal.z( normal_array[ii*3+2] ); - points[ normal_ids[ii] ]->normal( normal ); - } - - //Clean up - delete [] normal_array; - delete [] normal_ids; - } - - - // read edges and edge control points - - UnsignedInt32 nedges; - cio.Read(&nedges, 1); - num_edges = (int)nedges; - if (num_edges > 0) - { - UnsignedInt32 *edge_vert_array = new UnsignedInt32 [nedges*2]; - cio.Read(edge_vert_array, nedges*2); - UnsignedInt32 nctrl_pts; - cio.Read(&nctrl_pts, 1); - double *control_points = NULL; - if (nctrl_pts > 0) - { - control_points = new double [nctrl_pts*3]; - cio.Read(control_points, nctrl_pts*3); - } - - unsigned id0, id1, ii; - edges = new CubitFacetEdge * [num_edges]; - CubitFacetEdge *edge_ptr; - for(ii=0; ii<nedges; ii++) - { - id0 = edge_vert_array[ii*2]; - id1 = edge_vert_array[ii*2+1]; - - edge_ptr = (CubitFacetEdge *) new CubitFacetEdgeData( points[id0], points[id1] ); - edges[ii] = edge_ptr; - if (nctrl_pts > 0) - { - edge_ptr->set_control_points(&control_points[ii*NUM_EDGE_CPTS*3]); - } - } - - //Clean up - delete [] edge_vert_array; - delete [] control_points; - edge_vert_array = NULL; - control_points = NULL; - } - - // read the facets and the facet control points - - UnsignedInt32 nfacets; - cio.Read(&nfacets, 1); - num_facets = (int)nfacets; - if(num_facets > 0) - { - UnsignedInt32 *facet_edge_array = new UnsignedInt32 [nfacets*3]; - cio.Read(facet_edge_array, nfacets*3); - int *int_data = new int [nfacets*2]; - cio.Read(reinterpret_cast<UnsignedInt32*>(int_data), nfacets*2); - - UnsignedInt32 nctrl_pts; - cio.Read(&nctrl_pts, 1); - double *control_points = NULL; - if (nctrl_pts > 0) - { - control_points = new double [nctrl_pts*3]; - cio.Read(control_points, nctrl_pts*3); - } - - unsigned id0, id1, id2, ii; - CubitFacet *facet_ptr; - facets = new CubitFacet * [num_facets]; - for (ii=0; ii<nfacets; ii++) - { - id0 = facet_edge_array[ii*3]; - id1 = facet_edge_array[ii*3+1]; - id2 = facet_edge_array[ii*3+2]; - facet_ptr = (CubitFacet *) new CubitFacetData(edges[id0], edges[id1], edges[id2]); - facets[ii] = facet_ptr; - facet_ptr->is_flat( int_data[ii*2] ); - facet_ptr->is_backwards( int_data[ii*2+1] ); - - if(nctrl_pts > 0) - { - facet_ptr->set_control_points(&control_points[ii*NUM_TRI_CPTS*3]); - } - } - - //Clean up - delete [] facet_edge_array; - delete [] control_points; - delete [] int_data; - facet_edge_array = NULL; - control_points = NULL; - int_data = NULL; - } - - // read the extra info at the surface boundaries - - UnsignedInt32 num_c_zero_points = 0; - cio.Read(&num_c_zero_points, 1); - if (num_c_zero_points > 0) - { - UnsignedInt32 c_zero_int_data_size; - - cio.Read(&c_zero_int_data_size, 1); - if (c_zero_int_data_size <= 0) - return CUBIT_FAILURE; - UnsignedInt32 *c_zero_int32_data = new UnsignedInt32 [c_zero_int_data_size]; - cio.Read(c_zero_int32_data, c_zero_int_data_size); - int *c_zero_int_data = new int [c_zero_int_data_size]; - unsigned int jj; - for (jj=0; jj<c_zero_int_data_size; jj++) - c_zero_int_data[jj] = (int) c_zero_int32_data[jj]; - - UnsignedInt32 c_zero_double_data_size; - - cio.Read(&c_zero_double_data_size, 1); - if (c_zero_double_data_size <= 0) - return CUBIT_FAILURE; - double *c_zero_double_data = new double [c_zero_double_data_size]; - cio.Read(c_zero_double_data, c_zero_double_data_size); - - // create the facet boundary tool datas and assign to points - - int didx = 0; - int iidx = 0; - UnsignedInt32 zz; - for (zz=0; zz<num_c_zero_points; zz++) - { - if (didx >= (int)c_zero_double_data_size || - iidx >= (int)c_zero_int_data_size) - return CUBIT_FAILURE; - TDFacetBoundaryPoint::new_facet_boundary_point( points, facets, - iidx, didx, c_zero_int_data, c_zero_double_data ); - } - - //Clean up - delete [] c_zero_int_data; - delete [] c_zero_int32_data; - delete [] c_zero_double_data; - } - - return CUBIT_SUCCESS; -} - - - - //------------------------------------------------------------------------- // Purpose : Deletes all solid model entities associated with the // Bodies in the input list. @@ -2440,16 +1616,16 @@ if (start) { - start->disconnect_curve(fcurve); - if (!start->has_parent_curve()) - delete_solid_model_entities(start); + //start->disconnect_curve(fcurve); + //if (!start->has_parent_curve()) + // delete_solid_model_entities(start); } if (end) { - end->disconnect_curve(fcurve); - if (!end->has_parent_curve()) - delete_solid_model_entities(end); + //end->disconnect_curve(fcurve); + //if (!end->has_parent_curve()) + // delete_solid_model_entities(end); } delete curve; @@ -2468,9 +1644,7 @@ CubitStatus OCCQueryEngine::delete_solid_model_entities( Point* point ) const { - OCCPoint* fpoint = dynamic_cast<OCCPoint*>(point); - if (!fpoint || fpoint->has_parent_curve()) - return CUBIT_FAILURE; + //OCCPoint* fpoint = dynamic_cast<OCCPoint*>(point); delete point; return CUBIT_SUCCESS; @@ -2520,93 +1694,8 @@ } //- Set solid modeler options -//=========================================================================== -//Function Name: make_facets -//Member Type: PUBLIC -//Description: creates Cubit quad facet entities from the hash points and -// connectivity -//=========================================================================== -CubitStatus OCCQueryEngine::make_facets( - int *conn, // conectivity array (size = 4 * nfacets) - int nfacets, // total number of facets (tri+quad) - DLIList<CubitQuadFacet *> &facet_list ) // return the facet list -{ - CubitQuadFacet *facet_ptr = NULL; - CubitStatus rv = CUBIT_SUCCESS; - CubitPoint *point0, *point1, *point2, *point3; - // create the facet array - - for(int ii=0; ii<nfacets; ii++) - { - if (conn[ii*4+2] != conn[ii*4+3]) - { - point0 = get_hash_point(conn[ii*4]); - point1 = get_hash_point(conn[ii*4+1]); - point2 = get_hash_point(conn[ii*4+2]); - point3 = get_hash_point(conn[ii*4+3]); - - facet_ptr = new CubitQuadFacetData( point0, point1, point2, point3 ); - - if (!facet_ptr) - { - rv = CUBIT_FAILURE; - return rv; - } - facet_list.append( facet_ptr ); - } - } - return rv; -} - //=========================================================================== -//Function Name: make_facets -//Member Type: PUBLIC -//Description: creates Cubit tri facet entities from the hash points and -// connectivity -//=========================================================================== -CubitStatus OCCQueryEngine::make_facets( - int *conn, // conectivity array (size = 4 * nfacets) - int nfacets, // total number of facets (tri+quad) - DLIList<CubitFacet *> &facet_list ) // return the facet list -{ - CubitFacet *facet_ptr = NULL; - CubitStatus rv = CUBIT_SUCCESS; - CubitPoint *point0, *point1, *point2; - - // create the facet array - - for(int ii=0; ii<nfacets; ii++) - { - if (conn[ii*4+2] == conn[ii*4+3]) - { - point0 = get_hash_point(conn[ii*4]); - point1 = get_hash_point(conn[ii*4+1]); - point2 = get_hash_point(conn[ii*4+2]); - if( (point0 == point1) || (point0 == point2) || (point1 == point2) ){ - PRINT_ERROR("Point used more than once in a single facet. This is not allowed.\n"); - return CUBIT_FAILURE; - } - if( !point0 || !point1 || !point2 ){ - PRINT_ERROR("Point in facet is undefined. This is not allowed.\n"); - return CUBIT_FAILURE; - } - - facet_ptr = new CubitFacetData( point0, point1, point2 ); - - if (!facet_ptr) - { - rv = CUBIT_FAILURE; - return rv; - } - facet_list.append( facet_ptr ); - } - } - - return rv; -} - -//=========================================================================== //Function Name: ensure_is_ascii_stl_file //Member Type: //Description: returns CUBIT_TRUE in is_ascii if fp is an ascii stl file @@ -2716,203 +1805,7 @@ return CUBIT_FAILURE; } - DLIList <CubitPoint *> file_points; - CubitPoint *current_point; - int points_in_file=0; - int ii; - - CubitBoolean is_ascii=CUBIT_FALSE; - if (!ensure_is_ascii_stl_file(fp, is_ascii)) - { - seek_address = 0; - fclose(fp); - return CUBIT_FAILURE; - } - - if (is_ascii==CUBIT_TRUE) - { - - PRINT_INFO("Reading facets...\n"); - fclose(fp); - fp = fopen(file_name, "r"); - fseek(fp,seek_address,SEEK_SET); - - char line[128], junk[30]; - int numverts; - double xx[3], yy[3], zz[3]; - int linenumber, num; - bool done, error_found, eof_found; - - linenumber = 0; - - strcpy(line,""); - done = false; - error_found = false; - eof_found = false; - while ( (strstr(line,"endsolid") == 0) && (error_found == false) ) { - numverts = 0; - while ( numverts < 3 ) { - if ( fgets(line,127,fp) == 0 ) { - linenumber++; - eof_found = true; - break; // EOF - } - linenumber++; -// makelowercase(line); - int len, ij; - len = strlen(line); - for ( ij = 0; ij < len; ij++ ) - line[ij] = tolower(line[ij]); - - if ( strstr(line,"endsolid") != 0 ) { - done = true; - break; // End of part definition - } - if ( strstr(line,"vertex") != 0 ) { - num = sscanf(line,"%s %le %le %le",junk,&xx[numverts],&yy[numverts],&zz[numverts]); - if ( num != 4 ) { - error_found = true; - break; // error in reading vertices - } - numverts += 1; - } - } // end of while ( numverts < 3 ) - - if ( (eof_found == true) || (done == true) || - (error_found == true) || (numverts != 3) ) break; - - current_point = (CubitPoint *) new CubitPointData(xx[0],yy[0],zz[0]); - current_point->set_id(points_in_file++); - file_points.append(current_point); - current_point = (CubitPoint *) new CubitPointData(xx[1],yy[1],zz[1]); - current_point->set_id(points_in_file++); - file_points.append(current_point); - current_point = (CubitPoint *) new CubitPointData(xx[2],yy[2],zz[2]); - current_point->set_id(points_in_file++); - file_points.append(current_point); - - } - seek_address = 0; - if ( eof_found == true ) { - PRINT_WARNING("Premature end-of-file on STL file. Body may be incomplete.\n"); - fclose(fp); - goto end_read_file_points; - } - if ( error_found == true ) { - PRINT_WARNING("Error found while reading line number %d of file %s. Body may be incomplete.\n", - linenumber,file_name); - fclose(fp); - goto end_read_file_points; - } - if ( done == false ) { - PRINT_WARNING("Error found while reading line number %d of file %s. Body may be incomplete.\n", - linenumber,file_name); - fclose(fp); - goto end_read_file_points; - } - - if ( (eof_found == false) && (error_found == false) && (done == true) ) { - while ( fgets(line,127,fp) != 0 ) { - if ( (strstr(line,"solid") != 0) && (strstr(line,"endsolid") == 0) ) { - seek_address = ftell(fp); - break; - } - } - } - fclose(fp); - goto end_read_file_points; - } - else - { - fclose(fp); - // file is closed so that it can be opened as binary - fp = fopen(file_name, "rb"); - if (fp == NULL) - { - PRINT_ERROR("Could not open file %s for reading\n", file_name); - return CUBIT_FAILURE; - } - - char dummy; - // iterates through the facets of the file - float cur[12]; // an array to hold 48 bytes representing 1AVS facet - - fseek(fp, 80, SEEK_SET); - fread(&ntri, 4, 1, fp); - - PRINT_INFO ("Reading facets...\n"); - for (ii=0; ii<ntri; ii++) { - // read in 1 facet - if (!fread(cur, 4, 12, fp)) - { - PRINT_INFO ("Abnormal file termination %s \n", file_name); break; - } - fread(&dummy, 1, 1, fp); - fread(&dummy, 1, 1, fp); - - //make point - current_point = (CubitPoint *) new CubitPointData(cur[3],cur[4],cur[5]); - current_point->set_id(points_in_file++); - file_points.append(current_point); - current_point = (CubitPoint *) new CubitPointData(cur[6],cur[7],cur[8]); - current_point->set_id(points_in_file++); - file_points.append(current_point); - current_point = (CubitPoint *) new CubitPointData(cur[9],cur[10],cur[11]); - current_point->set_id(points_in_file++); - file_points.append(current_point); - } - } - fclose(fp); - -// at this point all points from the file are in file_points -end_read_file_points: - - // grid search tree to hold points - GridSearchTree * node_grid = new GridSearchTree (tolerance); - - CubitPoint - *point0, - *point1, - *point2; - CubitFacet - *facet_ptr; - ntri=0; - npoints=0; - - if (file_points.size() % 3 != 0) - { - PRINT_INFO("File Error."); - return CUBIT_FAILURE; - } - - for (ii = file_points.size(); ii>0; ii-=3) - { - - // get three points from the file_points list - // and compare them against the data already in the - // grid search tree; if it contains a point within - // epsilon tolerance this point would replace the - // current point - point0 = node_grid->fix(file_points.get_and_step()); - point1 = node_grid->fix(file_points.get_and_step()); - point2 = node_grid->fix(file_points.get_and_step()); - - - if (point0 && point1 && point2 && point0 != point1 && point1!=point2 && point2!=point0 ) - { - - facet_ptr = new CubitFacetData(point0, point1, point2); - - if (facet_ptr) - { - tfacet_list.append(facet_ptr); - ntri++; - } - - } - } - - //delete node_grid; + fclose( fp ); return CUBIT_SUCCESS; } @@ -2943,598 +1836,12 @@ seek_address = 0; return CUBIT_FAILURE; } - - typedef STD(map)< CubitPoint * , int, CubitPointComparator > vMap; - - vMap mm; // binary search tree to hold the vertices for efficiency - vMap::iterator pos; - bool append_to_facet_list=CUBIT_TRUE; - - CubitBoolean is_ascii=CUBIT_FALSE; - - if (!ensure_is_ascii_stl_file(fp, is_ascii)) - { - seek_address = 0; - fclose(fp); - return CUBIT_FAILURE; - } - - if (is_ascii==CUBIT_TRUE) - { - CubitPoint *point0,*point1,*point2; - CubitFacet *facet_ptr = NULL; - - PRINT_INFO("Reading facets...\n"); - fclose(fp); - fp = fopen(file_name, "r"); - fseek(fp,seek_address,SEEK_SET); - char line[128], junk[30]; - int numverts; - double xx[3], yy[3], zz[3]; - int linenumber, num; - bool done, error_found, eof_found; - - linenumber = 0; - - strcpy(line,""); - done = false; - error_found = false; - eof_found = false; - while ( (strstr(line,"endsolid") == 0) && (error_found == false) ) { - numverts = 0; - while ( numverts < 3 ) { - if ( fgets(line,127,fp) == 0 ) { - linenumber++; - eof_found = true; - break; // EOF - } - linenumber++; -// makelowercase(line); - int len, ij; - len = strlen(line); - for ( ij = 0; ij < len; ij++ ) - line[ij] = tolower(line[ij]); - - if ( strstr(line,"endsolid") != 0 ) { - done = true; - break; // End of part definition - } - if ( strstr(line,"vertex") != 0 ) { - num = sscanf(line,"%s %le %le %le",junk,&xx[numverts],&yy[numverts],&zz[numverts]); - if ( num != 4 ) { - error_found = true; - break; // error in reading vertices - } - numverts += 1; - } - } // end of while ( numverts < 3 ) - - if ( (eof_found == true) || (done == true) || - (error_found == true) || (numverts != 3) ) break; - point0 = (CubitPoint *) new CubitPointData(xx[0],yy[0],zz[0]); - pos=mm.find(point0); - - if (pos==mm.end()) - { - mm.insert ( vMap::value_type(point0, npoints)); - point0->set_id( npoints ++ ); - //point_list is output of functionAVS - point_list.append(point0); - } - else - { - delete point0; - point0=((*pos).first); - } - point1 = (CubitPoint *) new CubitPointData(xx[1],yy[1],zz[1]); - pos=mm.find(point1); - if (pos==mm.end()) - { - mm.insert ( vMap::value_type(point1, npoints)); - point1->set_id( npoints ++ ); - //point_list is output of function - point_list.append(point1); - } - else - { - delete point1; - point1=((*pos).first); - } - point2 = (CubitPoint *) new CubitPointData(xx[2],yy[2],zz[2]); - pos=mm.find(point2); - if (pos==mm.end()) - { - mm.insert ( vMap::value_type(point2, npoints)); - point2->set_id( npoints ++ ); - //point_list is output of function - point_list.append(point2); - } - else - { - delete point2; - point2=((*pos).first); - } - - if (point0 && point1 && point2 && point0!=point1 && point1!=point2 && point2 !=point0) - { - facet_ptr = new CubitFacetData( point0, point1, point2 ); - append_to_facet_list=CUBIT_TRUE; - } - else - { - append_to_facet_list=CUBIT_FALSE; - } - - if (!facet_ptr) - { - seek_address = 0; - fclose(fp); - return CUBIT_FAILURE; - } - - /// APPEND facet to output facet_ptr list - if (append_to_facet_list) - { - tfacet_list.append( facet_ptr ); - ntri++; - } - - } - seek_address = 0; - if ( eof_found == true ) { - PRINT_WARNING("Premature end-of-file on STL file. Body may be incomplete.\n"); - fclose(fp); - return CUBIT_SUCCESS; - } - if ( error_found == true ) { - PRINT_WARNING("Error found while reading line number %d of file %s. Body may be incomplete.\n", - linenumber,file_name); - fclose(fp); - return CUBIT_SUCCESS; - } - if ( done == false ) { - PRINT_WARNING("Error found while reading line number %d of file %s. Body may be incomplete.\n", - linenumber,file_name); - fclose(fp); - return CUBIT_SUCCESS; - } - - if ( (eof_found == false) && (error_found == false) && (done == true) ) { - while ( fgets(line,127,fp) != 0 ) { - if ( (strstr(line,"solid") != 0) && (strstr(line,"endsolid") == 0) ) { - seek_address = ftell(fp); -// PRINT_INFO("This STL file is a multipart file. Only the first part was read.\n"); - break; - } - } - } - fclose(fp); - - return CUBIT_SUCCESS; - } - else - { - fclose(fp); - // file is closed so that it can be opened as binary - fp = fopen(file_name, "rb"); - if (fp == NULL) - { - PRINT_ERROR("Could not open file %s for reading\n", file_name); - return CUBIT_FAILURE; - } - - - CubitFacet *facet_ptr = NULL; - CubitPoint *point0, - *point1, - *point2; - - char dummy; - int ii=0; // iterates through the facets of the file - float cur[12]; // an array to hold 48 bytes representing 1 facet - npoints=0; // only tri facets in stl files - - fseek(fp, 80, SEEK_SET); - fread(&ntri, 4, 1, fp); - int distinct_ntri=ntri; - - PRINT_INFO ("Reading facets...\n"); - for (ii=0; ii<ntri; ii++) { - // read in 1 facet - if (!fread(cur, 4, 12, fp)) - { - PRINT_INFO ("Abnormal file termination %s \n", file_name); break; - } - fread(&dummy, 1, 1, fp); - fread(&dummy, 1, 1, fp); - - //make point - point0 = (CubitPoint *) new CubitPointData( cur[3], cur[4], cur[5] ); - - pos=mm.find(point0); - if (pos==mm.end()) - { - mm.insert ( vMap::value_type(point0, npoints)); - point0->set_id( npoints ++ ); - //point_list is output of function - point_list.append(point0); - } - else - { - delete point0; - point0=((*pos).first); - } - - //make point - point1 = (CubitPoint *) new CubitPointData( cur[6], cur[7], cur[8] ); - - pos=mm.find(point1); - if (pos==mm.end()) - { - mm.insert ( vMap::value_type(point1, npoints)); - point1->set_id( npoints ++ ); - //point_list is output of function - point_list.append(point1); - } - else - { - delete point1; - point1=((*pos).first); - } - - //make point - point2 = (CubitPoint *) new CubitPointData( cur[9], cur[10], cur[11] ); - - pos=mm.find(point2); - if (pos==mm.end()) - { - mm.insert ( vMap::value_type(point2, npoints)); - point2->set_id( npoints ++ ); - //point_list is output of function - point_list.append(point2); - } - else - { - delete point2; - point2=((*pos).first); - } - - // this is to avoid a facet with all points on same line, which crashes CUBIT - // because of assertion - if (point0 && point1 && point2 && point0!=point1 && point1!=point2 && point2 !=point0) - { - facet_ptr = new CubitFacetData( point0, point1, point2 ); - append_to_facet_list=CUBIT_TRUE; - } - else - { - append_to_facet_list=CUBIT_FALSE; - } - - if (!facet_ptr) - { - fclose(fp); - return CUBIT_FAILURE; - } - - if (append_to_facet_list) - { - tfacet_list.append( facet_ptr ); - } - else - { - distinct_ntri--; - } - } - ntri=distinct_ntri; - fclose(fp); - return CUBIT_SUCCESS; - } + fclose( fp ); + return CUBIT_SUCCESS; } -//=========================================================================== -//Function Name: import_facets -//Member Type: PUBLIC -//Description: import facets and create geometry -//=========================================================================== -CubitStatus OCCQueryEngine::import_facets( - const char *file_name, // to be read - CubitBoolean use_feature_angle, // to define where surfaces are broken - double feature_angle, // angle where surfaces are broken (degrees) - double tolerance, // for stl files loading - int interp_order, // Facet representation 1= linear, 4= Bezier - CubitBoolean smooth_non_manifold, // continutiy accross non-manifold edges - CubitBoolean split_surfaces, // break facet rep at surface boundaries - CubitBoolean stitch, // attempt to stitch together facets at the boundary - CubitBoolean improve, // smooth, swap and collapse to improve quality - DLIList<CubitQuadFacet *> &quad_facet_list, // return quad facets - DLIList<CubitFacet *> &tri_facet_list, // return tri facets - DLIList<Surface *> &surface_list, // return list of surfaces - FacetFileFormat file_format ) -{ - DLIList <CubitFacet *>tfacet_list; - DLIList <CubitQuadFacet *>qfacet_list; - DLIList <CubitPoint *>point_list; - ShellSM *shell_ptr; - DLIList<ShellSM*> shell_list; - Lump *lump_ptr; - DLIList<Lump*> lump_list; - BodySM *bodysm_ptr; - Body *body_ptr; - GeometryQueryTool *gti = GeometryQueryTool::instance(); - OCCShell* facet_shell; - DLIList<DLIList<CubitFacet *> *> shell_facet_list; - int ishell, ii; - CubitBoolean is_water_tight = CUBIT_TRUE; - - // read the facets from a file - - int *conn = NULL; - int npoints = 0; - int nfacets = 0; - int nquad = 0; - int ntri = 0; - - int prev_vert; - int prev_edge; - int prev_face; - int prev_vol; - int prev_bod; - - long stl_seek_address=0; - bool stl_multiple_parts = true; - - CubitStatus rv; - // Here we add the capability to read stl files with more than one part. - while ( stl_multiple_parts == true ) { - stl_multiple_parts = false; - prev_vert = gti->num_ref_vertices(); - prev_edge = gti->num_ref_edges(); - prev_face = gti->num_ref_faces(); - prev_vol = gti->num_ref_volumes(); - prev_bod = gti->num_bodies(); - switch (file_format) - { - case STL_FILE: - tfacet_list.clean_out(); // In case there are multiple parts in the stl file - point_list.clean_out(); - shell_list.clean_out(); - lump_list.clean_out(); - shell_facet_list.clean_out(); - if (tolerance>0) - { - rv = read_facets_stl_tolerance(tfacet_list, point_list, file_name, npoints, ntri, stl_seek_address, tolerance); - } - else - { - rv = read_facets_stl(tfacet_list, point_list, file_name, npoints, ntri, stl_seek_address); - } - PRINT_INFO(" %d facets read.\n", ntri); - if ( (rv == CUBIT_SUCCESS) && (stl_seek_address) > 0 ) stl_multiple_parts = true; - nfacets = ntri; - - if (rv != CUBIT_SUCCESS) - { - goto end_import_facets; - } - break; - - case CUBIT_FACET_FILE: - case AVS_FILE: - rv = read_facets( file_name, conn, npoints, nquad, ntri, file_format ); - - nfacets = ntri + nquad; - - if (rv != CUBIT_SUCCESS) - goto end_import_facets; - - // make cubit facet entities from the points and connectivity - - if (nquad > 0) - rv = make_facets(conn, nfacets, qfacet_list); - if (ntri > 0) - rv = make_facets(conn, nfacets, tfacet_list); - if (rv != CUBIT_SUCCESS) - goto end_import_facets; - get_all_hash_points(point_list); - delete_hash_points(); - break; - case CHOLLA_FILE: - rv = read_cholla_file( file_name, feature_angle, point_list, tfacet_list ); - nquad = 0; - ntri = tfacet_list.size(); - npoints = point_list.size(); - break; - case FROM_FACET_LIST: - tfacet_list = tri_facet_list; - qfacet_list = quad_facet_list; - if (tfacet_list.size() + qfacet_list.size() == 0) - { - PRINT_ERROR("No facets found to build geometry\n"); - rv = CUBIT_FAILURE; - goto end_import_facets; - } - break; - default: - assert(0); // unrecognized file format - break; - } - - if (tfacet_list.size() + qfacet_list.size() == 0) - { - PRINT_ERROR("No facets read from file %s.\n", file_name); - rv = CUBIT_FAILURE; - goto end_import_facets; - } - else - { - PRINT_INFO("Building facet-based geometry from %d facets...\n", - tfacet_list.size() + qfacet_list.size() ); - } - -// if (fix) -// { -// rv = check_facets( point_list, tfacet_list ); -// } - - if (0) - { - // Call function to generate an x-y-z file for a CTH/SPH simulation - // the following is an exampl call... - //make_sph( point_list, tfacet_list, 100.0, "fem1-sph100.xyz" ); - } - - if (0) - { - // This is an example of using the export_facets function. Writes - // a facet file of all facets in the list - - //commented out because otherwise it's a compiler warning. - -// char filename[128]; -// strcpy(filename, "my_test.facets"); -// export_facets(tfacet_list,filename); - } - - - // split the facets into shells if needed - - rv = FacetDataUtil::split_into_shells(tfacet_list, qfacet_list, - shell_facet_list, is_water_tight); - if (rv != CUBIT_SUCCESS) - { - PRINT_ERROR("Error processing facets from %s.\n", file_name); - goto end_import_facets; - } - - // if the facets aren't watertight, see if they can be merged - - if (!is_water_tight && stitch) - { - rv = FacetDataUtil::stitch_facets(shell_facet_list, - GEOMETRY_RESABS, - is_water_tight); - if (rv != CUBIT_SUCCESS) - { - PRINT_WARNING("Couldn't stitch facets.\n"); - } - } - - DLIList <CubitFacet *> *facet_list_ptr; - if (improve) - { - for (ishell = 0; ishell < shell_facet_list.size(); ishell++) - { - facet_list_ptr = shell_facet_list.get_and_step(); - rv = FacetDataUtil::collapse_short_edges( *facet_list_ptr, CUBIT_TRUE ); - if (rv != CUBIT_SUCCESS) - { - PRINT_WARNING("Couldn't improve facets.\n"); - } - } - } - - // create the surface geometry - - if (!use_feature_angle) - feature_angle = -1.0; - - for (ishell = 0; ishell < shell_facet_list.size(); ishell++) - { - DLIList <Surface *> shell_surfaces; - DLIList <CubitPoint *> mypoint_list; - facet_list_ptr = shell_facet_list.get_and_step(); - rv = OCCModifyEngine::instance()->build_facet_surface( NULL, - *facet_list_ptr, mypoint_list, - feature_angle, interp_order, - smooth_non_manifold, - split_surfaces, shell_surfaces); - if (rv != CUBIT_SUCCESS || shell_surfaces.size() == 0) - { - PRINT_ERROR("Couldn't build facet based geometry from facets in %s\n", file_name); - rv = CUBIT_FAILURE; - goto end_import_facets; - } - - // make a shell out of these surfaces - - rv = OCCModifyEngine::instance()->make_facet_shell(shell_surfaces, shell_ptr); - if ( shell_ptr == NULL || rv != CUBIT_SUCCESS ) - { - PRINT_ERROR("Problems building facet based shell entity.\n"); - rv = CUBIT_FAILURE; - goto end_import_facets; - } - - //Set the sense for the surfaces (will be cofaces) on this shell. - //Assumption: The sense is always forward when creating geom from facets. - // (This may not be correct -especially with multiple shells in a body) - - facet_shell = CAST_TO( shell_ptr, OCCShell ); - for( ii = shell_surfaces.size(); ii > 0; ii-- ) - { - Surface* surf = shell_surfaces.get_and_step(); - OCCSurface* facet_surf = CAST_TO( surf, OCCSurface ); - facet_surf->set_shell_sense( facet_shell, CUBIT_FORWARD ); - } - - surface_list += shell_surfaces; - shell_list.append(shell_ptr); - } - - // make a body out of it - - rv = OCCModifyEngine::instance()->make_facet_lump(shell_list,lump_ptr); - if ( lump_ptr == NULL || rv != CUBIT_SUCCESS ) - { - PRINT_ERROR("Problems building facet based lump entity.\n"); - rv = CUBIT_FAILURE; - goto end_import_facets; - } - lump_list.append(lump_ptr); - rv = OCCModifyEngine::instance()->make_facet_body(lump_list,bodysm_ptr); - body_ptr = GeometryQueryTool::instance()->make_Body(bodysm_ptr); - - if ( body_ptr == NULL || rv != CUBIT_SUCCESS ) - { - PRINT_ERROR("Problems building facet based body entity.\n"); - rv = CUBIT_FAILURE; - goto end_import_facets; - } - - if(gti->num_bodies() - prev_bod > 1) - PRINT_INFO("Bodies successfully created.\n"); - else - PRINT_INFO("Body successfully created.\n"); - PRINT_INFO(" Number of new vertices = %d\n", gti->num_ref_vertices() - prev_vert); - PRINT_INFO(" Number of new curves = %d\n", gti->num_ref_edges() - prev_edge); - PRINT_INFO(" Number of new surfaces = %d\n", gti->num_ref_faces() - prev_face); - PRINT_INFO(" Number of new shells = %d\n", shell_facet_list.size()); - PRINT_INFO(" Number of new volumes = %d\n", gti->num_ref_volumes() - prev_vol); - PRINT_INFO(" Number of new bodies = %d\n", gti->num_bodies() - prev_bod); - - if (!is_water_tight) - { - PRINT_WARNING("Volume generated does not completely close. 3D meshing (ie. hex/tet) will not be permitted.\n"); - PRINT_INFO("Hint: In some cases the \"stitch\" option on the import command may correct the problem.\n"); - } - } // end while ( stl_multiple_parts == true ) - -end_import_facets: - if (conn != NULL) - delete [] conn; - for (ii=0; ii<shell_list.size(); ii++) - delete shell_facet_list.get_and_step(); - - quad_facet_list = qfacet_list; - tri_facet_list = tfacet_list; - return rv; -} - - - //=========================================================================== //Function Name: read_facets //Member Type: PUBLIC @@ -3554,180 +1861,6 @@ return CUBIT_FAILURE; } - PRINT_INFO("Reading facets...\n"); - - // read the number of nodes - - int id; - int nfacets = 0; - int iline = 1; - char line[128]; - if (fgets(line, 128, fp) == NULL) - { - PRINT_ERROR("Format error in facet file %s on line %d\n", file_name, iline); - fclose( fp ); - return CUBIT_FAILURE; - } - - int n = sscanf(line, "%d %d", &npoints, &nfacets); - if (n < 1 || n > 2 && file_format == CUBIT_FACET_FILE ) - { - PRINT_ERROR("Format error in facet file %s on line %d\n", file_name, iline); - fclose( fp ); - return CUBIT_FAILURE; - } - if (npoints <= 0) - { - PRINT_ERROR("Expecting number of nodes in facet file %s on line %d\n", file_name, iline); - fclose( fp ); - return CUBIT_FAILURE; - } - if (n==1) - { - nfacets = 0; - } - else if (nfacets <= 0) - { - PRINT_ERROR("Format error in facet file %s on line %d reading number of facets\n", file_name, iline); - fclose( fp ); - return CUBIT_FAILURE; - } - - if (init_hash_points( npoints ) == CUBIT_FAILURE) - { - PRINT_ERROR("Can't allocate memory for points in facet file %s on line %d\n", file_name, iline); - fclose( fp ); - return CUBIT_FAILURE; - } - - // read the nodes - - int ii; - double xx, yy, zz; - CubitPoint *new_point; - for (ii=0; ii<npoints; ii++) - { - iline++; - if (fgets(line, 128, fp)== NULL) - { - PRINT_ERROR("Format error in facet file %s on line %d\n", file_name, iline); - fclose( fp ); - return CUBIT_FAILURE; - } - - n = sscanf(line, "%d %lf %lf %lf", &id, &xx, &yy, &zz ); - if (n != 4) - { - PRINT_ERROR("Format error in facet file %s on line %d\n", file_name, iline); - PRINT_INFO(" Expecting 1 integer and 3 doubles, but instead read %d values\n", n); - fclose( fp ); - return CUBIT_FAILURE; - } - new_point = (CubitPoint *) new CubitPointData( xx, yy, zz ); - new_point->set_id( id ); - add_hash_point( new_point ); - } - - // read the number of facets - - if (nfacets == 0) - { - iline++; - if (fgets(line, 128, fp) == NULL) - { - PRINT_ERROR("Format error in facet file %s on line %d reading number of facets\n", file_name, iline); - fclose( fp ); - return CUBIT_FAILURE; - } - - n = sscanf(line, "%d", &nfacets); - if (n != 1) - { - PRINT_ERROR("Format error in facet file %s on line %d reading number of facets\n", file_name, iline); - PRINT_INFO(" Expecting <num facets>\n"); - fclose( fp ); - return CUBIT_FAILURE; - } - if (nfacets <= 0) - { - PRINT_ERROR("Format error in facet file %s on line %d reading number of facets\n", file_name, iline); - fclose( fp ); - return CUBIT_FAILURE; - } - } - - conn = new int [4*nfacets]; - if (!conn) - { - PRINT_ERROR("Can't allocate memory for facets in facet file %s on line %d\n", file_name, iline); - fclose( fp ); - return CUBIT_FAILURE; - } - ntri = nquad = 0; - - // read the facets - - for (ii=0; ii<nfacets; ii++) - { - iline++; - if (fgets(line, 128, fp) == NULL) - { - PRINT_ERROR("Format error in facet file %s on line %d\n", file_name, iline); - fclose( fp ); - return CUBIT_FAILURE; - } - - if( AVS_FILE == file_format ) - { - n = sscanf( line, "%d %*d %*s %d %d %d %d", &id, &conn[4*ii], - &conn[4*ii+1], &conn[4*ii+2], &conn[4*ii+3] ); - - if( n < 4 || n > 5 ) - { - PRINT_ERROR("Format error in avs file %s on line %d reading facets\n", file_name, iline); - PRINT_INFO("Expecting 6 or 7 values, but instead read %d values\n", n); - fclose( fp ); - return CUBIT_FAILURE; - } - - //duplicate the point - if( n == 4 ) - { - conn[4*ii+3] = conn[4*ii+2]; - ntri++; - } - else - { - nquad++; - } - } - else - { - n = sscanf(line, "%d %d %d %d %d", &id, &conn[4*ii], &conn[4*ii+1], - &conn[4*ii+2], &conn[4*ii+3] ); - - if (n < 4 || n > 5) - { - PRINT_ERROR("Format error in facet file %s on line %d reading facets\n", file_name, iline); - PRINT_INFO(" Expecting 4 or 5 integers, but instead read %d values\n", n); - PRINT_INFO(" For example: <id> <i0> <i1> <i2> [<i3>]\n"); - fclose( fp ); - return CUBIT_FAILURE; - } - - // for triangles -- duplicate the point - if (n==4) - { - conn[4*ii+3] = conn[4*ii+2]; - ntri++; - } - else - { - nquad++; - } - } - } - fclose( fp ); return CUBIT_SUCCESS; } @@ -3744,232 +1877,10 @@ DLIList<CubitFacet *> &facet_list ) { - - double angle = 135.0; - int num_tri = 0; - int num_quad = 0; - int num_edge = 0; - int num_vert = 0; - int* tri_edge = NULL; - int* quad_edge = NULL; - int* edge_vert = NULL; - double* vert = NULL; - double* edge_ctrl_pts = NULL; - double* tri_ctrl_pts = NULL; - double* quad_ctrl_pts = NULL; - int results_included = 0; - - // importMesh and resolveFaceVectors are in Cholla.h - - importMesh(file_name, &results_included, &angle, &num_tri, &num_quad, &num_edge, - &num_vert, &tri_edge, &quad_edge, &edge_vert, &vert, - &edge_ctrl_pts, &tri_ctrl_pts, &quad_ctrl_pts); - - feature_angle = angle; - - // create the points - - CubitPoint **point_array = new CubitPoint * [num_vert]; - double x, y, z; - int ii; - - for (ii=0; ii<num_vert; ii++) - { - x = vert[ii*3]; - y = vert[ii*3 + 1]; - z = vert[ii*3 + 2]; - point_array[ii] = (CubitPoint *) new CubitPointData( x, y, z ); - point_list.append( point_array[ii] ); - } - - // create the edges - - CubitFacetEdge **edge_array = new CubitFacetEdge * [num_edge]; - int ip, jp; - for (ii=0; ii<num_edge; ii++) - { - ip = edge_vert[ii*2]; - jp = edge_vert[ii*2 + 1]; - assert(ip < num_vert && jp < num_vert && ip >= 0 && jp >= 0); - edge_array[ii] = (CubitFacetEdge *) new CubitFacetEdgeData( point_array[ip], - point_array[jp] ); - } - - // create the tri facets - - int begin_face; - int jj, iedge; - CubitFacetEdge *edges[4]; - CubitFacet *facet_ptr = NULL; - CubitQuadFacet *qfacet_ptr = NULL; - for (ii=0; ii<num_tri; ii++) - { - begin_face = 3 * ii; - for(jj=0; jj<3; jj++) - { - iedge = tri_edge[begin_face+jj]; - edges[jj] = edge_array[iedge]; - } - facet_ptr = (CubitFacet *) - new CubitFacetData(edges[0], edges[1], edges[2]); - facet_list.append(facet_ptr); - } - - // create the quad facets - - for (ii=0; ii<num_quad; ii++) - { - begin_face = 4 * ii; - for(jj=0; jj<4; jj++) - { - iedge = quad_edge[begin_face+jj]; - edges[jj] = edge_array[iedge]; - } - qfacet_ptr = (CubitQuadFacet *) - new CubitQuadFacetData(edges[0], edges[1], edges[2], edges[3]); - facet_list.append(qfacet_ptr->get_tri_facet(0)); - facet_list.append(qfacet_ptr->get_tri_facet(1)); - } - - // delete the temp arrays - - delete [] point_array; - delete [] edge_array; - delete [] tri_edge; - delete [] quad_edge; - delete [] edge_vert; - delete [] vert; - delete [] edge_ctrl_pts; - delete [] tri_ctrl_pts; - delete [] quad_ctrl_pts; - return CUBIT_SUCCESS; } -//=========================================================================== -//Function Name: is_close -// -//Member Type: PRIVATE -//Description: determine if one of the facets in the list is within a -// certain distance of the point. -//=========================================================================== -CubitBoolean -OCCQueryEngine::is_close(CubitVector &this_point, - DLIList<CubitFacet *>&facet_list, - CubitFacet *&lastFacet, - double tol) -{ - CubitBoolean isclose = CUBIT_FALSE; - CubitBox bbox; - CubitVector close_point; - CubitFacet *facet; - int ii; - - // set the first facet to be checked as the last one located - - if (lastFacet) { - if (!facet_list.move_to(lastFacet)) { - facet_list.reset(); - } - } - else { - facet_list.reset(); - } - - CubitBoolean done = CUBIT_FALSE; - - // define a bounding box around the point - - CubitVector ptmin( this_point.x() - tol, - this_point.y() - tol, - this_point.z() - tol ); - CubitVector ptmax( this_point.x() + tol, - this_point.y() + tol, - this_point.z() + tol ); - - for ( ii = facet_list.size(); ii > 0 && !done; ii-- ) { - facet = facet_list.get_and_step(); - - // Try to trivially reject this facet with a bounding box test - - bbox = facet->bounding_box(); - if (ptmax.x() < bbox.minimum().x() || - ptmin.x() > bbox.maximum().x()) { - continue; - } - if (ptmax.y() < bbox.minimum().y() || - ptmin.y() > bbox.maximum().y()) { - continue; - } - if (ptmax.z() < bbox.minimum().z() || - ptmin.z() > bbox.maximum().z()) { - continue; - } - - // Only facets that pass the bounding box test will get past here! - - // Project point to plane of the facet and determine its area coordinates - - CubitVector pt_on_plane; - double dist_to_plane; - FacetEvalTool::project_to_facet_plane( facet, this_point, pt_on_plane, dist_to_plane ); - - CubitVector areacoord; - FacetEvalTool::facet_area_coordinate( facet, pt_on_plane, areacoord ); - - // If sign of areacoords are all positive then its inside the triangle - // and we are done - go interpolate the point. (use an absolute - // tolerance since the coordinates arenormalized) - - if (areacoord.x() > -GEOMETRY_RESABS && - areacoord.y() > -GEOMETRY_RESABS && - areacoord.z() > -GEOMETRY_RESABS) { - FacetEvalTool::eval_facet( facet, areacoord, &close_point, NULL ); - } - - // otherwise find the closest vertex or edge to the projected point - - else if (areacoord.x() < GEOMETRY_RESABS) { - if (areacoord.y() < GEOMETRY_RESABS) { - FacetEvalTool::eval_point( facet, 2, close_point ); - } - else if(areacoord.z() < GEOMETRY_RESABS) { - FacetEvalTool::eval_point( facet, 1, close_point ); - } - else { - FacetEvalTool::eval_edge( facet, 1, 2, pt_on_plane, close_point ); - } - } - else if (areacoord.y() < GEOMETRY_RESABS) { - if (areacoord.z() < GEOMETRY_RESABS) { - FacetEvalTool::eval_point( facet, 0, close_point ); - } - else { - FacetEvalTool::eval_edge( facet, 2, 0, pt_on_plane, close_point); - } - } - else { - FacetEvalTool::eval_edge( facet, 0, 1, pt_on_plane, close_point ); - } - - // keep track of the minimum distance - - double dist = sqrt(sqr(close_point.x() - this_point.x()) + - sqr(close_point.y() - this_point.y()) + - sqr(close_point.z() - this_point.z())); - if (dist <= tol) { - done = CUBIT_TRUE; - isclose = CUBIT_TRUE; - lastFacet = facet; - } - } - return isclose; -} - - - - //============================================================================= // Function Name: export_facets // Member Type: PUBLIC @@ -3990,192 +1901,12 @@ return CUBIT_FAILURE; } - // make list of all points - - CubitPoint *point_ptr; - CubitFacet *facet_ptr; - DLIList<CubitPoint*>temp_point_list; - int ii, jj; - for (ii=0; ii<facet_list.size(); ii++) - { - facet_ptr = facet_list.get_and_step(); - for(jj=0; jj<3; jj++) - { - point_ptr = facet_ptr->point(jj); - point_ptr->marked(-1); - temp_point_list.append(point_ptr); - } - } - - // assign ids to points and make list unique - - int id = 0; - DLIList<CubitPoint*>point_list; - for (ii=0; ii<temp_point_list.size(); ii++) - { - point_ptr = temp_point_list.get_and_step(); - if (point_ptr->marked() == -1) - { - point_ptr->marked(id++); - point_list.append( point_ptr ); - } - } - - // write the points - - CubitVector coords; - fprintf(fp, "%d\n", point_list.size()); - point_list.reset(); - for(ii=0; ii<point_list.size(); ii++) - { - point_ptr = point_list.get_and_step(); - coords = point_ptr->coordinates(); - fprintf(fp,"%d %f %f %f\n", ii, coords.x(), coords.y(), coords.z()); - } - - // write the facets - - int indx[3]; - fprintf(fp, "%d\n", facet_list.size()); - for (ii=0; ii<facet_list.size(); ii++) - { - facet_ptr = facet_list.get_and_step(); - for (jj=0; jj<3; jj++) - { - indx[jj] = facet_ptr->point(jj)->marked(); - } - fprintf(fp,"%d %d %d %d\n", ii, indx[0], indx[1], indx[2]); - } - - //- unmark the points - - for (ii=0; ii<point_list.size(); ii++) - point_list.get_and_step()->marked(0); - fclose(fp); return CUBIT_SUCCESS; } -//============================================================================= -//Function: init_hash_point (PRIVATE) -//Description: create a hash array of all points. They are hashed based on the -// id of the point -//Author: sjowen -//Date: 4/3/01 -//============================================================================= -CubitStatus OCCQueryEngine::init_hash_points( int num_points ) -{ - /* === find the next highest prime number */ - hashPointSize = num_points / 10; - int i; - if (hashPointSize < 13) hashPointSize = 13; - else - { - i=2; - while (i<hashPointSize*0.5 + 1) { - if (hashPointSize % i == 0) { - i=2; - hashPointSize++; - } - else { - i++; - } - } - } - hashPointArray = new DLIList<CubitPoint*>[hashPointSize]; - - return CUBIT_SUCCESS; -} - -//============================================================================= -//Function: add_hash_point (PRIVATE) -//Description: hash the point into the hash table -//Author: sjowen -//Date: 4/3/02 -//============================================================================= -CubitStatus OCCQueryEngine::add_hash_point( CubitPoint *point_ptr ) -{ - int id = point_ptr->id(); - int key = get_hash_key( id ); - hashPointArray[key].append( point_ptr ); - return CUBIT_SUCCESS; -} - -//============================================================================= -//Function: get_hash_point (PRIVATE) -//Description: retreive the CubitPoint pointer from the id -//Author: sjowen -//Date: 4/3/02 -//============================================================================= -CubitPoint *OCCQueryEngine::get_hash_point( int id ) -{ - int key = get_hash_key( id ); - int ii; - int found = 0; - CubitPoint *point_ptr; - for (ii=0; ii<hashPointArray[key].size() && !found; ii++) - { - point_ptr = hashPointArray[key].get_and_step(); - if (point_ptr->id() == id) - { - return point_ptr; - } - } - return (CubitPoint*)NULL; -} - -//============================================================================= -//Function: delete_hash_points (PRIVATE) -//Description: delete the hash points stuff -//Author: sjowen -//Date: 4/3/02 -//============================================================================= -void OCCQueryEngine::delete_hash_points( ) -{ - if (hashPointArray) - delete [] hashPointArray; - hashPointArray = NULL; - hashPointSize = 0; -} - -//============================================================================= -//Function: get_hash_key (PRIVATE) -//Description: -//Author: sjowen -//Date: 4/3/02 -//============================================================================= -int OCCQueryEngine::get_hash_key( int id ) -{ - int key = id % hashPointSize; - return key; -} - //=========================================================================== -//Function Name: get_all_hash_points -//Member Type: PUBLIC -//Description: makes a single list from all points in the hash table -//=========================================================================== -CubitStatus OCCQueryEngine::get_all_hash_points( - DLIList<CubitPoint *> &point_list ) // return point list -{ - CubitStatus rv = CUBIT_SUCCESS; - - int ii, jj; - CubitPoint *point_ptr; - for(jj=0; jj<hashPointSize; jj++) - { - for (ii=0; ii<hashPointArray[jj].size(); ii++) - { - point_ptr = hashPointArray[jj].get_and_step(); - point_list.append(point_ptr); - } - } - - return rv; -} - -//=========================================================================== //Function Name: save_facets //Member Type: PUBLIC //Description: save the facets from the entities to a Cubit file @@ -4242,7 +1973,7 @@ for (ii=facet_surfaces.size(); ii--; ) { fsurf_ptr = facet_surfaces.get_and_step(); - FacetEvalTool *feval_tool = fsurf_ptr->get_eval_tool(); + FacetEvalTool *feval_tool; //= fsurf_ptr->get_eval_tool(); if( feval_tool ) { feval_tool->set_output_id( ft_id++ ); @@ -4650,181 +2381,7 @@ return CUBIT_SUCCESS; } -//=========================================================================== -//Function Name: gather_facets -//Member Type: PUBLIC -//Description: get a unique list of facets from the entities -//Author: sjowen -//Date: 1/16/2003 -//=========================================================================== -CubitStatus OCCQueryEngine::gather_facets( - DLIList<OCCSurface *> facet_surfaces, - DLIList<OCCCurve *> facet_curves, - DLIList<OCCPoint *> facet_points, - DLIList<CubitFacet *> &facet_list, // return unique list of facets - DLIList<CubitFacetEdge *> &edge_list, // return unique list of edges - DLIList<CubitPoint *> &point_list) // return unique list of points -{ - int ii, jj, kk; - OCCSurface *fsurf_ptr; - OCCCurve *fcurv_ptr; - OCCPoint *fpoint_ptr; - DLIList<CubitFacet *>temp_facets; - DLIList<CubitPoint *>temp_points; - DLIList<CubitFacetEdge *>temp_edges; - CubitFacet *facet_ptr; - CubitFacetEdge *edge_ptr; - CubitPoint *cp_ptr; - - //unmark facets/edges/points on surface - for(ii=facet_surfaces.size(); ii--;) - { - fsurf_ptr = facet_surfaces.get_and_step(); - temp_facets.clean_out(); - temp_points.clean_out(); - fsurf_ptr->get_my_facets(temp_facets, temp_points); - for(jj=0; jj<temp_facets.size(); jj++) - { - facet_ptr = temp_facets.get_and_step(); - facet_ptr->marked( 0 ); - for (kk=0; kk<3; kk++) - { - edge_ptr = facet_ptr->edge( kk ); - edge_ptr->marked( 0 ); - } - } - for (jj=0; jj<temp_points.size(); jj++) - { - cp_ptr = temp_points.get_and_step(); - cp_ptr->marked( 0 ); - } - } - - //unmark facet-edges/points on curves - for(ii=facet_curves.size(); ii--; ) - { - fcurv_ptr = facet_curves.get_and_step(); - temp_edges.clean_out(); - fcurv_ptr->get_facets( temp_edges ); - for (jj=0; jj<temp_edges.size(); jj++) - { - edge_ptr = temp_edges.get_and_step(); - edge_ptr->marked( 0 ); - edge_ptr->point( 0 )->marked( 0 ); - edge_ptr->point( 1 )->marked( 0 ); - } - } - - //unmark facet-points on points - for(ii=facet_points.size(); ii--; ) - { - fpoint_ptr = facet_points.get_and_step(); - if (fpoint_ptr != NULL) - { - cp_ptr = fpoint_ptr->get_cubit_point(); - cp_ptr->marked( 0 ); - } - } - - - // make unique lists - for(ii=facet_surfaces.size(); ii--;) - { - fsurf_ptr = facet_surfaces.get_and_step(); - temp_facets.clean_out(); - temp_points.clean_out(); - fsurf_ptr->get_my_facets(temp_facets, temp_points); - for(jj=0; jj<temp_facets.size(); jj++) - { - facet_ptr = temp_facets.get_and_step(); - if (0 == facet_ptr->marked()) - { - facet_ptr->marked( 1 ); - facet_list.append( facet_ptr ); - } - for (kk=0; kk<3; kk++) - { - edge_ptr = facet_ptr->edge( kk ); - if (0 == edge_ptr->marked()) - { - edge_ptr->marked( 1 ); - edge_list.append( edge_ptr ); - } - } - } - for (jj=0; jj<temp_points.size(); jj++) - { - cp_ptr = temp_points.get_and_step(); - if (0 == cp_ptr->marked()) - { - cp_ptr->marked(1); - point_list.append( cp_ptr ); - } - } - } - - for(ii=facet_curves.size(); ii--;) - { - fcurv_ptr = facet_curves.get_and_step(); - temp_edges.clean_out(); - fcurv_ptr->get_facets( temp_edges ); - for (jj=0; jj<temp_edges.size(); jj++) - { - edge_ptr = temp_edges.get_and_step(); - if (0 == edge_ptr->marked()) - { - edge_ptr->marked(1); - edge_list.append( edge_ptr ); - for (kk=0; kk<2; kk++) - { - cp_ptr = edge_ptr->point( kk ); - if (0 == cp_ptr->marked()) - { - cp_ptr->marked(1); - point_list.append(cp_ptr); - } - } - } - } - } - - for(ii=facet_points.size(); ii--;) - { - fpoint_ptr = facet_points.get_and_step(); - cp_ptr = fpoint_ptr->get_cubit_point(); - if (0 == cp_ptr->marked()) - { - cp_ptr->marked( 1 ); - point_list.append( cp_ptr ); - } - } - - // set the IDs of the facet entities and clear the marks - facet_list.reset(); - for (ii=0; ii<facet_list.size(); ii++) - { - facet_ptr = facet_list.get_and_step(); - facet_ptr->set_id(ii); - facet_ptr->marked(0); - } - edge_list.reset(); - for (ii=0; ii<edge_list.size(); ii++) - { - edge_ptr = edge_list.get_and_step(); - edge_ptr->set_id(ii); - edge_ptr->marked(0); - } - for (ii=0; ii<point_list.size(); ii++) - { - cp_ptr = point_list.get_and_step(); - cp_ptr->set_id(ii); - cp_ptr->marked(0); - } - - return CUBIT_SUCCESS; -} - //============================================================================= //Function: create_super_facet_bounding_box(PUBLIC) //Description: Find the bounding box of a list of BodySMs @@ -4873,7 +2430,7 @@ facet_surface = facet_surf_list.get_and_step(); facet_list.clean_out(); point_list.clean_out(); - facet_surface->get_my_facets(facet_list,point_list); + //facet_surface->get_my_facets(facet_list,point_list); status = FacetDataUtil::get_bbox_of_points(point_list,surf_bbox); if ( j == 0 ) total_box = surf_bbox; else @@ -4946,18 +2503,12 @@ CubitBoolean OCCQueryEngine::bodies_overlap (BodySM * body_ptr_1, BodySM * body_ptr_2 ) const { -FacetboolInterface *fbint; -CubitFacetboolOp op = CUBIT_FB_INTERSECTION; -bool keep_old = true; -CubitStatus status; -BodySM* body_out = 0; -bool intersection_found; - fbint = new FacetboolInterface; - status = fbint->dofacetboolean_2bodies(body_ptr_1,body_ptr_2,body_out, - keep_old,intersection_found,op); - if ( status == CUBIT_FAILURE ) return CUBIT_FALSE; - else return CUBIT_TRUE; + return CUBIT_TRUE; } +CubitBoolean OCCQueryEngine::volumes_overlap (Lump *lump1, Lump *lump2 ) const +{ +} + //EOF Modified: cgm/trunk/geom/OCC/OCCQueryEngine.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCQueryEngine.hpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCQueryEngine.hpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -32,7 +32,7 @@ #include "CubitFileIOWrapper.hpp" #include "GeometryQueryEngine.hpp" -#include <TopTools_DataMapOfShapeInteger.hxx> +#include "TopTools_DataMapOfShapeInteger.hxx" #include <map> // ********** END CUBIT INCLUDES ********** @@ -188,8 +188,9 @@ int& number_points, int& number_facets, GMem* gMem, - unsigned short normal_tolerance, - double distance_tolerance) const; + unsigned short normal_tolerance = 15, + double distance_tolerance = 0, + double longest_edge = 0) const; virtual CubitStatus get_graphics( Curve* curve_ptr, int& num_points, GMem* gMem = NULL, @@ -497,6 +498,7 @@ static TopologyBridge* occ_to_cgm(TopoDS_Shape shape); + virtual CubitBoolean volumes_overlap (Lump *lump1, Lump *lump2 ) const ; protected: OCCQueryEngine(); Modified: cgm/trunk/geom/OCC/OCCShell.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCShell.cpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCShell.cpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -14,7 +14,7 @@ // ********** BEGIN STANDARD INCLUDES ********** #include <stddef.h> // ********** END STANDARD INCLUDES ********** - +#include "config.h" // ********** BEGIN CUBIT INCLUDES ********** #include "CastTo.hpp" #include "CubitUtil.hpp" @@ -377,7 +377,8 @@ return CUBIT_PNT_BOUNDARY; //find the closest facet on that surface to input_point - CubitFacet *closest_facet = closest_surf->get_eval_tool()->closest_facet( closest_location ); + CubitFacet *closest_facet ; + //= closest_surf->get_eval_tool()->closest_facet( closest_location ); //get the coordinates of the closest point CubitPoint *pt1, *pt2; @@ -463,7 +464,7 @@ for (i = mySurfs.size(); i--; ) { OCCSurface* surf = dynamic_cast<OCCSurface*>(mySurfs.next(i)); - surf->tris(facet_list); + //surf->tris(facet_list); } //should be unique... doesn't hurt anything if it isn't //facet_list.uniquify_ordered(); Modified: cgm/trunk/geom/OCC/OCCShell.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCShell.hpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCShell.hpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -25,7 +25,7 @@ #include "CubitDefines.h" #include "ShellSM.hpp" -#include <TopoDS_Shell.hxx> +#include "TopoDS_Shell.hxx" class OCCBody; class OCCLump; Modified: cgm/trunk/geom/OCC/OCCSurface.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCSurface.cpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCSurface.cpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -13,7 +13,7 @@ //------------------------------------------------------------------------- // ********** BEGIN OCC INCLUDES ********** - +#include "config.h" #include "OCCSurface.hpp" #include "RefFace.hpp" #include "OCCQueryEngine.hpp" @@ -34,7 +34,7 @@ #include "CubitSimpleAttrib.hpp" #include "CubitVector.hpp" #include "GeometryDefines.h" - +#include "CubitEvaluator.hpp" #include "CubitUtil.hpp" #include "CastTo.hpp" #include "RefVolume.hpp" @@ -1116,14 +1116,14 @@ } myLoops.clean_out(); } - +/* void OCCSurface::add_transformation( CubitTransformMatrix &tfmat ) { assert(0); if ( myEvaluator ) myEvaluator->add_transformation( tfmat ); } - +*/ // ********** END PUBLIC FUNCTIONS ********** // ********** BEGIN PROTECTED FUNCTIONS ********** Modified: cgm/trunk/geom/OCC/OCCSurface.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCSurface.hpp 2007-10-10 14:34:46 UTC (rev 1304) +++ cgm/trunk/geom/OCC/OCCSurface.hpp 2007-10-10 16:21:08 UTC (rev 1305) @@ -22,7 +22,7 @@ // ********** BEGIN OCC INCLUDES ********** #include "OCCAttribSet.hpp" -#include <TopoDS_Face.hxx> +#include "TopoDS_Face.hxx" // ********** END OCC INCLUDES ********** @@ -52,7 +52,7 @@ //// class CubitFacet; //// class CubitPoint; //// class CubitTransformMatrix; -//// class CubitEvaluator; +class CubitEvaluator; //// class CubitEvaluatorData; //// class SphereEvaluatorData; //// class CylinderEvaluatorData;
participants (1)
-
janehu@mcs.anl.gov