You mean using CAD packages to create scripts that will be varying the parametrized model?
Yes, that's pretty much what comes to mind when you say "design variants." You can start with a baseline geometry, which has to be a parametric function, and then disturb its parameters in a meaningful way. Such a parametric function is pretty much a "black box," where it does not matter if you use C++ dark magic plus OpenCascade or just expensive Catia: as long as you can export the results to a STEP file whatsoever, the mechanics of model generation is not important.
So In your opinion, you think that will be much easier and efficient than let's say using PythonOCC to build everything from the ground up like the Bottle tutorial in OCC?
You know, there is this "Bottle tutorial" and then there's real life. If I were in your shoes, I would probably have started with a "proof of concept" to see if OpenCascade can even model the geometry that you're up to. Even without any parameters. Because if you are designing a frame assembly for a car, then I would suppose it would contain many sheet metal parts, probably with tricky geometries. You should have a clear idea of how to model them all: how you constraint a sketch, in which direction you thicken the model, where you drill holes, and so on. If you manage to build the baseline geometry with OpenCascade, then you can move on and parameterize it. If OpenCascade fails, then you know that a commercial CAD package is your only way through.
In your project, did you build a nominal parametric part or feature using a CAD software before using the C++ procedure for generating multiple designs?
Nope, we used OpenCascade alone, but we clearly understood that if we don't use it, then we don't get the project (because the customer wanted to have it done in an open source modeler). At the same time, our models were fairly simple, so we were confident they were realizable with the kernel we had.