链轮 平键和键槽的标准尺寸 计算 typescript

typescript 复制代码
export type ParallelKeywayRow = {
  kind: "shaft" | "hub";
  kindLabel: string;
  option: string;
  keySize: string;
  bMm: number;
  hMm: number;
  depthMm: number;
  remainingMm: number;
  standardRange: string;
};

type KeySize = {
  bMm: number;
  hMm: number;
  shaftDepthMm: number;
  hubDepthMm: number;
  range: string;
  minDiameterMm: number;
  maxDiameterMm: number;
};

// 按图纸标准尺寸表:直径区间只匹配该区间对应的标准键,不再额外混入相邻规格。
const KEY_SIZES: KeySize[] = [
  { bMm: 4, hMm: 4, shaftDepthMm: 2.5, hubDepthMm: 1.8, range: ">10--12", minDiameterMm: 10, maxDiameterMm: 12 },
  { bMm: 5, hMm: 5, shaftDepthMm: 3, hubDepthMm: 2.3, range: ">12--17", minDiameterMm: 12, maxDiameterMm: 17 },
  { bMm: 6, hMm: 6, shaftDepthMm: 3.5, hubDepthMm: 2.8, range: ">17--22", minDiameterMm: 17, maxDiameterMm: 22 },
  { bMm: 8, hMm: 7, shaftDepthMm: 4, hubDepthMm: 3.3, range: ">22--30", minDiameterMm: 22, maxDiameterMm: 30 },
];

function formatMm(value: number): number {
  return Math.round(value * 100) / 100;
}

export function calculateParallelKeyway(diameterMm: number):
  | { ok: true; diameterMm: number; rows: ParallelKeywayRow[] }
  | { ok: false; error: string } {
  if (!Number.isFinite(diameterMm) || diameterMm < 11 || diameterMm > 30) {
    return { ok: false, error: "轴/孔直径必须在 11--30 mm 范围内" };
  }

  const standardIndex = KEY_SIZES.findIndex(
    (size) => diameterMm > size.minDiameterMm && diameterMm <= size.maxDiameterMm,
  );
  if (standardIndex < 0) {
    return { ok: false, error: "没有找到对应的平键标准尺寸" };
  }

  const selected = KEY_SIZES.slice(Math.max(0, standardIndex - 1), standardIndex + 1);
  const rows: ParallelKeywayRow[] = [];

  selected.forEach((size, index) => {
    rows.push({
      kind: "shaft",
      kindLabel: "轴截面",
      option: "轴截面",
      keySize: `${size.bMm}×${size.hMm}`,
      bMm: size.bMm,
      hMm: size.hMm,
      depthMm: size.shaftDepthMm,
      remainingMm: formatMm(diameterMm - size.shaftDepthMm),
      standardRange: size.range,
    });
    rows.push({
      kind: "hub",
      kindLabel: "毂孔",
      option: "毂孔",
      keySize: `${size.bMm}×${size.hMm}`,
      bMm: size.bMm,
      hMm: size.hMm,
      depthMm: size.hubDepthMm,
      remainingMm: formatMm(diameterMm + size.hubDepthMm),
      standardRange: size.range,
    });
  });

  return { ok: true, diameterMm, rows };
}
相关推荐
shmily麻瓜小菜鸡1 小时前
TDD(测试驱动开发)详解
开发语言·javascript·typescript·node.js·ecmascript
雾隐隐o13 小时前
TypeScript 基础:数据类型、接口与类型推论
typescript
flash俊杰1 天前
Zod Schema 驱动的 IPC 契约:从入参校验到状态机一致性的三层防御
javascript·typescript
愛芳芳1 天前
基于 Electron + Vue3 的仿 PC 微信客户端项目实战
前端·javascript·css·elementui·typescript·electron·vue
神秘的猪头2 天前
TypeScript 高级用法全解析:从泛型到 infer,把类型系统真正用起来
前端·typescript
FYKJ_20102 天前
【毕设分享】基于Web的校园兼职信息发布与申请系统07059
前端·vue.js·spring boot·mysql·typescript·spark·课程设计
ynchyong3 天前
TS 基础
typescript·ts
西瓜太郎4993 天前
别再手算 Token 成本:用 React 状态机做一个可追溯的模型费用计算器
react.js·typescript
右耳朵猫AI3 天前
Web前端周刊2026W37 | Shopify 转原生、React 编译 Rust 化、Vitest 5.0、Rslib 1.0
前端·javascript·react.js·typescript·node.js
晚安日记wanna4 天前
TS const 类型参数一道面试题的四层追问
前端·面试·typescript