I have starting using Blender and LuxCore also with the hopes to make some visualisations for optical designs/scientific instruments. It proved quite useful, but something I had problems with was creating accurate spherical surfaces. I could make them by boolean intersections of a sphere with something else, but for large surface radii, that required high-u,v-spheres for accurate smoothing, and thus was very slow. Also, there could be artifacts at the lens edge.
I couldn't find existing addons for this, so I now started writing myself one to generate lenses (and mirrors) directly, with a well-defined numer of vertices on each surface.
I see that some others here use lenses, specifically in some renderings with BiDir, so I thought you might find this helpful, perhaps.

You can find the code here. I didn't bother to be creative about names, so because the work with LuxCore led to this, it is now called Opti(cs)Core

https://github.com/CodeFHD/OptiCore
Here is an image with a low vertex-count to show how the surfaces are generated:
It is basically a day worth of programming so far, so don't expect too much
