o ?ß}h;Lã@s\ddlmZddlTddlmZddlmZddlmZddl Z ddl Z ddl m Z m Z e eefZGd d „d eƒZejjegejjegejjeeegejjgejjeeeeegejjeegejjegejje gej!jeegej"jegi Z#Gd d „d ƒZ$Gd d„de$ƒZ%Gdd„de%ƒZ&Gdd„de%ƒZ'Gdd„de%ƒZ(Gdd„de$ƒZ)Gdd„de$ƒZ*dS)é)Ú annotationsé)Ú*)Ú SVGTensor)Ú get_roots)ÚEnumN)ÚListÚUnionc@s4eZdZdZdZdZdZdZdZdZ dZ d Z d Z d S) Ú SVGCmdEnumÚmÚlÚcÚzÚaÚqÚhÚvÚsÚtN) Ú__name__Ú __module__Ú __qualname__ÚMOVE_TOÚLINE_TOÚ CUBIC_BEZIERÚ CLOSE_PATHÚ ELLIPTIC_ARCÚ QUAD_BEZIERÚLINE_TO_HORIZONTALÚLINE_TO_VERTICALÚCUBIC_BEZIER_REFLÚQUAD_BEZIER_REFL©r"r"ú8/data/cref/OmniSVG-kaiyuan/deepsvg/svglib/svg_command.pyr sr c@sÆeZdZdEdd „Zd d „ZedFdGdd„ƒZdd„Zdd„ZdHdd„Z edIdd„ƒZ edJd(d)„ƒZ d*d+„Z d,d-„Z dKd/d0„ZdLd2d3„Zd4d5„ZdMd7d8„Zd9d:„ZdNdKsz'SVGCommand.from_str..z Expected z arguments for command réÿÿÿÿ)$r)r ÚlowerrÚlenrÚvalueÚisupperÚupperr$Úfrom_strrÚSVGCommandCloseÚsumÚsvgCmdArgTypesÚranger;ÚislowerÚ translateÚ isinstanceÚCoordÚto_pointÚappendrrÚSVGCommandLineÚSVGCommandMoverÚ SVGCommandArcrÚSVGCommandBezierrr!r Úcontrol2r*)r4r6ÚposZ initial_posr8ÚcmdZ l_cmd_strÚl1Úl2Znb_argsZexpected_nb_argsr ÚiÚ_r&r=r;ÚargZ cmd_parsedÚcontrol1rTr"r"r#rE2sj  (             zSVGCommand.from_strcCs|jj ¡}|›| ¡›Sr+)r%rBrDÚ get_geoms©r,rVr"r"r#Ú__repr__zó zSVGCommand.__repr__cCs*|jj ¡}|›d dd„|jDƒ¡›S)NÚ cSsg|]}| ¡‘qSr")Úto_str)r<r[r"r"r#r>€óz%SVGCommand.to_str..)r%rBrDÚjoinr&r^r"r"r#rb~s zSVGCommand.to_strr?cCr.r+r/)r,ÚPAD_VALr"r"r#Ú to_tensor‚r3zSVGCommand.to_tensorÚvectorú torch.Tensorc CsÚt|dƒ|dd…}}ttj|ƒ}t|dd… ¡Ž}t|dd… ¡Ž}t|d ¡ƒ}t|d ¡ƒ}t |dd… ¡Ž}t |dd… ¡Ž} t |dd … ¡Ž} t |d d… ¡Ž} t   ||||||| | | ¡ S) Nrrr:ééééé é ) Úintr rÚCOMMANDS_SIMPLIFIEDÚRadiusÚtolistÚAngleÚFlagÚitemr)r$Ú from_args) rgÚ cmd_indexr&rVÚradiusÚx_axis_rotationÚlarge_arc_flagÚ sweep_flagr(r\rTr*r"r"r#Ú from_tensor…szSVGCommand.from_tensorrxrqryrsrzrtr{r\rTc Cst|tjur t||ƒS|tjurt||ƒS|tjur t||||ƒS|tjur*t||ƒS|tj ur8t ||||||ƒSdSr+) r rrQrrPrrSrrFrrR) r%rxryrzr{r(r\rTr*r"r"r#rv•s        ÿzSVGCommand.from_argscOs"ddlm}||gƒj|i|¤ŽS)Nr)ÚSVGPath)Úsvg_pathr}Údraw)r,r&Úkwargsr}r"r"r#r£s zSVGCommand.drawcCr.r+r/r1r"r"r#Úreverse§r3zSVGCommand.reverseÚothercCsR|j|j}}|j|jkr|j|jkS|j|jkp(t | ¡| ¡¡o(|j|jkSr+)r(ÚyÚxÚnpÚiscloseÚnorm)r,r‚Úp1Úp2r"r"r#Ú is_left_toªs  ,zSVGCommand.is_left_toécCr.r+r/©r,Únr"r"r#Ú numericalize²r3zSVGCommand.numericalizecCs |j|jgSr+©r(r*r1r"r"r#r]µs zSVGCommand.get_geomsFcCsLddlm}|r dn|rdnd}|s|rdnd}||jtdƒ|d d |d gS) Nr)Ú SVGCircleÚredÚpurpleÚ deepskybluegè?çð?çš™™™™™Ù?Tú.1)rxÚcolorÚfillÚ stroke_widthÚopacity)Ú svg_primitiverr*rq)r,ÚfirstÚlastrr—ršr"r"r#Úget_points_viz¸s zSVGCommand.get_points_vizcCógSr+r"r1r"r"r#Úget_handles_viz¾r3zSVGCommand.get_handles_vizé cCrŸr+r"©r,rÚ return_arrayr"r"r#Ú sample_pointsÁr3zSVGCommand.sample_pointsr:cCr.r+r/rŒr"r"r#ÚsplitÄr3zSVGCommand.splitcCr.r+r/r1r"r"r#ÚlengthÇr3zSVGCommand.lengthcCr.r+r/r1r"r"r#ÚbboxÊr3zSVGCommand.bbox)r%r r&r'r(r)r*r))NNN)r4r5r6r7r8r$©r?)rgrh)r%r rxrqryrsrzrtr{rtr(r)r\r)rTr)r*r))r‚r$©r‹©FF©r¡F©r:)rrrr-r2Ú staticmethodrEr_rbrfr|rvrrrŠrŽr]ržr r¤r¥r¦r§r"r"r"r#r$'s. G          r$csReZdZ‡fdd„Zddd„Zddd„Zd d „Zd d „Zddd„Zdd„Z ‡Z S)ÚSVGCommandLinearcstƒj|i|¤ŽdSr+)Úsuperr-)r,r&r€©Ú __class__r"r#r-ÏózSVGCommandLinear.__init__r?cCsDtj |jj¡}t |g|gd¢|j ¡¢|gd¢|j  ¡¢¡S)Nrkrj) rrpÚindexr%rBÚtorchÚtensorr(rfr*©r,rerwr"r"r#rfÒsÿþýüzSVGCommandLinear.to_tensorr‹cCs|j |¡|j |¡dSr+)r(rŽr*rŒr"r"r#rŽÚr`zSVGCommandLinear.numericalizecCs| |j ¡|j ¡¡Sr+)r±r(r2r*r1r"r"r#r2ÞózSVGCommandLinear.copycCs| |j|j¡Sr+)r±r*r(r1r"r"r#rászSVGCommandLinear.reverser:cCs|gSr+r"rŒr"r"r#r¥äszSVGCommandLinear.splitcCst|j|jƒSr+)ÚBboxr(r*r1r"r"r#r§çózSVGCommandLinear.bboxr¨r©r¬) rrrr-rfrŽr2rr¥r§Ú __classcell__r"r"r°r#r®Îs    r®cs6eZdZd d ‡fdd„ Zd‡fdd „ Zd d „Z‡ZS)rQNr(r)r*cs0|dur tdƒ|}}tƒ tj|g||¡dS)Nr9)r)r¯r-r r©r,r(r*r°r"r#r-ìszSVGCommandMove.__init__Fcs8ddlm}tƒ ||¡}| ||j|jddd¡|S)Nr)ÚSVGLiner‘çà?)r—Ú dasharray)r›r¼r¯ržrOr(r*)r,rœrr¼Z points_vizr°r"r#ržñs zSVGCommandMove.get_points_vizcCst|j|jƒSr+)r¸r*r1r"r"r#r§÷r¹zSVGCommandMove.bboxr+©r(r)r*r)rª)rrrr-ržr§rºr"r"r°r#rQësrQcs:eZdZd‡fdd„ Zddd „Zdd d „Zd d„Z‡ZS)rPr(r)r*cstƒ tj|g||¡dSr+)r¯r-r rr»r°r"r#r-üszSVGCommandLine.__init__r¡Fcsht dd|¡}|r)d|dd…dfˆjjd|dd…dfˆjjd}|S‡fdd„|Dƒ}|S)Nr9r”rcs$g|]}d|ˆj|ˆj‘qS©rr)r<Úalphar1r"r#r>s$z0SVGCommandLine.sample_points..)r…Úlinspacer(rUr*)r,rr£rÚpointsr"r1r#r¤ÿs <zSVGCommandLine.sample_pointsr:cCs2| |d¡}dd„t|dd…|dd…ƒDƒS)NrcSsg|] \}}t||ƒ‘qSr")rP)r<rˆr‰r"r"r#r> sz(SVGCommandLine.split..r?)r¤Úzip)r,rrÃr"r"r#r¥ s$zSVGCommandLine.splitcCs|j |j¡Sr+)r(Údistr*r1r"r"r#r¦ r¹zSVGCommandLine.lengthr¿r«r¬)rrrr-r¤r¥r¦rºr"r"r°r#rPûs   rPcs(eZdZd ‡fdd„ Zd dd„Z‡ZS) rFr(r)r*cstƒ tjg||¡dSr+)r¯r-r rr»r°r"r#r-r·zSVGCommandClose.__init__FcCrŸr+r")r,rœrr"r"r#ržr3zSVGCommandClose.get_points_vizr¿rª)rrrr-ržrºr"r"r°r#rFsrFcsðeZdZd<‡fdd„ Zedd „ƒZed d „ƒZed d „ƒZedd„ƒZdd„Z d=dd„Z dd„Z e dd„ƒZ dd„Zd>dd„Zdd„Zd d!„Zd"d#„Zd?d%d&„Zd@d(d)„ZdAd,d-„ZdBd/d0„ZdCd2d3„Zd4d5„Zd6d7„Zd8d9„Zd:d;„Z‡ZS)DrSr(r)r\rTr*cs:|dur| ¡}tƒ tj|||g||¡||_||_dSr+)r2r¯r-r rr\rT)r,r(r\rTr*r°r"r#r-s  zSVGCommandBezier.__init__cCó|jSr+)r(r1r"r"r#rˆ"ózSVGCommandBezier.p1cCrÆr+)r*r1r"r"r#r‰&rÇzSVGCommandBezier.p2cCrÆr+)r\r1r"r"r#Úq1*rÇzSVGCommandBezier.q1cCrÆr+)rTr1r"r"r#Úq2.rÇzSVGCommandBezier.q2cCs&t|j ¡|j ¡|j ¡|j ¡ƒSr+)rSr(r2r\rTr*r1r"r"r#r22s&zSVGCommandBezier.copyr?cCsNtj tjj¡}t |g|gd¢|j  ¡¢|j   ¡¢|j   ¡¢|j   ¡¢¡S)Nrk) rrpr³r rrBr´rµr(rfr\rTr*r¶r"r"r#rf5sÿþýüûzSVGCommandBezier.to_tensorcCs*t |j ¡|j ¡|j ¡|j ¡g¡Sr+)r…Úarrayr(rrr\rTr*r1r"r"r#Ú to_vector>s üzSVGCommandBezier.to_vectorcCs.tt|dƒt|dƒt|dƒt|dƒƒS)Nrrr:ri)rSr))rgr"r"r#Ú from_vectorFs.zSVGCommandBezier.from_vectorcCst|j|j|j|jƒSr+)rSr*rTr\r(r1r"r"r#rJr²zSVGCommandBezier.reverser‹cCs4|j |¡|j |¡|j |¡|j |¡dSr+)r(rŽr\rTr*rŒr"r"r#rŽMs   zSVGCommandBezier.numericalizecCs|j|j|j|jgSr+©r(r\rTr*r1r"r"r#r]SszSVGCommandBezier.get_geomscCsxddlm}m}||jtdƒdddd}||jtdƒdddd}||j|jdd dd }||j|jdd dd }||||gS) Nr)r¼rr•ÚlimeTr–)rxr—r˜r™Úgreyr½)r—r¾r™)r›r¼rr\rqrTr(r*)r,r¼rZanchor_1Zanchor_2Zhandle_1Zhandle_2r"r"r#r Vs  z SVGCommandBezier.get_handles_vizcCsTd|d|jdd|d||jdd||d|j|d|jS)Nrrir:rÍ)r,rr"r"r#Úeval_sTzSVGCommandBezier.evalrcCs¤|dkr,dd|d|j|jdd|||j|jd|d|j|jS|dkrPdd||jd|j|jd||jd|j|jSt‚)Nrrir:é)r\r(rTr*r0)r,rrr"r"r#Ú derivativebs P@zSVGCommandBezier.derivativer‚cCsh| d¡| d¡ }}t | ¡d¡st | ¡d¡rdSt t | ¡ | ¡¡dd¡¡}t |¡S)Nr”r9gð¿) rÒr…r†r‡ÚarccosÚclipÚ normalizeÚdotÚrad2deg)r,r‚Út1Út2Úangler"r"r#rÚjs  " zSVGCommandBezier.angler¡FcCs~| ¡}t dd|¡}tjt |¡||d|dgdd}t gd¢gd¢gd ¢gd ¢g¡}|||}|r8|Sd d „|DƒS) Nr9r”r:rir©Úaxis)r”r9r9r9)éýÿÿÿç@r9r9)rÞiúÿÿÿrÞr9)r?rÞrÝrcSsg|]}t|ƒ‘qSr")r))r<Úpr"r"r#r>€rcz2SVGCommandBezier.sample_points..)rËr…rÂÚstackÚ ones_likerÊ)r,rr£ÚbrÚZÚQrÃr"r"r#r¤qs$ ý zSVGCommandBezier.sample_pointsr½c Cs| ¡}t gd¢|d |ddg|ddd|d||ddg|dd d|dd|d|d|d|dgg¡}t |dd d|dd|d|d|d|dgd|ddd|d||dgdd|d |ggd¢g¡}t ||¡t ||¡fS) N)rrrrrrr:éþÿÿÿrirÝ)rrrr)rËr…rÊrSrÌ)r,rrâÚQ1ÚQ2r"r"r#Ú _split_two‚s "8ý<"ýzSVGCommandBezier._split_twor:cCsLg}|}t|dƒD]}d||}| |¡\}}| |¡q | |¡|S)Nrr”)rIrèrO)r,rZb_listrârYrÚb1r"r"r#r¥s   zSVGCommandBezier.splitcCs6|jddd}tjj|dd…|dd…dd ¡S)NédT)rr£rr?rÛ)r¤r…Úlinalgr‡rG)r,rßr"r"r#r¦›s(zSVGCommandBezier.lengthcCst | ¡¡Sr+)r¸Ú from_pointsÚ find_extremar1r"r"r#r§Ÿr¹zSVGCommandBezier.bboxcCs”d|j d|jd|j|j}d|jd|j|j}d|j|j}t|j|j|jƒt|j|j|jƒ}}g|¢|¢}dd„|Dƒ}|S)NrirÑr:cSs(g|]}d|krdkrnn|‘qS)rrr"©r<Úrootr"r"r#r>©s(z/SVGCommandBezier.find_roots..)rˆrÈrÉr‰rr„rƒ)r,rrâr Zx_rootsZy_rootsZ roots_catÚrootsr"r"r#Ú find_roots¢s&& zSVGCommandBezier.find_rootscs,ˆjˆjg}| ‡fdd„ˆ ¡Dƒ¡|S)Ncsg|]}ˆ |¡‘qSr")rÐrîr1r"r#r>®sz1SVGCommandBezier.find_extrema..)r(r*Úextendrñ)r,rÃr"r1r#rí¬s zSVGCommandBezier.find_extrema)r(r)r\r)rTr)r*r)r¨r©rÀ)r‚rSr«)r½r¬)rrrr-Úpropertyrˆr‰rÈrÉr2rfrËr­rÌrrŽr]r rÐrÒrÚr¤rèr¥r¦r§rñrírºr"r"r°r#rSs:               rScs‚eZdZd+‡fd d „ Zd d„Zd,dd„Zdd„Zd-dd„Zd.dd„Zdd„Z dd„Z d/d d!„Z d"d#„Z d0d%d&„Z d1d)d*„Z‡ZS)2rRr(r)rxrqryrsrzrtr{r*cs:tƒ tj|||||g||¡||_||_||_||_dSr+)r¯r-r rrxryrzr{)r,r(rxryrzr{r*r°r"r#r-³s  zSVGCommandArc.__init__cCs6t|j ¡|j ¡|j ¡|j ¡|j ¡|j ¡ƒSr+)rRr(r2rxryrzr{r*r1r"r"r#r2»s"ÿzSVGCommandArc.copyr?cCsbtj tjj¡}t |g|j  ¡¢|j   ¡¢|j   ¡¢|j   ¡¢|j   ¡¢|gd¢|j  ¡¢¡S)Nrj)rrpr³r rrBr´rµrxrfryrzr{r(r*r¶r"r"r#rf¿s ÿþýüûúùzSVGCommandArc.to_tensorcCsŒ|j}|j|j}}d||d||}}| |j ¡}|jj|jjkr(dnd}|jd|j d|jd|j df\}} } } t   t | | | | | || | | |dƒ¡} || t |j|j |j |j |j|jƒ} |  |j¡|}|| |||  |}}t ddƒj|dd}|j|dd}|jd ;_|jjdkr±|jdkr±|td ƒ}|jdkrÁ|jdkrÁ|td ƒ}|||fS) Nr½r?rr:r9rT)Úsignedih)rxr(r*ÚrotateryrzÚflagr{r„rƒÚmathÚsqrtÚmaxr)rÚÚdegrs)r,Úrrˆr‰rr Zp1_transÚsignÚx2Úy2Zrx2Zry2røZc_transr ÚdÚnsÚtheta_1Ú delta_thetar"r"r#Ú_get_center_parametrizationÊs$,40   z)SVGCommandArc._get_center_parametrizationr rÚ float_typecCs4|j}|t|jt |¡|jt |¡ƒ |j¡Sr+) rxr)r„r…ÚcosrƒÚsinrõry)r,r rrûr"r"r#Ú _get_pointås.zSVGCommandArc._get_pointcCs2|j}t|j t |¡|jt |¡ƒ |j¡Sr+) rxr)r„r…rrƒrrõry)r,rrûr"r"r#Ú_get_derivativeés,zSVGCommandArc._get_derivativec s g}| ¡\}‰‰tttˆjƒdƒdƒ‰‡‡‡fdd„tˆdƒDƒ}t|dd…|dd…ƒD]Q\}}|j|j}}t  ||¡t   ddt  d ||¡d ¡dd}|  ||¡|  ||¡} } | || |¡} | || |¡} | t| | | | ƒ¡q1|S) zð References: https://www.w3.org/TR/2018/CR-SVG2-20180807/implnote.html https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ http://www.spaceroots.org/documents/ellipse/elliptical-arc.pdf é-rcsg|] }ˆ|ˆˆ‘qSr"r")r<rY©rZ nb_curvesrr"r#r>ösz,SVGCommandArc.to_beziers..Nr?rjrir½r:)rrùroÚabsrúrIrÄÚradr…rr÷røÚtanrrrOrS) r,Zbeziersr ÚetasÚeta_1Úeta_2Úe1Úe2rÁrˆr‰rÈrÉr"r r#Ú to_beziersís":zSVGCommandArc.to_bezierscCs t|j|j|j|j|j|jƒSr+)rRr*rxryrzr{r(r1r"r"r#rs zSVGCommandArc.reverser‹cCr.r+r/rŒr"r"r#rŽr3zSVGCommandArc.numericalizecCs|j|j|j|j|j|jgSr+)r(rxryrzr{r*r1r"r"r#r]szSVGCommandArc.get_geomsr:cCr.r+r/rŒr"r"r#r¥ r3zSVGCommandArc.splitr¡FcCr.r+r/r¢r"r"r#r¤ r3zSVGCommandArc.sample_points) r(r)rxrqryrsrzrtr{rtr*r)r¨)r r)rr)rrr©r¬r«)rrrr-r2rfrrrrrrŽr]r¥r¤rºr"r"r°r#rR²s     rR)+Ú __future__rÚgeomÚdeepsvg.difflib.tensorrZutil_fnsrÚenumrr´r÷Útypingrr roÚfloatÚNumr rrBr)rrrrrqrsrtrrÚXCoordrÚYCoordr r!rHr$r®rQrPrFrSrRr"r"r"r#Ús<            ö(