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: "image", label: "Pattern Image", desc: "Image", type: "uri", defaultVal: "http:\/\/www.shapeways.com\/rrstatic\/img\/shapejs\/creator\/sw_logo.png" } ]; var voxelSize = 0.05*MM; function makeImage(path, width, height, thickness){ var img = new Image3D(path, width, height, thickness); img.setBaseThickness(0.0); img.setBlurWidth(0.5*voxelSize); img.setUseGrayscale(false); return img; } function main(args){ // see signet_ring.svg for drawing // user definable variables var imageThickness = 10*MM; var ringSize = 19.76*MM; // size 10 (24.64*MM; size 16), (16.51*MM; size 6) var ringThickness = 1.5*MM; var ringWidth = 2*MM; 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 = 0.95; // size fo image relative to bezel size // end of user definable variables var inRad = ringSize/2; var outRad = inRad + ringThickness; //var cylY = 1.5*MM; 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,imageThickness); 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 rounding = 0.2*MM; var gw = gridWidth; var gw2 = gridWidth/2; cutoff.add(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+rounding/2, gw, 2*(inRad+Ey), 2*cutR)); cutoff.add(new Box(0,-inRad, -Ex-rounding/2, gw, 2*(inRad+Ey), 2*cutR)); cutoff.setBlend(rounding); // TODO this blend rounds the inner edges but causes an artifact var fullRing = new Subtraction(ring, cutoff); fullRing.setBlend(0.1*MM); var ringWithImage = new Subtraction(fullRing, image); var bounds = new Bounds(-gridWidth/2, gridWidth/2, -gridHeight/2, gridHeight/2, -gridWidth/2, gridWidth/2); var scene = new Scene(ringWithImage,bounds,voxelSize); scene.setName("SignetRing"); return scene; }
Preferences
Close
Printability Check
Region check
Voxel size
Number of regions
Largest region
Close