Files
newspark110/lib/generators/lc_makercamsvg.h
Chenwenxuan edac2715f0 init
2024-03-06 14:54:30 +08:00

155 lines
5.2 KiB
C++

/****************************************************************************
**
** This file is part of the LibreCAD project, a 2D CAD program
**
** Copyright (C) 2014 Christian Luginbühl (dinkel@pimprecords.com)
** Copyright (C) 2018 Andrey Yaromenok (ayaromenok@gmail.com)
**
**
** This program is free software; 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 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License along
** with this program; if not, write to the Free Software Foundation, Inc.,
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
**
**********************************************************************/
#ifndef LC_MAKERCAMSVG_H
#define LC_MAKERCAMSVG_H
#include <string>
#include <memory>
#include "rs_vector.h"
class RS_Arc;
class RS_Block;
class RS_Circle;
class RS_Ellipse;
class RS_Entity;
class RS_Hatch;
class RS_Image;
class RS_Insert;
class RS_Layer;
class RS_Leader;
class RS_Line;
class RS_MText;
class RS_Point;
class RS_Polyline;
class RS_Solid;
class RS_Spline;
class LC_SplinePoints;
class RS_Text;
class LC_XMLWriterInterface;
class RS_Document;
class RS_Graphic;
class LC_MakerCamSVG {
public:
LC_MakerCamSVG(LC_XMLWriterInterface* xmlWriter,
bool writeInvisibleLayers = true,
bool writeConstructionLayers = true,
bool writeBlocksInline = false,
bool convertEllipsesToBeziers = false,
bool exportImages = false,
bool convertLineTypes = false,
double defaultElementWidth = 1.0,
double defaultDashLinePatternLength = 10.0);
~LC_MakerCamSVG() = default;
bool generate(RS_Graphic* graphic);
std::string resultAsString();
private:
void write(RS_Graphic* graphic);
void writeBlocks(RS_Document* document);
void writeBlock(RS_Block* block);
void writeLayers(RS_Document* document);
void writeLayer(RS_Document* document, RS_Layer* layer);
void writeEntities(RS_Document* document, RS_Layer* layer);
void writeEntity(RS_Entity* entity);
void writeInsert(RS_Insert* insert);
void writePoint(RS_Point* point);
void writeLine(RS_Line* line);
void writePolyline(RS_Polyline* polyline);
void writeCircle(RS_Circle* circle);
void writeArc(RS_Arc* arc);
void writeEllipse(RS_Ellipse* ellipse);
void writeSpline(RS_Spline* spline);
void writeSplinepoints(LC_SplinePoints* splinepoints);
void writeCubicBeziers(const std::vector<RS_Vector> &control_points, bool is_closed);
void writeQuadraticBeziers(const std::vector<RS_Vector> &control_points, bool is_closed);
void writeImage(RS_Image* image);
std::vector<RS_Vector> calcCubicBezierPoints(const std::vector<RS_Vector> &control_points, bool is_closed);
std::vector<RS_Vector> calcQuadraticBezierPoints(const std::vector<RS_Vector> &control_points, bool is_closed);
static std::string numXml(double value);
/**
* @brief lengthXml convert length to xml string
* using lengthFactor to convert unknown units into mm
* @param value
* @return
*/
std::string lengthXml(double value) const;
RS_Vector convertToSvg(RS_Vector vector) const;
std::string svgPathClose() const;
std::string svgPathCurveTo(RS_Vector point, RS_Vector controlpoint1, RS_Vector controlpoint2) const;
std::string svgPathQuadraticCurveTo(RS_Vector point, RS_Vector controlpoint) const;
std::string svgPathLineTo(RS_Vector point) const;
std::string svgPathMoveTo(RS_Vector point) const;
std::string svgPathArc(RS_Arc* arc) const;
std::string svgPathArc(RS_Vector point, double radius_x, double radius_y, double x_axis_rotation, bool large_arc_flag, bool sweep_flag) const;
std::string svgPathAnyLineType(RS_Vector startpoint, RS_Vector endpoint, RS2::LineType type) const;
std::string getLinePattern(RS_Vector *lastPos, RS_Vector step, RS2::LineType type, double lineScale) const;
std::string getPointSegment(RS_Vector *lastPos, RS_Vector step, double lineScale)const;
std::string getLineSegment(RS_Vector *lastPos, RS_Vector step, double lineScale, bool x2 = false)const;
RS_Vector calcEllipsePointDerivative(double majorradius, double minorradius, double x_axis_rotation, double angle) const;
static double calcAlpha(double angle);
std::unique_ptr<LC_XMLWriterInterface> xmlWriter;
bool writeInvisibleLayers;
bool writeConstructionLayers;
bool writeBlocksInline;
bool convertEllipsesToBeziers;
bool exportImages;
bool convertLineTypes;
double defaultElementWidth;
double defaultDashLinePatternLength;
RS_Vector min;
RS_Vector max;
RS_Vector offset;
std::string unit;
/**
* @brief lengthFactor factor from current unit to svg length units
*/
double lengthFactor;
};
#endif