Files
Pier_v1/Code/pier-program/사용법.txt
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

194 lines
11 KiB
Plaintext

==================================================
교각 철근 프로그램 사용법 (메모장용)
==================================================
[1] 이 프로그램이 뭔가요?
- 철근의 구부림 반지름, 갈고리 길이 같은 값을 계산하는 도구입니다.
- 지금은 계산 모듈 1개(rebar_calc.py)와 테스트가 있습니다.
- 앞으로 철근 수량, 간격, Rhino 배치 코드를 이 폴더에 계속 추가합니다.
[2] 폴더 위치 (전부 D 드라이브)
프로젝트 폴더 : D:\★Pier 자료\pier_v1\Pier_T_rebar\Code\pier-program
계산 모듈 : D:\★Pier 자료\pier_v1\Pier_T_rebar\Code\pier-program\scripts\rebar_calc.py
테스트 : D:\★Pier 자료\pier_v1\Pier_T_rebar\Code\pier-program\tests\test_rebar_calc.py
설계 규칙 : D:\★Pier 자료\pier_v1\Pier_T_rebar\Code\pier-program\docs\design_rules.md
할 일 목록 : D:\★Pier 자료\pier_v1\Pier_T_rebar\Code\pier-program\docs\tasks.md
경로 목록 : D:\★Pier 자료\pier_v1\Pier_T_rebar\Code\pier-program\docs\paths.md
이 사용법 : D:\★Pier 자료\pier_v1\Pier_T_rebar\Code\pier-program\사용법.txt
※ 기존 프로젝트 D:\Rhino-MCP\rhino-mcp-main 은 참고용입니다. 수정하지 마세요.
[3] 터미널(PowerShell) 여는 방법
1) 윈도우 탐색기에서 D:\★Pier 자료\pier_v1\Pier_T_rebar\Code\pier-program 폴더를 엽니다.
2) 위쪽 주소창을 클릭하고 powershell 이라고 입력한 뒤 Enter.
3) 파란 창이 열리면 이미 프로젝트 폴더 안에 있는 상태입니다.
[4] 테스트 실행 (계산이 맞는지 확인)
터미널에서 아래를 입력하고 Enter:
python -m pytest -q
- 마지막 줄에 "119 passed" 라고 나오면 모두 정상입니다.
(앞의 숫자는 테스트가 늘어나면 같이 늘어납니다. "failed" 가 없으면 정상입니다.)
- "failed" 라고 나오면 어느 계산이 틀렸는지 표시됩니다. 그 내용을 Claude에게 붙여넣으세요.
※ "python" 이 안 되면 아래처럼 전체 경로로 실행하세요:
C:\Users\User\AppData\Local\Programs\Python\Python312\python.exe -m pytest -q
[5] 계산 모듈 직접 써보기
터미널에서 아래를 입력하면 계산기처럼 쓸 수 있습니다.
cd scripts
python
파란 창에 ">>>" 가 나오면 한 줄씩 입력합니다.
>>> import rebar_calc as rc
>>> rc.nominal_diameter("H25") # 공칭 직경
25.4
>>> round(rc.bend_radius("H25"), 1) # 구부림 반지름 (3db)
76.2
>>> round(rc.bend_radius("H29"), 1) # H29는 4db
114.4
>>> round(rc.bend_radius("H16", is_stirrup=True), 1) # 스터럽 D16 이하는 2db
31.8
>>> round(rc.hook_extension("H25", 90), 1) # 90도 갈고리 연장 길이 (12db)
304.8
>>> round(rc.hook_extension("H25", 135), 1) # 135도는 6db
152.4
>>> rc.satisfies_kds_bend("H25", 76.2) # KDS 기준을 만족하나요?
True
끝낼 때는 exit() 를 입력합니다.
모든 길이의 단위는 mm 입니다.
※ round(값, 1) 은 소수 첫째 자리까지 반올림하는 명령입니다.
round 없이 쓰면 76.19999999999999 처럼 아주 작은 오차가 보일 수 있습니다.
컴퓨터가 소수를 계산하는 방식 때문이고, 값은 맞습니다.
[6] 함수 설명표
nominal_diameter(이름) 공칭 직경 (예: "H25" -> 25.4)
bend_radius(이름, is_stirrup) 프로젝트 적용 구부림 반지름
(D10~D25 3db, D29~D35 4db, D38 이상 5db,
스터럽 D16 이하 2db)
kds_min_inner_diameter(이름) KDS 24 14 21 최소 내면 지름
(D16 이하 2db, D19 이상 3.5db)
satisfies_kds_bend(이름, 반지름) KDS 최소값을 만족하면 True
hook_extension(이름, 각도) 갈고리 연장 길이 (90도 12db, 135도 6db,
180도 4db 또는 60mm 중 큰 값)
kds_min_hook_extension(이름, 각도) KDS 최소 연장 길이 (90~150도 5db)
철근 이름은 "H25" 처럼 씁니다. "D25", 소문자 "h25" 도 됩니다.
지원 규격: H10, H13, H16, H19, H22, H25, H29, H32, H35, H38
--- 배치 계산 (scripts\rebar_layout.py) ---
사용: import rebar_layout as rl
center_out_positions(본수, 간격) 중심에서 바깥으로 놓은 폭방향 위치 목록
(짝수=중심에 철근 없음, 홀수=중심에 1본)
snapped_array(본수, 간격, 폭, 피복) 바깥 2본은 피복에 맞추고 안쪽은 중심에서 바깥으로
(1CYCLE 방식. 예: 14본, 250, 3500, 120)
min_horizontal_clear(이름, gmax) 수평 최소 순간격 max(1.5db, 1.5Gmax, 40)
horizontal_spacing_ok(위치목록, 이름) 간격이 충분하면 True
min_vertical_clear(이름) 다단 연직 최소 순간격 max(25, db)
vertical_pitch_ok(이름, 단 간격) 단 간격이 충분하면 True
tier_elevations(상면높이, 피복, 단수, 간격) 각 단의 높이 목록
bar_weight(이름, 길이mm, 본수) 중량(kg)
array_summary(이름, 길이mm, 위치목록) 본수, 총길이(m), 중량(kg)
예) >>> import rebar_layout as rl
>>> rl.snapped_array(14, 250, 3500, 120)
[-1630.0, -1375.0, ..., -125.0, 125.0, ..., 1375.0, 1630.0]
※ 굵은골재 최대치수(gmax)는 가정값 25mm 입니다. 설계서 값이 다르면 알려주세요.
※ 단위중량은 H16, H19, H22, H25, H29 만 등록되어 있습니다. 다른 규격은 오류가 납니다.
--- 좌표 변환 (scripts\frame.py) ---
월드 좌표 (x, y, z) 를 코핑 기준 좌표 (s, t, z) 로 바꾸거나 되돌립니다.
s = 코핑 길이방향, t = 폭방향, z = 높이(그대로)
원점과 각도는 언제든 바꿀 수 있습니다. (값으로 받기 때문입니다)
사용: import frame as fr
fr.Frame(원점x, 원점y, 각도) 프레임 직접 만들기 (각도는 라디안)
fr.from_two_points((x1,y1), (x2,y2)) 두 점으로 만들기 (원점=가운데, s축=1번->2번 방향)
예: 2주식 교각의 두 기둥 중심
f.to_local(x, y, z) 월드 -> 로컬
f.to_world(s, t, z) 로컬 -> 월드
fr.convert(점, 프레임1, 프레임2) 프레임1 기준 값을 프레임2 기준 값으로
예) >>> import frame as fr
>>> f = fr.from_two_points((480708784, 153831202), (480721068, 153835457))
>>> f.to_local(480708784, 153831202, 7738)
(-6500.032326842691, -2.2737367544323206e-13, 7738)
<- 기둥 중심: 코핑 중앙에서 s 방향으로 약 -6500, t는 0 (e-13 은 0에 아주 가까운 계산 오차)
원점이나 각도를 바꾸고 싶으면 새 프레임을 만들어 쓰면 됩니다.
월드 위치는 변하지 않고 로컬 숫자만 달라집니다.
--- 철근 중심선 꺾임점 (scripts\centerline.py) ---
단면 외곽선을 안쪽으로 피복만큼 옮긴 직선들의 교점으로 철근 중심선을 구합니다.
2D 좌표는 (s, z) 입니다. (s=길이방향, z=높이)
사용: import centerline as cl
cl.centerline_points(선분목록, 피복, "left"/"right", start_len=, end_len=)
선분목록 : 철근이 지나가는 순서와 방향대로 [(시작점, 끝점), ...]
"left"/"right" : 콘크리트 안쪽이 진행 방향의 왼쪽인지 오른쪽인지
start_len / end_len : 도면에 정해진 시작·끝 연장 길이 (없으면 생략)
cl.segment_lengths(점목록) 각 구간 길이 (도면의 a, b, c, d 와 비교)
cl.polyline_length(점목록) 전체 길이
cl.turn_angles(점목록) 꺾임 각도(도)
예) 대호지교 P1 형식 VII (C8/C10), 도면과 같은 값이 나옵니다:
>>> import centerline as cl
>>> segs = [((12100,10738),(12100,9238)), ((12100,9238),(8100,7738)),
... ((8100,7738),(4900,7738)), ((4900,7738),(3400,8238))]
>>> pts = cl.centerline_points(segs, 120, "right", start_len=630, end_len=2331)
>>> [round(x, 1) for x in cl.segment_lengths(pts)]
[630.0, 4167.1, 3158.8, 2331.0] <- 도면 a, b, c, d
※ 길이는 중심선 길이입니다. 재료표의 전개길이(꺾임 보정 포함)와는 다를 수 있습니다.
--- 철근 간섭 검사 (scripts\clash.py) ---
철근 중심선을 선분으로 쪼개서 서로 겹치는(간섭) 철근을 찾습니다.
간섭 = 두 철근 반지름의 합 - 중심선 최단거리 가 0.5mm 보다 클 때.
같은 철근이나 같은 그룹(겹침이음인 뚜껑+바닥 조각)끼리는 검사하지 않습니다.
사용: import clash as ck
ck.Seg(시작점, 끝점, 반지름, 철근번호, 그룹번호, 마크이름) 선분 하나 만들기
ck.find_clashes(선분목록, min_penetration=0.5) 간섭 목록 (깊은 것부터)
ck.summarize_by_mark(간섭목록) 마크 쌍별 개수와 최대 관입
ck.segment_distance(p1, q1, p2, q2) 선분 두 개 사이 최단거리
예) >>> import clash as ck
>>> a = ck.Seg((-100,0,0), (100,0,0), 12.7, 1, 1, "C1")
>>> b = ck.Seg((0,-100,20), (0,100,20), 12.7, 2, 2, "C8")
>>> ck.find_clashes([a, b])
[{'bar_a': 1, 'bar_b': 2, 'mark_a': 'C1', 'mark_b': 'C8',
'penetration': 5.4, 'point': (0.0, 0.0, 10.0)}]
<- 철근 중심이 20mm 떨어졌는데 반지름 합이 25.4 라서 5.4mm 겹침
(실제 출력은 5.399999999999999 처럼 미세한 오차가 보일 수 있습니다)
※ 월드 좌표(약 4.8억)보다 frame.py 로 바꾼 로컬 좌표를 쓰면 계산이 더 정확합니다.
[7] Claude와 같이 작업하는 순서
1) Claude에게 할 일을 말합니다. (docs\tasks.md 의 번호로 말하면 쉽습니다. 예: "T-003 시작해줘")
2) Claude가 테스트를 먼저 만들고, 실패하는 것을 확인한 뒤 코드를 만듭니다.
3) 끝나면 Claude가 docs 와 README 를 업데이트할지 묻습니다.
4) 커밋(저장 기록)은 Claude가 물어본 뒤 "응" 이라고 하면 합니다.
5) Claude는 매번 응답 끝에 "이번에 쓴 경로"를 알려줍니다.
[8] 헷갈릴 때
- 경로가 헷갈리면 D:\★Pier 자료\pier_v1\Pier_T_rebar\Code\pier-program\docs\paths.md 를 보세요.
- 새 프로그램은 pier-program, 옛날 자료는 rhino-mcp-main 입니다.
- 큰 파일(렌더링, 백업, DXF, Rhino 파일)은 항상 D 드라이브에 저장합니다.