I'm new here on the forum, but have used FreeCAD since at least v0.15. I'm also a mechanical engineer, and have used — and I'm still using — all main CAD programs out there: Catia V5, SolidWorks, Siemens NX, Pro/Engineer ... and also T-Flex, which is lesser known (its Russian, very very good). I have a very deep knowledge of professional CAD platforms.
While the Parts design workbench in FreeCAD is usable, I think that FreeCAD is absolutely unusable for any CAD work as long as there is no Assembly workbench. I've seen over time efforts to make some Assembly module, but so far none have succeeded. No offence meant, you know what I mean. I'm no programmer therefore I won't be able to code anything better.
One difficulty that you — those who actually do the coding, and I thank-you very much for that — seem to encounter is the solving of constraints. But there is also a way to do assemblies without any constraints ! This is what I'll try to explain here.
The very purpose of an assembly is to link several parts into ... well, an assembly. A higher level of goal is to make this dynamic, in the sense that you can have physical links between the parts. But a lesser goal is to link parts together in a static way, such that the parts are placed where they are placed, parametrically of course or that would defeat FreeCAD's purpose, but fixed.
In T-Flex, this is done in a very nice and elegant way: through LCS, Local Coordinate Systems (called Csys in Catia V5). When a part is inserted into an assembly, you choose which of the LCS of the part you want to use (this must pre-exist in the part) and you choose to which target LCS in the assembly you want to link it (this must pre-exist in the assembly) and the part snaps in place. This seems less natural than the constraints way of doing things, but at usage it's much — much much — more logical. For example, if you want to insert a screw, you define an LCS at the hole, an LCS at the neck of the screw, and you're done. This actually forces the designer to think the part in terms of functional behaviour, and not in terms of geometrical features. Once used to it, making assemblies using constraints seems awkward.
In the current FreeCAD (I'm using 0.18-14495) there is a coordinate system created with each body, but I don't see a way to create additional coordinate systems. Therefore, of course, it would not be possible to implement an assembly using coordinate systems.
LCS (or Csys)
So I have a question:would it be possible to allow the creation of local coordinate systems in a part ? These could be defined by an origin (either an existing point or as a specified offset), and 2 directions (X and Y).
Once it's possible to create arbitrary (parametric) coordinate systems it's probably quite trivial to make even complex assemblies, without any need for a constraints solver: when a part is inserted into an assembly, you choose the target LCS in the assembly and the matching LCS in the part, and it's done. If you want to move the part, you can change the parameters of the target LCS (in the assembly)
Later, it should be possible to define degrees of freedom in the LCS and develop constraints to solve them (for example you can leave the rotation around an axis free, or a translation...). The number of degrees of freedom would be limited to those expressly authorised, thus the solver much simpler than having to solve all 6 degrees of freedom for all parts. This can be implemented at a later stage to provide a full assembly functionality that wouldn't lag the leading CAD systems. The assembly workbench of FreeCAD could become it's best selling point.