/**************************************************************************** * 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