§
    xáj¨  ã                   ó  — d Z ddlZddlZddlZddlmZ ddlZ ej        d¦  «         ddlm	Z
 ddlZddlZej                             dd¦  «         ej                             d e ee¦  «        j        ¦  «        ¦  «         ddlZddlmZ ddlmZ ddlmZmZmZmZmZ i Zej        ej        cZ Z!d	„ Z"dd
„Z#e"e#ce_        e_        d„ Z$d„ Z%d„ Z&d„ Z'd„ Z(e)dk    r. e( e*ej+        ¦  «        dk    rej+        d         nd¦  «         dS dS )a]  The slices on either side of every fit cut of a point-cloud encoding: GT (exact mesh section), the points within
half a layer of the plane and the point slicer's rings, in the canonical frame. Writes ../report/splits_<name>.html.

    env -u PYTHONPATH PYTHONWARNINGS=ignore .venv/bin/python ~/code/data/meshes/fcp_2710_tests/scripts/splits.py dino
é    N)ÚPathÚAggz/home/joao/code/fcp_devel/api)Ú_parts)Úcentres)ÚCSSÚN_POINTSÚOBJÚREPORTÚUPc                 óJ   — | t           d<   g t           d<   t          | g|¢R i |¤ŽS )NÚSÚlog)ÚCAPÚ_orig_system)ÚgeomsÚaÚks      ú</home/joao/code/data/meshes/fcp_2710_tests/scripts/splits.pyÚsystemr      s2   € Ø…Cˆ�HØ…Cˆ�JÝ˜Ð' Ð'Ð'Ð' QÐ'Ð'Ð'ó    c                 ó  — t          | ||¦  «        D ]`\  }}}t          d                              |d         |d         |d         d„ t          |g|g|g||¦  «        d         D ¦   «         f¦  «         Œat          | ||||¦  «        S )Nr   ÚsignÚh0Úh1c                 ó.   — g | ]}|d          |d         f‘ŒS )r   r   © )Ú.0Úqs     r   ú
<listcomp>zsplit.<locals>.<listcomp>$   s&   € Ð8{Ð8{Ð8{ÐPQ¸!¸D¼'À1ÀTÄ7Ð9KÐ8{Ð8{Ð8{r   r   )Úzipr   ÚappendÚ_orig_split)ÚpartsÚcoeffsÚareasÚMÚtolÚpÚCÚAs           r   Úsplitr+   "   sŸ   € Ý�u˜f eÑ,Ô,ð ~ð ~‰ˆˆ1ˆaÝˆEŒ
×Ò˜1˜Vœ9 a¨¤g¨q°¬wÐ8{Ð8{ÕU`ÐbcÐadÐghÐfiÐlmÐknÐpqÐsvÑUwÔUwÐxyÔUzÐ8{Ñ8{Ô8{Ð|Ñ}Ô}Ð}Ð}Ý�u˜f e¨Q°Ñ4Ô4Ð4r   c                 óf   — t          j        | d|¬¦  «        }|t          d         t          d         fS )NÚcuda)ÚdeviceÚupr   r   )ÚfcpÚencoder   )Úgeomr/   Úds      r   r1   r1   +   s-   € ÝŒ
�4 ¨2Ð.Ñ.Ô.€AØ�c�#Œh�˜Eœ
Ð"Ð"r   c           
      ó¬   — g }| D ]N\  }}}}t          |dd…         |dd…         ¦  «        D ]&\  }}|                     ||||d         ||f¦  «         Œ'ŒO|S )z`(sign, track h0, h1, cut layer c: the first layer of the piece above, piece below, piece above).Néÿÿÿÿé   r   )r    r!   )r   ÚoutÚsr   r   ÚpiecesÚloÚhis           r   Úcutsr<   0   s|   € à
€CØ ð 3ð 3Ñˆˆ2ˆr�6Ý˜&  " œ+ v¨a¨b¨b¤zÑ2Ô2ð 	3ð 	3‰FˆB�Ø�JŠJ˜˜2˜r 2 a¤5¨"¨bÐ1Ñ2Ô2Ð2Ð2ð	3à€Jr   c                 óØ   — t          j        | |                      |dk     r| j        n| j         ¦  «        ¦  «        D ]-}t	          |¦  «        }|d         |k    r|d         |k    r|c S Œ.i S )z4The ring ids of the track (sign, h0, h1), by height.r   r5   )r   Ú_trackÚ
per_heightÚholeÚsorted)r   r   r   r   ÚtrÚhss         r   Útrack_ringsrD   9   sn   € åŒm˜A˜qŸ|š|°d¸Q²h°h¨A¬F¨FÀQÄVÀGÑLÔLÑMÔMð ð ˆÝ�B‰ZŒZˆØˆaŒ5�BŠ;ˆ;˜2˜bœ6 Rš<˜<ØˆIˆIˆIøØ€Ir   c                 óà   ‡— ‰                      t          j        dd|gg¦  «        ¦  «        d         }|                      |‰j        d d …df         ¬¦  «        }|€g nˆfd„|j        D ¦   «         S )Ng        r   é   )Úplane_originÚplane_normalc                 óv   •— g | ]5}‰                      t          j        |¦  «        ¦  «        d d …d d…f         ‘Œ6S )NrF   )Úto_canonicalÚnpÚasarray)r   ÚLÚposes     €r   r   zgt_section.<locals>.<listcomp>E   s@   ø€ Ð"aÐ"aÐ"aÈq 4×#4Ò#4µR´ZÀ±]´]Ñ#CÔ#CÀAÀAÀAÀrÈÀrÀEÔ#JÐ"aÐ"aÐ"ar   )Úto_worldrK   ÚarrayÚsectionÚrotationÚdiscrete)ÚmeshrN   ÚzÚoÚsecs    `   r   Ú
gt_sectionrX   B   sv   ø€ Ø�Š•b”h  c¨1 ˜Ñ/Ô/Ñ0Ô0°Ô3€AØ
�,Š, A°D´MÀ!À!À!ÀQÀ$Ô4Gˆ,Ñ
HÔ
H€CØ�ˆ2ˆ2Ð"aÐ"aÐ"aÐ"aÐTWÔT`Ð"aÑ"aÔ"aÐar   c                 ó`  ‡-‡.‡/— t          j        d¬¦  «         t           dz                       d¬¦  «         t          j        t          |          d¬¦  «        }t          j        | d¦  «        }t          j        | 	                    t          d¬¦  «        ¦  «        }t          ||¦  «        \  }}}d	„ t          |¦  «        D ¦   «         }t          ||¦  «        \  }Š-}t          |j        ¦  «        }	|	d
         |	d         z
  dz  }
|j                             |¦  «        }g }t#          t          |¦  «        ¦  «        D �]ˆ\  }\  }}}Š.}}t%          ‰-|||¦  «        Š/ˆ.ˆ/fd„‰.d
z
  ‰.fD ¦   «         }|r t          j        ˆ-fd„|D ¦   «         ¦  «        nt          j        d¦  «        }|                     d¦  «        |                     d¦  «        }}d||z
                       ¦   «         z  dz   }||z
  ||z   }}t/          j        d
ddd¬¦  «        \  }}t3          |‰.d
z
  ‰.f¦  «        D �]^\  }}t          j        |d d …df         |	|         z
  ¦  «        |
k    }|                     ||df         ||d
f         ddddd
¬¦  «         t#          t9          ||j        |	|         ¦  «        ¦  «        D ]<\  }}|                     |d d …df         |d d …d
f         dd|dk    rdnd d¬¦  «         Œ=d}t          j        ‰-j        |k    ¦  «        d         D ]à} t          j         ‰-j!         "                    | ¦  «        ‰-j!         "                    | ¦  «        d d
…         g¦  «        }!| |v rCd||                   }"||          dk    rd|d         › d|d
         › �nd|d         › d|d
         › �}#n
d|rd nd }#}"d!}|                     |!d d …df         |!d d …d
f         |"d"‰-j#        |          rd#nd|#d$¬%¦  «         Œá| $                    |d         |d         ¦  «         | %                    |d
         |d
         ¦  «         | &                    d&¦  «         | '                    d'|› d(|‰.k     rd)nd*› d+�d,¬-¦  «         | (                    d.¬/¦  «         �Œ`g g }%}$|D ]Q}t3          | )                    ¦   «         Ž D ]3\  }&}'|'|%vr*|$ *                    |&¦  «         |% *                    |'¦  «         Œ4ŒR| +                    |$|%d0d1d2d!¬3¦  «         | ,                    d4¬5¦  «         d6| › d7|d8›d9�}(| -                    t           |(z  ¦  «         t/          j.        |¦  «         t_          ˆ.fd:„|D ¦   «         ¦  «        })| *                    |||‰.|||)|(f¦  «         ta          d;|d<›d=|› d|› d>|d         › d|d
         › d?|d         › d|d
         › d@|)› �d¬A¦  «         �ŒŠdB 1                    dC„ |D ¦   «         ¦  «        }*dD 1                    dE„ |D ¦   «         ¦  «        }+dF| › dGtd          › dHtg          j4        | ¦  «        › dIt          dJ›dK|› dLtk          |j6        ¦  «        › dMtk          |¦  «        › dNto          dO„ |D ¦   «         ¦  «        › dPtq          j9        dQ¦  «        › dR|+› dS|*› dT�},t           dU| › dV�z   :                    |,¦  «         d S )WNT)Úexist_okÚimgrT   )Úforce)r   r   r6   r   )Úseedc                 ó   — h | ]	�^ }}}}|’Œ
S r   r   )r   Ú_Úcs      r   ú	<setcomp>zmain.<locals>.<setcomp>O   s    € Ð1Ð1Ð1‘{˜˜1˜a �Ð1Ð1Ð1r   r6   rF   c                 ó:   •— i | ]}|‰v ¯‰|         |‰k     rd nd“ŒS )r   r6   r   )r   ÚhÚcutrB   s     €€r   ú
<dictcomp>zmain.<locals>.<dictcomp>W   s0   ø€ ÐOÐOÐO°ÀqÈBÀwÀwˆr�!Œu˜A šG˜G�q�q¨ÀwÀwÀwr   c                 óD   •— g | ]}‰j                              |¦  «        ‘ŒS r   )ÚringsÚring)r   Úrr   s     €r   r   zmain.<locals>.<listcomp>X   s%   ø€ Ð;Ð;Ð;°!˜aœgŸlšl¨1™oœoÐ;Ð;Ð;r   )r6   rF   g      Ð?g{®Gáz”?)é
   é   éd   )ÚfigsizeÚdpig      ø?z#9a9a9au   points (Â±Â½ layer))r8   r`   ÚlwÚlabelÚzorderr   gš™™™™™ù?z
GT section)r`   ro   rp   rq   )z#d1495bz#2e86abzslice: part ú-z#e0a100zslice: other ringsFgš™™™™™ñ?z--é   )r`   ro   Úlsrp   rq   Úequalzlayer z (ÚbelowÚabovez	 the cut)rj   )Úfontsizeé   )Ú	labelsizezlower centerrk   é   )ÚlocÚncolrx   Úframeon)r   g¸…ëQ¸®?r6   r6   )Úrectzimg/splits_r_   Ú02dz.pngc              3   óD   •K  — | ]}t          ‰|z
  ¦  «        d k    V — ŒdS )r6   N)Úabs)r   Úxrd   s     €r   ú	<genexpr>zmain.<locals>.<genexpr>y   s2   øè è € Ð8Ð8¨•3�s˜Q‘w‘<”< 1Ò$Ð8Ð8Ð8Ð8Ð8Ð8r   zcut Ú2dz: track z, ú | z  mesh cuts here: )ÚflushÚ c              3   ó´   K  — | ]S\  }}}}}}}}d |› d|› d|dz
  › d|› d|› d|› d|d         › d|d         › d|d         › d|d         › d	|rd
nd› d|› d�V — ŒTdS )z	<h2 id='cz'>Cut z	: layers r6   r†   z <span class='mut'>(track rr   z; parts r   z; the mesh u   also cuts here (Â±1 layer)zdoes not cut herez)</span></h2><img src='z' loading='lazy'>Nr   )	r   r   r   r   rd   r:   r;   ÚbothÚfs	            r   r„   zmain.<locals>.<genexpr>|   s  è è € ð Wð Wñ /N¨a°°R¸¸bÀ"ÀdÈAð	*�Að 	*ð 	*˜Qð 	*ð 	*¨¨q©ð 	*ð 	*°Sð 	*ð 	*ÐTVð 	*ð 	*ÐY[ð 	*ð 	*ÐegÐhiÔejð 	*ð 	*ÐmoÐpqÔmrð 	*ð 	*ØˆaŒ5ð	*ð 	*Ø�a”5ð	*ð 	*ØEIÐ%bÐ%AÐ%AÐObð	*ð 	*àð	*ð 	*ð 	*ðWð Wð Wð Wð Wð Wr   ú c           	   3   óR   K  — | ]"\  }}}}}}}}d |› d|dz
  › d|› |rdnd› d�V — Œ#dS )z<a href='#cz'>r6   ú|rˆ   ú*z</a>Nr   )r   r   r_   rd   rŠ   s        r   r„   zmain.<locals>.<genexpr>€   si   è è € ÐwÐwÑSnÐSTÐVWÐYZÐ\_ÐabÐdeÐgkÐmnÐN ÐNÐN c¨A¡gÐNÐN°ÐN¸4Ð5H°R°RÀSÐNÐNÐNÐwÐwÐwÐwÐwÐwr   z†<!doctype html><html lang="en"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1"><title>z$: slices at the cuts</title>
<style>uE   </style></head><body>
<p><a href="index.html">â†� report</a></p>
<h1>z-: slices at the fit cuts</h1>
<p class="mut">ú,z points (seed 0), up z, fcp defaults; z parts, z fit cuts
(c              3   ó(   K  — | ]}|d           V — ŒdS )é   Nr   )r   ri   s     r   r„   zmain.<locals>.<genexpr>‡   s(   è è € ÐÐ�1ˆ!ˆAŒ$€hÐÐÐÐÐÐr   aš   where the mesh encoding does not cut, marked *). Each cut: the layer below and the layer above,
canonical frame (x right, y up), zoomed on the cut track's rings. Black: GT, the exact section of the mesh at the layer centre.
Grey: the points within half a layer of the plane. Coloured: the point slicer's rings (red: the part below the cut, blue: the
part above, yellow: other rings; dashed: holes). Generated z%Y-%m-%d %H:%Mz- by <code>scripts/splits.py</code>.</p>
<nav>z</nav>
z
</body></html>Úsplits_z.html);r
   ÚmkdirÚtrimeshÚloadr	   r   ÚgetrK   rL   Úsampler   r1   r<   r   ÚlayersrN   rJ   Ú	enumeraterD   ÚconcatenateÚzerosÚminÚmaxÚpltÚsubplotsr    r‚   ÚscatterrX   ÚplotÚnonzerorc   Úvstackrg   rh   r@   Úset_xlimÚset_ylimÚ
set_aspectÚ	set_titleÚtick_paramsÚget_legend_handles_labelsr!   ÚlegendÚtight_layoutÚsavefigÚcloseÚanyÚprintÚjoinr   ÚhtmlÚescapeÚlenr#   ÚsumÚtimeÚstrftimeÚ
write_text)0ÚnameÚgr/   ÚPr_   ÚmlogÚ	mesh_cutsr3   r   r`   ÚhalfÚPcÚrowsr   r8   r   r   r:   r;   ÚownÚboxÚlo_xyÚhi_xyÚmÚfigÚaxsÚaxrc   ÚnearÚirM   Úfirstri   ÚRÚcolÚlabÚh_Úl_ÚhhÚllr‹   rŠ   rW   ÚidxÚpager   rd   rB   s0                                                @@@r   ÚmainrÕ   H   sÉ  øøø€ Ý
„L˜$ÐÑÔÐÝˆe�^×Ò DÐÑ)Ô)Ð)ÝŒ•S˜”Y fÐ-Ñ-Ô-€AÝ	Œ��iÑ	 Ô	 €BÝ
Œ
�1—8’8�H¨1�8Ñ-Ô-Ñ.Ô.€AÝ˜˜2‘”�J€A€qˆ$Ø1Ð1¥d¨4¡j¤jÐ1Ñ1Ô1€IÝ�q˜"‘”�I€A€qˆ#Ý�”ÑÔ€AØˆaŒD�1�Q”4‰K˜1Ñ€DØ	
Œ×	Ò	˜QÑ	Ô	€BØ€DÝ'0µ°c±´Ñ';Ô';ð &uñ &uÑ#ˆÑ#ˆAˆr�2�s˜B Ý˜˜A˜r 2Ñ&Ô&ˆØOÐOÐOÐOÐO°c¸A±g¸s°^ÐOÑOÔOˆØ@CÐY�bŒnÐ;Ð;Ð;Ð;°sÐ;Ñ;Ô;Ñ<Ô<Ð<ÍÌÐRXÑIYÔIYˆØ—w’w˜q‘z”z 3§7¢7¨1¡:¤:ˆuˆØ�E˜E‘M×&Ò&Ñ(Ô(Ñ(¨4Ñ/ˆØ˜q‘y %¨!¡)ˆuˆÝ”<  1¨g¸3Ð?Ñ?Ô?‰ˆˆSÝ˜˜s Q™w¨˜nÑ-Ô-ð 	(ñ 	(‰EˆB�Ý”6˜"˜Q˜Q˜Q ˜Tœ( Q q¤T™/Ñ*Ô*¨dÒ2ˆDØ�JŠJ�r˜$ ˜'”{ B t¨Q w¤K°3¸)ÈÐQfÐopˆJÑqÔqÐqÝ!¥*¨Q°´¸¸!¼Ñ"=Ô"=Ñ>Ô>ð kð k‘��1Ø—’˜˜!˜!˜!˜Q˜$œ  1 1 1 a 4¤¨C°CÈqÐTUÊvÈv¸|¸|Ð[_Ðhi�ÑjÔjÐjÐjØˆEÝ”Z ¤ q¢Ñ)Ô)¨!Ô,ð mð m�Ý”I˜qœwŸ|š|¨A™œ°´·²¸Q±´ÀÀÀÔ0CÐDÑEÔE�Ø˜�8�8Ø0°°Q´Ô8�CØ<?À¼FÀaºK¸KÐ8¨¨A¬Ð8Ð8°°A´Ð8Ð8Ð8ÐMkÐ\^Ð_`Ô\aÐMkÐMkÐdfÐghÔdiÐMkÐMk�C�Cà(À%Ð*QÐ*>Ð*>ÈT˜�CØ!�EØ—’˜˜!˜!˜!˜Q˜$œ  1 1 1 a 4¤¨C°CÀAÄFÈ1ÄIÐ<V¸D¸DÐSVÐ^aÐjk�ÑlÔlÐlÐlØ�KŠK˜˜aœ %¨¤(Ñ+Ô+Ð+¨R¯[ª[¸¸q¼À5ÈÄ8Ñ-LÔ-LÐ-LÈbÏmÊmÐ\cÑNdÔNdÐNdØ�LŠLÐQ !ÐQÐQ°!°c²'°' w w¸wÐQÐQÐQÐ\^ˆLÑ_Ô_Ð_Ø�NŠN QˆNÑ'Ô'Ð'Ñ'Ø�RˆBˆØð 	1ð 	1ˆBÝ˜r×;Ò;Ñ=Ô=Ð>ð 1ð 1‘��BØ˜R�<�<Ø—I’I˜b‘M”M�M 2§9¢9¨R¡=¤= =øð1ð 	�
Š
�2�r˜~°AÀÈ5ˆ
ÑQÔQÐQØ×Ò˜oÐÑ.Ô.Ð.Ø,˜$Ð,Ð, Ð,Ð,Ð,Ð,ˆØ�Š•F˜Q‘JÑÔÐÝŒ	�#‰ŒˆÝÐ8Ð8Ð8Ð8¨iÐ8Ñ8Ô8Ñ8Ô8ˆØ�Š�Q˜˜B  R¨¨T°1Ð5Ñ6Ô6Ð6ÝÐg�QÐgÐgÐg 2ÐgÐg¨ÐgÐg¨b°¬eÐgÐg°b¸´eÐgÐgÀÀ1ÄÐgÐgÈÈ1ÌÐgÐgÐaeÐgÐgÐosÐtÑtÔtÐtÑtØ
�'Š'ð Wð Wð RVðWñ Wô Wñ Wô W€Cð �(Š(ÐwÐwÐrvÐwÑwÔwÑ
wÔ
w€CðØKOðð åðð õ 
„[�ÑÔð	ð õ
 ðð ð ð
 24ðð õ
 FIÈÌÁ\Ä\ðð õ
 \_Ð_cÑ[dÔ[dðð õ ÐÐ˜ÐÑÔÑÔðð õ =A¼MÐJZÑ<[Ô<[ðð ð 
ðð ð ðð ð €Dõ Ð#˜Ð#Ð#Ð#Ñ#×/Ò/°Ñ5Ô5Ð5Ð5Ð5r   Ú__main__r6   Údino)N),Ú__doc__r²   Úsysr¶   Úpathlibr   Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotrŸ   ÚnumpyrK   r•   ÚpathÚinsertÚstrÚ__file__Úparentr0   r   Ú
fcp._slicer   Úparts_reportr   r   r	   r
   r   r   Úparts_systemÚsplit_by_fitr   r"   r   r+   r1   r<   rD   rX   rÕ   Ú__name__r´   Úargvr   r   r   ú<module>rë      s  ððð ð
 €€€Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ø €
„ˆuÑ Ô Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ø €€€à „‡‚�Ð2Ñ 3Ô 3Ð 3Ø „‡‚��3�3�t�t˜H‘~”~Ô,Ñ-Ô-Ñ .Ô .Ð .Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7à€Ø"Ô/°Ô1DÐ €ˆkð(ð (ð (ð5ð 5ð 5ð 5ð ,2°5Ð (€Ô �VÔ(ð#ð #ð #ð
ð ð ðð ð ðbð bð bðF6ð F6ð F6ðR ˆzÒÐØ€D˜˜˜CœH™œ¨Ò)Ð)ˆŒ�!Œˆ¨vÑ6Ô6Ð6Ð6Ð6ð Ðr   