openjscad-aurora-webapp

Форк
0
/
axis-coupler.jscad 
163 строки · 6.6 Кб
1
// title: Axis Coupler
2
// author: Joost Nieuwenhuijse
3
// license: MIT License
4

5
var cylresolution=16;
6

7
// Here we define the user editable parameters: 
8
function getParameterDefinitions() {
9
  return [
10
    {
11
      name: 'quality', 
12
      type: 'choice',
13
      caption: 'Quality',
14
      values: [0, 1],
15
      captions: ["Draft","High"], 
16
      initial: 0
17
    },    
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

38
function main(params)
39
{
40
  cylresolution=(params.quality == "1")? 64:16;
41
 
42
  var outerdiameter=params.outerdiameter;
43
  outerdiameter=Math.max(outerdiameter, params.diameter1+0.5);
44
  outerdiameter=Math.max(outerdiameter, params.diameter2+0.5);
45

46
  var spidercenterdiameter=outerdiameter/2;
47
  
48
  var part1=makeShaft(params.diameter1, outerdiameter,spidercenterdiameter,params.shaftlength1,params.outerlength1,params.spiderlength, params.nutradius1, params.nutthickness1, params.screwdiameter1, params.numteeth);  
49
  var part2=makeShaft(params.diameter2, outerdiameter,spidercenterdiameter,params.shaftlength2,params.outerlength2,params.spiderlength, params.nutradius2, params.nutthickness2, params.screwdiameter2, params.numteeth);
50
  var spider=makeSpider(outerdiameter, spidercenterdiameter, params.spiderlength, params.numteeth);
51
  
52
  if(params.spidermargin > 0)
53
  {
54
    spider=spider.contract(params.spidermargin, 4);
55
  }
56
  
57
  // rotate shaft parts for better 3d printing:
58
  part1=part1.rotateX(180).translate([0,0,params.outerlength1+params.spiderlength]);
59
  part2=part2.rotateX(180).translate([0,0,params.outerlength2+params.spiderlength]);
60
  
61
  var result=part1.translate([-outerdiameter-5,0,0]);
62
  result=result.union(part2.translate([0,0,0]));
63
  result=result.union(spider.translate([outerdiameter+5,0,-params.spidermargin]));
64
  return result;
65
}
66

67
function makeShaft(innerdiameter, outerdiameter, spidercenterdiameter, shaftlength, outerlength, spiderlength, nutradius, nutthickness, screwdiameter, numteeth)
68
{
69
  var result=CSG.cylinder({start:[0,0,0], end:[0,0,outerlength], radius:outerdiameter/2, resolution:cylresolution});
70
  
71
  for(var i=0; i < numteeth; i++)
72
  {
73
    var angle=i*360/numteeth;
74
    var pie=makePie(outerdiameter/2, spiderlength,angle-45/numteeth, angle+45/numteeth); 
75
    pie=pie.translate([0,0,outerlength]);
76
    result=result.union(pie);
77
  }
78
  var spidercylinder=CSG.cylinder({start:[0,0,outerlength], end:[0,0,outerlength+spiderlength],radius:spidercenterdiameter/2,resolution:cylresolution});
79
  result=result.subtract(spidercylinder);
80
  var shaftcylinder=CSG.cylinder({start:[0,0,0], end:[0,0,shaftlength], radius:innerdiameter/2, resolution:cylresolution});
81
  result=result.subtract(shaftcylinder);
82
  
83
  var screwz=shaftlength/2;
84
  if(screwz < nutradius) screwz=nutradius;  
85
  var nutcutout = hexagon(nutradius, nutthickness).translate([0,0,-nutthickness/2]);
86
  var grubnutradiusAtFlatSide = nutradius * Math.cos(Math.PI / 180 * 30);
87
  var nutcutoutrectangle = CSG.cube({
88
    radius: [outerlength/2, grubnutradiusAtFlatSide, nutthickness/2],
89
    center: [outerlength/2, 0, 0]
90
  });
91
  nutcutout = nutcutout.union(nutcutoutrectangle);
92
  nutcutout = nutcutout.rotateY(90);
93
  nutcutout = nutcutout.translate([(outerdiameter+innerdiameter)/4, 0, screwz]);
94
  result = result.subtract(nutcutout);
95
  
96
  var screwcutout=CSG.cylinder({
97
    start: [outerdiameter/2, 0, screwz],
98
    end: [0, 0, screwz],
99
    radius: screwdiameter/2, 
100
    resolution:cylresolution
101
  });
102
  result=result.subtract(screwcutout);
103
  
104
//return nutcutout; 
105
//  nutcutout = nutcutout.translate([-grubnutheight/2 - centerholeradius - nutdistance,0,0]);
106
  
107
  return result;
108
}
109

110
function makePie(radius, height, startangle, endangle)
111
{
112
  var absangle=Math.abs(startangle-endangle);
113
  if(absangle >= 180)
114
  {
115
    throw new Error("Pie angle must be less than 180 degrees");
116
  }
117
  var numsteps=cylresolution*absangle/360;
118
  if(numsteps < 1) numsteps=1;
119
  var points=[];
120
  for(var i=0; i <= numsteps; i++)
121
  {
122
    var angle=startangle+i/numsteps*(endangle-startangle);
123
    var vec = CSG.Vector2D.fromAngleDegrees(angle).times(radius);
124
    points.push(vec);    
125
  }
126
  points.push(new CSG.Vector2D(0,0));
127
  var shape2d=new CSG.Polygon2D(points);
128
  var extruded=shape2d.extrude({
129
    offset: [0,0,height]   // direction for extrusion
130
  });
131
  return extruded;  
132
}
133

134
function hexagon(radius, height)
135
{
136
  var vertices=[];
137
  for(var i=0; i < 6; i++)
138
  {
139
    var point=CSG.Vector2D.fromAngleDegrees(-i*60).times(radius).toVector3D(0);
140
    vertices.push(new CSG.Vertex(point));
141
  }
142
  var polygon=new CSG.Polygon(vertices);
143
  var hex=polygon.extrude([0,0,height]);
144
  return hex;
145
}
146

147
function makeSpider(outerdiameter, spidercenterdiameter, spiderlength, numteeth)
148
{
149
  var result=new CSG();
150
  var numspiderteeth=numteeth*2; // spider has twice the number of teeth
151
  for(var i=0; i < numspiderteeth; i++)
152
  {
153
    var angle=i*360/numspiderteeth;
154
    var pie=makePie(outerdiameter/2, spiderlength,angle-90/numspiderteeth, angle+90/numspiderteeth); 
155
    pie=pie.translate([0,0,0]);
156
    result=result.union(pie);
157
  }
158

159
  var centercylinder=CSG.cylinder({start:[0,0,0], end:[0,0,spiderlength], radius:spidercenterdiameter/2, resolution:cylresolution});
160
  result=result.union(centercylinder);
161

162
  return result;
163
}
164

165

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.