Hardly Batik related, but here's a small SVG path element "d" attrib
parser that I wrote for a game I'm working on.  I tried to use Batik at
first but the project dependencies needed to stay small so I went with
this.  I'm sure it's not efficient, but it works for me.  I have some
more code to go with this to parse nested groups, line and fill style
and associated transforms if you're interested.

I use Inkscape to draw graphics and then use "convert-to-path" on all my
primitives so rectangles, circles, etc are converted to paths.  Mostly
because I was lazy and didn't want to write parsers for these.


import java.awt.geom.Point2D;
import java.util.Iterator;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PathParser {
        Pattern elemPtn =
Pattern.compile("([a-zA-Z])\\s*([^a-zA-Z]*)?");
        Pattern coordPtn =
Pattern.compile("\\s*([^,\\s]+)\\s*[\\s,]?\\s*([^,\\s]+)");
          public static GeneralPath parse(String string) throws
Exception {
                GeneralPath gp = new GeneralPath();
            PathParser parser = new PathParser();
            parser.Input(gp,string);
                return gp;
          }

        /**
         * @param gp
         * @param string
         * @throws Exception
         */
        private void Input(GeneralPath gp, String string) throws
Exception {
                Matcher m = elemPtn.matcher(string);
                while(m.find()) {
                        //System.out.println(">" + m.group(1));
                        switch(m.group(1).charAt(0)) {
                                case('M'):
                                case('m'):
                                        handleMoveTo(gp,m.group(2));
                                        break;
                                case('L'):
                                case('l'):
                                        handleLineTo(gp,m.group(2));
                                        break;
                                        
                                case('C'):
                                case('c'):
                                        handleCurveTo(gp,m.group(2));
                                        break;
                                        
                                case('Q'):
                                case('q'):
                                        handleQuadTo(gp,m.group(2));
                                        break;
                                        
                                case('Z'):
                                case('z'):
                                        gp.closePath();
                                        break;
                                
                                default:
                                        //do Nothing
                        }
                }
        }

        /**
         * @param gp
         * @param string
         * @throws Exception
         */
        private void handleQuadTo(GeneralPath gp, String string) throws
Exception {
                Vector v = parseCoords(string);
                Iterator it = v.iterator();
                while(it.hasNext()) {
                        Point2D.Float p1 = (Point2D.Float)it.next();
                        Point2D.Float p2 = (Point2D.Float)it.next();
                        
                        if(p1==null || p2==null) {
                                throw new Exception("");
                        }
                        gp.quadTo(p1.x,p1.y,p2.x,p2.y);
                }
                
        }

        /**
         * @param gp
         * @param string
         * @throws Exception
         */
        private void handleCurveTo(GeneralPath gp, String string) throws
Exception {
                Vector v = parseCoords(string);
                Iterator it = v.iterator();
                while(it.hasNext()) {
                        Point2D.Float p1 = (Point2D.Float)it.next();
                        Point2D.Float p2 = (Point2D.Float)it.next();
                        Point2D.Float p3 = (Point2D.Float)it.next();
                        
                        if(p1==null || p2==null || p3==null) {
                                throw new Exception("");
                        }
                        gp.curveTo(p1.x,p1.y,p2.x,p2.y,p3.x,p3.y);
                }
                
        }

        /**
         * @param gp
         * @param string
         * @throws Exception
         */
        private void handleLineTo(GeneralPath gp, String string) throws
Exception {
                Vector v = parseCoords(string);
                handleLineTo(gp,v);
        }
        
        private void handleLineTo(GeneralPath gp, Vector v) throws
Exception {
                Iterator it = v.iterator();
                while(it.hasNext()) {
                        Point2D.Float p1 = (Point2D.Float)it.next();
                        if(p1==null) {
                                throw new Exception("");
                        }
                        gp.lineTo(p1.x,p1.y);
                }
        }

        /**
         * @param gp
         * @param string
         * @throws Exception
         */
        private void handleMoveTo(GeneralPath gp, String string) throws
Exception {
                Vector coords = parseCoords(string);
                Iterator it = coords.iterator();
                Point2D.Float mpt = (Point2D.Float)it.next();
                if(mpt==null) {
                        throw new Exception("");
                }
                gp.moveTo(mpt.x,mpt.y);
                handleLineTo(gp,coords);
        }

        /**
         * @param string
         * @return
         */
        private Vector parseCoords(String string) {
                string = string.trim();
                String coords[] = string.split("\\s+");
                Vector v = new Vector();
                for(int i=0;i<coords.length;i++) {
                        Matcher m = coordPtn.matcher(coords[i]);
                        if(m.find()) {
                                //System.out.println("         (" +
m.group(1) + " , " + m.group(2) + ")");
                                Point2D pt = new
Point2D.Float(Float.parseFloat(m.group(1)),Float.parseFloat(m.group(2)))
;
                                v.add(pt);
                        }
                }
                return v;
        }
}

-----Original Message-----
From: Danilo Costa [mailto:[EMAIL PROTECTED] 
Sent: Tuesday, August 24, 2004 8:23 AM
To: [EMAIL PROTECTED]
Subject: SVG to Java2D

Hi!
I 'm new here!
I need to convert SVG Elements to java2D element such as elipses,
rectangles, lines, how ca n I do that easily? Using GVT?

[]s
Dan

-- 
"...YOU CANNOT KNOW THE MEANING OF YOUR LIFE UNTIL YOU ARE CONNECTED
WITH THE POWER THAT CREATED YOU..."
Shri Mataji Nirmala Devi

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to