"""철근 구부림 반지름과 갈고리 길이 계산 모듈. 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)