{"id":52696,"date":"2025-08-31T00:33:29","date_gmt":"2025-08-30T21:33:29","guid":{"rendered":"https:\/\/engeg.com\/b\/?p=52696"},"modified":"2025-09-05T12:07:23","modified_gmt":"2025-09-05T09:07:23","slug":"%d8%a7%d9%84%d8%ad%d8%a7%d8%b3%d8%a8%d8%aa%d9%8a%d9%86","status":"publish","type":"post","link":"https:\/\/engeg.com\/b\/2025\/08\/31\/%d8%a7%d9%84%d8%ad%d8%a7%d8%b3%d8%a8%d8%aa%d9%8a%d9%86\/","title":{"rendered":"\u0627\u0644\u062d\u0627\u0633\u0628\u062a\u064a\u0646"},"content":{"rendered":"\n<div class=\"calculator-output\"><!-- START: \u062d\u0627\u0633\u0628\u0629 \u0627\u0644\u062d\u062f\u064a\u062f \u0627\u0644\u0643\u0627\u0645\u0644\u0629 \u0645\u0639 Cut Optimizer + CSV\/PDF + WhatsApp -->\r\n<div id=\"steel-calculator\">\r\n  <h2>\ud83d\udccf \u062d\u0627\u0633\u0628\u0629 \u0627\u0644\u062d\u062f\u064a\u062f \u0627\u0644\u0645\u062a\u0642\u062f\u0645\u0629 + Cut Optimizer<\/h2>\r\n  <p class=\"subtitle\">\u062d\u0627\u0633\u0628\u0629 \u0623\u0633\u0627\u0633\u064a\u0629 (\u0648\u0632\u0646\/\u0639\u062f\u062f) \u2014 \u0648\u062d\u0627\u0633\u0628\u0629 \u0639\u0643\u0633\u064a\u0629 (\u0648\u0632\u0646 \u2192 \u0639\u062f\u062f) \u2014 \u0645\u0639 \u0645\u062d\u0633\u0646 \u0627\u0644\u0642\u0635 \u0648\u062a\u0635\u062f\u064a\u0631 \u0643\u0627\u0645\u0644<\/p>\r\n\r\n  <!-- ---------- Basic Calculator ---------- -->\r\n  <section class=\"card\">\r\n    <h3>\ud83d\udd39 \u0627\u0644\u062d\u0627\u0633\u0628\u0629 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629<\/h3>\r\n    <p class=\"small\">\u0623\u062f\u062e\u0644 \u0627\u0644\u0628\u0646\u0648\u062f: \u0627\u0633\u0645\u060c \u0642\u0637\u0631\u060c \u0637\u0648\u0644 \u0627\u0644\u0633\u064a\u062e \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u060c \u0648\u0627\u0644\u0639\u062f\u062f<\/p>\r\n\r\n    <div id=\"items\"><\/div>\r\n    <button class=\"btn add\" onclick=\"addItem()\">\u2795 \u0625\u0636\u0627\u0641\u0629 \u0628\u0646\u062f<\/button>\r\n\r\n    <div class=\"divider\"><\/div>\r\n    <button id=\"total\" class=\"big\" disabled>\u0627\u0644\u0625\u062c\u0645\u0627\u0644\u064a: 0 \u0643\u062c\u0645<\/button>\r\n\r\n    <div id=\"summary\" class=\"panel\"><\/div>\r\n\r\n    <div class=\"form-row\">\r\n      <label>\ud83d\udcb0 \u0633\u0639\u0631 \u0627\u0644\u0637\u0646 (\u062c\u0646\u064a\u0647)<\/label>\r\n      <input type=\"number\" id=\"priceTon\" placeholder=\"\u0645\u062b\u0627\u0644: 40000\" oninput=\"calc()\">\r\n    <\/div>\r\n    <p id=\"costResult\" class=\"notice\"><\/p>\r\n\r\n    <div class=\"actions\">\r\n      <button class=\"btn share\" onclick=\"shareWhatsApp()\">\ud83d\udcf2 \u0645\u0634\u0627\u0631\u0643\u0629 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0648\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u062d\u0627\u0633\u0628\u0629 \u0639\u0644\u0649 \u0627\u0644\u0648\u0627\u062a\u0633\u0627\u0628 (\u0634\u0627\u0645\u0644\u0629)<\/button>\r\n      <button class=\"btn export\" onclick=\"exportCSV()\">\u2b07\ufe0f \u062a\u0646\u0632\u064a\u0644 CSV<\/button>\r\n      <button class=\"btn export\" onclick=\"exportPDF()\">\u2b07\ufe0f \u062a\u0646\u0632\u064a\u0644 PDF<\/button>\r\n    <\/div>\r\n\r\n    <!-- Cut List + Optimizer controls -->\r\n    <div class=\"divider\"><\/div>\r\n    <h4>\ud83e\uddfe \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0642\u0637\u0639 (Cut List) & \u0645\u062d\u0633\u0646 \u0627\u0644\u0642\u0635<\/h4>\r\n    <p class=\"small\">\u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u062a\u064f\u062c\u0645\u0651\u0639 \u062a\u0644\u0642\u0627\u0626\u064a\u064b\u0627 \u062d\u0633\u0628 \u0627\u0644\u0642\u0637\u0631 \u0648\u0627\u0644\u0637\u0648\u0644\u061b \u0627\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0645\u062d\u0633\u0651\u0646 \u0644\u062a\u0642\u0633\u064a\u0645 \u0639\u0644\u0649 \u0623\u0637\u0648\u0627\u0644 \u062a\u062c\u0627\u0631\u064a\u0629<\/p>\r\n\r\n    <div id=\"cutlist\" class=\"panel\"><\/div>\r\n\r\n    <div class=\"form-row\">\r\n      <label>\u0623\u0637\u0648\u0627\u0644 \u0627\u0644\u0642\u0636\u0628\u0627\u0646 \u0627\u0644\u062a\u062c\u0627\u0631\u064a\u0629 (\u0645) \u2014 \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0641\u0627\u0635\u0644\u0629<\/label>\r\n      <input type=\"text\" id=\"stockLengths\" value=\"12,6\" placeholder=\"\u0645\u062b\u0627\u0644: 12,6\">\r\n    <\/div>\r\n    <div class=\"form-row\">\r\n      <label>\u062e\u0648\u0627\u0631\u0632\u0645\u064a\u0629<\/label>\r\n      <select id=\"optimizerAlgo\">\r\n        <option value=\"ffd\">First-Fit Decreasing (\u0633\u0631\u064a\u0639)<\/option>\r\n      <\/select>\r\n    <\/div>\r\n    <div style=\"display:flex;gap:8px;flex-wrap:wrap;\">\r\n      <button class=\"btn export\" onclick=\"runOptimizer()\">\u25b6\ufe0f \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0645\u062d\u0633\u0651\u0646<\/button>\r\n      <button class=\"btn\" onclick=\"renderOptimizer(null)\">\ud83d\udd04 \u0625\u0639\u0627\u062f\u0629 \u0639\u0631\u0636 \u0622\u062e\u0631 \u0646\u062a\u064a\u062c\u0629<\/button>\r\n      <button class=\"btn\" onclick=\"downloadOptimizerCSV()\">\u2b07\ufe0f \u062a\u0646\u0632\u064a\u0644 Cut Plan CSV<\/button>\r\n      <button class=\"btn\" onclick=\"downloadOptimizerPDF()\">\u2b07\ufe0f \u062a\u0646\u0632\u064a\u0644 Cut Plan PDF<\/button>\r\n    <\/div>\r\n\r\n    <div id=\"optimizerResult\" class=\"panel\" style=\"margin-top:10px\"><\/div>\r\n  <\/section>\r\n\r\n  <!-- ---------- Reverse Calculator ---------- -->\r\n  <section class=\"card\">\r\n    <h3>\ud83d\udd01 \u0627\u0644\u062d\u0627\u0633\u0628\u0629 \u0627\u0644\u0639\u0643\u0633\u064a\u0629 (\u0648\u0632\u0646 \u2192 \u0639\u062f\u062f \u0633\u064a\u062e)<\/h3>\r\n    <p class=\"small\">\u0623\u062f\u062e\u0644 \u0628\u0646\u0648\u062f \u0639\u0643\u0633\u064a\u0629: \u0627\u0644\u0642\u0637\u0631\u060c \u0627\u0644\u0648\u0632\u0646 \u0628\u0627\u0644\u0643\u064a\u0644\u0648\u062c\u0631\u0627\u0645\u060c \u0648\u0637\u0648\u0644 \u0627\u0644\u0633\u064a\u062e \u0644\u062a\u0642\u062f\u064a\u0631 \u0639\u062f\u062f \u0627\u0644\u0623\u0633\u064a\u0627\u062e<\/p>\r\n\r\n    <div id=\"revItems\"><\/div>\r\n    <button class=\"btn add\" onclick=\"addRevItem()\">\u2795 \u0625\u0636\u0627\u0641\u0629 \u0628\u0646\u062f \u0639\u0643\u0633\u064a<\/button>\r\n\r\n    <div class=\"divider\"><\/div>\r\n    <button id=\"revTotal\" class=\"big\" disabled>\u0627\u0644\u0625\u062c\u0645\u0627\u0644\u064a \u0627\u0644\u0639\u0643\u0633\u064a: 0<\/button>\r\n\r\n    <div id=\"revSummary\" class=\"panel\"><\/div>\r\n\r\n    <div class=\"actions\">\r\n      <button class=\"btn share\" onclick=\"shareRevWhatsApp()\">\ud83d\udcf2 \u0645\u0634\u0627\u0631\u0643\u0629 \u0646\u062a\u0627\u0626\u062c \u0627\u0644\u062d\u0627\u0633\u0628\u0629 \u0627\u0644\u0639\u0643\u0633\u064a\u0629 \u0639\u0644\u0649 \u0627\u0644\u0648\u0627\u062a\u0633\u0627\u0628 (\u0634\u0627\u0645\u0644\u0629)<\/button>\r\n      <button class=\"btn export\" onclick=\"exportRevCSV()\">\u2b07\ufe0f \u062a\u0646\u0632\u064a\u0644 CSV (\u0639\u0643\u0633\u064a\u0629)<\/button>\r\n      <button class=\"btn export\" onclick=\"exportRevPDF()\">\u2b07\ufe0f \u062a\u0646\u0632\u064a\u0644 PDF (\u0639\u0643\u0633\u064a\u0629)<\/button>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <!-- ---------- Info Section ---------- -->\r\n  <div class=\"divider\"><\/div>\r\n  <section id=\"info-section\" class=\"card\">\r\n    <h3>\u2139\ufe0f \u0634\u0631\u062d \u0627\u0644\u062d\u0633\u0627\u0628\u0627\u062a<\/h3>\r\n    <p>\u062a\u0639\u062a\u0645\u062f \u0627\u0644\u062d\u0627\u0633\u0628\u0629 \u0639\u0644\u0649 \u0627\u0644\u0645\u0639\u0627\u062f\u0644\u0629 \u0627\u0644\u0642\u064a\u0627\u0633\u064a\u0629:<br><strong>\u0627\u0644\u0648\u0632\u0646 (\u0643\u062c\u0645) = \u0627\u0644\u0637\u0648\u0644 (\u0645) \u00d7 \u0627\u0644\u0639\u062f\u062f \u00d7 \u0648\u0632\u0646 \u0627\u0644\u0645\u062a\u0631 \u0627\u0644\u0637\u0648\u0644\u064a (\u0643\u062c\u0645\/\u0645)<\/strong><\/p>\r\n    <p>\u0627\u0644\u062d\u0627\u0633\u0628\u0629 \u0627\u0644\u0639\u0643\u0633\u064a\u0629:<br><strong>\u0639\u062f\u062f \u0627\u0644\u0623\u0633\u064a\u0627\u062e = \u0627\u0644\u0648\u0632\u0646 \u00f7 (\u0627\u0644\u0637\u0648\u0644 \u00d7 \u0648\u0632\u0646 \u0627\u0644\u0645\u062a\u0631 \u0627\u0644\u0637\u0648\u0644\u064a)<\/strong><\/p>\r\n\r\n    <h4>\ud83d\udcca \u062c\u062f\u0648\u0644 \u0623\u0648\u0632\u0627\u0646 \u0627\u0644\u062d\u062f\u064a\u062f (\u0644\u0643\u0644 \u0645\u062a\u0631 \u0637\u0648\u0644\u064a)<\/h4>\r\n    <table id=\"weightsTable\">\r\n      <tr><th>\u0627\u0644\u0642\u0637\u0631 (\u0645\u0645)<\/th><th>\u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u062a\u062c\u0627\u0631\u064a<\/th><th>\u0627\u0644\u0648\u0632\u0646 (\u0643\u062c\u0645\/\u0645)<\/th><\/tr>\r\n      <tr><td>8 \u0645\u0645<\/td><td>\u0662.\u0665 \u0644\u064a\u0646\u064a\u0629<\/td><td>0.395<\/td><\/tr>\r\n      <tr><td>10 \u0645\u0645<\/td><td>\u0663 \u0644\u064a\u0646\u064a\u0629<\/td><td>0.617<\/td><\/tr>\r\n      <tr><td>12 \u0645\u0645<\/td><td>\u0664 \u0644\u064a\u0646\u064a\u0629<\/td><td>0.888<\/td><\/tr>\r\n      <tr><td>16 \u0645\u0645<\/td><td>\u0665 \u0644\u064a\u0646\u064a\u0629<\/td><td>1.578<\/td><\/tr>\r\n      <tr><td>18 \u0645\u0645<\/td><td>\u0666 \u0644\u064a\u0646\u064a\u0629<\/td><td>2.000<\/td><\/tr>\r\n      <tr><td>20 \u0645\u0645<\/td><td>\u0641\u0627\u064a 20<\/td><td>2.466<\/td><\/tr>\r\n      <tr><td>22 \u0645\u0645<\/td><td>\u0641\u0627\u064a 22<\/td><td>2.984<\/td><\/tr>\r\n      <tr><td>25 \u0645\u0645<\/td><td>\u0641\u0627\u064a 25<\/td><td>3.853<\/td><\/tr>\r\n    <\/table>\r\n  <\/section>\r\n<\/div>\r\n\r\n<!-- Styles -->\r\n<style>\r\n  :root{--bg:#ffffff;--card:#fbfcff;--accent:#ffe08a}\r\n  body{font-family:\"Cairo\",sans-serif}\r\n  #steel-calculator{direction:rtl;max-width:980px;margin:18px auto;padding:12px}\r\n  h2{text-align:center;margin-bottom:6px}\r\n  .subtitle{font-size:14px;color:#666;text-align:center;margin-bottom:10px}\r\n  .card{background:var(--card);border-radius:10px;padding:12px;margin-bottom:14px;box-shadow:0 6px 20px rgba(0,0,0,0.04)}\r\n  .small{font-size:13px;color:#666;margin-bottom:8px}\r\n  .form-row{display:grid;grid-template-columns:200px 1fr;gap:8px;align-items:center;margin-bottom:8px}\r\n  .form-row label{font-size:14px;color:#222}\r\n  input,select{padding:8px;border-radius:6px;border:1px solid #ccc;font-size:14px;width:100%}\r\n  .btn{padding:8px 12px;border-radius:8px;border:none;cursor:pointer;font-weight:700}\r\n  .add{background:#28a745;color:#fff}\r\n  .share{background:#25d366;color:#fff}\r\n  .export{background:#6c5ce7;color:#fff}\r\n  .delete{background:#e74c3c;color:#fff}\r\n  .divider{height:1px;background:#eee;margin:12px 0;border-radius:2px}\r\n  .big{background:#ffdd57;color:#000;font-size:16px;padding:12px;border-radius:8px}\r\n  .panel{background:#fffbea;border:1px solid #ffe08a;border-radius:8px;padding:10px;margin-top:10px}\r\n  .item{border:1px solid #eee;padding:10px;border-radius:8px;margin-bottom:10px;background:#fcfeff}\r\n  .item-result{margin-top:8px;padding:8px;border-radius:6px;background:#f3f9ff;border:1px solid #d9eefb}\r\n  table{width:100%;border-collapse:collapse;text-align:center}\r\n  th,td{border:1px solid #eee;padding:6px}\r\n  th{background:var(--accent);font-weight:800}\r\n  .notice{color:#d35400;font-weight:700}\r\n  @media (max-width:720px){ .form-row{grid-template-columns:1fr} .actions .btn{width:100%} }\r\n<\/style>\r\n\r\n<!-- PDF library -->\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html2pdf.js\/0.9.3\/html2pdf.bundle.min.js\"><\/script>\r\n\r\n<!-- Script -->\r\n<script>\r\n\/* ---------- Data & helpers ---------- *\/\r\nlet items = [], revItems = [];\r\nconst weights = {8:0.395,10:0.617,12:0.888,16:1.578,18:2.000, 20:2.466, 22:2.984, 25:3.853};\r\nconst names = {8:\"\u0662.\u0665 \u0644\u064a\u0646\u064a\u0629 (\u0641\u0627\u064a 8)\",10:\"\u0663 \u0644\u064a\u0646\u064a\u0629 (\u0641\u0627\u064a 10)\",12:\"\u0664 \u0644\u064a\u0646\u064a\u0629 (\u0641\u0627\u064a 12)\",16:\"\u0665 \u0644\u064a\u0646\u064a\u0629 (\u0641\u0627\u064a 16)\",18:\"\u0666 \u0644\u064a\u0646\u064a\u0629 (\u0641\u0627\u064a 18)\", 20:\"\u0641\u0627\u064a 20\", 22:\"\u0641\u0627\u064a 22\", 25:\"\u0641\u0627\u064a 25\"};\r\n\r\nfunction formatNum(n,dec=2){ return Number(n).toFixed(dec); }\r\nfunction safeParseFloat(v){ return v===undefined||v===''?0:parseFloat(v); }\r\n\r\n\/* ---------- Basic calculator UI ---------- *\/\r\nfunction addItem(dia=12,len=12,num=1,name=\"\u0628\u0646\u062f \u062c\u062f\u064a\u062f\"){\r\n  const container=document.getElementById(\"items\");\r\n  const idx = items.length;\r\n  const div = document.createElement(\"div\"); div.className=\"item\"; div.id = `item-container-${idx}`;\r\n  div.innerHTML=`\r\n    <div class=\"form-row\"><label>\u0627\u0633\u0645 \u0627\u0644\u0628\u0646\u062f:<\/label><input type=\"text\" id=\"name${idx}\" value=\"${name}\" oninput=\"calc()\"><\/div>\r\n    <div class=\"form-row\"><label>\u0627\u0644\u0642\u0637\u0631:<\/label><select id=\"dia${idx}\" onchange=\"calc()\">${Object.keys(names).map(d=>`<option value=\"${d}\" ${d==dia?'selected':''}>${names[d]}<\/option>`).join('')}<\/select><\/div>\r\n    <div class=\"form-row\"><label>\u0627\u0644\u0637\u0648\u0644 (\u0645):<\/label><input type=\"number\" id=\"len${idx}\" value=\"${len}\" oninput=\"calc()\"><\/div>\r\n    <div class=\"form-row\"><label>\u0627\u0644\u0639\u062f\u062f:<\/label><input type=\"number\" id=\"num${idx}\" value=\"${num}\" oninput=\"calc()\"><\/div>\r\n    <div class=\"item-result\" id=\"itemRes${idx}\">\ud83d\udd0e \u0627\u0644\u0646\u062a\u064a\u062c\u0629: 0 \u0643\u062c\u0645<\/div>\r\n    <div style=\"display:flex;gap:8px;margin-top:8px\"><button class=\"btn delete\" onclick=\"deleteItem(${idx})\">\ud83d\uddd1\ufe0f \u062d\u0630\u0641<\/button><\/div>\r\n  `;\r\n  container.appendChild(div);\r\n  items.push({id: idx, name,dia,len,num});\r\n  calc();\r\n}\r\n\r\nfunction calc(){\r\n  let total=0, totalBars=0, summary={};\r\n  items.forEach((it,i)=>{\r\n    const name = document.getElementById(`name${it.id}`)?.value || it.name;\r\n    const dia = parseInt(document.getElementById(`dia${it.id}`)?.value || it.dia);\r\n    const len = safeParseFloat(document.getElementById(`len${it.id}`)?.value || it.len);\r\n    const num = parseInt(document.getElementById(`num${it.id}`)?.value || it.num) || 0;\r\n    const weight = len * num * (weights[dia] || 0);\r\n    \r\n    items[i] = {...items[i], name,dia,len,num,weight}; \/\/ Update item in array\r\n    \r\n    total += weight; totalBars += num;\r\n    if(!summary[dia]) summary[dia]={num:0,weight:0};\r\n    summary[dia].num += num; summary[dia].weight += weight;\r\n    const itemRes = document.getElementById(`itemRes${it.id}`);\r\n    if(itemRes) itemRes.innerText = `\ud83d\udd0e ${num} \u00d7 ${len}\u0645 (${names[dia]}) = ${formatNum(weight)} \u0643\u062c\u0645`;\r\n  });\r\n\r\n  document.getElementById(\"total\").innerText = `\u0627\u0644\u0625\u062c\u0645\u0627\u0644\u064a: ${formatNum(total)} \u0643\u062c\u0645 (${formatNum(total\/1000,2)} \u0637\u0646)`;\r\n  document.getElementById(\"total\").disabled = items.length === 0;\r\n\r\n  let html = `<h4>\ud83d\udcca \u0627\u0644\u0645\u0644\u062e\u0635<\/h4><table><tr><th>\u0627\u0644\u0642\u0637\u0631<\/th><th>\u0639\u062f\u062f \u0627\u0644\u0623\u0633\u064a\u0627\u062e<\/th><th>\u0627\u0644\u0648\u0632\u0646 (\u0643\u062c\u0645)<\/th><\/tr>`;\r\n  if(Object.keys(summary).length > 0 && total > 0){\r\n    for(let d in summary) html += `<tr><td>${names[d]}<\/td><td>${summary[d].num}<\/td><td>${formatNum(summary[d].weight)}<\/td><\/tr>`;\r\n    html += `<tr style=\"font-weight:bold;background:#ffe08a\"><td>\u0627\u0644\u0645\u062c\u0645\u0648\u0639<\/td><td>${totalBars}<\/td><td>${formatNum(total)}<\/td><\/tr>`;\r\n  } else {\r\n    html += `<tr><td colspan=\"3\">\u0644\u0627 \u062a\u0648\u062c\u062f \u0628\u0646\u0648\u062f \u0644\u0639\u0631\u0636\u0647\u0627<\/td><\/tr>`;\r\n  }\r\n  html += `<\/table>`;\r\n  document.getElementById(\"summary\").innerHTML = html;\r\n\r\n  buildCutList();\r\n  const priceTon = safeParseFloat(document.getElementById(\"priceTon\").value);\r\n  document.getElementById(\"costResult\").innerText = priceTon>0 && total > 0 ? `\ud83d\udcb0 \u0627\u0644\u062a\u0643\u0644\u0641\u0629 \u0627\u0644\u062a\u0642\u062f\u064a\u0631\u064a\u0629 = ${Math.round((total\/1000)*priceTon)} \u062c\u0646\u064a\u0647` : \"\";\r\n}\r\n\r\nfunction deleteItem(id){\r\n  const itemIndex = items.findIndex(it => it.id === id);\r\n  if (itemIndex > -1) {\r\n    items.splice(itemIndex, 1);\r\n    const itemElement = document.getElementById(`item-container-${id}`);\r\n    if (itemElement) itemElement.remove();\r\n    calc();\r\n  }\r\n}\r\n\r\n\/* ---------- Cut List (aggregation) ---------- *\/\r\nfunction buildCutList(){\r\n  const map={};\r\n  items.forEach(it=>{\r\n    if(!it.len || !it.num) return;\r\n    const key = `${it.dia}|${Number(it.len).toFixed(3)}`;\r\n    if(!map[key]) map[key]={dia:it.dia,len:it.len,count:0};\r\n    map[key].count += Number(it.num||0);\r\n  });\r\n  const arr = Object.values(map).sort((a,b)=>a.dia - b.dia || a.len - b.len);\r\n  let html = `<table><tr><th>\u0627\u0644\u0642\u0637\u0631<\/th><th>\u0627\u0644\u0637\u0648\u0644 (\u0645)<\/th><th>\u0627\u0644\u0639\u062f\u062f<\/th><\/tr>`;\r\n  if(arr.length===0) html += `<tr><td colspan=\"3\">\u0644\u0627 \u062a\u0648\u062c\u062f \u0628\u0646\u0648\u062f \u0628\u0639\u062f<\/td><\/tr>`;\r\n  arr.forEach(r=> html += `<tr><td>${names[r.dia]}<\/td><td>${r.len}<\/td><td>${r.count}<\/td><\/tr>`);\r\n  html += `<\/table>`;\r\n  document.getElementById(\"cutlist\").innerHTML = html;\r\n  return arr;\r\n}\r\n\r\n\/* ---------- Optimizer (First-Fit Decreasing) ---------- *\/\r\nlet lastOptimizerOutput = null;\r\n\r\nfunction parseStockLengths(){\r\n  const raw = document.getElementById(\"stockLengths\").value || \"12,6\";\r\n  return raw.split(\",\").map(s=>Math.abs(parseFloat(s.trim()))).filter(n=>n>0).sort((a,b)=>b-a);\r\n}\r\n\r\nfunction runOptimizer(){\r\n  const stockLengths = parseStockLengths();\r\n  if(stockLengths.length===0){ alert(\"\u0623\u062f\u062e\u0644 \u0623\u0637\u0648\u0627\u0644 \u0642\u0636\u0628\u0627\u0646 \u062a\u062c\u0627\u0631\u064a\u0629 \u0635\u062d\u064a\u062d\u0629 \u0645\u062b\u0644: 12,6\"); return; }\r\n  const arr = buildCutList();\r\n  const pieces = [];\r\n  arr.forEach(r=>{\r\n    for(let k=0;k<r.count;k++) pieces.push({dia:r.dia, len: Number(r.len)});\r\n  });\r\n  if(pieces.length===0){ alert(\"\u0644\u0627 \u0642\u0637\u0639 \u0644\u0644\u062d\u0633\u0627\u0628. \u0623\u0636\u0641 \u0628\u0646\u0648\u062f \u0623\u0648\u0644\u0627\u064b.\"); return; }\r\n  pieces.sort((a,b)=> b.len - a.len || b.dia - a.dia);\r\n  \r\n  const allocations = [];\r\n  pieces.forEach(piece => {\r\n    let placed = false;\r\n    \/\/ Find best fit (smallest remaining waste)\r\n    let bestFitIndex = -1;\r\n    let minWaste = Infinity;\r\n    for(let i=0; i<allocations.length; i++){\r\n      const remaining = allocations[i].remaining;\r\n      if(remaining >= piece.len - 1e-9){\r\n        const waste = remaining - piece.len;\r\n        if (waste < minWaste) {\r\n          minWaste = waste;\r\n          bestFitIndex = i;\r\n        }\r\n      }\r\n    }\r\n\r\n    if(bestFitIndex !== -1){\r\n      allocations[bestFitIndex].pieces.push(piece);\r\n      allocations[bestFitIndex].remaining -= piece.len;\r\n      placed = true;\r\n    }\r\n\r\n    if(!placed){\r\n      let bestStock = stockLengths.filter(s => s >= piece.len).pop() || stockLengths[0];\r\n      if (piece.len > bestStock) {\r\n        console.warn(`Piece length ${piece.len} is greater than any available stock length.`);\r\n      }\r\n      allocations.push({stockLength: bestStock, remaining: bestStock - piece.len, pieces: [piece]});\r\n    }\r\n  });\r\n\r\n  const perStock = {};\r\n  let totalWaste=0, totalStockLen=0;\r\n  allocations.forEach(a=>{\r\n    totalStockLen += a.stockLength;\r\n    totalWaste += a.remaining;\r\n    perStock[a.stockLength] = perStock[a.stockLength] || {count:0,used:0,waste:0};\r\n    perStock[a.stockLength].count++;\r\n    perStock[a.stockLength].used += (a.stockLength - a.remaining);\r\n    perStock[a.stockLength].waste += a.remaining;\r\n  });\r\n\r\n  lastOptimizerOutput = {allocations, perStock, totalWaste, totalStockLen};\r\n  renderOptimizer(lastOptimizerOutput);\r\n}\r\n\r\nfunction renderOptimizer(output){\r\n  if(!output){ output = lastOptimizerOutput; if(!output){ document.getElementById(\"optimizerResult\").innerHTML = \"<i>\u0644\u0645 \u064a\u062a\u0645 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0645\u062d\u0633\u0651\u0646 \u0628\u0639\u062f.<\/i>\"; return; } }\r\n  const {allocations, perStock, totalWaste, totalStockLen} = output;\r\n  let html = `<h4>\ud83d\udcd0 \u062e\u0637\u0629 \u0627\u0644\u0642\u0635 (Cut Plan)<\/h4>`;\r\n  const wastePercentage = totalStockLen > 0 ? formatNum(totalWaste\/totalStockLen*100) : 0;\r\n  html += `<p>\u0639\u062f\u062f \u0627\u0644\u0642\u0636\u0628\u0627\u0646 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u0629: <b>${allocations.length}<\/b> \u2014 \u0625\u062c\u0645\u0627\u0644\u064a \u0637\u0648\u0644 \u0627\u0644\u0642\u0636\u0628\u0627\u0646: <b>${formatNum(totalStockLen)}<\/b> \u0645 \u2014 \u0625\u062c\u0645\u0627\u0644\u064a \u0641\u0627\u0642\u062f: <b>${formatNum(totalWaste)}<\/b> \u0645 (${wastePercentage}%)<\/p>`;\r\n  html += `<table><tr><th>\u0631\u0642\u0645 \u0627\u0644\u0642\u0636\u064a\u0628<\/th><th>\u0637\u0648\u0644 \u0627\u0644\u0642\u0636\u064a\u0628<\/th><th>\u0627\u0644\u0642\u0637\u0639 \u0639\u0644\u064a\u0647 (\u0645)<\/th><th>\u0641\u0627\u0642\u062f (\u0645)<\/th><\/tr>`;\r\n  allocations.forEach((a,idx)=>{\r\n    const piecesStr = a.pieces.map(p=> `${p.len}\u0645 (${names[p.dia]})`).join(\" + \");\r\n    html += `<tr><td>${idx+1}<\/td><td>${a.stockLength} \u0645<\/td><td>${piecesStr}<\/td><td>${formatNum(a.remaining)}<\/td><\/tr>`;\r\n  });\r\n  html += `<\/table>`;\r\n  html += `<h5>\u0645\u0644\u062e\u0635 \u062d\u0633\u0628 \u0637\u0648\u0644 \u0627\u0644\u0642\u0636\u064a\u0628 \u0627\u0644\u062a\u062c\u0627\u0631\u064a<\/h5><table><tr><th>\u0637\u0648\u0644 \u0627\u0644\u0642\u0636\u064a\u0628<\/th><th>\u0627\u0644\u0639\u062f\u062f<\/th><th>\u0627\u0644\u0627\u0633\u062a\u0639\u0645\u0627\u0644 (\u0645)<\/th><th>\u0627\u0644\u0641\u0627\u0642\u062f (\u0645)<\/th><\/tr>`;\r\n  for(let s in perStock){\r\n    html += `<tr><td>${s} \u0645<\/td><td>${perStock[s].count}<\/td><td>${formatNum(perStock[s].used)}<\/td><td>${formatNum(perStock[s].waste)}<\/td><\/tr>`;\r\n  }\r\n  html += `<\/table>`;\r\n  document.getElementById(\"optimizerResult\").innerHTML = html;\r\n}\r\n\r\n\/* ---------- Export Cut Plan CSV\/PDF ---------- *\/\r\nfunction downloadOptimizerCSV(){\r\n  if(!lastOptimizerOutput){ alert(\"\u0634\u063a\u0651\u0644 \u0627\u0644\u0645\u062d\u0633\u0651\u0646 \u0623\u0648\u0644\u064b\u0627\"); return; }\r\n  const {allocations, perStock, totalWaste, totalStockLen} = lastOptimizerOutput;\r\n  const rows=[[\"Cut Plan\"],[\"\u0631\u0642\u0645 \u0627\u0644\u0642\u0636\u064a\u0628\",\"\u0637\u0648\u0644 \u0627\u0644\u0642\u0636\u064a\u0628 (\u0645)\",\"\u0627\u0644\u0642\u0637\u0639 (\u0645)\",\"\u0641\u0627\u0642\u062f (\u0645)\"]];\r\n  allocations.forEach((a,idx)=>{\r\n    const pieces = a.pieces.map(p=> `${p.len}(${names[p.dia]})`).join(\" + \");\r\n    rows.push([idx+1, a.stockLength, pieces, formatNum(a.remaining)]);\r\n  });\r\n  rows.push([]);\r\n  rows.push([\"\u0645\u0644\u062e\u0635\",\"\u0637\u0648\u0644 \u0627\u0644\u0642\u0636\u064a\u0628\",\"\u0627\u0644\u0639\u062f\u062f\",\"\u0627\u0644\u0627\u0633\u062a\u0639\u0645\u0627\u0644 (\u0645)\",\"\u0641\u0627\u0642\u062f (\u0645)\"]);\r\n  for(let s in perStock) rows.push([\"\", s, perStock[s].count, formatNum(perStock[s].used), formatNum(perStock[s].waste)]);\r\n  rows.push([]);\r\n  rows.push([\"\u0625\u062c\u0645\u0627\u0644\u064a \u0637\u0648\u0644 \u0627\u0644\u0642\u0636\u0628\u0627\u0646\", formatNum(totalStockLen)]);\r\n  rows.push([\"\u0625\u062c\u0645\u0627\u0644\u064a \u0641\u0627\u0642\u062f\", formatNum(totalWaste)]);\r\n  let csv = \"\\uFEFF\";\r\n  rows.forEach(r=> csv += r.map(c=> `\"${String(c).replace(\/\"\/g,'\"\"')}\"`).join(\",\") + \"\\n\");\r\n  const blob = new Blob([csv], {type:\"text\/csv;charset=utf-8;\"});\r\n  const url = URL.createObjectURL(blob); const a=document.createElement(\"a\"); a.href=url; a.download=`cut_plan_${new Date().toISOString().split('T')[0]}.csv`; document.body.appendChild(a); a.click(); a.remove(); URL.revokeObjectURL(url);\r\n}\r\n\r\nfunction downloadOptimizerPDF(){\r\n  if(!lastOptimizerOutput){ alert(\"\u0634\u063a\u0651\u0644 \u0627\u0644\u0645\u062d\u0633\u0651\u0646 \u0623\u0648\u0644\u064b\u0627\"); return; }\r\n  const container = document.createElement(\"div\"); container.style.padding=\"12px\"; container.style.fontFamily=\"Arial, sans-serif\";\r\n  container.innerHTML = `<h2 style=\"text-align:center; direction:rtl;\">\u062e\u0637\u0629 \u0627\u0644\u0642\u0635 (Cut Plan)<\/h2>`;\r\n  container.innerHTML += document.getElementById(\"optimizerResult\").innerHTML;\r\n  html2pdf().set({margin:0.4, filename:`cut_plan_${new Date().toISOString().split('T')[0]}.pdf`, html2canvas:{scale:1.5}, jsPDF:{unit:'in', format:'A4'}}).from(container).save();\r\n}\r\n\r\n\/* ---------- Export CSV (full report) ---------- *\/\r\nfunction exportCSV(){\r\n  calc();\r\n  const rows=[];\r\n  rows.push([\"\u062d\u0635\u0631 \u0627\u0644\u062d\u062f\u064a\u062f\"]);\r\n  rows.push([\"\u0627\u0633\u0645 \u0627\u0644\u0628\u0646\u062f\",\"\u0627\u0644\u0642\u0637\u0631\",\"\u0627\u0644\u0637\u0648\u0644 (\u0645)\",\"\u0627\u0644\u0639\u062f\u062f\",\"\u0627\u0644\u0648\u0632\u0646 (\u0643\u062c\u0645)\"]);\r\n  items.forEach(it=> rows.push([it.name, names[it.dia], it.len, it.num, formatNum(it.weight)]));\r\n  rows.push([]);\r\n  rows.push([\"\u0627\u0644\u0645\u0644\u062e\u0635\"]);\r\n  rows.push([\"\u0627\u0644\u0642\u0637\u0631\",\"\u0639\u062f\u062f \u0627\u0644\u0623\u0633\u064a\u0627\u062e\",\"\u0627\u0644\u0648\u0632\u0646 (\u0643\u062c\u0645)\"]);\r\n  const summary={};\r\n  items.forEach(it=>{ if(!summary[it.dia]) summary[it.dia]={num:0,weight:0}; summary[it.dia].num += it.num; summary[it.dia].weight += it.weight; });\r\n  for(let d in summary) rows.push([names[d], summary[d].num, formatNum(summary[d].weight)]);\r\n  const totalWeight = items.reduce((s,it)=>s+it.weight,0);\r\n  const totalBars = items.reduce((s,it)=>s+it.num,0);\r\n  rows.push([\"\u0627\u0644\u0645\u062c\u0645\u0648\u0639\", totalBars, formatNum(totalWeight)]);\r\n  rows.push([]);\r\n  rows.push([\"\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0642\u0637\u0639\"]);\r\n  rows.push([\"\u0627\u0644\u0642\u0637\u0631\",\"\u0627\u0644\u0637\u0648\u0644 (\u0645)\",\"\u0627\u0644\u0639\u062f\u062f\"]);\r\n  const map={}; items.forEach(it=>{ const key=`${it.dia}|${Number(it.len).toFixed(3)}` ; if(!map[key]) map[key]={dia:it.dia,len:it.len,count:0}; map[key].count += Number(it.num||0); });\r\n  Object.values(map).forEach(r=> rows.push([names[r.dia], r.len, r.count]));\r\n  if(lastOptimizerOutput){\r\n    rows.push([]);\r\n    rows.push([\"Cut Plan\"]);\r\n    rows.push([\"\u0631\u0642\u0645 \u0627\u0644\u0642\u0636\u064a\u0628\",\"\u0637\u0648\u0644 \u0627\u0644\u0642\u0636\u064a\u0628\",\"\u0627\u0644\u0642\u0637\u0639 (\u0645)\",\"\u0641\u0627\u0642\u062f (\u0645)\"]);\r\n    lastOptimizerOutput.allocations.forEach((a,idx)=> rows.push([idx+1, a.stockLength, a.pieces.map(p=>p.len).join(\" + \"), formatNum(a.remaining)]));\r\n  }\r\n  let csv = \"\\uFEFF\";\r\n  rows.forEach(r=> csv += r.map(c=> `\"${String(c).replace(\/\"\/g,'\"\"')}\"`).join(\",\") + \"\\n\");\r\n  const blob = new Blob([csv], {type:\"text\/csv;charset=utf-8;\"});\r\n  const url = URL.createObjectURL(blob); const a=document.createElement(\"a\"); a.href=url; a.download=`steel_report_${new Date().toISOString().split('T')[0]}.csv`; document.body.appendChild(a); a.click(); a.remove(); URL.revokeObjectURL(url);\r\n}\r\n\r\n\/* ---------- Export PDF (full report) ---------- *\/\r\nfunction exportPDF(){\r\n  calc();\r\n  const printDiv = document.createElement(\"div\"); printDiv.style.padding=\"12px\"; printDiv.style.fontFamily=\"Arial, sans-serif\"; printDiv.style.direction=\"rtl\";\r\n  printDiv.innerHTML = `<h2 style=\"text-align:center\">\u062a\u0642\u0631\u064a\u0631 \u062d\u0635\u0631 \u0627\u0644\u062d\u062f\u064a\u062f<\/h2>`;\r\n  printDiv.innerHTML += document.getElementById(\"summary\").outerHTML;\r\n  printDiv.innerHTML += `<h3>\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0642\u0637\u0639<\/h3>` + document.getElementById(\"cutlist\").outerHTML;\r\n  if(lastOptimizerOutput) { printDiv.innerHTML += `<h3>\u062e\u0637\u0629 \u0627\u0644\u0642\u0635<\/h3>` + document.getElementById(\"optimizerResult\").outerHTML; }\r\n  const priceTon = safeParseFloat(document.getElementById(\"priceTon\").value);\r\n  const totalWeight = items.reduce((s,it)=>s+it.weight,0);\r\n  if(priceTon>0) printDiv.innerHTML += `<p><b>\u0627\u0644\u062a\u0643\u0644\u0641\u0629 \u0627\u0644\u062a\u0642\u062f\u064a\u0631\u064a\u0629: ${Math.round((totalWeight\/1000)*priceTon)} \u062c\u0646\u064a\u0647<\/b><\/p>`;\r\n  html2pdf().set({margin:0.4, filename:`steel_report_${new Date().toISOString().split('T')[0]}.pdf`, html2canvas:{scale:1.5}, jsPDF:{unit:'in', format:'A4'}}).from(printDiv).save();\r\n}\r\n\r\n\/* ---------- WhatsApp share (comprehensive) ---------- *\/\r\nfunction shareWhatsApp(){\r\n  calc();\r\n  let msg = \"\ud83d\udccc *\u062d\u0635\u0631 \u0627\u0644\u062d\u062f\u064a\u062f (\u062a\u0641\u0635\u064a\u0644\u064a):*\\n\";\r\n  items.forEach((it,i)=> msg += `${i+1}- ${it.name} | ${names[it.dia]}: ${it.num} \u00d7 ${it.len}\u0645 = ${formatNum(it.weight)} \u0643\u062c\u0645\\n`);\r\n  const totalWeight = items.reduce((s,it)=>s+it.weight,0);\r\n  const totalBars = items.reduce((s,it)=>s+it.num,0);\r\n  msg += `\\n\ud83e\uddfe *\u0627\u0644\u0645\u0644\u062e\u0635:*\\n\u0625\u062c\u0645\u0627\u0644\u064a \u0627\u0644\u0648\u0632\u0646: *${formatNum(totalWeight)} \u0643\u062c\u0645* (${formatNum(totalWeight\/1000,2)} \u0637\u0646)\\n\u0625\u062c\u0645\u0627\u0644\u064a \u0639\u062f\u062f \u0627\u0644\u0623\u0633\u064a\u0627\u062e: *${totalBars}*\\n`;\r\n  const cuts = buildCutList();\r\n  if(cuts.length>0){\r\n    msg += `\\n\ud83e\ude9a *\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0642\u0637\u0639:*\\n`;\r\n    cuts.forEach(c=> msg += `- ${names[c.dia]} | ${c.len}\u0645 \u00d7 ${c.count}\\n`);\r\n  }\r\n  if(lastOptimizerOutput){\r\n    msg += `\\n\u2702\ufe0f *\u062e\u0637\u0629 \u0627\u0644\u0642\u0635:*\\n\u0639\u062f\u062f \u0627\u0644\u0642\u0636\u0628\u0627\u0646: *${lastOptimizerOutput.allocations.length}*\u060c \u0641\u0627\u0642\u062f: *${formatNu<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_post_was_ever_published":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[24128],"tags":[],"class_list":["post-52696","post","type-post","status-publish","format-standard","hentry","category-24128"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":52724,"url":"https:\/\/engeg.com\/b\/2025\/08\/31\/%d8%b5%d8%a8-%d9%a3\/","url_meta":{"origin":52696,"position":0},"title":"\u0635\u0628 \u0663","author":"interior","date":"\u0623\u063a\u0633\u0637\u0633 31, 2025","format":false,"excerpt":"","rel":"","context":"\u0641\u064a &quot;\u062d\u0633\u0627\u0628\u0627\u062a \u062a\u0647\u0645\u0643 \u0641\u064a \u0628\u064a\u062a \u0627\u0644\u0648\u0637\u0646&quot;","block_context":{"text":"\u062d\u0633\u0627\u0628\u0627\u062a \u062a\u0647\u0645\u0643 \u0641\u064a \u0628\u064a\u062a \u0627\u0644\u0648\u0637\u0646","link":"https:\/\/engeg.com\/b\/category\/%d8%ad%d8%b3%d8%a7%d8%a8%d8%a7%d8%aa-%d8%aa%d9%87%d9%85%d9%83-%d9%81%d9%8a-%d8%a8%d9%8a%d8%aa-%d8%a7%d9%84%d9%88%d8%b7%d9%86\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":52740,"url":"https:\/\/engeg.com\/b\/2025\/08\/31\/%d9%83%d9%85%d9%8a%d8%a7%d8%aa-%d8%b5%d8%a8-%d9%a4\/","url_meta":{"origin":52696,"position":1},"title":"\u0643\u0645\u064a\u0627\u062a \u0635\u0628 \u0664","author":"interior","date":"\u0623\u063a\u0633\u0637\u0633 31, 2025","format":false,"excerpt":"","rel":"","context":"\u0641\u064a &quot;\u062d\u0633\u0627\u0628\u0627\u062a \u062a\u0647\u0645\u0643 \u0641\u064a \u0628\u064a\u062a \u0627\u0644\u0648\u0637\u0646&quot;","block_context":{"text":"\u062d\u0633\u0627\u0628\u0627\u062a \u062a\u0647\u0645\u0643 \u0641\u064a \u0628\u064a\u062a \u0627\u0644\u0648\u0637\u0646","link":"https:\/\/engeg.com\/b\/category\/%d8%ad%d8%b3%d8%a7%d8%a8%d8%a7%d8%aa-%d8%aa%d9%87%d9%85%d9%83-%d9%81%d9%8a-%d8%a8%d9%8a%d8%aa-%d8%a7%d9%84%d9%88%d8%b7%d9%86\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":55756,"url":"https:\/\/engeg.com\/b\/2026\/01\/19\/seramek\/","url_meta":{"origin":52696,"position":2},"title":"\u062d\u0627\u0633\u0628\u0629 \u0627\u0644\u0633\u064a\u0631\u0627\u0645\u064a\u0643","author":"interior","date":"\u064a\u0646\u0627\u064a\u0631 19, 2026","format":false,"excerpt":"","rel":"","context":"\u0641\u064a &quot;\u062d\u0633\u0627\u0628\u0627\u062a \u062a\u0647\u0645\u0643 \u0641\u064a \u0628\u064a\u062a \u0627\u0644\u0648\u0637\u0646&quot;","block_context":{"text":"\u062d\u0633\u0627\u0628\u0627\u062a \u062a\u0647\u0645\u0643 \u0641\u064a \u0628\u064a\u062a \u0627\u0644\u0648\u0637\u0646","link":"https:\/\/engeg.com\/b\/category\/%d8%ad%d8%b3%d8%a7%d8%a8%d8%a7%d8%aa-%d8%aa%d9%87%d9%85%d9%83-%d9%81%d9%8a-%d8%a8%d9%8a%d8%aa-%d8%a7%d9%84%d9%88%d8%b7%d9%86\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":52685,"url":"https:\/\/engeg.com\/b\/2025\/08\/30\/%d8%ae%d8%b1%d8%b3%d8%a7%d9%86%d9%87\/","url_meta":{"origin":52696,"position":3},"title":"\u062a\u0642\u0627\u0631\u064a\u0631 \u0648\u062d\u0633\u0627\u0628\u0627\u062a \u0635\u0628 \u0627\u0644\u062e\u0631\u0633\u0627\u0646\u0629 \u0628\u0627\u0644\u0645\u0648\u0642\u0639","author":"interior","date":"\u0623\u063a\u0633\u0637\u0633 30, 2025","format":false,"excerpt":"","rel":"","context":"\u0641\u064a &quot;\u062d\u0633\u0627\u0628\u0627\u062a \u062a\u0647\u0645\u0643 \u0641\u064a \u0628\u064a\u062a \u0627\u0644\u0648\u0637\u0646&quot;","block_context":{"text":"\u062d\u0633\u0627\u0628\u0627\u062a \u062a\u0647\u0645\u0643 \u0641\u064a \u0628\u064a\u062a \u0627\u0644\u0648\u0637\u0646","link":"https:\/\/engeg.com\/b\/category\/%d8%ad%d8%b3%d8%a7%d8%a8%d8%a7%d8%aa-%d8%aa%d9%87%d9%85%d9%83-%d9%81%d9%8a-%d8%a8%d9%8a%d8%aa-%d8%a7%d9%84%d9%88%d8%b7%d9%86\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":53121,"url":"https:\/\/engeg.com\/b\/2025\/09\/07\/%d9%87%d9%8a%d9%83%d9%84-%d8%ac\/","url_meta":{"origin":52696,"position":4},"title":"\u0647\u064a\u0643\u0644 \u062c","author":"interior","date":"\u0633\u0628\u062a\u0645\u0628\u0631 7, 2025","format":false,"excerpt":"","rel":"","context":"\u0641\u064a &quot;\u062d\u0633\u0627\u0628\u0627\u062a \u062a\u0647\u0645\u0643 \u0641\u064a \u0628\u064a\u062a \u0627\u0644\u0648\u0637\u0646&quot;","block_context":{"text":"\u062d\u0633\u0627\u0628\u0627\u062a \u062a\u0647\u0645\u0643 \u0641\u064a \u0628\u064a\u062a \u0627\u0644\u0648\u0637\u0646","link":"https:\/\/engeg.com\/b\/category\/%d8%ad%d8%b3%d8%a7%d8%a8%d8%a7%d8%aa-%d8%aa%d9%87%d9%85%d9%83-%d9%81%d9%8a-%d8%a8%d9%8a%d8%aa-%d8%a7%d9%84%d9%88%d8%b7%d9%86\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":52861,"url":"https:\/\/engeg.com\/b\/2025\/09\/02\/%d8%a7%d8%aa%d8%ad%d8%a7%d8%af-%d9%85%d9%84%d8%a7%d9%83\/","url_meta":{"origin":52696,"position":5},"title":"\u0627\u062a\u062d\u0627\u062f \u0645\u0644\u0627\u0643","author":"interior","date":"\u0633\u0628\u062a\u0645\u0628\u0631 2, 2025","format":false,"excerpt":"","rel":"","context":"\u0641\u064a &quot;\u062d\u0633\u0627\u0628\u0627\u062a \u062a\u0647\u0645\u0643 \u0641\u064a \u0628\u064a\u062a \u0627\u0644\u0648\u0637\u0646&quot;","block_context":{"text":"\u062d\u0633\u0627\u0628\u0627\u062a \u062a\u0647\u0645\u0643 \u0641\u064a \u0628\u064a\u062a \u0627\u0644\u0648\u0637\u0646","link":"https:\/\/engeg.com\/b\/category\/%d8%ad%d8%b3%d8%a7%d8%a8%d8%a7%d8%aa-%d8%aa%d9%87%d9%85%d9%83-%d9%81%d9%8a-%d8%a8%d9%8a%d8%aa-%d8%a7%d9%84%d9%88%d8%b7%d9%86\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/engeg.com\/b\/wp-json\/wp\/v2\/posts\/52696","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/engeg.com\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/engeg.com\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/engeg.com\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/engeg.com\/b\/wp-json\/wp\/v2\/comments?post=52696"}],"version-history":[{"count":2,"href":"https:\/\/engeg.com\/b\/wp-json\/wp\/v2\/posts\/52696\/revisions"}],"predecessor-version":[{"id":52712,"href":"https:\/\/engeg.com\/b\/wp-json\/wp\/v2\/posts\/52696\/revisions\/52712"}],"wp:attachment":[{"href":"https:\/\/engeg.com\/b\/wp-json\/wp\/v2\/media?parent=52696"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/engeg.com\/b\/wp-json\/wp\/v2\/categories?post=52696"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/engeg.com\/b\/wp-json\/wp\/v2\/tags?post=52696"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}