for developers
Sign In
Join
Discussions
Documentation
Tutorials
Examples
Editor
Scene
Import Scene
Export Scene
Load Last Scene
Save Current Scene
Model
Save Model
Upload Model
Show Printability
Render
Preferences
Help
Reference Guide
Examples
Tutorials
Generate
Save Model
Reset Params
Check Model
var params = [ { name: "size", label: "Ring Size", desc: "US Ring Size", type: "double", rangeMin: 0, rangeMax: 16, step: 0.25, defaultVal: 11 }, { name: "ringWidth", desc: "Ring Width", label: "Ring Width", type: "double", rangeMin: 1, rangeMax: 10, step: 0.1, defaultVal: 6, unit: "MM" }, { name: "image", label: "Pattern Image", desc: "Image", type: "uri", defaultVal: "http://www.shapeways.com/rrstatic/img/shapejs/creator/signet_top_beast.jpg", group: "Image" }, { name: "useGrayscale", label: "Use Grayscale", desc: "Use Grayscale", type: "boolean", defaultVal: false, group: "Image" }, { name: "imageScale", desc: "Scale Image to fit ring", type: "double", rangeMin: 0.1, rangeMax: 1.25, step: 0.01, defaultVal: 0.95, group: "Image" }, { name: "leftImage", label: "Left Side Image", desc: "Image", type: "uri", defaultVal: "http://www.shapeways.com/rrstatic/img/shapejs/creator/signet_side_beast.jpg", group: "Image" }, { name: "rightImage", label: "Right Side Image", desc: "Image", type: "uri", defaultVal: "http://www.shapeways.com/rrstatic/img/shapejs/creator/signet_side_beast.jpg", group: "Image" }, { name: "text", label: "Text", desc: "Text", type: "string", group: "Text", defaultVal : "For beastly behavior" }, { name: "textStyle", label: "Style", desc: "Font", type: "enum", values: ["HelveticaRounded LT Std Bd"], group: "Text" }, { name: "textSize", desc: "Text Height(pt)", type: "double", rangeMin: 6, rangeMax: 20, step: 1, defaultVal: 7, group: "Text" }, { name: "textDepth", desc: "Text Depth", type: "double", rangeMin: 0.2, rangeMax: 0.8, step: 0.1, defaultVal: 0.4, unit: "MM", group: "Text" } ]; var vs = 0.04 * MM; var POINT_SIZE = 25.4 * MM / 72; var TORAD = PI / 180; function ringSizeToDiameter(size) { var diameter = 11.63 * MM + (0.8128 * MM * size); return diameter; } function makeImage(path, width, height, thickness, gray) { var img = new Image3D(path, width, height, thickness); img.setBaseThickness(0.0); img.setBlurWidth(0.5 * vs); if (gray == true) { img.setUseGrayscale(true); img.setBaseThreshold(0.01); } else { img.setUseGrayscale(false); img.setBaseThreshold(0.5); } img.setImagePlace(Image3D.IMAGE_PLACE_BOTH); img.setImageType(Image3D.IMAGE_TYPE_EMBOSSED); return img; } function makeText3D(args) { var text2d = new Text2D(args.text); text2d.setFontName("HelveticaRounded LT Std Bd"); text2d.setFontStyle(Text2D.BOLD); var bandLength = ringSizeToDiameter(args.size) * Math.PI; var tbx = bandLength; var tby = (args.textSize * POINT_SIZE); var tbz = 2 * args.textDepth; var tvs = 0.05 * MM; // text voxel size text2d.setInset(2 * tvs); text2d.setVoxelSize(tvs); text2d.setFit("vertical"); // vertical, horizontal, both text2d.setHorizAlign("center"); // left, right, center text2d.setWidth(tbx); text2d.setHeight(tby); var imgBox = new Image3D(text2d, tbx, tby, tbz, vs); imgBox.setUseGrayscale(false); imgBox.setBaseThickness(0); imgBox.setBaseThreshold(0.5); imgBox.setBlurWidth(0.1 * MM); return imgBox; } function main(args) { // see signet_ring.svg for drawing // user definable variables var imageThickness = 0.75 * MM; var ringSize = ringSizeToDiameter(args.size); var ringThickness = 1.5 * MM; var ringWidth = args.ringWidth; var bezelAngle = Math.PI / 8; // angle of bezel sides, good values are between PI/5 and PI/20 var bezelHeight = 1.5 * MM; // thickness of the ring bezel var imagePath = args.image; var imageScale = args.imageScale; // size of image relative to bezel size // end of user definable variables var inRad = ringSize / 2; var outRad = inRad + ringThickness; var By = inRad + bezelHeight; var sinA = Math.sin(bezelAngle); var BC = (Ay - By) * Math.tan(bezelAngle); var Ay = outRad / sinA; var Fy = Ay * sinA * sinA; var bezelBase = Fy; var bezelTop = By; var margin = 0.2 * MM;// empty space around object // size of grid to fit the ring var gridWidth = 2 * outRad + 2 * margin; var gridHeight = 2 * bezelTop + 2 * margin; var Cx = (Ay - By) * Math.tan(bezelAngle); var Dx = Cx * (1 + bezelHeight / (Ay - By)); var cutR = inRad; // radius of cylindrical transition var Ex = ringWidth / 2 + cutR; var dd = 1 * MM; // width of small bezel undercut var Ey = inRad - Math.sqrt(cutR * cutR - (Ex - Dx + dd) * (Ex - Dx + dd)); var imageWidth = imageScale * Cx * 2; var imageHeight = imageWidth; var image = makeImage(imagePath, imageWidth, imageHeight, 2 * imageThickness, args.useGrayscale); var imageTransform = new CompositeTransform(); imageTransform.add(new Rotation(new Vector3d(1, 0, 0), -Math.PI / 2)); imageTransform.add(new Translation(0, By, 0)); image.setTransform(imageTransform); var ringBase = new Sphere(outRad); // bezel is cone truncated by 2 parallel planes var bezel = new Intersection(); bezel.add(new Cone(new Vector3d(0, Ay, 0), new Vector3d(0, -1, 0), bezelAngle)); bezel.add(new Plane(new Vector3d(0, 1, 0), bezelTop)); bezel.add(new Plane(new Vector3d(0, -1, 0), -bezelBase)); bezel.setBlend(0.1 * MM); var ring = new Union(); ring.add(ringBase); ring.add(bezel); var cutoff = new Union(); var gw = gridWidth; var gw2 = gridWidth / 2; var thru = new Cylinder(new Vector3d(0, 0, -gw2), new Vector3d(0, 0, gw2), inRad); cutoff.add(new Cylinder(new Vector3d(-gw2, Ey, Ex), new Vector3d(gw2, Ey, Ex), cutR)); cutoff.add(new Cylinder(new Vector3d(-gw2, Ey, -Ex), new Vector3d(gw2, Ey, -Ex), cutR)); cutoff.add(new Box(0, -inRad, Ex, gw, 2 * (inRad + Ey), 2 * cutR)); cutoff.add(new Box(0, -inRad, -Ex, gw, 2 * (inRad + Ey), 2 * cutR)); var partialRing = new Subtraction(ring, thru); partialRing.setBlend(1 * MM); var fullRing = new Subtraction(partialRing, cutoff); fullRing.setBlend(0.1 * MM); var ringWithImage = new Subtraction(fullRing, image); var result = ringWithImage; if (args.text !== undefined) { var text = makeText3D(args); var trans = new CompositeTransform(); trans.add(new Rotation(0, 0, 1, 180 * TORAD)); trans.add(new Rotation(0, 1, 0, 180 * TORAD)); trans.add(new RingWrap(ringSizeToDiameter(args.size) / 2)); trans.add(new Rotation(1, 0, 0, 90 * TORAD)); trans.add(new Rotation(0, 0, 1, 0 * TORAD)); text.setTransform(trans); result = new Subtraction(result, text); } var edepth = ringThickness / 4; var mask; var maskShift; var bump; var trans; var maskedBump; if (args.leftImage !== undefined) { mask = new Mask(result, 0, edepth); maskShift = new Vector3d(1, 0, 0); maskShift.scale(edepth); mask.setTransform(new Translation(maskShift)); bump = makeImage(args.leftImage, 0.84 * 2 * Cx, By + inRad, 12 * MM, false); trans = new CompositeTransform(); trans.add(new Rotation(0, 1, 0, Math.PI / 2)); trans.add(new Translation(inRad, 0, 0)); bump.setTransform(trans); maskedBump = new Mul(bump, mask); var lsideImage = new Embossing(result, maskedBump); lsideImage.setMinValue(-edepth); lsideImage.setMaxValue(0); result = lsideImage; } if (args.rightImage !== undefined) { mask = new Mask(result, 0, edepth); maskShift = new Vector3d(-1, 0, 0); maskShift.scale(edepth); mask.setTransform(new Translation(maskShift)); bump = makeImage(args.rightImage, 0.84 * 2 * Cx, By + inRad, 12 * MM, false); trans = new CompositeTransform(); trans.add(new Rotation(0, 1, 0, Math.PI / 2)); trans.add(new Translation(-inRad, 0, 0)); bump.setTransform(trans); maskedBump = new Mul(bump, mask); var rsideImage = new Embossing(result, maskedBump); rsideImage.setMinValue(-edepth); rsideImage.setMaxValue(0); result = rsideImage; } var bounds = new Bounds(-gridWidth / 2, gridWidth / 2, -gridHeight / 2, gridHeight / 2, -gridWidth / 2, gridWidth / 2); var scene = new Scene(result, bounds, vs); scene.setName("SignetRing"); return scene; }
Preferences
Close
Printability Check
Region check
Voxel size
Number of regions
Largest region
Close