Pt: SVG Guide

Pt enables you to express an idea in a variety of forms and spaces. SVG is another kind of space, in which every element is in a DOM (Document Object Model). But don't worry, it's easy to write almost identical code for both SVG and Canvas. This is a quick guide to show you how.

Set up

First of all, we'll create an SVGSpace instead of a CanvasSpace.

var space = new SVGSpace("pt", ready);

You may notice a second parameter called ready. This is a callback function which we'll define now:

function ready(bounds, elem) {
  form.scope("item", elem ); // initiate the scope which uses the svg dom as parent node

Because of how DOM works (it's kind of a pain), we have to wait till the DOM elements are ready before we can use them. Hence we use a callback function ready to put all the initiation code inside.

The one additional function we use here is form.scope("item", elem). This initiates the container element (second parameter, passed from callback function) for our svg space , and give it a custom name called "item", which will be used to identify child elements inside it.


In <canvas>, elements are simply painted on top of each other, and in each cycle everything is usually wiped and repainted. In DOM, elements persist. We may clear and recreate them again and again like <canvas>, but that will be very slow. It'll be better if we keep track of DOM elements and update their attributes when needed.

SVGForm solves this with a function called enterScope(item). It's a way of saying: Hey, take note of new and existing elements in this group and update them as needed. The item parameter is simply the animate-able object you added to space.

In short, and in most cases, you may simply add this enterScope function in the beginning of animate callback function, and that's it.

  animate: function(time, fps, context) {
    // enter group scope. "this" refers to this object we are adding to space
    form.enterScope( this );

    // do stuff here, no additional changes needed.
    form.fill("#f00").point( new Point( 100, 100 ) );


To recap: first initiate a parent scope in a ready callback function, and then in the beginning of your object's animate function, call the enterScope function. Done!

If you want to change it back to CanvasSpace, simply change SVGSpace to CanvasSpace, and SVGForm to Form in the instantiation. The scope functions have no effects in CanvasSpace and won't break your code.

Take a look at the source code in the SVG demos. It's pretty straightforward.