feat: 프로젝트 공통 지반모델·교대 지반 통합·재료표/수량 진입·옥성교 랜딩 히어로 (11-06~11-09 작업분)
공용 파일(main.ts·index.html·style.css)에서 서로 얽혀 있어 한 커밋으로 묶음. - 지반: ① 형상 프로젝트 지반모델 관리창(생성·JSON 불러오기·교각별 비교·선택 적용), 프로젝트 JSON 내장 groundModel 추출, 교대 8행 통합 적용·공통지형 중복격자 제외 - 재료표·수량: 상단 ⑤ 메뉴·배근 바로가기, 결과 교각/탭 기억, 수량 워크북·정합 보정 - 랜딩: 옥성교 6교각 히어로 이미지·투영 강조점·좌→우 광선·지형 라운드/도로 연결 - 검증 스크립트(verify-project-ground/ground-abutments/okseong-user-files/quantity-*/landing-hero 등) 정본: DOC/04_실행/실행_*_2026-11-09_v0.1.00.md Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
b2bebe47eb
commit
fc520ec03d
47 files changed
+2848
-149
No files matched your search
@@ -0,0 +1,42 @@
|
||||
"""Create a review sheet from native Three.js captures; validate local structure crops."""
|
||||
import json
|
||||
from pathlib import Path
|
||||
from PIL import Image, ImageChops, ImageDraw, ImageFont
|
||||
|
||||
root = Path(__file__).resolve().parents[1]
|
||||
out = root / '.verify/landing-horizontal-20261109'
|
||||
metadata = json.loads((out / 'horizontal-smooth.json').read_text())
|
||||
raw = Image.open(out / 'horizontal.png').convert('RGBA')
|
||||
smooth = Image.open(out / 'horizontal-smooth.png').convert('RGBA')
|
||||
checks = []
|
||||
for point in metadata['points']:
|
||||
x, y = point['x'] * 2, point['y'] * 2
|
||||
box = (int(x - 48), int(y - 8), int(x + 48), int(y + 120))
|
||||
assert ImageChops.difference(raw.crop(box), smooth.crop(box)).getbbox() is None, point['name']
|
||||
checks.append(point['name'] + ' local structure pixels unchanged')
|
||||
assert metadata['along'] == 0
|
||||
assert metadata['outline']['addedOutsideSourcePixels'] == 0
|
||||
checks.extend(['horizontal camera has zero along-axis component', 'no pixels added outside source'])
|
||||
|
||||
sheet = Image.new('RGB', (1600, 1050), '#f5f8fb')
|
||||
draw = ImageDraw.Draw(sheet)
|
||||
font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 23)
|
||||
small = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 17)
|
||||
previous = out / 'before-horizontal/okseong-model-hero.png'
|
||||
panels = [
|
||||
('PREVIOUS / diagonal view, rough survey boundary', previous if previous.exists() else root / '랜딩페이지/assets/okseong-model-hero.png'),
|
||||
('PROPOSAL / horizontal orthographic view, inward curved boundary', out / 'horizontal-smooth.png'),
|
||||
]
|
||||
for i, (label, path) in enumerate(panels):
|
||||
y = 25 + i * 510
|
||||
draw.rounded_rectangle((20, y, 1580, y + 480), radius=20, fill='white', outline='#dce4ed')
|
||||
draw.text((45, y + 20), label, font=font, fill='#19334d')
|
||||
image = Image.open(path).convert('RGBA')
|
||||
image = image.crop(image.getbbox())
|
||||
image.thumbnail((1500, 380), Image.Resampling.LANCZOS)
|
||||
sheet.paste(image, ((1600 - image.width) // 2, y + 80 + (380 - image.height) // 2), image)
|
||||
if i == 1:
|
||||
draw.text((45, y + 445), '6 piers + 2 abutments preserved / original survey unchanged / preview only', font=small, fill='#52667a')
|
||||
sheet.save(out / 'comparison.png')
|
||||
(out / 'review-report.json').write_text(json.dumps({'result': 'PASS', 'checks': checks}, indent=2))
|
||||
print(f'PASS {len(checks)} review checks; {out / "comparison.png"}')
|
||||
Reference in new issue
Block a user