Esempio n. 1
0
CSGeometry* NGInterface::loadCSG(string data)
{
    strstream in;
    CSGeometry *geom;
    Point<3> pmin(minX,minY,minZ),
             pmax(maxX,maxY,maxZ);
    Box<3> box(pmin,pmax);

    in << data;
    try
    {
        geom = ParseCSG(in);
    }
    catch(...)
    {
        cerr << "Problem in CSG-file!" << endl;
        return NULL;
    }

    if (!geom)
    {
        cout << "geo-file should start with 'algebraic3d'" << endl;
        return NULL;
    }
    else
        geom->FindIdenticSurfaces(1e-8*geom->MaxSize());
    geom->SetBoundingBox(box);
    geom->CalcTriangleApproximation(detail,facets);
    return (CSGeometry*)(geometry = geom);
}
int main()
{
  std::ifstream geometry_file;
  geometry_file.open("../data/half-trigate.geo");

  CSGeometry * geom = ParseCSG( geometry_file );


  geom->FindIdenticSurfaces(1e-8 * geom->MaxSize());

  Mesh * netgen_mesh = new Mesh();
  netgen::MeshingParameters mparams;

  geom->GenerateMesh(netgen_mesh, mparams, 1, 5);


  {
    typedef viennagrid::tetrahedral_3d_mesh MeshType;
    typedef viennagrid::tetrahedral_3d_segmentation SegmentationType;

    MeshType mesh;
    SegmentationType segmentation(mesh);


    typedef viennagrid::result_of::point<MeshType>::type PointType;
    typedef viennagrid::result_of::vertex_handle<MeshType>::type VertexHandleType;
    typedef SegmentationType::segment_handle_type SegmentType;


    int num_points = netgen_mesh->GetNP();
    int num_tets = netgen_mesh->GetNE();

    std::cout << "Num Points: " << num_points << std::endl;
    std::cout << "Num Tets: " << num_tets << std::endl;

    std::vector<VertexHandleType> vertex_handles( num_points );

    for (int i = 1; i <= num_points; ++i)
    {
      PointType vgrid_point(netgen_mesh->Point(i)[0], netgen_mesh->Point(i)[1], netgen_mesh->Point(i)[2]);
      vertex_handles[i-1] = viennagrid::make_vertex( mesh, vgrid_point );
    }


    for (int i = 0; i < num_tets; ++i)
    {
        ElementIndex ei = i;
        SegmentType segment = segmentation.get_make_segment( (*netgen_mesh)[ei].GetIndex() );
        viennagrid::make_tetrahedron( segment, vertex_handles[(*netgen_mesh)[ei][0]-1], vertex_handles[(*netgen_mesh)[ei][1]-1],
              vertex_handles[(*netgen_mesh)[ei][2]-1], vertex_handles[(*netgen_mesh)[ei][3]-1]);
    }


    viennagrid::io::vtk_writer<MeshType, SegmentationType> writer;
    writer(mesh, segmentation, "out");
  }


}