
The user enters requests. A request might be a line segment, or a plane,
or to step and repeat a group of entities, or anything else. Each
request has a groupid associated with it; a group will contain one or
more requests. The request will generate entities, and possibly equations.

Special requests would include an include, which gives us a concept of
hierarchy. An include pulls in all the entities from another SolveSpace
part, and fixes them up to a rotation and translation; so that introduces
six free variables. This means that the part is rigidly constrained,
but that it still must be placed, and that entities within the included
part are available to constrain against.

An entity is some geometric thing in the sketch. This might be a
line segment, or a datum point, or something else. Some requests
correspond to a single entity, in a straightforward way. Other requests
generate multiple entities, in some relationship (that is constrained
automatically, through the generated equations) to other parts of the
sketch. Each entity has a groupid, which is inherited from the request
that generated it.

One important entity is a pwl. That's a piecewise linear segment. Its
endpoints are fixed, so it generates no parameters.

The entity is described in terms of paramgroups. A paramgroup corresponds
to one or more solver parameters, grouped in such a way as to have
geometric meaning. For example, a point would correspond to three params,
x, y, and z.

The paramgroups break down in to params. These are the unknowns in the
solver equations.

The user enters constraints. Each constraint has groupid. The constraints
generate equations too.




The items that generate unknowns are:

    POINT:

        three unknowns, (x, y, z)


Entities are:

    DATUM POINT:

        one point

    DATUM PLANE:

        one point; the plane is through that point, and normal to the
        vector from that point to the origin

    LINE SEGMENT:

        two endpoints
