function FlaredSpokes(outerRadius, innerRadius, count, spokeWidth, flareWidth, innerFillet, outerFillet, addRing) {

    var a = 360 / count;
    var halfSpokeWidth = spokeWidth / 2;
    var halfFlareWidth = flareWidth / 2;
    var flareLine = new makerjs.paths.Line([halfFlareWidth, 0], [halfFlareWidth, outerRadius]);
    var outerCircle = new makerjs.paths.Circle([0, 0], outerRadius);
    var int = makerjs.path.intersection(flareLine, outerCircle);
    var flareY = int.intersectionPoints[0][1];
    var points = [
            [halfSpokeWidth, 0], 
            [halfFlareWidth, flareY], 
            [halfFlareWidth, outerRadius + 1], 
            [-halfFlareWidth, outerRadius + 1],
            [-halfFlareWidth, flareY], 
            [-halfSpokeWidth, 0]
        ];
    var spoke = new makerjs.models.ConnectTheDots(true, points);

    var wedge = new SpokeWedge(spoke, outerRadius, innerRadius, count);

    if (innerFillet) {
        var innerFilletArc = makerjs.path.fillet(wedge.paths.ShapeLine1, wedge.paths.ShapeLine5, innerFillet);
        if (innerFilletArc) {
            wedge.paths.innerFillet = innerFilletArc;
        } else {
            wedge.paths.innerFillet1 = makerjs.path.fillet(wedge.paths.ShapeLine1, wedge.paths.Ring_inner, innerFillet);
            wedge.paths.innerFillet2 = makerjs.path.fillet(wedge.paths.ShapeLine5, wedge.paths.Ring_inner, innerFillet);
        }
    }

    if (outerFillet) {
        wedge.paths.outerFillet1 = makerjs.path.fillet(wedge.paths.ShapeLine1, wedge.paths.Ring_outer, outerFillet);
        wedge.paths.outerFillet2 = makerjs.path.fillet(wedge.paths.ShapeLine5, wedge.paths.Ring_outer, outerFillet);
    }

    this.models = {};
    
    for (var i = 0; i < count; i++) {
        var iwedge = makerjs.cloneObject(wedge);
        this.models['wedge' + i] = makerjs.model.rotate(iwedge, i * a, [0, 0]);
    }

    if (addRing) {
        var ringWidth = (spokeWidth + flareWidth) / 2;
        this.models.ring2 = new makerjs.models.Ring(outerRadius + ringWidth, innerRadius - ringWidth);
    }
}
function DoubleBandClamp(radius1, radius2, band, tabWidth, tabHeight, gap, roundFillet, capFillet, betweenFillet) {

    function tryFillet(half, fName, pName1, pName2, value) {
        var fillet = makerjs.path.fillet(half.paths[pName1], half.paths[pName2], value);
        if (fillet) {
            half.paths[fName] = fillet;
        }
    }

    function filletAll(half) {
        if (gap) {
            tryFillet(half, 'innerFillet', 'bandInner', 'tabInner', roundFillet);
        }
        tryFillet(half, 'outerFillet', 'bandOuter', 'tabOuter', roundFillet);

        tryFillet(half, 'tabInnerFillet', 'tabInner', 'tabCap', capFillet);
        tryFillet(half, 'tabOuterFillet', 'tabOuter', 'tabCap', capFillet);
    }

    var right = makerjs.model.zero(new HalfBandClamp(radius1, band, tabWidth, tabHeight, gap));
    filletAll(right);

    var left = makerjs.model.mirror(makerjs.model.zero(new HalfBandClamp(radius2, band, tabWidth, tabHeight, gap)), true, false);
    filletAll(left);

    this.models = {
        right: right,
        left: left
    };

    makerjs.model.originate(this);

    var filletBetween = makerjs.path.fillet(right.paths['bandOuter'], left.paths['bandOuter'], betweenFillet);

    this.paths = {
        filletBetween: filletBetween
    };

}
 function tryFillet(half, fName, pName1, pName2, value) {
     var fillet = makerjs.path.fillet(half.paths[pName1], half.paths[pName2], value);
     if (fillet) {
         half.paths[fName] = fillet;
     }
 }