
    BPc4                         d Z ddlZddlmZ dZddgZdd	Zd
 Zd Zd Z	d Z
d Zd Zd Zd Z G d dej                  Zedk    r e                                             dS dS )z
Convert mesh gradient to path
    N)MeshGradientgMbP?fillstroke&.>        c           
          t          | |z
            t          |t          t          |           t          |                    z  |          k    S )zTest approximate equality.

    ref:
        PEP 485 -- A Function for testing approximate equality
        https://www.python.org/dev/peps/pep-0485/#proposed-implementation
    )absmax)abrel_tolabs_tols       //usr/share/inkscape/extensions/path_mesh_m2p.pyiscloser      s>     q1u::Ws3q663q66':'::GDDDD    c                     g }t          |           D ]0}d t          |          D             }|                    |           1|S )zReverse path in CSP notation.c                 F    g | ]}t          t          |                    S  )listreversed).0cps     r   
<listcomp>z reverse_path.<locals>.<listcomp>.   s&    ???rXb\\""???r   )r   append)csprcspsubpathrsubs       r   reverse_pathr   *   sQ    DC==  ??Xg->->???DKr   c                    | |         d         d         }||         d         d         }t          |d         |d         t                    rot          |d         |d         t                    rM||         d         d         | |         d         d<   | |                             ||         dd                    n|                     ||                    | S )zJoin sub-paths *sp1* and *sp2*.   r      N)r   EPSILONextendr   )csp1sp1csp2sp2pt1pt2s         r   	join_pathr,   3   s    
s)B-
C
s)A,q/Cs1vs1vw'' GCFCFG,L,L 9Q<?S	"aS	c122'''' 	DIKr   c                 ,    |                      d          S )z1Check whether attribute value is linked resource.zurl(#)
startswith)vals    r   is_urlr0   @   s    >>'"""r   c           	         t          |           }t          | d                   t          |                     dd                    }t          |                     dd                    }fdt          |dz             D             }||g|d         d<   g }t          |          D ]}t                    D ]}|dk    r||         |         }|dk    r||         |dz            } dj        | }	| |         |         D ],}
d                    |	|
                    d	          g          }	-t          j        |	                                          }|dk    ri|d         d         d         ||         |dz   <   |d         d
         d         ||dz            |dz   <   |dk    r |d         d         d         ||dz            |<   |dk    ri|d         d         d         ||         |dz   <   |d         d         d         ||dz            |dz   <   |dk    r |d         d
         d         ||dz            |<   |	                    |           ||fS )z/Return list of mesh patch corners, patch paths.r   xz0.0yc                 H    g | ]}d  t          dz             D             S )c                     g | ]}d S Nr   r   _s     r   r   z+mesh_corners.<locals>.<listcomp>.<listcomp>M   s    ......r   r"   ranger   r8   colss     r   r   z mesh_corners.<locals>.<listcomp>M   s2    HHH1..eD1Hoo...HHHr   r"   M {},{} pathr#      )
lenfloatgetr:   formatjoininkexPathto_superpathr   )meshgradientrowscorner_xcorner_ycornersmeshpatch_cspsmeshrow	meshpatchfirst_cornerr?   edger   r<   s               @r   mesh_cornersrS   E   si   |D|AD\%%c51122H\%%c51122HHHHHdQhHHHGx(GAJqMN;; ' 't 	' 	'I!||&w/	:{{&w/	A>#9#\2D$W-i8 : :xxtxx'7'7 899*T""//11C!||25a&)A, Q/69!fQil!$Y]3>>69!fQilGGaK(3{{25a&)A, Q/69!fQil!$Y]3>>69!fQilGGaK(3!!#&&&&/	'0 N""r   c                 :   t          |           t          | d                   fdt          dz             D             }fdt          dz             D             }t                    D ]}t                    D ]}|dk    rg| |         |         d         }|                    d          ||         |<   | |         |         d         }|                    d          ||dz            |<   |dk    r5| |         |         d         }|                    d          ||dz            |<   |dk    rm| |         |         d         }|                    d          ||dz            |<   |dk    r2| |         |         d         }|                    d          ||         |<   |dk    rm| |         |         d         }|                    d          ||dz            |<   |dk    r2| |         |         d         }|                    d          ||         |<   ||fS )z4Return lists of vertical and horizontal patch edges.r   c                 B    g | ]}d  t                    D             S )c                     g | ]}d S r6   r   r7   s     r   r   z+mesh_hvlines.<locals>.<listcomp>.<listcomp>q       )))t)))r   r9   r;   s     r   r   z mesh_hvlines.<locals>.<listcomp>q   .    CCCa))U4[[)))CCCr   r"   c                 B    g | ]}d  t                    D             S )c                     g | ]}d S r6   r   r7   s     r   r   z+mesh_hvlines.<locals>.<listcomp>.<listcomp>r   rW   r   r9   )r   r8   rJ   s     r   r   z mesh_hvlines.<locals>.<listcomp>r   rX   r   r?   r#   r@   )rA   r:   rC   )rI   hlinesvlinesrO   rP   rR   r<   rJ   s         @@r   mesh_hvlinesr]   l   s7   |D|ADCCCC5??CCCFCCCC5??CCCF;; B Bt 	B 	BI!||#G,Y7:-1XXf-=-=w	*#G,Y7:15&1A1Aw{#I.{{#G,Y7:15&1A1Aw{#I.!||#G,Y7:15&1A1Ay1}%g.>>'0;A>D15&1A1AF9%g.{{#G,Y7:15&1A1Ay1}%g.>>'0;A>D15&1A1AF9%g.-	B. 6>r   c                    g } dj         | d         d          }|d         D ]}d                    ||g          }|d         D ]}d                    ||g          }t          |d                   D ]}d                    ||g          }t          |d                   D ]}d                    ||g          }|                    t	          j        |                                                     |S )z#Construct mesh outline as CSP path.r=   r   r>   r!   )rD   rE   r   r   rF   rG   rH   )rM   r[   r\   outline_cspsr?   	edge_paths         r   mesh_to_outlinera      s
   L9WQZ]+DAY + +	xxy)**BZ + +	xxy)**fRj)) + +	xxy)**fQi(( + +	xxy)**
4((5577888r   c                 r   t          |           dz
  }t          | d                   dz
  }g } dj        | d         d          }|d         D ]}d                    ||g          }|                    t	          j        |                                                     t          d|dz             D ]} dj        | |         d          }t          ||                   D ]}d                    ||g          }|                    t	          j        |                                                      dj        | d         d          }t          |d                   D ]}d                    ||g          }|                    t	          j        |                                                     t          d|dz             D ]s}	 dj        | d         |	          }||	         D ]}d                    ||g          }|                    t	          j        |                                                     t|S )z#Construct mesh grid with CSP paths.r"   r   r=   r>   r!   )	rA   rD   rE   r   rF   rG   rH   r:   r   )
rM   r[   r\   rJ   r<   gridline_cspsr?   r`   ijs
             r   mesh_to_gridrf      s1   w<<!Dwqz??QDM9WQZ]+DAY + +	xxy)**D))66889991dQh > >yB0!&),, 	/ 	/I88T9-..DDUZ--::<<====9WR[^,DfQi(( + +	xxy)**D))66889991dQh > >yA/ 	/ 	/I88T9-..DDUZ--::<<====r   c                    t          |           dz
  }t          | d                   dz
  }g }t          |          D ]}t          |          D ]}g }||         |         }	||dz            |         }
||         |         }||dz            |         }|dk    rm dj        | |         |          }d                    ||	g          }|                    t          j        |                                          d                    n| dj        | |         |dz             }d                    ||	g          }|                    t          t          j        |                                                    d                     dj        | |         |dz             }d                    ||g          }t          |dt          j        |                                          d            dj        | |dz            |dz             }d                    ||
g          }t          |dt          j        |                                          d           |dk    rg dj        | |dz            |          }d                    ||g          }t          |dt          j        |                                          d           np dj        | |         |          }d                    ||g          }t          |dt          t          j        |                                                    d           |                    |           	|S )z$Construct mesh faces with CSP paths.r"   r   r=   r>   r!   )
rA   r:   rD   rE   r   rF   rG   rH   r   r,   )rM   r[   r\   rJ   r<   	face_cspsrowcolfaceedge_tedge_bedge_ledge_rr?   s                 r   mesh_to_facesrp      s   w<<!Dwqz??QDIT{{ $# $#;; #	# #	#CDC[%FC!G_S)FC[%FC!G_S)Faxx'y'c):;xxv//EJt,,99;;A>????'y'cAg)>?xxv//LD)9)9)F)F)H)HII!LMMM#9#WS\#'%:;D88T6N++DdB
4 0 0 = = ? ?CCC#9#WS1W%5cAg%>?D88T6N++DdB
4 0 0 = = ? ?CCCaxx'y'q)9#)>?xxv//$EJt$4$4$A$A$C$CQGGGG'y'c):;xxv//$LD1A1A1N1N1P1P$Q$QSTUUUT""""G#	#H r   c                   B    e Zd ZdZd ZddZddZd Zd Zdd	Z	d
 Z
dS )
MeshToPathz7Effect extension to convert mesh geometry to path data.c                 d    |                     dd           |                     ddd           d S )Nz--tabzThe selected UI-tab)helpz--modeoutlinez	Edge mode)defaultrt   )add_argument)selfparss     r   add_argumentszMeshToPath.add_arguments   s=    '(=>>>(IKHHHHHr   rI   c                    g }|                                 D ]g\  }}|t          v rYt          |          rJ| j                            |          }|dk    r*t          |t                    r|                    |           h|S )z/Process style properties of style dict *mdict*.rI   )itemsMG_PROPSr0   svggetElementById
isinstancer   r   )rx   mdictres_typeresultkeyr/   paint_servers          r   process_propszMeshToPath.process_props   s     	4 	4HCh#;; 4#'8#:#:3#?#?L>11j$l7 71 l333r   c                 Z    |                                 }|                     ||          }|S )zProcess style of *node*.)specified_styler   )rx   noder   r   s       r   process_stylezMeshToPath.process_style   s-    %%''##FH55r   c                 0    |                      |d          S )z8Parse node style, return list with linked meshgradients.rI   )r   )r   )rx   r   s     r   find_meshgradientszMeshToPath.find_meshgradients  s    !!$!@@@r   c                 n   d}| j         j        }|                    dd          }|dk    rdS |j        |j        z  }t          |          \  }}|dk    r||fS t          |          \  }}|dk    rt          |||          |fS |dk    rt          |||          |fS |dk    rt          |||          |fS dS )z2Parse mesh geometry and build csp-based path data.NgradientUnitsobjectBoundingBoxmeshpatchesru   	gridlinesfaces)
optionsmoderC   gradientTransform	transformrS   r]   ra   rf   rp   )	rx   rI   r   r   
mesh_unitsrM   rN   r[   r\   s	            r   mesh_to_cspzMeshToPath.mesh_to_csp  s     	|  "%%o7JKK
,,,F !2\5KK	 #/|"<"<=  !9,,),77NFFy  &w??JJ$$#GVV<<iGG$Wff==yHH !r   Nc                 <   | j                             d          }d}d|t          |          d}t          j                    }||j        z  |_        |D ]}|                    t          j                              }	||	_        t          j	        |          |	_
        | j        j        dk    r|	j
                                         r| j        j        dk    rEt          |          dk    r2t          |d                   d	k    r|	j
                                         |S )
z<Create new paths based on csp data, return group with paths.1pxz#000000none)r   r   zstroke-widthru   r   r"   r      )r~   viewport_to_unitstrrF   Groupr   addPathElementstyleCubicSuperPathr?   r   r   closerA   )
rx   r   csp_listr   stroke_widthstroke_colorr   groupr   elems
             r   csp_to_pathzMeshToPath.csp_to_path(  s
    x0077 "--
 
 #dn4  	& 	&C99U.0011DDJ,S11DI| I--	!!!!"g--s88q==SQ[[A%5%5IOO%%%r   c                    | j         j                                        D ]}|                     |          }|r|D ]}d}d}||                     |          \  }}||                     |||          }|R|                                                    |          }|                                                    |dz   |           dS )z3Main routine to convert mesh geometry to path data.Nr"   )	r~   	selectionvaluesr   r   r   	getparentindexinsert)rx   r   meshgradientsrI   r   r   matr   s           r   effectzMeshToPath.effectC  s     H&--// 	C 	CD 33D99M C$1 C CL#H!F#/(,(8(8(F(F#+!%!1!1$#!F!F) $ 0 0 6 6t < <((//	6BBB!	C 	Cr   )rI   r6   )__name__
__module____qualname____doc__rz   r   r   r   r   r   r   r   r   r   rr   rr      s        AAI I I      A A AI I I@   6C C C C Cr   rr   __main__)r   r   )r   rF   inkex.elementsr   r$   r}   r   r   r,   r0   rS   r]   ra   rf   rp   EffectExtensionrr   r   runr   r   r   <module>r      sA  &   ' ' ' ' ' ' HE E E E  
 
 
# # #
$# $# $#N  D     8* * *ZoC oC oC oC oC& oC oC oCd zJLL r   