pm_file_scanner.h

来自「CGAL is a collaborative effort of severa」· C头文件 代码 · 共 332 行

H
332
字号
// Copyright (c) 1997  Tel-Aviv University (Israel).// All rights reserved.//// This file is part of CGAL (www.cgal.org); you may redistribute it under// the terms of the Q Public License version 1.0.// See the file LICENSE.QPL distributed with CGAL.//// Licensees holding a valid commercial license may use this file in// accordance with the commercial license agreement provided with the software.//// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// $Source: /CVSROOT/CGAL/Packages/Planar_map/include/CGAL/IO/Pm_file_scanner.h,v $// $Revision: 1.5 $ $Date: 2004/06/23 13:19:07 $// $Name:  $//// Author(s)     : Eti Ezra <estere@post.tau.ac.il>#ifndef CGAL_IO_PM_FILE_SCANNER_H#define CGAL_IO_PM_FILE_SCANNER_H 1#ifndef CGAL_BASIC_H#include <CGAL/basic.h>#endif#ifndef CGAL_KNOWN_BIT_SIZE_INTEGERS_H#include <CGAL/known_bit_size_integers.h>#endif#ifndef CGAL_PROTECT_CSTDDEF#include <cstddef>#define CGAL_PROTECT_CSTDDEF#endif#ifndef CGAL_IO_BINARY_FILE_IO_H#include <CGAL/IO/binary_file_io.h>#endif // CGAL_IO_BINARY_FILE_IO_H#ifndef CGAL_IO_FILE_HEADER_H#include <CGAL/IO/File_header.h>#endif // CGAL_IO_FILE_HEADER_H#ifndef CGAL_PROTECT_IOSTREAM#include <iostream>#define CGAL_PROTECT_IOSTREAM#endifCGAL_BEGIN_NAMESPACEtemplate <class PM_>class Pm_file_scanner : public File_header {public:  typedef PM_                                    Planar_map;  typedef typename Planar_map::Traits            Traits;  typedef typename Traits::Point                 Point;  typedef typename Traits::X_curve               X_curve;  typedef typename Planar_map::Dcel::Vertex	         D_vertex;  typedef typename Planar_map::Dcel::Halfedge            D_halfedge;  typedef typename Planar_map::Dcel::Face	         D_face;  Pm_file_scanner(std::istream & in) : File_header(), m_in(in)  { skip_comment(); }    Pm_file_scanner(std::istream & in, const File_header & header) :      File_header(header), m_in(in) { skip_comment(); }    std::istream& in() { return m_in; }   void scan_pm_vhf_sizes (){    std::size_t v, h, f;    in() >> v >> h >> f;    set_number_of_vertices(v);    set_number_of_halfedges(h);    set_number_of_faces(f);  }   void scan_vertex (D_vertex* v){    Point p;    skip_comment();    // providing default reading function.    in() >> p;    if ( !in()){      std::cerr << "can't read face number"<<std::endl;      in().clear( std::ios::badbit);      return;    }        skip_to_next_vertex();    if ( !in()){      std::cerr << "can't skip to next vertex"<<std::endl;      in().clear( std::ios::badbit);      return;    }        v->set_point(p);  }  X_curve scan_halfedge (D_halfedge* h){    // providing default reading function.    X_curve cv;    skip_comment();    in() >> cv;    if ( !in()){      std::cerr << "can't read face number"<<std::endl;      in().clear( std::ios::badbit);      return cv;    }        skip_to_next_halfedge();    if ( ! in()){      std::cerr << "can't skip to next halfedge"<<std::endl;      in().clear( std::ios::badbit);      return cv;    }         h->set_curve(cv);    halfedges_vec.push_back(h);    return cv;  }    //void  update_halfedges_vec(D_halfedge* h)  // {  // halfedges_vec.push_back(h);  // }  void scan_face(D_face* f) {        std::size_t  num_of_holes, num_halfedges_on_outer_ccb, i = 0;        scan_face_number(num_halfedges_on_outer_ccb, i);    if ( !in()){      std::cerr << "can't read face number"<<std::endl;      in().clear( std::ios::badbit);      return;    }        //  not an unbounded face. Scanning the outer ccb.    if (num_halfedges_on_outer_ccb > 0){      std::size_t  index, prev_index = 0, first_index = 0;            for (unsigned int j = 0; j < num_halfedges_on_outer_ccb; j++) {                scan_index(index);        if ( !in()){          std::cerr << "can't read halfedge's index on face"<<std::endl;          in().clear( std::ios::badbit);          return;        }                D_halfedge* nh = halfedges_vec[index];                // for debugging.        //std::cout<<"source of haledge : "<<nh->vertex()->point()<<std::endl;                if (j > 0) {          D_halfedge* prev_nh = halfedges_vec[prev_index];          prev_nh->set_next(nh);        }        else {          f->set_halfedge(nh);          first_index = index;        }                nh->set_face(f);                 prev_index = index;      }            // making the last halfedge point to the first one (cyclic order).      D_halfedge* nh = halfedges_vec[first_index];      D_halfedge* prev_nh = halfedges_vec[prev_index];      prev_nh->set_next(nh);    }        scan_face_number(num_of_holes, i);    if ( !in()){      std::cerr << "can't read number holes in face"<<std::endl;      in().clear( std::ios::badbit);      return;    }        // take care the hols.    for (unsigned int k = 0; k < num_of_holes; k++){      std::size_t  num_halfedges_on_inner_ccb;            scan_face_number(num_halfedges_on_inner_ccb, i);      if ( !in()){        std::cerr << "can't read number of halfedges in hole"<<std::endl;        in().clear( std::ios::badbit);        return;      }            std::size_t  index, prev_index = 0, first_index = 0;      for (unsigned int j = 0; j < num_halfedges_on_inner_ccb; j++) {        scan_index(index);        if ( !in()){          std::cerr << "can't read halfedge's index on hole"<<std::endl;          in().clear( std::ios::badbit);          return;        }                D_halfedge* nh = halfedges_vec[index];                // for debugging.        //std::cout<<"source of haledge : "<<nh->vertex()->point()<<std::endl;                if (j > 0) {          D_halfedge* prev_nh = halfedges_vec[prev_index];          prev_nh->set_next(nh);        }        else {          f->add_hole(nh);          first_index = index;        }                nh->set_face(f);                 prev_index = index;      }            // making the last halfedge point to the first one (cyclic order).      D_halfedge* nh = halfedges_vec[first_index];      D_halfedge* prev_nh = halfedges_vec[prev_index];      prev_nh->set_next(nh);    }        skip_to_next_face();    if ( !in()){      std::cerr << "can't skip to next face"<<std::endl;      in().clear( std::ios::badbit);      return;    }  }  void scan_index(std::size_t& index){         skip_comment();    skip_comment();    in() >> index;        if( ! in()) {      return;    }     index -= index_offset();  }  protected:  std::istream&               m_in;  std::vector<D_halfedge* >   halfedges_vec;    void scan_face_vertex_index(std::size_t& index , std::size_t current_face){         in() >> index;      if( ! in()) {      return;    }        index -= index_offset();        /*  if( index < 0 || index >= size_of_halfedges()) {        in().clear( std::ios::badbit);                std::cerr << " " << std::endl;        std::cerr << "File_scanner_pm::" << std::endl;        std::cerr << "scan_facet_vertex_index(): input error: "        "facet " << current_face << ": vertex index "        << index + index_offset() << ": is out of range."        << std::endl;                //set_off_header( false);        return;        }*/        //std::cout<< index <<std::endl; // for debuging.  }  void scan_face_number( std::size_t& size,  std::size_t current_face) {        CGAL_assertion( current_face < number_of_faces());        skip_comment();        in() >> size;    //std::cout<< size <<std::endl; // for debuging.  }  void skip_to_next_vertex(){    //in() >> skip_until_EOL    skip_until_EOL(in());  }    void skip_to_next_halfedge(){    skip_until_EOL(in());  }    void skip_to_next_face(){    skip_until_EOL(in());  }  void skip_comment() {     char c;    while( (in() >> c) && c == '#'){      in().putback(c);      skip_comment_OFF(in());      //in() >> skip_comment_OFF;     }    in().putback(c);  }};CGAL_END_NAMESPACE#endif // CGAL_IO_FILE_SCANNER_PM_H //// EOF //

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?