Files
Pier_v1/Code/교각모델링앱/web/templates/pier.html
T
ahnyongjooandClaude Sonnet 5.5 964a841de1 chore(rebar): Pier_T_rebar 작업 폴더 초기 구성 및 외부 의존 파일 통합
- Code\rebar_pipeline, review_pipeline, pier-program을 정션에서 실제 폴더로 전환
- Code\rhino_mcp 및 CLAUDE_rhino배경.md 추가, .mcp.json은 PYTHONPATH로 새 위치 사용
- pier-program 내부 .git 제거(이력은 backup\pier-program_20261028.bundle에 보관)
- worktree 가이드 반영(CLAUDE.local.md, HANDOFF.md)
- D:\Rhino-MCP 경로 참조를 새 위치로 치환

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 11:20:18 +09:00

86 lines
7.8 KiB
HTML

{% extends "base.html" %}
{% block title %}{{ p.name }}{% endblock %}
{% block body %}
<h1>{{ p.name }} <span class="muted">({{ p.info.type }})</span></h1>
<h2>1. 도면</h2>
{% if audit %}
<table><tr><th>구분</th><th>DWG</th><th>DXF</th><th>DWG SHA-256</th></tr>
{% for a in audit %}<tr><td>{{ a.label }}</td><td>{{ a.source }}</td><td>{{ a.dxf }}</td><td><code>{{ a.source_sha256[:16] }}…</code></td></tr>{% endfor %}
</table>
<p>색인 문자 {{ ntexts }}개 · <a href="{{ url_for('search', name=p.name) }}">문자 검색</a> · <a href="{{ url_for('candidates', name=p.name) }}">표 후보값</a> · <a href="{{ url_for('geomread_page', name=p.name) }}">도면에서 읽기</a></p>
{% else %}<p class="muted">올린 도면이 없습니다.</p>{% endif %}
<form method="post" action="{{ url_for('upload', name=p.name) }}" enctype="multipart/form-data">
<input type="file" name="dwg" accept=".dwg" multiple> <button>올리기·변환</button>
<span class="muted">파일 이름 순서대로 D1, D2, …로 부릅니다. 다시 올리면 색인을 새로 만듭니다.</span>
</form>
<h2>2. 입력 묶음 확인·확정</h2>
<!-- stage A 2026-10-16 / stage B 2026-10-16 -->
{% from "_prism.html" import st_badge, human_badge %}
<div class="prism" id="bundles">
<div class="stack">
<section class="strip" aria-label="요약">
<p class="concl">필요 {{ nreq }}개 중 앱 확인 일치 {{ cnt.g }} · 주의 {{ cnt.w }} · 불일치 {{ cnt.b }} · 근거 없음 {{ cnt.n }} · 해당 없음 {{ cnt.x }} · 사람 확정 {{ human }}</p>
<div class="row">
<form method="post" action="{{ url_for('autocheck_run', name=p.name) }}" style="margin:0"><button class="btn" type="submit">전체 확인</button></form>
<a class="btn" href="{{ url_for('geomread_page', name=p.name) }}">도면에서 읽기</a>
<a class="btn primary" href="{{ url_for('review', name=p.name) }}">검토 요약으로 확정</a>
{% if nmatch %}<a class="btn" href="{{ url_for('confirm_matched', name=p.name) }}">일치 묶음만 확정 ({{ nmatch }}개)</a>{% endif %}
</div>
<p class="cap">앱 확인은 도면 표·재료표 수량·고정 항목을 앱이 대조한 결과이며 <b>앱은 확정하지 않습니다</b>. '일치'는 "독립 근거와 값이 같다"는 뜻이지 "도면이 맞다"는 뜻이 아닙니다.
<b>변수 등급</b> V1 값 · V2 목록 · V3 생성(화면 편집 차단) · F 고정(바꾸면 사유 필요).</p>
</section>
{% if chain_bad %}
<div class="banner dont" role="alert"><span class="m" aria-hidden="true">■</span><div>도면 치수 사슬 {{ chain_bad|length }}건이 검산에 맞지 않습니다(개수 × 간격 ≠ 합계) — 도면 자체의 오류일 수 있습니다:
{% for c in chain_bad %}<span class="chip">{{ c.dwg }} {{ c.text }} (계산 {{ c.n * c.pitch }} mm)</span> {% endfor %}
<a href="{{ url_for('candidates', name=p.name) }}">표 후보값 화면에서 보기</a></div></div>
{% endif %}
{% if origin_same %}
<div class="banner" role="alert"><span class="m" aria-hidden="true">▲</span><div>템플릿 원본 그대로인 필수 묶음 {{ origin_same|length }}개 — 템플릿을 복사한 뒤 한 번도 바뀌지 않았습니다. 새 도면과 대조(후보 반영·값 수정)하기 전에 확정하면 원본 교각의 모델이 PASS로 나올 수 있습니다:
{% for s in origin_same %}<a href="{{ url_for('evidence', name=p.name, which=s.file, key=s.key) }}">{{ s.file }}.{{ s.key }}</a>{% if not loop.last %}, {% endif %}{% endfor %}</div></div>
{% elif not has_origin %}<p class="cap muted">이 교각은 템플릿 복사 기록이 없어 '템플릿 원본 그대로' 여부를 표시하지 않습니다.</p>{% endif %}
<div class="tw"><table class="t">
<caption>입력 묶음 {{ sections|length }}개 — 앱 확인이 나쁜 것부터</caption>
<thead><tr><th scope="col">묶음</th><th scope="col">변수 등급</th><th scope="col">값 출처</th><th scope="col">앱 확인</th><th scope="col">사람 확정</th></tr></thead>
<tbody>
{% for s in sections %}
<tr>
<td><a href="{{ url_for('section', name=p.name, which=s.file, key=s.key) }}">{{ s.file }}.{{ s.key }}</a>{% if not s.required %} <span class="cap muted">(필수 아님)</span>{% endif %}</td>
<td>{% if s.info %}<span class="muted">참고</span>{% else %}<span title="{{ s.meta.note }}">{{ s.meta.grade }} {{ grades[s.meta.grade] }}</span>{% endif %}</td>
<td>{% if s.meta.origin and s.required %}<span class="b warn"><span class="m" aria-hidden="true">▲</span>템플릿 원본 그대로</span>{% elif s.meta.origin %}<span class="muted">템플릿 원본 그대로</span>{% else %}{{ s.meta.source|join(' · ') }}{% endif %}</td>
<td>{{ st_badge(s.chk.st) }} <span class="cap">{{ s.chk.summary }}</span> <a class="cap" href="{{ url_for('evidence', name=p.name, which=s.file, key=s.key) }}">근거 보기</a></td>
<td>{{ human_badge(s) }}{% if s.by %} <span class="cap muted">{{ s.by }} · {{ s.at }}</span>{% endif %}</td>
</tr>
{% endfor %}
</tbody>
</table></div>
</div>
</div>
{% if need %}<p class="muted">게이트에 필요한 묶음 {{ need|length }}개가 아직 확정되지 않았습니다. 앱 확인이 '일치'인 묶음은 위의 [일치 묶음 일괄 확정]으로, 나머지는 '근거 보기'에서 사유와 함께 하나씩 확정합니다.</p>
{% else %}<p class="ok">게이트에 필요한 묶음이 모두 확정되어 있습니다.</p>{% endif %}
<h2>3. 게이트</h2>
{% if out_of_scope %}<p class="muted">범위 밖: {{ out_of_scope|join(', ') }} — 이 교각에서는 모델링하지 않습니다.</p>{% endif %}
<table><tr><th>게이트</th><th>내용</th><th>판정</th><th>승인</th></tr>
{% for g in gates %}
<tr><td>{{ g.id }}</td><td>{{ g.name }}</td>
<td>{% if g.report %}{% if g.stale %}<span class="warn">입력 변경 · 재실행 필요</span>{% elif g.report.verdict == 'PASS' %}<span class="ok">PASS</span>{% else %}<span class="fail">FAIL</span>{% endif %}{% else %}<span class="muted">미실행</span>{% endif %}</td>
<td>{% if g.approved %}<span class="ok">승인</span>{% elif g.approval %}{{ g.approval.decision }}{% else %}<span class="muted">-</span>{% endif %}</td></tr>
{% endfor %}
</table>
{% if running %}<p class="warn">실행 중입니다{% if batch and batch.log %} — {{ batch.log[-1] }}{% endif %}.
<a href="{{ url_for('gates', name=p.name) }}">게이트 화면에서 진행 보기</a></p>
{% elif todo %}
<form method="post" action="{{ url_for('gates_run_all', name=p.name) }}"
onsubmit="return confirm('{{ todo[0] }}~{{ todo[-1] }}를 차례로 승인합니다. 최신 PASS 결과가 있는 게이트는 바로 승인하고, 결과가 없으면 실행한 뒤 PASS일 때만 승인합니다. 진행할까요?');">
판정자 <input type="text" name="by" required>
<button {% if need %}disabled title="먼저 묶음을 확정하세요"{% endif %}>{{ todo[0] if todo|length == 1 else todo[0] ~ '~' ~ todo[-1] }} 일괄 승인</button>
<span class="muted">{% if need %}먼저 위의 묶음을 확정하세요. {% endif %}최신 PASS 결과가 있으면 바로 승인하고, 없으면 실행한 뒤 PASS일 때만 승인합니다. FAIL·오류가 나면 멈춥니다. 진행은 게이트 화면에서 보입니다.</span>
</form>
{% else %}<p class="ok">모든 게이트가 승인되어 있습니다.</p>{% endif %}
{% if batch and not running %}<p class="muted">최근 일괄 실행: {{ batch.state }} · {{ batch.by }} · {{ batch.at }}{% if batch.log %} — {{ batch.log[-1] }}{% endif %}</p>{% endif %}
<p><a href="{{ url_for('gates', name=p.name) }}">게이트 화면으로</a> (게이트별 결과·개별 실행·보고서)</p>
{% endblock %}