
    X<Jj                     2   d Z ddlZddlZddlmZ ej
                  j                  d e ee      j                               ddl
ZddlZddlZddlZddlZej(                  dz  Zdj-                  g d      Zd Zd Zd	 Zd
 Zd Zd Zedk(  r e        yy)uI  s18 — A‴ 블록 다이어그램 최종형 (사용자 확정 조합, 2026-07-05):

  - **스타일 = s16 A 형** (코드 렌더 같은 순수 플랫 블록) + 잔여 3D 완전 금지
    (베벨/가장자리 하이라이트/그라데이션/입체감 0) + 라벨 텍스트 0.
  - **내용 = LLM 추출 구조 데이터의 lean 전달**: layout JSON 에서 상대 위치·
    크기·중요 배치만 결정론 변환(이름+모양+크기어+위치어+부착변+연결) —
    [kind] 괄호/마커 토큰/높이 이론 등 라벨 유발 요소 제거. 높이는 톤 규칙 1줄.
  - 그 A‴ 를 참조로 **fp(B′)** 생성 (확립된 2단계 fp 계약 재사용).
사용: .venv/bin/python s18_blocks_lean.py [--only blocks|fp|html]
산출: out/blockset/blocks4_{nb2,gpt}.png, out/blockset/fp2_{nb2,gpt}.png,
      blockgen.html 갱신
    N)Pathblockset
)
uI   Draw ONE SCHEMATIC BLOCK DIAGRAM of a real property's layout — the kindzBof flat figure a computer program draws: strict TOP-DOWN 2D, plainzHsolid-colour rectangles and circles on a plain light background, uniformzFthin dark outlines. ABSOLUTELY FLAT: no bevels, no edge highlights, nozDgradients, no shadows, no shading, no texture, no perspective, no 3DuJ   feel of any kind — every block is one uniform colour region with a plainzFoutline. PURPOSE: structural comprehension only. Every building is ONEuC   solid block — never any interior rooms, inner walls or furniture.zGNo text, letters, numbers, labels, markers, legend or compass anywhere.z!No people, no props, no vehicles.c           	          | d   | d   z  ||z  z  dz  }t        | d   | d         t        dt        | d   | d               z  }|dk\  ry|dk\  ry|dk\  ry	|d
k\  ryy)Nwh      Y@gMbP?   z
thin strip   largemedium   smalltiny)maxmin)ecwchareaaspects        S/Users/manta/Documents/Projects/TheRoad-I1/scratchpad/forest_exp/s18_blocks_lean.py
_size_wordr   (   s{    cFQsVOR(50D33 3uc!C&!C&.A#BBF{rzqyqy    c                     t        | d   d         xs d}t        | d   d         xs d}| d   D cg c]  }|d   t        j                  v s| }}g }| d   D ]  }|d   dk(  rd	nd
}t        j                  |||      }t        |||      }d}	|d   t        j                  v rt        j                  ||      }
|
rd|
 }	|d   dk(  rd}	|d   dk(  rd}	|j                  dd      dkD  r	d|d    dnd}| d}|	st        j                  ||      }|r|}|j                  d|d    d| d| d| |	 | 
        t        | d   d       }dj                  d |D              }|j                  d | d!       d"j                  |      S c c}w )#u\   layout JSON → 상대 위치·크기·중요 배치만 (라벨 유발 토큰 0, 결정론).canvaswidthr	   heightelementskindshapecircleroundrectangular z, stairz2, connecting the ground level up to the deck levelneighbor_massz, plain simplified blockrepeatr   z (z
 in a row)z areaz- name_enz:  z block, layersc                     | d   S )N
rel_height )ls    r   <lambda>z&lean_structure_lines.<locals>.<lambda>Q   s    <r   )keyz -> c              3   &   K   | ]	  }|d      yw)r)   Nr.   ).0r/   s     r   	<genexpr>z'lean_structure_lines.<locals>.<genexpr>R   s     1Sq|Ss   zE- one flat tint rule only, to tell height levels apart, low to high: z (darker = higher)r   )floatS13BLOCK_KINDSS14
_pos_wordsr   POINT_KINDS_nearest_block_sideget_containment_phraseappendsortedjoin)layoutr   r   r   blockslinesr!   possizeextrasiderepwhereinsidelaytints                   r   lean_structure_linesrM   6   s   	vh(	)	2UB	vh)	*	3eB
+L+AqyCOO/Ka+FLEJW:1}nnQB'!R$V9'**1f5DTFV9HEV9'.E./eeHa.@1.D1X;-z*"%u,,Q7Fr!I,r$qxwwse% 	&'  * !'@
AC;;1S11D	LL ""&'9; <99U7 Ms   FFc                 ,    t         dz   t        |       z   S )Nz:

STRUCTURE (relative positions, sizes, key arrangement):
)
STYLE_FLATrM   )rA   s    r   blocks_promptrP   X   s     MN"6*+ ,r   c                    t        |       }	 t        j                  d      }||d<   ||d<   t        j                  d|       t        j
                  d|g t        dz         t        j                  | |       t        j                  d|d t        dz         t        j                  | |       y # t        $ r i }Y w xY w)Nnb2_chain_promptsblocks4_nb2.pngzblocks4_gpt.pngs18_blocks4_nb2out_paths18_blocks4_gptrefsrV   )
rP   F	load_plan	Exception	save_planimg_nb2OUTBr8   
build_htmlimg_gpt)rA   reconppromptss       r   
run_blocksre   ^   s    fA++12 "#G!"GKK#W-IIB8I1IJNN65!II//1NN65!  s   B/ /B=<B=c                 |   t        j                  d      }t        j                  |      }t	        j
                  | ||      }	 t        j                  d      }||d<   ||d<   t        j                  d|       t        dz  }t        j                  |fg}|r!|j                  t        j                  |f       t        j                  d||t        dz         t        j                  | |       t        j                  d||g|r|gng z   t        dz  	       t        j                  | |       y # t        $ r i }Y w xY w)
Nfp_place_descrR   zfp2_nb2.pngzfp2_gpt.pngrS   s18_fp2_nb2rU   s18_fp2_gptrX   )rZ   r[   r8   	indoor_fpS16	fp_promptr\   r]   r_   NB2_FP_BLOCKS_LABELr>   NB2_STYLE_LABELr^   r`   ra   )rA   rb   descfp_stylerc   rd   rB   refs_nb2s           r   run_fprr   n   s   ;;'D}}U#HfeT*A++12 GMGMKK#W-%%F((&12H,,h78IImQ4-3GHNN65!IImQ8Xz2>m+- NN65!  s   D- -D;:D;c                     t        j                         } | j                  ddg d       | j                         }t	        j
                         }t	        j                  d      }|j                  dv rt        ||       |j                  dv rt        ||       |j                  dv rt        j                  ||       t	        j                  d	d
|j                  d       y )Nz--onlyall)rt   rB   fphtml)defaultchoicesblockset_layout_v2)rt   rB   )rt   ru   )rt   rv   stages18_blocks_lean)r    rz   done)argparseArgumentParseradd_argument
parse_argsrZ   
load_reconr[   onlyre   rr   r8   r`   runlog)apargsrb   rA   s       r   mainr      s    		 	 	"BOOHe;  ===?DLLNE[[-.Fyy%%65!yyM!vuyyO#vu%HHg(9499MNr   __main__)__doc__r}   syspathlibr   pathinsertstr__file__parent
forest_librZ   s13_blockset_v2r6   s14_blockgenr8   s15_fp_redoS15s16_nb2_chainrk   OUTr_   r@   rO   r   rM   rP   re   rr   r   __name__r.   r   r   <module>r      s     
  3tH~,,- .     uuzYY  
D," ".O  zF r   