cgma
|
facets, a simple facet-based C++ driver for CGM More...
#include <math.h>
#include "AppUtil.hpp"
#include "CGMApp.hpp"
#include "GeometryQueryTool.hpp"
#include "FacetModifyEngine.hpp"
#include "FacetQueryEngine.hpp"
#include "CubitObserver.hpp"
#include "CubitPointData.hpp"
#include "CubitFacetData.hpp"
#include "TopologyBridge.hpp"
#include "DLIList.hpp"
#include "Surface.hpp"
#include "ShellSM.hpp"
#include "Lump.hpp"
#include "Body.hpp"
#include "RefFace.hpp"
#include "RefVertex.hpp"
Go to the source code of this file.
Functions | |
void | gl_cleanup () |
int | main (int argc, char **argv) |
main program - initialize, then send to proper function |
facets, a simple facet-based C++ driver for CGM
Definition in file facets.cpp.
void gl_cleanup | ( | ) |
Definition at line 31 of file facets.cpp.
{}
int main | ( | int | argc, |
char ** | argv | ||
) |
main program - initialize, then send to proper function
Definition at line 35 of file facets.cpp.
{ if (argc == 1) { PRINT_INFO("Usage: facets <angle_val>\n" " where <angle_val> is the facet dihedral angle below which a\n" " model edge will be constructed.\n"); return 0; } // first argument should be an angle double angle = atof(argv[1]); // Initialize the GeometryTool GeometryQueryTool *gqt = GeometryQueryTool::instance(); FacetModifyEngine *fme = FacetModifyEngine::instance(); DLIList<CubitFacet*> f_list; DLIList <CubitPoint*> p_list; // define some really simple facets, corresponding to the // facets for a brick typedef CubitPointData CPD; typedef CubitFacetData CFD; CPD *p1 = new CPD(0, 0, 0); CPD *p2 = new CPD(1, 0, 0); CPD *p3 = new CPD(1, 1, 0); CPD *p4 = new CPD(0, 1, 0); CPD *p5 = new CPD(0, 0, 1); CPD *p6 = new CPD(1, 0, 1); CPD *p7 = new CPD(1, 1, 1); CPD *p8 = new CPD(0, 1, 1); p_list.append(p1); p_list.append(p2); p_list.append(p3); p_list.append(p4); p_list.append(p5); p_list.append(p6); p_list.append(p7); p_list.append(p8); CFD *f1 = new CFD(p1,p3,p2); CFD *f2 = new CFD(p1,p4,p3); // xy- CFD *f3 = new CFD(p5,p6,p8); CFD *f4 = new CFD(p6,p7,p8); // xy+ CFD *f5 = new CFD(p1,p8,p4); CFD *f6 = new CFD(p1,p5,p8); // yz- CFD *f7 = new CFD(p3,p7,p6); CFD *f8 = new CFD(p3,p6,p2); // yz+ CFD *f9 = new CFD(p1,p6,p5); CFD *f10 = new CFD(p1,p2,p6); // xz- CFD *f11 = new CFD(p3,p4,p8); CFD *f12 = new CFD(p3,p8,p7); // xz+ f_list.append(f1); f_list.append(f2); f_list.append(f3); f_list.append(f4); f_list.append(f5); f_list.append(f6); f_list.append(f7); f_list.append(f8); f_list.append(f9); f_list.append(f10); f_list.append(f11); f_list.append(f12); DLIList<LoopSM*> my_loops; DLIList<Surface*> surf_list; CubitStatus result; result = fme->build_facet_surface(NULL, f_list, p_list, angle, 4, false, false, surf_list); if ( surf_list.size() == 0 || result != CUBIT_SUCCESS ) { PRINT_ERROR("Problems building mesh based surfaces.\n"); return result; } else PRINT_INFO("Constructed %d surfaces.\n", surf_list.size()); //Now build the shell. If we had it set up right this would be //in a loop. We need to store list of DLBlockSurfaceLists on each //blockvolumemesh to store the shell information. But that will //be saved for later. ShellSM *shell_ptr; result = fme->make_facet_shell(surf_list, shell_ptr); if ( shell_ptr == NULL || result != CUBIT_SUCCESS ) { PRINT_ERROR("Problems building mesh based shell entity.\n"); return result; } DLIList<ShellSM*> shell_list; shell_list.append(shell_ptr); Lump *lump_ptr; result = fme->make_facet_lump(shell_list, lump_ptr); if ( lump_ptr == NULL || result != CUBIT_SUCCESS ) { PRINT_ERROR("Problems building mesh based lump entity.\n"); return result; } DLIList<Lump*> lump_list; lump_list.append(lump_ptr); BodySM *bodysm_ptr; Body *body_ptr; result = fme->make_facet_body(lump_list, bodysm_ptr); body_ptr = GeometryQueryTool::instance()->make_Body(bodysm_ptr); if ( body_ptr == NULL || result != CUBIT_SUCCESS ) { PRINT_ERROR("Problems building mesh based body entity.\n"); return result; } if (!body_ptr) { exit(1); } PRINT_INFO("Body successfully created.\n"); PRINT_INFO("Number of vertices = %d\n", gqt->num_ref_vertices()); PRINT_INFO("Number of edges = %d\n", gqt->num_ref_edges()); PRINT_INFO("Number of faces = %d\n", gqt->num_ref_faces()); PRINT_INFO("Number of volumes = %d\n", gqt->num_ref_volumes()); PRINT_INFO("Number of bodies = %d\n", gqt->num_bodies()); // print vertex positions DLIList<RefVertex*> verts; gqt->ref_vertices(verts); int i; for (i = verts.size(); i > 0; i--) { CubitVector coords = verts.get_and_step()->coordinates(); PRINT_INFO("Vertex %d: %4.2f, %4.2f, %4.2f.\n", 8-i, coords.x(), coords.y(), coords.z()); } RefFace *face = gqt->get_first_ref_face(); // find closest point on each coordinate plane face center CubitVector test_position, result_position, normal; test_position.set(.5, .5, 0); face->find_closest_point_trimmed(test_position, result_position); normal = face->normal_at(result_position); PRINT_INFO("Point (%4.2f, %4.2f, %4.2f):\n " "closest=(%4.2f, %4.2f, %4.2f), normal=(%4.2f, %4.2f, %4.2f).\n", test_position.x(), test_position.y(), test_position.z(), result_position.x(), result_position.y(), result_position.z(), normal.x(), normal.y(), normal.z()); test_position.set(.5, .5, 1); face->find_closest_point_trimmed(test_position, result_position); normal = face->normal_at(result_position); PRINT_INFO("Point (%4.2f, %4.2f, %4.2f):\n " "closest=(%4.2f, %4.2f, %4.2f), normal=(%4.2f, %4.2f, %4.2f).\n", test_position.x(), test_position.y(), test_position.z(), result_position.x(), result_position.y(), result_position.z(), normal.x(), normal.y(), normal.z()); test_position.set(.5, 0, .5); face->find_closest_point_trimmed(test_position, result_position); normal = face->normal_at(result_position); PRINT_INFO("Point (%4.2f, %4.2f, %4.2f):\n " "closest=(%4.2f, %4.2f, %4.2f), normal=(%4.2f, %4.2f, %4.2f).\n", test_position.x(), test_position.y(), test_position.z(), result_position.x(), result_position.y(), result_position.z(), normal.x(), normal.y(), normal.z()); test_position.set(.5, 1, .5); face->find_closest_point_trimmed(test_position, result_position); normal = face->normal_at(result_position); PRINT_INFO("Point (%4.2f, %4.2f, %4.2f):\n " "closest=(%4.2f, %4.2f, %4.2f), normal=(%4.2f, %4.2f, %4.2f).\n", test_position.x(), test_position.y(), test_position.z(), result_position.x(), result_position.y(), result_position.z(), normal.x(), normal.y(), normal.z()); test_position.set(0, .5, .5); face->find_closest_point_trimmed(test_position, result_position); normal = face->normal_at(result_position); PRINT_INFO("Point (%4.2f, %4.2f, %4.2f):\n " "closest=(%4.2f, %4.2f, %4.2f), normal=(%4.2f, %4.2f, %4.2f).\n", test_position.x(), test_position.y(), test_position.z(), result_position.x(), result_position.y(), result_position.z(), normal.x(), normal.y(), normal.z()); test_position.set(1, .5, .5); face->find_closest_point_trimmed(test_position, result_position); normal = face->normal_at(result_position); PRINT_INFO("Point (%4.2f, %4.2f, %4.2f):\n " "closest=(%4.2f, %4.2f, %4.2f), normal=(%4.2f, %4.2f, %4.2f).\n", test_position.x(), test_position.y(), test_position.z(), result_position.x(), result_position.y(), result_position.z(), normal.x(), normal.y(), normal.z()); double a = 1.0/3.0; double b = 1.0/3.0; double c = 1.0/3.0; CubitVector temp_point(a,b,c); CubitVector eval_point; f1->evaluate( temp_point, &eval_point ); PRINT_INFO("Evaluation of facet 1 at (%4.2f, %4.2f, %4.2f) is " "(%4.2f, %4.2f, %4.2f).\n", a, b, c, eval_point.x(), eval_point.y(), eval_point.z() ); a = 0.0; b = 1.0; c = 0.0; temp_point.set(a,b,c); f2->evaluate( temp_point, &eval_point ); PRINT_INFO("Evaluation of facet 2 at (%4.2f, %4.2f, %4.2f) is (%4.2f, %4.2f, %4.2f).\n", a, b, c, eval_point.x(), eval_point.y(), eval_point.z() ); a = 0.5; b = 0.5; c = 0.0; temp_point.set(a,b,c); f3->evaluate( temp_point, &eval_point ); PRINT_INFO("Evaluation of facet 3 at (%4.2f, %4.2f, %4.2f) is (%4.2f, %4.2f, %4.2f).\n", a, b, c, eval_point.x(), eval_point.y(), eval_point.z() ); a = 0.0; b = 0.5; c = 0.5; temp_point.set(a,b,c); f4->evaluate( temp_point, &eval_point ); PRINT_INFO("Evaluation of facet 4 at (%4.2f, %4.2f, %4.2f) is (%4.2f, %4.2f, %4.2f).\n", a, b, c, eval_point.x(), eval_point.y(), eval_point.z() ); int ret_val = ( CubitMessage::instance()->error_count() ); FacetQueryEngine * fqe = FacetQueryEngine::instance(); DLIList<TopologyBridge*> model; model.append( (TopologyBridge*)bodysm_ptr); ModelExportOptions opts; const char *arg = "brick.facet"; fqe->export_solid_model( model, arg, FACET_TYPE, CubitString(), opts); PRINT_INFO( "Wrote %s \n", arg); return ret_val; }