// TESTING
        public CompBallCutter(double diam2, double clength)
        {
            MillingCutter shaft = new BallCutter(diam2, clength);

            addCutter(shaft, diam2 / 2.0, clength, 0.0);
            length = clength;
        }
        }         // dummy, required(?) by python wrapper

        /// create ballconecutter
        public BallConeCutter(double diam1, double diam2, double angle)
        {
            MillingCutter c1    = new BallCutter(diam1, 1);          // at offset zero
            MillingCutter c2    = new ConeCutter(diam2, angle);
            MillingCutter shaft = new CylCutter(diam2, 20);          // FIXME: length

            double radius1      = diam1 / 2.0;
            double radius2      = diam2 / 2.0;
            double rcontact     = radius1 * Math.Cos(angle);
            double height1      = radius1 - Math.Sqrt(ocl.GlobalMembers.square(radius1) - ocl.GlobalMembers.square(rcontact));
            double cone_offset  = -((rcontact) / Math.Tan(angle) - height1);
            double height2      = radius2 / Math.Tan(angle) + cone_offset;
            double shaft_offset = height2;

            // cutter, radivec, heightvec, zoffset
            addCutter(c1, rcontact, height1, 0.0);
            addCutter(c2, diam2 / 2.0, height2, cone_offset);
            addCutter(shaft, diam2 / 2.0, height2 + 20, shaft_offset);
            length = 30;
        }