o
    C$j                     @   s8  d Z ddlZddlZddlZed ddlmZ ddl	m
Z ddlmZ ddlmZ zddlmZ ddlmZ dZW n eyJ   dZed Y nw ddlZdd	 Ze Zd
eiZdd ZdefddZd#ddZ d#ddZ!d#ddZ"						d$dej#dedededededefddZ$d ej#dej#fd!d"Z%dS )%uA   
plot_utils.py — Utilitários comuns de plot para o modelo Eta
    NZAgg)datetimeTFu@   [plot_utils] cartopy não encontrado — usando matplotlib puro.c                  C   s   g d} t jd| S )u2   Colormap branco→azul escuro para precipitação.))      ?r   r   )      ?g(\?r   )gRQ?r   r   )        gQ?gGz?)r   g(\?r   )r   皙?333333?)333333?r   g      ?precip)mcolorsZLinearSegmentedColormap	from_list)colors r   A/dados/sismom/SisMOM/sismom_fig/Figuras_Eta/scripts/plot_utils.py_precip_cmap   s   	r   r	   c                 C   s   t | trt| | S | S )zNConverte string de colormap (incluindo nomes proprios) para objeto matplotlib.)
isinstancestr_CUSTOM_CMAPSget)Z	cmap_namer   r   r   _resolve_cmap5   s   
r   var_namec                 C   s"   t j| d\}}}t|||fS )z
    Retorna (cmap, vmin, vmax) para a variavel a partir de config.CMAP_CONFIG
    (carregado de variables.yaml).

    O cmap retornado pode ser string ou objeto matplotlib colormap.
    )viridisNN)configCMAP_CONFIGr   r   )r   Zraw_cmapvminvmaxr   r   r   get_cmap_config<   s   r   o   c                 C   s   t  }| j||d}|jtjdddd |jtjdddd |jtjddd	d |j	d
ddddd}d|_
d|_td|_td|_|S )u/   Cria eixo com projeção PlateCarree (cartopy).)Z
projectionZ50mr   k)	linewidthcolorg?z0.4r   z0.6Tr   0.7gffffff?--)Zdraw_labelsr   r   alpha	linestyleF   )ccrsPlateCarreeadd_subplotZadd_featurecfeatureZ	COASTLINEZ
with_scaleZBORDERSZSTATESZ	gridlinesZ
top_labelsZright_labelsmtickerZMaxNLocatorZxlocatorZylocator)figrectprojaxglr   r   r   _setup_axes_cartopyK   s   
r/   c                 C   s*   |  |}|d |jddddd |S )zCria eixo simples sem cartopy.equalTr   r    r!   )r   r   r#   )r'   Z
set_aspectgrid)r*   r+   r-   r   r   r   _setup_axes_plain[   s   

r2   c                 C   s   t rt| |S t| |S )N)HAS_CARTOPYr/   r2   )r*   r+   r   r   r   
setup_axesc   s   

r4    data	timestamp
output_dirtitle_extraunits_overridereturnc
              
   C   s^  t j|dd |  tj}
|ptj|d}tj	||}|	dur'|	|
}
t
|\}}}|dur4|}|dur:|}|dur@|}|
t|
  }|du rY|jrWtt|dnd}|du rj|jrhtt|dnd}||krr|d }tjd	d
}t|}tr|jtjtj|
|||t dd}|jtjd tjd tjd tjd gt d n|jtjtj|
|||dd}|d |d |j||dddd}|j|dd |d}|rd| nd}|j| d| | d| ddd |r|dd  nd}|rd| nd}| d|d  | d!tj! }t j"#||}tj$|tj%d"d# t&| |S )$u[  
    Plota um campo 2D e salva como imagem.

    Parameters
    ----------
    data          : array (NY, NX)
    var_name      : nome da variável (config.VAR_NAMES)
    timestamp     : datetime do campo
    output_dir    : diretório de saída
    title_extra   : texto adicional no título (ex: "Acumulado 24h")
    units_override: sobrescreve a unidade do config
    vmin/vmax_override: sobrescreve os limites do colormap
    cmap_override : sobrescreve o colormap
    convert_fn    : função de conversão aplicada aos dados (ex: m→mm)

    Returns
    -------
    Caminho do arquivo salvo.
    T)exist_okr5   N   r   b      )      )Zfigsizeauto)cmapr   r   	transformshading)crs)rC   r   r   rE   u   Longitude (°)u   Latitude (°)Zverticalg{Gz?gQ?)r-   Zorientationpadfraction
   )fontsizez%d/%m/%Y %HZu    — 
   rA   )rK   rH    _z%Y%m%d%H.Ztight)dpiZbbox_inches)'osmakedirscopyastypenpfloat64r   	VAR_UNITSr   VAR_DESCr   isnansizefloat
percentilepltfigurer4   r3   Z
pcolormeshLONSLATSr%   r&   Z
set_extentZ
set_xlabelZ
set_ylabelZcolorbarZ	set_labelstrftimeZ	set_titlereplacelowerFIG_EXTpathjoinZsavefigDPIclose)r6   r   r7   r8   r9   r:   vmin_overridevmax_overrideZcmap_override
convert_fnarrunitsdescrC   r   r   validr*   r-   ZimcbZtime_strextra	extra_tagfnamefpathr   r   r   
plot_fieldm   sh   
"



$ 
rv   rm   c                 C   s   | d S )uD   Converte metros → milímetros (para variáveis de precipitação).g     @@r   )rm   r   r   r   m_to_mm   s   rw   )r   )r5   NNNNN)&__doc__rR   numpyrV   Z
matplotlibZuseZmatplotlib.pyplotZpyplotr^   Zmatplotlib.colorsr   r
   Zmatplotlib.tickerZtickerr)   r   Zcartopy.crsrG   r%   Zcartopy.featurefeaturer(   r3   ImportErrorprintr   r   Z_PRECIP_CMAPr   r   r   r   r/   r2   r4   ndarrayrv   rw   r   r   r   r   <module>   sb    




f