<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>죔새계산 &#8211; MyEngNote</title>
	<atom:link href="https://myengnote.com/tag/%ec%a3%94%ec%83%88%ea%b3%84%ec%82%b0/feed/" rel="self" type="application/rss+xml" />
	<link>https://myengnote.com</link>
	<description></description>
	<lastBuildDate>Wed, 08 Jul 2026 04:42:31 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>
	<item>
		<title>끼워맞춤 공차 계산기 &#038; 시뮬레이터</title>
		<link>https://myengnote.com/fit-tolerance-iso286-calculator-simulator-2/</link>
					<comments>https://myengnote.com/fit-tolerance-iso286-calculator-simulator-2/#respond</comments>
		
		<dc:creator><![CDATA[동동]]></dc:creator>
		<pubDate>Wed, 10 Jun 2026 23:37:19 +0000</pubDate>
				<category><![CDATA[공학계산기]]></category>
		<category><![CDATA[ISO286]]></category>
		<category><![CDATA[IT공차]]></category>
		<category><![CDATA[끼워맞춤]]></category>
		<category><![CDATA[죔새계산]]></category>
		<category><![CDATA[틈새계산]]></category>
		<guid isPermaLink="false">https://myengnote.com/fit-tolerance-iso286-calculator-simulator-2/</guid>

					<description><![CDATA[ISO 286 규격에 의거한 축과 구멍의 공차 등급(H7, g6 등)과 기준 치수에 따라 정밀 치수 허용 한계, 최대/최소 틈새 및 죔새를 실시간 계산하고 마이크로 공차 밴드의 맞물림 영역을 1000배율 확대 시각화하는 2D 공학 시뮬레이터입니다.]]></description>
										<content:encoded><![CDATA[
<h2 style="font-size: 1.6em; font-weight: 800; color: #0c0e25; border-bottom: 2px solid #00f2fe; padding-bottom: 8px; margin-bottom: 20px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 끼워맞춤 공차 계산기 &#038; 시뮬레이터</h2>


<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&#038;family=Outfit:wght@400;500;600;700;800&#038;display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
/* Scoped & Isolated Styles for fittolerance-calculator-wrapper */
        /* Modern Reset and Design Tokens */
        .fittolerance-calculator-wrapper *, .fittolerance-calculator-wrapper *::before, .fittolerance-calculator-wrapper *::after {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }
        .fittolerance-calculator-wrapper {
            --color-bg-dark: #f8f9fd;
            --color-bg-deep: #ffffff;
            --color-panel-bg: rgba(255, 255, 255, 0.85);
            --color-border: rgba(0, 0, 0, 0.06);
            --color-border-hover: rgba(0, 0, 0, 0.12);
            --color-text-main: #1e293b;
            --color-text-muted: #475569;
            --color-text-dark: #94a3b8;
            --color-cyan: #0284c7;
            --color-cyan-glow: rgba(2, 132, 199, 0.15);
            --color-magenta: #db2777;
            --color-magenta-glow: rgba(219, 39, 119, 0.15);
            --color-purple: #7c3aed;
            --color-purple-glow: rgba(124, 58, 237, 0.12);
            --color-success: #10b981;
            --color-warning: #f59e0b;
            --gradient-primary: linear-gradient(135deg, var(--color-cyan) 0%, var(--color-purple) 100%);
            --gradient-accent: linear-gradient(135deg, var(--color-magenta) 0%, var(--color-purple) 100%);
            --gradient-panel: linear-gradient(180deg, rgba(255, 255, 255, 0.9) 0%, rgba(248, 250, 252, 0.95) 100%);
            --font-heading: 'Outfit', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
            --font-body: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
            --shadow-neon-cyan: 0 0 15px var(--color-cyan-glow);
            --shadow-neon-magenta: 0 0 15px var(--color-magenta-glow);
            --shadow-card: 0 8px 32px 0 rgba(15, 23, 42, 0.05);
            --blur-glass: blur(16px);
        }
        .fittolerance-calculator-wrapper {
            background-color: var(--color-bg-dark);
            color: var(--color-text-main);
            font-family: var(--font-body);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            overflow-x: hidden;
            position: relative;
        }
        .app-background-glow {
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            z-index: -1; overflow: hidden; pointer-events: none;
        }
        .app-background-glow::before, 
        .app-background-glow::after {
            content: ''; position: absolute; width: 600px; height: 600px; border-radius: 50%; filter: blur(140px); opacity: 0.12;
        }
        .app-background-glow::before { background: var(--color-cyan); top: -10%; right: -5%; animation: pulse-slow 15s infinite alternate; }
        .app-background-glow::after { background: var(--color-purple); bottom: -10%; left: -5%; animation: pulse-slow 20s infinite alternate-reverse; }
        @keyframes pulse-slow {
            0% { transform: scale(1) translate(0, 0); opacity: 0.08; }
            100% { transform: scale(1.2) translate(50px, 50px); opacity: 0.15; }
        }
        .app-container {
            width: 100%; max-width: 1440px; padding: 24px; display: flex; flex-direction: column; gap: 24px;
        }
        .app-header {
            display: flex; justify-content: space-between; align-items: center; padding: 20px 24px;
            background: var(--color-panel-bg); backdrop-filter: var(--blur-glass); border: 1px solid var(--color-border); border-radius: 16px; box-shadow: var(--shadow-card);
        }
        .logo-area { display: flex; align-items: center; gap: 16px; }
        .logo-icon {
            font-size: 32px; background: linear-gradient(135deg, var(--color-cyan), var(--color-magenta)); -webkit-background-clip: text; -webkit-text-fill-color: transparent;
            display: flex; align-items: center; justify-content: center;
        }
        .logo-area h1 {
            font-family: var(--font-heading); font-weight: 800; font-size: 24px; letter-spacing: 1.5px;
            background: linear-gradient(90deg, var(--color-text-main), var(--color-text-dark)); -webkit-background-clip: text; -webkit-text-fill-color: transparent;
        }
        .logo-area .subtitle { font-size: 12px; color: var(--color-text-muted); font-weight: 500; letter-spacing: 0.5px; }
        .header-badge {
            display: flex; align-items: center; gap: 10px; background: rgba(2, 132, 199, 0.1); border: 1px solid rgba(2, 132, 199, 0.2); padding: 6px 14px; border-radius: 20px;
        }
        .pulse-dot {
            width: 8px; height: 8px; background-color: var(--color-cyan); border-radius: 50%; box-shadow: 0 0 10px var(--color-cyan); animation: pulse-dot-anim 1.5s infinite;
        }
        @keyframes pulse-dot-anim {
            0% { transform: scale(0.9); opacity: 0.6; }
            50% { transform: scale(1.2); opacity: 1; }
            100% { transform: scale(0.9); opacity: 0.6; }
        }
        .badge-text { font-size: 11px; font-weight: 600; color: var(--color-cyan); letter-spacing: 0.5px; }
        .app-main-grid { display: grid; grid-template-columns: 340px 1fr 340px; gap: 24px; align-items: start; }
        .panel {
            background: var(--gradient-panel); backdrop-filter: var(--blur-glass); border: 1px solid var(--color-border); border-radius: 20px; padding: 24px; box-shadow: var(--shadow-card);
            display: flex; flex-direction: column; gap: 18px; transition: border-color 0.3s ease, box-shadow 0.3s ease;
        }
        .panel:hover { border-color: var(--color-border-hover); }
        .panel-header { display: flex; align-items: center; gap: 12px; border-bottom: 1px solid var(--color-border); padding-bottom: 14px; }
        .panel-header i { font-size: 18px; }
        .panel-header h2 { font-family: var(--font-heading); font-size: 18px; font-weight: 600; letter-spacing: 0.5px; }
        .text-cyan { color: var(--color-cyan); }
        .text-magenta { color: var(--color-magenta); }
        .text-purple { color: var(--color-purple); }
        .control-panel { grid-column: 1; }
        .input-group { display: flex; flex-direction: column; gap: 8px; }
        .input-label-row { display: flex; justify-content: space-between; align-items: center; }
        .input-label-row label { font-size: 13px; font-weight: 600; color: var(--color-text-main); display: flex; align-items: center; gap: 8px; }
        .helper-text { font-size: 10px; color: var(--color-text-muted); font-weight: 500; }
                .number-input-wrapper {
            display: flex;
            position: relative;
            border-radius: 8px;
            overflow: hidden;
            border: 1px solid var(--color-border);
            background: #ffffff;
            transition: all 0.2s ease;
        }
        .number-input-wrapper:focus-within {
            border-color: var(--color-cyan);
            box-shadow: 0 0 10px var(--color-cyan-glow);
        }
        .number-input-wrapper:focus-within { border-color: var(--color-cyan); box-shadow: 0 0 10px var(--color-cyan-glow); }
                .custom-number-input {
            flex: 1;
            width: 0;
            min-width: 0;
            background: #f8fafc !important;
            border: none !important;
            outline: none !important;
            color: #0f172a !important;
            padding: 10px 14px !important;
            font-family: var(--font-body) !important;
            font-size: 15px !important;
            font-weight: 700 !important;
            text-align: right !important;
            box-shadow: none !important;
            -webkit-appearance: none !important;
            -moz-appearance: textfield !important;
        }
        .custom-number-input::-webkit-outer-spin-button,
        .custom-number-input::-webkit-inner-spin-button {
            -webkit-appearance: none;
            margin: 0;
        }
        .custom-number-input::-webkit-outer-spin-button, .custom-number-input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
                .unit-badge {
            background: rgba(0, 0, 0, 0.03);
            color: var(--color-text-muted);
            font-size: 11px;
            font-weight: 700;
            padding: 0 14px;
            display: flex;
            align-items: center;
            justify-content: center;
            border-left: 1px solid var(--color-border);
            pointer-events: none;
            flex-shrink: 0;
        }
        .custom-slider {
            -webkit-appearance: none; width: 100%; height: 6px; border-radius: 3px; background: rgba(0, 0, 0, 0.05); outline: none; margin: 4px 0; transition: background 0.2s ease;
        }
        .custom-slider::-webkit-slider-thumb {
            -webkit-appearance: none; appearance: none; width: 18px; height: 18px; border-radius: 50%; cursor: pointer; transition: transform 0.1s ease, box-shadow 0.2s ease;
        }
        .slider-cyan::-webkit-slider-thumb { background: var(--color-cyan); box-shadow: 0 0 8px var(--color-cyan); }
        .slider-cyan::-webkit-slider-thumb:hover { transform: scale(1.2); }
        .slider-magenta::-webkit-slider-thumb { background: var(--color-magenta); box-shadow: 0 0 8px var(--color-magenta); }
        .slider-magenta::-webkit-slider-thumb:hover { transform: scale(1.2); }
        .slider-purple::-webkit-slider-thumb { background: var(--color-purple); box-shadow: 0 0 8px var(--color-purple); }
        .slider-purple::-webkit-slider-thumb:hover { transform: scale(1.2); }
        .slider-cyan::-moz-range-thumb { width: 18px; height: 18px; border: none; border-radius: 50%; background: var(--color-cyan); }
        .slider-magenta::-moz-range-thumb { width: 18px; height: 18px; border: none; border-radius: 50%; background: var(--color-magenta); }
        .slider-purple::-moz-range-thumb { width: 18px; height: 18px; border: none; border-radius: 50%; background: var(--color-purple); }
        .select-wrapper { position: relative; display: flex; border-radius: 8px; overflow: hidden; border: 1px solid var(--color-border); background: #ffffff; }
        .custom-select {
            width: 100%; background: #f8fafc; border: none; outline: none; color: #0f172a; padding: 10px 14px; font-family: var(--font-body); font-size: 14px; font-weight: 600; appearance: none; cursor: pointer;
        }
        .select-arrow { position: absolute; right: 14px; top: 50%; transform: translateY(-50%); pointer-events: none; color: var(--color-text-muted); font-size: 12px; }
        .presets-section { display: flex; flex-direction: column; gap: 10px; border-top: 1px solid var(--color-border); padding-top: 16px; }
        .presets-section h3 { font-size: 13px; font-weight: 700; color: var(--color-text-main); display: flex; align-items: center; gap: 8px; }
        .presets-grid { display: flex; flex-direction: column; gap: 8px; }
        .preset-btn {
            background: rgba(0, 0, 0, 0.015); border: 1px solid var(--color-border); border-radius: 10px; padding: 8px 12px; cursor: pointer; color: var(--color-text-main);
            display: flex; align-items: center; gap: 12px; text-align: left; transition: all 0.2s ease;
        }
        .preset-btn:hover { background: rgba(0, 0, 0, 0.04); transform: translateX(4px); }
        .preset-btn.active {
            background: linear-gradient(90deg, var(--color-cyan-glow), var(--color-magenta-glow)); border-color: var(--color-cyan); box-shadow: 0 0 10px var(--color-cyan-glow);
        }
        .preset-icon {
            width: 28px; height: 28px; background: rgba(0, 0, 0, 0.02); border-radius: 8px; display: flex; align-items: center; justify-content: center; font-size: 12px; color: var(--color-cyan);
        }
        .preset-btn:hover .preset-icon, .preset-btn.active .preset-icon { background: var(--gradient-primary); color: #fff; }
        .preset-name { font-size: 12px; font-weight: 600; }
        .simulation-panel {
            grid-column: 2;
            align-self: start;
            justify-content: flex-start;
        }
        .canvas-wrapper {
            position: relative; width: 100%; background: radial-gradient(circle at center, #ffffff 0%, #f1f5f9 100%); border: 1px solid rgba(0, 0, 0, 0.06); border-radius: 16px;
            overflow: hidden; display: flex; align-items: center; justify-content: center; 
        }
        #physics-canvas { display: block; width: 100%; height: auto; aspect-ratio: 16 / 10; }
        .canvas-overlay-data { position: absolute; top: 16px; left: 16px; pointer-events: none; display: flex; flex-direction: column; gap: 6px; }
        .overlay-item {
            background: rgba(255, 255, 255, 0.9); color: var(--color-text-main); backdrop-filter: blur(4px); border: 1px solid var(--color-border); padding: 6px 12px; border-radius: 8px;
            display: flex; align-items: center; gap: 8px; font-size: 11px;
        }
        .overlay-item .label { color: var(--color-text-muted); font-weight: 500; }
        .overlay-item .value { font-weight: 700; }
        .simulation-metrics-strip {
            display: flex; background: rgba(0, 0, 0, 0.01); border: 1px solid var(--color-border); border-radius: 12px; padding: 12px 20px;
            justify-content: space-around; align-items: center; gap: 10px; margin-top: 10px;
        }
        .mini-metric { display: flex; flex-direction: column; align-items: center; gap: 4px; text-align: center; }
        .mini-metric .label { font-size: 10px; font-weight: 600; color: var(--color-text-muted); text-transform: uppercase; letter-spacing: 0.5px; }
        .mini-metric .value { font-size: 14px; font-weight: 700; color: var(--color-text-main); font-family: var(--font-heading); }
        .mini-divider { width: 1px; height: 24px; background: var(--color-border); }
        .results-panel { grid-column: 3; }
        .ratio-readout-box {
            background: linear-gradient(135deg, var(--color-cyan-glow) 0%, var(--color-purple-glow) 100%); border: 1px solid rgba(2, 132, 199, 0.15); border-radius: 16px;
            padding: 20px; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 6px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.02);
        }
        .ratio-title { font-size: 11px; font-weight: 700; color: var(--color-cyan); letter-spacing: 1px; text-transform: uppercase; }
        .ratio-value {
            font-family: var(--font-heading); font-weight: 800; font-size: 24px; background: linear-gradient(90deg, var(--color-text-main), var(--color-cyan));
            -webkit-background-clip: text; -webkit-text-fill-color: transparent;
        }
        .ratio-type { font-size: 11px; font-weight: 600; color: var(--color-text-muted); }
        .results-grid { display: flex; flex-direction: column; gap: 12px; }
        .result-card {
            background: rgba(255, 255, 255, 0.85); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.03); border: 1px solid var(--color-border); border-radius: 12px;
            padding: 12px 16px; display: flex; align-items: center; gap: 16px; transition: all 0.2s ease;
        }
        .result-card:hover { transform: translateY(-2px); border-color: var(--color-cyan); background: var(--color-cyan-glow); }
        .card-icon {
            width: 38px; height: 38px; background: rgba(0, 0, 0, 0.015); border: 1px solid var(--color-border); border-radius: 10px;
            display: flex; align-items: center; justify-content: center; font-size: 14px; color: var(--color-text-muted);
        }
        .result-card:hover .card-icon { color: var(--color-cyan); border-color: var(--color-cyan); background: var(--color-cyan-glow); }
        .card-content { display: flex; flex-direction: column; gap: 2px; }
        .card-unit { font-size: 11px; font-weight: 600; color: var(--color-text-muted); }
        .card-value { font-family: var(--font-heading); font-weight: 700; font-size: 17px; color: var(--color-text-main); }
        .formula-card {
            background: #ffffff; border: 1px solid var(--color-border); border-radius: 12px; padding: 16px; display: flex; flex-direction: column; gap: 8px; font-size: 12px;
        }
        .formula-card h4 { font-weight: 700; color: var(--color-text-main); }
        .formula-equation {
            font-family: 'Outfit', 'Cambria Math', 'Times New Roman', monospace; color: #0284c7; font-size: 13px; background: #f8fafc; border-color: var(--color-border);
            padding: 8px 10px; border-radius: 6px;
        }
        /* Container Query */
        @container fit-container (max-width: 1100px) {
            .app-main-grid {
                grid-template-columns: 1fr 1fr;
                gap: 20px;
            }
            .control-panel {
                grid-column: 1;
            }
            .simulation-panel {
                grid-column: 2;
                align-self: start;
            }
            .results-panel {
                grid-column: 1 / span 2;
                display: grid;
                grid-template-columns: 1fr 1.2fr;
                gap: 20px;
            }
            .results-panel .panel-header {
                grid-column: 1 / span 2;
            }
            .ratio-readout-box {
                grid-column: 1;
                grid-row: 2;
            }
            .formula-card {
                grid-column: 1;
                grid-row: 3;
            }
            .results-grid {
                grid-column: 2;
                grid-row: 2 / span 2;
            }
        }
        @container fit-container (max-width: 768px) {
            .app-main-grid {
                grid-template-columns: 1fr;
            }
            .control-panel, .simulation-panel, .results-panel {
                grid-column: 1;
            }
            .simulation-panel {
                order: -1;
            }
            .results-panel {
                display: flex;
                flex-direction: column;
                gap: 16px;
            }
            .ratio-readout-box, .results-grid, .formula-card {
                grid-column: auto;
                grid-row: auto;
            }
            .panel-header h2 {
                white-space: normal !important;
                font-size: 15px !important;
            }
            .app-header {
                flex-direction: column;
                gap: 16px;
                text-align: center;
            }
            .logo-area {
                flex-direction: column;
                gap: 8px;
            }
        }
        .preset-details {
            display: flex;
            flex-direction: column;
            gap: 2px;
            align-items: flex-start;
            text-align: left;
        }
        .preset-spec {
            font-size: 11px;
            color: var(--color-text-muted);
            font-weight: 500;
        }
        .preset-name {
            font-size: 13px !important;
        }
/* ━━ WordPress 레이아웃 Override: 디자인 1 (2열 컴팩트 대칭 레이아웃) ━━ */
.fittolerance-calculator-wrapper .app-main-grid,
.fittolerance-calculator-wrapper .main-grid,
.fittolerance-calculator-wrapper .sim-grid {
    display: grid !important;
    grid-template-columns: 340px 1fr !important;
    gap: 24px !important;
    align-items: start !important;
}
/* 3열 레이아웃을 2열 레이아웃으로 변경하는 특화 스타일 */
.fittolerance-calculator-wrapper .right-column {
    display: flex !important;
    flex-direction: column !important;
    gap: 24px !important;
    min-width: 0 !important;
    grid-column: 2 !important;
}
.fittolerance-calculator-wrapper .simulation-panel,
.fittolerance-calculator-wrapper .canvas-panel,
.fittolerance-calculator-wrapper .sim-panel {
    grid-column: auto !important;
    order: 1 !important;
    align-self: stretch !important;
}
.fittolerance-calculator-wrapper .control-panel {
    grid-column: 1 !important;
}
/* 2열 통합 결과 분석 영역 레이아웃 */
.fittolerance-calculator-wrapper .simulation-results-section {
    display: grid !important;
    grid-template-columns: 1.1fr 1.3fr !important;
    gap: 20px !important;
    border-top: 1px solid var(--color-border) !important;
    padding-top: 20px !important;
    margin-top: 10px !important;
    align-items: stretch !important;
}
/* Readout Box 스타일 */
.fittolerance-calculator-wrapper .simulation-results-section .ratio-readout-box,
.fittolerance-calculator-wrapper .simulation-results-section .re-readout-box,
.fittolerance-calculator-wrapper .simulation-results-section .status-readout-box,
.fittolerance-calculator-wrapper .simulation-results-section .gauge-container {
    grid-column: 1 !important;
    grid-row: 1 !important;
    margin: 0 !important;
    height: auto !important;
    display: flex !important;
    flex-direction: column !important;
    justify-content: center !important;
}
.fittolerance-calculator-wrapper .simulation-results-section .results-grid {
    grid-column: 2 !important;
    grid-row: 1 / span 2 !important;
    display: flex !important;
    flex-direction: column !important;
    gap: 12px !important;
    justify-content: flex-start !important;
}
.fittolerance-calculator-wrapper .simulation-results-section .results-grid .result-card {
    flex: none !important;
    display: flex !important;
    align-items: center !important;
    min-height: 72px !important;
    height: auto !important;
    padding: 12px 16px !important;
}
.fittolerance-calculator-wrapper .simulation-results-section .formula-card {
    grid-column: 1 !important;
    grid-row: 2 !important;
}
/* 모바일/반응형 (800px 이하) ── 항상 세로형(1열) 정렬 및 시뮬레이터 캔버스 최상단 배치 */
@media (max-width: 800px) {
    .fittolerance-calculator-wrapper .app-main-grid,
    .fittolerance-calculator-wrapper .main-grid,
    .fittolerance-calculator-wrapper .sim-grid {
        grid-template-columns: 1fr !important;
        display: flex !important;
        flex-direction: column !important;
    }
    .fittolerance-calculator-wrapper .control-panel {
        order: 2 !important;
        width: 100% !important;
    }
    .fittolerance-calculator-wrapper .right-column {
        order: 1 !important;
        width: 100% !important;
        display: flex !important;
        flex-direction: column !important;
    }
    .fittolerance-calculator-wrapper .simulation-panel,
    .fittolerance-calculator-wrapper .canvas-panel,
    .fittolerance-calculator-wrapper .sim-panel,
    .fittolerance-calculator-wrapper .canvas-section {
        order: -1 !important;
    }
    .fittolerance-calculator-wrapper .simulation-results-section {
        grid-template-columns: 1fr !important;
    }
    .fittolerance-calculator-wrapper .simulation-results-section .ratio-readout-box,
    .fittolerance-calculator-wrapper .simulation-results-section .re-readout-box,
    .fittolerance-calculator-wrapper .simulation-results-section .status-readout-box,
    .fittolerance-calculator-wrapper .simulation-results-section .gauge-container {
        grid-column: 1 !important;
        grid-row: auto !important;
        height: auto !important;
    }
    .fittolerance-calculator-wrapper .simulation-results-section .results-grid {
        grid-column: 1 !important;
        grid-row: auto !important;
    }
    .fittolerance-calculator-wrapper .simulation-results-section .formula-card {
        grid-column: 1 !important;
        grid-row: auto !important;
    }
}
.fittolerance-calculator-wrapper .app-container,
.fittolerance-calculator-wrapper .main-container {
    max-width: 100% !important;
    padding: 12px !important;
}
/* Premium Advice/Formula Card & Typography Overrides */
.fittolerance-calculator-wrapper .simulation-results-section .formula-card,
.fittolerance-calculator-wrapper .results-panel .formula-card {
    background: #ffffff !important;
    border: 1px solid var(--color-border) !important;
    border-radius: 12px !important;
    padding: 16px !important;
    box-shadow: var(--shadow-card) !important;
    transition: all 0.2s ease !important;
    display: flex !important;
    flex-direction: column !important;
    gap: 8px !important;
}
.fittolerance-calculator-wrapper .simulation-results-section .formula-card h4,
.fittolerance-calculator-wrapper .results-panel .formula-card h4 {
    font-weight: 700 !important;
    color: var(--color-text-main) !important;
}
.fittolerance-calculator-wrapper #text-judgment {
    font-size: 12px !important;
    font-weight: 500 !important;
    color: var(--color-text-muted) !important;
    line-height: 1.6 !important;
    word-break: keep-all !important;
}
</style>
<div class="fittolerance-calculator-wrapper" style="position: relative; width: 100%; box-sizing: border-box; overflow: hidden; margin: 30px auto; border-radius: 20px;">
    <div class="app-background-glow" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 1; pointer-events: none; overflow: hidden;"></div>
    <div style="position: relative; z-index: 2; width: 100%;">
    <div class="app-container">
        <!-- Header -->
        <header class="app-header">
            <div class="logo-area">
                <div class="logo-icon"><i class="fa-solid fa-arrows-left-right"></i></div>
                <div>
                    <h1>FIT &#038; TOLERANCE</h1>
                    <div class="subtitle">축과 구멍의 ISO 286 공차 설계 계산기 &#038; 실시간 2D 시뮬레이터</div>
                </div>
            </div>
            <div class="header-badge">
                <div class="pulse-dot"></div>
                <div class="badge-text">ISO 286 MODEL ACTIVE</div>
            </div>
        </header>
        <!-- Main Layout Grid -->
        <main class="app-main-grid">
            <!-- Left Panel: Controls -->
            <section class="panel control-panel">
                <div class="panel-header">
                    <i class="fa-solid fa-sliders text-cyan"></i>
                    <h2>공차 설계 등급 제어</h2>
                </div>
                <!-- Basic Size D -->
                <div class="input-group">
                    <div class="input-label-row">
                        <label for="input-d"><i class="fa-solid fa-arrows-left-right text-cyan"></i> 기준 치수 (Basic Size)</label>
                        <span class="helper-text">(1.0 ~ 250.0 mm)</span>
                    </div>
                    <div class="number-input-wrapper">
                        <input type="number" id="input-d" class="custom-number-input" min="1" max="250" value="40" step="any">
                        <div class="unit-badge">mm</div>
                    </div>
                    <input type="range" id="slider-d" class="custom-slider slider-cyan" min="1" max="250" value="40">
                </div>
                <!-- Hole Class -->
                <div class="input-group">
                    <div class="input-label-row">
                        <label for="select-hole"><i class="fa-solid fa-circle-notch text-cyan"></i> 구멍 공차 등급 (Hole)</label>
                    </div>
                    <div class="select-wrapper">
                        <select id="select-hole" class="custom-select">
                            <option value="H7" selected>H7 (IT7 등급, 기준 편차 0)</option>
                            <option value="H8">H8 (IT8 등급, 기준 편차 0)</option>
                            <option value="G7">G7 (IT7 등급, 틈새 슬라이드용)</option>
                            <option value="F7">F7 (IT7 등급, 회전 베어링용)</option>
                        </select>
                        <i class="fa-solid fa-chevron-down select-arrow"></i>
                    </div>
                </div>
                <!-- Shaft Class -->
                <div class="input-group">
                    <div class="input-label-row">
                        <label for="select-shaft"><i class="fa-solid fa-circle text-magenta"></i> 축 공차 등급 (Shaft)</label>
                    </div>
                    <div class="select-wrapper">
                        <select id="select-shaft" class="custom-select">
                            <option value="g6" selected>g6 (정밀 회전/슬라이드 맞춤)</option>
                            <option value="h6">h6 (IT6 등급, 기준 축 맞춤)</option>
                            <option value="f6">f6 (일반 회전축 틈새 맞춤)</option>
                            <option value="js6">js6 (대칭 공차역 중간 맞춤)</option>
                            <option value="p6">p6 (경압입 조립 억지 맞춤)</option>
                            <option value="s6">s6 (강제 압입 결합 강억지 맞춤)</option>
                        </select>
                        <i class="fa-solid fa-chevron-down select-arrow"></i>
                    </div>
                </div>
                <!-- Presets -->
                <div class="presets-section">
                    <h3><i class="fa-solid fa-tags text-cyan"></i> 조립 공차 규격 프리셋</h3>
                    <div class="presets-grid">
                        <button class="preset-btn active" id="preset-clearance">
                            <div class="preset-icon"><i class="fa-solid fa-dharmachakra"></i></div>
                            <div class="preset-details"><span class="preset-name">H7/g6 정밀 기계 활주 회전 맞춤</span><span class="preset-spec">Clearance</span></div>
                        </button>
                        <button class="preset-btn" id="preset-transition">
                            <div class="preset-icon"><i class="fa-solid fa-gear"></i></div>
                            <div class="preset-details"><span class="preset-name">H7/js6 기어/풀리 정렬 중간 맞춤</span><span class="preset-spec">Transition</span></div>
                        </button>
                        <button class="preset-btn" id="preset-interference">
                            <div class="preset-icon"><i class="fa-solid fa-hammer"></i></div>
                            <div class="preset-details"><span class="preset-name">H7/p6 회전력 전달 압입 억지 맞춤</span><span class="preset-spec">Interference</span></div>
                        </button>
                    </div>
                </div>
            </section>
            <!-- Auto Injected Right Column wrapper for Design 1 -->
            <div class="right-column">
                <section class="panel simulation-panel">
                                <div class="panel-header">
                                    <i class="fa-solid fa-dharmachakra text-magenta"></i>
                                    <h2>맞물림 마이크로 공차 밴드 가시화 (1000배율 돋보기 View)</h2>
                                </div>
                                <div class="canvas-wrapper">
                                    <canvas id="physics-canvas" width="640" height="400"></canvas>
                                    <div class="canvas-overlay-data">
                                        <div class="overlay-item">
                                            <span class="label">결합 등급 성격:</span>
                                            <span class="value" id="overlay-run-status">틈새 끼워맞춤</span>
                                        </div>
                                    </div>
                                </div>
                                <div class="simulation-metrics-strip">
                                    <div class="mini-metric">
                                        <span class="label">구멍 치수 범위</span>
                                        <span class="value" id="val-hole-range">40.000 ~ 40.025 mm</span>
                                    </div>
                                    <div class="mini-divider"></div>
                                    <div class="mini-metric">
                                        <span class="label">축 치수 범위</span>
                                        <span class="value" id="val-shaft-range">39.975 ~ 39.991 mm</span>
                                    </div>
                                    <div class="mini-divider"></div>
                                    <div class="mini-metric">
                                        <span class="label">틈새 / 죔새 크기</span>
                                        <span class="value" id="val-clearance-limit">Min +9 / Max +34 &mu;m</span>
                                    </div>
                                </div>
                            <div class="simulation-results-section">
                                <div class="ratio-readout-box">
                                    <div class="ratio-title" id="txt-readout-title">끼워맞춤 판정 결과</div>
                                    <div class="ratio-value" id="txt-readout-val">틈새 끼워맞춤 (Clearance)</div>
                                    <div class="ratio-type" id="txt-readout-sub">추천 사양: 정밀 공작기계 주축 미끄럼부</div>
                                </div>
                                <div class="results-grid">
                                    <div class="result-card">
                                        <div class="card-icon"><i class="fa-solid fa-arrows-to-eye"></i></div>
                                        <div class="card-content">
                                            <span class="card-unit">구멍 공차 폭 (&mu;m)</span>
                                            <span class="card-value" id="res-hole-tol">+25 / 0 &mu;m</span>
                                        </div>
                                    </div>
                                    <div class="result-card">
                                        <div class="card-icon"><i class="fa-solid fa-arrows-to-dot"></i></div>
                                        <div class="card-content">
                                            <span class="card-unit">축 공차 폭 (&mu;m)</span>
                                            <span class="card-value" id="res-shaft-tol">-9 / -25 &mu;m</span>
                                        </div>
                                    </div>
                                    <div class="result-card">
                                        <div class="card-icon"><i class="fa-solid fa-circle-exclamation"></i></div>
                                        <div class="card-content">
                                            <span class="card-unit">최종 틈새/죔새 설계량</span>
                                            <span class="card-value" id="res-fit-vals">최소 9 / 최대 50 &mu;m</span>
                                        </div>
                                    </div>
                                </div>
                                <div class="formula-card">
                                    <h4><i class="fa-solid fa-info-circle text-cyan"></i> 공차 한계 정의 공식</h4>
                                    <div class="formula-equation">
                                        Clearance = Hole_Dia &#8211; Shaft_Dia &nbsp;&gt; 0
                                    </div>
                                    <div class="formula-equation">
                                        Interference = Shaft_Dia &#8211; Hole_Dia &nbsp;&gt; 0
                                    </div>
                                </div>
                            </div>
                </section>
            </div>
        </main>
        <!-- Disclaimer Footer -->
        <footer class="app-disclaimer" style="margin-top: 20px; padding: 12px 16px; background: rgba(0, 0, 0, 0.015); border: 1px solid var(--color-border); border-radius: 12px; font-size: 11px; color: var(--color-text-muted); line-height: 1.5; text-align: left; display: flex; gap: 10px; align-items: flex-start; clear: both;">
            <i class="fa-solid fa-circle-info" style="color: var(--color-cyan); font-size: 14px; margin-top: 2px; flex-shrink: 0;"></i>
            <span><strong>면책 조항 (Disclaimer):</strong> 본 시뮬레이터의 계산 결과는 교육 및 참고용으로만 제공되며, 실제 제품 설계나 제작 시에는 반드시 최신 공학 규격 및 공식 표준 설계 기준을 재확인하시기 바랍니다. 계산 값의 무결성을 보장하지 않으며, 이로 인해 발생하는 직접적/간접적 손해에 대해 제작자 및 본 블로그는 어떠한 책임을 지지 않습니다.</span>
        </footer>
    </div>
    <!-- CORE INTERACTIVE ENGINE -->
    </div>
</div>
<script>
    // Polyfill for CanvasRenderingContext2D.roundRect for backward compatibility
    if (typeof CanvasRenderingContext2D !== 'undefined') {
        if (!CanvasRenderingContext2D.prototype.roundRect) {
            CanvasRenderingContext2D.prototype.roundRect = function(x, y, w, h, r) {
                if (typeof r === 'number') r = [r];
                if (!Array.isArray(r)) r = [0];
                const rad = r[0] || 0;
                this.beginPath();
                this.moveTo(x + rad, y);
                this.lineTo(x + w - rad, y);
                this.quadraticCurveTo(x + w, y, x + w, y + rad);
                this.lineTo(x + w, y + h - rad);
                this.quadraticCurveTo(x + w, y + h, x + w - rad, y + h);
                this.lineTo(x + rad, y + h);
                this.quadraticCurveTo(x, y + h, x, y + h - rad);
                this.lineTo(x, y + rad);
                this.quadraticCurveTo(x, y, x + rad, y);
                this.closePath();
                return this;
            };
        }
    }
        (function() {
            let isInit = false;
            function initSimulator() {
                if (isInit) return;
                const inputD = document.getElementById('input-d');
                const sliderD = document.getElementById('slider-d');
                const selectHole = document.getElementById('select-hole');
                const selectShaft = document.getElementById('select-shaft');
                const canvas = document.getElementById('physics-canvas');
                const txtReadoutTitle = document.getElementById('txt-readout-title');
                const txtReadoutVal = document.getElementById('txt-readout-val');
                const txtReadoutSub = document.getElementById('txt-readout-sub');
                const valHoleRange = document.getElementById('val-hole-range');
                const valShaftRange = document.getElementById('val-shaft-range');
                const valClearanceLimit = document.getElementById('val-clearance-limit');
                const resHoleTol = document.getElementById('res-hole-tol');
                const resShaftTol = document.getElementById('res-shaft-tol');
                const resFitVals = document.getElementById('res-fit-vals');
                const overlayRunStatus = document.getElementById('overlay-run-status');
                // 철벽 방어: 모든 조작 및 결과 출력 DOM 엘리먼트가 온전히 존재해야만 초기화 승인
                if (!inputD || !sliderD || !selectHole || !selectShaft || !canvas ||
                    !txtReadoutTitle || !txtReadoutVal || !txtReadoutSub ||
                    !valHoleRange || !valShaftRange || !valClearanceLimit ||
                    !resHoleTol || !resShaftTol || !resFitVals || !overlayRunStatus) {
                    return;
                }
                const ctx = canvas.getContext('2d');
                if (!ctx) return;
                isInit = true;
                window.__fittolerance_initialized = true;
            const state = {
                d: 40.0, // basic size mm
                holeClass: 'H7',
                shaftClass: 'g6'
            };
            const ranges = {
                d: { min: 1.0, max: 250.0 }
            };
            // Standard ISO 286 Database for D ranges (values in micrometers)
            const holeDb = {
                'H7': [ [0, 10], [0, 12], [0, 15], [0, 18], [0, 21], [0, 25], [0, 30], [0, 35], [0, 40], [0, 46] ],
                'H8': [ [0, 14], [0, 18], [0, 22], [0, 27], [0, 33], [0, 39], [0, 46], [0, 54], [0, 63], [0, 72] ],
                'G7': [ [2, 12], [4, 16], [5, 20], [6, 24], [7, 28], [9, 34], [10, 40], [12, 47], [14, 54], [15, 61] ],
                'F7': [ [6, 16], [10, 22], [13, 28], [16, 34], [20, 41], [25, 50], [30, 60], [36, 71], [43, 83], [50, 96] ]
            };
            const shaftDb = {
                'h6': [ [-6, 0], [-8, 0], [-9, 0], [-11, 0], [-13, 0], [-16, 0], [-19, 0], [-22, 0], [-25, 0], [-29, 0] ],
                'g6': [ [-8, -2], [-12, -4], [-14, -5], [-17, -6], [-20, -7], [-25, -9], [-30, -10], [-34, -12], [-39, -14], [-44, -15] ],
                'f6': [ [-12, -6], [-18, -10], [-22, -13], [-27, -16], [-33, -20], [-41, -25], [-49, -30], [-56, -34], [-63, -39], [-72, -44] ],
                'js6': [ [-3, 3], [-4, 4], [-4.5, 4.5], [-5.5, 5.5], [-6.5, 6.5], [-8, 8], [-9.5, 9.5], [-11, 11], [-12.5, 12.5], [-14.5, 14.5] ],
                'p6': [ [6, 12], [12, 20], [15, 24], [18, 29], [22, 35], [26, 42], [32, 51], [37, 59], [43, 68], [50, 79] ],
                's6': [ [14, 20], [19, 27], [24, 33], [29, 40], [35, 48], [42, 58], [53, 72], [71, 93], [92, 117], [113, 142] ]
            };
            function getRangeIndex(val) {
                if (val <= 3.0) return 0;
                if (val <= 6.0) return 1;
                if (val <= 10.0) return 2;
                if (val <= 18.0) return 3;
                if (val <= 30.0) return 4;
                if (val <= 50.0) return 5;
                if (val <= 80.0) return 6;
                if (val <= 120.0) return 7;
                if (val <= 180.0) return 8;
                return 9; // up to 250
            }
            function calculateFit() {
                const idx = getRangeIndex(state.d);
                // Get Hole Tolerances
                const holeTol = holeDb[state.holeClass][idx];
                const EI = holeTol[0];
                const ES = holeTol[1];
                // Get Shaft Tolerances
                const shaftTol = shaftDb[state.shaftClass][idx];
                const ei = shaftTol[0];
                const es = shaftTol[1];
                state.EI = EI; state.ES = ES;
                state.ei = ei; state.es = es;
                // Max/Min diameters
                const maxHole = state.d + ES / 1000.0;
                const minHole = state.d + EI / 1000.0;
                const maxShaft = state.d + es / 1000.0;
                const minShaft = state.d + ei / 1000.0;
                state.maxHole = maxHole;
                state.minHole = minHole;
                state.maxShaft = maxShaft;
                state.minShaft = minShaft;
                // Clearances (틈새)
                const maxClearance = (ES - ei);
                const minClearance = (EI - es);
                // Interferences (죔새)
                const maxInterference = (es - EI);
                const minInterference = (ei - ES);
                state.maxClearance = maxClearance;
                state.minClearance = minClearance;
                state.maxInterference = maxInterference;
                state.minInterference = minInterference;
                // Determine classification
                let fitType = 'Clearance'; // Default
                if (minClearance >= 0.0) {
                    fitType = 'Clearance';
                } else {
                    if (maxInterference >= 0.0) {
                        if (minInterference >= 0.0) {
                            fitType = 'Interference';
                        } else {
                            fitType = 'Transition';
                        }
                    } else {
                        fitType = 'Transition';
                    }
                }
                state.fitType = fitType;
                updateUIValues();
            }
            function syncDFromInput() {
                let val = parseFloat(inputD.value);
                if (isNaN(val)) { val = ranges.d.min; }
                if (val < ranges.d.min) { val = ranges.d.min; }
                if (val > ranges.d.max) { val = ranges.d.max; }
                state.d = val;
                inputD.value = val.toFixed(1);
                sliderD.value = Math.round(val);
                calculateFit();
            }
            function syncDFromSlider() {
                state.d = parseFloat(sliderD.value);
                inputD.value = state.d.toFixed(1);
                calculateFit();
            }
            function updateUIValues() {
                valHoleRange.innerText = state.minHole.toFixed(3) + ' ~ ' + state.maxHole.toFixed(3) + ' mm';
                valShaftRange.innerText = state.minShaft.toFixed(3) + ' ~ ' + state.maxShaft.toFixed(3) + ' mm';
                // Formatting results card values
                resHoleTol.innerText = (state.EI >= 0 ? '+' : '') + state.EI + ' / ' + (state.ES >= 0 ? '+' : '') + state.ES + ' \u03bcm';
                resShaftTol.innerText = (state.ei >= 0 ? '+' : '') + state.ei + ' / ' + (state.es >= 0 ? '+' : '') + state.es + ' \u03bcm';
                if (state.fitType === 'Clearance') {
                    valClearanceLimit.innerText = 'Min +' + state.minClearance + ' / Max +' + state.maxClearance + ' \u03bcm';
                    resFitVals.innerText = '최소 ' + state.minClearance + ' / 최대 ' + state.maxClearance + ' \u03bcm';
                    txtReadoutVal.innerText = '틈새 끼워맞춤 (Clearance)';
                    txtReadoutVal.style.color = '#10b981';
                    overlayRunStatus.innerText = '틈새 끼워맞춤 (Clearance Fit)';
                    overlayRunStatus.style.color = '#10b981';
                    txtReadoutSub.innerText = '가동 결합: 미끄럼 샤프트 베어링부 적합';
                } else {
                    if (state.fitType === 'Interference') {
                        valClearanceLimit.innerText = 'Min -' + Math.abs(state.minInterference) + ' / Max -' + Math.abs(state.maxInterference) + ' \u03bcm';
                        resFitVals.innerText = '최소 ' + Math.abs(state.minInterference) + ' / 최대 ' + Math.abs(state.maxInterference) + ' \u03bcm';
                        txtReadoutVal.innerText = '억지 끼워맞춤 (Interference)';
                        txtReadoutVal.style.color = '#db2777';
                        overlayRunStatus.innerText = '억지 끼워맞춤 (Interference Fit)';
                        overlayRunStatus.style.color = '#db2777';
                        txtReadoutSub.innerText = '고정 결합: 축 가압 압입 및 열박음부 적합';
                    } else {
                        // Transition
                        valClearanceLimit.innerText = 'Max 틈새 +' + state.maxClearance + ' / Max 죔새 +' + state.maxInterference + ' \u03bcm';
                        resFitVals.innerText = '최대 틈새 ' + state.maxClearance + ' / 최대 죔새 ' + state.maxInterference + ' \u03bcm';
                        txtReadoutVal.innerText = '중간 끼워맞춤 (Transition)';
                        txtReadoutVal.style.color = '#f59e0b';
                        overlayRunStatus.innerText = '중간 끼워맞춤 (Transition Fit)';
                        overlayRunStatus.style.color = '#f59e0b';
                        txtReadoutSub.innerText = '정밀 위치 결합: 탈착식 기어 및 키부 적합';
                    }
                }
            }
            // Element listeners
            inputD.addEventListener('change', syncDFromInput);
            sliderD.addEventListener('input', syncDFromSlider);
            selectHole.addEventListener('change', function() {
                state.holeClass = selectHole.value;
                calculateFit();
            });
            selectShaft.addEventListener('change', function() {
                state.shaftClass = selectShaft.value;
                calculateFit();
            });
            // Presets
            document.getElementById('preset-clearance').addEventListener('click', function() {
                setActivePreset('preset-clearance');
                state.d = 40;
                state.holeClass = 'H7';
                state.shaftClass = 'g6';
                syncControlsToState();
                calculateFit();
            });
            document.getElementById('preset-transition').addEventListener('click', function() {
                setActivePreset('preset-transition');
                state.d = 40;
                state.holeClass = 'H7';
                state.shaftClass = 'js6';
                syncControlsToState();
                calculateFit();
            });
            document.getElementById('preset-interference').addEventListener('click', function() {
                setActivePreset('preset-interference');
                state.d = 40;
                state.holeClass = 'H7';
                state.shaftClass = 'p6';
                syncControlsToState();
                calculateFit();
            });
            function setActivePreset(id) {
                document.getElementById('preset-clearance').classList.remove('active');
                document.getElementById('preset-transition').classList.remove('active');
                document.getElementById('preset-interference').classList.remove('active');
                document.getElementById(id).classList.add('active');
            }
            function syncControlsToState() {
                inputD.value = state.d;
                sliderD.value = state.d;
                selectHole.value = state.holeClass;
                selectShaft.value = state.shaftClass;
            }
            // Canvas drawing
            // (canvas and ctx are already declared at the top of initSimulator)
            function getDPR() { return window.devicePixelRatio || 1; }
            function initCanvas() {
                const dpr = getDPR();
                const rect = canvas.getBoundingClientRect();
                if (rect.width > 0) {
                    if (rect.height > 0) {
                        canvas.width = rect.width * dpr;
                        canvas.height = rect.height * dpr;
                    } else {
                        canvas.width = 640 * dpr;
                        canvas.height = 400 * dpr;
                    }
                } else {
                    canvas.width = 640 * dpr;
                    canvas.height = 400 * dpr;
                }
                ctx.setTransform(1, 0, 0, 1, 0, 0);
                ctx.scale(dpr, dpr);
            }
            window.addEventListener('resize', initCanvas);
            initCanvas();
            setTimeout(initCanvas, 300);
            function animate(timestamp) {
                const dpr = getDPR();
                const rect = canvas.getBoundingClientRect();
                if (rect.width > 0) {
                    if (rect.height > 0) {
                        const targetW = Math.round(rect.width * dpr);
                        const targetH = Math.round(rect.height * dpr);
                        if (canvas.width !== targetW || canvas.height !== targetH) {
                            initCanvas();
                        }
                    }
                }
                const width = canvas.width / dpr;
                const height = canvas.height / dpr;
                ctx.clearRect(0, 0, width, height);
                // Grid
                ctx.strokeStyle = 'rgba(2, 132, 199, 0.05)';
                ctx.lineWidth = 1;
                const gridSize = 25;
                for (let x = 0; x < width; x += gridSize) {
                    ctx.beginPath(); ctx.moveTo(x, 0); ctx.lineTo(x, height); ctx.stroke();
                }
                for (let y = 0; y < height; y += gridSize) {
                    ctx.beginPath(); ctx.moveTo(0, y); ctx.lineTo(width, y); ctx.stroke();
                }
                // 2D Split Screen Drawing
                const cx1 = width * 0.28;
                const cx2 = width * 0.72;
                const cy = height / 2;
                // --- 1. Left Assembly Drawing: Standard Shaft and Hole ---
                ctx.save();
                // Clip to left section only — prevents shaft overflowing into right tolerance diagram
                ctx.beginPath();
                ctx.rect(0, 0, width * 0.49, height);
                ctx.clip();
                // Animation logic: slide in and out of the hole
                if (!state.animT) state.animT = 0;
                state.animT += 0.025; // Continuous time step
                const phase = (state.animT % 6); // 6-second loop
                let slideOffset = 0; // 0: fully inserted, 1: fully retracted
                if (phase < 1.5) {
                    // Sliding in
                    const t = phase / 1.5;
                    slideOffset = 1 - (3 * t * t - 2 * t * t * t);
                } else if (phase < 3.5) {
                    // Paused inside
                    slideOffset = 0;
                } else if (phase < 5.0) {
                    // Sliding out
                    const t = (phase - 3.5) / 1.5;
                    slideOffset = 3 * t * t - 2 * t * t * t;
                } else {
                    // Paused outside
                    slideOffset = 1;
                }
                // Set dynamic widths based on fit type
                const holeW = 72;
                let shaftW = 68; // Default
                if (state.fitType === 'Clearance') {
                    const avgC = (state.maxClearance + state.minClearance) / 2;
                    const visGap = Math.max(3, Math.min(10, 2 + avgC * 0.15));
                    shaftW = holeW - visGap * 2;
                } else if (state.fitType === 'Interference') {
                    const avgI = (Math.abs(state.minInterference) + Math.abs(state.maxInterference)) / 2;
                    const visOverlap = Math.max(3, Math.min(8, 2 + avgI * 0.1));
                    shaftW = holeW + visOverlap * 2;
                } else {
                    // Transition
                    shaftW = holeW;
                }
                // Draw Hole outer block (grey section with cutout) - Horizontal
                ctx.fillStyle = 'rgba(203,213,225,0.7)';
                ctx.strokeStyle = '#475569';
                ctx.lineWidth = 2;
                ctx.beginPath();
                ctx.rect(cx1 - 100, cy - 80, 200, 160);
                ctx.fill();
                ctx.stroke();
                // Cutout representation (draw background color inside cutout) - Horizontal
                ctx.fillStyle = '#f8fafc';
                ctx.beginPath();
                ctx.rect(cx1 - 101, cy - holeW / 2, 202, holeW);
                ctx.fill();
                ctx.strokeStyle = '#cbd5e1';
                ctx.stroke();
                // Draw Shaft: slides LEFT (exits left side) to avoid crossing the center divider
                const shaftX = cx1 - 130 * slideOffset;
                // Draw interference warning glow if overlapping
                if (state.fitType === 'Interference') {
                    if (slideOffset < 0.95) {
                        ctx.save();
                        ctx.shadowBlur = 15;
                        ctx.shadowColor = '#db2777';
                        ctx.strokeStyle = 'rgba(219, 39, 119, 0.4)';
                        ctx.lineWidth = 5;
                        ctx.beginPath();
                        ctx.roundRect(shaftX - 120, cy - shaftW / 2, 240, shaftW, 4);
                        ctx.stroke();
                        ctx.restore();
                    }
                }
                ctx.fillStyle = 'rgba(219,39,119,0.85)';
                ctx.strokeStyle = '#334155';
                ctx.lineWidth = 2.5;
                ctx.beginPath();
                ctx.roundRect(shaftX - 120, cy - shaftW / 2, 240, shaftW, 4);
                ctx.fill();
                ctx.stroke();
                // Anchor block walls — drawn AFTER shaft so they clip the shaft ends cleanly
                ctx.fillStyle = '#8497a8';  // slightly lighter for 3D feel
                ctx.strokeStyle = '#475569';
                ctx.lineWidth = 1.5;
                // Top wall
                ctx.beginPath();
                ctx.rect(cx1 - 100, cy - 80, 200, 80 - holeW / 2);
                ctx.fill();
                ctx.stroke();
                // Bottom wall
                ctx.beginPath();
                ctx.rect(cx1 - 100, cy + holeW / 2, 200, 80 - holeW / 2);
                ctx.fill();
                ctx.stroke();
                // Draw assembly status text
                ctx.fillStyle = '#475569';
                ctx.font = 'bold 11px sans-serif';
                ctx.textAlign = 'center';
                let statusText = "대기 중...";
                if (slideOffset === 0) {
                    if (state.fitType === 'Clearance') {
                        statusText = "조립 완료 (틈새 존재)";
                    } else if (state.fitType === 'Interference') {
                        statusText = "압입 조립 완료 (죔새 강결합)";
                    } else {
                        statusText = "조립 완료 (중간 끼워맞춤)";
                    }
                } else if (slideOffset === 1) {
                    statusText = "분해 상태 (축 분리)";
                } else {
                    statusText = "조립 진행 중...";
                }
                ctx.fillText(statusText, cx1, cy - 95);
                ctx.restore();
                // Divider line (centered at width * 0.5 to leave 40px gap from axis)
                ctx.strokeStyle = '#cbd5e1';
                ctx.lineWidth = 1.5;
                ctx.beginPath(); ctx.moveTo(width * 0.50, 20); ctx.lineTo(width * 0.50, height - 20); ctx.stroke();
                // --- 2. Right 1000x Magnified boundary diagram (Horizontal Zero Line) ---
                ctx.save();
                // Zero nominal line (Nominal dimension reference) - drawn horizontally
                const zeroY = cy;
                ctx.strokeStyle = '#94a3b8';
                ctx.lineWidth = 2;
                ctx.setLineDash([4, 4]);
                ctx.beginPath();
                ctx.moveTo(cx2 - 110, zeroY);
                ctx.lineTo(cx2 + 110, zeroY);
                ctx.stroke();
                ctx.setLineDash([]);
                // Legend for Zero Line (placed at the top right to avoid clipping and overlap)
                ctx.fillStyle = '#64748b';
                ctx.font = '500 10px Inter';
                ctx.textAlign = 'right';
                ctx.fillText('기본 치수 기준선 (Zero Line)', width - 20, 30);
                ctx.strokeStyle = '#94a3b8';
                ctx.lineWidth = 1.5;
                ctx.setLineDash([3, 3]);
                ctx.beginPath();
                ctx.moveTo(width - 200, 26);
                ctx.lineTo(width - 165, 26);
                ctx.stroke();
                ctx.setLineDash([]);
                // Tolerance scaling (dynamic scale factor to ensure graph always fits beautifully)
                const maxAbsDev = Math.max(
                    Math.abs(state.EI),
                    Math.abs(state.ES),
                    Math.abs(state.ei),
                    Math.abs(state.es)
                );
                const scalePx = maxAbsDev > 0 ? Math.min(3.5, 120 / maxAbsDev) : 1.2;
                // Vertical Y-axis for deviation scale
                const axisX = cx2 - 95;
                ctx.strokeStyle = '#cbd5e1';
                ctx.lineWidth = 1;
                ctx.beginPath();
                ctx.moveTo(axisX, cy - 130);
                ctx.lineTo(axisX, cy + 130);
                ctx.stroke();
                // Draw Y-axis ticks
                let tickInterval = 50;
                if (maxAbsDev <= 20) tickInterval = 5;
                else if (maxAbsDev <= 50) tickInterval = 10;
                else if (maxAbsDev <= 100) tickInterval = 25;
                ctx.fillStyle = '#94a3b8';
                ctx.font = '9px Inter';
                ctx.textAlign = 'right';
                ctx.textBaseline = 'middle';
                const limit = Math.ceil(130 / (tickInterval * scalePx));
                for (let t = -limit; t <= limit; t++) {
                    const val = t * tickInterval;
                    const ty = cy - val * scalePx;
                    if (ty >= cy - 130) {
                        if (ty <= cy + 130) {
                            ctx.beginPath();
                            ctx.moveTo(axisX - 4, ty);
                            ctx.lineTo(axisX, ty);
                            ctx.stroke();
                            let label = (val > 0 ? '+' : '') + val;
                            if (val === 0) label = '0';
                            ctx.fillText(label, axisX - 8, ty);
                        }
                    }
                }
                // Hole Tolerance Zone (Hole is on the left side of right section)
                // Y range represents: [zeroY - ES*scalePx, zeroY - EI*scalePx]
                const hTop = zeroY - state.ES * scalePx;
                const hHeight = (state.ES - state.EI) * scalePx;
                ctx.fillStyle = 'rgba(2, 132, 199, 0.15)';
                ctx.strokeStyle = '#0284c7';
                ctx.lineWidth = 2;
                ctx.beginPath();
                ctx.rect(cx2 - 65, hTop, 40, hHeight);
                ctx.fill();
                ctx.stroke();
                // Shaft Tolerance Zone (Shaft is on the right side of right section)
                // Y range represents: [zeroY - es*scalePx, zeroY - ei*scalePx]
                const sTop = zeroY - state.es * scalePx;
                const sHeight = (state.es - state.ei) * scalePx;
                ctx.fillStyle = 'rgba(219, 39, 119, 0.15)';
                ctx.strokeStyle = '#db2777';
                ctx.lineWidth = 2;
                ctx.beginPath();
                ctx.rect(cx2 + 20, sTop, 40, sHeight);
                ctx.fill();
                ctx.stroke();
                // Draw texts on the bands - positioned to avoid overlapping with Zero Line
                ctx.textBaseline = 'alphabetic';
                const hCenter = (state.EI + state.ES) / 2;
                const sCenter = (state.ei + state.es) / 2;
                if (hCenter >= sCenter) {
                    // Hole is higher or equal (Clearance or Transition where Hole is higher)
                    // Draw Hole text ABOVE the Hole box
                    ctx.fillStyle = '#0284c7';
                    ctx.font = 'bold 9.5px Inter';
                    ctx.textAlign = 'center';
                    ctx.fillText('Hole ' + state.holeClass, cx2 - 45, hTop - 18);
                    ctx.fillText('[' + (state.EI >= 0 ? '+' : '') + state.EI + ', ' + (state.ES >= 0 ? '+' : '') + state.ES + '] \u03bcm', cx2 - 45, hTop - 6);
                    // Draw Shaft text BELOW the Shaft box
                    ctx.fillStyle = '#db2777';
                    ctx.font = 'bold 9.5px Inter';
                    ctx.textAlign = 'center';
                    ctx.fillText('Shaft ' + state.shaftClass, cx2 + 40, sTop + sHeight + 14);
                    ctx.fillText('[' + (state.ei >= 0 ? '+' : '') + state.ei + ', ' + (state.es >= 0 ? '+' : '') + state.es + '] \u03bcm', cx2 + 40, sTop + sHeight + 26);
                } else {
                    // Shaft is higher (Interference or Transition where Shaft is higher)
                    // Draw Hole text BELOW the Hole box
                    ctx.fillStyle = '#0284c7';
                    ctx.font = 'bold 9.5px Inter';
                    ctx.textAlign = 'center';
                    ctx.fillText('Hole ' + state.holeClass, cx2 - 45, hTop + hHeight + 14);
                    ctx.fillText('[' + (state.EI >= 0 ? '+' : '') + state.EI + ', ' + (state.ES >= 0 ? '+' : '') + state.ES + '] \u03bcm', cx2 - 45, hTop + hHeight + 26);
                    // Draw Shaft text ABOVE the Shaft box
                    ctx.fillStyle = '#db2777';
                    ctx.font = 'bold 9.5px Inter';
                    ctx.textAlign = 'center';
                    ctx.fillText('Shaft ' + state.shaftClass, cx2 + 40, sTop - 18);
                    ctx.fillText('[' + (state.ei >= 0 ? '+' : '') + state.ei + ', ' + (state.es >= 0 ? '+' : '') + state.es + '] \u03bcm', cx2 + 40, sTop - 6);
                }
                // Show clearance/interference gap visualization
                ctx.lineWidth = 1.5;
                ctx.textAlign = 'left';
                if (state.fitType === 'Clearance') {
                    // Clearance Gap Arrow (Vertical between bottom of hole and top of shaft)
                    const arrowY1 = zeroY - state.EI * scalePx;
                    const arrowY2 = zeroY - state.es * scalePx;
                    ctx.strokeStyle = '#10b981';
                    ctx.fillStyle = '#10b981';
                    ctx.beginPath();
                    ctx.moveTo(cx2 - 10, arrowY1);
                    ctx.lineTo(cx2 - 10, arrowY2);
                    ctx.stroke();
                    // Arrow heads (only if gap is large enough, otherwise draw small dots)
                    if (Math.abs(arrowY1 - arrowY2) >= 15) {
                        ctx.beginPath();
                        ctx.moveTo(cx2 - 10, arrowY1); ctx.lineTo(cx2 - 14, arrowY1 + 5); ctx.lineTo(cx2 - 6, arrowY1 + 5); ctx.closePath(); ctx.fill();
                        ctx.beginPath();
                        ctx.moveTo(cx2 - 10, arrowY2); ctx.lineTo(cx2 - 14, arrowY2 - 5); ctx.lineTo(cx2 - 6, arrowY2 - 5); ctx.closePath(); ctx.fill();
                    } else {
                        ctx.beginPath();
                        ctx.arc(cx2 - 10, arrowY1, 2.5, 0, Math.PI * 2);
                        ctx.arc(cx2 - 10, arrowY2, 2.5, 0, Math.PI * 2);
                        ctx.fill();
                    }
                    // Draw text with white background box to clear zero line behind it
                    const txt = '최소 틈새: ' + state.minClearance + ' \u03bcm';
                    ctx.font = 'bold 9px Inter';
                    const txtWidth = ctx.measureText(txt).width;
                    const ty = (arrowY1 + arrowY2) / 2 + 3.5;
                    ctx.fillStyle = '#ffffff';
                    ctx.fillRect(cx2 - txtWidth / 2 - 3, ty - 8, txtWidth + 6, 11);
                    ctx.fillStyle = '#10b981';
                    ctx.textAlign = 'center';
                    ctx.fillText(txt, cx2, ty);
                } else if (state.fitType === 'Interference') {
                    // Interference Overlap Arrow (Vertical between top of hole and bottom of shaft)
                    const arrowY1 = zeroY - state.ES * scalePx;
                    const arrowY2 = zeroY - state.ei * scalePx;
                    ctx.strokeStyle = '#db2777';
                    ctx.fillStyle = '#db2777';
                    ctx.beginPath();
                    ctx.moveTo(cx2 - 10, arrowY1);
                    ctx.lineTo(cx2 - 10, arrowY2);
                    ctx.stroke();
                    // Arrow heads (only if gap is large enough, otherwise draw small dots)
                    if (Math.abs(arrowY1 - arrowY2) >= 15) {
                        ctx.beginPath();
                        ctx.moveTo(cx2 - 10, arrowY1); ctx.lineTo(cx2 - 14, arrowY1 + 5); ctx.lineTo(cx2 - 6, arrowY1 + 5); ctx.closePath(); ctx.fill();
                        ctx.beginPath();
                        ctx.moveTo(cx2 - 10, arrowY2); ctx.lineTo(cx2 - 14, arrowY2 - 5); ctx.lineTo(cx2 - 6, arrowY2 - 5); ctx.closePath(); ctx.fill();
                    } else {
                        ctx.beginPath();
                        ctx.arc(cx2 - 10, arrowY1, 2.5, 0, Math.PI * 2);
                        ctx.arc(cx2 - 10, arrowY2, 2.5, 0, Math.PI * 2);
                        ctx.fill();
                    }
                    // Draw text with white background box to clear zero line behind it
                    const txt = '최소 죔새: ' + Math.abs(state.minInterference) + ' \u03bcm';
                    ctx.font = 'bold 9px Inter';
                    const txtWidth = ctx.measureText(txt).width;
                    const ty = (arrowY1 + arrowY2) / 2 + 3.5;
                    ctx.fillStyle = '#ffffff';
                    ctx.fillRect(cx2 - txtWidth / 2 - 3, ty - 8, txtWidth + 6, 11);
                    ctx.fillStyle = '#db2777';
                    ctx.textAlign = 'center';
                    ctx.fillText(txt, cx2, ty);
                } else {
                    // Transition
                    ctx.strokeStyle = '#f59e0b';
                    ctx.fillStyle = '#f59e0b';
                    ctx.font = 'bold 10px Inter';
                    ctx.textAlign = 'center';
                    const txt = '공차 중첩 (중간 끼워맞춤)';
                    const txtWidth = ctx.measureText(txt).width;
                    ctx.fillStyle = '#ffffff';
                    ctx.fillRect(cx2 - txtWidth / 2 - 4, cy - 10, txtWidth + 8, 14);
                    ctx.fillStyle = '#f59e0b';
                    ctx.fillText(txt, cx2, cy + 1);
                }
                ctx.restore();
                requestAnimationFrame(animate);
            }
            requestAnimationFrame(animate);
            // Initial calculation
            calculateFit();
            // Right click / Copy Protection
            (function() {
                function blockEvents() {
                    document.addEventListener('contextmenu', function(e) {
                        e.preventDefault();
                        alert("이 콘텐츠는 저작권법의 보호를 받습니다. 무단 복제 및 우클릭을 금지합니다.");
                        return false;
                    }, { capture: true });
                    document.addEventListener('selectstart', function(e) {
                        e.preventDefault();
                        return false;
                    }, { capture: true });
                }
                if (document.readyState === 'complete' || document.readyState === 'interactive') {
                    blockEvents();
                } else {
                    document.addEventListener('DOMContentLoaded', blockEvents);
                }
            })();
            }
            // Visual debug logger for WordPress page
            function showVisualError(err) {
                let div = document.getElementById('fit-tol-debug-log');
                if (!div) {
                    div = document.createElement('div');
                    div.id = 'fit-tol-debug-log';
                    div.style.position = 'fixed';
                    div.style.bottom = '10px';
                    div.style.right = '10px';
                    div.style.background = 'rgba(255, 0, 0, 0.9)';
                    div.style.color = '#fff';
                    div.style.padding = '15px';
                    div.style.borderRadius = '8px';
                    div.style.zIndex = '99999';
                    div.style.fontFamily = 'monospace';
                    div.style.fontSize = '12px';
                    div.style.maxWidth = '400px';
                    div.style.maxHeight = '200px';
                    div.style.overflowY = 'auto';
                    div.style.boxShadow = '0 4px 12px rgba(0,0,0,0.3)';
                    document.body.appendChild(div);
                }
                div.innerHTML += "<div>" + err + "</div>";
            }
            // Retry loader sequence
            let loadAttempts = 0;
            function tryLoad() {
                loadAttempts++;
                try {
                    initSimulator();
                    if (window.__fittolerance_initialized) {
                        let div = document.getElementById('fit-tol-debug-log');
                        if (div) div.style.background = 'rgba(0, 200, 0, 0.9)';
                    }
                } catch (e) {
                    console.error("FitTolerance init error on attempt " + loadAttempts + ":", e);
                    showVisualError("Attempt " + loadAttempts + " Error: " + (e.stack || e.message || e));
                }
                if (!window.__fittolerance_initialized) {
                    if (loadAttempts < 50) {
                        setTimeout(tryLoad, 100);
                    } else {
                        showVisualError("Attempts exceeded 50. Key DOM elements not found!");
                    }
                }
            }
            if (document.readyState === 'complete' || document.readyState === 'interactive') {
                tryLoad();
            } else {
                document.addEventListener('DOMContentLoaded', tryLoad);
                window.addEventListener('load', tryLoad);
            }
        })();
</script>


<div style="background: linear-gradient(135deg, rgba(0,242,254,0.03), rgba(138,43,226,0.03)); border: 1px solid rgba(0,242,254,0.15); border-radius: 12px; padding: 18px 24px; margin: 25px auto 35px auto; font-size: 0.95em; color: #4b5563; line-height: 1.7; font-family: sans-serif;">
    <strong style="color: #1f2937; font-size: 1.05em; display: flex; align-items: center; gap: 8px;">
        <span style="font-size: 1.2em;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> 간편 사용 설명서
    </strong>
    <ol style="margin: 10px 0 0 0; padding-left: 20px;">
        <li style="margin-bottom: 6px;"><strong>기준 치수(Basic Size) 설정: 끼워맞춤 부하를 설계할 기준 치수(1.0 ~ 200.0 mm)를 제어합니다.</strong></li>
<li style="margin-bottom: 6px;">구멍(Hole) 및 축(Shaft) 공차 등급 선택: 구멍의 기호(H7, H8, G7, F7) 및 축의 기호(h6, g6, f6, js6, p6, s6)를 각각 드롭다운에서 매칭합니다.</li>
<li style="margin-bottom: 6px;">끼워맞춤 성격 분석: 틈새 끼워맞춤(Clearance), 중간 끼워맞춤(Transition), 억지 끼워맞춤(Interference) 중 어떠한 성격으로 판정되었는지 결과를 확인합니다.</li>
<li style="margin-bottom: 6px;">공차 밴드(Tolerance Zone) 확대 분석: 2D 시뮬레이션 영역에서 구멍 공차(Hole: Blue Band)와 축 공차(Shaft: Pink Band)가 결합 치수 경계 속에서 어떻게 밀착, 중첩 혹은 이격되는지 1000배율 확대 그래픽으로 관찰합니다.</li>
<li style="margin-bottom: 6px;">최대/최소 틈새 및 죔새 수치 획득: 조립 후 부품 간의 틈새(Clearance) 크기 또는 열팽창 압입 조립 시 요구되는 죔새(Interference) 수치들을 명확한 도면 한계 치수 카탈로그로 추출합니다.</li>
    </ol>
</div>


<details class="premium-seo-accordion" style="border: 1px solid rgba(0,0,0,0.08); border-radius: 12px; background: #fbfbfc; padding: 0; margin: 30px auto; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.01); font-family: sans-serif;">
    <summary style="display: flex; justify-content: space-between; align-items: center; padding: 20px 24px; font-size: 1.1em; font-weight: 700; color: #1f2937; cursor: pointer; user-select: none; outline: none; list-style: none;">
        <span><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 상세 기계공학 해설 및 ISO 286 공차 설계 규격 확인하기</span>
        <span class="accordion-arrow" style="font-size: 0.9em; color: #9ca3af; transition: transform 0.2s ease;">▼</span>
    </summary>
    <div style="padding: 0 24px 24px 24px; border-top: 1px solid rgba(0,0,0,0.04); background: #ffffff; border-radius: 0 0 12px 12px; font-size: 0.98em; color: #374151; line-height: 1.8;">
        <div style="margin-top: 20px;">
            <h3>1. ISO 공차 시스템 (ISO 286) 및 끼워맞춤의 기초 정의</h3>
<p>기계 조립 공정에서 완벽한 호환성(Interchangeability)을 확보하기 위해 구멍(Hole)과 축(Shaft)의 치수 한계를 국제 규격으로 정의한 것이 <strong>ISO 286 공차 시스템 (ISO Limits and Fits)</strong>입니다. 모든 부품은 가공 오차로 인해 완벽한 치수로 만들 수 없으므로, 허용되는 한계 오차 범위인 <strong>공차역 (Tolerance Zone)</strong>을 설정합니다.</p><p>끼워맞춤은 두 부품이 조립된 상태의 조밀한 성격에 따라 다음과 같이 세 분류로 구분됩니다:</p><ul><li><strong>틈새 끼워맞춤 (Clearance Fit):</strong> 구멍의 최소 허용 치수가 축의 최대 허용 치수보다 항상 커서 조립 후 항상 **틈새(Clearance)**가 발생하는 상태입니다. 윤활 회전축(g6, f7 등) 조립에 적용됩니다.</li><li><strong>억지 끼워맞춤 (Interference Fit):</strong> 구멍의 최대 허용 치수가 축의 최소 허용 치수보다 항상 작아 조립 전 축의 지름이 더 크며 조립 시 열박음이나 강한 압력이 필요하여 항상 **죔새(Interference)**가 발생하는 상태입니다. 고정용 키레스 결합(p6, s6 등)에 적용됩니다.</li><li><strong>중간 끼워맞춤 (Transition Fit):</strong> 가공 치수 산포에 따라 조립 후 틈새가 발생할 수도 있고 죔새가 발생할 수도 있는 기하학적 중간 점착 영역(js6, k6 등)입니다. 정밀 가이드 기구부나 풀리의 축 정렬 조립에 쓰입니다.</li></ul>
<h3>2. 기초공차(IT Grade)와 기본 치수 허용 한계선</h3>
<p>공차 기호 <code>H7 / g6</code>에서 문자는 공차역의 기준선 편차 위치인 **기초선 편차(Fundamental Deviation)**를 나타내며, 대문자는 구멍, 소문자는 축을 뜻합니다. 뒤에 붙는 숫자(6, 7, 8 등)는 공차의 절대적인 크기 수준을 나타내는 **IT 공차 등급 (Standard Tolerance Grade)**을 지칭하며, 숫자가 작을수록 고도의 정밀 가공(연삭, 정밀 브로칭 등)이 필요함을 뜻합니다.</p><ul><li><strong>구멍 H 기호:</strong> 아래 치수 허용차가 0 (<code>EI = 0</code>)인 기준 구멍 시스템의 표준입니다.</li><li><strong>축 h 기호:</strong> 위 치수 허용차가 0 (<code>es = 0</code>)인 기준 축 시스템의 표준입니다.</li></ul>
        </div>
    </div>
</details>
<style>
details.premium-seo-accordion[open] summary .accordion-arrow { transform: rotate(180deg); color: #00f2fe; }
details.premium-seo-accordion summary::-webkit-details-marker { display: none; }
details.premium-seo-accordion:hover { border-color: rgba(0,242,254,0.3); }
</style>

]]></content:encoded>
					
					<wfw:commentRss>https://myengnote.com/fit-tolerance-iso286-calculator-simulator-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
