Im with fred. Any decent cad package that you learn to use will do that.

Openscad will do it in about 6 lines of script.

For the tringulat cuttouts you simply have two 'loops' that create offset circular cutouts and move up the cylinder at different heights.
Actually you could most likely do it with a single line if your maths is good enough.
I'm the first to admit my maths is lousy - but fortunately openscad does allow for the trial and error/rinse and repeat methodology of algebra :-)

Go on then a test for a wet wednesday afternoon -
I will be back !