a
    I¢b¸C  ã                   @   s  d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZ d dl	m
Z
mZ d dlmZmZmZmZmZmZmZmZ eƒ Ze j e j e¡d¡Ze e¡ e dd	¡Zd
d„ ZG dd„ deƒZG dd„ de ƒZ!G dd„ deƒZ"e#dkrd dl$Z$ee$j%ƒZ&e"ƒ Z'e' (¡  e$ )e& *¡ ¡ dS )é    N)ÚConfigParser)ÚFigureCanvasQTAgg)ÚFigure)ÚHAPropsÚHAProps_Aux)ÚQDialogÚQGridLayoutÚQProgressBarÚQLabelÚQDialogButtonBoxÚQPushButtonÚQFileDialogÚQApplicationÚpsyrcÚGeneralÚPc                 C   s   ddd|   d  S )z•
    ASHRAE Fundamentals Handbook pag 1.1 eq. 3
    input:
        Z: altitude, m
    return
        standard atmosphere barometric pressure, Pa
    ç    Ð¼ø@é   gßU"WI§÷>g /Ý$@© )ÚZr   r   ú”/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/CoolProp-6.4.2.dev0-py3.9-macosx-10.14-x86_64.egg/CoolProp/Plots/psy.pyÚ_Pbar   s    r   c                   @   s:   e Zd ZdZddd„Zdd	„ Zd
d„ Zdd„ Zdd„ ZdS )ÚPsychroPlotz
    Plot widget for psychrometric chart
        Add custom margins
        Define a pointer to text state properties, to remove and redraw
    Né   é   éd   c                 C   sb   t ||f|d| _t | | j¡ |  |¡ | j d¡| _t | ¡ | jjj	ddddd g | _
d S )N)ZfigsizeÚdpiéo   ç{®Gáz„?gq=
×£pí?gš™™™™™©?g\Âõ(\ï?)ÚleftÚrightZbottomÚtop)r   Úfigr   Ú__init__Ú	setParentZadd_subplotÚaxes2DZupdateGeometryZfigureZsubplots_adjustÚnotes)ÚselfÚparentÚwidthÚheightr   r   r   r   r#   *   s    

ÿzPsychroPlot.__init__c                 O   s   | j j|i |¤Ž d S ©N)r%   Úplot)r'   ÚargsÚkwargsr   r   r   r,   4   s    zPsychroPlot.plotc                 C   s€   | j  d¡ | j  d¡ | j  d¡ | j j d¡ | j j d¡ t dd¡d }t dd¡d }| j  	||¡ | j  
d	d
¡ d S )NFu   Tdb, ÂºCzAbsolute humidity, kg/kgr    ÚPsychrÚisotdbStartçfffffq@Ú	isotdbEndr   g{®Gáz¤?)r%   Zset_autoscale_onZ
set_xlabelZ
set_ylabelZyaxisZset_ticks_positionZset_label_positionÚPreferencesÚgetfloatZset_xlimZset_ylim)r'   ÚtminÚtmaxr   r   r   Úconfig7   s    zPsychroPlot.configc              
   C   sn   |   ¡  d}d}d}t||ƒD ]B\}}| j | jjd|| |¡|f d|fdddd	¡ |d
8 }q|  ¡  d S )Ng®Gáz®ï?)ÚtdbÚtdpÚtwbÚHRÚwÚhÚvÚrho)õ   ÂºCr@   r@   ú%zkgw/kgdazkJ/kgõ   mÂ³/kgu   kg/mÂ³z%s: %0.4f %sr   zaxes fractionÚsmallÚcenter)ZxycoordsÚsizeÚvagš™™™™™™?)ÚclearPointDataÚzipr&   Úappendr%   ÚannotateÚ__getattribute__Údraw)r'   ÚstateÚyiÚkeysÚunitsÚkeyÚtxtr   r   r   ÚshowPointDataD   s    þ
zPsychroPlot.showPointDatac                 C   s&   | j r| j  ¡ }| ¡  q |  ¡  d S r+   )r&   ÚpopÚremoverL   )r'   Z	anotationr   r   r   rG   Q   s    

zPsychroPlot.clearPointData)Nr   r   r   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r,   r7   rS   rG   r   r   r   r   r   #   s   

r   c                
   @   s   e Zd ZdZddddddddddœ	ZdZdZdd„ Zd	d
„ Ze	dd„ ƒZ
dd„ Zdd„ Zdd„ Ze	dd„ ƒZdd„ Zedd„ ƒZedd„ ƒZdS )ÚPsyCoolpropa„  
    Psychrometric state using coolprop library

    kwargs definition parameters:
        P: Pressure, Pa
        z: altitude, m

        tdp: dew-point temperature
        tdb: dry-bulb temperature
        twb: web-bulb temperature
        w: Humidity Ratio [kg water/kg dry air]
        HR: Relative humidity
        h: Mixture enthalpy
        v: Mixture specified volume

    P: mandatory input for barometric pressure, z is an alternate pressure input
    it needs other two input parameters:
        0 - tdb, w
        1 - tdb, HR
        2 - tdb, twb
        3 - tdb, tdp
        4 - tdp, HR
        5 - tdp, twb
        6 - twb, w
    g        N)	Úzr   r8   r8   r:   r<   r;   r=   r>   r   zUnknown variablesc                 K   s"   | j j ¡ | _| jf i |¤Ž d S r+   )Ú	__class__r.   ÚcopyÚ__call__©r'   r.   r   r   r   r#      s    zPsyCoolprop.__init__c                 K   s*   | j  |¡ | jr&d| _|  ¡  d| _d S )Nr   ZSolved)r.   ÚupdateÚ
calculableÚstatusÚcalculoÚmsgr_   r   r   r   r^   ƒ   s
    zPsyCoolprop.__call__c                 C   sÌ   | j  dd¡}| j  dd¡}| j  dd¡}| j  dd ¡}| j  dd ¡}| j  dd ¡}| j  dd¡}d| _|r||d ur|d	| _nF|r|d urd
| _n2|r |r d| _n"|r°|r°d| _n|rÂ|d urÂd| _t| jƒS )Nr9   r   r8   r:   r<   r;   r=   r>   )ÚTdbÚW)re   ÚRH)re   ÚTwb)re   ÚTdp)ri   rg   )r.   ÚgetÚ_modeÚbool)r'   r9   r8   r:   r<   r;   r=   r>   r   r   r   ra   ‹   s&    zPsyCoolprop.calculablec                 C   s¨   |   ¡ \}}}}}}}}}	}
}|d | _|d | _|d | _|| _|| _|| _|| _|| _|	| _	|| d | _
|
| _d|
 | _|| _dd| jd   | _d| j | _d S )Nr1   r   r   gºƒØ™Bçã?)Ú_libr9   r8   r:   r   ÚPvsÚPvÚwsr<   r;   Úmur>   r?   r=   ZXaZXw)r'   r9   r8   r:   r   rn   ro   rp   r<   r;   r>   r=   r   r   r   rc   £   s     



zPsyCoolprop.calculoc                 C   sð   d| j v r| jd | jd< d| j v r4| jd | jd< d| j v rN| jd | jd< d| j v rh| jd | jd< d	| j v r‚| jd
 | jd	< | j| j d  }| j| j d  }d| j d v r¸|d }d| j d v rÎ|d }d| j| j d || j d |f}|S )Nre   r8   rh   r:   ri   r9   rg   r;   rf   r<   r   r   ç      Y@r   )rk   r.   Ú_P_kPa)r'   Zvar1Zvar2r-   r   r   r   r-   µ   s$    




zPsyCoolprop.argsc                 C   s8   | j d r| j d }n| j d r0t| j d ƒ}nd}|S )z#Barometric pressure calculation, Par   r[   r   )r.   r   ©r'   r   r   r   r   Ú_PÏ   s    

zPsyCoolprop._Pc                 C   s   |   ¡ }|d S )z+Property for ease access to pressure in kPag     @@)ru   rt   r   r   r   rs   Ù   s    zPsyCoolprop._P_kPac                 C   sî   |   ¡ }|  ¡ }d| jv r&| jd }ntdg|¢R Ž }tdg|¢R Ž }tdg|¢R Ž }tdg|¢R Ž }tdg|¢R Ž d }td|| j|ƒd d	 }|| d }	tdd
| jd|ddƒ}
tdg|¢R Ž }tdg|¢R Ž }||||||	|
||||fS )Nre   ri   rh   rf   rg   r   Zp_wsr   éè  r   r   ÚVÚH)r-   ru   rk   r.   r   r   rs   )r'   r-   r   r8   r9   r:   r<   r;   rn   ro   rp   r>   r=   r   r   r   rm   ß   s    
zPsyCoolprop._libc                 C   s²  i }t  dd¡}|d }|  dt ¡}g }|D ]:}| tdd|d|ddƒ¡ |j d	t|ƒ t|ƒ ¡ q,||d
< ||d< |  dt ¡}g }	|D ]F}
|
r¸tdddd|
ddƒ}|	 |d ¡ qŒt  dd¡}|	 |d ¡ qŒ||d< |	|d< |  dt ¡}i }d}|D ]f}g ||< |D ]T}||  tdd|d|d|d ƒ¡ |d7 }|j d	d| t|ƒ t|ƒ  ¡ qqü||d< |  dt ¡}i }d}|D ]r}tdd|ddd|ƒ}|dg}|d tdd|d|ddƒd g}|d7 }|j dd| t|ƒ  ¡ ||f||< q„||d< |  dt ¡}i }t 	ddd¡}t
|ƒD ]~\}}g }
g }|D ]>}|
 tdd|d|d|ƒ¡ | tdd|d|d|ƒd ¡ q:|j d d| t|ƒ  ¡ ||
f||< q&||d!< |S )"z%Function to calculate points in chartr   r   rv   Zisotdbrf   re   rg   r   r   ÚtÚHsZisowri   gÍÌÌÌÌTY@r1   r/   r0   rx   ÚthÚisohrr   rr   é
   ÚHrÚisotwbrh   r   éK   Úisochorgš™™™™™©¿rw   éZ   r>   )r3   r4   ÚLineListrI   r   ÚprogressBarZsetValueÚlenÚnpÚarangeÚ	enumerate)Úclsr(   Údatar   ZP_kPary   rz   r8   rx   r{   r<   r9   r5   Úhrr~   ÚcontÚiÚlinesrh   ÚTrp   ÚTwrw   Zrhr>   ÚTdÚrr   r   r   ÚcalculatePlotó   sl    "* "zPsyCoolprop.calculatePlotc                 C   s†   |  d| d ¡rDg }| d| d ¡ d¡D ]}|r*| t|ƒ¡ q*n>| d| d ¡}| d| d ¡}| d| d ¡}t |||¡}|S )z5Return a list with the values of isoline name to plotr/   ZCustomÚListú,ZStartZEndZStep)Ú
getbooleanrj   ÚsplitrI   Úfloatr4   r†   r‡   )Únamer3   ry   r   ÚstartÚendÚstepr   r   r   rƒ   :  s    zPsyCoolprop.LineList)rV   rW   rX   rY   r.   rb   rd   r#   r^   Úpropertyra   rc   r-   ru   rs   rm   Úclassmethodr“   Ústaticmethodrƒ   r   r   r   r   rZ   X   s6   ÷




FrZ   c                       sJ   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	‡  Z
S )ÚUI_PsychrometryzPsychrometric charts toolNc                    sü   t t| ƒ |¡ |  ¡  |  d¡ t| ƒ}t| dd| _| jjj	 
d| j¡ | | jdddd¡ tƒ | _| j d¡ | | jdd¡ tƒ | _| | jdd¡ ttjƒ| _tdƒ}| j |tj¡ | jj | j¡ | jj | j¡ | | jdd¡ |  ¡  d S )	NzPsychrometric chartr‚   )r   Zmotion_notify_eventr   é   FzSave as PNG)Úsuperr    r#   ZshowMaximizedZsetWindowTitler   r   Ú
diagrama2Dr"   ZcanvasZmpl_connectÚscrollZ	addWidgetr	   r„   Ú
setVisibler
   rb   r   ÚCloseZ	buttonBoxr   Z	addButtonZ
AcceptRoleZrejectedÚconnectZrejectZacceptedÚsavePNGr,   )r'   r(   ZlayoutZbutonPNG©r\   r   r   r#   M  s&    
zUI_Psychrometry.__init__c                 C   s*   t t | ddd¡ƒ}| jjj|dd dS )zSave chart image to png filezSave chart to filez./z!Portable Network Graphics (*.png)z#eeeeee)Z	facecolorN)Úunicoder   ZgetSaveFileNamer£   r"   Zsavefig)r'   Úfnamer   r   r   r¨   e  s
    þzUI_Psychrometry.savePNGc                 C   s\  |  d|d ¡rX| dd¡d }| dd¡d }|| }	| dd¡}
| dd¡}||
 }d}t||ƒD ]@\}}||  kr„|krhn qh|
|  krœ|krhn qh|d	7 }qht|ƒ}|  d|d
 ¡rÊ||7 }| d|d ¡}t|| d d	 ƒ}t || ||d	   | || ||d	    |	 ¡d d tj }| jj	j
||| || f|dddd dS )a  
        Draw annotation for isolines
            name: name of isoline
            Preferences: Configparse instance of pychemqt preferences
            t: x array of line
            W: y array of line
            label: text value to draw
            unit: text units to draw
        r/   Úlabelr0   r1   r2   Z	isowStartZisowEndr   r   rP   Úpositionr   g     €v@g       @rC   rD   )ZrotationrE   ZharF   N)r–   r4   rH   ÚstrÚintr†   ZarctanÚpir£   r%   rJ   )r'   r™   r3   ry   rf   r¬   Zunitr5   r6   ÚxZwminZwmaxÚyr   ÚtiZwiÚposÚpZrotr   r   r   Ú	drawlabell  s(    
0
DÿzUI_Psychrometry.drawlabelc              	   C   sd  t ƒ }| d¡ | jj ¡  | j ¡  dt }tj 	|¡r„t
|dƒ.}t |¡}| j d¡ t ¡  W d  ƒ qÌ1 sx0    Y  nH| j d¡ | j d¡ t ¡  t | ¡}t |t
|dƒ¡ | j d	¡ | j d
¡ t ¡  | dd¡d }dd„ |d D ƒ}|d }i }| dd¡|d< | dd¡|d< | dd¡|d< | dd¡|d< d|d< | jj||fi |¤Ž i }| dd¡|d< | dd¡|d< | dd¡|d< | dd¡|d< d|d< t|ƒD ],\}	}
| jj|
|
gd ||	 gfi |¤Ž qÀ|d! }|d" }i }| dd#¡|d< | dd$¡|d< | dd%¡|d< | dd&¡|d< d|d< t|ƒD ],\}	}| jj||	 |g||gfi |¤Ž qRi }| dd'¡|d< | dd(¡|d< | dd)¡|d< | dd*¡|d< d|d< |d+  ¡ D ]4\}}| jj||fi |¤Ž |  d,||||d-¡ qØi }| dd.¡|d< | dd/¡|d< | dd0¡|d< | dd1¡|d< d|d< |d2  ¡ D ]D\}
\}}| jj||fi |¤Ž |
d }d3}|  d4|||||¡ qfi }| dd5¡|d< | dd6¡|d< | dd7¡|d< | dd8¡|d< d|d< |d9  ¡ D ]@\}\}}| jj||fi |¤Ž |}d:}|  d;|||||¡ q| j ¡  | j d<t ¡ dS )=z
Plot chartr   z%i.pklr’   zLoading cached data...NTzCalculating data, be patient...r<   FzPlotting...r/   r2   r1   c                 S   s   g | ]}|d  ‘qS )r1   r   )Ú.0r³   r   r   r   Ú
<listcomp>¤  ó    z(UI_Psychrometry.plot.<locals>.<listcomp>ry   rz   ZsaturationlineStyleZlsZsaturationlineWidthZlwZsaturationColorÚcolorZsaturationmarkerÚmarkeré   Z
markersizeZisotdblineStyleZisotdblineWidthZisotdbColorZisotdbmarkerr   rx   r{   ZisowlineStyleZisowlineWidthZ	isowColorZ
isowmarkerZisohrlineStyleZisohrlineWidthZ
isohrColorZisohrmarkerr~   r|   rA   ZisotwblineStyleZisotwblineWidthZisotwbColorZisotwbmarkerrh   r@   r   ZisochorlineStyleZisochorlineWidthZisochorColorZisochormarkerr>   rB   r   z	P = %i Pa)r   Úreadr£   r%   Úclearr7   r   ÚosÚpathÚisfileÚopenÚcPickleÚloadrb   ZsetTextr   ZprocessEventsr„   r¥   rZ   r“   Údumpr4   rj   r,   rˆ   Ú	iteritemsr¶   rL   )r'   r3   ÚfilenameZarchivorŠ   r6   ry   rz   Úformatr   r   rx   r{   r~   ZH0r   ÚvaluerR   r>   r‘   r   r   r   r,   ‹  sž    


(
&&
zUI_Psychrometry.plotc                 C   sD   |j r@|jr@|  |j |j¡}|j|jk r6| j |¡ n
| j ¡  dS )z2Update graph annotate when mouse scroll over chartN)ZxdataZydataÚcreateStaterp   r£   rS   rG   )r'   ÚeventÚpuntor   r   r   r¤   ç  s
    zUI_Psychrometry.scrollc                 C   s   |d }t t||d}|S )z7Create psychrometric state from click or mouse positionr1   )r   r8   r<   )rZ   r   )r'   r±   r²   r8   rÌ   r   r   r   rÊ   ð  s    zUI_Psychrometry.createState)N)rV   rW   rX   rY   r#   r¨   r¶   r,   r¤   rÊ   Ú__classcell__r   r   r©   r   r    J  s   \	r    Ú__main__)+r¿   rÃ   r   Únumpyr†   Z"matplotlib.backends.backend_qt4aggr   Zpylabr   ZCoolProp.HumidAirPropr   r   ZPyQt4.QtGuir   r   r	   r
   r   r   r   r   r3   rÀ   ÚjoinÚdirnameÚ__file__Zconfig_pathr½   r4   r   r   r   ÚobjectrZ   r    rV   ÚsysÚargvZappZ
aireHumedoZshowÚexitÚexec_r   r   r   r   Ú<module>   s.   (
5 s .

