Резюме.
//сделать вhttps://openjscad.org/
Функция main(параметры)
{
// Главная точка входа; здесь мы создаём нашу твёрдую фигуру:
var gear = Gear(params).translate([dist,dist,0]);
params.numTeeth = params.numTeeth2;
Параметры. Циклическая высота = Параметры. Циклическая высота2;
Параметры.Угол давления = Параметры.Угол давления2;
params.clearance = params.clearance2;
params.thickness = params.thickness2;
gear = union(gear,Gear(params));
Возвратить передаточное устройство;
}
Функция Gear(параметры)
{
// Главная точка входа; здесь мы создаём наш твёрдый объект:
var gear = involuteGear(
params.numTeeth,
параметры. Циркулярный наклон,
params.pressureAngle,
параметры. разрешение,
厚度参数
);
если (радиус центрального отверстия в параметрах > 0)
{
var centerhole = CSG.cylinder({start: [0,0,-params.thickness], end: [0,0,params.thickness], radius: params.centerholeradius, resolution: 16});
gear = gear.subtract(centerhole);
}
Верни снаряжение;
}
// Здесь мы определяем параметры, которые могут быть отредактированы пользователем:
Функция getParameterDefinitions() {
Возвращаемся [
{ name: 'numTeeth', caption: 'Количество зубов:', type: 'int', default: 15 },
{ name: 'circularPitch', caption: 'Круговой питч:', type: 'float', default: 10 },
{ name: 'pressureAngle', caption: 'Угол давления:', type: 'float', default: 20 },
{ name: 'clearance', caption: 'Очищение:', type: 'float', default: 0 },
{ name: 'thickness', caption: 'Толщина:', type: 'float', default: 5 },
{ name: 'centerholeradius', caption: 'Радиус центрального отверстия (0 для отсутствия отверстия):', type: 'float', default: 2 },
];
}
Для терминологии по оборудованию см.:
http://www.astronomiainumbria.org/advanced_internet_files/meccanica/easyweb.easynet.co.uk/_chrish/geardata.htm
Алгоритм, основанный на:
http://www.cartertools.com/involute.html
Циркулярный шаг: расстояние между соседними зубами, измеренное на шаговом круге.
*/
Функция involuteGear(число зубьев, окружной шаг, угол давления, зазор, толщина)
{
// значения по умолчанию:
Если количество аргументов меньше 3, то угол давления равен 20.
Если количество аргументов меньше 4, то клиренс равен 0;
Если количество аргументов меньше 4, то толщина равна 1.
var addendum = circularPitch / Math.PI;
var dedendum = addendum + clearance;
// радиусы 4 кругов:
var радиус шага = количество зубовCircularPitch / (2Math.PI);
var baseRadius = pitchRadiusMath.cos(Math.PIpressureAngle / 180);
var outerRadius = pitchRadius + addendum;
var rootRadius = pitchRadius - dedendum;
var maxtanlength = Math.sqrt(внешний радиус)Внешний радиус - базовый радиус.baseRadius);
var maxangle = максимальная длина тангенса / радиус основания;
var tl_at_pitchcircle = Математический квадратный корень из радиуса питча.Питч-радиус - базовый радиус.baseRadius);
var угол в плоскости вращения = tl_at_pitchcircle / радиус основания;
var diffangle = угол на окружности питча - математический тангенс угла на окружности питча;
var ширина зуба в основании = МатПи / количество зубов + 2*угол разворота;
// построить один 2D-зуб в массиве 'точек':
var resolution = 5;
var points = [new CSG.Vector2D(0,0)];
для(var i = 0; i <= разрешение; i++)
{
// Первая сторона зуба:
var angle = maxangleЯ / резолюция;
Длина тангенса равна углу.радиус основания;
var radvector = CSG.Vector2D.fromAngle(angle);
var tanvector = radvector.normal();
var p = radvector.times(baseRadius).plus(tanvector.times(tanlength));
points[i+1] = p;
)
// создаём полигон и экструдируем его в 3D:
var tooth3d = new CSG.Polygon2D(points).extrude({offset: [0, 0, thickness]});
var allteeth = new CSG();
для (var i = 0; i < numTeeth; i++)
{
var angle = i*360/numTeeth;
var rotatedtooth = tooth3d.rotateZ(angle);
allteeth = allteeth.unionForNonIntersecting(rotatedtooth);
}
// построить корневой круг:
Очки = [];
var toothAngle = 2Math.PI / numTeeth;
var toothCenterAngle = 0.5Угол ширины зуба у основания;
для (var i = 0; i < numTeeth; i++)
{
var angle = toothCenterAngle + i * toothAngle;
var p = CSG.Vector2D.fromAngle(angle).times(rootRadius);
points.push(p);
}
// создаём полигон и экструдируем его в 3D:
var rootcircle = new CSG.Polygon2D(points).extrude({offset: [0, 0, thickness]});
var result = rootcircle.union(allteeth);
// центр в начале координат:
//результат = результат.translate([0, 0, -толщина/2]);
Возвращаем результат;
}
Source du modèle
