I started with OpenSCAD but found FreeCAD to be way more productive for me when it came to actually producing 3d objects. Sometimes I want to start with a square, then delete a line, and add a semi circle. But I don't always know that until I start sketching. With OpenSCAD I feel you have to know the shape primitive you need, then the exact way to modify it, and the fact that it encourages 3D primitives over 2d w/ extrusion and rotating was kinda annoying imo.
Because it interprets the file as a sequence of Part object manipulations, it's a very useful way of getting a bRep representation of an OpenSCAD document, so you get the opportunity to generate a clean, minimal STEP file.
OpenSCAD cannot do this itself, and the other conversion approaches just get you a triangle mesh packaged in a STEP file.
It's not perfect -- you get a mesh if you use Minkowski or hull operations. But it's good.
Many interesting features, and as it is bRep you have faces and edges, some access to constraints, the ability to import STEP etc. (oh and fillets/chamfers, with the usual OpenCascade caveats)
I have not got into it yet (mostly I am a happy FreeCADder) but your feelings about OpenSCAD resonate with me and this looks like it addresses many of them.
On the one hand OpenSCAD was the first thing that ever gave me any confidence that I would be able to make my own designs to print, and on the other the fact that it is wholly declarative is exasperating.
People make such amazing things in OpenSCAD (like Edgar Kech’s scalable large format field camera) but I do not have the tenacity to keep up with all the maths, or keep consistently avoiding coplanar issues in the preview.
But yes, the syntax is IMO much better because it isn’t trying to be so clever.
You can't just write code to, for example, "put this line at a 56.7 degree angle and have it end 0.22mm from this surface". You have to break out the trigonometry to calculate how long that line needs to be.
As a trivial example, let's say I want a square and a diamond and I want the diamond's corner to touch the square on the side. It would look something like this:
square([10, 10], center=true); dx = 5 + 5 * sqrt(2); translate([dx, 0, 0]) rotate([0, 0, 45]) square([10, 10], center=true);
This is a simple case, but what if either shape is replaced with a hexagon, a gear, or a duck? What if I decide there should be some other shapes between them? What about...?
Ideally, it seems like I should be able to tell OpenSCAD that the square contains a reference point on one side, and one of the corners of the diamond is also a reference point, and OpenSCAD should translate the diamond however is needed to make those two reference points match.
Alternatively, I should use some other software that lets me do something like that.
cuboid([8,8,2]) align([RIGHT, FWD, TOP]) cuboid([5,5,2], spin=45);