Subversion Repositories display

Rev

Rev 434 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2014 Steve Ratcliffe
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3 or
 * version 2 as published by the Free Software Foundation.
 *
 * 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.
 */

package test.svg.subdiv;

import uk.me.parabola.imgfmt.app.trergn.Subdivision;

import org.dom4j.Element;
import test.svg.SvgDoc;
import test.svg.XY;

/**
 * Build a SVG document to display subdivisions.
 */

public class SvgDivDoc extends SvgDoc {
        private Element divs;
        private Element labels;

        protected void addLayers(Element svg) {
                divs = svg.addElement("g")
                                .addAttribute("inkscape:label", "subdivisions")
                                .addAttribute("inkscape:groupmode", "layer");

                labels = svg.addElement("g")
                                .addAttribute("inkscape:label", "labels")
                                .addAttribute("style", "display:none")
                                .addAttribute("inkscape:groupmode", "layer")
                ;
        }

        public XY addDiv(Subdivision div, int width, int height) {
                // Uncomment to not show empty divs
                //if (!div.hasIndPoints() && !div.hasPoints() && !div.hasPolylines() && !div.hasPolygons())
                //      return null;

                XY blc = coord(div.getLatitude() - height / 2, div.getLongitude() - width / 2);
                XY trc = coord(div.getLatitude() + height / 2, div.getLongitude() + width / 2);

                divs.addElement("rect")
                                .addAttribute("width", String.valueOf(trc.getXi() - blc.getXi()))
                                .addAttribute("height", String.valueOf(blc.getYi() - trc.getYi()))
                                .addAttribute("x", blc.getX())
                                .addAttribute("y", trc.getY())
                                .addAttribute("stroke", "black")
                                .addAttribute("stroke-width", "3")
                                .addAttribute("fill-opacity", "0.2")
                                .addAttribute("fill", "#faa")
                ;
                return blc;
        }

        public void addLabel(Subdivision div, XY blc, int npoints, int nlines, int nshapes) {
                //System.out.printf("Div:%d P:%d L:%d S:%d\n", div.getNumber(), npoints, nlines, nshapes);

                Element g = labels.addElement("g")
                                .addAttribute("transform",
                                                String.format("translate(%s,%s) scale(4)", blc.getX(), blc.getY()));

                g.addElement("rect")
                                .addAttribute("width", "50")
                                .addAttribute("height", "10")
                                .addAttribute("fill", "white")
                                .addAttribute("stroke-width", "0.1")
                                .addAttribute("stroke", "red");

                Element text = g.addElement("text")
                                .addAttribute("y", "5")
                                .addAttribute("x", "1")
                                .addAttribute("font-size", "3px");

                // Add the division number and (lat,lon)
                text.addElement("tspan")
                                .addAttribute("sodipodi:role", "line")
                                .setText(String.format("%d: %s", div.getNumber(), div.getCenter().toString()));
                // Add the numbers of points, lines and shapes (polygons).
                text.addElement("tspan")
                                .addAttribute("sodipodi:role", "line")
                                .setText(String.format("P:%d, L:%d S:%d", npoints, nlines, nshapes));
        }

        public void setTransform(int leftOffset, int topOffset) {
                int MARGIN = 0;
                String translate = String.format("translate(%d,%d)", MARGIN - leftOffset, MARGIN - topOffset);

                divs.addAttribute("transform", translate);
                labels.addAttribute("transform", translate);
        }
}