using OSCADSharp.Solids; using OSCADSharp.Solids.Compound; using OSCADSharp.Solids.Imported; using OSCADSharp.Spatial; using OSCADSharp.Utility; namespace OSCADSharp.ConsoleTests { class Program { private static OSCADObject getEndCover(OSCADObject outer) { var bounds = outer.Bounds(); var endCover = new Cube(Inches.Sixteenth, bounds.Width, bounds.Height, true); var choppedOut = endCover.Clone().Scale(2, (bounds.Width-Inches.Quarter)/ bounds.Width, (bounds.Height - Inches.Half) / bounds.Height); choppedOut = choppedOut.Translate(0, Inches.Quarter, 0); return endCover - choppedOut; } private static void makeBracket() { OSCADObject cube = new Cube(new Vector3(Inches.ToMillimeters(2.75), Inches.One, Inches.ToMillimeters(1.25)), true); var outside = cube.Clone(); ((Cube)outside).Size.X += Inches.Sixteenth; ((Cube)outside).Size.Z += Inches.Sixteenth; cube = cube.Scale(2, 1, 1).Translate(0, Inches.Sixteenth, 0); var obj = outside - cube; var bounds = obj.Bounds(); obj = obj + getEndCover(outside).Translate(bounds.XMax, 0, 0); obj = obj + getEndCover(outside).Translate(-bounds.XMax, 0, 0); obj.ToFile("leftBracket").Open(); } private static void makePeg() { OSCADObject flatInnerPortion = new Cylinder(Inches.Quarter, Inches.Eigth, true) { Resolution = 30 }; OSCADObject shaft = new Cylinder(Inches.Eigth, Inches.Half, true) { Resolution = 30 }; flatInnerPortion = flatInnerPortion.Translate(0, 0, shaft.Bounds().ZMax); OSCADObject pegShaft = new Cylinder(Inches.Quarter, Inches.Half - Inches.Eigth, true) { Resolution = 30 } .Translate(0, 0, -Inches.Eigth); OSCADObject bottomBall = new Sphere(Inches.Quarter* 1.1) .Translate(0, 0, pegShaft.Bounds().ZMin); var obj = flatInnerPortion + shaft + pegShaft + bottomBall; obj = obj.Rotate(0, 180, 0).Translate(0, 0, obj.Bounds().ZMax); obj.ToFile("peg"); } private static void makeLaserStand() { OSCADObject center = new Cube(Inches.One, Inches.Half, Inches.One*1.2, true); OSCADObject outerColumn = new Cylinder(Inches.One, Inches.One, true).Resize(Inches.One * 1.5, Inches.Half * 1.5, Inches.One); var bnds = outerColumn.Bounds(); OSCADObject bottom = new Cylinder(Inches.One, Inches.One, true) .Resize(Inches.One * 2, Inches.Half * 2, Inches.One) .Translate(0, 0, 0); var obj = (outerColumn) + bottom; bnds = obj.Bounds(); var cap = makeStandCap(); obj = obj + cap.Translate(0, 0, bnds.ZMax - Inches.Sixteenth); obj.ToFile("laserStand2").Open(); } private static OSCADObject makeStandCap() { OSCADObject center = new Cube(Inches.One - Inches.Sixteenth, Inches.Half - Inches.Sixteenth, Inches.Quarter, true); OSCADObject outerColumn = new Cylinder(Inches.One, Inches.One, true).Resize(Inches.One * 1.5, Inches.Half * 1.5, Inches.One); var bnds = center.Bounds(); OSCADObject top = new Cylinder(Inches.One, Inches.One, true) .Resize(Inches.One * 2.25, Inches.Half * 2.25, Inches.Quarter); OSCADObject cutout = new Cylinder(Inches.One, Inches.One, true) .Resize(Inches.One * 2.1, Inches.Half * 2.1, Inches.Quarter); top = top - cutout.Translate(0, 0, Inches.Quarter/2); OSCADObject brim = top.Clone(); var obj = center + top.Translate(0, 0, bnds.Height / 2 + Inches.Sixteenth / 2); return obj; } private static void makeCardClip() { var leftSide = new Cube(Inches.Sixteenth, Inches.Half, Inches.Half, true) .Rotate(0, -3, 0).Translate(Inches.Sixteenth, 0, Inches.Half / 2); var rightSide = leftSide.Clone().Mirror(1, 0, 0); var bottom = new Cube(Inches.Quarter*.85, Inches.Half, Inches.Sixteenth, true); var obj = leftSide + rightSide + bottom; //obj = new Sphere() { Radius = .25, Resolution = 30 }.Translate(0, 0, -1).Minkowski(obj); //90 degree joint obj = obj.Translate(0, 0, Inches.Eigth) + obj.Clone().Rotate(0, 180, 0).Translate(0, 0, 0) + new Cube(Inches.Quarter * .85, Inches.Half, Inches.Quarter * .85, true); obj = obj.Rotate(90, 0, 0); obj.ToFile("clip-180"); } public static void makeBadge() { var img = ImportedImage.FromFile("badge-1.png", new ImageImportOptions() { HeightMapping = ImageImportOptions.HeightMappingMode.Vertical }); img.Resize(Inches.One * 2.4, Inches.One * 2.75, Inches.Eigth).ToFile("badge"); } public static void makeLoop() { double outerDiam = Inches.Quarter+ Inches.Sixteenth; double height = Inches.Eigth + Inches.Sixteenth; double holeSize = Inches.Quarter; double paddingSize = Inches.Sixteenth; var outer = new Cylinder(holeSize + paddingSize, height, true) { Resolution = 50 }; var inner = new Cylinder(holeSize, height*2, true) { Resolution = 50 }; var bounds = outer.Bounds(); var bottomDisk = new Cylinder(outerDiam + Inches.Eigth, Inches.Sixteenth / 2, true) { Resolution = 50 }.Translate(0, 0, bounds.ZMin - Inches.Sixteenth / 4); var whole = ((outer + bottomDisk) - inner); whole.ToFile("loop"); var topDisk = new Cylinder(outerDiam + Inches.Eigth, Inches.Sixteenth / 2, true) - new Cylinder(holeSize + Inches.Sixteenth, Inches.Half, true) { Resolution = 50 }; topDisk.ToFile("topLoop"); } public static void makeHolder() { double innerSize = (Inches.One * 4); var cutout = new Cube(Inches.One * 10, Inches.Half, Inches.Half, true).Translate(0, innerSize/2, 0); cutout = cutout + cutout.Rotate(0, 0, 90) + cutout.Rotate(0, 0, 180) + cutout.Rotate(0, 0, 270); OSCADObject innerCyl = new Cylinder(innerSize, Inches.Eigth + Inches.Sixteenth, true) { Resolution = 60 }; var outerCyl = new Cylinder(innerSize + Inches.Eigth, Inches.Quarter + Inches.Sixteenth, true) { Resolution = 60 }; innerCyl = innerCyl.Translate(0, 0, outerCyl.Bounds().ZMax - (Inches.Eigth + Inches.Sixteenth)/2 + .1); var whole = (outerCyl - innerCyl) - cutout; whole.ToFile("coasterHolder-square").Open(); } public static void makeDisk() { double glassGap = Inches.Eigth; double outer = (Inches.One * 3) + glassGap*2; double holeSize = (Inches.One - Inches.Sixteenth); double thickness = Inches.Quarter; var outerCylinder = new Cylinder(outer, thickness, true) { Resolution = 100 }; var innerCutout = new Cylinder(outer - glassGap, thickness, true) { Resolution = 100 }.Translate(0, 0, thickness - Inches.Sixteenth); var hole = new Cylinder(holeSize, thickness * 2, true) { Resolution = 100 }; var whole = (outerCylinder - innerCutout) - hole; whole.ToFile("candleDisk").Open(); } public static void makePaddle() { double holeSize = Inches.One + Inches.Eigth; double holeHeight = Inches.One; double shaftSize = holeSize + Inches.Quarter; double totalLength = Inches.One * 8; double totalWidth = Inches.One * 5; var blade = new Sphere() { Resolution = 80 }.Resize(totalLength, totalWidth, Inches.One*2); var copy = blade.Clone().Translate(0, 0, -Inches.One).Scale(1.4, 1.4, 1.1); blade = blade - copy; //var gap = new Cube(Inches.One, Inches.One * 8, Inches.One*8, true).Translate(blade.Bounds().XMin, 0, 0); //blade = blade - gap; OSCADObject shaft = new Cylinder(shaftSize, totalLength / 4, true) { Resolution = 80 }.Rotate(0, 90, 0); var hole = new Cylinder(holeSize, holeHeight * 2, true) { Resolution = 80 }.Rotate(0, 90, 0).Translate(shaft.Bounds().XMin, 0, 0); blade = blade - hole.Translate(blade.Bounds().XMin + Inches.Half, 0, +Inches.Quarter); shaft = shaft - hole; shaft = shaft.Translate(blade.Bounds().XMin + Inches.Half, 0, +Inches.Quarter); var gapCloser = new Sphere(shaftSize) { Resolution = 80 }.Translate(shaft.Bounds().XMax, 0, +Inches.Quarter); var whole = (blade + shaft + gapCloser).Rotate(180, 0, 0); whole.ToFile("paddle").Open(); } public static void makepaddleHandle() { double holeSize = Inches.One + Inches.Eigth; double holeHeight = Inches.One; double shaftSize = holeSize + Inches.Quarter; double totalLength = Inches.One * 8; double totalWidth = Inches.One * 5; var blade = new Sphere() { Resolution = 80 }.Resize(totalLength, totalWidth, Inches.One * 2); var copy = blade.Clone().Translate(0, 0, -Inches.One).Scale(1.4, 1.4, 1.1); blade = blade - copy; //var gap = new Cube(Inches.One, Inches.One * 8, Inches.One*8, true).Translate(blade.Bounds().XMin, 0, 0); //blade = blade - gap; OSCADObject shaft = new Cylinder(shaftSize, totalLength / 4, true) { Resolution = 80 }.Rotate(0, 90, 0); var hole = new Cylinder(holeSize, holeHeight * 2, true) { Resolution = 80 }.Rotate(0, 90, 0).Translate(shaft.Bounds().XMin, 0, 0); blade = blade - hole.Translate(blade.Bounds().XMin + Inches.Half, 0, +Inches.Quarter); shaft = shaft - hole; shaft = shaft.Translate(blade.Bounds().XMin + Inches.Half, 0, +Inches.Quarter); var top = new Cylinder(shaftSize, Inches.One * 3, true) { Resolution = 80 }.Rotate(90, 0, 0).Translate(shaft.Bounds().XMax, 0, shaft.Bounds().ZMax - shaftSize/2); var gapCloserLeft = new Sphere(shaftSize) { Resolution = 80 }.Translate(top.Bounds().XMax - shaftSize/2, top.Bounds().YMax, +Inches.Quarter); var gapCloserRight = gapCloserLeft.Mirror(0, 1, 0); var whole = shaft + top + gapCloserLeft + gapCloserRight; whole.ToFile("paddleHandle").Open(); } public static void makeGreatSword() { double referenceWidth = Inches.Eigth; double overallLength = Inches.One*1.5; var tang = new Cylinder(referenceWidth, overallLength, true) { Resolution = 6 }.Scale(.5, 2, 1); var pommel = new Sphere(referenceWidth * 1.2){ Resolution = 11 }.Translate(0, 0, -Inches.Half - Inches.Eigth).Color("Gold"); var hilt = new Cylinder(referenceWidth, Inches.Half * .75, true) { Resolution = 10 } .Rotate(90, 0, 0) .Translate(0, 0, -Inches.Quarter).Color("Gold"); var hiltRight = new Sphere(referenceWidth * 1.1) { Resolution = 8 } .Scale(1, 1, 1.2).Color("Gold") .Translate(0, hilt.Bounds().YMin, hilt.Position().Z); var hiltLeft = hiltRight.Clone().Mirror(0, 1, 0); var hiltCenter = new Cylinder(referenceWidth * .9, Inches.Half * .8, true) { Resolution = 8 } .Translate(0, 0, -Inches.Quarter - Inches.Quarter*.75).Color("Gold"); hilt = hilt + hiltLeft + hiltRight + hiltCenter; var blade = tang.Translate(0, 0, Inches.Half); var tip = new Cylinder(referenceWidth, Inches.Quarter, true) { Resolution = 6, Diameter2 = .1 }.Scale(.5, 2, 1).Translate(0, 0, blade.Bounds().ZMax + Inches.Eigth); blade = blade + tip; blade = blade.Color("Silver"); var whole = (blade + pommel + hilt).Scale(.5, .5, .5); whole.ToFile("greatsword").Open(); } public static void makeACBrackets() { double width = Inches.One * 6.5; double height = Inches.One; double depth = Inches.One; double thickness = Inches.Quarter; var mainBox = new Cube(width, depth, height, true); var cutout = mainBox.Clone().Scale(1.1, 1, 1).Translate(0, thickness, thickness); var hole = new Cylinder(Inches.Eigth, Inches.One * 2, true) { Resolution = 30 }.Rotate(90, 0, 0); var whole = mainBox - cutout - hole.Translate(0, 0, Inches.Quarter) - hole.Clone().Translate(-Inches.One * 2, 0, Inches.Quarter) - hole.Clone().Translate(+Inches.One * 2, 0, Inches.Quarter); whole.ToFile("acBracket"); } public static void makeDiceHolder() { double chamberDiameter = Inches.One; var singleChamberCenter = new Cylinder(chamberDiameter, Inches.Half + Inches.Eigth, true) { Resolution = 6 }; var singleChamber = new Cylinder(chamberDiameter + Inches.Eigth, Inches.Half + Inches.Eigth, true) { Resolution = 6 } - singleChamberCenter.Scale(1, 1, 2); singleChamber = singleChamber.Rotate(0, 0, 30); var bottom = singleChamber; for (int angle = 60; angle < 420; angle+=60) { bottom += singleChamber.Clone().Translate(chamberDiameter - Inches.Sixteenth, 0, 0).Rotate(0, 0, angle); } var hexSection = bottom.Clone(); var outerCylCenter = new Cylinder(chamberDiameter * 2.9, Inches.Half, true) { Resolution = 90 }.Translate(0, 0, Inches.Eigth); var outerCyl = (new Cylinder(chamberDiameter * 2.9 + Inches.Eigth, Inches.Half, true) { Resolution = 90 } - outerCylCenter).Translate(0, 0, bottom.Bounds().ZMin + Inches.Half); bottom += outerCyl; var lidCenter = new Cylinder(chamberDiameter * 2.9 + Inches.Eigth + Inches.Sixteenth*.5, Inches.One, true) { Resolution = 90 }.Translate(0, 0, Inches.Eigth); var lid = (new Cylinder(chamberDiameter * 2.9 + Inches.Quarter + Inches.Sixteenth * .5, Inches.One, true) { Resolution = 90 } - lidCenter).Translate(0, 0, bottom.Bounds().ZMin + Inches.Half); var top = lid.Clone().Mirror(0, 0, 1).Rotate(0, 180, 0); //OSCADObject dragon = ImportedImage.FromFile("dragonInsignia.png", new ImageImportOptions() { // UseGrayScale = true, // HeightMapping = ImageImportOptions.HeightMappingMode.None, // SimplificationAmount = 100 //}); //var topBounds = top.Bounds(); //dragon = dragon.Scale(.1, .1, Inches.Quarter).Translate(-topBounds.Length/2 + Inches.Sixteenth, -topBounds.Width/2 + Inches.Sixteenth, topBounds.ZMin - Inches.Eigth); var whole = top;//bottom;// /*bottom + */ top - dragon; whole.ToFile("diceHolder_cap").Open(); } public static void makeSideTwoByFourBracket() { double wallThickness = Inches.Eigth; double innerWidth = Inches.One * 4 + Inches.Sixteenth; double innerHeight = Inches.One * 2 + Inches.Sixteenth; double innerDepth = Inches.Half + Inches.Sixteenth; OSCADObject twoByfourHolder = new Box() { Size = new Vector3(innerWidth + wallThickness * 2, innerHeight + wallThickness * 2, innerDepth + wallThickness), Center = true, WallThickness = wallThickness }; var whole = twoByfourHolder.Rotate(90, 0, 90) + twoByfourHolder.Clone().Rotate(90, 0, 90).Rotate(0, 90, 0).Translate(innerHeight/2 - wallThickness*2 + Inches.Sixteenth*.5, 0, -innerHeight/2 - innerDepth/2 - wallThickness + Inches.Sixteenth); whole = whole.Rotate(0, -90, 0); whole.ToFile("twobyFourSideBracket"); } public static void makeCenterTwoByFourBracket() { double wallThickness = Inches.Eigth; double innerWidth = Inches.One * 4 + Inches.Sixteenth; double innerHeight = Inches.One * 2 + Inches.Sixteenth; double innerDepth = Inches.Half + Inches.Sixteenth; OSCADObject twoByfourHolder = new Box() { Size = new Vector3(innerWidth + wallThickness * 2, innerHeight + wallThickness * 2, innerDepth + wallThickness), Center = true, WallThickness = wallThickness }; var whole = twoByfourHolder.Rotate(180, 0, 0).Rotate(0, 0, 90); var left = twoByfourHolder.Clone().Rotate(0, 0, 90).Rotate(0, 90, 0) .Translate(innerDepth - wallThickness*2, 0, whole.Bounds().ZMax + innerHeight / 2); var right = left.Mirror(1, 0, 0); whole = whole + left + right; // .Rotate(90, 0, 90) + // twoByfourHolder.Clone().Rotate(90, 0, 90).Rotate(0, 90, 0).Translate(innerHeight / 2 - wallThickness * 2 + Inches.Sixteenth * .5, 0, -innerHeight / 2 - innerDepth / 2 - wallThickness + Inches.Sixteenth); //whole = whole.Rotate(0, -90, 0); whole.ToFile("twobyFourCenterBracket"); } static void Main(string[] args) { //makeCenterTwoByFourBracket(); //makeSideTwoByFourBracket(); makeDiceHolder(); //makeACBrackets(); makeGreatSword(); makepaddleHandle(); makePaddle(); //makeDisk(); //makeHolder(); //makeLoop(); //makeBadge(); //makeCardClip(); //makeLaserStand(); //makeStandCap(); var tubeMe = new Tube() { Diameter1 = Inches.One, Diameter2 = Inches.Half, Height = Inches.One, Bottom = false, Resolution = 100, //Center = true, WallThickness = Inches.Sixteenth }; tubeMe.ToFile("tubeTest"); //var boxMe = new Box() { // Size = new Vector3(10, 10, 10), // WallThickness = .5 //}; //boxMe.ToFile("boxtest"); //var img = ImportedImage.FromFile("twixCrop_small.png", new ImageImportOptions() //{ // HeightMapping = ImageImportOptions.HeightMappingMode.Vertical, // UseGrayScale = false, // SimplificationAmount = 25 //}); //img.ToFile("twixCrop"); //var img = ImportedImage.FromFile("vermont-nc.png").Scale(1, 1, Inches.Quarter + Inches.Eigth); //var imgPos = img.Position();z //var _base = new Cylinder(img.Bounds().Width + Inches.Quarter, Inches.Quarter) { Resolution = 100 }; //var rim = _base.Clone().Scale(1, 1, 1.25) - _base.Clone().Scale(.9, .9, 3.5).Translate(0, 0, -Inches.Eigth); //var coaster = img + _base.Translate(imgPos.X, imgPos.Y, 0) + rim.Translate(imgPos.X, imgPos.Y, Inches.Quarter); ; //coaster.ToFile("seaImg").Open(); //makePeg(); //var diam = new Variable("mainColumn", Inches.Half); //var height = new Variable("overallHeight", Inches.Quarter); //Variables.Global.Add(diam); //Variables.Global.Add(height); //var cyl = new Cylinder(diam, diam, height); //var pos = cyl.Position(); //var cyl1 = new Cylinder(1, 100, true).Translate(pos); //var cyl2 = new Cylinder(1, 100, true).Rotate(0, 90, 0).Translate(pos); //var cyl3 = new Cylinder(1, 100, true).Rotate(90, 0, 0).Translate(pos); //var axisHelper = cyl1.Union(cyl2, cyl3).Color("Red"); ////var topCorner = new Sphere().Translate(obj.Bounds().TopRight); ////var botCorner = new Sphere().Translate(obj.Bounds().BottomLeft); //(cyl + axisHelper).ToFile("test.scad").Open(); //Console.ReadKey(); } } }