dust3d/thirdparty/cgal/CGAL-5.1/include/CGAL/IO/Dxf_stream.h

319 lines
7.2 KiB
C
Raw Normal View History

// Copyright (c) 2007 GeometryFactory (France). All rights reserved.
//
2020-10-13 12:44:25 +00:00
// This file is part of CGAL (www.cgal.org)
//
2020-10-13 12:44:25 +00:00
// $URL: https://github.com/CGAL/cgal/blob/v5.1/Straight_skeleton_2/include/CGAL/IO/Dxf_stream.h $
// $Id: Dxf_stream.h 0779373 2020-03-26T13:31:46+01:00 Sébastien Loriot
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
//
//
// Author(s) : Fernando Cacciola
//
// Descriptions of the file format can be found at
// http://www.autodesk.com/techpubs/autocad/acad2000/dxf/
#ifndef CGAL_DXF_STREAM_H
#define CGAL_DXF_STREAM_H
#include <CGAL/basic.h>
#include <CGAL/Polygon_2.h>
#include <CGAL/IO/Dxf_writer.h>
#include <vector>
#include <fstream>
#include <stdio.h>
namespace CGAL {
class Dxf_layer
{
public:
Dxf_layer( std::string aStr ) : mStr(aStr) {}
2020-10-13 12:44:25 +00:00
std::string str() const { return mStr ; }
2020-10-13 12:44:25 +00:00
private:
2020-10-13 12:44:25 +00:00
std::string mStr ;
} ;
2020-10-13 12:44:25 +00:00
template <class Kernel_>
class Dxf_stream
{
public:
typedef Kernel_ Kernel;
2020-10-13 12:44:25 +00:00
// Define the kernel objects.
typedef typename Kernel::FT NT;
typedef typename Kernel::Point_2 Point_2;
typedef typename Kernel::Segment_2 Segment_2;
typedef typename Kernel::Ray_2 Ray_2;
typedef typename Kernel::Line_2 Line_2;
typedef typename Kernel::Triangle_2 Triangle_2;
typedef typename Kernel::Iso_rectangle_2 Iso_rectangle_2;
typedef CGAL::Polygon_2<Kernel> Polygon_2;
typedef typename Kernel::Circle_2 Circle_2;
protected:
// Data members:
Dxf_writer mWriter ;
int mDefaultDxfColor;
int mDxfColor;
2020-10-13 12:44:25 +00:00
Color mCgalColor ;
std::string mLayer ;
2020-10-13 12:44:25 +00:00
struct Color_less
{
bool operator() ( Color const& a, Color const& b ) const
{
2020-10-13 12:44:25 +00:00
return Color_value(a) < Color_value(b);
}
2020-10-13 12:44:25 +00:00
static int Color_value ( Color const& c )
{
2020-10-13 12:44:25 +00:00
return ( int(c.r()) << 16 ) + ( int(c.g()) << 8 ) + ( int(c.b()) ) ;
}
} ;
2020-10-13 12:44:25 +00:00
typedef std::map<Color,int,Color_less> Color_table ;
2020-10-13 12:44:25 +00:00
typedef typename Color_table::const_iterator Color_table_iterator ;
Color_table mColorTable ;
2020-10-13 12:44:25 +00:00
private:
// Copy constructor and assignment operator - not supported.
Dxf_stream (const Dxf_stream<Kernel>& );
const Dxf_stream<Kernel>& operator= (const Dxf_stream<Kernel>& );
public:
/// \name Constructors and destructor.
//@{
/*!
* Constructor.
* \param filename The name of the output FIG file.
*/
Dxf_stream ( std::ostream& out )
:
mWriter (out)
,mDefaultDxfColor (255)
,mDxfColor (255)
2020-10-13 12:44:25 +00:00
,mCgalColor (white())
,mLayer ("0")
{
setup_initial_color_table();
2020-10-13 12:44:25 +00:00
}
/*!
* Destructor.
*/
virtual ~Dxf_stream () {}
//@}
/// \name Accessing drawing properties.
//@{
2020-10-13 12:44:25 +00:00
/*!
* Get the current layer.
*/
std::string layer() const { return mLayer ; }
2020-10-13 12:44:25 +00:00
/*!
* Get the current CGAL color.
*/
Color color () const { return mCgalColor ; }
/*!
* Get the current DXF color.
*/
int dxf_color () const { return mDxfColor ; }
/*!
* Get the current DXF color.
*/
int default_dxf_color () const { return mDefaultDxfColor ; }
2020-10-13 12:44:25 +00:00
// @}
/// \name Set the drawing properties.
//@{
/*!
* Set the current layer.
*/
void set_layer ( std::string aLayer ) { mLayer = aLayer ; }
2020-10-13 12:44:25 +00:00
/*!
* Set the current color.
* \pre The color must be defined.
*/
void set_color ( Color aColor )
{
mCgalColor = aColor ;
2020-10-13 12:44:25 +00:00
Color_table_iterator f = mColorTable.find(aColor);
if ( f != mColorTable.end() )
mDxfColor = f->second ;
else mDxfColor = mDefaultDxfColor ;
}
/*!
* Sets the default DXF color in case a CGAL color is unmapped.
* \param aDxfColor The default DXF color.
*/
void define_default_dxf_color ( int aDxfColor )
{
mDefaultDxfColor = aDxfColor ;
}
2020-10-13 12:44:25 +00:00
/*!
* Adds a mapping between a CGAL Color and a DXF color.
* \param aCgalColor The CGAL color.
* \param aDxfColor The DXF color.
*/
void define_color ( Color const& aCgalColor, int aDxfColor )
{
mColorTable.insert( std::make_pair(aCgalColor,aDxfColor) ) ;
}
//@}
/// \name Writing objects.
//@{
/*!
* Write a 2D segment.
*/
void write_segment_2 (const Segment_2& seg)
{
mWriter.add_segment_2( seg.source(), seg.target(), mLayer, mDxfColor ) ;
}
/*!
* Write a 2D polyline.
* \param begin An iterator of the control points (of type Point_2).
* \param end A past-the-end iterator for the control points.
*/
template <class Input_iterator>
void write_polyline_2 (const Input_iterator& begin, const Input_iterator& end)
{
mWriter.add_polyline_2( begin, end, false, mLayer, mDxfColor ) ;
}
/*!
* Write a 2D polygon (there is an added segment between the last vertex and the first)
* \param begin An iterator of the control points (of type Point_2).
* \param end A past-the-end iterator for the control points.
*/
template <class Input_iterator>
void write_polygon_2 (const Input_iterator& begin, const Input_iterator& end)
{
mWriter.add_polyline_2( begin, end, true, mLayer, mDxfColor ) ;
}
2020-10-13 12:44:25 +00:00
/*!
* Write a 2D polyline but as a sequence of line segments
* \param begin An iterator of the control points (of type Point_2).
* \param end A past-the-end iterator for the control points.
*/
template <class Input_iterator>
void write_open_segment_chain_2 (const Input_iterator& begin, const Input_iterator& end)
{
mWriter.add_segments_2( begin, end, false, mLayer, mDxfColor ) ;
}
/*!
* Write a 2D closed polyline but as a sequence of line segments
* \param begin An iterator of the control points (of type Point_2).
* \param end A past-the-end iterator for the control points.
*/
template <class Input_iterator>
void write_closed_segment_chain_2 (const Input_iterator& begin, const Input_iterator& end)
{
mWriter.add_segments_2( begin, end, true, mLayer, mDxfColor ) ;
}
2020-10-13 12:44:25 +00:00
/*!
* Write a 2D (closed) polygon.
*/
void write_polygon (const Polygon_2& pgn)
{
mWriter.add_polyline_2( pgn.begin(), pgn.end(), true, mLayer, mDxfColor ) ;
}
2020-10-13 12:44:25 +00:00
//@}
/// \name Setting the draw properties via the << operator.
//@{
/*!
* Set the current layer.
*/
Dxf_stream& operator<< ( Dxf_layer const& aLayer )
{
set_layer ( aLayer.str() );
return (*this);
}
2020-10-13 12:44:25 +00:00
/*!
* Set the current color.
*/
Dxf_stream& operator<< ( Color const& aColor )
{
set_color (aColor);
return (*this);
}
2020-10-13 12:44:25 +00:00
//@}
/// \name Drawing objects via the << operator.
//@{
/*!
* Write a line segment.
*/
Dxf_stream& operator<< (const Segment_2& seg)
{
write_segment_2 (seg);
return (*this);
}
/*!
* Write a polygon.
*/
Dxf_stream& operator<< (const Polygon_2& pgn)
{
write_polygon_2 (pgn);
return (*this);
}
//@}
protected:
void setup_initial_color_table()
{
2020-10-13 12:44:25 +00:00
define_color(black(),0);
define_color(red(),1);
define_color(yellow(),2);
define_color(green(),3);
define_color(purple(),4);
define_color(blue(),5);
define_color(violet(),6);
define_color(white(),7);
define_color(gray(),8);
}
2020-10-13 12:44:25 +00:00
};
} // end namespace CGAL
#endif