- 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>
91 lines
2.9 KiB
Python
91 lines
2.9 KiB
Python
"""철근 구부림 반지름과 갈고리 길이 계산 모듈.
|
|
|
|
Rhino 없이 실행됩니다. 단위는 모두 mm입니다.
|
|
기준값 출처: docs/design_rules.md
|
|
"""
|
|
|
|
# KS D 3504 공칭 철근 직경 (mm)
|
|
NOMINAL_DIAMETER = {
|
|
10: 9.5,
|
|
13: 12.7,
|
|
16: 15.9,
|
|
19: 19.1,
|
|
22: 22.2,
|
|
25: 25.4,
|
|
29: 28.6,
|
|
32: 31.8,
|
|
35: 34.9,
|
|
38: 38.1,
|
|
}
|
|
|
|
# 갈고리 뒤 연장 길이 (공칭 직경의 배수). 프로젝트 적용값
|
|
HOOK_EXTENSION_FACTOR = {90: 12.0, 135: 6.0, 180: 4.0}
|
|
HOOK_180_MIN_EXTENSION = 60.0 # 180도 갈고리는 4db 또는 60mm 중 큰 값
|
|
|
|
# KDS 24 14 21: 90도~150도 표준갈고리 연장 길이 최소값 (db의 배수)
|
|
KDS_HOOK_MIN_FACTOR = 5.0
|
|
|
|
|
|
def bar_number(name):
|
|
"""'H25', 'D25', 'h25' 같은 이름에서 호칭 번호(25)를 꺼냅니다."""
|
|
text = str(name).strip().upper()
|
|
if len(text) < 2 or text[0] not in ("H", "D") or not text[1:].isdigit():
|
|
raise ValueError("알 수 없는 철근 이름입니다: %r" % (name,))
|
|
return int(text[1:])
|
|
|
|
|
|
def nominal_diameter(name):
|
|
"""철근 이름(예: 'H25')의 공칭 직경을 mm로 돌려줍니다."""
|
|
number = bar_number(name)
|
|
if number not in NOMINAL_DIAMETER:
|
|
raise ValueError("지원하지 않는 철근 규격입니다: %r" % (name,))
|
|
return NOMINAL_DIAMETER[number]
|
|
|
|
|
|
def bend_radius(name, is_stirrup=False):
|
|
"""프로젝트 적용 구부림 최소 내면 반지름(mm).
|
|
|
|
D10~D25: 3db, D29~D35: 4db, D38 이상: 5db.
|
|
스터럽/띠철근이고 D16 이하이면 2db.
|
|
"""
|
|
number = bar_number(name)
|
|
db = nominal_diameter(name)
|
|
if is_stirrup and number <= 16:
|
|
return 2.0 * db
|
|
if number <= 25:
|
|
return 3.0 * db
|
|
if number <= 35:
|
|
return 4.0 * db
|
|
return 5.0 * db
|
|
|
|
|
|
def kds_min_inner_diameter(name):
|
|
"""KDS 24 14 21 표 4.5-1 최소 내면 지름(mm). D16 이하 2db, D19 이상 3.5db."""
|
|
number = bar_number(name)
|
|
db = nominal_diameter(name)
|
|
if number <= 16:
|
|
return 2.0 * db
|
|
return 3.5 * db
|
|
|
|
|
|
def satisfies_kds_bend(name, radius):
|
|
"""내면 반지름(mm)이 KDS 최소 내면 지름을 만족하는지 확인합니다."""
|
|
return 2.0 * radius >= kds_min_inner_diameter(name)
|
|
|
|
|
|
def hook_extension(name, angle):
|
|
"""프로젝트 적용 갈고리 뒤 연장 길이(mm). angle은 90, 135, 180 중 하나."""
|
|
if angle not in HOOK_EXTENSION_FACTOR:
|
|
raise ValueError("지원하지 않는 갈고리 각도입니다: %r" % (angle,))
|
|
length = HOOK_EXTENSION_FACTOR[angle] * nominal_diameter(name)
|
|
if angle == 180:
|
|
length = max(length, HOOK_180_MIN_EXTENSION)
|
|
return length
|
|
|
|
|
|
def kds_min_hook_extension(name, angle):
|
|
"""KDS 24 14 21 갈고리 연장 길이 최소값(mm). 90~150도는 5db."""
|
|
if not 90 <= angle <= 150:
|
|
raise ValueError("KDS 5db 규정은 90~150도에만 적용됩니다: %r" % (angle,))
|
|
return KDS_HOOK_MIN_FACTOR * nominal_diameter(name)
|