
    `'Jjx                        d Z ddl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ej                   dz  Zej$                  dz  Zedz  Zd Zd Zd	 Zd
 Zd Zd0dZd Zd Zd1dZd Zdj?                  g d      Z dj?                  g d      Z!d1dZ"dddddddddddd d!d"d#d$Z#d% Z$d1d&Z%d1d'Z&d(Z'd)Z(d* Z)d+ Z*d, Z+d- Z,d. Z-e.d/k(  r e-        yy)2u  s14 — 블록 도면 → 이미지 생성 실험 (사용자 지시 2026-07-05, v2 피드백 반영):

블록 세트장 v2(코드 렌더 도면+LLM 구조화 정보)를 컨트롤로, **nb2 와 gpt-image-2
각각**에서 ①평면도 ②실사(부감 로케이션 레퍼런스) 생성. "텍스트는 프롬프트에
중요하게 요약" — layout JSON 을 결정론 코드로 요약(IMPORTANT LAYOUT FACTS)해 주입.
컨트롤 이미지는 범례 패널을 잘라낸 캔버스 영역만(의미는 텍스트가 전달).

v2 수정(사용자 피드백):
  1. 평면도가 3D 로 나옴 → **실내 fp 와 같은 순수 2D top-down 도면 스타일**로:
     실제 실내 fp 를 드래프팅 스타일 레퍼런스로 첨부(내용 복사 금지), 3D/축측
     /원근 명시 금지, 높이는 플랫 톤 차이로만.
  2. 건물 창문이 한 줄에 붙어 나옴 → "N identical openings in a row" 문구 제거,
     **층별·간격 분산 계약**(벽 간격 필수, 붙임 금지)으로 교체. 실사도 재생성.
사용: .venv/bin/python s14_blockgen.py [--only crop|images|html]
산출: out/blockset/gen2_{plan,photo}_{gpt,nb2}.png, blockgen.html (v1=이력)
    N)Pathblocksetzblockgen.htmlzblockset_v2_canvas.pngc           
      n   ddl m} t        | d   d         xs d}t        | d   d         xs d}d\  }}|j                  t        dz        }|j                  |d	z
  |d
z   d	z
  t        |||z  z   d	z         t        |d
z   ||z  z   d	z         f      j                  t               t        dt               y)uJ   범례 패널 제거 — 도면 캔버스 영역만 (생성 컨트롤용).r   )Imagecanvaswidth      Y@height)   2   zblockset_v2.png      zcrop ->N)
PILr   floatopenOUTBcropintsave
CANVAS_PNGprint)layoutr   cwchSMimgs          P/Users/manta/Documents/Projects/TheRoad-I1/scratchpad/forest_exp/s14_blockgen.pycrop_canvasr      s    	vh(	)	2UB	vh)	*	3eBDAq
**T--
.CHHa!eQVaZQaZ!^!4!b&26/A%&( ))-j)9	)Z     c                     | d   D ]8  }|d   s	| d   j                  |d         xs g }|s't        |d   d         c S  y)ud   실내 멤버의 fp 1장 — 드래프팅 스타일 레퍼런스 (데이터 규칙: 첫 실내 loc).members	is_indoor	fp_by_locloc_idr   png_pathN)getr   )reconmfpss      r   	indoor_fpr+   +   sU    9~K $$Qx[17RAz*++  r    c                 ,    | |z  }|dk  rdS |dk  rdS dS )NgUUUUUU?r   gUUUUUU?       )vsizets      r   _thirdr3   6   s'    	DAE	16QY6A6r    c                     | d   | d   dk(  rdn| d   dz  z   }| d   | d   dk(  rdn| d   dz  z   }g d	t        ||         }g d
t        ||         }|dk7  s|dk7  r| d| S dS )Nxshapecircler   wr.   yhnorthcentresouthwestr=   eastr=   -)r3   )er   r   cxcynswes          r   
_pos_wordsrH   ;   s    	
3'
h.1AcFQJ	?B	
3'
h.1AcFQJ	?B	%fRn	5B	#F2rN	3B>R8^bT2$<IIr    c                    | d   | d   dk(  rdn| d   dz  z   }| d   | d   dk(  rdn| d   dz  z   }d	}|D ]  }|d
   dk(  s|d   dk(  rdt        ||d   z
        |d   |cxk  xr |d   |d   z   k  nc fdt        ||d   |d   z   z
        |d   |cxk  xr |d   |d   z   k  nc fdt        ||d   z
        |d   |cxk  xr |d   |d   z   k  nc fdt        ||d   |d   z   z
        |d   |cxk  xr |d   |d   z   k  nc fg}|D ]  \  }}}	|	s
|dk  s|	||d   k  s|||f}!  |rd|d    d|d   d    S y	)u_   개구부의 부착 대상 블록+변 (결정론 기하 — 중심에서 가장 가까운 변).r5   r6   r7   r   r8   r.   r9   r:   Nkindneighbor_massr<   r>   r@   rA   g      @zon the z edge of the r-   name_en)abs)
rC   blocksrD   rE   bestbedgessidedistaligneds
             r   _nearest_block_siderU   C   s   	
3'
h.1AcFQJ	?B	
3'
h.1AcFQJ	?BDV9'1W:+A3rAcF{+QsVr-LQsVaf_-LM3rQsVaf_56#"8W#QRSVQW8WX#b1S6k*AcFb,KAcFQsVO,KL#bAcFQsVO45qv7VqvPQRUPV7VWY $)D$43;DLD47Na $)  a	tAwy/A.BCCr    c                 F   | |u s| d   dk(  ry|d   dk(  r,|d   dz  }|d   |z
  |d   |z
  |d   |z   |d   |z   f\  }}}}n#|d   |d   |d   |d   z   |d   |d   z   f\  }}}}| d   |z
  |k  xr1 | d   |z
  |k  xr$ || d   | d   z   |z   k  xr || d   | d   z   |z   k  S )	ub   rect 블록 b 가 요소 e 를 완전 포함하는지 (결정론 기하 — 이름/내용 무관).r6   r7   Fr8   g       @r5   r9   r:   r/   )rP   rC   tolrx0y0x1y1s           r   	_containsr]   W   s   Av7x'zXcFSL3!QsVaZ3!QsVaZGBB333!C&!C&1S6/IBBcFSLB L1S6C<2#5 Lafqvo++L02afqvo6K0KMr    c                 z   |D cg c]  }|d   dk7  rt        ||       r| }}|syt        |d       }| d   | d   dk(  rd	n| d
   dz  z   }| d   | d   dk(  rd	n| d   dz  z   }g dt        ||d   z
  |d            }g dt        ||d   z
  |d
            }|dk7  s|dk7  r| d| nd}	d|d    d|	 dS c c}w )uq  요소를 완전 포함하는 최소 블록 기준의 상대 위치 서술 (결정론 기하).

    캔버스 전역 위치 단어만 전달하면 소속(어느 블록 위인지)이 소실돼 이미지
    모델이 요소를 블록 밖에 그린다(물탱크/평상 옥상 이탈 실증) — 포함 블록이
    있으면 그 블록 기준 서술로 위치를 대체.rJ   rK   Nc                     | d   | d   z  S )Nr8   r:   r/   )rP   s    r   <lambda>z%_containment_phrase.<locals>.<lambda>n   s    3!C&r    keyr5   r6   r7   r   r8   r.   r9   r:   r;   r?   r=   rB   zplaced on the rL   z	, in its z part)r]   minr3   )
rC   rN   rP   candscrD   rE   rF   rG   rels
             r   _containment_phraserg   d   s     B1&	_,1a E BE01A	
3'
h.1AcFQJ	?B	
3'
h.1AcFQJ	?B	%fR!C&[!C&&A	BB	#F2#;#$?	@B.B(NRD",CAiL>3%u==Bs   B8c                  P    	 t        j                  d      S # t        $ r i cY S w xY w)u   사용자 정정 override (plans/blockset_user_overrides.json) — LLM 산출은
    보존하고 프롬프트 조립 시점에만 대체(provenance 명시).blockset_user_overrides)F	load_plan	Exceptionr/   r    r   load_overridesrm   w   s+    {{455 	s    %%c                 Z   t               }t        | d   d         xs d}t        | d   d         xs d}t        | d   d       dj                  fd	t	              D              }| d   D ci c]  }|d
   |d    }}d| dg}| d   D 	cg c]  }	|	d   t
        j                  v s|	 }
}	| d   D ]"  }	t        |	||      }d|j                  |	d
   d       }|	d   dk(  r|	d   dkD  r
d|	d    d}n|	d   dkD  r
d|	d    d}nd}d}|	d   t
        j                  v rt        |	|
      }|rd| nd}| d}|st        |	|
      }|r|}|	d   dk(  rdnd}|r	d|	d    dnd}|	d   }|	d   dk(  r,|j                  d      xs i j                  d      r|d   d   }|j                  d | | d!|	d    d"| | | d#| d$| j                                % |j                  d%       |j                  |j                  d&      xs g        d'j                  |      S c c}w c c}	w )(uT  layout JSON → IMPORTANT LAYOUT FACTS (결정론 요약, 영어).

    ids=False: 마커 토큰 "(A)"/"(1)" 를 전부 제거한 순수 서술 — nb2 가 텍스트
    ID 를 이미지 라벨로 그리는 누출(클린 캔버스 A/B 로 확인) 차단용.
    사용자 override: kind=stair 요소명 대체 + facts_extra 줄 추가.
    r   r   r	   r
   layersc                     | d   S )N
rel_heightr/   )ls    r   r`   zsummary_lines.<locals>.<lambda>   s    <r    ra   z, c           	   3      K   | ]?  \  }}|d     d|d   dd|t              dz
  k(  rdn|dk(  rdnd	t        |      z    d
 A yw)rL   z h=rq   gz (r-   darkestr   lightestzmid )N)lenstr).0irr   lays      r   	<genexpr>z summary_lines.<locals>.<genexpr>   sq      $"DAq Y<.AlOA.ba3s8a<>OdeijdjV`pvy|}~yp  1B  BC  	D"s   AAlayer_idrL   z- height layers, low to high: z. Darker fill = higher.elementsrJ   zheight: ?windowrepeatr-   u    windows for the whole facade — distribute them across the building's storeys with clear wall between each (never fused edge-to-edge, never one tight row)z identical openings z arear6   r7   round(markerz) stair- z [u   ] — z;  uw   - any facade windows sit apart with clear wall between them, aligned to the building's real storeys — never touching.facts_extra
)rm   r   sortedjoin	enumerateS13BLOCK_KINDSrH   r'   POINT_KINDSrU   rg   appendrstripextend)r   idsovr   r   	ramp_noterr   lnamelinesrC   rN   posatrepattachrR   whereinsider6   tagnamer|   s                        @r   summary_linesr      s    
	B	vh(	)	2UB	vh)	*	3eB
!'@
AC		 $cN$ $I 392BC2BQQz]AiL(2BEC-i[8OPQE
+L+AqyCOO/Ka+FLJB#		!J-567V9 Qx[1_(} %K KC x[1_q{m#67CCV9'&q&1D$(r$[bF%u(F3FW:1r%(!H+b!b|V9RVVG_%:$?$?	$Jg;y)Dr#tfBqyk 2"GF8C52$aw@@F	J3  6 
LL O P	LL&,"-99UC DLs   1H#H(,H(c                 8    dj                  d | d   D              S )Nr   c              3   h   K   | ]*  }d |j                  d       d|j                  d        , yw)r   labelz: summaryN)r'   )rz   r)   s     r   r}   zloc_lines.<locals>.<genexpr>   s8      0. !%%.)AEE),<+=>.s   02r"   )r   )r(   s    r   	loc_linesr      s%    99 0#I.0 0 0r    r   )EThe FIRST attached image is a BLOCK SET DIAGRAM of one real property:Hplain blocks, top-down, and the blocks' RELATIVE sizes and positions areCthe layout ground truth. The fill COLOURS encode HEIGHT LAYERS, notzEsurface colours or materials. Circled letters/numbers are annotationsu%   only — never draw them or any text.)r   r   r   zAsurface colours or materials. The output must contain NO text, NOz+letters, NO numbers, NO labels of any kind.c                 ~    dj                  |rt        nt        ddt        | |      ddddddd	d
ddddddddddg      S )Nr   r   =   IMPORTANT LAYOUT FACTS (the diagram's data — obey exactly):r   AThe SECOND attached image is an interior floor plan from the sameuE   production — use it ONLY as the DRAFTING-STYLE reference: same linezCweight, same flat colour-fill language, same simple fixture/openingzAsymbols. NEVER copy its rooms, furniture, numbers or any content.z@Redraw the block diagram as ONE strict TOP-DOWN 2D architecturalzFSITE PLAN in exactly that floor-plan drafting style. Flat orthographicz@plan view only: NO 3D, NO axonometric, NO perspective, NO volumez@shading, no cast shadows. Height layers appear ONLY as flat fillz>tints (slightly darker = higher). Use standard plan symbols byzAelement kind: stair tread lines, door-swing arcs, window ticks onz?wall lines, circles for round fixtures, thin rectangles for lowzCfixtures. Keep every block's position, proportion and opening countz?exactly. Enclosed upper-shell elements stay an outer shell withuE   boundary openings only — never interior rooms or furniture. Neutralz=document: no people, no story props, no vehicles, no text, nozmarkers, no legend.)r   HEAD	HEAD_NOIDr   r   r(   r   s      r   plan_promptr      sc    99BGf#&KOMK
JPJJHKIMIOG)  r    z`building masses: walls as double lines with real thickness, roof edges with parapet coping linesue   enclosed upper-shell units: thick-walled outline with boundary openings only — never interior roomsz6open decks: edge/parapet lines and a flat surface tonezJstairs: individual treads, stringer/railing lines, top and bottom landingsz-doors: leaf + swing arc set in a wall openingz1gates: leaf/swing symbol set in the boundary wallz&windows: frame lines set INTO the wallz7round free-standing fixtures: circle with its base ringz6low rectangular fixtures: outline with slat/edge lineszCsmall equipment units: simple outlined box with support/mount lineszyards: paving jointszalleys: paving jointszroads: kerb lineszboundary walls: double lineszAneighbouring buildings: simplified roof outlines only (secondary))building_massupper_shellterracer   doorgater   fixture_roundfixture_rect	equipmentyardalleyroadwallrK   c                     g }| d   D ]  }|d   |vs|j                  |d            dj                  d |D              S )uW   layout 에 실재하는 kind 만 골라 상세 규칙 나열 (데이터 주도 선택).r   rJ   r   c              3   D   K   | ]  }|t         v rd t         |      yw)r   N)KIND_DETAIL_RULES)rz   ks     r   r}   z$kind_detail_lines.<locals>.<genexpr>  s-      0%Q.. +A./0%s    )r   r   )r   kindsrC   s      r   kind_detail_linesr      sQ    EJV9E!LL6#   99 0% 0 0 0r    c                     dj                  |rt        nt        ddt        | |      ddt	        |      ddddd	dd
dddddt        |       ddddddg      S )ue   v3 상세화 — v5 중립화: 상세 규칙은 kind 스키마 기반, 구체 내용은 데이터만.r   r   r   r   -WHAT THIS PLACE LOOKS LIKE (production data):r   uC   production — match its DRAFTING LANGUAGE and its LEVEL OF DETAIL:zBsame line weights, flat colour fills, detailed plan symbols. Neverz)copy its rooms, furniture or any content.zADraw ONE strict TOP-DOWN 2D architectural SITE PLAN that DEVELOPSz@this block layout into a fully detailed drawing. The blocks giveu@   ONLY each element's position, relative size and count — do NOTzCredraw them as plain empty rectangles. Elaborate every element intozAits real plan representation with believable construction detail,zby element kind:z?Ground every added detail in the production data above; nothingz>story-specific, no movable props, no posted papers or notices.z?Height layers appear only as flat fill tints (darker = higher).zCFlat orthographic plan view: NO 3D, NO axonometric, NO perspective,zCno shadows. No people, no vehicles, no text, no markers, no legend,zno compass.)r   r   r   r   r   r   r   s      r   plan_prompt_detailedr     sx    99BGf#&7%"KML3
KJJMK&!IHIMM/  r    c                     dj                  |rt        nt        ddt        | |      ddt	        |      ddddd	d
ddddddddg      S )Nr   r   r   r   r   z?Render ONE PHOTOREALISTIC bird's-eye location reference of thisz?property from a high oblique angle tilted about 30 degrees fromuA   vertical: translate the height layers into real built volumes —z@ground-level surfaces, building masses with their decks, and thez<topmost enclosed unit standing highest, exactly as the layerz?heights order them. Keep every position, proportion and openingz?count from the diagram exactly; facade windows spread naturallyzCacross the storeys, never one fused row. The diagram's fill coloursuC   are height codes — do NOT copy them as paint or material colours;zBuse aged everyday urban materials grounded in the production data.zAPlain even daylight, completely unpopulated, no movable props, noz?posted papers or notices, no text, letters, circles, markers orz-legend anywhere. Never expose interior rooms.)r   r   r   r   r   r   s      r   photo_promptr   "  sd    99BGf#&7%"IIKJFIIMMLKI7%  r    u   BLOCK SET DIAGRAM (geometry + height control) — block positions/sizes are layout ground truth; fill colours encode height layers as the prompt explains; circled letters/numbers are annotations, never objects — draw none of them and no text at all.u   DRAFTING STYLE REFERENCE (an interior floor plan) — copy ONLY its drawing style: line weight, flat fills, plan symbols. Never its rooms, furniture, numbers or content.c                    t        | |      }t        | |      }t        |      }t        g|r|gng z   }t	        j
                  d||t        dz         t        | |       t	        j
                  d|t        gt        dz         t        | |       t        t        fg|r	t        |fgng z   }t	        j                  d||t        dz         t        | |       t	        j                  d	|t        t        fgt        d
z         t        | |       y )Nblockgen2_plan_gptgen2_plan_gpt.png)refsout_pathblockgen2_photo_gptgen2_photo_gpt.pngblockgen2_plan_nb2gen2_plan_nb2.png)r   blockgen2_photo_nb2gen2_photo_nb2.png)r   r   r+   r   rj   img_gptr   
build_html	NB2_LABELNB2_STYLE_LABELimg_nb2)r   r(   pphpfp	plan_refsnb2_plan_refss          r   imagesr   B  s    	VU	#B	fe	$B	5	B3III"BY113vuII#Rzl224vu,-#%/2	2/MII"B113vuII#R9j*A)B224vur    c                     	 t        j                  d      } 	 t        j                  d      }g d}d}|D ]  \  }}t        |z  }d}| j	                  |      rdt        j                  | |          d}|j                         rE|j                  t         j                        }|dt        j                  |       d	| d
| d| d	z  }|dt        j                  |       d| dz  } d}	|rTdt        j                  |j	                  dd            z   dz   t        j                  |j	                  dd            z   dz   }	d|	z   dz   d| dz   S # t        $ r Y yw xY w# t        $ r d}Y @w xY w)uI   s16 nb2 체인 섹션 — 블록(nb2)→상세 fp(nb2)→실사(gpt/nb2).nb2_chain_promptsr   blocks_llm_promptN))zblocks4_nb2.pngut   A‴ ★★★★블록 최종형 — nb2 (스타일=A형 순수 플랫 + 내용=추출 상대배치 lean 텍스트))zblocks4_gpt.pngu   A‴ 대조 — gpt)zfp2_nb2.pngu=   B′ fp — nb2 (A‴ 참조만 + LLM 설명 + 스타일 ref))zfp2_gpt.pngu   B′ 대조 fp — gpt)zblocks3_nb2.pngu9   (이력) A″ — nb2 (살짝 3D끼 — 사용자 지적))zblocks3_gpt.pngu   (이력) A″ — gpt)zblocks2_nb2.pngu@   (이력) A′ — nb2 (실내 구획 포함돼 사용자 지적))zblocks2_gpt.pngu   (이력) A′ — gpt)zphoto_fromfp3_gpt.pngu?   C″-1 ★★생활감 — gpt i2 (일상 흔적 자유 창작))zphoto_fromfp3_nb2.pngu   C″-2 ★★생활감 — nb2)zphoto_fromfp3_gptsearch.pnguR   C″-3 ★★웹검색 그라운딩 — gpt Responses(web_search+image_generation))znb2_blocks.pnguZ   A. nb2 블록 다이어그램 (코드 대체 — 구조 파악 전용, 텍스트만으로))z
nb2_fp.pngu;   B. nb2 상세 fp (A=참조만 + LLM 설명 + 스타일 ref))zphoto_fromfp2_gpt.pnguI   C-1' ★실사 v2 — gpt (도면=구조만, 실존 지역 전형 재질))zphoto_fromfp2_nb2.pnguI   C-2' ★실사 v2 — nb2 (도면=구조만, 실존 지역 전형 재질))zphoto_fromfp_gpt.pnguL   (이력) C-1 실사 v1 — gpt (도면 회색이 재질로 번역된 버전))zphoto_fromfp_nb2.pngu   (이력) C-2 실사 v1 — nb2@   <details><summary>프롬프트 원문 (실호출)</summary><pre></pre></details><div class='cell'><h4></h4><a href='' target='_blank'><img src=''></a></div>>   </h4><div class='pend'>⏳ 생성 중… (자동 갱신)</div>u_   <div class='notes'><b>A′ LLM 저작 구조도 프롬프트 (한국어 번역 원문):</b><br>	prompt_kou   <br><br><b>근거(notes):</b> notesug   <h2 style='color:#8fd'>★★ nb2 체인 — 블록(nb2 작도)→상세 fp(nb2)→실사(gpt/nb2)</h2>uz  <div class='guide'>사용자 지시: nb2 가 <b>코드 대신</b> 블록 다이어그램을 직접 작도 — 그림 중심 금지, <b>구조·상대 관계 파악 전용</b>(플랫 단색 블록만, 3D/원근/상세 금지). 그걸 <b>참조만</b> 삼아 nb2 가 상세 fp → 그 fp 를 공간 SOT 로 gpt/nb2 실사 (LLM 상세 설명·FACTS·장소 데이터 주입).</div>*<div class='grid' style='margin-top:14px'>)
rj   rk   rl   r   r'   _htmlescapeexistsrelative_toEXP)
promptsblordercellsfntitlepdetrf   bl_htmls
             r   _nb2_chain_sectionr   W  s   ++12[[,-E& E	E2I;;r? <<455EGC88:--&C.u||E/B.C D""%&B3%vV% &E .u||E/B.C DRRUQVV\^ _E  G	t\\"&&b"9:;568=RVVGUWEX8YZ 
 	r
		F	F 7ugV
D	EF]    s"   E E 	EEE.-E.c                   
 	 t        j                  d      }	 t        j                  d      
g d}|st        d |D              syd}|D ]  \  }}t        |z  }d}|j                  |      rdt        j                  ||          d}|j                         rE|j                  t         j                        }|d	t        j                  |       d
| d| d| d	z  }|d	t        j                  |       d| dz  } d}	
r ddj                  
fddD              z   dz   }	d|	z   d| dz   S # t        $ r i }Y %w xY w# t        $ r d
Y !w xY w)ue   s15 fp 재생성 섹션 — 산출/프롬프트/설명은 파일에서 읽음 (순환 import 회피).fp_redo_promptsfp_place_descN))fp_r1_gpt.pngu;   ① 참조 약화 — gpt (블록=참조만, 구도 자유))fp_r1_nb2.pngu   ① 참조 약화 — nb2)fp_r2_gpt.pngu4   ② +LLM 건물 상세 설명(층수 포함) — gpt)fp_r2_nb2.pngu%   ② +LLM 건물 상세 설명 — nb2)fp_r0_gpt.pnguC   ⓪ T2I 단독 — gpt (레이아웃 참조 0, 추출 텍스트만))fp_r0_nb2.pngu   ⓪ T2I 단독 — nb2c              3   P   K   | ]  \  }}t         |z  j                            y wNr   r   )rz   r   _s      r   r}   z#_fp_redo_section.<locals>.<genexpr>  s"     GAr	113s   $&r   r   r   r   r   r   r   r   r   ug   <div class='notes'><b>LLM 건물/도면 상세 설명 (한국어 원문 — ② 주입 내용):</b><br>z<br>c           
   3   z   K   | ]2  \  }}d | dt        j                  j                  |d              4 yw)z<b>z</b> r   N)r   r   r'   )rz   labr   descs      r   r}   z#_fp_redo_section.<locals>.<genexpr>  sA      +O*FC#cU%TXXa_ =>? O*s   8;))u   건물:building_ko)u   상부 유닛/데크:upper_ko)u
   지상부:
grounds_ko)u   도면 요구:plan_ko)u   근거:r   u  <h2 style='color:#8fd'>★ fp 재생성 — ①참조 약화 → ②LLM 상세 설명 → ⓪T2I 단독</h2><div class='guide'>사용자 지시: 블록 도면은 <b>참조만</b>(모사/트레이스 금지, 구도 자유 작도), 건물 층수 구조 등은 <b>LLM 생성 설명</b>이 공급(아래 한국어 원문), ⓪은 레이아웃 참조 이미지 없이 추출 텍스트만으로 자유 작도. 전부 2D fp 도면 언어.</div>r   )rj   rk   rl   anyr   r'   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   rf   	desc_htmlr  s             @r   _fp_redo_sectionr    s   ++/0{{?+E 3GGGE	E2I;;r? <<455EGC88:--&C.u||E/B.C D""%&B3%vV% &E .u||E/B.C DRRUQVV\^ _E  Iukk +O*+ ++  		B 		 C5'P		QRS    s"   D/ E /D>=D>EEc                    t        | |      }t        | |      }d }d }t        d dD              }	 t        j                  d      r|xs t        d dD              }|rdnd	}t        j                  t        j                        }t        |      }	d	}
|	rSt        j                  d
z  |	j                  z  }|j                         r#d|j                  t        j                         d}
d	j                  g d| d| d| d|
 dt                dt        |        d |ddt!        | |d             d |ddt!        | |d             d |ddt        | |d             d |ddt        | |d             d |dd d	       d |d!d"d	       d |d#d$d	       d |d%d&d	       d |d'd(t!        | |d             d |d)d*t!        | |d             d |d+d,|       d |d-d.|       d |d/d0|       d |d1d2|       d |d3d4|       d |d5d6|       d |d7d8t        | |d             d |d9d:t        | |d             d; |d<d=       d |d>d?       d |d@dA       d |dBdC       dD      }t"        j%                  |       t'        dEt"               y # t
        $ r Y yw xY w)FNc           	          t         | z  }dt        j                  |       d}|j                         s	d| d| dS |j	                  t
        j                        }d| d| d| d| d	S )	Nr   r   r   r   r   r   r   r   )r   r   r   r   r   rj   r   )r   r   promptr   r   rf   s         r   cellzbuild_html.<locals>.cell  s    2I||F+,,<>xxz,UG 4PPSuTZ\ ]mmAEE"( 05 <SEuFT 	Ur    c                     t         | z  }|j                         sy|j                  t        j                        }d| d| d| dS )Nr   r   r   r   z'></a></div>)r   r   r   rj   r   )r   r   r   rf   s       r   	hist_cellzbuild_html.<locals>.hist_cell  sO    2IxxzmmAEE"( 05 <SEO 	Pr    c              3   L   K   | ]  }t         |z  j                            y wr  r  rz   fs     r   r}   zbuild_html.<locals>.<genexpr>  s)      4 131D1H$$&& 13   "$)r   r   r   r   r   c              3   L   K   | ]  }t         |z  j                            y wr  r  r  s     r   r}   zbuild_html.<locals>.<genexpr>  s.      D AC1D1H#4#4#66 ACr  )r   r  r  r  r  r  z(<meta http-equiv='refresh' content='30'>r   inputsu{   <div class='cell' style='max-width:420px'><h4>스타일 레퍼런스 (실내 fp — 도면 언어만 복사)</h4><img src='z'></div>z<meta charset='utf-8'>u 	  <title>블록 도면 → 생성 실험 v2</title><style>
body{font-family:sans-serif;background:#171717;color:#eee;margin:24px;max-width:1880px}
h1{font-size:22px} h4{color:#fd9;margin:2px 0 8px}
.grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}
.cell{background:#222;padding:12px;border-radius:10px}
.cell img{width:100%;border-radius:6px}
.ctrl{max-width:700px;border-radius:8px;background:#fff}
.guide{background:#1e2430;padding:12px 16px;border-radius:8px;font-size:13px;line-height:1.7;margin-bottom:14px}
.fixnote{background:#301e1e;border-left:4px solid #a44;padding:10px 14px;font-size:13px;margin-bottom:14px}
.pend{color:#fa5;padding:18px}
pre{white-space:pre-wrap;font-size:11px;color:#9c9;background:#1b1b1b;padding:8px;max-height:340px;overflow:auto}
summary{cursor:pointer;color:#8ac;font-size:12px}
details{margin-top:16px}
.row{display:flex;gap:14px;flex-wrap:wrap} .row .cell{flex:1 1 380px}
</style>
<h1>블록 도면 → nb2 / gpt-image-2 생성 v2 (평면도=실내 fp 스타일 · 실사)</h1>
<div class='fixnote'>사용자 피드백 반영: ①평면도 3D 금지 — <b>실내 fp 와 같은 순수
2D top-down 도면</b>(실제 실내 fp 를 스타일 레퍼런스로 첨부, 내용 복사 금지; 높이는
플랫 톤 차이로만) ②건물 창문 — "한 줄 4개 붙임" 문구 제거, <b>층별 분산+벽 간격 필수
(붙임 금지)</b> 계약으로 교체(실사 포함 전부 재생성) ③블록 그대로 금지 — <b>상세화</b>
(블록=골격만, 실도면 발전) ④★<b>계단 정정</b>: 시나리오 원본 전수 검색 결과 재질 서술
0회("계단" 2회 무재질, 철제/시멘트 0회) — "시멘트 계단"은 요소 추출 단계 발명 명명.
사용자 정정 override 로 <b>철제 외부 증축 계단</b>(오픈 발판·강판 스트링거·파이프 난간
·후대 부착) 적용, supersede 계약으로 loc 데이터의 시멘트 문구 무효화.</div>
<div class='guide'>컨트롤 = 블록 도면 캔버스(범례 제거). 레이어 높이/마커 의미/개수·배치
= <b>IMPORTANT LAYOUT FACTS 결정론 요약</b>으로 프롬프트 주입("색=높이 코드, 원문자=주석").
</div>
<div class='row'>
<details open class='cell' style='flex:2'><summary>컨트롤 이미지 (블록 도면 캔버스)</summary>
<a href='z)' target='_blank'><img class='ctrl' src='z'></a></details>
z
</div>
r   u   
<details><summary style='font-size:16px;color:#fd9'>(이력) v5 이하 — 블록 도면 강결합 시기 산출</summary>
<div class='grid' style='margin-top:14px'>
zgen5_plan_gpt.pnguC   평면도 v5 ★프롬프트 중립화(kind 규칙) — gpt-image-2Tr   zgen5_plan_nb2.pngu?   평면도 v5 ★프롬프트 중립화 — nb2 (클린+ID-free)Fzgen5_photo_gpt.pngu3   실사 v5 ★프롬프트 중립화 — gpt-image-2zgen5_photo_nb2.pngu<   실사 v5 ★프롬프트 중립화 — nb2 (클린+ID-free)zgen4_plan_gpt.pnguX   (이력) v4 계단 정정 — gpt (프롬프트에 요소명 하드코딩 있던 버전)zgen4_photo_gpt.pngu(   (이력) v4 계단 정정 실사 — gptzgen4_plan_nb2.pngu!   (이력) v4 계단 정정 — nb2zgen4_photo_nb2.pngu(   (이력) v4 계단 정정 실사 — nb2zgen3_plan_gpt.pnguH   (이력) 평면도 v3 상세화 — gpt (계단=시멘트 발명 상속)zgen3_plan_nb2.pngu'   (이력) 평면도 v3 상세화 — nb2r   uR   (이력) 평면도 v2 — gpt (블록 그대로 재스타일 — 상세화 지적)r   u   (이력) 평면도 v2 — nb2r   u)   실사 v2 — gpt-image-2 (창문 분산)r   u!   실사 v2 — nb2 (창문 분산)zgen2_plan_nb2_clean.pngud   평면도 v2 — nb2 ★클린 캔버스 A/B (마커=텍스트로만 → 텍스트 ID 누출 확인)zgen2_photo_nb2_clean.pngua   실사 v2 — nb2 ★클린 캔버스 A/B (마커=텍스트로만 → 텍스트 ID 누출 확인)zgen2_plan_nb2_noid.pnguK   평면도 v2 — nb2 ★★클린 캔버스+ID 제거 FACTS (최종 계약)zgen2_photo_nb2_noid.pnguH   실사 v2 — nb2 ★★클린 캔버스+ID 제거 FACTS (최종 계약)u  
</div></details>
<details><summary>(이력) v1 — 평면도가 3D 매싱으로 나옴 + 창문 4개 한 줄 붙음 (사용자 지적으로 재생성)
· nb2 는 마커 누출(평면=텍스트 라벨, 실사=원형 배지)</summary>
<div class='grid' style='margin-top:10px'>
zgen_plan_gpt.pngu.   v1 평면도 gpt (3D 매싱 — 지적 대상)zgen_plan_nb2.pngu-   v1 평면도 nb2 (3D+마커 텍스트 누출)zgen_photo_gpt.pngu    v1 실사 gpt (창 4개 한 줄)zgen_photo_nb2.pngu$   v1 실사 nb2 (마커 배지 누출)uF  
</div></details>
<div class='guide' style='margin-top:14px'>판정 축: 2D 순수 도면 여부(3D 금지), fp 도면
언어 재현, 배치/비율 보존, 창문 분산(붙임 0), 마커/텍스트 누출 0, 실내 미노출.
블록 도면·근거 테이블: <a href='blockset.html' style='color:#8ac'>blockset.html</a></div>
zpage ->)r   r   r  rj   rk   rl   r   r   r   r+   OUTr   r   r   r   r  r   PAGE
write_textr   )r   r(   r   r   r  r  pendrefreshctrl_relr   fp_notemirdocs                r   r   r     sL   	VU	#B	fe	$B	UP  4 13 4 4D;;() D3 D AC D DD
 =A8bG%%aee,H	5	BG	eeh(::<$$'OOAEE$:#;8EGB B$ BWI B .
 B: ;B: =;B: >FJ;B:G;B< 		=B<
=B@  AB@ABB & CBBCBH `bvw}  @E  KO  cP  Q  RIBHRIBJ \^rsy  |A  GL  _M  N  OKBJOKBL QS_`fhmswSxy zMBL{MBN Z\hioqv  }B  ]C  D  EOBNEOBP uwyz {QBP|QBR FK LSBRMSBT >C DUBTEUBV FK LWBVMWBX eg{  }C  EJ  PT  hU  V  WYBXWYBZ DFZ[achnsFtu v[BZw[B\ oqst u]B\v]B^ :B? @_B^A_B` GL MaB`NaBb ?D EcBbFcBd   "H  JL  M  NeBdNeBf    #F  HJ  K  LgBfLgBh  moz  |B  DI  OT  pU  V  WiBhWiBj !kmy  {A  CH  NS  nT  U  VkBjVkBt OP QuBtRuBv NO PwBvQwBx  BC DyBxEyBz  FG H{BzI{BCF 	OOC	)Ta  s   +K
 
	KK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        ||       t	        j                  d	d
|j                  d       y )Nz--onlyall)r*  r   r   html)defaultchoicesblockset_layout_v2)r*  r   )r*  r   )r*  r+  stages14_blockgen)rJ   r/  done)argparseArgumentParseradd_argument
parse_argsrj   
load_reconrk   onlyr   r   r   runlog)apargsr(   r   s       r   mainr;  :  s    		 	 	"BOOHe 6>O ?==?DLLNE[[-.FyyO#Fyy%%vuyyO#65!HHg		JKr    __main__)g      ?)T)/__doc__r2  r+  r   syspathlibr   pathinsertry   __file__parent
forest_librj   s13_blockset_v2r   r   r   r   r!  r   r   r+   r3   rH   rU   r]   rg   rm   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r;  __name__r/   r    r   <module>rG     s^      
  3tH~,,- .  uuzuu,,
	!7
J(
M>&/d0
 yy   II  	6HFG ;?6NL"$*$) 20:.H	O
*9Fx2RjodL  zF r    