diff --git a/packages/maker.js/src/models/ArcWedge.ts b/packages/maker.js/src/models/ArcWedge.ts new file mode 100644 index 000000000..f824dfad4 --- /dev/null +++ b/packages/maker.js/src/models/ArcWedge.ts @@ -0,0 +1,87 @@ +namespace MakerJs.models { + + export class ArcWedge implements IModel { + + public paths: IPathMap = {}; + public models: IModelMap; + + constructor(startAngle: number, endAngle: number, sweepRadius: number, slotRadius: number, isolateCaps = false) { + + var capRoot: IModel; + + if (isolateCaps) { + capRoot = { models: {} }; + this.models = { 'Caps': capRoot }; + } + + if (slotRadius <= 0 || sweepRadius <= 0) return; + + startAngle = angle.noRevolutions(startAngle); + endAngle = angle.noRevolutions(endAngle); + + if (endAngle < startAngle) endAngle += 360; + + var addCap = (id: string, tiltAngle: number): IPathLine => { + var capModel: IModel; + + if (isolateCaps) { + capModel = { paths: {} }; + capRoot.models[id] = capModel; + } else { + capModel = this; + } + + var pointA = MakerJs.point.fromPolar(MakerJs.angle.toRadians(tiltAngle), sweepRadius + slotRadius); + var pointB = MakerJs.point.fromPolar(MakerJs.angle.toRadians(tiltAngle), sweepRadius - slotRadius); + + return capModel.paths[id] = new MakerJs.paths.Line( + pointA, + pointB); + }; + + if(endAngle != startAngle){ + + var addSweep = (id: string, offsetRadius: number): IPathArc => { + return this.paths[id] = new paths.Arc( + [0, 0], + sweepRadius + offsetRadius, + startAngle, + endAngle); + }; + + addSweep("Outer", slotRadius); + + var hasInner = (sweepRadius - slotRadius) > 0; + if (hasInner) { + addSweep("Inner", -slotRadius); + } + + var caps = []; + caps.push(addCap("StartCap", startAngle)); + caps.push(addCap("EndCap", endAngle)); + + }else{ + + var addCirc = (id: string, offsetRadius: number): IPathCircle => { + return this.paths[id] = new paths.Circle( + [0, 0], + sweepRadius + offsetRadius); + }; + + addCirc("Outer", slotRadius); + + var hasInner = (sweepRadius - slotRadius) > 0; + if (hasInner) { + addCirc("Inner", -slotRadius); + } + } + } + } + + (ArcWedge).metaParameters = [ + { title: "start angle", type: "range", min: -360, max: 360, step: 1, value: 180 }, + { title: "end angle", type: "range", min: -360, max: 360, step: 1, value: 0 }, + { title: "sweep", type: "range", min: 0, max: 100, step: 1, value: 50 }, + { title: "radius", type: "range", min: 0, max: 100, step: 1, value: 15 }, + ]; +} diff --git a/packages/maker.js/target/tsconfig.json b/packages/maker.js/target/tsconfig.json index 0084801f8..850091c6b 100644 --- a/packages/maker.js/target/tsconfig.json +++ b/packages/maker.js/target/tsconfig.json @@ -1,4 +1,4 @@ -{ +{ "compilerOptions": { "declaration": true, "outFile": "../dist/index.js", @@ -57,6 +57,7 @@ "../src/models/RoundRectangle.ts", "../src/models/Oval.ts", "../src/models/OvalArc.ts", + "../src/models/ArcWedge.ts", "../src/models/Rectangle.ts", "../src/models/Ring.ts", "../src/models/Belt.ts", diff --git a/packages/maker.js/tsconfig.json b/packages/maker.js/tsconfig.json index 0e2b8b39d..6f60da22e 100644 --- a/packages/maker.js/tsconfig.json +++ b/packages/maker.js/tsconfig.json @@ -1,4 +1,4 @@ -{ +{ "compilerOptions": { "lib": ["dom", "es2015"], "outDir": "debug/", @@ -56,6 +56,7 @@ "src/models/RoundRectangle.ts", "src/models/Oval.ts", "src/models/OvalArc.ts", + "src/models/ArcWedge.ts", "src/models/Rectangle.ts", "src/models/Ring.ts", "src/models/Belt.ts",