o
    {Ih                     @   s   d Z ddlZddlZddlmZ ddlmZmZ ddl	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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S )+u|   
상세 교량 상태평가용 데이터 처리 모듈
각 부재별 상세 상태평가표 생성 및 자동 등급 계산
    N)defaultdict)normalize_componentsort_componentsc                 C   s0   |D ]}t || }|rt|d  S qdS )u    손상내용에서 수치 추출   N)researchfloatgroup)damage_descpatternspatternmatch r   R/home/skpark/git/infrasmart_work/infrasmart/utils/detailed_condition_evaluation.pyextract_numerical_value   s   r   c                 C   H   | du s| dkr
dS | dkrdS | dkrdS | dkrd	S | d
kr"dS dS )u!   균열폭에 따른 등급 산정Nr   ag      ?eg      ?dg333333?cg?br   )crack_widthr   r   r   get_crack_grade      r   c                 C   r   )u!   균열율에 따른 등급 산정Nr   r      r      r   
   r      r   r   )crack_ratior   r   r   get_crack_ratio_grade%   r   r   c                 C   H   | du s| dkr
dS | dkrdS | dkrdS | dkrd	S | dkr"d
S dS )u'   표면손상율에 따른 등급 산정Nr   r   r   r   r   r   r   r   r   r   )surface_ratior   r   r   get_surface_damage_grade5   r   r"   c                 C   s<   | du s| dkr
dS | dkrdS | dkrdS | dkrdS dS )	u,   누수 및 백태율에 따른 등급 산정Nr   r   r   r   r   r   r   r   )leakage_ratior   r   r   get_leakage_gradeE   s   r$   c                 C   r    )u'   철근부식율에 따른 등급 산정Nr   r      r      r   r   r   r   r   )rebar_ratior   r   r   get_rebar_corrosion_gradeS   r   r(   c                    sB   dddddd ddd	d
dd}t  fdd| D }||dS )u+   최종 등급 계산 (최고 등급 기준)r   r&   r%      r   )r   r   r   r   r   r   r   r   r   r   )r   r&   r%   r)   r   c                    s   g | ]
}|r  |d qS )r   )get).0ggrade_valuesr   r   
<listcomp>h   s    z)calculate_final_grade.<locals>.<listcomp>)maxr*   )gradesgrade_letters	max_grader   r-   r   calculate_final_gradec   s   r4   c                 C   s&   ddl }|dt| }dd |D S )uC   부재위치를 자연 정렬 (s1, s2, s3... s10, s11... 순서로)r   Nz(\d+)c                 S   s$   g | ]}|  rt|n| qS r   )isdigitintlower)r+   partr   r   r   r/   p   s   $ z)natural_sort_position.<locals>.<listcomp>)r   splitstr)positionr   partsr   r   r   natural_sort_positionl   s   r=   c           	   
   C   s  i }|   D ]T\}}|d }tddt|}||vr$g dddd||< || d |d  || d  |d 7  < t|| d |dd	|| d< || d
  |d
d7  < qg }| D ]"\}}|d D ]}||||d t|d  |d |d
 d qiqa|rt	
|S t	
 S )u(   거더 내부/외부 데이터를 통합   부재위치z[io]$ r   )   손상내용   손상물량   점검면적   개소r@   rA   rB   ,  rC   r   )r>   r@   rA   rB   rC   )iterrowsr   subr:   appendr0   r*   itemslenpd	DataFrame)	component_dfmerged_data_rowr;   base_positionmerged_rowsdatadamage_contentr   r   r   merge_girder_datas   s4   
"
	rT   c                    s  i d|ddddddddddd	dd
ddddddddddddddddd}d}d}d}d}d}|   D ]\}}	|	d  |	d }
d v rt g d}|rt fdddD rrt|d ||d< ||
7 }n&t fdddD rt|d ||d< ||
7 }nt|d ||d< ||
7 }t fdddD r||
7 }t fdddD r||
7 }t fd dd!D rd" vr||
7 }q@|dkr|d# | d$ |d< |d# | d$ |d
< || d$ |d< || d$ |d< || d$ |d< t|d |d< t|d |d< t|d |d	< t|d
 |d< t|d |d< t|d |d< t|d |d< |d |d |d	 |d |d |d |d g}t	||d< |S )%u   바닥판 상태평가 처리inspection_area1d_crack_widthr   1d_crack_grader   1d_crack_ratio1d_crack_ratio_grade2d_crack_width2d_crack_grade2d_crack_ratio2d_crack_ratio_grader#   leakage_gradesurface_damage_ratiosurface_damage_graderebar_corrosion_ratiorebar_corrosion_gradefinal_grader@   rA      균열)   (\d+(?:\.\d+)?)\s*(?:mm|㎜)$   균열\((\d+(?:\.\d+)?)(?:mm|㎜)?\)u   폭[=:]\s*(\d+(?:\.\d+)?)c                 3       | ]}| v V  qd S Nr   r+   keywordr
   r   r   	<genexpr>       z*process_slab_evaluation.<locals>.<genexpr>)u   1방향u	   종방향u   길이방향c                 3   rg   rh   r   ri   rk   r   r   rl      rm   )u   2방향u	   횡방향u   망상u   격자c                 3   rg   rh   r   ri   rk   r   r   rl      rm   )   누수   백태u   침출u	   석회화c                 3   rg   rh   r   ri   rk   r   r   rl      rm   )   박리   박락   파손   재료분리u	   층분리u   스케일링c                 3   rg   rh   r   ri   rk   r   r   rl      rm   )   철근부식   철근노출u   잡철근노출g      ?d   )
rE   r   anyr0   r   r   r$   r"   r(   r4   )rL   area
evaluationtotal_crack_length_1dtotal_crack_length_2dtotal_leakage_areatotal_surface_damage_areatotal_rebar_corrosion_arearN   rO   quantityr   r1   r   rk   r   process_slab_evaluation   s   	


r   c           
         s  |dddddddddddddd}d}d}|   D ]m\}}|d  |d }d v r;t dd	g}|r;t|d
 ||d
< t fdddD rJ||7 }t fdddD rY||7 }t fdddD rhd|d< t fdddD rwd|d< t fdddD rd|d< q|dkr|| d |d< || d |d< t|d
 |d< t|d |d< t|d |d< |d rd nd|d!< |d rd"nd|d#< |d rd"nd|d$< |d |d |d |d! |d# |d$ g}	t|	|d%< |S )&u   거더 상태평가 처리r   r   F)rU   r   crack_grader_   r`   ra   rb   wire_exposurewire_exposure_gradegrout_damagegrout_damage_gradeprotection_damageprotection_damage_graderc   r@   rA   rd   re   rf   r   c                 3   rg   rh   r   ri   rk   r   r   rl     rm   z,process_girder_evaluation.<locals>.<genexpr>rp   rq   rr   rs   c                 3   rg   rh   r   ri   rk   r   r   rl     rm   )ru   rt   u   부식c                 3   rg   rh   r   ri   rk   r   r   rl   #  rm   )u	   강연선u   텐던u   노출Tr   c                 3   rg   rh   r   ri   rk   r   r   rl   '  rm   )u   그라우트u	   충전재r   c                 3   rg   rh   r   ri   rk   r   r   rl   +  rm   )u	   보호관u   덕트r   rv   r_   ra   r   r`   rb   r   r   r   r   r   rc   )rE   r   r0   rw   r   r"   r(   r4   )
rL   rx   ry   r}   r~   rN   rO   r   r   r1   r   rk   r   process_girder_evaluation   sj   r   c           	   	      s  |dddddddd}d}|   D ]@\}}|d  |d }d v r3t dd	g}|r3t|d
 ||d
< t fdddD rB||7 }t fdddD rQd|d< q|dkr^|| d |d< t|d
 |d< t|d |d< |d rtdnd|d< |d |d |d g}t||d< |S )u'   가로보/세로보 상태평가 처리r   r   F)rU   r   r   r_   r`   connection_damageconnection_damage_graderc   r@   rA   rd   re   rf   r   c                 3   rg   rh   r   ri   rk   r   r   rl   c  rm   z/process_crossbeam_evaluation.<locals>.<genexpr>r   c                 3   rg   rh   r   ri   rk   r   r   rl   g  rm   )u	   연결부u	   접합부u   볼트u	   용접부Tr   rv   r_   r   r`   r   r   rc   )rE   r   r0   rw   r   r"   r4   )	rL   rx   ry   r}   rN   rO   r   r   r1   r   rk   r   process_crossbeam_evaluationF  sF   r   c                 C   s^  |   } | d t| d< tj| d ddd| d< d| jv r/tj| d ddd| d< nd| d< t| d  }i }|D ]m}| | d |k }t	|}|d	krYt
|}|jrYq?t|d  td
}i ||< |D ]B}||d |k }t|dkr|d jd nd}	|dkrt||	}
n|d	krt||	}
n|dkrt||	}
nt||	}
|
|| |< qiq?|S )u   상세 상태평가표 생성r>   rA   coerce)errorsr   rB   rD   u	   부재명   거더key	   바닥판	   가로보)copyastyper:   rJ   
to_numericfillnacolumnsr   uniquer   rT   emptysortedr=   rI   ilocr   r   r   process_basic_evaluation)df
componentsevaluation_results	componentrL   normalized_component	positionsr;   pos_dfrx   ry   r   r   r   &generate_detailed_condition_evaluation}  s<   

r   c                    s  i }|   D ]\}  d }|}||vrdddddg d||< d d v rHt d dg}|r<t|| d ||| d< || d   d	 7  < t fd
ddD r_|| d   d	 7  < d d v skd d v rw|| d   d	 7  < d d v sd d v r|| d   d	 7  < || d  d  q| D ]1\}}t|d }t|d }	t|d }
t	|d }t
|d }t||	|
||g}||| d< q|S )u7   교대, 교각 등 기본 부재의 상태평가 처리r>   r   )r   r   surface_damageleakagerebar_corrosionr
   rd   r@   re   r   r   rA   c                 3   s    | ]	}| d  v V  qdS )r@   Nr   ri   rO   r   r   rl     s    z+process_basic_evaluation.<locals>.<genexpr>)rq   rp   rr   rn   ro   r   rn   ro   r   rt   ru   r   r
   rc   )rE   r   r0   rw   rG   rH   r   r   r"   r$   r(   r4   )rL   rx   rM   rN   r;   rP   r   rR   r   crack_ratio_gradesurface_grader^   rebar_graderc   r   r   r   r     sH   

r   c                 C   s   d}|   D ]3\}}t|}|dkr|t||7 }q|dkr&|t||7 }q|dkr2|t||7 }q|t||7 }q|d7 }|d7 }|S )u"   상세 상태평가표 HTML 생성z+<div class="detailed-condition-evaluation">r   r   r   z</div>aY  
    <style>
        .detailed-condition-evaluation {
            margin: 20px 0;
        }
        .detailed-condition-evaluation h4 {
            color: #2c3e50;
            margin: 30px 0 15px 0;
            font-size: 1.3rem;
            font-weight: 600;
        }
        .detailed-condition-evaluation table {
            width: 100%;
            border-collapse: collapse;
            margin-bottom: 30px;
            font-size: 11px;
        }
        .detailed-condition-evaluation th,
        .detailed-condition-evaluation td {
            padding: 6px 4px;
            text-align: center;
            border: 1px solid #333;
            vertical-align: middle;
        }
        .detailed-condition-evaluation th {
            background-color: #f8f9fa;
            font-weight: bold;
            color: #2c3e50;
        }
        .detailed-condition-evaluation .main-header {
            background-color: #d4edda;
            font-weight: bold;
        }
        .detailed-condition-evaluation .sub-header {
            background-color: #e9ecef;
        }
        .grade-a { color: #28a745; font-weight: bold; }
        .grade-b { color: #17a2b8; font-weight: bold; }
        .grade-c { color: #ffc107; font-weight: bold; }
        .grade-d { color: #fd7e14; font-weight: bold; }
        .grade-e { color: #dc3545; font-weight: bold; }
    </style>
    )rH   r   generate_slab_evaluation_table generate_girder_evaluation_table#generate_crossbeam_evaluation_tablegenerate_basic_evaluation_table)r   htmlr   r   r   r   r   r    generate_detailed_condition_html  s   ,r   c                 C   sx  d|  d}|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d	7 }|d
7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|  D ]\}}|d7 }|dd}|du rd}|dkrdn|d}|dd}|du rd}|dkrdn|d}|dd}	|	du rd}	|dd}
|
du rd}
|
dkrdn|
d }|d!d}|du rd}|d"d}|du rd}|dkrdn|d}|d#d}|du rd}|d$d}|du rd}|dkrdn|d }|d%d}|du r-d}|d&d}|du r:d}|dkrAdn|d }|d'd}|du rRd}|d(d}|du r_d}|dkrfdn|d)}|d*d}|du rwd}|d+d}|du rd}|dkrdn|d }|d,d}|du rd}|d-d}|du rd}|d.| d/7 }|d.| d/7 }|d.| d/7 }|d.|	 d/7 }|d.| d/7 }|d.| d/7 }|d.| d/7 }|d.| d/7 }|d.| d/7 }|d.| d/7 }|d.| d/7 }|d.| d/7 }|d.| d/7 }|d.| d/7 }|d.| d/7 }|d.| d/7 }|d.| d/7 }|d7 }q|d07 }|S )1u%   바닥판 상태평가표 HTML 생성<h4>    상태평가 결과</h4><table><thead><tr>u   <th rowspan="3">구분</th>u*   <th rowspan="3">점검면적<br>(m²)</th>u7   <th colspan="4" class="main-header">1방향 균열</th>u7   <th colspan="4" class="main-header">2방향 균열</th>u:   <th colspan="6" class="main-header">열화 및 손상</th>u?   <th rowspan="3" class="main-header">상태평가<br>결과</th></tr>u1   <th colspan="2" class="sub-header">최대폭</th>u1   <th colspan="2" class="sub-header">균열율</th>uL   <th colspan="2" class="sub-header">누수 및<br>백태<br>면적율(%)</th>uD   <th colspan="2" class="sub-header">표면손상<br>면적율(%)</th>uJ   <th colspan="2" class="sub-header">철근부식<br>손상면적율(%)</th>u   <th>(mm)</th><th>평가</th>u   <th>(%)</th><th>평가</th>u   <th>값</th><th>평가</th></thead><tbody>rU   r   N-.1frV   rW   r   rX   .2frY   rZ   r[   r\   r]   r#   r^   r_   z.3fr`   ra   rb   rc   <td></td></tbody></table>rH   r*   )r   r   r   r;   	eval_datarU   inspection_area_strcrack_1d_widthcrack_1d_width_strcrack_1d_gradecrack_1d_ratiocrack_1d_ratio_strcrack_1d_ratio_gradecrack_2d_widthcrack_2d_width_strcrack_2d_gradecrack_2d_ratiocrack_2d_ratio_strcrack_2d_ratio_grader#   leakage_ratio_strr^   r_   surface_damage_ratio_strr`   ra   rebar_corrosion_ratio_strrb   rc   r   r   r   r   -  s   










r   c                 C     d|  d}|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d	7 }|d
7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|  D ]\}}|dd}|du rZd}|dkr`dn|d}|dd}|du rpd}|dd}|du r|d}|dkrdn|d}	|dd}
|
du rd}
|dd}|du rd}|d7 }|d| d7 }|d| d7 }|d| d7 }|d7 }|d7 }|d7 }|d|	 d7 }|d|
 d7 }|d| d7 }|d7 }qJ|d7 }|S ) u"   거더 상태평가표 HTML 생성r   r   r   r   r      <th rowspan="2">구분</th>*   <th rowspan="2">점검면적<br>(m²)</th>uD   <th colspan="6" class="main-header">모재 및 연결부 손상</th>E   <th colspan="2" class="main-header">표면열화<br>면적율(%)</th>?   <th rowspan="2" class="main-header">상태평가<br>결과</th>r   -   <th>부재 균열</th><th>변형, 파단</th>J   <th>연결 볼트<br>이완, 탈락</th><th>용접연결부<br>결함</th>D   <th>표면열화<br>면적율(%)</th><th>상태평가<br>결과</th>r   r   rU   r   Nr   r   r   r   r_   r   r`   rc   r   r   
<td>a</td>r   r   r   r   r   r;   r   rU   r   r   r_   r   r`   rc   r   r   r   r     `   
r   c                 C   r   ) u/   가로보/세로보 상태평가표 HTML 생성r   r   r   r   r   r   r   uD   <th colspan="4" class="main-header">모재 및 연결부 손상</th>r   r   r   r   r   r   r   r   rU   r   Nr   r   r   r   r_   r   r`   rc   r   r   r   r   r   r   r   r   r   r      r   r   c                 C   s  d|  d}|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }|d	7 }|d
7 }|d7 }|d7 }|d7 }t | tdD ]}|| }|d }|dkrJdn|d}|d }|dkrXdn|d}|d }	|	dkrfdn|	d}
|d }|dkrtdn|d}|d }|dkrdn|d}|d }|d7 }|d| d7 }|d| d7 }|d| d7 }|d|
 d7 }|d| d7 }|d| d7 }|d| d7 }|d7 }q:|d7 }|S )uA   교대, 교각 등 기본 부재의 상태평가 테이블 생성r   u    상태평가</h4>z<div class="table-container">z<table class="table table-sm">z<thead><tr>u   <th>부재위치</th>u   <th>최대균열폭(mm)</th>u   <th>균열율(%)</th>u"   <th>표면손상 면적율(%)</th>u   <th>누수 면적율(%)</th>u"   <th>철근부식 면적율(%)</th>u   <th>상태등급</th>z</tr></thead><tbody>r   r   r   r   r   r   r   r   r   r   rc   r   r   r   r   z</tbody></table></div>)r   keysr=   )r   r   r   r;   rR   r   crack_width_strr   crack_ratio_strr   surface_damage_strr   leakage_strr   rebar_corrosion_strrc   r   r   r   r   B  sH   
r   )__doc__pandasrJ   r   collectionsr   utils.commonr   r   mathr   r   r   r"   r$   r(   r4   r=   rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s4    		%_O759B BB