Ë
    »YÉj½T  ã                   ót  — d Z ddlZddlZddlZddlZddlZddlZddlZej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlZg d¢Zej                  j                  ej                  j                  e«      «      Zej                  j%                  ej&                  d«      Zej                  j%                  ed«      Zej                  j%                  ed«      Zej                  j%                  ed«      ZdZd	„ Zd
„ Zd„ Zd„ Zd„ Zd#d„Zd„ Zd„ Z d„ Z!d„ Z"e e!e"dœZ#d„ Z$d„ Z%d$d„Z&d„ Z'd„ Z(e)dk(  �rY ejT                  «       Z+e+jY                  dd¬«       e+jY                  dd¬«       e+jY                  dd¬«       e+jY                  dd¬«       e+jY                  d «       e+jY                  d!«       e+j[                  «       Z. ee«       e.j^                  r e$«        ye.j`                  r. ejb                   e%e.jd                  e.jf                  «      «       ye.jh                  rC e&e.jd                  re.jd                  gnde.jf                  re.jf                  g¬"«       yd¬"«       ye.jj                  r e(«        ye+jm                  «        yy)%ub  _exp_hull_repair.py â€” ë³¼ë¡�ê»�ì§ˆë¡œ ëŒ€ì²´ë�œ 23ë¶€í’ˆì�„ ì‚´ë¦´ ìˆ˜ ìžˆëŠ” ìˆ˜ë¦¬ ì „ëžµ ì‹¤ì¸¡.

ì˜¤í”„ë�¼ì�¸ ì‹¤í—˜ì�´ë‹¤. fea_server.py ëŠ” ì�½ê¸°(import)ë§Œ í•˜ê³  ì ˆëŒ€ ê³ ì¹˜ì§€ ì•ŠëŠ”ë‹¤.
í�¬íŠ¸ 8097 ì„œë²„ë�„ ê±´ë“œë¦¬ì§€ ì•ŠëŠ”ë‹¤(fea_server ì�˜ serve() ëŠ” __main__ ê°€ë“œ ì•ˆì�´ë�¼
import ë§Œìœ¼ë¡œëŠ” í�¬íŠ¸ë¥¼ ì—´ì§€ ì•ŠëŠ”ë‹¤ â€” í™•ì�¸í•¨).

ë¬´ì—‡ì�„ ìž¬ëŠ”ê°€ (ë¶€í’ˆ x ì „ëžµ):
  1) tetgen '-p' í†µê³¼ ì—¬ë¶€      â†’ fea_server._tet_ok_p ê·¸ëŒ€ë¡œ
  2) ë²½ë‘�ê»˜ ê²Œì�´íŠ¸ í†µê³¼ ì—¬ë¶€     â†’ fea_server._thickness_ok ê·¸ëŒ€ë¡œ
     (emin ì�€ 'ì›�ë³¸' ë¶€í’ˆì�˜ ìµœì†Œ ë³€ ê¸¸ì�´. ìˆ˜ë¦¬ ê²°ê³¼ë¡œ ë‹¤ì‹œ ìž¬ë©´ ì‚´ì�´ ë¶™ì�€ ìˆ˜ë¦¬ê°€
      ìŠ¤ìŠ¤ë¡œ ê¸°ì¤€ì�„ ëŠ˜ë ¤ ê²Œì�´íŠ¸ë¥¼ í†µê³¼í•´ ë²„ë¦°ë‹¤.)
  3) CAD í‘œë©´ ìµœëŒ€ ì�´íƒˆ mm       â†’ fea_server.point_tri_dist_pairs (ì �â†”ì‚¼ê°�í˜• ì •í™•ê±°ë¦¬)

ì „ëžµ:
  E1 ìž�ê¸°êµ�ì°¨ ìˆ˜ë¦¬ : open3d get_self_intersecting_triangles ë¡œ êµ�ì°¨ ì‚¼ê°�í˜• ì œê±°
                     â†’ fea_server._earcut_fill ë¡œ êµ¬ë©�ë©”ì›€ â†’ _tm_clean
  E2 gmsh 3D       : í‘œë©´ì�„ gmsh ì—� ë„£ì–´ ì‚¬ë©´ì²´ ì²´ì �ë©”ì‹œ ìƒ�ì„± â†’ ê·¸ ê²½ê³„ë©´ì�„ ê²°ê³¼ í‘œë©´ìœ¼ë¡œ
  E3 ë³µì…€ ìž¬ë©”ì‹œ   : ë²½ë‘�ê»˜/3 (í•˜í•œ bboxëŒ€ê°�/400) í•´ìƒ�ë�„ë¡œ ë³µì…€í™” í›„ marching cubes

ì‹¤í–‰:
  python _exp_hull_repair.py --baseline     # 23ë¶€í’ˆ í˜•ìƒ� ì¶”ì¶œ + í˜„ìž¬ ê»�ì§ˆ ê¸°ì¤€ê°’
  python _exp_hull_repair.py --sweep        # ì „ëžµ ì „ìˆ˜ ì‹¤í–‰(ì…€ë§ˆë‹¤ ìž�ì‹� í”„ë¡œì„¸ìŠ¤ + íƒ€ìž„ì•„ì›ƒ)
  python _exp_hull_repair.py --cell --key <í‚¤> --strat E1   # ì…€ 1ê°œ(ìž�ì‹� í”„ë¡œì„¸ìŠ¤ìš©)
  python _exp_hull_repair.py --table        # ê²°ê³¼ JSON â†’ ë§ˆí�¬ë‹¤ìš´ í‘œ
é    N)é   é   é   é   é   é'   é)   é:   é?   éB   éZ   é`   éb   ée   éi   én   éo   éu   év   éw   éx   é�   é‘   Úexp_hullÚgeoz_exp_hull_repair_baseline.jsonz_exp_hull_repair_result.jsonr   c                 ó4   — t        j                  | d¬«       | S )NT)Úexist_ok)ÚosÚmakedirs)Úds    õA   E:\ë�„ì§„íŒ©í† ë¦¬\3DìŠ¤ìº”ë°�í‹°ì¹­ì‹œìŠ¤í…œ\_exp_hull_repair.pyÚ_mkr"   5   s   € Ü‡K�K�˜DÕ!Ø€Hó    c            
      ó´  — t         j                  j                  t        j                  d«      } t        j                  t        | d¬«      «      }t        j                  |d   t        ¬«      j                  dd«      }|d   }|j                  d	«      xs g }g d
}}|D ]+  }t        |«      dz  }|j                  |||z   f«       ||z  }Œ- g }	t        D ]‚  }
|
dz
  }||   \  }}||| }t        j                   |«      \  }}t        j"                  ||«      }t%        |«      D ]2  \  }\  }}|	j                  |
||t'        |«      k  r||   nd||dœ«       Œ4 Œ„ |	S )u"  last_request.json(í™”ë©´ì�´ ë§ˆì§€ë§‰ìœ¼ë¡œ ë³´ë‚¸ ê·¸ ëª¨ë�¸) â†’ 23ë¶€í’ˆì�˜ ë�©ì–´ë¦¬ë³„ (V,F).

    fea_server.run_fea ì™€ ë�™ì�¼í•œ ìˆœì„œ: part_sizes ë¡œ ìž�ë¥´ê³  â†’ weld_mesh â†’
    split_components. ê»�ì§ˆ ëŒ€ì²´ëŠ” 'ë¶€í’ˆ' ì�´ ì•„ë‹ˆë�¼ 'ë�©ì–´ë¦¬' ë‹¨ìœ„ë¡œ ì�¼ì–´ë‚œë‹¤.
    zlast_request.jsonúutf-8©ÚencodingÚ	positions©Údtypeéÿÿÿÿé   Ú
part_sizesÚ
part_namesr   é   Ú )ÚnoÚcompÚnameÚVÚF)r   ÚpathÚjoinr5   Ú	WORK_ROOTÚjsonÚloadÚopenÚnpÚasarrayÚfloatÚreshapeÚgetÚintÚappendÚ
HULL_PARTSÚ	weld_meshÚsplit_componentsÚ	enumerateÚlen)ÚreqÚqÚPÚsizesÚnamesÚoffsÚoffÚcntÚrowsÚoutr1   ÚpiÚaÚbÚsegÚVpÚFpÚsubÚciÚVcÚFcs                        r!   Úextract_partsr\   =   sM  € ô �'‰'�,‰,”q—{‘{Ð$7Ó
8€CÜ�	‰	”$�s WÔ-Ó.€AÜ
�
‰
�1�[‘>¬Ô/×7Ñ7¸¸AÓ>€AØˆl‰O€EØ�E‰E�,ÓÒ% 2€EØ�Aˆ#€DÛˆÜ�3‹x˜1‰}ˆØ�‰�S˜# ™*Ð%Ô&Øˆt‰‰ð ð €CßˆØ�!‰VˆØ�B‰x‰ˆˆ1Ø��!ˆfˆÜ—‘˜SÓ!‰ˆˆBÜ× Ñ   RÓ(ˆÜ% cžN‰LˆB‘��RØ�J‰J˜b¨"Ø-/´#°e³*ª_  b¢	À"Ø bñ*õ +ñ +ð ð €Jr#   c                 ó   — d| |fz  S )Nz%d_%d© )r1   r2   s     r!   Úcell_keyr_   [   s   € Ø�b˜$�ZÑÐr#   c                 óP   — t         j                  j                  t        d| z  «      S )Nzg%s.npz)r   r6   r7   ÚGEO_DIR)Úkeys    r!   Úgeo_pathrc   _   s   € Ü�7‰7�<‰<œ ¨S¡Ó1Ð1r#   c                 óÆ   — t        j                  t        | «      «      }t        j                  |d   t        «      t        j                  |d   t         j
                  «      fS )Nr4   r5   )r<   r:   rc   r=   r>   Úint64)rb   Úzs     r!   Úload_georg   c   sA   € Ü
�‰”˜“Ó€AÜ�:‰:�a˜‘fœeÓ$¤b§j¡j°°3±¼¿¹Ó&BÐBÐBr#   c           
      óò  — ddl m} t        | «      rt        |«      rt        |«      sy| |   }t        j                  | |j                  d¬«      |dd…df   |dd…df   z   dz  |dd…df   |dd…df   z   dz  |dd…df   |dd…df   z   dz  g«      }t        |«      dkD  r0|ddt        t        j                  t        |«      dz  «      «      …   }|} ||   }|j                  d¬«      }	 ||	«      }
 ||«      }i }t        |«      D ]6  \  }}|D ],  }|j                  t        |«      g «      j                  |«       Œ. Œ8 t        |t        |	«      «      }|
j                  | |¬	«      \  }}t        j                  |j                  t        | «      d
«      «      }|j                  | t        dt        |«      «      ¬	«      \  }}t        j                  t        j                  |«      j                  t        | «      d
«      «      }d}t!        t        | «      «      D ]Ú  }t#        d„ ||   D «       «      }||   D ],  }|j%                  |j'                  t        |«      d«      «       Œ. t        j(                  |t        j*                  ¬«      }t        j,                  | |   ddd…f   t        |«      d¬«      }t/        j0                  |||   «      }t3        t        j4                  |«      «      }||kD  sŒÙ|}ŒÜ |S )u›  ìˆ˜ë¦¬ ê²°ê³¼ í‘œë©´ â†’ ì›�ëž˜ CAD í‘œë©´ ìµœëŒ€ ì�´íƒˆ mm (ì �â†”ì‚¼ê°�í˜• ì •í™•ê±°ë¦¬).

    í›„ë³´ ì‚¼ê°�í˜•ì�„ 'ë¬´ê²Œì¤‘ì‹¬ ìµœê·¼ì ‘ kê°œ' ë¡œë§Œ ë½‘ìœ¼ë©´ ê¸¸ê³  ì–‡ì�€ ì‚¼ê°�í˜•ì—�ì„œ
    ê³¼ì†Œë³´ê³ ë�œë‹¤. ê·¸ëž˜ì„œ â‘  ë¬´ê²Œì¤‘ì‹¬ KDíŠ¸ë¦¬ kê°œ â‘¡ CAD ìµœê·¼ì ‘ ì •ì �ì—� ë¶™ì�€
    ì‚¼ê°�í˜• ì „ë¶€ë¥¼ í•©ì³� í›„ë³´ë¡œ ì“°ê³ , fea_server.point_tri_dist_pairs ë¡œ
    ì •í™•ê±°ë¦¬ë¥¼ ìž°ë‹¤.
    r   )ÚcKDTreeNr/   ©Úaxisé   i`ê  g     Lí@)Úkr+   r,   ç        c              3   ó2   K  — | ]  }t        |«      –— Œ y ­w)N)rA   )Ú.0Úxs     r!   Ú	<genexpr>z!max_dev_to_cad.<locals>.<genexpr>�   s   è ø€ Ð*¡6˜a”3�q—6¡6ùs   ‚r^   r)   )Úscipy.spatialri   rG   r<   ÚvstackÚmeanrA   ÚceilrF   Ú
setdefaultrB   ÚminÚqueryÚ
atleast_2dr?   r=   ÚrangeÚsetÚupdater@   Úfromiterre   Úrepeatr5   Úpoint_tri_dist_pairsr>   Únanmin)ÚVrÚFrrZ   r[   rm   ri   ÚTrÚSÚTÚcenÚtcÚtvÚv2fÚfiÚtriÚvÚkkÚ_ÚidxÚvnearÚworstÚiÚcandÚptsr    Údms                             r!   Úmax_dev_to_cadr—   k   s’  € õ &ÜˆrŒ7œ#˜bœ'¬¨R¬Øð 
ˆB‰€BÜ
�	‰	�2�r—w‘w A�w“Ø’q˜!�t‘H˜r¢! Q $™xÑ'¨1Ñ,¨r²!°Q°$©x¸"ºQÀ¸T¹(Ñ/BÀaÑ.GØ’q˜!�t‘H˜r¢! Q $™xÑ'¨1Ñ,ð.ó 	/€Aô ˆ1ƒv�‚~ØÑ.””B—G‘GœC ›F WÑ,Ó-Ó.Ð.Ñ/ˆØ	
€BØ
ˆ2‰€AØ
�&‰&�aˆ&‹.€CÙ	�‹€BÙ	�‹€BØ
€CÜ˜R–=‰ˆˆCÛˆAØ�N‰Nœ3˜q›6 2Ó&×-Ñ-¨bÕ1ñ ð !ô 
ˆQ”�C“Ó	€BØ�X‰X�b˜BˆXÓ�F€A€sÜ
�-‰-˜Ÿ™¤C¨£G¨RÓ0Ó
1€CØ�x‰x˜œc !¤S¨£W›oˆxÓ.�H€A€uÜ�M‰Mœ"Ÿ*™* UÓ+×3Ñ3´C¸³G¸RÓ@ÓA€EØ€EÜ”3�r“7Ž^ˆÜÑ* 3 q¢6Ó*Ó*ˆØ�q”ˆAØ�K‰K˜Ÿ™¤ A£¨Ó+Õ,ð ä�{‰{˜4¤r§x¡xÔ0ˆÜ�i‰i˜˜1™˜d¢A˜g™¬¨D«	¸Ô:ˆÜ×"Ñ" 3¨¨$©Ó0ˆÜ”2—9‘9˜Q“<Ó ˆØ�‹:Ø‰Eð ð €Lr#   c                 ó  — t        t        | «      «      t        t        |«      «      dœ}t        |«      rt        | «      dk  r|j                  dddddœ«       |S t        t	        j
                  | |t        t        j                  j                  |d|z   «      «      d¬	«      «      |d
<   t        t	        j                  | ||«      «      |d<   	 t	        j                  | |«      }t        t        |d   «      d«      |d<   t        |d   «      |d<   t        t        |d   «      d«      |d<   	 t        t        t        | |||«      «      d«      |d<   |S # t        $ r Y Œ2w xY w# t        $ r!}	d|d<   t!        |	«      dd |d<   Y d}	~	|S d}	~	ww xY w)uG   í•œ ìˆ˜ë¦¬ê²°ê³¼ë¥¼ fea_server ì�˜ ê²Œì�´íŠ¸ë¡œ ê·¸ëŒ€ë¡œ íŒ�ì •í•œë‹¤.)ÚnvÚnfé   FNu   fail(ë¹ˆ ë©”ì‹œ)©ÚtetgenÚ	wall_gateÚ
max_dev_mmÚnoteÚtg_é<   )Útimeoutr�   rž   Úwall_mmr,   ÚclosedÚ
volume_mm3r/   rŸ   r   Údev_err)rA   rG   r}   Úboolr5   Ú	_tet_ok_pr"   r   r6   r7   Ú_thickness_okÚmesh_metricsÚroundr>   Ú	Exceptionr—   Ústr)
r‚   rƒ   rZ   r[   ÚeminÚwdÚtagÚrÚmÚes
             r!   Úmeasurerµ   ›   sh  € ä”3�r“7‹|¤3¤s¨2£w£<Ñ0€AÜˆrŒ7”c˜"“g ’kØ	�‰˜E°ÀTØ,ñ.ô 	/àˆÜ”q—{‘{ 2 r¬3¬r¯w©w¯|©|¸BÀÈÁÓ/LÓ+MÐWYÔZÓ[€A€h�KÜœ!Ÿ/™/¨"¨b°$Ó7Ó8€A€k�NðÜ�N‰N˜2˜rÓ"ˆÜœU 1 Y¡<Ó0°!Ó4ˆˆ)‰Ü˜1˜X™;Ó'ˆˆ(‰Ü¤ a¨¡oÓ 6¸Ó:ˆˆ,‰ð$Ü¤¤n°R¸¸RÀÓ&DÓ EÀqÓIˆˆ,‰ð €Høô ò Ùðûô ò $Øˆˆ,‰Ü˜1“v˜d˜s�|ˆˆ)�Ø€Hûð$ús+   ÃAE Ä,$E! Å	EÅEÅ!	FÅ*FÆFc           	      ó¸  — ddl }|j                  j                  |j                  j	                  t        j                  | t        «      «      |j                  j                  t        j                  |t
        j                  «      «      «      }|j                  «        |j                  «        |j                  «        t        j                  |j                  «       «      }dt        t        |«      «      i}t        |«      rst        j                   |j#                  d«      «      }|j%                  |D �cg c]  }t        |«      ‘Œ c}«       |j'                  «        t        t        |«      «      |d<   t        j                  |j(                  t        «      }	t        j                  |j*                  t
        j,                  «      }
	 t/        j0                  |	|
«      \  }	}
d}	 t/        j4                  |	|
«      \  }	}
}t        |«      |d<   	 t/        j0                  |	|
«      \  }	}
|	|
|fS c c}w # t2        $ r Y ŒZw xY w# t2        $ r Y ŒLw xY w# t2        $ r Y Œ3w xY w)u:   ìž�ê¸°êµ�ì°¨ ì‚¼ê°�í˜• ì œê±° â†’ êµ¬ë©�ë©”ì›€ â†’ ì •ë¦¬.r   NÚself_int_pairsr+   Úremoved_trisÚfilled_tris)Úopen3dÚgeometryÚTriangleMeshÚutilityÚVector3dVectorr<   r=   r>   ÚVector3iVectorÚint32Úremove_duplicated_verticesÚremove_duplicated_trianglesÚremove_degenerate_trianglesÚget_self_intersecting_trianglesrA   rG   Úuniquer?   Úremove_triangles_by_indexÚremove_unreferenced_verticesÚverticesÚ	trianglesre   r5   Ú	_tm_cleanr­   Ú_earcut_fill)r4   ÚFar°   Úo3dr³   ÚsiÚinfoÚbadrq   ÚV1ÚF1Úaddeds               r!   Ústrat_E1rÔ   ¶   sß  € ãØ�‰×!Ñ!Ø�‰×"Ñ"¤2§:¡:¨a´Ó#7Ó8Ø�‰×"Ñ"¤2§:¡:¨b´"·(±(Ó#;Ó<ó	>€Að × Ñ Ô"Ø×!Ñ!Ô#Ø×!Ñ!Ô#Ü	�‰�A×5Ñ5Ó7Ó	8€BØœc¤# b£'›lÐ+€DÜ
ˆ2„wÜ�i‰i˜Ÿ
™
 2›Ó'ˆØ	×#Ñ#±SÓ$9±S°¤S¨¥V°SÑ$9Ô:Ø	×&Ñ&Ô(Ü"¤3 s£8›}ˆˆ^ÑÜ	�‰�A—J‘J¤Ó	&€BÜ	�‰�A—K‘K¤§¡Ó	*€BðÜ—‘˜R Ó$‰ˆˆBð €EðÜŸ™ r¨2Ó.‰ˆˆB�ô ˜e›*€DˆÑðÜ—‘˜R Ó$‰ˆˆBð ˆr�4ˆ<Ðùò' %:øô ò Ùðûô
 ò Ùðûô
 ò Ùðús<   Ä4H*ÇH/ Ç#H> ÈI È/	H;È:H;È>	I
É	I
É	IÉIc           
      óH	  — ddl }	 t        j                  | |«      \  } }t        j
                  j                  t        |«      d«      }t        j                  || |«       t        t        j                  j                  t        j                  | d¬«      «      «      }|j                  «        i }	 |j                  j!                  dd«       |j                  j!                  dt#        |dz  d«      «       |j                  j!                  d	t#        |d
z  d«      «       |j%                  |«       |j&                  j(                  j+                  dt        j,                  z  dz  dddt        j,                  z  dz  «       |j&                  j(                  j/                  «        |j&                  j1                  d«      D �cg c]  }|d   ‘Œ	 }}t3        |«      |d<   |j&                  j4                  j7                  |«      }	|j&                  j4                  j9                  |	g«       |j&                  j4                  j;                  «        |j&                  j(                  j=                  d«       |j&                  j(                  j?                  «       \  }
}}t        j@                  |t        «      jC                  dd«      }tE        |
«      D ��ci c]  \  }}tG        |«      |“Œ }}}|j&                  j(                  jI                  d«      \  }}}d}tK        ||«      D ]b  \  }}tG        |«      dk(  sŒt        j@                  |D �cg c]  }|tG        |«         ‘Œ c}t        jL                  «      jC                  dd«      }Œd |�t3        |«      stO        d«      ‚tG        t3        |«      «      |d<   |jQ                  «        t        jR                  |dd…g d¢f   |dd…g d¢f   |dd…g d¢f   |dd…g d¢f   g«      }t        jT                  |d¬«      }t        jV                  |ddd¬«      \  }}}|||dk(        }t        jX                  ||   jC                  dd«      «      \  }}|||fS # t        $ r Y �Œ\w xY wc c}w c c}}w c c}w # |jQ                  «        w xY w)uh   gmsh ë¡œ í‘œë©´ì�„ ë°›ì•„ ì‚¬ë©´ì²´ ì²´ì �ë©”ì‹œë¥¼ ì§�ì ‘ ë§Œë“¤ê³ , ê·¸ ê²½ê³„ë©´ì�„ ê²°ê³¼ë¡œ ì“´ë‹¤.r   Nzin.stlrj   zGeneral.TerminalzMesh.CharacteristicLengthMing      i@çü©ñÒMbP?zMesh.CharacteristicLengthMaxg      4@g{®Gáz„?g      D@g     €f@Trl   r/   Úgmsh_surfacesr,   r+   r›   u   gmsh ì‚¬ë©´ì²´ 0ê°œÚtets)r   rl   r/   )r   r/   r,   )r/   rl   r,   )r   r,   rl   )rk   Úreturn_indexÚreturn_counts)-Úgmshr5   rÊ   r­   r   r6   r7   r"   Ú	write_stlr>   r<   ÚlinalgÚnormÚptpÚ
initializeÚoptionÚ	setNumberÚmaxÚmergeÚmodelÚmeshÚclassifySurfacesrR   ÚcreateGeometryÚgetEntitiesrG   r   ÚaddSurfaceLoopÚ	addVolumeÚsynchronizeÚgenerateÚgetNodesr=   r?   rF   rA   ÚgetElementsÚzipre   ÚRuntimeErrorÚfinalizert   ÚsortrÅ   rD   )r4   rÌ   r°   rÛ   ÚstlÚdiagrÏ   r´   ÚsurfÚslÚntÚncr�   r•   r“   ÚtÚremapÚetÚenodrØ   ÚtyÚndrq   Úfsrb   ÚfirstrO   ÚbfÚVbÚFbs                                 r!   Ústrat_E2r  Ù   s£  € ãðÜ—‘˜A˜rÓ"‰ˆˆ2ô �'‰'�,‰,”s˜2“w Ó
)€CÜ‡K�K��Q˜ÔÜ”—‘—‘¤§¡ q¨qÔ 1Ó2Ó3€DØ‡O�OÔØ€DðØ�‰×ÑÐ0°!Ô4Ø�‰×ÑÐ<¼cÀ$ÈÁ,ÐPTÓ>UÔVØ�‰×ÑÐ<¼cÀ$ÈÁ+ÈtÓ>TÔUØ�
‰
�3ŒØ�
‰
�‰×(Ñ(¨´·±©¸Ñ)=¸tÀTÈ5ÔSU×SXÑSXÉ=Ð[`ÑK`ÔaØ�
‰
�‰×&Ñ&Ô(Ø"Ÿj™j×4Ñ4°QÔ7Ó8Ñ7˜��!“Ð7ˆÐ8Ü # D£	ˆˆ_ÑØ�Z‰Z�^‰^×*Ñ*¨4Ó0ˆØ�
‰
�‰× Ñ  " Ô&Ø�
‰
�‰×"Ñ"Ô$Ø�
‰
�‰× Ñ  Ô#Ø—J‘J—O‘O×,Ñ,Ó.‰	ˆˆB�Ü�j‰j˜œUÓ#×+Ñ+¨B°Ó2ˆÜ'0°¤}Ô5¡}™t˜q !”�Q“˜‘ }ˆÑ5Ø—j‘j—o‘o×1Ñ1°!Ó4‰ˆˆAˆtØˆÜ˜"˜d–m‰FˆB�Ü�2‹w˜!‹|Ü—z‘z¹"Ó"=¹"°Q 5¬¨Q«£=¸"Ñ"=¼r¿x¹xÓH×PÑPÐQSÐUVÓW‘ð $ð ˆ<œs 4œyÜÐ4Ó5Ð5Üœ3˜t›9“~ˆˆV‰à�‰Œä	�‰�DššI˜Ñ&¨ªQ²	¨\Ñ(:ØššI˜Ñ&¨ªQ²	¨\Ñ(:ð<ó 
=€Bä
�'‰'�"˜1Ô
€CÜ—I‘I˜c¨¸ÈDÔQ�M€A€uˆcØ	ˆE�#˜‘(‰OÑ	€BÜ�[‰[˜˜R™Ÿ™¨¨QÓ/Ó0�F€BˆØˆr�4ˆ<ÐøôQ ò Úðüò 9ùó 6ùò
 #>øð
 	�‰�úsQ   †Q/ Â/DR Æ?Q?ÇDR ËRË%AR Ì4R ÍR

ÍAR Ñ/	Q<Ñ;Q<Ñ?R ÒR!c                 óÌ  — ddl }t        j                  | |«      }t        t        j
                  j                  t	        j                  | d¬«      «      «      }t        t        |d   «      dz  |dz  d«      }t        t        |d   «      d«      t        |d	«      t        |d
«      dœ}|j                  t	        j                  | t        «      t	        j                  |t        j                  «      d¬«      }|j                  |¬«      }		 |	j                  «       }	t!        |	j"                  «      |d<   |	j$                  }
|
j'                  |	j(                  «       t	        j                  |
j*                  t        «      }t	        j                  |
j,                  t        j                  «      }	 t        j.                  ||«      \  }}|||fS # t        $ r Y Œ»w xY w# t        $ r Y Œw xY w)u8   ë²½ë‘�ê»˜/3 í•´ìƒ�ë�„ë¡œ ë³µì…€í™” í›„ í‘œë©´ ìž¬ì¶”ì¶œ.r   Nrj   r¤   g      @g      y@rÖ   r,   r›   rl   )Úwall_mm_srcÚpitch_mmÚbbox_diag_mmF)rÈ   ÚfacesÚprocess)ÚpitchÚvoxels)Útrimeshr5   r«   r>   r<   rÝ   rÞ   rß   rã   r¬   ÚTrimeshr=   re   Ú	voxelizedÚfillr­   rA   Úfilled_countÚmarching_cubesÚapply_transformÚ	transformrÈ   r
  rÊ   )r4   rÌ   r°   r  Úmetrõ   r  rÏ   r³   ÚvgÚsmrÑ   rÒ   s                r!   Ústrat_E3r    s‡  € ãÜ
�.‰.˜˜BÓ
€CÜ”—‘—‘¤§¡ q¨qÔ 1Ó2Ó3€Dô ”�c˜)‘nÓ%¨Ñ+¨T°E©\¸4Ó@€EÜ ¤ s¨9¡~Ó!6¸Ó:Ü˜e Q›¼¸tÀQ»ñI€Dà�‰¤§¡¨A¬uÓ!5Ü Ÿj™j¨¬R¯X©XÓ6Àð 	ó 	G€Aà	
�‰˜5ˆÓ	!€BðØ�W‰W‹Yˆô ˜Ÿ™Ó)€Dˆ�NØ	×	Ñ	€Bð ×Ñ�r—|‘|Ô$Ü	�‰�B—K‘K¤Ó	'€BÜ	�‰�B—H‘HœbŸh™hÓ	'€BðÜ—‘˜R Ó$‰ˆˆBð ˆr�4ˆ<Ðøô ò Ùðûô ò Ùðús$   ÄG Æ*G Ç	GÇGÇ	G#Ç"G#©ÚE1ÚE2ÚE3c                  óü  — t        t        «       g } t        «       D �]@  }t        |d   |d   «      }|d   |d   }}t	        j
                  t        |«      ||¬«       t        j                  ||«      }t        |«      r.t        t	        j                  |d¬«      j                  «       «      nd}t        t        j                  j                  t         d	|«      «      }t#        j"                  «       }	 t        j$                  |||«      \  }	}
}d }|j/                  d«      r-t        |
«      r"	 t1        t        t3        |	|
||«      «      d«      }| j5                  ||d   |d   |d   t7        t        |«      «      t7        t        |«      «      t9        |d   «      t7        |d   «      t1        t        |d   «      d«      t1        t        |d   «      d«      t1        |d«      ||t1        t#        j"                  «       |z
  d«      dœ«       t;        d|d›d| d   d   d d d›d| d   d   d›d|›d|›�
d ¬!«       t=        j>                  | tA        tB        d"d#¬$«      d%d¬&«       �ŒC tE        d'„ | D «       «      }t;        d(t        | «      |fz  «       | S # t&        $ rU}t	        j(                  d
«      t	        j(                  d
t        j*                  «      dt-        |«      d d z  }}
}	Y d }~�ŒÚd }~ww xY w# t&        $ r Y �Œ®w xY w))Nr1   r2   r4   r5   )r4   r5   r   rj   rn   Úbase)r   r,   úfail(%s)r¢   úH r,   r3   r¥   Ú	bad_edgesr¤   r¦   r/   )rb   r1   r2   r3   r™   rš   r¥   r"  r¤   r¦   Úemin_mmÚladder_methodÚhull_max_dev_mmÚsecu	   [ê¸°ì¤€] Ú7Ú r+   r   Ú18u    ë‹«íž˜=Ú5u    ì‚¬ë‹¤ë¦¬=u    ê»�ì§ˆì�´íƒˆ=T©ÚflushÚwr%   r&   F©Úensure_asciiÚindentc              3   óJ   K  — | ]  }|d    j                  d«      sŒd–— Œ y­w)r$  r!  r/   N)Ú
startswith)rp   r²   s     r!   rr   zrun_baseline.<locals>.<genexpr>S  s#   è ø€ ÐD™�1  /Ñ 2× =Ñ =¸dÕ CŒQ™ùs   ‚#œ#u&   ë�©ì–´ë¦¬ %dê°œ ì¤‘ ê»�ì§ˆëŒ€ì²´ %dê°œ)#r"   ra   r\   r_   r<   Úsavez_compressedrc   r5   r«   rG   r>   rß   rx   r   r6   r7   ÚEXP_ROOTÚtimeÚrepair_for_tetr­   Úzerosre   r®   r2  r¬   r—   rB   rA   r¨   Úprintr9   Údumpr;   Ú	BASE_JSONÚsum)rP   Úitrb   r4   rÌ   r  r¯   r°   Út0r‚   rƒ   Úmethr´   Úhull_devÚnhs                  r!   Úrun_baselinerA  2  sŽ  € ÜŒ„LØ€DÜ�oˆÜ�r˜$‘x  F¡Ó,ˆØ�3‘˜˜C™ˆ2ˆÜ
×ÑœH S›M¨Q°"Õ5Ü�n‰n˜Q Ó#ˆÜ14°Q´Œu”R—V‘V˜A AÔ&×*Ñ*Ó,Ô-¸SˆÜ”—‘—‘œh¨°Ó4Ó5ˆÜ�Y‰Y‹[ˆð	bÜ×+Ñ+¨A¨r°2Ó6‰LˆB��Dð ˆØ�?‰?˜4Ô ¤S¨¤WðÜ ¤¤~°b¸"¸aÀÓ'DÓ!EÀqÓI�ð 	�‰˜C r¨$¡x¸¸F¹ÈRÐPVÉZÜœs 1›v›;¬c´#°b³'«lÜ# C¨¡MÓ2ÄÀSÈÑEUÓAVÜ %¤e¨C°	©NÓ&;¸QÓ ?Ü#(¬¨s°<Ñ/@Ó)AÀ1Ó#EÜ % d¨A£Ø&*¸xÜ!¤$§)¡)£+°Ñ"2°AÓ6ñ8ô 	9õ 	Û�d˜2‘h˜vÑ& s¨Ó+¨T°"©X°hÔ-?ÂÁxðQØX\õ	^ä�	‰	�$œœY¨°gÔ>Ø$¨Q÷	0ð9 ô< 
ÑD™ÓDÓ	D€BÜ	Ð
2´c¸$³iÀ°_Ñ
DÔEØ€Køô- ò 	bÜŸ8™8 FÓ+¬R¯X©X°f¼b¿h¹hÓ-GÈÔVYÐZ[ÓV\Ð]`Ð^`ÐVaÑIa�D�ŽBûð	bûô ò Úðús+   Ã1JÄ+!K.Ê	K+ÊA
K&Ë&K+Ë.	K;Ë:K;c                 óä  — t        | «      \  }}t        |«      r.t        t        j                  |d¬«      j                  «       «      nd}t        t        j                  j                  t        d| dz   |z   «      «      }t        j                  «       }	 t        |   |||«      \  }}}	t'        |||||||«      }|	|d<   t%        t        j                  «       |z
  d
«      |d<   t        dt        j                   |d¬«      z   «       y# t        $ ra}
t        dt        j                   ddd dt#        |
«      d d	 z  t%        t        j                  «       |z
  d
«      dœd¬«      z   «       Y d }
~
yd }
~
ww xY w)Nr   rj   rn   Úcr�   ú
@@RESULT@@Fr   éŒ   r/   )r�   rž   rŸ   r    r&  )r/  rÏ   r&  )rg   rG   r>   r<   rß   rx   r"   r   r6   r7   r4  r5  ÚSTRATSr­   r8  r9   Údumpsr®   r¬   rµ   )rb   Ústratr4   rÌ   r¯   r°   r=  r‚   rƒ   rÏ   r´   r²   s               r!   Úrun_cellrI  [  s?  € Ü�S‹M�E€A€rÜ-0°¬VŒ5”—‘˜ Ô"×&Ñ&Ó(Ô)¸€DÜ	ŒR�W‰W�\‰\œ( C¨¨s©°UÑ):Ó;Ó	<€BÜ	�‰‹€BðÜ˜e‘} Q¨¨BÓ/‰ˆˆB�ô 	��B˜˜2˜t R¨Ó/€AØ€A€f�IÜ”T—Y‘Y“[ 2Ñ% qÓ)€A€e�HÜ	ˆ,œŸ™ A°EÔ:Ñ
:Ô;Øøô ò ÜˆlœTŸZ™ZØ¨5ÀØ¤# a£&¨¨# ,Ñ.´u¼T¿Y¹Y»[È2Ñ=MÈqÓ7QñSàô ñ  ô 	!ô ûðús   ÂD Ä	E/ÄAE*Å*E/c                 óV  — t        j                  t        t        d¬«      «      }|D �cg c]  }|d   j	                  d«      sŒ|d   ‘Œ }}| r|D �cg c]	  }|| v sŒ|‘Œ }}|xs g d¢}i }t
        j                  j                  t        «      r%	 t        j                  t        t        d¬«      «      }|D �]-  }|D �]$  }	|j                  |	i «      j                  |«      rŒ&t        j                  t
        j                  j                  t        «      dd|	d	|g}
t        j                  «       }	 t!        j"                  |
d
d
ddt$        t&        ¬«      }|j(                  xs dj+                  «       D �cg c]  }|j	                  d«      r|‘Œ }}|r%t        j,                  |d   t/        d«      d  «      }nMddd d|j0                  ›d|j2                  xs dj5                  «       j+                  «       xs dgd   d d ›d�dœ}|j9                  dt;        t        j                  «       |z
  d«      «       ||j9                  |	i «      |<   t        j<                  |t        t        dd¬«      dd¬«       t?        d|	›d|›d|j                  d«      ›d|j                  d «      ›d!|j                  d"«      ›d|j                  d#d«      ›d$|j                  d«      ›d%�d
¬&«       �Œ' �Œ0 |S c c}w c c}w # t        $ r i }Y �ŒMw xY wc c}w # t         j6                  $ r ddd ddœ}Y �Œ$w xY w)'Nr%   r&   r$  r!  rb   r  ú--cellú--keyú--stratTÚreplace)Úcapture_outputÚtextr'   Úerrorsr£   Úcwdr0   rD  r+   Fu   fail(ê²°ê³¼ì—†ì�Œ rc=r(  éd   Ú)rœ   r£   r&  r/   r-  r.  Ú[Ú/z	] tetgen=r�   u    ë²½ê²Œì�´íŠ¸=rž   u    ì�´íƒˆ=rŸ   r    z (zs)r+  ) r9   r:   r;   r:  r2  r   r6   ÚisfileÚRES_JSONr­   r@   ÚsysÚ
executableÚabspathÚ__file__r5  Ú
subprocessÚrunÚCELL_TIMEOUT_SÚHEREÚstdoutÚ
splitlinesÚloadsrG   Ú
returncodeÚstderrÚstripÚTimeoutExpiredrw   r¬   r9  r8  )Ú	only_keysÚonly_stratsr  rT   Úkeysrm   ÚstratsÚresÚstrb   Úcmdr=  ÚprÚlrQ   r²   s                   r!   Ú	run_sweeprq  o  sÆ  € Ü�9‰9”Tœ)¨gÔ6Ó7€DÙ"ÓJ™d˜ a¨Ñ&8×&CÑ&CÀDÕ&IˆAˆe‹H˜d€DÐJÙÙÓ2™4�a 1¨	¢>’˜4ˆÐ2ØÒ.Ò.€FØ
€CÜ	‡w�w‡~�~”hÔð	Ü—)‘)œD¤°GÔ<Ó=ˆCô ˆÜˆCØ�w‰w�s˜BÓ×#Ñ# BÔ'ØÜ—>‘>¤2§7¡7§?¡?´8Ó#<¸hØ˜C ¨Bð0ˆCä—‘“ˆBð(Ü—^‘^ C¸À4Ø-4¸YÜ,:ÄôF�ð $&§9¡9¢?°×">Ñ">Ô"@ó 6Ñ"@˜QØŸ,™, |Ô4ò Ð"@�ð 6áÜŸ
™
 3 r¡7¬3¨|Ó+<Ð+=Ð#>Ó?‘Aà#(°uÉDà$&§M£MØ&(§i¡i¢o°2×%<Ñ%<Ó%>×%IÑ%IÓ%KÒ%SÐPRÈtÐUWÑ$XÐY]ÐZ]Ò$^ð"`ña�Að �L‰L˜¤¤d§i¡i£k°BÑ&6¸Ó :Ô;Ø*+ˆC�N‰N˜3 Ó# BÑ'Ü�I‰I�cœ4¤¨#¸Ô@Ø#(°õ4åÚš"˜aŸe™e H�o¨q¯u©u°[Õ/AØ—U‘U˜<Õ(¨!¯%©%°¸Õ*;¸Q¿U¹UÀ5½\ðKàRV÷Xò5 ð ð< €JùòS Kùâ2øô ò 	Ø‹Cð	üò6øô ×,Ñ,ò (Ø$°5ÈØ&ñ(“ð(úsO   ©K)ÁK)Á	K.ÁK.Â$K3 Ä/AL
Å3LÆA6L
Ë3LÌLÌL
Ì
L(Ì'L(c                 ó  — | sy| j                  d«      dk(  ry| j                  d«      xs d}|j                  d«      rd|z  S | j                  d«      }| j                  d	«      rd
nd›d| j                  d«      rd
nd›d|�d|z  ›�S d›�S )Nu   â€” | â€” | â€”r    r£   ztimeout | timeout | timeoutr0   Úfailu   %s | â€” | â€”rŸ   r�   ÚOÚXú | rž   z%.2fu   â€”)r@   r2  )r²   ÚnÚdevs      r!   Ú	_cell_txtry     s£   € ÙØ Ø‡u�uˆVƒ}˜	Ò!Ø,Ø	�‰ˆf‹Ò˜€AØ‡|�|�FÔØ !Ñ#Ð#Ø
�%‰%�Ó
€CØ$%§E¡E¨(¤O™S¸Ñ<Ø$%§E¡E¨+Ô$6™S¸CÑ?Ø/2¨˜f s™lÐIðKð KàDIÐIðKð Kr#   c                  ó`  — t        j                  t        t        d¬«      «      } t        j                  t        t        d¬«      «      }d}t        |«       t        d«       dD �ci c]  }|dddœ“Œ
 }}dD �ci c]  }|d“Œ }}| D ]î  }|d   j                  d	«      sŒg }dD ]”  }|j                  |d
   i «      j                  |«      }|j                  t        |«      «       |sŒD|j                  d«      sŒV||   dxx   dz  cc<   |j                  d«      sŒx||   dxx   dz  cc<   ||xx   dz  cc<   Œ– t        d|d
   ›d|d   ›d|j                  d«      ›ddj                  |«      ›d�	«       Œð t        «        dD ]  }t        d|||   d   ||   d   fz  «       Œ! y c c}w c c}w )Nr%   r&   u|   | ë¶€í’ˆ | ì�´ë¦„ | ê»�ì§ˆì�´íƒˆ | E1 tet | E1 ë²½ | E1 ì�´íƒˆ | E2 tet | E2 ë²½ | E2 ì�´íƒˆ | E3 tet | E3 ë²½ | E3 ì�´íƒˆ |z1|---|---|---|---|---|---|---|---|---|---|---|---|r  r   )ÚtetÚwallr$  r!  rb   r�   r{  r/   rž   r|  z| rv  r3   r%  z |u5   - %s: tetgen í†µê³¼ %d / ë²½ê²Œì�´íŠ¸ê¹Œì§€ í†µê³¼ %d)r9   r:   r;   r:  rX  r8  r2  r@   rB   ry  r7   )	r  rl  ÚhdrÚsrO   ÚsavedrT   Úcellsr²   s	            r!   Ú	run_tabler�  ®  sŸ  € Ü�9‰9”Tœ)¨gÔ6Ó7€DÜ
�)‰)”Dœ¨GÔ4Ó
5€CðI€Cä	ˆ#„JÜ	Ð
ÔÙ-?Ó
@Ñ-?¨ˆ1�a Ñ#Ñ#Ð-?€CÐ
@Ù-Ó.Ñ-�aˆQ�‰TÐ-€EÐ.ÛˆØ�Ñ!×,Ñ,¨TÔ2ØØˆÛ#ˆAØ—‘˜˜%™ "Ó%×)Ñ)¨!Ó,ˆAØ�L‰Lœ 1›Ô&Ú�Q—U‘U˜8•_Ø�A‘�u“ Ñ"“Ø—5‘5˜Õ%Ø˜‘F˜6“N aÑ'“NØ˜!“H ‘M”Hð $õ 	¨¨5«°1°V³9Ø)*¯©Ð/@Õ)AÀ5Ç:Á:ÈeÕCTðVõ 	Wð ô 
„GÛˆÜÐEØ�C˜‘F˜5‘M 3 q¡6¨&¡>Ð2ñ3õ 	4ñ  ùò# AùÚ.s   Á%F&Á8
F+Ú__main__z
--baselineÚ
store_true)Úactionz--sweeprK  z--tablerL  rM  )rh  ri  )é    )NN)7Ú__doc__Úargparser9   r   r]  rY  r5  Únumpyr<   r6   ÚinsertÚdirnamer[  r\  Ú
fea_serverr5   rC   r`  r7   r8   r4  ra   r:  rX  r_  r"   r\   r_   rc   rg   r—   rµ   rÔ   r  r  rF  rA  rI  rq  ry  r�  Ú__name__ÚArgumentParserÚapÚadd_argumentÚ
parse_argsrS   ÚbaselineÚcellÚexitrb   rH  ÚsweepÚtableÚ
print_helpr^   r#   r!   Ú<module>r—     s9  ðñó2 Û Û 	Û Û 
Û ã à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Û ò@€
ð 
‡w�w‡��r—w‘w—‘ xÓ0Ó1€à�7‰7�<‰<˜Ÿ™ ZÓ0€Ø
�'‰'�,‰,�x Ó
'€Ø�G‰G�L‰L˜Ð?Ó@€	Ø�7‰7�<‰<˜Ð<Ó=€Ø€òòò< ò2òCó-ò`ò6 òF0òfð@  °Ñ	9€ò#òRó(+òbKò4ð: ˆzÓØ	 ˆ×	 Ñ	 Ó	"€BØ‡O�O�L¨€OÔ6Ø‡O�O�I l€OÔ3Ø‡O�O�H \€OÔ2Ø‡O�O�I l€OÔ3Ø‡O�O�GÔØ‡O�O�IÔØ
�‰‹€AÙˆ„MØ‡z‚zÙ�Ø	
�ŠØˆ�‰‘˜!Ÿ%™% §¡Ó)Õ*Ø	
�ŠÙ q§u¢u˜QŸU™U™G°$Ø+,¯7ª7˜qŸw™w˜iö	>Ø8<ö	>à	
�ŠÙ�à
�‰�ð) r#   