Ƹ?kVddlZddlZddlmZddlmZmZmZmZGdde Z dS)N)Filter)frangexfrangeX_LEGEND_POINTSY_LEGEND_POINTSc eZdZdZdZdddddddddddddf dZdZd Zd Zd Z d Z d Z e dZ dddefdZddZdZdZdZdS)SvgChartc |tj|_d|_d|_d|_d|_d|_d|_t|_ t|_ d|_ d|_|jd|jd|jzzd zi|jj}d }||j|d t)|j  t+}||jd dddd}||dddd||ddd||ddddS)Nix7r width(a function show_tip(evt, svg_id, x1, y1, x2, y2, t1, v1, t2, v2){ var rootDocument = evt.target.ownerDocument; var tip_group = rootDocument.getElementById('tip_group'); var tip_text = rootDocument.getElementById('tip_text'); var tip_rect = rootDocument.getElementById('tip_rect'); var svgDocument = rootDocument.getElementById(svg_id); var y_offset = parseInt(svgDocument.getAttribute("y")); var x = evt.layerX; var y; var v; var t; if (x< x1+((x2-x1)/2)) { x = x1; y = y1 + y_offset; v = v1; t = t1; } else { x = x2; y = y2 + y_offset; v = v2; t = t2; } tip_text.firstChild.data = t +', ' + v; var width = tip_text.getComputedTextLength(); tip_rect.setAttribute("x",x - ((width+10) / 2)); tip_rect.setAttribute("y",y - 25); tip_rect.setAttribute("width",width + 10); tip_text.setAttribute("x",x - (width / 2)); tip_text.setAttribute("y",y - 25 + %font_size%); tip_text.setAttribute("width",width); tip_group.setAttribute("visibility","visible"); }z %font_size%)contentshadowz200%)idxyrheight SourceAlphaoffOut)resultdxdyblurOut10)r stdDeviation SourceGraphicnormal)in2mode)svgwriteDrawingdwg padding_yrrleft_legend_widthgraph_offset_y_svg_idrx_legend_pointsry_legend_points font_size point_radiusupdatedefsaddscriptreplacestrrfilterfeOffsetfeGaussianBlurfeBlend)selfr1r3filters shadow_filters /builddir/build/BUILDROOT/lve-stats-4.3.2-1.el9.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/lvestats/lib/chart/svggraph.py__init__zSvgChart.__init__s#%%  !# .. $*q43I/I"IB"NOPPPx} (*R  s4>GZGZ)[)[\\]]]((HQf]c!d!dee '**=aTU*VVWWW'00)Z^0__```'///yx/XXYYYYYc X|j|jddd}||jddd|jdzfd d d d ||jd dd|jdS)N tip_grouphiddenzpointer-events: none;)id_ visibilitystyletip_rect)rrr g?rblackyellow)rCinsertsizerxrystrokefillTtip_text)rCrIr.)r'r2grectr.text)r:tips r= _finalizezSvgChart._finalizeUshll48::+(Ri:jjkk  dns*+       cz&DN [[\\\\\r?Nc|SNvs r=zSvgChart.kqr?c|SrWrXrYs r=r[zSvgChart.lr\r?redc  ddg}|} |td|D}|td|D}td|D}td|D}n$#t$rd}d}d}d}d |D}YnwxYw|jd z }|s-||z |jz } fd t |||z|D}|sd | pd zg}|s|j|jz}nd|jzt|dz z}t|dkr$d|jzd|zz t|dz z}n |jdz}d|}|j |j |d|j f}|j}| |j d|}| |j |j|jf|j|jf|rA| |j ||j|jf|j|||| ||| |j dd}| |j d|d}| |j |j|jf|jdz|jdzfdd |||||g}g}||z dkr=t1t3||D]\} }!|| |||||}"d!| D}#t7t3|| |!|vr%|| ot;|# t1t3|"|"dd}$t1t3| | dd}%t1t3|$|%}&|&D]\}'}(|'\})}*|(\}+},|)\}-}.|*\}/}0|+\}1}2|,\}3}4||j |)|*|!dd"|d#|-d$|.d$|/d$|0d%| |1d&t? |2| pd zd&| |3d&t? |4| pd zd'(|\|D]Y}5||5|||||}6||j |6d|6d|d)Z|r$tA|r|!|n|D]}!|j|j|z |jz}8}7|j|jz|8}.}-||j |7|8f|-|.fd*|!d+,| r:t7t3|| |!|vr|!||D]}'| |'|"|| ||xj |jd-z|jzz c_ |j #d.|j i|r|$||s|r|$d|||| |%|| dS)/aI :param datasets: list of datasets. each dataset is list of tuples [(x, y), (x, y) ... ] :param colors: list of html-like color strings, for ex: ['red', 'green', '#FFAAED'], for each of the dataset :param title: name of the graph :param minimum_y: minimum value for dataset's values :param maximum_y: maximum value for dataset's values :param names: list of dataset names. If provided, then it's used for legend :param x_legend: if provided then it's used as titles for x axis :param x_legend_generate: if provided and x_legend is not provided, then using x_legend_converter generate up to x_legend_generate marks :param x_legend_converter: function to convert x values to x_legend values. :param y_legend: if provided then it's used as titles for y axis :param y_legend_converter: if y_legend is not provided, it is generated from range(min_y, max_y). Converter can be applied to make it look better. For example sizeutil.convert_bytes :param unit: if provided, then it's used as suffix for y values :param message: if provided, the graph will contain the text message in the middle, like "No faults" or "No data" :param fault_lines: LVES-602. If provided, the graph will contain vertical lines from average to limit :param fault_color: LVES-602. Color of the fault lines :type fault_lines: list[tuple[(float, float)]] :type fault_color: str >>> svgchart = SvgChart() >>> d1 = [(0,1), (1,1.5), (4,2), (5,6), (5.1,6), (5.6,6), (9,3), (10,10)] >>> d2 = [(0,0), (1.5,1.5), (2,2), (2.5,3), (3,4), (5,4), (7,3), (8,2), (9,1), (10,1)] >>> datasets = [d1, d2] >>> colors = ['red', 'green'] >>> names = ['foo', 'bar'] >>> svgchart.add_graph(datasets, colors, 0, 10, unit='DD', names=names) >>> svgchart.add_graph(datasets, colors, 0, 10, x_legend=[1,2,3,4,5,6,7,8,9], unit='Kg', message="No Faults") >>> print svgchart.dump() >>> svgchart.save('/tmp/1.svg') averagedatabaseNc3HK|]}td|DVdS)c3 K|] \}}|V dSrWrX.0_rs r= z/SvgChart.add_graph...&$=$=6AqQ$=$=$=$=$=$=r?Nminredatasets r=rgz%SvgChart.add_graph..9WW7$=$=W$=$=$= > >WWWWWWr?c3HK|]}td|DVdS)c3 K|] \}}|V dSrWrXrds r=rgz/SvgChart.add_graph...rhr?Nmaxrks r=rgz%SvgChart.add_graph..rmr?c3HK|]}td|DVdS)c3 K|] \}}|V dSrWrXrerrfs r=rgz/SvgChart.add_graph...& 9 9v1 9 9 9 9 9 9r?Nrprks r=rgz%SvgChart.add_graph..9SSwC 9 9 9 9 9::SSSSSSr?c3HK|]}td|DVdS)c3 K|] \}}|V dSrWrXrts r=rgz/SvgChart.add_graph...rur?Nrirks r=rgz%SvgChart.add_graph..rvr?rcg|]}gSrXrX)rerfs r= z&SvgChart.add_graph..s---q---r?g4@c&g|] }|SrXrX)rery_legend_converters r=rzz&SvgChart.add_graph..s%]]]!**1--]]]r?0?rg@svg-rCrI cut_lines_rrIrJrIr.lines url(#shadow)rr6url(#cut_lines_) clip_pathwhiterGrIrJrNrMcg|]\}}|SrXrXrds r=rzz&SvgChart.add_graph..s111v1111r?zshow_tip(evt, 'z', z, z, 'z', 'z'))rM stroke_width onmousemove)rMrnone2)rNrMrr r)& _gen_suffixrjrq ValueErrorrr-rrr,lenr'r2svgr*r1clipPathrRr)r(rSr._draw_y_legendrQ _draw_gridlistzipconvert_coordinatesdictappendanyliner5all_draw_no_activity _draw_namesr0 _add_x_legend _draw_message)9r:datasetscolorstitle minimum_y maximum_yx_legendx_legend_generatey_legendr|x_legend_converternamesunitmessage fault_lines fault_color average_namessuffix maximum_x minimum_xy_offsetr pattern_widthpattern_heightsvg_idrr1clippath lines_groupboundaryris_average_emptyrlcolorcoordsvalue_lines_datas data_listrdatap1p2d1d2x1y1x2y2t1v1t2v2 fault_line fault_coordsx0y0s9 ` r= add_graphzSvgChart.add_graphbsnb#J/ !!## . WWhWWWWW  WWhWWWWW SS(SSSSSISS(SSSSSII . . .IIII--H---HHH  .;% ^i'4+??B]]]]viUWY[7\7\]]]H ,tzr*+H F J$*>>MM 4:-3x==13DEM x==1  !DK/!h,>CMMTUDUVNN![C/N hll48<*RZ^ZdfjfqYr]ssttt  u GGDHMM%1G0XdhdrMss t t t C4JJJggdhjjGNjKKLL ??48::8S&8S8S8S:#T#TUU TX]]4+A4>*R)-aq(I(/#AA B B B .-JJJ y 1 $ $"&s8V'<'<"="=& & 11'9iQZ\egopp 21111FE**++E2mCC$++E,D#e**nEEEc&&*5566c'7122;7788 VV!4!455 $-LT4!FB!FBFBFBFBFBLL #()*!o&!o!oR!o!o2!o!o!o!or!o!o$6$6r$:$:!o!o@CDVDVWYDZDZ@[@[_c_igi@j!o!o$6$6r$:$:!o!o@CDVDVWYDZDZ@[@[_c_igi@j!o!o!o &      *&"- - -J#'#;#;"!!!! $$LLL (O\!_#.)*&,,----  1C(8$9$9 1&&x000  5 50$+2H4>2YB*t'==rB TX]]B8b"XFSX8;+==???5T#fe"4"455e< MM**8444  D LL     eV,,, t{R/$.@@ 4#67888  )   x ( ( ( b- b   tY ;LN` a a a 3(((((sA(BB%$B%c z|rd}d}|}t||D]\}}|j|jzdz} d|jz||dzzz} ||j| | f||f|d||j|| |zdz| |zf||d z }dSdS) Nrrr rGrrrr)rrr)r(r2r'rRrS) r:rrrsir.namerrrs r=rzSvgChart._draw_names)s  AAI!$UF!3!3   uJ!77"<'!q1u+5 aV1a&uU\ ]]^^^ dAEAIq1u3EQZ [[\\\Q    r?c |rVd}||j||j|jdzz|j|jdzzf|dSdS)Nrrr)r2r'rSr)rr(r)r:rrmessage_font_sizes r=rzSvgChart._draw_message5s  u "  GGDHMM'43IDJZ[O3[37>DKSTDT3T3Var"tt u u u u u u ur?c V||jd}d}t|j|dz }|D]]} | |pd} ||j| d|j|z ||zz |dzz|jzf||dz }^dS) Nrrrrr~rrr)r2r'rQrjr.rSrr() r:rrrrrylgrr.legendtxts r=rzSvgChart._draw_y_legend<sggdhjjJj//00 (:;;   F)TZR))C GGDHMM4;1NQ4FFVWWZ^Zhhi#"%% & & & FAA   r?c td|j|D]Z}||j||jz|j|jzf||jz|jfddd[td|z|j|D]j}||j|j|j|z |jzf|j|jz|j|z |jzfdddkdS)NrrGrz1 2)startendrMrstroke_dasharray)rrr2r'rr)rr()r:rrrrrrs r=rzSvgChart._draw_gridHs;DJ 66 @ @A LLa$2H.H$+X\XfJf-g,-0F,F+W.5A8= '?? @ @ @ @ Xt{NCC @ @A LLd.DdkTUoX\XfFf-g,0,BTZ,OQUQ\_`Q`cgcqQq+r.5A8='?? @ @ @ @ @ @r?c ||jd|jdz|jdzzt ddzz |jdzfddS)Nz No activityrrG)rIrN)r2r'rSrr)rr)r:rs r=rzSvgChart._draw_no_activityXsz HMMJ!Od&<&AAC DVDVZ[D[[K1$&        r?c djz|z z n#t$rdYnwxYwdjzdzz ||z z  fd|D}|S)z :type y_offset: float :type minimum_y: float :type minimum_x: float :type maximum_y: float :type maximum_x: float :type dataset: tuple :rtype: list rrrcfg|]-\}}|z zjzjz |zz jzf.SrX)r)rr()rerrrrrr:rs r=rzz0SvgChart.convert_coordinates..qs_   AY"$t'== h&R/$.@    r?)rZeroDivisionErrorr) r:rlrrrrrrrrs ` ` ` @@r=rzSvgChart.convert_coordinatesbs  "y9'<=BB    BBB DK!h,.9y3H I        "     s  ''cd}t|}|d}|d}||kr*||dz kr||dz\}} |\} \} } || krd}nd}|S)NFrT)r) ridxrrrlist_lenrr next_linerfn_y2s r=_is_peakzSvgChart._is_peakzsty>> U U 77X\!!(q1 1( 9At::!F r?c |sX|s Jd|j|z}td|||fDsdSfdt||||z |z D}n|st}t t |t |t |t |z |z zt |t |z |z }fd|D}t|dz }t |d}d|jz|z }dttj } |j |j | d|jf } d} t |d } d} |D]}t|}t|| krt|} |j|| zz}d|jz}| |j |||f| d |d |d | dz } |xjd| | zzz c_|j d|jidS)Nz'Number should be specified and not zeroc3K|]}|duV dSrWrX)rerZs r=rgz)SvgChart._add_x_legend..s&EEq}EEEEEEr?c&g|] }|SrXrXrerrs r=rzz*SvgChart._add_x_legend..s7III!**1--IIIr?c&g|] }|SrXrXrs r=rzz*SvgChart._add_x_legend..s%@@@!**1--@@@r?rrrrrrz rotate(90, ,r)rIr. transformr r)rrrrrrjrqrr5uuiduuid4r'r2rr*r)r(rSr0)r:x_valuesmin_xmax_xnumberrrrpartsrrmax_x_legend_textr.rrrrrs ` r=rzSvgChart._add_x_legends 7 D DD D D6 J&0MEEueV.DEEEEE IIIIuuu}.FGGIIIHH )(c(mm!(mms8}}s8}}/LPV.VV"8}}s8}}<FHHHA@@@x@@@HMMA%EqMME 4:-6M+DJLL))++hll48<*RZ^ZdfjfqYr]sstttggdhjjGNjKKLL ??48::8S&8S8S8S:#T#TUU TX]]4+A4>*R)-aq(IPW*1#33 4 4 4  dD,BTZST_,T,0NT[A=M,M,OZcee f f f t{R/$.@@ 4#6788888r?cNt|j}|xjdz c_|S)zn Generate suffix for graph methods random suffix to distinguish svg's from each other r)r5r+)r:rs r=rzSvgChart._gen_suffixs( T\""   r?cf|d}||jzS)Nz( )rUr'tostring)r: xml_headers r=dumpz SvgChart.dumps0 @ DH--////r?cb||j|dSrW)rUr'saveas)r: file_names r=savez SvgChart.saves,   """""r?rW)__name__ __module__ __qualname__r>rUrrrrrrr staticmethodrr5rrrr r rXr?r=r r s_CZCZCZJ ] ] ]   $(%0[%0["#E)E)E)E)N   uuu   @@@    0\$-1T^a29292929h9999:000 #####r?r ) rr%svgwrite.filtersrlvestats.lib.chart.utilrrrrobjectr rXr?r=rs ######UUUUUUUUUUUU_#_#_#_#_#v_#_#_#_#_#r?