It's not a config tool, but... I just implemented automatic U/V coordinate assignment for Shapes, and it's working great. 
@FlyingJester: Want to see a neat trick? I assign default U/V coords like this:
bounds = get_shape_bounds(shape);
width = bounds.x2 - bounds.x1;
height = bounds.y2 - bounds.y1;
for (i = 0; i < shape->num_vertices; ++i) {
delta_x = shape->vertices[i].x - bounds.x1;
delta_y = shape->vertices[i].y - bounds.y1;
shape->vertices[i].u = width > 0 ? delta_x / width : 0.0;
shape->vertices[i].v = height > 0 ? delta_y / height : 1.0;
}
Essentially I calculate the shape's bounding box, and then do a bit of linear interpolation on the vertices to get the U/V values. This works for any number of vertices with no predefined lookup tables needed. 
There is a downside, of course: If you accept the defaults, the texture basically becomes a decal. This is the one upside of TS's method: If your 4-cornered shape is something other than a rectangle (a rhombus, say), the texture map remains rectangular (0,0)-(1,1) and the image is properly distorted.
Edit: So, new method, still works for any number of vertices but allows the texture to distort (note: assumes clockwise winding starting from top left):
static void
assign_default_uv(shape_t* shape)
{
double phi;
int i;
for (i = 0; i < shape->num_vertices; ++i) {
phi = 2 * M_PI * i / shape->num_vertices - M_PI_4 * 3; // counterclockwise offset 135 degrees
shape->vertices[i].u = (cos(phi) * M_SQRT2 + 1.0) / 2.0;
shape->vertices[i].v = (sin(phi) * M_SQRT2 + 1.0) / 2.0;
}
}
Essentially what I'm doing is circumscribing the UV space--which conveniently happens to be a unit square!--and then setting UV to points on that circle.
Edit2: Correction, clockwise winding. Trig functions are canonically CCW, but the inverted Y axis reverses the winding.