first working version
This commit is contained in:
parent
d937398944
commit
be5d721eef
|
@ -0,0 +1,225 @@
|
|||
/****************************************************************************
|
||||
* VCGLib o o *
|
||||
* Visual and Computer Graphics Library o o *
|
||||
* _ O _ *
|
||||
* Copyright(C) 2006 \/)\/ *
|
||||
* Visual Computing Lab /\/| *
|
||||
* ISTI - Italian National Research Council | *
|
||||
* \ *
|
||||
* All rights reserved. *
|
||||
* *
|
||||
* 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 (http://www.gnu.org/licenses/gpl.txt) *
|
||||
* for more details. *
|
||||
* *
|
||||
****************************************************************************/
|
||||
/****************************************************************************
|
||||
History
|
||||
|
||||
$Log: not supported by cvs2svn $
|
||||
|
||||
****************************************************************************/
|
||||
#ifndef __VCG_LIB_EXPORTER_SVG
|
||||
#define __VCG_LIB_EXPORTER_SVG
|
||||
|
||||
namespace vcg
|
||||
{
|
||||
namespace edge
|
||||
{
|
||||
namespace io
|
||||
{
|
||||
|
||||
/**
|
||||
* SVG exporter.
|
||||
*
|
||||
* This exporter save a mesh of EdgeMesh type in the SVG format.
|
||||
* Most of the features of the SVG format are not supported.
|
||||
* The given EdgeMesh is saved as a set lines. It is possible to
|
||||
* set the width and the color of the lines.
|
||||
*/
|
||||
template <class EdgeMeshType>
|
||||
class ExporterSVG
|
||||
{
|
||||
|
||||
// definitions
|
||||
public:
|
||||
|
||||
//! Stroke colors.
|
||||
enum StrokeColor
|
||||
{
|
||||
BLACK,
|
||||
SILVER,
|
||||
GRAY,
|
||||
WHITE,
|
||||
MAROON,
|
||||
RED,
|
||||
PURPLE,
|
||||
FUCHSIA,
|
||||
GREEN,
|
||||
LIME,
|
||||
OLIVE,
|
||||
YELLOW,
|
||||
NAVY,
|
||||
BLUE,
|
||||
TEAL,
|
||||
AQUA
|
||||
};
|
||||
|
||||
//! Stroke linecap types.
|
||||
enum StrokeLineCap
|
||||
{
|
||||
BUTT,
|
||||
ROUND,
|
||||
SQUARE
|
||||
};
|
||||
|
||||
// private data members
|
||||
private:
|
||||
|
||||
//! Line width.
|
||||
int lwidth;
|
||||
|
||||
//! Stroke color (see StrokeColor).
|
||||
std::string stroke_color;
|
||||
|
||||
//! Stroke linecap (see StrokeLineCap).
|
||||
std::string stroke_linecap;
|
||||
|
||||
// public methods
|
||||
public:
|
||||
|
||||
ExporterSVG(void)
|
||||
{
|
||||
lwidth = 5;
|
||||
stroke_color = "black";
|
||||
stroke_linecap = "round";
|
||||
}
|
||||
|
||||
static void setLineWidth(int width)
|
||||
{
|
||||
lwidth = width;
|
||||
}
|
||||
|
||||
static void setColor(enum StrokeColor color)
|
||||
{
|
||||
if (color == BLACK)
|
||||
stroke_color = "black";
|
||||
else if (color == SILVER)
|
||||
stroke_color = "silver";
|
||||
else if (color == GRAY)
|
||||
stroke_color = "gray";
|
||||
else if (color == WHITE)
|
||||
stroke_color = "white";
|
||||
else if (color == MAROON)
|
||||
stroke_color = "maroon";
|
||||
else if (color == RED)
|
||||
stroke_color = "red";
|
||||
else if (color == PURPLE)
|
||||
stroke_color = "purple";
|
||||
else if (color == FUCHSIA)
|
||||
stroke_color = "fuchsia";
|
||||
else if (color == GREEN)
|
||||
stroke_color = "green";
|
||||
else if (color == OLIVE)
|
||||
stroke_color = "olive";
|
||||
else if (color == LIME)
|
||||
stroke_color = "lime";
|
||||
else if (color == YELLOW)
|
||||
stroke_color = "yellow";
|
||||
else if (color == NAVY)
|
||||
stroke_color = "navy";
|
||||
else if (color == BLUE)
|
||||
stroke_color = "blue";
|
||||
else if (color == TEAL)
|
||||
stroke_color = "teal";
|
||||
else if (color == AQUA)
|
||||
stroke_color = "aqua";
|
||||
}
|
||||
|
||||
static void setLineCap(enum StrokeLineCap linecap)
|
||||
{
|
||||
if (linecap == BUTT)
|
||||
stroke_linecap = "butt";
|
||||
else if (linecap == ROUND)
|
||||
stroke_linecap = "round";
|
||||
else if (linecap == SQUARE)
|
||||
stroke_linecap = "square";
|
||||
}
|
||||
|
||||
bool Save(EdgeMeshType *mp, const char * filename)
|
||||
{
|
||||
FILE * o = fopen(filename,"w");
|
||||
if (o==NULL)
|
||||
return false;
|
||||
|
||||
// initial xml tags
|
||||
fprintf(o, "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n");
|
||||
fprintf(o, "<!-- Created with vcg library -->\n");
|
||||
fprintf(o, "<svg width=\"10cm\" height=\"10cm\" viewBox=\"0 0 1000 1000\" \n");
|
||||
fprintf(o, " xmlns:dc=\"http://purl.org/dc/elements/1.1/\" \n");
|
||||
fprintf(o, " xmlns:cc=\"http://web.resource.org/cc/\" \n");
|
||||
fprintf(o, " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" \n");
|
||||
fprintf(o, " xmlns:svg=\"http://www.w3.org/2000/svg\" \n");
|
||||
fprintf(o, " xmlns=\"http://www.w3.org/2000/svg\" \n");
|
||||
fprintf(o, " id=\"svg2\"> \n");
|
||||
fprintf(o, " <defs id=\"defs4\"/> \n");
|
||||
fprintf(o, " <metadata id=\"metadata7\"> \n");
|
||||
fprintf(o, " <rdf:RDF> \n");
|
||||
fprintf(o, " <cc:Work rdf:about=\"\"> \n");
|
||||
fprintf(o, " <dc:format>image/svg+xml</dc:format> \n");
|
||||
fprintf(o, " <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" /> \n");
|
||||
fprintf(o, " </cc:Work> \n");
|
||||
fprintf(o, " </rdf:RDF> \n");
|
||||
fprintf(o, " </metadata> \n");
|
||||
|
||||
Save(mp,o);
|
||||
|
||||
fprintf(o, "</svg>");
|
||||
|
||||
// final xml tags
|
||||
|
||||
fclose(o);
|
||||
return true;
|
||||
}
|
||||
|
||||
void Save(EdgeMeshType *mp, FILE* o)
|
||||
{
|
||||
EdgeMeshType::EdgeIterator i;
|
||||
|
||||
Point3f pmin = mp->bbox.min;
|
||||
float scale = 1000.0f / max(mp->bbox.DimX(), mp->bbox.DimZ());
|
||||
|
||||
// line settings
|
||||
fprintf(o, " <g stroke=\"%s\" stroke-linecap=\"%s\" > \n",
|
||||
stroke_color.c_str(), stroke_linecap.c_str());
|
||||
|
||||
for(i = mp->edges.begin(); i != mp->edges.end(); ++i)
|
||||
{
|
||||
Point3f p1 = (*i).V(0)->P();
|
||||
Point3f p2 = (*i).V(1)->P();
|
||||
|
||||
fprintf(o, " <line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" \n",
|
||||
(p1[0] - pmin[0]) * scale, (p1[2] - pmin[2]) * scale,
|
||||
(p2[0] - pmin[0]) * scale, (p2[2] - pmin[2]) * scale );
|
||||
|
||||
fprintf(o, " stroke-width = \"%d\" ",lwidth);
|
||||
fprintf(o, "/>\n");
|
||||
}
|
||||
|
||||
fprintf(o, " </g>\n");
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
}; // namespace io
|
||||
}; // namespace edge
|
||||
}; // namespace vcg
|
||||
#endif // __VCG_LIB_EXPORTER_SVG
|
Loading…
Reference in New Issue