openjscad-aurora-webapp
163 строки · 6.6 Кб
1// title: Axis Coupler
2// author: Joost Nieuwenhuijse
3// license: MIT License
4
5var cylresolution=16;6
7// Here we define the user editable parameters:
8function getParameterDefinitions() {9return [10{11name: 'quality',12type: 'choice',13caption: 'Quality',14values: [0, 1],15captions: ["Draft","High"],16initial: 017},18
19{ name: 'diameter1', caption: 'Axis diameter of first coupler:', type: 'float', initial: 12.2 },20{ name: 'shaftlength1', caption: 'Axis depth of first coupler:', type: 'float', initial: 15 },21{ name: 'outerlength1', caption: 'Outer length of first coupler:', type: 'float', initial: 20 },22{ name: 'nutradius1', caption: 'Nut radius of first coupler:', type: 'float', initial: 4.65 },23{ name: 'nutthickness1', caption: 'Nut thickness of first coupler:', type: 'float', initial: 4.2},24{ name: 'screwdiameter1', caption: 'Screw diameter of first coupler:', type: 'float', initial: 5},25{ name: 'diameter2', caption: 'Axis diameter of second coupler:', type: 'float', initial: 9.5 },26{ name: 'shaftlength2', caption: 'Axis depth of second coupler:', type: 'float', initial: 10 },27{ name: 'outerlength2', caption: 'Outer length of second coupler:', type: 'float', initial: 15 },28{ name: 'nutradius2', caption: 'Nut radius of second coupler:', type: 'float', initial: 3.2 },29{ name: 'nutthickness2', caption: 'Nut thickness of second coupler:', type: 'float', initial: 2.6},30{ name: 'screwdiameter2', caption: 'Screw diameter of second coupler:', type: 'float', initial: 3},31{ name: 'outerdiameter', caption: 'Outer diameter:', type: 'float', initial: 30 },32{ name: 'spiderlength', caption: 'Spider thickness:', type: 'float', initial: 12 },33{ name: 'spidermargin', caption: 'Spider tolerance:', type: 'float', initial: 0 },34{ name: 'numteeth', caption: 'Num teeth per coupler:', type: 'int', initial: 2}35];36}
37
38function main(params)39{
40cylresolution=(params.quality == "1")? 64:16;41
42var outerdiameter=params.outerdiameter;43outerdiameter=Math.max(outerdiameter, params.diameter1+0.5);44outerdiameter=Math.max(outerdiameter, params.diameter2+0.5);45
46var spidercenterdiameter=outerdiameter/2;47
48var part1=makeShaft(params.diameter1, outerdiameter,spidercenterdiameter,params.shaftlength1,params.outerlength1,params.spiderlength, params.nutradius1, params.nutthickness1, params.screwdiameter1, params.numteeth);49var part2=makeShaft(params.diameter2, outerdiameter,spidercenterdiameter,params.shaftlength2,params.outerlength2,params.spiderlength, params.nutradius2, params.nutthickness2, params.screwdiameter2, params.numteeth);50var spider=makeSpider(outerdiameter, spidercenterdiameter, params.spiderlength, params.numteeth);51
52if(params.spidermargin > 0)53{54spider=spider.contract(params.spidermargin, 4);55}56
57// rotate shaft parts for better 3d printing:58part1=part1.rotateX(180).translate([0,0,params.outerlength1+params.spiderlength]);59part2=part2.rotateX(180).translate([0,0,params.outerlength2+params.spiderlength]);60
61var result=part1.translate([-outerdiameter-5,0,0]);62result=result.union(part2.translate([0,0,0]));63result=result.union(spider.translate([outerdiameter+5,0,-params.spidermargin]));64return result;65}
66
67function makeShaft(innerdiameter, outerdiameter, spidercenterdiameter, shaftlength, outerlength, spiderlength, nutradius, nutthickness, screwdiameter, numteeth)68{
69var result=CSG.cylinder({start:[0,0,0], end:[0,0,outerlength], radius:outerdiameter/2, resolution:cylresolution});70
71for(var i=0; i < numteeth; i++)72{73var angle=i*360/numteeth;74var pie=makePie(outerdiameter/2, spiderlength,angle-45/numteeth, angle+45/numteeth);75pie=pie.translate([0,0,outerlength]);76result=result.union(pie);77}78var spidercylinder=CSG.cylinder({start:[0,0,outerlength], end:[0,0,outerlength+spiderlength],radius:spidercenterdiameter/2,resolution:cylresolution});79result=result.subtract(spidercylinder);80var shaftcylinder=CSG.cylinder({start:[0,0,0], end:[0,0,shaftlength], radius:innerdiameter/2, resolution:cylresolution});81result=result.subtract(shaftcylinder);82
83var screwz=shaftlength/2;84if(screwz < nutradius) screwz=nutradius;85var nutcutout = hexagon(nutradius, nutthickness).translate([0,0,-nutthickness/2]);86var grubnutradiusAtFlatSide = nutradius * Math.cos(Math.PI / 180 * 30);87var nutcutoutrectangle = CSG.cube({88radius: [outerlength/2, grubnutradiusAtFlatSide, nutthickness/2],89center: [outerlength/2, 0, 0]90});91nutcutout = nutcutout.union(nutcutoutrectangle);92nutcutout = nutcutout.rotateY(90);93nutcutout = nutcutout.translate([(outerdiameter+innerdiameter)/4, 0, screwz]);94result = result.subtract(nutcutout);95
96var screwcutout=CSG.cylinder({97start: [outerdiameter/2, 0, screwz],98end: [0, 0, screwz],99radius: screwdiameter/2,100resolution:cylresolution101});102result=result.subtract(screwcutout);103
104//return nutcutout;
105// nutcutout = nutcutout.translate([-grubnutheight/2 - centerholeradius - nutdistance,0,0]);
106
107return result;108}
109
110function makePie(radius, height, startangle, endangle)111{
112var absangle=Math.abs(startangle-endangle);113if(absangle >= 180)114{115throw new Error("Pie angle must be less than 180 degrees");116}117var numsteps=cylresolution*absangle/360;118if(numsteps < 1) numsteps=1;119var points=[];120for(var i=0; i <= numsteps; i++)121{122var angle=startangle+i/numsteps*(endangle-startangle);123var vec = CSG.Vector2D.fromAngleDegrees(angle).times(radius);124points.push(vec);125}126points.push(new CSG.Vector2D(0,0));127var shape2d=new CSG.Polygon2D(points);128var extruded=shape2d.extrude({129offset: [0,0,height] // direction for extrusion130});131return extruded;132}
133
134function hexagon(radius, height)135{
136var vertices=[];137for(var i=0; i < 6; i++)138{139var point=CSG.Vector2D.fromAngleDegrees(-i*60).times(radius).toVector3D(0);140vertices.push(new CSG.Vertex(point));141}142var polygon=new CSG.Polygon(vertices);143var hex=polygon.extrude([0,0,height]);144return hex;145}
146
147function makeSpider(outerdiameter, spidercenterdiameter, spiderlength, numteeth)148{
149var result=new CSG();150var numspiderteeth=numteeth*2; // spider has twice the number of teeth151for(var i=0; i < numspiderteeth; i++)152{153var angle=i*360/numspiderteeth;154var pie=makePie(outerdiameter/2, spiderlength,angle-90/numspiderteeth, angle+90/numspiderteeth);155pie=pie.translate([0,0,0]);156result=result.union(pie);157}158
159var centercylinder=CSG.cylinder({start:[0,0,0], end:[0,0,spiderlength], radius:spidercenterdiameter/2, resolution:cylresolution});160result=result.union(centercylinder);161
162return result;163}
164
165