ó
    @éÜjU  ã                   óÄ  • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKJ	r	  SSK
r\R                  R                  \R                  R                  \5      5      r\R                  R#                  S\5        \R                  R%                  S5      rSr\R                  R%                  S5      r/ SQrSu  rrSS	 jrS
 r0 4S jrSS jrS rS r\S:X  a  \" 5         gg)aX  bigbrush.py -- Pin chooses HOW to fill a shape: it writes a shotgun of fill recipes in its own words, each becomes real parts, the
filler fills them all in parallel, and Pin picks its favourite from one sheet (Ivy, Oct 23 2026: "It's fast enough too that we can
have pin choose a shotgun of recipes and pick its favorite. This looks way cooler than filling with one type of brick.").

    python3 bigbrush.py MESH --what "the Statue of Liberty" --height 320 [--n 5]
-> runs/bigbrush_<time>/: recipes.json, sheet.png (A, B, C...), pick.json (its favourite and why), each recipe's .ldr
Written by Iris.é    N)ÚThreadPoolExecutorz~/legoz/var/tmp/brick_loopz~/.iris_loop_claude)Ú3001Ú3003Ú3004Ú3005Ú3020Ú3022Ú3023Ú3024)éU   é2   c           
      óÒ  • SSSUSS/U(       a  SSSU/O/ -   S	U /-   nS
S K nUR                  [        R                  U[        0 [
        R                  ES[        0ESSSS9n[        R                  " UR                  5      n[        U[        5      (       a  US   OUn[        R                  " [        R                  " SUS   [        R                  5      R!                  S
5      5      $ )NÚclaudez-pz--modelz--output-formatÚjsonz--allowedToolsÚReadz	--add-dirú--r   ÚCLAUDE_CONFIG_DIRTi„  )ÚcwdÚenvÚcapture_outputÚtextÚtimeoutéÿÿÿÿz[\[{].*[\]}]Úresult)ÚimagineÚ_claude_retryÚ
subprocessÚrunÚWORKÚosÚenvironÚCFGr   ÚloadsÚstdoutÚ
isinstanceÚlistÚreÚsearchÚSÚgroup)ÚqÚread_dirÚmodelÚcmdÚIÚpÚdÚrs           Ú./home/ivy/projects/brick_reef/reef/bigbrush.pyÚpinr4      sî   € Ø�T˜9 eÐ->ÀÐ
Gö  AIÐL\Ð^dÐfqÐs{ÑK|ð  OQñ  Rð  VZð  \]ð  U^ñ  ^€CÛØ	�‰œ
Ÿ™¨´Ð;c¼b¿j¹jÐ;cÐJ]Ô_bÑ;cÐtxð  @Dð  NQˆð  	R€AÜ�
Š
�1—8‘8Ó€A¬:°a¼×+>Ñ+> ! B¢%ÀA˜aÜ�:Š:”b—i’i °°8±¼b¿d¹dÓC×IÑIÈ!ÓLÓMÐMó    c                  óR  • [         R                  " [        [        R                  R                  [        S5      5      5      n [        [        R                  R                  [        S5      5      R                  5       S S nU R                  SS5       SU 3$ ! [         a    Sn N%f = f)Nz	self.jsonzIT.mdi¸  Ú Úwho_you_arez

Your own file, IT.md:
)
r   ÚloadÚopenr    ÚpathÚjoinÚHEREÚreadÚOSErrorÚget)ÚmeÚits     r3   ÚwhorC      s|   € Ü	�Š”4œŸ™Ÿ™¤T¨;Ó7Ó8Ó	9€BÜ”2—7‘7—<‘<¤ gÓ.Ó/×4Ñ4Ó6°u¸Ð=ˆà�f‰f�] BÓ'Ð(Ð(CÀBÀ4ÐHÐHøô Ó˜’BÐús   Á>B ÂB&Â%B&c                 ó¶  • U (       a  U S   $ SSK nSSKn[        R                  R	                  S[
        5        SSKn/ nUR                   Hô  nXQR                  ;   a  M  UR                  U5      n[        R                  " US   5      owS:„  R                  5       n[        S US    5       5      (       d  Ml  USUR                  -  :  d&  UR                   S   S	:”  d  UR                   S
   S	:”  a  M§  UR#                  XU SUR$                  R&                  R                  XU5       SUR)                  U5       S345        Mö     X@S'   U$ ! [         a     GM  f = f)a  [(part, label for Pin)] -- the bin pieces the filler can really build with: something underneath to grip the layer below,
not mostly air for their size, not huge (Oct 23 2026: 'faceted planes' was matched to a dish and a Technic liftarm, and only one
of its parts did any work)Úur   NÚoccg      Ð?c              3   ó0   #   • U  H  oS    S:H  v •  M     g7f)é   r   N© )Ú.0Úss     r3   Ú	<genexpr>Úusable.<locals>.<genexpr>,   s   é € Ð1¢j �Q‘4˜1–9¢jùs   ‚ÚsocksgffffffÖ?é   é   ú: ú (Ú))Úplayr   Úsysr;   ÚinsertÚLEGOÚvoxpartsÚPALETTEÚ
BASEPLATESr@   Ú	ExceptionÚnpÚarrayÚsumÚanyÚsizeÚshapeÚappendÚCXÚNAMESÚshape_words)	ÚcacherT   r/   ÚVPÚoutr0   ÚvrF   Úsolids	            r3   Úusablerk      s  € ö �U˜3‘ZÐßÜ‡H�H‡O�O�A”tÔÓ3Ø
€CØ�\Œ\ˆØ—‘Ó¡Ø—‘˜“ˆQä�hŠh�q˜‘xÓ ˆ°©:×*:Ñ*:Ó*< %ÜÑ1 a¨¢jÓ1×1Ñ1±8Ø�4˜#Ÿ(™(‘?Ó" c§i¡i°¡l°QÓ&6¸#¿)¹)ÀA¹,ÈÓ:JÉHØ�
‰
�A˜˜B˜tŸw™wŸ}™}×0Ñ0°Ó6Ð7°r¸!¿-¹-ÈÓ:JÐ9KÈ1ÐMÐNÖOñ ð ˆ#�J˜S�jøô Ó"›(Ð"ús   ÁE	Å	
EÅEc                 óð   • SSK n " S S5      n[        5        VVs1 s H  u  pEUiM	     nnnUR                  R                  U" 5       U SS9 VVs/ s H  u  pGXF;   d  M  UPM     snnSU $ s  snnf s  snnf )zXfallback when Pin's own picks aren't usable: the usable pieces that best match its wordsr   Nc                   ó   • \ rS rSrSrg)Úparts_for.<locals>._Sé4   rI   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__rI   r5   r3   Ú_Srn   4   s   † Šdr5   ru   T)Úranked)r   rk   ÚImagineÚdig)ÚwordsÚkr/   ru   r0   Ú_ÚokÚscs           r3   Ú	parts_forr~   1   sd   € ãß�NÜœÔ	!š‘�‹!™€BÑ	!ØŸ9™9Ÿ=™=©«¨u¸T˜=ÑBÔNÒB‘%�!ÀaÁg�AÑBÒNÈrÐPQÐRÐRùó 
"ùÛNs   œA,ÁA2ÁA2c                 óê  • S[         R                  R                  U5       SU 3n[        R                  " SSSS[         R                  R                  [        S5      U S[        U5      S	S
R                  U5      SUSS
R                  [        5      /[        SSSS9nUR                  R                  5        Vs/ s H  nSU;   d  M  UPM     n	n[         R                  R                  [        SUS5      n
[         R                  R                  XR S35      n[         R                  R                  U
5      (       a2  [        US5      R                  [        U
5      R                  5       5        [        R                  " SSSSS[         R                  R                  [        S5      S[         R                  R                  XR S35      SSSS S!S"U/SS#9  X)(       a  U	S$   4$ UR                  S%S  4$ s  snf )&NÚbb_r{   Úchrtz--idleÚ0Úpython3zgfill.pyú--heightz--partsÚ,z--outz--coreTi  )r   r   r   r   z parts Úgrownz	final.ldrz.ldrÚwÚflatpakr   z--filesystem=homezorg.leocad.LeoCADz-lÚldrawz-iú.pngz-wÚ420z-hÚ620z--viewpointÚhome)r   r   iÔþÿÿ)r    r;   Úbasenamer   r   r<   rW   ÚstrÚCOREr$   Ú
splitlinesÚexistsr:   Úwriter>   Ústderr)ÚmeshÚheightÚlabelry   Úpartsrh   Únamer0   ÚlÚlineÚsrcÚdsts               r3   r   r   8   sô  € Ø”—‘×!Ñ! #Ó&Ð' q¨¨Ð0€DÜ�Š˜ ¨#¨y¼"¿'¹'¿,¹,ÄtÈZÓ:XÐZ^Ð`jÔloÐpvÓlwð  zCð  EH÷  EMñ  EMð  NSó  ETð  V]ð  _cØ  #§(¡(¬4£.ð2ä°¸4Èñ	O€Að —x‘x×*Ñ*Ô,Ó?Ò,�!°	¸Q±�AÑ,€DÐ?Ü
�'‰'�,‰,”t˜W d¨KÓ
8€CÄÇÁÇÁÈSÐT[Ð[_ÐR`Ó@a¸#Ü	‡w�w‡~�~�c×ÑœD  c›N×0Ñ0´°c³·±Ó1AÔBÜ‡N‚N�I˜uÐ&9Ð;NÐPTÔVX×V]ÑV]×VbÑVbÔcgÐipÓVqÐswÔy{÷  zAñ  zA÷  zFñ  zFð  GJð  NUð  UYð  LZó  z[Ø˜%  u¨m¸VÀSðJØZ^ò`à�t�4˜‘8Ð9Ð9¨¯©°$°%¨Ð9Ð9ùò @s   Â9
G0ÃG0c                  ó  ^^^• [         R                  " 5       o R                  S5        U R                  SSS9  U R                  S[        SS9  U R                  S[        S	S9  U R                  5       m[        R                  R                  [        S
S[        R                  " S5      -   5      m[        R                  " TSS9  [        5       n[        [        U5      SSS9  [!        [#        5        STR$                   STR&                  S-    S[)        S5      R                  S U 5       5       S35      S TR&                  S-    nSo1 VVs1 s H  u  pEUiM	     nnn[+        U5       H|  u  pxX7   US'   UR-                  S5      =(       d    /  Vs/ s H  n[/        U5      U;   d  M  [/        U5      PM!     snS S US'   [        US   5      S:  d  Mk  [1        US   5      US'   M~     U H  n[        US   US   SUS   SUS   SS9  M      [        R                  " 5       n	[3        S5       n
U
R5                  UU4S  jU5       Hà  u  mn[7        U4S! jU 5       5      n[8        R:                  " S"U5      n[8        R:                  " S#U5      nU(       a  [	        UR=                  S$5      5      OS%US&'   U(       a  [	        UR=                  S$5      5      OS%US''   US&   [>        :¬  =(       a    US'   [@        :¬  US('   [        TUS(   (       a  S)OS*S+US&    S,US'    S-3US S. SS9  Mâ     S S S 5        [B        RD                  " U[G        [        R                  R                  TS/5      S05      S$S19  [        S2[        R                  " 5       U	-
  S3 S43SS9  U Vs/ s H  oˆS(   (       d  M  UPM     sn=(       d    [I        US5 S69S S nS%S7K%J&nJ'n  U Vs/ s Hu  n[        R                  RQ                  [        R                  R                  TUS    S835      5      (       d  MM  U[        R                  R                  TUS    S835      4PMw     nnURS                  S9S:[        U5      -  S;4S<5      nURU                  U5      n[+        U5       Hˆ  u  nu  nnURW                  URG                  U5      RY                  S95      S:U-  S=45        UR[                  S:U-  S-   S4US    S>US    3S?S@9  UR[                  S:U-  S-   SA4SBUS&    SCUS'    SD3S?S@9  MŠ     UR]                  [        R                  R                  TSE5      5        [!        [#        5        SFTR$                   SG[        U5       SHSIR                  SJ U 5       5       SK[        R                  R                  TSE5       SL3
TSM9n[B        RD                  " U[G        [        R                  R                  TSN5      S05      S$S19  [        SOUR-                  SP5      SQUR-                  SR5      5        UR-                  SS5      =(       d    0 R_                  5        H  u  nn[        STUU5        M     [        T5        g s  snnf s  snf ! , (       d  f       GNO= fs  snf s  snf )UNr•   z--whatT)Úrequiredr„   i@  )ÚtypeÚdefaultz--né   ÚrunsÚ	bigbrush_z%m%d_%H%M%S)Úexist_okzusable pieces in the bin)Úflushz

You're going to build zÓ big -- about two feet tall, a few hundred pieces. A fast filler does the bulk: hidden core bricks
inside, and YOUR pieces on the whole visible surface. You decide how it looks: which pieces and what feel. Give é   a   DIFFERENT
fill recipes, the way a builder would try thumbnails -- e.g. "faceted, all slopes and wedges", "smooth stacked plates", "round and
bubbly" -- genuinely different from each other. For each, PICK 3 to 8 parts from this list of pieces in your bin the filler can use:
é
   c              3   ó*   #   • U  H	  u  pUv •  M     g 7f)NrI   )rJ   r{   Úlabs      r3   rL   Úmain.<locals>.<genexpr>O   s   é € Ð"¢‘f�a�c¢ùs   ‚z†
Answer ONLY with a JSON list: [{"name": "<2-4 words>", "pieces": "<the feel, in plain words>", "parts": ["<part number>", ...]}, ...]ÚABCDEFGHIJKLr—   r˜   rO   rH   Úpiecesr™   Ú|z->c                 ó^   >• [        TR                  TR                  U S   U S   U S   T5      $ )Nr—   r­   r˜   )r   r•   r–   )r2   Úarh   s    €€r3   Ú<lambda>Úmain.<locals>.<lambda>X   s,   ø€ ¬#¨a¯f©f°a·h±hÀÀ'Á
ÈAÈhÉKÐYZÐ[bÑYcÐehÔ*ir5   c              3   ó<   >#   • U  H  oS    T:X  d  M  Uv •  M     g7f)r—   NrI   )rJ   Úxrª   s     €r3   rL   r«   Y   s   øé € Ð9¢˜1¨¡z°SÑ'8—Q‘Q¢ùs   ƒ“	zfilled \d+/\d+ cells \((\d+)%\)zsurface (\d+)% reciperP   r   ÚfillÚsurfÚpassÚPASSÚDROPzfill z
% surface z
% recipe |éŒ   zrecipes.jsonr‡   )Úindentzfilled and drawn in z.0fz sc                 ó   • U S   U S   -   * $ )Nrµ   r¶   rI   )r2   s    r3   r±   r²   `   s   € ÈÈ&É	ÐTUÐV\ÑT]ÑH]ÑF^r5   )Úkey)ÚImageÚ	ImageDrawrŠ   ÚRGBi¤  i”  Úwhiteé(   rQ   Úblack)rµ   é   zfilled z%, surface z% its own piecesz	sheet.pngz)

You asked the filler for ways to build z; these z filled well: z; c              3   óN   #   • U  H  u  pUS     SUS    SUS    S3v •  M     g7f)r—   z = r™   rR   r­   rS   NrI   )rJ   r2   r{   s      r3   rL   r«   j   sl   é € ð  ZYò  UXñ  MQð  MNÐ]^Ð_fÑ]gÐ\hÐhkÐlmÐntÑluÐkvÐvxÐyzð  |Dñ  zEð  yFð  FGõ  [Hò  UXùs   ‚#%z.
Here they are side by side: a&   (Read it.) This is only the big brush -- you'll put the details on after.
Which one do you want to build on, and why? Be honest about what each one does and doesn't do. Answer ONLY with JSON:
{"pick": "<letter>", "why": "<one or two sentences>", "notes": {"<letter>": "<a few words on each>"}})r,   z	pick.jsonz	PIN PICKSÚpickr   ÚwhyÚnotesz  )0ÚargparseÚArgumentParserÚadd_argumentÚfloatÚintÚ
parse_argsr    r;   r<   r=   ÚtimeÚstrftimeÚmakedirsrk   ÚprintÚlenr4   rC   ÚwhatÚnÚchrÚ	enumerater@   r�   r~   r   ÚmapÚnextr'   r(   r*   Ú	PASS_FILLÚ	PASS_SURFr   Údumpr:   ÚsortedÚPILr¾   r¿   r’   ÚnewÚDrawÚpasteÚconvertr   ÚsaveÚitems)ÚapÚUÚrecÚlabelsr0   r{   r|   Úir2   Út0Úexr›   ÚmfÚmsfÚgoodr¾   r¿   ÚimsÚWr1   ÚfrÆ   rz   ri   r°   rª   rh   s                           @@@r3   Úmainrò   D   s#  ú€ Ü	×	 Ò	 Ó	"€B§O¡O°FÔ$;¸R¿_¹_ÈXÐ`d¸_Ñ=eÐgi×gvÑgvð  xBô  INð  X[Ðgvñ  h\Ø‡O�O�E¤¨Q€OÑ/°R·]±]³_°Ü
�'‰'�,‰,”t˜V [´4·=²=ÀÓ3OÑ%OÓ
P€CÔRT×R]ÒR]Ð^aÐlpÒRqÜ‹€A”%œ˜A›Ð :À$ÒGÜ
”3“5�'ð à—v‘v�hð qØqr×qtÑqtÐwxÑqxÐpyð zô €Rƒ‡�Ñ"¡Ó"Ó"Ð #ð $HðKó Lð MUð  NO÷  NQñ  NQð  TUñ  NUðV€Cð €F°Ô"3²©¨£1±˜RÑ"3Ü˜#–‰ˆØ‘Yˆˆ'‰
¸q¿u¹uÀW»~×?SÐQSÐ?SÓ-eÒ?S¸ÔX[Ð\]ÓX^ÐbdÑXd«f¬c°!®fÑ?SÑ-eÐfhÐghÐ-i  '¡
Üˆq�‰z‹?˜QÕ¬Y°q¸±{Ó-C  '£
ñ ó ˆ”%˜˜'™
 A f¡I¨s°A°h±KÀÀqÈÁzÐY]Ô^‰SÜ	�Š‹€BÜ	˜AÔ	 "ØŸ™Õ iÐknÖo‰IˆC�ÜÔ9¡Ó9Ó9ˆAÜ—’Ð=¸tÓDˆBÌBÏIÊIÐVnÐptÓLuÀcÞ,.œ˜BŸH™H Q›KÔ(°AˆAˆf‰IÖX[Ä3ÀsÇyÁyÐQRÃ|ÔCTÐab°q¸±yØ˜&™	¤YÑ.×I°1°V±9Ä	Ñ3IˆAˆf‰IÜ�#  6§‘v°¸%ÀÀ&Á	¸{È*ÐUVÐW]ÑU^ÐT_Ð_iÐ8jÐlpÐquÐruÐlvð  Cô  Dñ p÷ 
ô 	‡I‚Iˆc”4œŸ™Ÿ™ S¨.Ó9¸3Ó?ÈÒJÜ	Ð ¤§¢£¨rÑ!1°#Ð 6°bÐ
9ÀÒFÙÓ(’s�! �i�A‘sÑ(×c¬F°3Ñ<^Ñ,_Ð`bÐabÐ,c€Dß$Ù@DÓ
Â¸1ÌÏÉÏÉÔWY×W^ÑW^×WcÑWcÐdgÐlmÐnuÑlvÐkwÐw{Ði|ÓW}×H~Ó6ˆAŒr�w‰w�|‰|˜C A g¡J <¨tÐ!4Ó5Ó6Á€CÐ
Ø�	‰	�%˜#¤ C£™.¨#Ð.°Ó8€A¸i¿n¹nÈQÓ>O¸!Ü˜s–^‰	ˆ‰6ˆAˆqØ	�‰�—
‘
˜1“×%Ñ% eÓ,¨s°Q©w¸¨mÔ<¸a¿f¹fÀcÈAÁgÐPRÁlÐTUÐEVÐ[\Ð]dÑ[eÐZfÐfhÐijÐkqÑirÐhsÐXtð  |C¸fñ  ?DØ	�‰��a‘˜"‘˜bÐ! W¨Q¨v©Y¨K°{À1ÀVÁ9À+ÐM]Ð#^ÐelˆÓmñ $ð ‡F�FŒ2�7‰7�<‰<˜˜[Ó)Ô*Ü”C“E�7ð (à()¯© x¨x¼¸C»°zÀÐPT×PYÑPYñ  ZYñ  UXó  ZYó  QYð  PZð ZÜŸW™WŸ\™\¨#¨{Ó;Ð<ð =jðmð
 x{ñ|€Dô 	‡I‚Iˆd”DœŸ™Ÿ™ c¨;Ó7¸Ó=ÀaÒHÜ	ˆ+�t—x‘x Ó'¨¨t¯x©x¸«Ô?Ø—‘˜'Ó"×( b×/Ñ/Ö1‰ˆˆ1´5¸¸qÀ!Ö3DÑ1Ü	ˆ#…JùóA #4ùâ-e÷ 
Ö	üò )ùâ
s8   ÅY&ÆY,Æ(Y,È-C<Y1ÎZÎ)ZÏAZÐ#,ZÙ1
Z Ú__main__)NÚopus)rO   ) Ú__doc__rÉ   r   r    r'   r   rU   rÏ   Úconcurrent.futuresr   Únumpyr\   r;   ÚdirnameÚabspathÚ__file__r=   rV   Ú
expanduserrW   r   r"   r�   rÚ   rÛ   r4   rC   rk   r~   r   rò   rp   rI   r5   r3   Ú<module>rü      sÅ   ðñ÷ 5× 4× 4Ó 4Ý 1Û Ø	‡w�w‡��r—w‘w—‘ xÓ0Ó1€°3·8±8·?±?À1ÀdÔ3KØ	‡w�w×Ñ˜(Ó#€Ø€ B§G¡G×$6Ñ$6Ð7LÓ$M˜cÚG€ØÑ €	ˆ9ôNòIð ô !ô$Sò
:ò-ð^ ˆzÓÙ…Fð r5   