rrenkert@97: package de.intevation.mxd.writer; rrenkert@97: rrenkert@97: import java.io.IOException; rrenkert@97: import java.awt.Color; rrenkert@97: import org.apache.log4j.Logger; rrenkert@97: rrenkert@97: import org.w3c.dom.Element; rrenkert@97: import org.w3c.dom.NodeList; rrenkert@97: rrenkert@97: import edu.umn.gis.mapscript.mapObj; rrenkert@97: import edu.umn.gis.mapscript.layerObj; rrenkert@97: import edu.umn.gis.mapscript.classObj; rrenkert@97: import edu.umn.gis.mapscript.styleObj; rrenkert@97: import edu.umn.gis.mapscript.colorObj; rrenkert@97: import edu.umn.gis.mapscript.symbolObj; rrenkert@97: import edu.umn.gis.mapscript.symbolSetObj; rrenkert@97: import edu.umn.gis.mapscript.lineObj; rrenkert@97: import edu.umn.gis.mapscript.pointObj; rrenkert@97: rrenkert@97: rrenkert@97: /** rrenkert@97: * The interface to the mapfile writer. rrenkert@97: * rrenkert@97: * @author Raimund Renkert rrenkert@97: */ rrenkert@97: public class FillStyleWriter { rrenkert@97: rrenkert@97: /** rrenkert@97: * The Logger. rrenkert@97: */ rrenkert@97: private static final Logger logger = rrenkert@97: Logger.getLogger(FillStyleWriter.class); rrenkert@97: rrenkert@97: private mapObj map; rrenkert@97: private classObj cl; rrenkert@97: private styleObj style; rrenkert@97: rrenkert@97: public FillStyleWriter (mapObj map, classObj cl) { rrenkert@97: logger.debug("contructor(mapObj, classObj)"); rrenkert@97: this.map = map; rrenkert@97: this.cl = cl; rrenkert@97: this.style = new styleObj(cl); rrenkert@97: } rrenkert@97: rrenkert@97: /** rrenkert@97: * Write the content. rrenkert@97: */ rrenkert@97: public boolean write(Element symbolElement) rrenkert@97: throws Exception { rrenkert@97: symbolSetObj symbolSet = map.getSymbolset(); rrenkert@97: rrenkert@97: if(symbolElement.hasChildNodes()) { rrenkert@97: NodeList symbols = symbolElement.getChildNodes(); rrenkert@97: for (int i = 0; i < symbols.getLength(); i++) { rrenkert@97: Element nextSym = (Element)symbols.item(i); rrenkert@97: String type = nextSym.getAttribute("type"); rrenkert@97: rrenkert@97: if(((symbols.getLength() > 1 && i == 0) || rrenkert@97: (symbols.getLength() == 1 && rrenkert@97: !symbolElement.hasAttribute("hatch"))) && rrenkert@97: type.equals("line")) { rrenkert@97: writeOutline(nextSym); rrenkert@97: if (symbols.getLength() == 1) { rrenkert@97: writeSimple(symbolElement); rrenkert@97: } rrenkert@97: } rrenkert@97: else if(nextSym.getTagName().equals("symbol") && rrenkert@97: !symbolElement.hasAttribute("hatch") || rrenkert@97: (i == 1 && type.equals("marker"))) { rrenkert@97: double gap = 0; rrenkert@97: if(symbolElement.hasAttribute("xseparation")) { rrenkert@97: gap = Double.parseDouble( rrenkert@97: symbolElement.getAttribute("xseparation")); rrenkert@97: } rrenkert@97: writeMarker(nextSym, gap); rrenkert@97: } rrenkert@97: else if (nextSym.getTagName().equals("symbol") && rrenkert@97: symbolElement.hasAttribute("hatch")) { rrenkert@97: if(symbolElement.hasAttribute("angle")) { rrenkert@97: nextSym.setAttribute( rrenkert@97: "angle", rrenkert@97: symbolElement.getAttribute("angle")); rrenkert@97: } rrenkert@97: if(symbolElement.hasAttribute("separation")) { rrenkert@97: nextSym.setAttribute( rrenkert@97: "size", rrenkert@97: symbolElement.getAttribute("separation")); rrenkert@97: } rrenkert@97: writeMarker(nextSym, -1); rrenkert@97: } rrenkert@97: else { rrenkert@97: writeSimple(symbolElement); rrenkert@97: } rrenkert@97: } rrenkert@97: } rrenkert@97: else { rrenkert@97: writeSimple(symbolElement); rrenkert@97: if(symbolElement.hasAttribute("outline_color")) { rrenkert@97: Color oCol = Color.decode( rrenkert@97: symbolElement.getAttribute("outline_color")); rrenkert@97: colorObj outlineColor = new colorObj( rrenkert@97: oCol.getRed(), rrenkert@97: oCol.getGreen(), rrenkert@97: oCol.getBlue(), rrenkert@97: -4); rrenkert@97: style.setOutlinecolor(outlineColor); rrenkert@97: style.setOutlinewidth(Double.parseDouble( rrenkert@97: symbolElement.getAttribute("outline_size"))); rrenkert@97: } rrenkert@97: rrenkert@97: } rrenkert@97: rrenkert@97: return true; rrenkert@97: } rrenkert@97: rrenkert@97: /** rrenkert@97: * Write the outline for a polygon. rrenkert@97: */ rrenkert@97: private void writeOutline(Element symbolElement) rrenkert@97: throws Exception { rrenkert@97: logger.debug("writeOutline()"); rrenkert@97: //write transparent outline rrenkert@97: colorObj color = new colorObj(-1, -1, -1, -4); rrenkert@97: rrenkert@97: //write new style for the outline rrenkert@97: //TODO write further attribute like pattern etc. rrenkert@97: Color oCol = Color.decode( rrenkert@97: symbolElement.getAttribute("color")); rrenkert@97: rrenkert@97: styleObj outline = new styleObj (cl); rrenkert@97: rrenkert@97: colorObj outlinecolor = new colorObj( rrenkert@97: oCol.getRed(), rrenkert@97: oCol.getGreen(), rrenkert@97: oCol.getBlue(), rrenkert@97: -4); rrenkert@97: outline.setOutlinecolor(outlinecolor); rrenkert@97: outline.setOutlinewidth(Double.parseDouble( rrenkert@97: symbolElement.getAttribute("width"))); rrenkert@97: } rrenkert@97: rrenkert@97: /** rrenkert@97: * Write marker attributes and a symbol for the polygon fill. rrenkert@97: */ rrenkert@97: private void writeMarker(Element symbolElement, double gap) rrenkert@97: throws Exception { rrenkert@97: logger.debug("writeMarker()"); rrenkert@97: String name = symbolElement.getAttribute("name"); rrenkert@97: String type = symbolElement.getAttribute("type"); rrenkert@97: if (symbolElement.hasAttribute("angle")) { rrenkert@97: style.setAngle( rrenkert@97: Double.parseDouble(symbolElement.getAttribute("angle"))); rrenkert@97: } rrenkert@97: if(symbolElement.hasAttribute("color")) { rrenkert@97: String c = symbolElement.getAttribute("color"); rrenkert@97: Color col = Color.decode(c); rrenkert@97: colorObj color = new colorObj( rrenkert@97: col.getRed(), rrenkert@97: col.getGreen(), rrenkert@97: col.getBlue(), rrenkert@97: -4); rrenkert@97: style.setColor(color); rrenkert@97: } rrenkert@97: if (symbolElement.hasAttribute ("size")) { rrenkert@97: double size = Double.parseDouble( rrenkert@97: symbolElement.getAttribute("size")); rrenkert@97: style.setSize(size); rrenkert@97: //In arcgis the separation goes from center to center, so the gap is rrenkert@97: //the separation - size rrenkert@97: if (gap > 0) { rrenkert@97: style.setGap(gap - size); rrenkert@97: } rrenkert@97: } rrenkert@97: if(symbolElement.hasAttribute("outline_color")) { rrenkert@97: Color oCol = Color.decode( rrenkert@97: symbolElement.getAttribute("outline_color")); rrenkert@97: colorObj outlineColor = new colorObj( rrenkert@97: oCol.getRed(), rrenkert@97: oCol.getGreen(), rrenkert@97: oCol.getBlue(), rrenkert@97: -4); rrenkert@97: style.setOutlinecolor(outlineColor); rrenkert@97: style.setOutlinewidth(Double.parseDouble( rrenkert@97: symbolElement.getAttribute("outline_size"))); rrenkert@97: } rrenkert@97: rrenkert@97: if(type.equals("marker")) { rrenkert@97: style.setSymbolByName(map, name); rrenkert@97: SymbolWriter sw = new SymbolWriter(this.map, this.cl); rrenkert@97: sw.write(symbolElement); rrenkert@97: } rrenkert@97: else if(type.equals("line")) { rrenkert@97: style.setSymbolByName(map, "hatch"); rrenkert@97: SymbolWriter sw = new SymbolWriter(this.map, this.cl); rrenkert@97: symbolElement.setAttribute("name", "hatch"); rrenkert@97: sw.write(symbolElement); rrenkert@97: } rrenkert@97: } rrenkert@97: rrenkert@97: /** rrenkert@97: * Write simple fill attributes. rrenkert@97: */ rrenkert@97: private void writeSimple(Element symbolElement) { rrenkert@97: logger.debug("writeSimple(Element)"); rrenkert@97: if(symbolElement.hasAttribute("transparency")) { rrenkert@97: double value = Double.parseDouble( rrenkert@97: symbolElement.getAttribute("transparency")); rrenkert@97: int opacity = (int)(value/255) * 100; rrenkert@97: if(value >= 0) { rrenkert@97: style.setOpacity(opacity); rrenkert@97: } rrenkert@97: } rrenkert@97: if(symbolElement.hasAttribute("color")) { rrenkert@97: String c = symbolElement.getAttribute("color"); rrenkert@97: Color col = Color.decode(c); rrenkert@97: colorObj color = new colorObj( rrenkert@97: col.getRed(), rrenkert@97: col.getGreen(), rrenkert@97: col.getBlue(), rrenkert@97: -4); rrenkert@97: style.setColor(color); rrenkert@97: } rrenkert@97: } rrenkert@97: } rrenkert@97: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :