<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://www.pandoraburo.ru/" xml:lang="ru">
  <id>https://www.pandoraburo.ru/kalkulyator-zubchatykh-peredach</id>
  <link href="https://www.pandoraburo.ru/kalkulyator-zubchatykh-peredach.xml" rel="self"/>
  <title/>
  <subtitle type="html">
&lt;html lang="ru"&gt;
&lt;head&gt;
&lt;meta charset="utf-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt;
&lt;title&gt;⚙️ GearCalc Pro · Неоновый калькулятор зубчатых колёс&lt;/title&gt;
&lt;style&gt;
:root{
  --bg1:#05070f; --bg2:#0a0f1e; --bg3:#101830;
  --neon-cyan:#00f0ff; --neon-pink:#ff2bd6; --neon-green:#39ff14;
  --neon-orange:#ff8a1e; --neon-yellow:#f9ff00; --neon-violet:#b55cff;
  --text:#e8f4ff; --text-dim:#8aa0c0; --line:rgba(255,255,255,0.08);
}
*{margin:0;padding:0;box-sizing:border-box;font-family:'Segoe UI','Rajdhani',system-ui,sans-serif}
html,body{min-height:100vh;background:radial-gradient(ellipse at top,#0a1530 0%,var(--bg1) 70%);color:var(--text);overflow-x:hidden}
body::before{
  content:'';position:fixed;inset:0;pointer-events:none;z-index:0;
  background:
    radial-gradient(circle at 10% 20%, rgba(0,240,255,0.08), transparent 40%),
    radial-gradient(circle at 90% 80%, rgba(255,43,214,0.08), transparent 40%),
    radial-gradient(circle at 50% 50%, rgba(57,255,20,0.04), transparent 50%);
}
.container{max-width:1400px;margin:0 auto;padding:24px;position:relative;z-index:1}

/* Заголовок */
h1{
  font-size:clamp(1.8rem,3vw,2.6rem);font-weight:800;letter-spacing:1px;
  background:linear-gradient(90deg,var(--neon-cyan),var(--neon-pink),var(--neon-yellow));
  -webkit-background-clip:text;background-clip:text;color:transparent;
  text-shadow:0 0 30px rgba(0,240,255,0.3);margin-bottom:6px;
  display:flex;align-items:center;gap:14px;flex-wrap:wrap
}
h1 small{font-size:.85rem;font-weight:400;opacity:.7;color:var(--text-dim);margin-left:auto;-webkit-text-fill-color:var(--text-dim)}
.subtitle{color:var(--neon-green);font-size:.95rem;margin-bottom:22px;border-left:3px solid var(--neon-pink);padding-left:14px;
  text-shadow:0 0 12px rgba(57,255,20,0.6);letter-spacing:.5px;font-weight:600}

/* Табы */
.tabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:22px;border-bottom:1px solid var(--line);padding-bottom:8px}
.tab{
  background:rgba(255,255,255,0.03);border:1px solid var(--line);border-radius:12px;
  padding:10px 18px;color:var(--text-dim);cursor:pointer;font-size:.9rem;font-weight:600;
  transition:all .25s;letter-spacing:.5px;user-select:none
}
.tab:hover{color:var(--neon-cyan);border-color:var(--neon-cyan);box-shadow:0 0 16px rgba(0,240,255,0.3)}
.tab.active{
  background:linear-gradient(135deg,rgba(0,240,255,0.15),rgba(255,43,214,0.1));
  border-color:var(--neon-cyan);color:#fff;
  box-shadow:0 0 20px rgba(0,240,255,0.5),inset 0 0 20px rgba(0,240,255,0.08);
  text-shadow:0 0 8px var(--neon-cyan)
}
.tab-icon{margin-right:6px}

.tab-content{display:none;animation:fadeIn .3s ease}
.tab-content.active{display:block}
@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}

/* Карточки */
.card{
  background:linear-gradient(145deg,rgba(15,25,50,0.6),rgba(8,14,32,0.8));
  backdrop-filter:blur(10px);border:1px solid var(--line);border-radius:20px;
  padding:22px;margin-bottom:20px;
  box-shadow:0 8px 32px rgba(0,0,0,0.5),inset 0 1px 0 rgba(255,255,255,0.05)
}
.card h2{
  font-size:1.15rem;font-weight:700;margin-bottom:16px;padding-bottom:10px;
  border-bottom:1px solid var(--line);letter-spacing:.8px;text-transform:uppercase;
  display:flex;align-items:center;gap:10px
}
.card h2 .h2-neon-cyan{color:var(--neon-cyan);text-shadow:0 0 12px var(--neon-cyan)}
.card h2 .h2-neon-pink{color:var(--neon-pink);text-shadow:0 0 12px var(--neon-pink)}
.card h2 .h2-neon-green{color:var(--neon-green);text-shadow:0 0 12px var(--neon-green)}
.card h2 .h2-neon-orange{color:var(--neon-orange);text-shadow:0 0 12px var(--neon-orange)}
.card h2 .h2-neon-violet{color:var(--neon-violet);text-shadow:0 0 12px var(--neon-violet)}
.card h2 .h2-neon-yellow{color:var(--neon-yellow);text-shadow:0 0 12px var(--neon-yellow)}

/* Форма */
.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:14px 18px}
.field{display:flex;flex-direction:column;gap:4px}
.field label{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.8px;color:var(--neon-cyan);text-shadow:0 0 6px rgba(0,240,255,0.4)}
.field input,.field select{
  background:rgba(0,240,255,0.05);border:1px solid rgba(0,240,255,0.25);border-radius:10px;
  padding:10px 12px;font-size:1rem;color:#fff;outline:none;transition:all .2s;width:100%;font-weight:600
}
.field input:focus,.field select:focus{
  border-color:var(--neon-cyan);background:rgba(0,240,255,0.08);
  box-shadow:0 0 0 3px rgba(0,240,255,0.2),0 0 20px rgba(0,240,255,0.3)
}
.field input::placeholder{color:rgba(138,160,192,0.5)}
.field select option{background:#0a1530;color:#fff}
.field small{font-size:.7rem;color:var(--text-dim);margin-top:2px}

.btn{
  background:linear-gradient(135deg,var(--neon-cyan),var(--neon-pink));border:none;border-radius:40px;
  padding:12px 28px;font-size:1rem;font-weight:800;color:#000;cursor:pointer;
  transition:all .25s;letter-spacing:1px;text-transform:uppercase;
  box-shadow:0 0 25px rgba(0,240,255,0.5),0 0 50px rgba(255,43,214,0.3);
  display:inline-flex;align-items:center;gap:8px;margin-top:8px
}
.btn:hover{transform:translateY(-2px);box-shadow:0 0 40px rgba(0,240,255,0.7),0 0 60px rgba(255,43,214,0.5)}
.btn:active{transform:translateY(0)}
.btn-sm{padding:8px 16px;font-size:.85rem}
.btn-green{background:linear-gradient(135deg,var(--neon-green),#00aa44);box-shadow:0 0 25px rgba(57,255,20,0.5)}
.btn-orange{background:linear-gradient(135deg,var(--neon-orange),#ff4422);color:#000;box-shadow:0 0 25px rgba(255,138,30,0.5)}
.btn-violet{background:linear-gradient(135deg,var(--neon-violet),#6a1bd9);box-shadow:0 0 25px rgba(181,92,255,0.5)}

.hidden{display:none!important}

/* Сетка результатов */
.result-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.result-grid .card{margin-bottom:0}

/* Таблица результатов */
table.data{width:100%;border-collapse:collapse;font-size:.92rem}
table.data td{padding:8px 10px;border-bottom:1px solid rgba(0,240,255,0.08)}
table.data td:first-child{color:var(--text-dim);font-weight:500;width:48%}
table.data td:last-child{color:#fff;font-weight:700;text-align:right;font-family:'Consolas',monospace;text-shadow:0 0 6px rgba(0,240,255,0.3)}
table.data tr:hover td{background:rgba(0,240,255,0.04)}
.val-cyan{color:var(--neon-cyan)!important;text-shadow:0 0 8px var(--neon-cyan)!important}
.val-pink{color:var(--neon-pink)!important;text-shadow:0 0 8px var(--neon-pink)!important}
.val-green{color:var(--neon-green)!important;text-shadow:0 0 8px var(--neon-green)!important}
.val-orange{color:var(--neon-orange)!important;text-shadow:0 0 8px var(--neon-orange)!important}
.val-yellow{color:var(--neon-yellow)!important;text-shadow:0 0 8px var(--neon-yellow)!important}
.val-violet{color:var(--neon-violet)!important;text-shadow:0 0 8px var(--neon-violet)!important}

/* Предупреждения */
.alert{border-radius:14px;padding:14px 18px;margin:12px 0;font-size:.9rem;line-height:1.5;font-weight:600}
.alert-warn{background:rgba(255,138,30,0.08);border:1px solid rgba(255,138,30,0.4);color:var(--neon-orange);text-shadow:0 0 8px rgba(255,138,30,0.5)}
.alert-ok{background:rgba(57,255,20,0.06);border:1px solid rgba(57,255,20,0.3);color:var(--neon-green);text-shadow:0 0 8px rgba(57,255,20,0.4)}
.alert-err{background:rgba(255,43,214,0.08);border:1px solid rgba(255,43,214,0.4);color:var(--neon-pink);text-shadow:0 0 8px rgba(255,43,214,0.5)}

/* Canvas */
.canvas-wrap{background:rgba(0,0,0,0.4);border-radius:20px;padding:12px;border:1px solid var(--line);
  box-shadow:inset 0 0 40px rgba(0,240,255,0.05)}
canvas{display:block;width:100%;height:auto;border-radius:14px;background:radial-gradient(circle at 30% 30%,#0f1e3d,#030711)}

/* Блок действий */
.actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:16px}

/* Печать */
@media print{
  body{background:#fff;color:#000}
  .tabs,.btn,.field,.tab{display:none!important}
  .card{background:#fff;border:1px solid #000;color:#000;box-shadow:none}
  table.data td{color:#000}
  .val-cyan,.val-pink,.val-green,.val-orange,.val-yellow,.val-violet{color:#000;text-shadow:none}
}

/* Адаптив */
@media(max-width:900px){.result-grid{grid-template-columns:1fr}}
@media(max-width:540px){.form-grid{grid-template-columns:1fr 1fr;gap:10px}.container{padding:14px}}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="container"&gt;

&lt;h1&gt;⚙️ GearCalc Pro &lt;small&gt;Неоновый калькулятор для машиностроителей&lt;/small&gt;&lt;/h1&gt;
&lt;div class="subtitle"&gt;Геометрия · Производство · Контроль · Прочность · Экспорт&lt;/div&gt;

&lt;div class="tabs"&gt;
  &lt;div class="tab active" data-tab="geometry"&gt;&lt;span class="tab-icon"&gt;?&lt;/span&gt;Геометрия&lt;/div&gt;
  &lt;div class="tab" data-tab="reverse"&gt;&lt;span class="tab-icon"&gt;?&lt;/span&gt;Подбор по замерам&lt;/div&gt;
  &lt;div class="tab" data-tab="production"&gt;&lt;span class="tab-icon"&gt;?&lt;/span&gt;Производство&lt;/div&gt;
  &lt;div class="tab" data-tab="control"&gt;&lt;span class="tab-icon"&gt;?&lt;/span&gt;Контроль&lt;/div&gt;
  &lt;div class="tab" data-tab="strength"&gt;&lt;span class="tab-icon"&gt;?&lt;/span&gt;Прочность&lt;/div&gt;
  &lt;div class="tab" data-tab="export"&gt;&lt;span class="tab-icon"&gt;?&lt;/span&gt;Экспорт&lt;/div&gt;
&lt;/div&gt;


&lt;div class="tab-content active" id="tab-geometry"&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-cyan"&gt;▣&lt;/span&gt; Исходные данные&lt;/h2&gt;
  &lt;form id="geomForm" class="form-grid" onsubmit="event.preventDefault(); calcGeometry();"&gt;
    &lt;div class="field"&gt;&lt;label&gt;Тип зубьев&lt;/label&gt;
      &lt;select id="g_type"&gt;
        &lt;option value="spur"&gt;Прямозубая&lt;/option&gt;
        &lt;option value="helical" selected="selected"&gt;Косозубая&lt;/option&gt;
        &lt;option value="bevel"&gt;Коническая прямозубая&lt;/option&gt;
        &lt;option value="spiral"&gt;Коническая с круговым зубом&lt;/option&gt;
        &lt;option value="epicycloidal"&gt;Эпициклоидная&lt;/option&gt;
      &lt;/select&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Модуль m, мм&lt;/label&gt;&lt;input type="number" id="g_m" value="2" step="0.1" min="0.1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;z₁ (шестерня)&lt;/label&gt;&lt;input type="number" id="g_z1" value="20" step="1" min="5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;z₂ (колесо)&lt;/label&gt;&lt;input type="number" id="g_z2" value="30" step="1" min="5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Угол α, °&lt;/label&gt;&lt;input type="number" id="g_alpha" value="20" step="0.5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;ha*&lt;/label&gt;&lt;input type="number" id="g_ha" value="1" step="0.05" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;c*&lt;/label&gt;&lt;input type="number" id="g_c" value="0.25" step="0.05" /&gt;&lt;/div&gt;
    &lt;div class="field" id="g_x1_w"&gt;&lt;label&gt;Смещение x₁&lt;/label&gt;&lt;input type="number" id="g_x1" value="0" step="0.01" /&gt;&lt;/div&gt;
    &lt;div class="field" id="g_x2_w"&gt;&lt;label&gt;Смещение x₂&lt;/label&gt;&lt;input type="number" id="g_x2" value="0" step="0.01" /&gt;&lt;/div&gt;
    &lt;div class="field hidden" id="g_beta_w"&gt;&lt;label&gt;Угол β, °&lt;/label&gt;&lt;input type="number" id="g_beta" value="15" step="0.5" /&gt;&lt;/div&gt;
    &lt;div class="field hidden" id="g_delta_w"&gt;&lt;label&gt;δ₁, ° (коническая)&lt;/label&gt;&lt;input type="number" id="g_delta1" value="33.69" step="0.1" /&gt;&lt;/div&gt;
    &lt;div class="field hidden" id="g_bsp_w"&gt;&lt;label&gt;β спирали, °&lt;/label&gt;&lt;input type="number" id="g_bsp" value="35" step="0.5" /&gt;&lt;/div&gt;
    &lt;button type="submit" class="btn"&gt;⚡ Рассчитать&lt;/button&gt;
  &lt;/form&gt;
&lt;/div&gt;

&lt;div class="result-grid"&gt;
  &lt;div class="card"&gt;
    &lt;h2&gt;&lt;span class="h2-neon-pink"&gt;▣&lt;/span&gt; Геометрия&lt;/h2&gt;
    &lt;table class="data" id="geomT1"&gt;&lt;/table&gt;
  &lt;/div&gt;
  &lt;div class="card"&gt;
    &lt;h2&gt;&lt;span class="h2-neon-green"&gt;▣&lt;/span&gt; Дополнительно&lt;/h2&gt;
    &lt;table class="data" id="geomT2"&gt;&lt;/table&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-orange"&gt;▣&lt;/span&gt; Визуализация&lt;/h2&gt;
  &lt;div id="geomAlert"&gt;&lt;/div&gt;
  &lt;div class="canvas-wrap"&gt;&lt;canvas id="cvGeom" width="900" height="440"&gt;&lt;/canvas&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div class="tab-content" id="tab-reverse"&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-violet"&gt;▣&lt;/span&gt; Обратный подбор модуля по замерам&lt;/h2&gt;
  &lt;div class="form-grid"&gt;
    &lt;div class="field"&gt;&lt;label&gt;Способ подбора&lt;/label&gt;
      &lt;select id="rv_mode"&gt;
        &lt;option value="da"&gt;По диаметру вершин da&lt;/option&gt;
        &lt;option value="a"&gt;По межосевому a&lt;/option&gt;
        &lt;option value="p"&gt;По шагу p&lt;/option&gt;
        &lt;option value="h"&gt;По высоте зуба h&lt;/option&gt;
      &lt;/select&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;z шестерни&lt;/label&gt;&lt;input type="number" id="rv_z" value="20" step="1" min="5" /&gt;&lt;/div&gt;
    &lt;div class="field" id="rv_z2_w"&gt;&lt;label&gt;z₂ колеса&lt;/label&gt;&lt;input type="number" id="rv_z2" value="30" step="1" min="5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Измеренное значение, мм&lt;/label&gt;&lt;input type="number" id="rv_val" value="44" step="0.01" /&gt;&lt;/div&gt;
    &lt;button type="button" class="btn btn-violet" onclick="calcReverse()"&gt;? Подобрать&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-pink"&gt;▣&lt;/span&gt; Результат подбора&lt;/h2&gt;
  &lt;div id="rvOut"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div class="tab-content" id="tab-production"&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-yellow"&gt;▣&lt;/span&gt; Делительная головка&lt;/h2&gt;
  &lt;div class="form-grid"&gt;
    &lt;div class="field"&gt;&lt;label&gt;Передаточное головки N&lt;/label&gt;&lt;input type="number" id="pr_N" value="40" step="1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Число зубьев z&lt;/label&gt;&lt;input type="number" id="pr_z" value="37" step="1" min="3" /&gt;&lt;/div&gt;
    &lt;button type="button" class="btn btn-orange" onclick="calcIndexHead()"&gt;⚙️ Рассчитать&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-cyan"&gt;▣&lt;/span&gt; Номер модульной фрезы (ГОСТ)&lt;/h2&gt;
  &lt;div class="form-grid"&gt;
    &lt;div class="field"&gt;&lt;label&gt;Тип&lt;/label&gt;
      &lt;select id="fr_type"&gt;&lt;option value="spur"&gt;Прямозубая&lt;/option&gt;&lt;option value="helical"&gt;Косозубая&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;z или z_v&lt;/label&gt;&lt;input type="number" id="fr_z" value="20" step="1" /&gt;&lt;/div&gt;
    &lt;div class="field" id="fr_beta_w"&gt;&lt;label&gt;β, °&lt;/label&gt;&lt;input type="number" id="fr_beta" value="15" step="0.5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;α, °&lt;/label&gt;&lt;input type="number" id="fr_alpha" value="20" step="0.5" /&gt;&lt;/div&gt;
    &lt;button type="button" class="btn" onclick="calcCutter()"&gt;? Найти фрезу&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="result-grid"&gt;
  &lt;div class="card"&gt;&lt;h2&gt;&lt;span class="h2-neon-green"&gt;▣&lt;/span&gt; Делительная головка — результат&lt;/h2&gt;&lt;div id="prIndexOut"&gt;&lt;/div&gt;&lt;/div&gt;
  &lt;div class="card"&gt;&lt;h2&gt;&lt;span class="h2-neon-pink"&gt;▣&lt;/span&gt; Модульная фреза&lt;/h2&gt;&lt;div id="prCutterOut"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div class="tab-content" id="tab-control"&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-cyan"&gt;▣&lt;/span&gt; Размер по роликам M и общая нормаль W&lt;/h2&gt;
  &lt;div class="form-grid"&gt;
    &lt;div class="field"&gt;&lt;label&gt;Тип&lt;/label&gt;
      &lt;select id="c_type"&gt;&lt;option value="external"&gt;Наружное (z-чётное)&lt;/option&gt;&lt;option value="external_odd"&gt;Наружное (z-нечётное)&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;m, мм&lt;/label&gt;&lt;input type="number" id="c_m" value="2" step="0.1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;z&lt;/label&gt;&lt;input type="number" id="c_z" value="20" step="1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;α, °&lt;/label&gt;&lt;input type="number" id="c_alpha" value="20" step="0.5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;β, ° (0 — прям.)&lt;/label&gt;&lt;input type="number" id="c_beta" value="0" step="0.5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;x (смещение)&lt;/label&gt;&lt;input type="number" id="c_x" value="0" step="0.01" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;d_ролика, мм&lt;/label&gt;&lt;input type="number" id="c_dp" value="3.36" step="0.01" /&gt;&lt;/div&gt;
    &lt;button type="button" class="btn" onclick="calcMeasure()"&gt;? Рассчитать&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-pink"&gt;▣&lt;/span&gt; Результаты контроля&lt;/h2&gt;
  &lt;div id="ctrlOut"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div class="tab-content" id="tab-strength"&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-orange"&gt;▣&lt;/span&gt; Исходные данные для расчёта прочности (упрощённо по ГОСТ 21354)&lt;/h2&gt;
  &lt;div class="form-grid"&gt;
    &lt;div class="field"&gt;&lt;label&gt;Мощность P, кВт&lt;/label&gt;&lt;input type="number" id="s_P" value="5" step="0.1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Частота n₁, об/мин&lt;/label&gt;&lt;input type="number" id="s_n" value="1500" step="10" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Модуль m, мм&lt;/label&gt;&lt;input type="number" id="s_m" value="2" step="0.1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;z₁&lt;/label&gt;&lt;input type="number" id="s_z1" value="20" step="1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;z₂&lt;/label&gt;&lt;input type="number" id="s_z2" value="30" step="1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;β, °&lt;/label&gt;&lt;input type="number" id="s_beta" value="15" step="0.5" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Ширина венца b, мм&lt;/label&gt;&lt;input type="number" id="s_b" value="20" step="1" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Коэф. нагрузки K&lt;/label&gt;&lt;input type="number" id="s_K" value="1.3" step="0.05" /&gt;&lt;/div&gt;
    &lt;div class="field"&gt;&lt;label&gt;Материал&lt;/label&gt;
      &lt;select id="s_mat"&gt;
        &lt;option value="steel"&gt;Сталь улучшенная (σ_Hlim=580 МПа)&lt;/option&gt;
        &lt;option value="steel_h"&gt;Сталь закалённая (σ_Hlim=900 МПа)&lt;/option&gt;
        &lt;option value="iron"&gt;Чугун (σ_Hlim=400 МПа)&lt;/option&gt;
      &lt;/select&gt;&lt;/div&gt;
    &lt;button type="button" class="btn btn-orange" onclick="calcStrength()"&gt;? Рассчитать&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-green"&gt;▣&lt;/span&gt; Результаты прочностного расчёта&lt;/h2&gt;
  &lt;div id="strOut"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div class="tab-content" id="tab-export"&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-violet"&gt;▣&lt;/span&gt; Экспорт результатов&lt;/h2&gt;
  &lt;p style="color:var(--text-dim);margin-bottom:14px"&gt;Экспортируйте все рассчитанные данные на вкладке «Геометрия». PDF — через диалог печати браузера. DXF — профиль зуба для CAD.&lt;/p&gt;
  &lt;div class="actions"&gt;
    &lt;button class="btn btn-violet" onclick="exportPDF()"&gt;? Экспорт в PDF&lt;/button&gt;
    &lt;button class="btn btn-green" onclick="exportDXF()"&gt;? Экспорт профиля (DXF)&lt;/button&gt;
    &lt;button class="btn" onclick="copyReport()"&gt;? Копировать отчёт&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="card"&gt;
  &lt;h2&gt;&lt;span class="h2-neon-cyan"&gt;▣&lt;/span&gt; Предпросмотр отчёта&lt;/h2&gt;
  &lt;pre id="expPreview" style="background:rgba(0,0,0,0.4);padding:16px;border-radius:12px;color:var(--neon-green);font-family:Consolas,monospace;font-size:.85rem;overflow:auto;white-space:pre-wrap;max-height:400px;text-shadow:0 0 6px rgba(57,255,20,0.4)"&gt;Сначала рассчитайте параметры на вкладке «Геометрия».&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;script&gt;
// ============ ВКЛАДКИ ============
document.querySelectorAll('.tab').forEach(t=&gt;{
  t.addEventListener('click',()=&gt;{
    document.querySelectorAll('.tab').forEach(x=&gt;x.classList.remove('active'));
    document.querySelectorAll('.tab-content').forEach(x=&gt;x.classList.remove('active'));
    t.classList.add('active');
    document.getElementById('tab-'+t.dataset.tab).classList.add('active');
  });
});

// ============ УТИЛИТЫ ============
const $=id=&gt;document.getElementById(id);
const deg=r=&gt;r*180/Math.PI, rad=d=&gt;d*Math.PI/180;
const fmt=(v,n=3)=&gt;v==null||isNaN(v)?'—':Number(v).toFixed(n);
function solveInv(t){if(t&lt;=0)return 0;let lo=1e-6,hi=1.45;while(Math.tan(hi)-hi&lt;t&amp;&amp;hi&lt;1.56)hi+=.01;for(let i=0;i&lt;100;i++){const m=(lo+hi)/2;if(Math.tan(m)-m&lt;t)lo=m;else hi=m}return(lo+hi)/2}
function inv(a){return Math.tan(a)-a}
function row(a,b,cls='val-cyan'){return `&lt;tr&gt;&lt;td&gt;${a}&lt;/td&gt;&lt;td class="${cls}"&gt;${b}&lt;/td&gt;&lt;/tr&gt;`}
function alertBox(msg,type='warn'){const cls={warn:'alert-warn',ok:'alert-ok',err:'alert-err'}[type];return `&lt;div class="alert ${cls}"&gt;${msg}&lt;/div&gt;`}

// ============ ВКЛАДКА 1: ГЕОМЕТРИЯ ============
const gType=$('g_type');
function updGeomFields(){
  const t=gType.value;
  $('g_beta_w').classList.toggle('hidden',t!=='helical');
  $('g_delta_w').classList.toggle('hidden',t!=='bevel'&amp;&amp;t!=='spiral');
  $('g_bsp_w').classList.toggle('hidden',t!=='spiral');
  $('g_x1_w').classList.toggle('hidden',t==='bevel'||t==='spiral');
  $('g_x2_w').classList.toggle('hidden',t==='bevel'||t==='spiral');
}
gType.addEventListener('change',updGeomFields);updGeomFields();

let lastGeom=null;
function calcGeometry(){
  const type=gType.value;
  const m=+$('g_m').value, z1=+$('g_z1').value, z2=+$('g_z2').value;
  const alpha=+$('g_alpha').value, ha=+$('g_ha').value, c=+$('g_c').value;
  const alphaR=rad(alpha);
  const warns=[];
  let R={};

  if(m&lt;=0){warns.push('Модуль должен быть положительным.');$('geomAlert').innerHTML=alertBox(warns.join('&lt;br&gt;'),'err');return}
  if(z1&lt;3||z2&lt;3){warns.push('z должно быть ≥ 3');$('geomAlert').innerHTML=alertBox(warns.join('&lt;br&gt;'),'err');return}

  if(type==='spur'||type==='helical'){
    const x1=+$('g_x1').value,x2=+$('g_x2').value;
    const betaDeg=type==='helical'?+$('g_beta').value:0;
    const betaR=rad(betaDeg),cosB=Math.cos(betaR);
    const mt=m/cosB;
    const alpha_t=Math.atan(Math.tan(alphaR)/cosB);
    const d1=mt*z1,d2=mt*z2;
    const db1=d1*Math.cos(alpha_t),db2=d2*Math.cos(alpha_t);
    const a_std=mt*(z1+z2)/2;
    const inv_t=inv(alpha_t);
    const inv_w=inv_t+2*(x1+x2)*Math.tan(alphaR)/(z1+z2);
    const alpha_w=solveInv(Math.max(0,inv_w));
    const cosAw=Math.cos(alpha_w);
    const aw=(cosAw&gt;1e-9)?a_std*Math.cos(alpha_t)/cosAw:a_std;
    const y=(z1+z2)/(2*cosB)*(Math.cos(alpha_t)/(cosAw||1)-1);
    const dY=(x1+x2)-y;
    const da1=d1+2*m*(ha+x1-dY);
    const da2=d2+2*m*(ha+x2-dY);
    const df1=d1-2*m*(ha+c-x1);
    const df2=d2-2*m*(ha+c-x2);
    const h=((da1-df1)+(da2-df2))/4;
    const p_t=Math.PI*mt,p_n=Math.PI*m,p_bt=p_t*Math.cos(alpha_t);
    const s_t1=mt*(Math.PI/2+2*x1*Math.tan(alphaR));
    const s_t2=mt*(Math.PI/2+2*x2*Math.tan(alphaR));
    const zv1=z1/Math.pow(cosB,3),zv2=z2/Math.pow(cosB,3);
    const zvMin=2*ha/Math.pow(Math.sin(alphaR),2);
    const zMin=zvMin*Math.pow(cosB,3);
    const xMin1=ha*(zvMin-zv1)/zvMin,xMin2=ha*(zvMin-zv2)/zvMin;
    if(x1&lt;xMin1-1e-6)warns.push(`z₁: для защиты от подрезания x₁ ≥ ${xMin1.toFixed(3)}`);
    if(x2&lt;xMin2-1e-6)warns.push(`z₂: для защиты от подрезания x₂ ≥ ${xMin2.toFixed(3)}`);
    if(z1&lt;zMin)warns.push(`z₁ &lt; минимума z ≈ ${zMin.toFixed(1)}`);
    if(z2&lt;zMin)warns.push(`z₂ &lt; минимума z ≈ ${zMin.toFixed(1)}`);
    if(type==='helical'&amp;&amp;betaDeg&lt;8)warns.push(`β=${betaDeg}° мал (обычно 8°…30°)`);
    const ra1=da1/2,ra2=da2/2,rb1=db1/2,rb2=db2/2;
    const g=Math.sqrt(Math.max(0,ra1*ra1-rb1*rb1))+Math.sqrt(Math.max(0,ra2*ra2-rb2*rb2))-aw*Math.sin(alpha_w);
    const eps=g/(Math.PI*mt*Math.cos(alpha_t));
    if(eps&lt;1)warns.push(`εα=${eps.toFixed(3)} &lt; 1 — возможен разрыв зацепления`);
    else if(eps&lt;1.1)warns.push(`εα=${eps.toFixed(3)} — низкий запас`);

    R={type,m,mt,alpha,beta:betaDeg,alpha_t:deg(alpha_t),alpha_w:deg(alpha_w),z1,z2,u:z2/z1,d1,d2,db1,db2,da1,da2,df1,df2,h,a_std,aw,p_t,p_n,p_bt,s_t1,s_t2,zv1,zv2,zMin,xMin1,xMin2,x1,x2,dY,eps};
  } else if(type==='bevel'||type==='spiral'){
    const d1Deg=+$('g_delta1').value,d1R=rad(d1Deg);
    const beta=type==='spiral'?+$('g_bsp').value:0;
    const d2R=Math.PI/2-d1R,d2Deg=deg(d2R);
    const exp=deg(Math.atan(z1/z2));
    if(Math.abs(d1Deg-exp)&gt;0.5)warns.push(`Для Σ=90° рекомендуется δ₁ ≈ ${exp.toFixed(2)}°`);
    const de1=m*z1,de2=m*z2;
    const Re=de1/(2*Math.sin(d1R));
    const da1=de1+2*m*Math.cos(d1R),da2=de2+2*m*Math.cos(d2R);
    const df1=de1-2.4*m*Math.cos(d1R),df2=de2-2.4*m*Math.cos(d2R);
    const h=2.2*m;
    const b=Math.min(10*m,0.3*Re);
    R={type,m,alpha,z1,z2,u:z2/z1,d1:de1,d2:de2,da1,da2,df1,df2,h,delta1:d1Deg,delta2:d2Deg,Re,b,beta,eps:1.0,bevel:true};
  } else {
    const d1=m*z1,d2=m*z2;
    const da1=d1+2.2*m,da2=d2+2.2*m;
    const df1=d1-2.6*m,df2=d2-2.6*m;
    const h=2.4*m,aw=(d1+d2)/2;
    warns.push('Эпициклоидная — приближённый расчёт');
    R={type,m,alpha,z1,z2,u:z2/z1,d1,d2,da1,da2,df1,df2,h,aw,eps:1.3,epicycloidal:true,beta:0};
  }

  lastGeom=R;
  renderGeom(R);
  renderGeomAlert(warns);
  drawGears(R);
  updateExportPreview();
}

function renderGeom(R){
  const f=fmt,d=deg;
  const names={spur:'Прямозубая',helical:'Косозубая',bevel:'Коническая прямозубая',spiral:'Коническая круговой зуб',epicycloidal:'Эпициклоидная'};
  let t1='',t2='';
  t1+=row('Тип',names[R.type],'val-cyan');
  t1+=row('Модуль m',f(R.m)+' мм','val-green');
  if(R.type==='helical')t1+=row('Модуль m_t',f(R.mt)+' мм');
  t1+=row('Угол α',f(R.alpha)+'°');
  if(R.type==='helical'){t1+=row('Угол β',f(R.beta)+'°');t1+=row('Угол α_t',f(R.alpha_t)+'°');t1+=row('Угол α_w',f(R.alpha_w)+'°','val-pink')}
  if(R.bevel){t1+=row('δ₁ / δ₂',f(R.delta1,2)+'° / '+f(R.delta2,2)+'°','val-violet')}
  t1+=row('z₁ / z₂',R.z1+' / '+R.z2);
  t1+=row('Передаточное u',f(R.u,4));
  t1+=row('Делит. d₁',f(R.d1)+' мм','val-cyan');
  t1+=row('Делит. d₂',f(R.d2)+' мм','val-cyan');
  if(!R.bevel&amp;&amp;!R.epicycloidal){t1+=row('Основной db₁',f(R.db1)+' мм');t1+=row('Основной db₂',f(R.db2)+' мм')}
  t1+=row('Вершин da₁',f(R.da1)+' мм','val-green');
  t1+=row('Вершин da₂',f(R.da2)+' мм','val-green');
  t1+=row('Впадин df₁',f(R.df1)+' мм','val-pink');
  t1+=row('Впадин df₂',f(R.df2)+' мм','val-pink');
  t1+=row('Высота зуба h',f(R.h)+' мм');
  if(!R.bevel){t1+=row('Межос. a (стд)',f(R.a_std)+' мм');t1+=row('Межос. a_w (раб)',f(R.aw)+' мм','val-orange')}
  if(!R.bevel&amp;&amp;!R.epicycloidal){t1+=row('x₁ / x₂',f(R.x1,3)+' / '+f(R.x2,3));t1+=row('Δy',f(R.dY,4))}
  if(R.bevel)t1+=row('Конус. R_e',f(R.Re)+' мм');
  if(R.epicycloidal)t1+=row('Межос. a_w',f(R.aw)+' мм');

  if(!R.bevel&amp;&amp;!R.epicycloidal){
    t2+=row('z_v₁ / z_v₂',f(R.zv1,2)+' / '+f(R.zv2,2),'val-violet');
    t2+=row('z_min без подрез.',f(R.zMin,1));
    t2+=row('x₁_min / x₂_min',f(R.xMin1,3)+' / '+f(R.xMin2,3));
    t2+=row('Шаг p_t',f(R.p_t)+' мм');
    t2+=row('Шаг p_n',f(R.p_n)+' мм');
    t2+=row('Шаг p_bt',f(R.p_bt)+' мм');
    t2+=row('Толщина s_t₁',f(R.s_t1)+' мм','val-orange');
    t2+=row('Толщина s_t₂',f(R.s_t2)+' мм','val-orange');
  }
  t2+=row('ε_α (перекрытие)',f(R.eps,3),'val-yellow');
  if(R.bevel){t2+=row('Ширина b (рек.)',f(R.b)+' мм')}

  $('geomT1').innerHTML=t1;
  $('geomT2').innerHTML=t2;
}
function renderGeomAlert(w){
  if(!w||!w.length){$('geomAlert').innerHTML=alertBox('✓ Геометрия рассчитана без критичных отклонений.','ok');return}
  $('geomAlert').innerHTML=w.map(m=&gt;alertBox('⚠ '+m,'warn')).join('');
}

// ============ CANVAS ============
function drawGears(R){
  const cv=$('cvGeom'),ctx=cv.getContext('2d');
  const W=cv.width,H=cv.height;
  ctx.clearRect(0,0,W,H);
  // Сетка
  ctx.strokeStyle='rgba(0,240,255,0.08)';ctx.lineWidth=1;
  for(let x=0;x&lt;W;x+=40){ctx.beginPath();ctx.moveTo(x,0);ctx.lineTo(x,H);ctx.stroke()}
  for(let y=0;y&lt;H;y+=40){ctx.beginPath();ctx.moveTo(0,y);ctx.lineTo(W,y);ctx.stroke()}

  const maxD=Math.max(R.da1,R.da2);
  const scale=Math.min((W*0.72)/(R.d1+R.d2+40),H*0.42/(maxD+20));
  const gap=25;
  const cx1=(W-(R.d1+R.d2)*scale-gap)/2+R.d1*scale/2;
  const cx2=W-(W-(R.d1+R.d2)*scale-gap)/2-R.d2*scale/2;
  const cy=H/2;

  function drawGear(cx,cy,z,d,da,df,color,label){
    const Ra=da/2*scale,Rf=df/2*scale,Rd=d/2*scale;
    const step=2*Math.PI/z;
    // Окружность впадин (свечение)
    ctx.shadowColor=color;ctx.shadowBlur=20;
    ctx.beginPath();ctx.arc(cx,cy,Rf,0,2*Math.PI);
    ctx.fillStyle='rgba(10,20,40,0.6)';ctx.fill();
    ctx.shadowBlur=0;
    // Зубья
    ctx.shadowColor=color;ctx.shadowBlur=12;
    for(let i=0;i&lt;z;i++){
      const a=i*step-Math.PI/2;
      const a1=a+step*0.15,a2=a+step*0.85;
      ctx.beginPath();
      ctx.moveTo(cx+Rf*Math.cos(a),cy+Rf*Math.sin(a));
      ctx.lineTo(cx+Ra*Math.cos(a1),cy+Ra*Math.sin(a1));
      ctx.lineTo(cx+Ra*Math.cos(a2),cy+Ra*Math.sin(a2));
      ctx.lineTo(cx+Rf*Math.cos(a+step),cy+Rf*Math.sin(a+step));
      ctx.closePath();
      ctx.fillStyle=color+'cc';ctx.fill();
      ctx.strokeStyle='#fff';ctx.lineWidth=1;ctx.stroke();
    }
    ctx.shadowBlur=0;
    // Делительная окружность пунктиром
    ctx.setLineDash([5,6]);
    ctx.strokeStyle='#f9ff00';ctx.lineWidth=1.5;
    ctx.shadowColor='#f9ff00';ctx.shadowBlur=10;
    ctx.beginPath();ctx.arc(cx,cy,Rd,0,2*Math.PI);ctx.stroke();
    ctx.setLineDash([]);ctx.shadowBlur=0;
    // Центр
    ctx.fillStyle='#fff';
    ctx.beginPath();ctx.arc(cx,cy,2.5,0,2*Math.PI);ctx.fill();
    // Подпись
    ctx.shadowColor=color;ctx.shadowBlur=8;
    ctx.fillStyle='#fff';ctx.font='bold 15px Segoe UI';ctx.textAlign='center';ctx.textBaseline='bottom';
    ctx.fillText(label,cx,cy-Ra-18);
    ctx.shadowBlur=0;
    ctx.fillStyle='rgba(255,255,255,0.6)';ctx.font='12px Consolas';
    ctx.fillText(`d=${d.toFixed(1)}`,cx,cy+Ra+20);
  }

  drawGear(cx1,cy,R.z1,R.d1,R.da1,R.df1,'#00f0ff','z₁ = '+R.z1);
  drawGear(cx2,cy,R.z2,R.d2,R.da2,R.df2,'#ff2bd6','z₂ = '+R.z2);

  // Межосевая линия
  ctx.setLineDash([4,6]);ctx.strokeStyle='rgba(255,255,255,0.3)';
  ctx.beginPath();ctx.moveTo(cx1,cy+40);ctx.lineTo(cx2,cy+40);ctx.stroke();
  ctx.setLineDash([]);
  const awVal=(R.aw!=null?R.aw:(R.d1+R.d2)/2).toFixed(1);
  ctx.fillStyle='#f9ff00';ctx.font='bold 13px Consolas';ctx.textAlign='center';ctx.textBaseline='top';
  ctx.shadowColor='#f9ff00';ctx.shadowBlur=8;
  ctx.fillText(`a = ${awVal} мм`,(cx1+cx2)/2,cy+46);
  ctx.shadowBlur=0;

  // Заголовок
  ctx.fillStyle='rgba(255,255,255,0.25)';ctx.font='italic 12px Segoe UI';ctx.textAlign='right';
  const names={spur:'Прямозубая',helical:'Косозубая',bevel:'Коническая',spiral:'Круговой зуб',epicycloidal:'Эпициклоидная'};
  ctx.fillText(names[R.type]||R.type,W-20,H-12);
}

// ============ ВКЛАДКА 2: ПОДБОР ============
function calcReverse(){
  const mode=$('rv_mode').value;
  const z=+$('rv_z').value,z2=+$('rv_z2').value,v=+$('rv_val').value;
  let m_calc=null,text='';
  if(mode==='da'){m_calc=v/(z+2);text=`m ≈ da / (z+2) = ${v} / ${z+2}`}
  else if(mode==='a'){m_calc=2*v/(z+z2);text=`m ≈ 2a / (z₁+z₂) = 2·${v} / ${z+z2}`}
  else if(mode==='p'){m_calc=v/Math.PI;text=`m = p / π = ${v} / π`}
  else if(mode==='h'){m_calc=v/2.25;text=`m ≈ h / 2.25 = ${v} / 2.25`}
  const series=[0.5,0.6,0.8,1,1.25,1.5,2,2.5,3,4,5,6,8,10,12,16,20,25];
  let best=series[0],bd=1e9;
  series.forEach(s=&gt;{const d=Math.abs(s-m_calc);if(d&lt;bd){bd=d;best=s}});
  let html=alertBox(`Расчётный модуль: &lt;b&gt;${m_calc.toFixed(3)} мм&lt;/b&gt;`,'ok');
  html+=alertBox(`Формула: ${text}`,'warn');
  html+=alertBox(`Ближайший стандартный модуль (ГОСТ 9563): &lt;b&gt;m = ${best} мм&lt;/b&gt; (отклонение ${(bd/m_calc*100).toFixed(2)}%)`,'ok');
  if(bd/m_calc&gt;0.05)html+=alertBox('⚠ Отклонение от стандарта &gt;5% — возможна нестандартная передача или смещение','warn');
  $('rvOut').innerHTML=html;
}

// ============ ВКЛАДКА 3: ПРОИЗВОДСТВО ============
function calcIndexHead(){
  const N=+$('pr_N').value,z=+$('pr_z').value;
  const turns=N/z;
  const full=Math.floor(turns);
  const frac=turns-full;
  const holes=[15,16,17,18,19,20,21,23,24,27,29,30,31,33,34,37,39,41,42,43,47,49,51,53,54,57,58,59,62,66,71,79,81,83,89,93,97];
  let best=null;
  for(const h of holes){const n=Math.round(frac*h);if(Math.abs(n/h-frac)&lt;1e-6){best={h,n};break}}
  if(!best){
    let bd=1e9;
    for(const h of holes){for(let n=0;n&lt;h;n++){const d=Math.abs(n/h-frac);if(d&lt;bd){bd=d;best={h,n}}}}
  }
  let html=alertBox(`Оборотов рукоятки: &lt;b&gt;${turns.toFixed(4)}&lt;/b&gt;`,'ok');
  html+=alertBox(`Целых оборотов: &lt;b&gt;${full}&lt;/b&gt;`,'ok');
  if(best){
    const {h,n}=best;
    if(n&gt;0)html+=alertBox(`+ &lt;b&gt;${n}&lt;/b&gt; отверстий на диске с &lt;b&gt;${h}&lt;/b&gt; отверстиями`,'ok');
    else html+=alertBox('Дробной части нет — только целые обороты','ok');
    // Таблица альтернатив
    html+='&lt;table class="data" style="margin-top:12px"&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Диск&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Отверстий&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Ошибка&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;';
    const opts=[];
    for(const hh of holes){for(let n=0;n&lt;hh;n++){const d=Math.abs(n/hh-frac);if(d&lt;0.001&amp;&amp;n&gt;0)opts.push({h:hh,n,err:d})}}
    opts.sort((a,b)=&gt;a.err-b.err).slice(0,5).forEach(o=&gt;{
      html+=`&lt;tr&gt;&lt;td&gt;${o.h}&lt;/td&gt;&lt;td class="val-cyan"&gt;${o.n}&lt;/td&gt;&lt;td&gt;${(o.err*100).toFixed(4)}%&lt;/td&gt;&lt;/tr&gt;`;
    });
    html+='&lt;/table&gt;';
  }
  $('prIndexOut').innerHTML=html;
}

function calcCutter(){
  const type=$('fr_type').value;
  const z=+$('fr_z').value,beta=+$('fr_beta').value,alpha=+$('fr_alpha').value;
  const cosB=Math.cos(rad(beta));
  const zv=(type==='helical')?z/Math.pow(cosB,3):z;
  const ranges=[
    {n:1,from:135,to:Infinity},
    {n:2,from:55,to:134},
    {n:3,from:35,to:54},
    {n:4,from:26,to:34},
    {n:5,from:21,to:25},
    {n:6,from:17,to:20},
    {n:7,from:14,to:16},
    {n:8,from:10,to:13}
  ];
  const found=ranges.find(r=&gt;zv&gt;=r.from&amp;&amp;zv&lt;=r.to);
  let html=alertBox(`Эквивалентное z_v = &lt;b&gt;${zv.toFixed(2)}&lt;/b&gt; ${type==='helical'?'(z/cos³β)':''}`,'ok');
  if(found)html+=alertBox(`Номер модульной фрезы: &lt;b&gt;№ ${found.n}&lt;/b&gt; (диапазон ${found.from}${found.to===Infinity?'+':'…'+found.to} зубьев)`,'ok');
  else html+=alertBox('Вне стандартного ряда фрез','err');
  if(zv&lt;17&amp;&amp;alpha===20)html+=alertBox('⚠ z_v &lt; 17 — возможно подрезание, требуется смещение x','warn');
  $('prCutterOut').innerHTML=html;
}

// ============ ВКЛАДКА 4: КОНТРОЛЬ ============
function calcMeasure(){
  const m=+$('c_m').value,z=+$('c_z').value,alpha=+$('c_alpha').value,beta=+$('c_beta').value,x=+$('c_x').value,dp=+$('c_dp').value;
  const type=$('c_type').value;
  const alphaR=rad(alpha),betaR=rad(beta),cosB=Math.cos(betaR);
  const mt=m/cosB;
  const alpha_t=Math.atan(Math.tan(alphaR)/cosB);
  const d=mt*z,db=d*Math.cos(alpha_t);
  const inv_t=inv(alpha_t);
  // inv(α_M)
  const invM=inv_t+dp/(d*Math.cos(alpha_t))+2*x*Math.tan(alphaR)/z+Math.PI/z;
  const alphaM=solveInv(Math.max(0,invM));
  const cosM=Math.cos(alphaM);
  let M=(cosM&gt;1e-9)?d*Math.cos(alpha_t)/cosM+dp:d+dp;
  if(type==='external_odd')M=d*Math.cos(alpha_t)/cosM*Math.cos(Math.PI/(2*z))+dp;

  // Общая нормаль W
  const k=Math.round(z/9.5+0.5); // для α=20°
  const kGeneral=Math.round(z/Math.PI*Math.tan(alpha_t)-z*inv_t/Math.PI+0.5);
  const W=m*Math.cos(alphaR)*((k-0.5)*Math.PI+z*inv_t+2*x*Math.tan(alphaR));

  let html=alertBox(`Размер по ролику M = &lt;b&gt;${M.toFixed(3)} мм&lt;/b&gt; (ролик d_p = ${dp} мм)`,'ok');
  html+=alertBox(`Угол α_M = ${deg(alphaM).toFixed(3)}°`,'ok');
  html+=alertBox(`Общая нормаль W = &lt;b&gt;${W.toFixed(3)} мм&lt;/b&gt; (k = ${k} зуб.)`,'ok');
  html+=alertBox(`Толщина зуба по делительной s_t = ${(mt*(Math.PI/2+2*x*Math.tan(alphaR))).toFixed(3)} мм`,'ok');
  html+=alertBox(`Делительный d = ${d.toFixed(3)} мм, основной db = ${db.toFixed(3)} мм`,'ok');
  if(z&lt;17)html+=alertBox('⚠ z &lt; 17 — возможна интерференция, проверить x','warn');
  $('ctrlOut').innerHTML=html;
}

// ============ ВКЛАДКА 5: ПРОЧНОСТЬ ============
function calcStrength(){
  const P=+$('s_P').value,n=+$('s_n').value,m=+$('s_m').value;
  const z1=+$('s_z1').value,z2=+$('s_z2').value,beta=+$('s_beta').value,b=+$('s_b').value;
  const K=+$('s_K').value,mat=$('s_mat').value;
  const betaR=rad(beta),cosB=Math.cos(betaR);
  const mt=m/cosB;
  const d1=mt*z1;
  const T=P*1000/(2*Math.PI*n/60); // Н·м
  const Ft=2*T*1000/d1; // Н
  const u=z2/z1;
  // Контактная
  const matProps={steel:{ZE:274,sH:580,sF:400},steel_h:{ZE:274,sH:900,sF:700},iron:{ZE:165,sH:400,sF:200}};
  const mp=matProps[mat];
  const ZH=1.77; // для α=20°
  const Ze=0.85;
  const sH=mp.ZE*ZH*Ze*Math.sqrt(Ft*K*(u+1)/(b*d1*u));
  const KHp=1;
  // Изгибная
  const YF=3.6; // приближённо для z_v=20…40
  const Ye=0.75,Yb=0.9;
  const sF=Ft*K*YF*Ye*Yb/(b*m);

  let html='';
  html+=alertBox(`Крутящий момент T = &lt;b&gt;${T.toFixed(2)} Н·м&lt;/b&gt;`,'ok');
  html+=alertBox(`Окружная сила F_t = &lt;b&gt;${Ft.toFixed(0)} Н&lt;/b&gt;`,'ok');
  html+='&lt;h3 style="color:var(--neon-cyan);margin:14px 0 8px;text-shadow:0 0 8px var(--neon-cyan)"&gt;КОНТАКТНАЯ ПРОЧНОСТЬ&lt;/h3&gt;';
  html+=alertBox(`σ_H = &lt;b&gt;${sH.toFixed(0)} МПа&lt;/b&gt;`,'ok');
  html+=alertBox(`Допускаемое [σ]_H = ${mp.sH} МПа`,'ok');
  if(sH&lt;=mp.sH)html+=alertBox(`✓ Запас по контакту: ${((mp.sH/sH-1)*100).toFixed(1)}%`,'ok');
  else html+=alertBox(`✗ Превышение на ${((sH/mp.sH-1)*100).toFixed(1)}% — увеличить модуль/ширину/твёрдость`,'err');
  html+='&lt;h3 style="color:var(--neon-pink);margin:14px 0 8px;text-shadow:0 0 8px var(--neon-pink)"&gt;ИЗГИБНАЯ ПРОЧНОСТЬ&lt;/h3&gt;';
  html+=alertBox(`σ_F = &lt;b&gt;${sF.toFixed(0)} МПа&lt;/b&gt;`,'ok');
  html+=alertBox(`Допускаемое [σ]_F = ${mp.sF} МПа`,'ok');
  if(sF&lt;=mp.sF)html+=alertBox(`✓ Запас по изгибу: ${((mp.sF/sF-1)*100).toFixed(1)}%`,'ok');
  else html+=alertBox(`✗ Превышение на ${((sF/mp.sF-1)*100).toFixed(1)}% — возможно разрушение зуба`,'err');
  $('strOut').innerHTML=html;
}

// ============ ВКЛАДКА 6: ЭКСПОРТ ============
function buildReport(){
  if(!lastGeom)return 'Сначала рассчитайте геометрию.';
  const R=lastGeom;
  const L=[];
  L.push('═══════════════════════════════════════');
  L.push('      ОТЧЁТ ПО ЗУБЧАТОЙ ПЕРЕДАЧЕ');
  L.push('═══════════════════════════════════════');
  L.push(`Дата: ${new Date().toLocaleString('ru-RU')}`);
  L.push('');
  L.push(`Тип: ${R.type}`);
  L.push(`Модуль m: ${fmt(R.m)} мм`);
  if(R.mt!=null)L.push(`Торцовый m_t: ${fmt(R.mt)} мм`);
  L.push(`Угол α: ${fmt(R.alpha)}°`);
  if(R.beta!=null)L.push(`Угол β: ${fmt(R.beta)}°`);
  L.push('');
  L.push('───── ШЕСТЕРНЯ z₁ ─────');
  L.push(`z₁ = ${R.z1}`);
  L.push(`d₁ = ${fmt(R.d1)} мм`);
  L.push(`da₁ = ${fmt(R.da1)} мм`);
  L.push(`df₁ = ${fmt(R.df1)} мм`);
  if(R.db1!=null)L.push(`db₁ = ${fmt(R.db1)} мм`);
  if(R.s_t1!=null)L.push(`Толщина s_t₁ = ${fmt(R.s_t1)} мм`);
  L.push('───── КОЛЕСО z₂ ─────');
  L.push(`z₂ = ${R.z2}`);
  L.push(`d₂ = ${fmt(R.d2)} мм`);
  L.push(`da₂ = ${fmt(R.da2)} мм`);
  L.push(`df₂ = ${fmt(R.df2)} мм`);
  if(R.db2!=null)L.push(`db₂ = ${fmt(R.db2)} мм`);
  if(R.s_t2!=null)L.push(`Толщина s_t₂ = ${fmt(R.s_t2)} мм`);
  L.push('───── ПАРАМЕТРЫ ПЕРЕДАЧИ ─────');
  L.push(`u = ${fmt(R.u,4)}`);
  L.push(`Высота зуба h = ${fmt(R.h)} мм`);
  if(R.a_std!=null)L.push(`a = ${fmt(R.a_std)} мм`);
  if(R.aw!=null)L.push(`a_w = ${fmt(R.aw)} мм`);
  if(R.eps!=null)L.push(`ε_α = ${fmt(R.eps,3)}`);
  if(R.zv1!=null)L.push(`z_v₁/z_v₂ = ${fmt(R.zv1,2)} / ${fmt(R.zv2,2)}`);
  if(R.bevel){L.push(`δ₁=${fmt(R.delta1,2)}° δ₂=${fmt(R.delta2,2)}°`);L.push(`R_e=${fmt(R.Re)} мм`);L.push(`b=${fmt(R.b)} мм`)}
  return L.join('\n');
}
function updateExportPreview(){$('expPreview').textContent=buildReport()}

function exportPDF(){
  const r=buildReport();
  if(r.startsWith('Сначала')){alert(r);return}
  window.print();
}
function exportDXF(){
  if(!lastGeom){alert('Сначала рассчитайте геометрию.');return}
  const R=lastGeom;
  if(R.bevel||R.epicycloidal){alert('DXF-экспорт только для цилиндрических.');return}
  // Профиль эвольвенты — упрощённый
  const m=R.m,z=R.z1,d=R.d1,db=R.db1||d*Math.cos(rad(R.alpha)),da=R.da1,df=R.df1;
  const alphaR=rad(R.alpha);
  const lines=[];
  lines.push('0','SECTION','2','ENTITIES');
  // Окружности
  lines.push('0','CIRCLE','8','DEVIDER','10','0','20','0','40',d/2);
  lines.push('0','CIRCLE','8','TIP','10','0','20','0','40',da/2);
  lines.push('0','CIRCLE','8','ROOT','10','0','20','0','40',df/2);
  if(db!=null)lines.push('0','CIRCLE','8','BASE','10','0','20','0','40',db/2);
  // Эвольвента одного зуба (точки)
  const pts=[];
  const tMax=Math.sqrt(Math.max(0,(da/2)*(da/2)-(db/2)*(db/2)))/(db/2);
  for(let i=0;i&lt;=20;i++){
    const t=tMax*i/20;
    const x=db/2*(Math.cos(t)+t*Math.sin(t));
    const y=db/2*(Math.sin(t)-t*Math.cos(t));
    pts.push([x,y]);
  }
  lines.push('0','LWPOLYLINE','8','INVOLUTE','90',pts.length,'70','0');
  pts.forEach(p=&gt;{lines.push('10',p[0].toFixed(4),'20',p[1].toFixed(4))});
  lines.push('0','ENDSEC','0','EOF');
  const blob=new Blob([lines.join('\n')],{type:'application/dxf'});
  const a=document.createElement('a');
  a.href=URL.createObjectURL(blob);
  a.download=`gear_z${z}_m${m}.dxf`;
  a.click();
  URL.revokeObjectURL(a.href);
}
function copyReport(){
  const r=buildReport();
  navigator.clipboard.writeText(r).then(()=&gt;alert('Отчёт скопирован в буфер обмена.'));
}

// Первый расчёт
calcGeometry();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</subtitle>
  <updated>2026-08-17T10:38:38Z</updated>
  <logo>https://pandoraburo.ru/ssl/u/pic/82/39796e9a2411f1bacf9dc27ce847b4/-/logo.png</logo>
  <author>
    <name>1592962</name>
    <uri>https://www.pandoraburo.ru/</uri>
  </author>
</feed>
