ó
    ççÜjq"  ã                   óž  • 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r	SSK
Jr  SSKJr  \R                  R                  \R                  R!                  \5      5      r\R                  R'                  S\5        \R                  R)                  S5      r/ SQrSSS	S
.rS rSS jrSS jrS rS rS rS rS r\ S:X  a  \" 5         gg)a*  crew.py -- the demolition crew: after the big brush fills a shape, a few critics with ONE taste each look at it and mark the sections
that should come out, the crew tears them out (and anything left hanging), and Pin gets the gaps (Ivy, Oct 23 2026: "Could have a demo
crew that has taste about what isn't working, what doesn't read, what's boring and repetitive. It colors inside the lines. Then erases,
then fills in with pin.").

Sections are clusters of pieces (k-means on where they sit), each painted one loud colour on a MAP render beside the real one, so a
critic can name a section by its colour. A section comes out when two critics vote for it, or one critic and nobody's build would miss it
(it is under a tenth of the pieces). Erasing a middle leaves the top floating, so after the votes everything with no stud-and-socket
path down to the bottom layer comes out too.

    python3 crew.py BUILD.ldr --what "the Statue of Liberty" [--k 8]
-> runs/crew_<time>/: map.png (real | sections, front and side), votes.json, erased.ldr, after.png
Written by Iris.é    N)Úkmeans2)ÚcKDTreez~/lego)
)Úredé   )Úblueé   )Úyellowé   )Úgreené   )Úorangeé   )Úwhiteé   )Úmagentaé   )zmedium azureiB  )Úlimeé   )zreddish brownéF   záYou only care whether it READS as {what}. Walk round it in your head: which sections make it look like something else, or like nothing -- a blob, a column, a heap? A section that reads as the right thing stays, however rough.zÏYou only care about BORING AND REPETITIVE. Which sections are the same piece over and over in a flat run, with no change of shape, rhythm or direction -- filler that a builder would have done something with?zèYou only care whether it's WORKING as a build: ragged or thin stacks, bits sticking out at random, a section that looks loose, collapsed or unfinished. Not whether it's pretty -- whether it holds together and looks built on purpose.)ÚreadsÚboringÚworkingc           	      óê  • / n[        U 5       H×  nUR                  5       n[        U5      S:  d	  US   S:w  a  M-  [        R                  " S5      oCSS  Vs/ s H  n[        U5      PM     snUSS2S4'   [        R                  " USS	  Vs/ s H  n[        U5      PM     sn5      R                  SS5      USS2SS24'   UR                  [        US
   5      XCS	   U45        MÙ     U$ s  snf s  snf )z9[(colour, M 4x4 in LDraw units, name, line)] from an .ldrr   r   Ú1r   r   é   Né   r
   r   )
ÚopenÚsplitÚlenÚnpÚeyeÚfloatÚarrayÚreshapeÚappendÚint)ÚldrÚoutÚlineÚfÚMÚvs         Ú*/home/ivy/projects/brick_reef/reef/crew.pyÚpartsr.   $   sè   € à
€CÜ�S–	ˆØ�J‰J‹LˆÜˆq‹6�B‹;˜!˜A™$ #›+¡xÜ�FŠF�1‹Iˆ°q¸±VÓ"<²V°¤5¨¦8±VÑ"<�q˜˜!˜˜Q˜‘xÌ"Ï(Ê(ÐfgÐhiÐjlÑfmÓSnÒfmÐabÔTYÐZ[ÖT\ÑfmÑSnÓJo×JwÑJwÐxyÐ{|ÓJ}¸aÀÀÀÀBÀQÀBÀ¹iØ�
‰
”C˜˜!™“I˜q B¡%¨Ð.Ö/ñ	 ð
 €Jùò #=ùÒSns   ÁC+ÂC0
c                 óÔ  • [        U S5       nUR                  S[        R                  R	                  U 5       S35        [        U5       H�  u  nu  pVpxUb  X$   OUnUR                  SU S3SR                  S US S2S4    5       5      -   S-   SR                  S US S2S S24   R                  5        5       5      -   SU S3-   5        Mƒ     S S S 5        g ! , (       d  f       g = f)	NÚwz0 Ú
z1 Ú c              3   ó(   #   • U  H  oS  v •  M
     g7f)z.3fN© ©Ú.0r,   s     r-   Ú	<genexpr>Úwrite.<locals>.<genexpr>3   s   é € Ð)Gºh¸¨s¨G¬*ºhùó   ‚r   c              3   ó(   #   • U  H  oS  v •  M
     g7f)z.4fNr4   r5   s     r-   r7   r8   3   s   é € ÐXÒm~ÐhiÐ^aÐ[bÔYcÒm~ùr9   )r   ÚwriteÚosÚpathÚbasenameÚ	enumerateÚjoinÚravel)	r=   ÚpsÚcoloursÚfhÚiÚcr+   ÚnÚ_s	            r-   r;   r;   .   sþ   € Ü	ˆd�CŒ˜BØ
�‰�2”b—g‘g×&Ñ& tÓ,Ð-¨RÐ0Ô1Ü(¨ž}‰OˆA‰|��aØ%Ñ1�’
°qˆAØ�H‰H�r˜!˜˜A�Y §¡Ñ)G¸aÀÀÀÀAÀºhÓ)GÓ!GÑGÈ#ÑMÐPS×PXÑPXÑXÐmnÐoqÐpqÐoqÐsuÐtuÐsuÐouÑmv×m|Ñm|Ôm~ÓXÓPÑð  EFð  GHð  FIð  IKð  CLñ  Lö  Mñ  -÷ 
�Žús   �CCÃ
C'c                 ó´   • [         R                  " SSSSS[        R                  R	                  [
        S5      SUS[        U5      S	[        U5      S
X /SSS9  g )NÚflatpakÚrunz--filesystem=homezorg.leocad.LeoCADz-lÚldrawz-iz-wz-hz--viewpointTi,  )Úcapture_outputÚtimeout)Ú
subprocessrK   r<   r=   r@   ÚLEGOÚstr)r'   ÚpngÚviewr0   Úhs        r-   ÚrenderrU   5   s[   € Ü‡N‚N�I˜uÐ&9Ð;NÐPTÔVX×V]ÑV]×VbÑVbÔcgÐipÓVqÐswÐy|Øœ#˜a›& $¬¨A«°¸tðJØZ^Ðhkómó    c                 ó8  • SSK nSSKnUR                  U 5      o3R                  5       n[	        U5       VVVs/ s H.  u  pVUR
                    H  ouUR                  US   5      4PM     M0     nnnn[	        U5       VVV	s/ s H.  u  pVUR                    H  o•UR                  U	S   5      4PM     M0     n
nnn	[        [        U5      5       Vs0 s H  oU[        5       _M     nnU(       a”  U
(       a�  [        [        R                  " U VVs/ s H  u  pÍUPM	     snn5      5      nU
 HS  u  pýUR                  US5       H8  nUU   S   nX_:w  d  M  Xµ   R                  U5        X¿   R                  U5        M:     MU     XK4$ s  snnnf s  sn	nnf s  snf s  snnf )zswhich pieces are joined (a stud in a socket), from the game's own parts: {i: set(j)} and each piece's bottom z (mm)r   NrF   g333333ã?)ÚfitsÚplayÚ
load_boardÚbodiesr?   ÚstudsÚworldÚsocketsÚranger   Úsetr   r    r#   Úquery_ball_pointÚadd)r'   rX   rY   ÚrÚbsrE   ÚbÚtÚSÚkÚKÚnbrH   ÚpÚtsÚjÚqs                    r-   Úgraphro   9   s5  € çØ�‰˜Ó€A§8¡8£:˜bÜ*3°B¬-ÕIª-¡$ !ÀÇÅ¸AˆQ�W‰W�Q�s‘V‹_Ó	ÁÑ	©-€AÒIÜ*3°B¬-ÕKª-¡$ !ÀÇÅ¸AˆQ�W‰W�Q�s‘V‹_Ó	ÁÑ	©-€AÒKÜ!¤# b£'œNÓ	+šN�qŒS‹UŠ(™N€BÐ	+ÞŽQÜ”R—X’X©QÔ/ªQ¡T Q›q©QÒ/Ó0Ó1ˆÛ‰DˆAØ×(Ñ(¨¨CÖ0�Ø�a‘D˜‘G�Ø•6˜2™5Ÿ9™9 Qœ<¨©¯©°1®ó 1ñ ð ˆ6€Mùô 	JùÜKùÚ	+ùã/s   ¸5FÂ 5F
ÃFÄFc                 óÊ   • [         R                  " U  Vs/ s H'  o"R                  R                  R	                  S5      PM)     sn5      nU/ SQ-  n[        X1SSS9u  pEU$ s  snf )Nr   )ç       @rq   g333333#@r   z++)ÚseedÚminit)r    r#   ÚmeshÚverticesÚmeanr   )rd   rh   re   ÚXrH   Úlabs         r-   Úsectionsry   H   sT   € Ü
�Š±2Ó6²2¨a—&‘&—/‘/×&Ñ& qÖ)±2Ñ6Ó7€AØ	ŠOÑ€AÜ�Q ¨Ñ.�F€AØ€Jùò 7s   •.A c                 óN  • SSK JnJn  XX44 Vs/ s H"  o†R                  U5      R	                  S5      PM$     n	nU	S   R
                  u  p«UR                  SU
S-  US-   4S5      oÇR                  U5      n[        [        U	/ SQ5      5       H7  u  nu  nnUR                  XúU-  S45        UR                  X®-  S	-   S
4USS9  M9     UR                  S	US-   4SSR                  U5      -   SS9  [        R                  R                  U S5      oŒR                  U5        U$ s  snf )Nr   )ÚImageÚ	ImageDrawÚRGBr   é<   r   )zthe build, frontzits sections, frontzthe build, sidezits sections, sideé   é
   é   Úblack)Úfillé&   z
sections: ú, zmap.png)ÚPILr{   r|   r   ÚconvertÚsizeÚnewÚDrawr?   ÚzipÚpasteÚtextr@   r<   r=   Úsave)r(   Úreal_fÚmap_fÚreal_sÚmap_sÚusedr{   r|   rk   ÚimsÚWÚHrg   ÚdrE   ÚimÚcaps                    r-   Úsheetrš   N   s  € ß$Ø28ÀÑ1OÓ
PÒ1O¨A�:‰:�a‹=× Ñ  Ö'Ñ1O€CÐ
PØˆq‰6�;‰;�D€A˜EŸI™I e¨a°!©e°Q¸±V¨_¸gÓF˜ÏNÉNÐ[\ÓL]ÈÜ!¤# cÒ+ó  #Aö  B‰ˆ‰9ˆB�Ø	�‰�˜‘U˜B�KÔ  !§&¡&¨!©%°"©*°a¨¸#ÀG &Ó"Lñ Bà‡F�FˆB��B‘ˆ<˜¨¯	©	°$«Ñ7¸g€FÑFÜ
�‰�‰�S˜)Ó$€A§f¡f¨Q¤i¸°ùò Qs   �)D"c                 óÊ  • SS K nSU SSR                  U5       S3[        U    R                  US9-   S-   nS Hó  n UR	                  XR/S	US
9u  px[
        R                  " [        R                  " SU[        R                  5      R                  S5      5      n	U	R                  S0 5      U	R                  S5      =(       d    /  V
s/ s HD  oªR                  5       R                  5       U;   d  M&  U
R                  5       R                  5       PMF     sn
S S U	R                  SS5      US.s  $    / S[        W5      S S  S3S.$ s  sn
f ! [         a  nUn S nAGM$  S nAff = f)Nr   zThis is a big Lego build of zä, filled fast by a machine; a builder will rebuild whatever you tear out, by hand. Left pair: the build and the same build with each SECTION painted one colour (front view). Right pair: the same from the side. The sections are: r…   z.

)ÚwhataU  

First say where each section is and what it shows (the first critic swore the bottom of the robe was the upper body). Then tear out at most three sections, or none if nothing fails your test. Answer ONLY with JSON: {"where": {"<colour>": "<where it is, what it shows>", ...}, "tear_out": ["<section colour>", ...], "why": "<one sentence>"})ÚgeminiÚhaikui„  )Úpreferz\{.*\}ÚwhereÚtear_outr   ÚwhyÚ )r    r¡   r¢   Úbyz(no answer: éP   Ú))r¡   r¢   )Úimaginer@   ÚTASTESÚformatÚ	small_askÚjsonÚloadsÚreÚsearchrg   ÚgroupÚgetÚlowerÚstripÚ	ExceptionrQ   )Útasterœ   Úimgr“   ÚIrn   rŸ   rf   rH   r—   rF   ÚeÚlasts                r-   Úcriticr¹   W   s‚  € ÛØ'¨ vð .à"Ÿi™i¨›oÐ.¨eð
5ä7=¸e±}×7KÑ7KÐQUÐ7KÐ7Vñ
Wð
Hñ
H€Aó &ˆð	(Ø—;‘;˜q %¨°V�;Ð<‰DˆAÜ—
’
œ2Ÿ9š9 Y°´2·4±4Ó8×>Ñ>¸qÓAÓBˆAØŸU™U 7¨BÓ/ÐYZ×Y^ÑY^Ð_iÓYj×YpÐnpÐYpó  >OÒYpÐTU×t{Ñt{Ót}÷  uDñ  uDó  uFð  JNñ  uNÓ>O¸a¿g¹g»i¿o¹oÖ>OÑYpñ  >Oð  PRð  QRð  >SØŸ5™5 ¨Ó+°6ñ;ò ;ñ	 &ð  \´#°d³)¸C¸R°.Ð1AÀÐ#CÑDÐDùò >OøäÓ' aŸtûÐ'ús0   ½B
E
Ã%EÃ0"EÄE
ÅE
Å

E"ÅEÅE"c                  ó€  ^• [         R                  " 5       o R                  S5        U R                  SSS9  U R                  S[        SS9  U R                  S5        U R	                  5       nUR
                  =(       d<    [        R                  R                  [        S	S
[        R                  " S5      -   5      n[        R                  " USS9  [        UR                  5      n[        UR                  5      u  pE[!        U5      [!        U5      :X  d   [!        U5      [!        U5      45       e[#        U[%        UR&                  [!        [(        5      5      5      n[+        [-        U5      5      ow Vs/ s H  n[(        U   S   PM     n	n[        R                  R                  US5      n
[/        X£5        [        R                  R                  US5      n[/        X³U Vs/ s H  n[(        U   S   PM     sn5        U
S4US4U
S4US44 H  u  pÞ[1        XÝS S SU S3-   U5        M     [3        X*S S S-   US S S-   U
S S S-   US S S-   U	5      n[4         Vs0 s H  nU[7        UUR8                  Xù5      _M     nnUR;                  5        H(  u  nn[=        US SUS   =(       d    S SUS    3SS9  M*     U	 V^s0 s H'  mT[?        U4S jURA                  5        5       5      _M)     nnU Vs0 s H)  n[(        U   S   [        Xh:H  R?                  5       5      _M+     nnU	 Vs/ s H0  nUU   S :¼  d"  UU   S:X  d  M  UU   S![!        U5      -  :  d  M.  UPM2     nn[C        U5       VVs1 s H  u  pŒ[(        U   S   U;   d  M  UiM     nnn[D        RF                  " U Vs/ s H  nURH                  RJ                  S   S    PM!     sn5      n[M        [!        U5      5       Vs1 s H)  nUU   UR%                  5       S"-   :  d  M  UU;  d  M'  UiM+     nn[-        U5      [O        U5      nnU(       aK  UURQ                  5          U-
  U-
   H%  nURS                  U5        URU                  U5        M'     U(       a  MK  [-        [M        [!        U5      5      5      U-
  U-
  n[C        U5       VVs/ s H  u  nnUU;   d  M  UPM     nnn[/        [        R                  R                  US#5      U5        [1        [        R                  R                  US#5      [        R                  R                  US$5      5        [V        RX                  " UR8                  UR                  UUU[!        U5      [!        U5      [!        U5      [!        U5      S%.	[[        [        R                  R                  US&5      S'5      SS(9  [=        S)U=(       d    S S[!        U5       S*[!        U5       S+[!        U5       S,[!        U5       S-U 35        g s  snf s  snf s  snf s  snf s  snf s  snf s  snnf s  snf s  snf s  snnf ).Nr'   z--whatT)Úrequiredz--kr�   )ÚtypeÚdefaultz--outÚrunsÚcrew_z%m%d_%H%M%S)Úexist_okr   z
before.ldrzsections.ldrr   ÚfrontÚrightéüÿÿÿrH   z.pngz
_front.pngz
_right.pngÚ8sz tears out r¡   Únothingz -- r¢   )Úflushc              3   ó4   >#   • U  H  nTUS    ;   v •  M     g7f)r¡   Nr4   )r6   r,   rF   s     €r-   r7   Úmain.<locals>.<genexpr>w   s   øé € Ð;ªN q��Q�z‘]Ö"ªNùs   ƒr   gš™™™™™¹?g      à?z
erased.ldrz	after.png)	rœ   Úfromry   ÚvotesÚtorn_outÚpiecesÚ	voted_outÚhangingÚleftz
votes.jsonr0   )Úindentz
torn out: z voted, z left hanging, Ú/z pieces stay -> ).ÚargparseÚArgumentParserÚadd_argumentr&   Ú
parse_argsr(   r<   r=   r@   ÚHEREÚtimeÚstrftimeÚmakedirsr.   r'   ro   r   ry   Úminrh   ÚMAPÚsortedr`   r;   rU   rš   r¨   r¹   rœ   ÚitemsÚprintÚsumÚvaluesr?   r    r#   rt   Úboundsr_   ÚlistÚpoprb   r%   r«   Údumpr   ) ÚapÚar(   rB   rd   rj   rx   ÚidsrE   r“   ÚsrcÚmpÚlr*   r,   rµ   rf   rÊ   rF   rG   rˆ   ÚgoneÚkillre   ÚzÚgroundÚkeepÚtodorm   rÎ   rk   rÏ   s                      `             r-   Úmainrñ   h   sf  ø€ Ü	×	 Ò	 Ó	"€B§O¡O°EÔ$:¸B¿O¹OÈHÐ_c¸OÑ<dÐfh×fuÑfuÐv{ô  CFð  PQÐfuñ  gRØ‡O�O�GÔ "§-¡-£/˜aØ
�%‰%×
U”2—7‘7—<‘<¤ f¨g¼¿ºÀmÓ8TÑ.TÓU€CÔWY×WbÒWbÐcfÐquÒWvÜ	ˆq�u‰u‹€B¤ a§e¡e£‘v�rÜˆr‹7”c˜"“gÓÐ1¤ B£¬¨R«Ð1Ó1ÐÜ
�2”s˜1Ÿ3™3¤¤C£Ó)Ó
*€CÜ
”�S“Ó
€C°sÓ#;²s°!¤C¨¡F¨1¤I±s˜DÐ#;Ü
�'‰'�,‰,�s˜LÓ
)€C¬5°¬>Ü	�‰�‰�c˜>Ó	*€B¬E°"ÉcÓ:RÊcÈ¼3¸q¹6À!¼9ÉcÑ:RÔ,SØ�w� " g °°g°ÀÀWÀÓN‰ˆÜˆq�C�R�&˜Q˜q˜c ˜;Ñ&¨Ö*ñ Oä
�˜˜"�X Ñ,¨b°°"¨g¸Ñ.DÀcÈ#È2ÀhÐQ]ÑF]Ð_aÐbeÐceÐ_fÐiuÑ_uÐw{Ó
|€CÝ6<Ó=²f°ˆQ”�q˜!Ÿ&™& #Ó,Ò,±f€EÐ=Ø—‘–‰ˆˆ1œu¨¨" v¨[¸¸:¹×9SÈ)Ð8TÐTXÐYZÐ[`ÑYaÐXbÐ%cÐkoÔp‘ÙEIÔJÂTÀˆŒCÔ;¨E¯L©L¬NÓ;Ó;Ò	;ÁT€AÐJÙ69Ó:²c°ŒC�‰F�1‰I”s˜C™HŸ>™>Ó+Ó,Ò,±c€DÐ:ÙÓT’t�!˜q ™t q›y¨Q¨q©T°Q©Y‹A¸4À¹7ÀSÌ3ÈrË7Á]Ñ;R�A‘t€DÐTÜ# Cœ.Ô>š.‘$�!¬C°©F°1©I¸Ñ,=�A™.€DÑ>ä
�Š©rÓ2ªr¨!�!—&‘&—-‘- Ñ" 1Ô%©rÑ2Ó3€AÌ%ÔPSÐTVÓPWÌ.ó  ?DÊ.ÀQÐ\]Ð^_Ñ\`Ðcd×chÑchÓcjÐmpÑcpÑ\p»qÐuvð  Cñ  vC¿qÉ.°Vð  ?DÜ�V“œd 6›lˆ$€DÞ
Ø�D—H‘H“J‘ $Ñ&¨Ô-ˆA¨t¯x©x¸¬{¸D¿K¹KÈ¾NÑ-÷ ˆ$ä”%œ˜B›“.Ó! DÑ(¨4Ñ/€GÜ# Bœ-Ô5š-‘$�!�Q¨1°©9�A™-€DÑ5Ü	Œ"�'‰'�,‰,�s˜LÓ
)¨4Ô0Ü
Œ2�7‰7�<‰<˜˜\Ó*¬B¯G©G¯L©L¸¸kÓ,JÔKÜ‡I‚I�q—v‘v q§u¡u¸$ÈÐ\`ÔloÐprÓlsÜ ›I´#°g³,ÌÈDË	ñSÜTXÔY[×Y`ÑY`×YeÑYeÐfiÐkwÓYxÐz}ÓT~ð  HIòJä	ˆJ�t×(˜yÐ)¨¬c°$«i¨[¸ÄÀWÃÀÈoÔ^aÐbfÓ^gÐ]hÐhiÔjmÐnpÓjqÐirð  sCð  DGð  CHð  Iõ  Jùò/ $<ùâ:Rùò >ùâJùÚ:ùÚTùÛ>ùâ2ùò  ?Dùó
 6s`   Å4XÇ!XÉ"XÊ?.XË30X Ì)X%ÍX%ÍX%Í0X*Î
X*Î'&X0Ï*X5ÐX5ÐX5Ò5X:ÓX:Ú__main__)N)Úhomeih  i  )!Ú__doc__rÒ   r«   r<   r­   rO   Úsysr×   Únumpyr    Úscipy.cluster.vqr   Úscipy.spatialr   r=   ÚdirnameÚabspathÚ__file__rÖ   ÚinsertÚ
expanduserrP   rÛ   r¨   r.   r;   rU   ro   ry   rš   r¹   rñ   Ú__name__r4   rV   r-   Ú<module>rÿ      sÆ   ðñ÷ 5× 4× 4Ó 4Û Ý $Ý !Ø	‡w�w‡��r—w‘w—‘ xÓ0Ó1€°3·8±8·?±?À1ÀdÔ3KØ	‡w�w×Ñ˜(Ó#€ò,€ð@ðnðHñ
€òôMômòòò:òEò"Jð@ ˆzÓÙ…Fð rV   