/*******************************************************************************
* Copyright 2010 Simon Mieth
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package org.kabeja.svg.generators;
import java.util.Map;
import org.kabeja.common.DraftEntity;
import org.kabeja.entities.Arc;
import org.kabeja.math.Point3D;
import org.kabeja.math.TransformContext;
import org.kabeja.svg.SVGConstants;
import org.kabeja.svg.SVGPathBoundaryGenerator;
import org.kabeja.svg.SVGUtils;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
public class SVGArcGenerator extends AbstractSVGSAXGenerator
implements SVGPathBoundaryGenerator {
public void toSAX(ContentHandler handler, Map svgContext, DraftEntity entity,
TransformContext transformContext) throws SAXException {
Arc arc = (Arc) entity;
AttributesImpl attr = new AttributesImpl();
SVGUtils.addAttribute(attr, SVGConstants.SVG_ATTRIBUTE_PATH,
getSVGPath(arc));
super.setCommonAttributes(attr, svgContext, arc);
SVGUtils.emptyElement(handler, SVGConstants.SVG_PATH, attr);
}
public String getSVGPath(DraftEntity entity) {
Arc arc = (Arc) entity;
Point3D p;
StringBuffer path = new StringBuffer();
p = arc.getStartPoint();
double radius = arc.getRadius();
path.append("M ");
path.append(p.getX());
path.append(' ');
path.append(p.getY());
path.append(" A ");
path.append(radius);
path.append(' ');
path.append(radius);
// x-axis rotation -> always no rotation
path.append(" 0");
double diff = arc.getTotalAngle();
// the large-arc-flag
if (diff > 180) {
path.append(" 1 ");
} else {
path.append(" 0 ");
}
//TODO change the extrusion >0
if (!arc.isCounterClockwise() && (arc.getExtrusion().getZ() > 0)) {
// the sweep-flag
path.append(" 1 ");
} else {
// sweep flag 0
path.append(" 0 ");
}
double angle = arc.getEndAngle();
//handling of only for hatch boundary
if (arc.isCounterClockwise()) {
angle = -1 * angle;
}
p = arc.getPointAt(angle);
path.append(' ');
path.append(p.getX());
path.append(' ');
path.append(p.getY());
return path.toString();
}
}