> but you still cannot do things like “attach this surface of object A to that surface of object B)”
Sure you can, but openscad is an imperative language so you need to do it in an imperative manner.
a_cube_loc = [10, 5, 5];
a_cube_size = [2, 4, 1];
b_cube_loc = [a_cube_loc[0], a_cube_loc[1] + a_cube_size[1], a_cube_loc[2] ];
b_cube_size = [2, 4, 1];
translate(a_cube_loc) cube(a_cube_size);
translate(b_cube_loc) cube(b_cube_size);
It would be nice to have more declarative constraints. The solvespace file format is plain text and it almost feels like you could write it by hand, but that would be a lot of manual record keeping. and you would loose all that imperative goodness. Perhaps you could have an imperative layer(say python or lisp or forth) that outputs the declarative layer(solvespace) and then solvespace renders(picture or stl) the declarative layer.
I think a text input option for Solvespace which was optimize for readability and usability would be _very_ interesting approach, esp. if Solvespace was able to write back out to the same format, and it allowed math/variables/parameters and supported the same in the UI.