dust3d/thirdparty/cgal/CGAL-4.13/include/CGAL/IO/Dxf_reader_doubles.h

247 lines
4.9 KiB
C
Raw Normal View History

// Copyright (c) 2003-2008 INRIA Sophia-Antipolis (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org).
// You can redistribute it and/or modify it under the terms of the GNU
// General Public License as published by the Free Software Foundation,
// either version 3 of the License, or (at your option) any later version.
//
// 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.
//
// $URL$
// $Id$
// SPDX-License-Identifier: GPL-3.0+
//
// Author(s) : Monique Teillaud, Sylvain Pion, Andreas Fabri
// Partially supported by the IST Programme of the EU as a Shared-cost
// RTD (FET Open) Project under Contract No IST-2000-26473
// (ECG - Effective Computational Geometry for Curves and Surfaces)
// and a STREP (FET Open) Project under Contract No IST-006413
// (ACS -- Algorithms for Complex Shapes)
// Descriptions of the file format can be found at
// http://www.autodesk.com/techpubs/autocad/acad2000/dxf/
// http://www.tnt.uni-hannover.de/soft/compgraph/fileformats/docs/DXF.ascii
#ifndef CGAL_IO_DXF_READER_DOUBLES_H
#define CGAL_IO_DXF_READER_DOUBLES_H
#include <CGAL/license/Circular_kernel_2.h>
#include <CGAL/basic.h>
#include <iostream>
#include <string>
#include <list>
#include <map>
#include <CGAL/array.h>
namespace CGAL {
class Dxf_reader_doubles {
public:
typedef double FT;
typedef cpp11::array<double, 3> Triplet;
typedef Triplet Point_2_and_bulge;
typedef Triplet Circle_2;
typedef std::list<Triplet > Polygon;
typedef std::list<Polygon> Polygons;
typedef std::list<Circle_2> Circles;
private:
void
header(std::istream& is)
{
int n;
double xmin, ymin;
double xmax, ymax;
is >> n;
CGAL_assertion(n == 9);
char c;
is >> c;
CGAL_assertion(c == '$');
std::string str;
is >> str;
if(str == std::string("EXTMIN")){
is >> n;
CGAL_assertion(n == 10);
is >> xmin;
is >> n;
CGAL_assertion(n == 20);
is >> ymin;
}
is >> n;
CGAL_assertion(n == 9);
is >> c;
CGAL_assertion(c == '$');
is >> str;
if(str == "EXTMAX"){
is >> n;
CGAL_assertion(n == 10);
is >> xmax;
is >> n;
CGAL_assertion(n == 20);
is >> ymax;
}
}
void
skip_header(std::istream& is)
{
int n;
is >> n;
CGAL_assertion(n == 0);
std::string str;
is >> str;
CGAL_assertion(str == "SECTION");
is >> n;
CGAL_assertion(n == 2);
is >> str;
if(str == "HEADER"){
header(is);
}
is >> n;
CGAL_assertion(n == 0);
is >> str;
CGAL_assertion(str == "ENDSEC");
}
void
read_circle(std::istream& is, Circle_2& circ)
{
int n;
double cx, cy, r;
std::string str;
is >> n;
CGAL_assertion(n == 8);
is >> n;
CGAL_assertion(n == 0);
is >> n;
CGAL_assertion(n == 10);
is >> iformat(cx);
is >> n;
CGAL_assertion(n == 20);
is >> iformat(cy);
is >> n;
CGAL_assertion(n == 40);
is >> iformat(r);
FT sqr_ft(r*r);
circ = CGAL::make_array(cx,cy,sqr_ft);
}
void
read_polygon(std::istream& is, Polygon& poly)
{
int n;
double x, y, len;
std::string str;
do {
is >> n;
if(n != 0){
int m;
is >> m;
}
} while(n != 0);
do {
is >> str;
if(str == "VERTEX"){
is >> n;
CGAL_assertion(n == 8);
is >> n;
CGAL_assertion(n == 0);
is >> n;
CGAL_assertion(n == 10);
is >> iformat(x);
is >> n;
CGAL_assertion(n == 20);
is >> iformat(y);
is >> n;
len = 0;
if(n == 42){
is >> len;
} else {
CGAL_assertion(n == 0);
}
poly.push_back(CGAL::make_array(x,y, len));
}
} while (str != "SEQEND");
is >> n;
CGAL_assertion(n == 8);
is >> n;
CGAL_assertion(n == 0);
}
void
read_entities(std::istream& is, Polygons& polys, Circles& circles)
{
int n;
std::string str;
is >> n;
CGAL_assertion(n == 0);
is >> str;
CGAL_assertion(str == "SECTION");
is >> n;
is >> str;
CGAL_assertion(str == "ENTITIES");
do {
is >> n;
CGAL_assertion(n == 0);
is >> str;
if(str == "POLYLINE"){
Polygon p;
polys.push_back(p);
read_polygon(is, polys.back());
} else if(str == "CIRCLE"){
Circle_2 c;
read_circle(is,c);
circles.push_back(c);
} else if(str == "ENDSEC"){
} else {
CGAL_error_msg( "unknown entity" );
}
} while(str != "ENDSEC");
is >> n;
CGAL_assertion(n == 0);
is >> str;
CGAL_assertion(str == "EOF");
}
public:
void operator()(std::istream& is, Polygons& polygons, Circles& circles)
{
skip_header(is);
read_entities(is, polygons, circles);
}
};
} //namespace CGAL
#endif // CGAL_IO_DXF_READER_DOUBLES_H