Ë
    Ä€§jgS  ã                  ó  — d Z ddlmZ ddl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mZ ddlZddlZddlmZ ddlmZ dd	lmZ d
dgej4                  d<   dej4                  d<   dddœZ ej8                  g d¢ej:                  «      Zdd„Zd d„Z 	 	 	 	 	 	 d!d„Z!d"d„Z"d#d„Z#	 	 	 	 d$d„Z$d%d„Z%	 	 	 	 d&d„Z&	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d'd„Z'd(d„Z(d)d„Z)e*dk(  r e)«        yy)*a+  Match STEP/CAD, process XLS data, measured PLY, and defect CSV by run.

The exported arrays are diagnostic supervision scaffolds.  The supplied CSVs
contain a point but no defect width/height, and scan-to-CAD registration is not
independently validated, so ``training_valid`` is deliberately false.
é    )ÚannotationsN)ÚPathÚAgg)ÚLineCollection)Ú
coo_matrix)Údijkstra)ÚcKDTreezApple SD Gothic NeozDejaVu Sanszfont.familyFzaxes.unicode_minusÚ
16h_mirrorÚ18h01)Ú16hr   )g      @g      $@g      4@c                 óV   — t        t        «      j                  «       j                  d   S )Né   )r   Ú__file__ÚresolveÚparents© ó    õ   ì „ì²˜ë¦¬/match_targets.pyÚroot_defaultr   !   s    € Ü”‹>×!Ñ!Ó#×+Ñ+¨AÑ.Ð.r   c                óF   — | |d d…d d…f   j                   z  |d d…df   z   S )Né   )ÚT)ÚpointsÚmatrixs     r   Ú	transformr   %   s4   € Ø�F˜2˜A˜2˜r ˜r˜6‘N×$Ñ$Ñ$ v¨b¨q¨b°!¨e¡}Ñ4Ð4r   c                ó°   — t        ||d   |d   ff| | f¬«      j                  «       }t        j                  t	        |d|¬«      t        j
                  «      S )Nr   r   )ÚshapeF)ÚdirectedÚindices)r   ÚtocsrÚnpÚasarrayr   Úfloat32)Ú
node_countÚ
edge_indexÚedge_lengthÚseedÚgraphs        r   Úgeodesic_distancer)   )   sP   € ä˜ j°¡m°ZÀ±]Ð%CÐDØ(¨*Ð5ô7ß7<±u³wð 
ä�:‰:”h˜u¨u¸dÔCÄRÇZÁZÓPÐPr   c                óè  — | j                  dd¬«      5 }t        t        j                  |«      «      }d d d «       t	        «      dk7  rt        d| › dt	        |«      › �«      ‚|d   }t        |d   «      t        |d	   «      g|j                  d
d«      j                  «       rt        |d
   «      nd |j                  dd«      j                  «       rt        |d   «      nd |d   dœS # 1 sw Y   Œ¶xY w)Nz	utf-8-sigÚ )ÚencodingÚnewliner   z$Expected one supplied defect row in z; got r   ÚXÚYÚWÚHÚError)Úpixel_xyÚwidth_pxÚ	height_pxÚclass)	ÚopenÚlistÚcsvÚ
DictReaderÚlenÚ
ValueErrorÚfloatÚgetÚstrip)ÚpathÚstreamÚrowsÚrows       r   Úread_defect_csvrD   0   sÖ   € Ø	�‰˜K°ˆÔ	4¸Ü”C—N‘N 6Ó*Ó+ˆ÷ 
5ä
ˆ4ƒy�A‚~ÜÐ?À¸vÀVÌCÐPTËIÈ;ÐWÓXÐXØ
ˆq‰'€Cä˜3˜s™8“_¤e¨C°©H£oÐ6Ø'*§w¡w¨s°BÓ'7×'=Ñ'=Ô'?”E˜#˜c™(”OÀTØ(+¯©°°RÓ(8×(>Ñ(>Ô(@”U˜3˜s™8”_ÀdØ�W‘ñ	ð ÷ 
5Ð	4ús   ”C(Ã(C1c                ó8  — t         j                  j                  t        | «      «      }|j	                  «        |j                  «        t         j                  j                  j                  «       }|j                  t         j                  j                  j                  j                  |«      «       |j                  t         j                  j                  |j                  t         j"                  «      «      «      }|d   j%                  «       }|d   j%                  «       }||z
  }|t         j&                  j)                  |d¬«      j                  t         j"                  «      t!        j*                  d||«      j                  t         j"                  «      fS )Nr   Úprimitive_normalsr   )Úaxisúij,ij->i)Úo3dÚioÚread_triangle_meshÚstrÚremove_duplicated_verticesÚcompute_triangle_normalsÚtÚgeometryÚRaycastingSceneÚadd_trianglesÚTriangleMeshÚfrom_legacyÚcompute_closest_pointsÚcoreÚTensorÚastyper!   r#   ÚnumpyÚlinalgÚnormÚeinsum)Ú	mesh_pathr   ÚmeshÚsceneÚhitÚclosestÚnormalsÚdeltas           r   Úclosest_cadrd   >   s  € Ü�6‰6×$Ñ$¤S¨£^Ó4€DØ×#Ñ#Ô% t×'DÑ'DÔ'FÜ�E‰E�N‰N×*Ñ*Ó,€EØ	×ÑœŸ™Ÿ™×3Ñ3×?Ñ?ÀÓEÔFØ
×
&Ñ
&¤s§x¡x§¡°v·}±}ÄRÇZÁZÓ7PÓ'QÓ
R€CØ�(‰m×!Ñ!Ó#€GØÐ%Ñ&×,Ñ,Ó.€GØ�WÑ€EØ”B—I‘I—N‘N 5¨q�NÓ1×8Ñ8¼¿¹ÓDÄbÇiÁiØ�E˜7óG$ß$*¡F¬2¯:©:Ó$6ð7ð 7r   c                óÞ  — t        | «      D ��ci c]$  \  }}t        |«      j                  dd«      d   |“Œ& }}}t        j                  dt        j
                  t        j                  «      }t        j                  dt        j
                  t        j                  «      }t        dd«      D ]5  }d|fd|ffD ](  \  }	}
|	› |d›�}||v sŒ|||      sŒ|||      |
|dz
  <   Œ* Œ7 ||fS c c}}w )	Nz [r   r   é   é   u   ìƒ�ë¶€ì˜¨ë�„u   í•˜ë¶€ì˜¨ë�„Ú02d)Ú	enumeraterL   Úsplitr!   ÚfullÚnanr#   Úrange)ÚnamesÚvaluesÚvalidÚiÚnameÚlookupÚtopÚbottomÚzoneÚprefixÚtargetÚkeys               r   Úheater_valuesrz   K   sç   € ä<EÀeÔ<LÔMÑ<L±°°DŒc�$‹i�o‰o˜d AÓ& qÑ)¨1Ñ,Ð<L€FÑMÜ
�'‰'�"”b—f‘fœbŸj™jÓ
)€CÜ�W‰W�RœŸ™¤§¡Ó,€FÜ�a˜–ˆØ .°Ð4°~ÀvÐ6NÓO‰NˆF�FØ�H˜T #˜JÐ'ˆCØ�fŠ}  v¨c¡{Ó!3Ø#)¨&°©+Ñ#6��t˜a‘xÒ ñ Pð ð
 �ˆ;Ðùó Ns   �)C)c                óà  — t        j                  | t         j                  «      }|j                  «       }t        j                  |«      }t        j
                  |j                  t        «      }t        j                  |«      }t        |«      dk  r||fS t        j                  | «      }|||d   kD  ||d   k  z     }t        |«      r"t        j                  ||||   «      ||<   d||<   ||fS )zHFill only NaNs bracketed by valid heater zones; never extrapolate edges.é   r   éÿÿÿÿT)r!   r"   r#   ÚcopyÚisfiniteÚzerosr   ÚboolÚflatnonzeror;   Úinterp)ro   ÚrawÚfilledÚobservedÚimputedÚvalid_indexÚ
candidatess          r   Úinterpolate_between_heatersrŠ   X   sÑ   € ä
�*‰*�VœRŸZ™ZÓ
(€CØ�X‰X‹Z€FÜ�{‰{˜3Ó€HÜ�h‰h�s—y‘y¤$Ó'€GÜ—.‘. Ó*€KÜ
ˆ;Ó˜!ÒØ�wˆÐÜ—‘  	Ó*€JØ˜Z¨+°a©.Ñ8¸ZÈ+ÐVXÉ/Ñ=YÑZÑ[€JÜ
ˆ:„ÜŸY™Y z°;ÀÀKÑ@PÓQˆˆzÑØ"ˆ�
ÑØ�7ˆ?Ðr   c                ó`  — t        t        j                  | dd…df   «      «      }t        j                  | dd…df   | dd…df   j	                  «       z
  t        |d«      z  dz  «      j                  t        j                  «      }t        j                  |dd«      }|||   ||   ||z
  |   fS )zJUniform X-bin projection used only until physical heater footprints exist.Nr   g•Ö&è.>rf   é   )	r=   r!   ÚptpÚfloorÚminÚmaxrX   Úint32Úclip)Úcadrt   ru   Úscalerv   s        r   Úprovisional_heater_projectionr•   i   s�   € ô ”"—&‘&˜šQ ˜T™Ó#Ó$€EÜ�8‰8�Sš˜A˜‘Y ¢Q¨ T¡§¡£Ñ0´C¸¸tÓ4DÑDÀrÑIÓJ×QÑQÔRT×RZÑRZÓ[€DÜ�7‰7�4˜˜BÓ€DØ��T‘˜F 4™L¨3°©<¸Ñ*>Ð>Ð>r   c                ó  — | j                   j                  dd¬«       t        j                  dddd¬«      \  }}|j	                  «       }t        j                  d|j                  d   d«      }t        j                  ||d|f      d d …ddgf   ||d|f      d d …ddgf   gd«      }t        j                  ||	g«      }|t        j                  |«         }|d   j                  |d	d
t        |j                  «       «      t        |j                  «       «      ¬«      }|d   j                  ddgddg«       |d   j                  t!        d«      t!        dd«      «       |d   j#                  d«       |d   j%                  d«       |j'                  ||d   d¬«       t        t        j(                  |«      «      }t!        d«      D ]„  }t!        d«      D ]t  }|||f   }t        j                  |«      r;|dk(  r|
n||   }|r|d›d�n|d›}|d   j+                  |||ddd||k  rdnd¬«       ŒZ|d   j+                  ||ddddd¬«       Œv Œ† |d d …df   t        j,                  d«      k\  }t/        dd
t        |j                  «       «      t        |j                  «       «      ¬ «      }|d   |d!f|d   |d"ffD ]�  \  }} }! |j0                  |d d …df   |d d …df   fd#| i|¤Ž}"|j1                  ||df   ||df   dd$d%d&¬'«       |j1                  |d   |d   d(d)d%¬*«       |j%                  |!d+z   «       |j'                  |"|d¬«       Œ‘ |t        j                  |«         }#t        t3        |#«      r1t        t        j                  t        j4                  |#«      «      «      nd,d,«      }$|d   j1                  |d d …df   |d d …df   |dd-|$ |$¬.«      }"|d   j1                  ||df   ||df   dd$d%d&¬'«       |d   j1                  |d   |d   d(d)d/¬*«       |d   j%                  d0«       |j'                  |"|d   d1¬«       t        j6                  dt3        |«      dz
  t        d2t3        |«      «      t8        ¬3«      }%|d4   j1                  ||%df   ||%df   ||%   d5d6dt        t        j:                  |d7«      «      ¬.«      }|j'                  ||d4   d8¬«       |d4   j%                  d9«       |d:   j=                  t?        |d;d<d=¬>«      «       |d:   j1                  |d d …df   |d d …df   |d d …df   dd?dd¬.«       |d:   j1                  |d   |d   d@d)dA¬*«       |d:   jA                  «        |d:   j%                  dB«       |dd  D ]5  }|jC                  dC«       |j#                  dD«       |jE                  dE«       Œ7 |jG                  |› dF�|z   «       |jI                  | dG¬H«       t        jJ                  |«       y )INT©r   Úexist_okr|   r   )rf   é
   )ÚfigsizeÚconstrained_layoutr   r   ÚautoÚinferno)ÚaspectÚcmapÚvminÚvmaxu   upper / ìƒ�ë¶€u   lower / í•˜ë¶€rf   rg   zheater zone numberu5   2Ã—17 sandwich heater map (* = linearly interpolated)u   temperature (Â°C))ÚaxÚlabelz.1fÚ*z.0fÚcenteré   ÚwhiteÚblack)ÚhaÚvaÚfontsizeÚcolorÚNAÚcyanç      à¿gš™™™™™@)ÚsrŸ   r    r¡   zupper heater overlayzlower heater overlayÚcÚnonez#00e5ffgffffffæ?)r°   Ú
facecolorsÚ
edgecolorsÚ
linewidthséF   Úx)r°   Úmarkerr±   z
cyan = weak 10 mm AOIg      ð?Úcoolwarm)r±   r°   rŸ   r    r¡   z#111u0   upper âˆ’ lower heater overlay
AOI shown in cyanu   temperature difference (Â°C)i˜:  )Údtypeé   gš™™™™™Ù?Úviridisé_   z!nearest CAD surface distance (mm)zCregistered measured PLY
deformation proxy, not tracked displacementé   g¸…ëQ¸¾?z#55768bg      Ð?)rµ   ÚcolorsÚalphaÚmagmaé<   z#00bcd4zBweak 10 mm geodesic area label
assumed radius, not observed extentÚequalz
CAD X (mm)z
CAD Z (mm)u”   : STEP + XLS heaters matched to PLY + defect CSV
CAD overlay assumes heater 01â†’17 uniformly ordered along CAD X; physical footprints are required
é–   )Údpi)&ÚparentÚmkdirÚpltÚsubplotsÚravelr!   Úaranger   Ústackr   Úimshowr=   r�   r�   Ú
set_yticksÚ
set_xticksrm   Ú
set_xlabelÚ	set_titleÚcolorbarÚnanmeanÚtextÚexpÚdictÚscatterr;   ÚabsÚlinspaceÚintÚ
percentileÚadd_collectionr   Ú	autoscaleÚ
set_aspectÚ
set_ylabelÚsuptitleÚsavefigÚclose)&r@   Úrunr“   ÚedgesÚscanÚscan_absÚweakÚanchorrt   ru   Útop_imputedÚbottom_imputedÚnode_topÚnode_bottomÚ
node_deltaÚnoteÚfigÚaxesÚtakeÚsegÚtempÚfiniteÚimageÚmidpointrC   ÚcolÚvalueÚwas_imputedr£   ÚaoiÚcommonr¢   ro   ÚtitleÚdrawÚdelta_finiteÚ	delta_limÚshows&                                         r   Úpreviewr  r   sí  € ð 	‡K�K×Ñ˜d¨TÐÔ2Ü—‘˜Q ¨8ÈÔM�I€CˆØ�:‰:‹<€DÜ�9‰9�Q˜Ÿ™ A™¨Ó*€DÜ
�(‰(�C˜˜a ˜g™Ñ'ª¨A¨q¨6¨	Ñ2°C¸¸aÀ¸g¹Ñ4GÊÈAÈqÈ6È	Ñ4RÐSÐUVÓ
W€Cä�8‰8�S˜&�MÓ"€DØ”"—+‘+˜dÓ#Ñ$€FØ�‰G�N‰N˜4¨°YÜ % f§j¡j£lÓ 3¼%ÀÇ
Á
ÃÓ:Mð ó O€Eàˆ�G×Ñ˜˜1�vÐ 0Ð2BÐCÔDØˆ�G×Ñ”u˜R“y¤%¨¨2£,Ô/°°a±×1CÑ1CÐDXÔ1YØˆ�G×ÑÐMÔNØ‡L�L�˜4 ™7Ð*=€LÔ>Ü”R—Z‘Z Ó'Ó(€HÜ�QŽxˆÜ˜–9ˆCØ˜˜c˜‘NˆEÜ�{‰{˜5Ô!Ø.1°Qªh™{¸NÈCÑP�Ù+6˜5 ˜+ Q™¸uÀS¸k�Ø�Q‘—‘˜S # u°¸hÐQRØ.3°hÒ.>¡7ÀGð õ Mð �Q‘—‘˜S # t°¸XÐPQÐY_�Õ`ñ ð ð Šq�!ˆt‰*œŸ™˜s›Ñ
#€CÜ�C˜i¬e°F·J±J³LÓ.AÌÈfÏjÉjËlÓH[Ô\€FØ# A™w¨Ð2HÐIØ# A™w¨Ð5KÐLóNÑˆˆF�Eàˆr�z‰z˜#ša ˜d™) Sª¨A¨¡YÑC°&ÐC¸FÑCˆØ
�
‰
�3�s˜A�v‘;  C¨ F¡¨r¸fØ'°Bð 	ô 	8à
�
‰
�6˜!‘9˜f Q™i¨2°c¸Yˆ
ÔGØ
�‰�UÐ6Ñ6Ô7Ø�‰�T˜bÐ(;ˆÕ<ðNð œbŸk™k¨*Ó5Ñ6€LÜ¼3¸|Ô;L”Eœ"Ÿ&™&¤§¡¨Ó!5Ó6Ô7ÐRTÐVXÓY€IØ�‰7�?‰?˜3šq !˜t™9 cª!¨Q¨$¡i°:ÀÈ:Ø!* 
°ð ó <€Dàˆ�G‡O�O�C˜˜Q˜‘K  S¨! V¡°¸vØ(°Rð ô 9àˆ�G‡O�O�F˜1‘I˜v a™y¨B°s¸f€OÔEØˆ�G×ÑÐIÔJØ‡L�L�˜$˜q™'Ð)G€LÔHä�;‰;�qœ#˜d›) A™+¤s¨5´#°d³)Ó'<ÄCÔH€DØ�‰G�O‰O˜D  q ™M¨4°°a°©=¸HÀT¹NÈbØ!*°¼¼r¿}¹}ÈXÐWYÓ?ZÓ9[ð ó ]€Eà‡L�L�˜4 ™7Ð*M€LÔNØˆ�G×ÑÐ\Ô]àˆ�G×Ñœ>¨#¸#ÀiÐWZÔ[Ô\Øˆ�G‡O�O�Cš˜1˜‘I˜s¢1 a 4™y¨D²°A°©J¸!À'ÐPQÐXY€OÔZØˆ�G‡O�O�F˜1‘I˜v a™y¨B°s¸i€OÔHØˆ�G×ÑÔ˜˜a™×*Ñ*Ð+pÔqØ�1�2‹hˆØ
�‰�gÔ §¡¨lÔ ;¸R¿]¹]È<Õ=Xð à‡L�L�C�5ð xð xàñô ð ‡K�K�˜#€KÔ¤§	¡	¨#¥r   c                óª  — | dz  }| dz  }| dz  }t        j                  | dz  j                  «       «      }t        j                  | dz  j                  «       «      }t        j                  |d¬«      5 }|j
                  D �	ci c]  }	|	||	   “Œ
 }
}	d d d «       t        j                  |d¬«      5 }|j
                  D �	ci c]  }	|	||	   “Œ
 }}	d d d «       |j                  dd¬	«       |d
z  }|j                  d¬«       |j                  dd¬	«       
d   |
d   |
d   }}}|
d   d d …df   }g }t        d„ | dz  j                  d«      D «       «      }t        j                  «       D �]•  \  }}t        t        j                  d   |k(  «      d   d   «      }|d   |   }t        j                  |d   t        j                  «      }| d|› d�z  }t        j                  |d¬«      5 }|d   j                  t        j                   «      }d d d «       t#        |«      j                  t        j                   «      }t%        ||«      \  }}}t        |j                  |dk(  rdnd«      «      }t'        |«      }t        j                  ||   d   t        j                   «      } t#        | d    |«      d   j                  t        j                   «      }!t        t)        |«      j+                  |!«      d   «      }"t-        t/        |«      |||"«      }#|#d d …d f   t0        d    k  }$t        j2                  d|#d d …d f   t0        d    z  d z  z  «      j                  t        j                   «      }%t5        |d!   |d"   |   |d#   |   «      \  }&}'t7        |&«      \  }(})t7        |'«      \  }*}+t9        ||(|*«      \  },}-}.}/t)        |«      }0|0j+                  |d ¬$«      \  }1}2||2   |z
  }3t        j:                  d%|3|«      j                  t        j                   «      }4t=        |j?                  d&d«      «      }5|d'   d uxr |d(   d u}6t        j@                  t/        |«      t<        «      }7d)|5› d*|6› d+�}8||› d,�z  }9t        jB                  |9fi dt        j                  |«      “d-|“d.|“d/|“d"|d"   |   “d#|d#   |   “d!|d!   “d0|“d1|“d2|“d3|“d4|“d5|1j                  t        j                   «      “d6|4“d7t        j                  |d8   «      “d9t        j                  |d:   t        j                   «      “d;t        j                  |d'   xs t        jD                  |d(   xs t        jD                  gt        j                   «      “d<| “d=|!“d>t        j                  |"t        jF                  «      “d?|#“d@t0        “dA|$“dB|%“dC|(“dD|*“dE|&“dF|'“dGt        jH                  |&«      “dHt        jH                  |'«      “dI|)“dJ|+“dK|,“dL|-“dM|.“dN|/“dOt        j                  d«      “dP|“dQt        j                  t        jJ                  jM                  |d dR…d dR…f   «      «      “dSt        j                  |5«      “dTt        j                  |6«      “dU|7“Ž dVdWdXgdYdZgd[d\d]d^d_d`dadbdcdddedfœ
dgœ}:|9jO                  dh«      jQ                  t        jR                  |:dd ¬i«      dj¬k«       ||› dl�z  };tU        |;||||||%|!|(|*|)|+|-|.|/|8«       |jW                  i dm|“dn|“do|9jX                  “dpdq|;jX                  › �“drt[        |j]                  | «      «      “dsdt“dut[        |j]                  | «      «      “dvt[        |j]                  | «      «      “dwt/        |«      “dxt/        |«      “dy|"“dzt_        t        jJ                  jM                  |d dR…d dR…f   «      «      “dS|5“dT|6“d{t        |7ja                  «       «      “dOd“d|d}“d~dd€|8d�œ¥«       �Œ˜ d‚dƒd„d…d†œd‡dˆd‰dŠœd‹dŒd�dŽd�œ|g d�¢d‘œ}<|d’z  jQ                  t        jR                  |<dd ¬i«      dj¬k«       d“jc                  d”„ |D «       «      }=|d•z  jQ                  d–|=z   dj¬k«       |d—z  jQ                  t        jR                  |<dd ¬i«      dj¬k«       |<S c c}	w # 1 sw Y   �ŒxY wc c}	w # 1 sw Y   �ŒïxY w# 1 sw Y   �Œ¿xY w)˜Nz%data_processed/graphs/graph_12000.npzz/data_processed/tabular/process_and_geometry.npzz analysis/results/design_fine.stlz*datas_2/viewer/explorer_data/metadata.jsonz2datas_2/viewer/explorer_data/dent_annotations.jsonF)Úallow_pickleTr—   Úvisualizations)r˜   Úpos_mmÚnormalr%   Ú	edge_attrr   c              3  óB   K  — | ]  }|j                  «       sŒ|–— Œ y ­w)N)Úis_dir)Ú.0Úps     r   Ú	<genexpr>zprepare.<locals>.<genexpr>É   s   è ø€ ÐTÑE˜ÈÏÉÍ”1ÑEùs   ‚˜Údatas_2z3. CSV File*Úrun_idÚvariantsr   zanalysis/results/z_all_merge_pointcloud_full.npzr   r   z*16*.csvz*18*.csvÚ
raw_xyz_mmr   r¯   r|   Úprocess_feature_namesÚ	process_xÚprocess_feature_valid)ÚworkersrH   Úindependently_validatedr4   r5   z%registration independently validated=z; CSV defect extent observed=z6; all targets diagnostic/weak and training_valid=falsez_cad_ply_targets.npzÚ
cad_pos_mmÚ
cad_normalÚcad_edge_indexÚscan_pos_raw_mmÚscan_pos_cad_mmÚscan_closest_cad_mmÚscan_surface_distance_mmÚscan_normal_residual_mmÚcad_to_scan_distance_mmÚcad_to_scan_normal_residual_mmÚdefect_classr6   Údefect_pixel_xyr3   Údefect_width_height_pxÚdefect_anchor_raw_mmÚdefect_anchor_cad_mmÚdefect_anchor_cad_nodeÚ#geodesic_distance_to_defect_seed_mmÚweak_area_radii_mmÚweak_defect_maskÚweak_defect_probabilityÚheater_top_cÚheater_bottom_cÚheater_top_c_rawÚheater_bottom_c_rawÚheater_top_observedÚheater_bottom_observedÚheater_top_imputedÚheater_bottom_imputedÚheater_zone_index_zero_basedÚ%provisional_heater_top_c_per_cad_nodeÚ(provisional_heater_bottom_c_per_cad_nodeÚ'provisional_heater_delta_c_per_cad_nodeÚheater_projection_validÚtransform_raw_ply_to_cadÚtransform_determinantr   Ú$registration_independently_validatedÚdefect_extent_observedÚtraining_validzone physical production runz(CAD node/edge geometry derived from STEPz%XLS process values and validity masksz#fused all_merge_pointcloud_full PLYz
defect CSVz/T1/T2/TOP are registration and coverage QA onlyz3PLY point to nearest CAD surface; deformation proxyz5oriented normal component of nearest-surface residualz$CAD node to nearest fused scan pointz0CAD-node geodesic dilation at weak_area_radii_mmz.Gaussian weak label around point-only CSV seedz?upper/lower heater channels after internal linear interpolationzsource values with NaN retainedzKtrue only where an internal NaN was interpolated between valid zone numbersz/uniform CAD-X projection for visualization onlyz@false until registration and spatial target extent are validated)
r  r  r  r(  r)  zheater_top_c/heater_bottom_czheater_*_c_rawzheater_*_imputedú!provisional_heater_*_per_cad_noder;  )Úsample_unitÚmodel_inputÚpost_process_target_sourcesÚcomponent_scansÚarraysz.schema.json)Úensure_asciiÚindentzutf-8)r,   z_cad_ply_targets.pngrã   ÚposeÚnpzr  zvisualizations/Úprocess_sourceÚ
cad_sourcezdatas_2/AC28_DT RR UPR STD.stpÚ
ply_sourceÚdefect_sourceÚscan_pointsÚ	cad_nodesÚdefect_anchor_nodeÚregistration_determinantÚtraining_valid_nodesÚheater_projectionu5   provisional uniform zone 01â†’17 ordering along CAD Xznlinear interpolation only for missing zones bracketed by valid neighboring zone numbers; no edge extrapolationzBall_merge_pointcloud_full only: fused post-process surface outcomez]T1_DOWN/T1_UP/T2_LEFT/T2_RIGHT/TOP are registration, coverage, and sensor-consistency QA only)Úheater_missing_value_methodÚprimary_scan_roleÚcomponent_scan_roleÚstatuszgSTEP design + XLS process conditions -> CAD-domain defect risk/shape segmentation and deformation fieldzmpost-process supervision source during training/validation; not an inference input for pre-process predictionzTall_merge_pointcloud_full.ply (represented by the existing deterministic 2 mm cache)zVT1/T2/TOP are not independent samples or inference inputs; retain for pose/coverage QA)Úprimaryr@  zVmatch CAD and fused PLY geometry, then verify residuals by region and component sensorz-a physical rigid transform has determinant +1z‹current best-looking mapping has determinant -1; treat only as coordinate-handedness/reflection diagnostic until scanner axes are confirmed)Úgeometry_featuresÚproper_rigid_requirementÚ
16h_statuszWgeodesic dilation of a CSV seed at assumed 5/10/20 mm radii; not observed defect extentzPregistered scan-to-nearest-CAD surface residual; not material-point displacementzWnormal component of nearest-surface residual; sign depends on oriented CAD tessellationzKdiagnostic uniform X-bin overlay; not a validated physical heater footprint)r(  r  r  r<  )z5confirm CSV image origin and pixel-to-PLY calibrationzUobtain physically valid independently verified PLY-to-STEP registration for every runzFcollect defect polygons/masks or W/H instead of point-only coordinateszNcollect many OK and NG runs/design revisions and split by run and CAD revisionz[provide heater-zone coordinates/footprints and their relation to the STEP coordinate system)ÚproblemÚrole_of_plyÚscan_selectionÚregistration_policyÚtarget_semanticsÚentriesÚblocking_validationz
index.jsonr+   c              3  óÐ   K  — | ]^  }d t        j                  |d   «      › dt        j                  |d   «      › d|d   › d|d   › dt        j                  |d   «      › d	�–— Œ` y
­w)z<section><h2>rã   z</h2><p>rS  z</p><p><a href="rE  u@   ">raw NPZ</a> Â· <a href="index.json">metadata</a></p><img src="r  z#" alt="matched CAD PLY targets for z"></section>N)ÚhtmlÚescape)r
  Úes     r   r  zprepare.<locals>.<genexpr>T  s€   è ø€ ð ñ ˆAð œŸ™ A e¡HÓ-Ð.¨h´t·{±{À1ÀXÁ;Ó7OÐ6Pð QØ˜‘x�jð !Ø�y‘\�NÐ"EÄdÇkÁkÐRSÐTYÑRZÓF[ÐE\Ð\hô	jñ ùs   ‚A$A&z
index.htmlu¸  <!doctype html><meta charset="utf-8"><title>CADâ€“PLY matched targets</title><style>body{font:15px system-ui;max-width:1400px;margin:auto;padding:24px;background:#f7f8fa}section{background:white;padding:18px;margin:18px 0;border:1px solid #ddd}img{max-width:100%}</style><h1>CADâ€“PLY matched supervision</h1><p>PLY is an outcome used to build labels. At prediction time the intended inputs are STEP geometry and XLS process conditions.</p>zcad_ply_target_summary.json)2ÚjsonÚloadsÚ	read_textr!   ÚloadÚfilesrÇ   ÚnextÚglobÚRUN_POSEÚitemsrÚ   Úwherer"   Úfloat64rX   r#   r   rd   rD   r	   Úqueryr)   r;   ÚWEAK_RADII_MMrÕ   rz   rŠ   r•   r\   r�   r>   r€   Úsavez_compressedrl   r‘   r   rZ   ÚdetÚwith_suffixÚ
write_textÚdumpsr  Úappendrr   rL   Úrelative_tor=   ÚsumÚjoin)>ÚrootÚoutÚ
result_dirÚ
graph_pathÚ
table_pathr]   Úmetar   r„   ry   r(   ÚtableÚvisualr“   r  rä   Úlengthr]  Úcsv_dirrã   rD  rC   Ú	pose_metar   Ú	scan_pathÚscan_rawÚscan_cadÚscan_closestræ   Úscan_signedÚdefect_pathÚdefectÚ
anchor_rawÚ
anchor_cadÚanchor_nodeÚgeoÚ
weak_masksÚweak_probabilityÚheater_top_rawÚheater_bottom_rawÚ
heater_topr0  Úheater_bottomr1  Úheater_zonerë   rì   rí   Ú	scan_treeÚcad_scan_absÚcad_scan_indexÚ	cad_deltaÚcad_scan_signedÚregistration_validÚextent_observedr;  rS  ÚoutputÚschemaÚpngÚmanifestÚcardss>                                                                 r   Úpreparer¢  ¹   sl
  € ØÐ?Ñ?€JØÐIÑI€JØÐ9Ñ9€IÜ�:‰:�tÐJÑJ×UÑUÓWÓX€DÜ—*‘*˜dÐ%YÑY×dÑdÓfÓg€KÜ	�‰�¨%Õ	0°CØ*-¯)ª)Ó4©) 3��c˜#‘h‘¨)ˆÐ4÷ 
1ä	�‰�¨%Õ	0°CØ*-¯)ª)Ó4©) 3��c˜#‘h‘¨)ˆÐ4÷ 
1ð ‡I�I�d T€IÔ*°SÐ;KÑ5K¨FÈVÏ\É\ÐcgÈ\ÔMhØ×Ñ˜T¨DÐÔ1Ø˜x™¨%°©/¸5ÀÑ;N�ˆ€CØ�;Ñ¢ 1 Ñ%€FØ€GÜÑT˜t iÑ/×5Ñ5°nÔEÓTÓT€GÜ—^‘^×%‰	ˆˆTÜ”"—(‘(˜5 ™?¨cÑ1Ó2°1Ñ5°aÑ8Ó9ˆØ˜Ñ$ TÑ*ˆ	Ü—‘˜I kÑ2´B·J±JÓ?ˆØÐ.¨s¨eÐ3QÐRÑRˆ	Ü�W‰W�Y¨UÕ3°sØ˜8‘}×+Ñ+¬B¯J©JÓ7ˆH÷ 4ä˜X vÓ.×5Ñ5´b·j±jÓAˆÜ.9¸)ÀXÓ.NÑ+ˆ�h ä˜7Ÿ<™<°c¸U²l©
È
ÓSÓTˆÜ  Ó-ˆÜ—Z‘Z ¨CÑ 0°Ñ >ÄÇ
Á
ÓKˆ
Ü˜z¨$Ñ/°Ó8¸Ñ;×BÑBÄ2Ç:Á:ÓNˆ
Üœ' #›,×,Ñ,¨ZÓ8¸Ñ;Ó<ˆÜ¤ C£¨%°¸ÓEˆØš˜D˜‘\¤]°4Ñ%8Ñ8ˆ
äŸ6™6 #¨ªQ°¨W©¼ÀdÑ8KÑ)KÐPQÑ(QÑ"QÓR×YÑYÔZ\×ZdÑZdÓeÐÜ,9ØÐ)Ñ*¨E°+Ñ,>¸sÑ,CÀUÐKbÑEcÐdgÑEhó-jÑ)ˆÐ)ä)DÀ^Ó)TÑ&ˆ
Ð&Ü/JÐK\Ó/]Ñ,ˆÐ,Ü9VØ�˜]ó:,Ñ6ˆ�X˜{¨Jô ˜HÓ%ˆ	Ø'0§¡°sÀA Ó'FÑ$ˆ�nØ˜^Ñ,¨sÑ2ˆ	ÜŸ)™) J°	¸6ÓB×IÑIÌ"Ï*É*ÓUˆä! )§-¡-Ð0IÈ5Ó"QÓRÐØ  Ñ,°DÐ8Ò\¸VÀKÑ=PÐX\Ð=\ˆÜŸ™¤# c£(¬DÓ1ˆà3Ð4FÐ3Gð HØ'Ð(Ð(^ð`ð 	ð ˜#˜Ð2Ð3Ñ3ˆÜ
×ÑØò	
ä—:‘:˜c”?ð	
á/2ð	
á?Eð	
ñ !ð	
ð -2°+Ñ,>¸sÒ,Cð	
ð #(Ð(?Ñ"@ÀÒ"Eð		
ð
 #(Ð(?Ò"@ð	
ñ %ð	
ñ 7?ð	
ñ !-ð	
ñ HPð	
ñ %0ð	
ð %1×$7Ñ$7¼¿
¹
Ô$Cð	
ñ ,;ð	
ô Ÿ™ F¨7¡OÔ4ð	
ô GIÇjÁjÐQWÐXbÑQcÔeg×eoÑeoÔFpð	
ô $&§:¡:¨v°jÑ/AÒ/KÄRÇVÁVÈVÐT_ÑM`ÒMjÔdf×djÑdjÐ.kÔmo×mwÑmwÔ#xð	
ñ ",ð	
ñ CMð	
ô $&§:¡:¨k¼2¿8¹8Ô#Dð	
ñ 14ð	
õ   -ð!	
ñ  @Jð!	
ñ" %5ð#	
ñ$ $ð%	
ñ$ 6Cð%	
ñ& ,ð'	
ñ& BSð'	
ô( !#§¡¨NÔ ;ð)	
ô( UW×T_ÑT_Ð`qÔTrð)	
ñ*  2ð+	
ñ* J_ð+	
ñ, *5ð-	
ñ. 3;ð/	
ñ0 6Að1	
ñ2 5?ð3	
ô4 %'§J¡J¨uÔ$5ð5	
ñ6 &,ð7	
ô6 DFÇ:Á:ÌbÏiÉiÏmÉmÐ\bÐceÐdeÐceÐgiÐhiÐgiÐciÑ\jÓNkÔClð7	
ô8 24·±Ð<NÔ1Oð9	
ô: $&§:¡:¨oÔ#>ð;	
ñ: P^ñ;	
ð@ 9ØFÐHoÐpØ,QÐS_Ð+`ØPà,aØ+bØ+QØ$VØ+[Ø0qØ"CØ$qØ5fØ"dññ
ˆð$ 	×Ñ˜>Ó*×5Ñ5Ü�J‰J�v¨E¸!Ô<Àwð 	6ô 	Pà˜#˜Ð2Ð3Ñ3ˆÜ��S˜#˜u h°Ð:JÈJØ˜MÐ+=Ð?TØ˜+ z°6ô	;ð 	�‰ð 
Ø�3ð
Ø ð
Ø&+¨V¯[©[ð
Ø:CÀÐWZ×W_ÑW_ÐV`ÐEað
àœc *×"8Ñ"8¸Ó">Ó?ð
àAMÐOoð
ð œ#˜i×3Ñ3°DÓ9Ó:ð
ð =LÌSÐQ\×QhÑQhÐimÓQnÓMoð
ð œ3˜x›=ð	
ð +6´s¸3³xð	
ð BVÐWbð	
ð
 '¬¬b¯i©i¯m©m¸FÀ2ÀAÀ2ÀrÈÀrÀ6¹NÓ.KÓ(Lð
ð 3Ð4Fð
ð % oð
ð 8NÌsÐSa×SeÑSeÓSgÓOhð
ð & uð
ð  Ð!Xð
ð ,\Ø!eð $CØò
ö 	ð} &ð^ }ð GàmØwñ
ð
 "zØ(Wð hñ 
ð !zØ(zð (AØ1~ñ	
ð ò 
ñ'€Hð6 	ˆ<Ñ×#Ñ#¤D§J¡J¨xÀeÐTUÔ$VÐahÐ#ÔiØ�G‰Gñ ñ ó	ó €Eð
 	ˆ<Ñ×#Ñ#ð	cð fkñ		kð
 ð $ô ð Ð/Ñ/×;Ñ;¼D¿J¹JÀxÐ^cÐlmÔ<nð  zAÐ;ô  BØ€OùòC 5÷ 
1Ñ	0üò 5÷ 
1Ñ	0ú÷ 4Ñ3úsH   Á3b)Âb$Âb)Â0b;Â?b6Ãb;Ç(#câ$b)â)b3â6b;â;cãc	c                 óö  — t        j                  d¬«      } | j                  dt        t	        «       ¬«       | j                  dt        ¬«       | j                  dt        ¬«       | j                  «       }|j                  j                  «       }|j                  xs |dz  }|j                  xs |d	z  }t        |||«      }t        t        j                  t        |d
   «      t        |«      dœd¬«      «       y )NuC   Build diagnostic CADâ€“PLY deformation and weak defect-area targets)Údescriptionz--root)ÚtypeÚdefaultz--out)r¥  z	--resultszdata_processed/pairedzresults/pairedr]  )Úrunsrz  F)rB  )ÚargparseÚArgumentParserÚadd_argumentr   r   Ú
parse_argsry  r   rz  Úresultsr¢  Úprintrc  rt  r;   rL   )r  Úargsry  rz  r¬  r   s         r   Úmainr¯  d  sÀ   € Ü×ÑÐ,qÔr€AØ‡N�N�8¤$´³€NÔ?Ø‡N�N�7¤€NÔ&Ø‡N�N�;¤T€NÔ*Ø�<‰<‹>€D $§)¡)×"3Ñ"3Ó"5˜4Ø
�(‰(Ò
4�dÐ4Ñ4€CØ�l‰lÒ5˜dÐ%5Ñ5€GÜ�t˜S 'Ó*€HÜ	Œ$�*‰*œc (¨9Ñ"5Ó6¼sÀ3»xÑHÐW\Ô
]Õ^r   Ú__main__)Úreturnr   )r   ú
np.ndarrayr   r²  r±  r²  )
r$   rÚ   r%   r²  r&   r²  r'   rÚ   r±  r²  )r@   r   r±  údict[str, object])r]   r   r   r²  r±  z)tuple[np.ndarray, np.ndarray, np.ndarray])rn   r²  ro   r²  rp   r²  r±  útuple[np.ndarray, np.ndarray])ro   r²  r±  r´  )r“   r²  rt   r²  ru   r²  r±  z5tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray])"r@   r   rã   rL   r“   r²  rä   r²  rå   r²  ræ   r²  rç   r²  rè   r²  rt   r²  ru   r²  ré   r²  rê   r²  rë   r²  rì   r²  rí   r²  rî   rL   r±  ÚNone)ry  r   rz  r   r{  r   r±  r³  )r±  rµ  )+Ú__doc__Ú
__future__r   r¨  r9   r`  rc  Úpathlibr   Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotrÈ   Úmatplotlib.collectionsr   rY   r!   Úopen3drI   Úscipy.sparser   Úscipy.sparse.csgraphr   Úscipy.spatialr	   ÚrcParamsrj  r"   r#   ro  r   r   r)   rD   rd   rz   rŠ   r•   r  r¢  r¯  Ú__name__r   r   r   Ú<module>rÄ     s™  ðñõ #ã Û 
Û Û Ý ã Ø €
‡�ˆuÔ Ý Ý 1Û Û Ý #Ý )Ý !à4°mÐD€‡�ˆ]Ñ Ø%*€‡�Ð!Ñ "à¨'Ñ2€Ø�—
‘
Ò,¨b¯j©jÓ9€ó/ó5ðQØ#-ðQØ58ðQØ=GóQóó
7ð
Ø#ð
Ø(Eó
óð"?Ø+5ð?Ø:oó?ðD/ØðD/Ø(2ðD/Ø:DðD/àðD/à%/ðD/à9CðD/ð $ðD/ð 6@ðD/ð !ð	D/ð 0:ð	D/ð HRð	D/ð
 ðD/ð
 óD/óNhóV	_ð ˆzÒÙ…Fð r   