
    mj=                    b   d dl mZ d dlmZmZmZ d dlZd dlmZ	 d dl
Zd dlmZmZmZ d dlmZ ddlmZ dd	lmZmZmZmZ dd
lmZmZ ddlmZ ddlmZm Z  dgZ! G d de jD                        Z#d dZ$d!dZ% G d d      Z&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/ G d de      Z0d"dZ1	 	 d#	 	 	 	 	 	 	 d$dZ2y)%    )annotations)IterableSequenceno_type_checkN)ElementTree)Vec2BoundingBox2dMatrix44)Command   )Color)BackendInterfaceBkPath2d
BkPoints2d	ImageData)ConfigurationLineweightPolicy)BackendProperties)layoutrecorder
SVGBackendc                       e Zd ZdZd
 fdZ ej                         dd	 	 	 	 	 	 	 ddZ ej                         ddd	 	 	 	 	 	 	 ddZe	dd	       Z
 xZS )r   zThis is a native SVG rendering backend and does not require any external packages
    to render SVG images other than the core dependencies.  This backend support content
    cropping at page margins.
    c                >    t         |           d| _        d | _        y )NT)super__init___init_flip_ytransformation_matrix)self	__class__s    E/DATA/.local/lib/python3.12/site-packages/ezdxf/addons/drawing/svg.pyr   zSVGBackend.__init__   s     6:"    Nsettings
render_boxc                  d}t        j                   |      }| j                         }||j                         }t        j                  || j
                        }|j                  ||      }|j                  dk(  s|j                  dk(  rt        j                  d      S |j                  |||      | _        |j                  | j                         |j                  rD|j                  |      \  }}|j!                  |      }	d|	z  }
|j#                  ||	z  ||	z  |
       d| _        | j%                  ||      }|j'                  |       |j)                         S )	NT)flip_yr   svg)r#   
top_origin)r(   g?F)copyplayerbboxr   Layoutr   get_final_pagewidthheightETElementget_placement_matrixr   	transformcrop_at_marginsget_margin_rectpage_output_scale_factor	crop_rectmake_backendreplayget_xml_root_element)r   pager#   r$   r(   r*   output_layoutp1p2output_scalemax_sagittabackends               r    r:   zSVGBackend.get_xml_root_element"   sE    
99X& J j9J9JK++D(;::?dkkQ.::e$$%2%G%G8
 &H &
" 	334##))Z)@FB#<<TBL,KR,.\0A;O!##D(3g++--r!   T)r#   r$   xml_declarationc               Z    | j                  |||      }t        j                  |d|      S )a  Returns the XML data as unicode string.

        Args:
            page: page definition, see :class:`~ezdxf.addons.drawing.layout.Page`
            settings: layout settings, see :class:`~ezdxf.addons.drawing.layout.Settings`
            render_box: set explicit region to render, default is content bounding box
            xml_declaration: inserts the "<?xml version='1.0' encoding='utf-8'?>" string
                in front of the <svg> element

        r"   unicode)encodingrB   )r:   r0   tostring)r   r;   r#   r$   rB   xmls         r    
get_stringzSVGBackend.get_stringI   s.    $ ''xJ'W{{3OTTr!   c                    t        | |      S )z8Override this method to use a customized render backend.)SVGRenderBackend)r;   r#   s     r    r8   zSVGBackend.make_backend^   s      h//r!   returnNone)r;   layout.Pager#   layout.Settingsr$   BoundingBox2d | NonerL   
ET.Element)r;   rN   r#   rO   r$   rP   rL   str)r;   rN   r#   rO   rL   rJ   )__name__
__module____qualname____doc__r   r   Settingsr:   rH   staticmethodr8   __classcell__)r   s   @r    r   r      s    
; %4FOO$5+/%.%. "	%.
 )%. 
%.V %4FOO$5+/UU "	U
 )U 
U* 0 0r!   c                    t        |      }| j                  | j                  kD  r'|t        || j                  | j                  z  z        fS t        || j                  | j                  z  z        |fS N)roundr.   r/   )r;   output_coordinate_spacesizes      r    make_view_boxr_   d   sa    ()DzzDKKU44;;#;<===dkk123T99r!   c                N    t        || j                  z  || j                  z        S r[   )minr.   r/   )r;   r]   s     r    scale_page_to_view_boxrb   k   s'    $**,$++- r!   c                  H    e Zd ZddZdddddd	 	 	 	 	 	 	 	 	 	 	 d	dZd
dZy)Stylesc                >    || _         t               | _        d| _        y )Nr   )_xmldict_class_names_counter)r   rG   s     r    r   zStyles.__init__t   s    	,0Fr!   none      ?)strokestroke_widthstroke_opacityfillfill_opacityc                  d| d| d|dd| d|dd}t        |      }	 | j                  |   S # t        $ r Y nw xY wd| j                  d	}| xj                  d
z  c_        | j	                  ||       || j                  |<   |S )Nz	{stroke: z; stroke-width: z; stroke-opacity: z.3fz; fill: z; fill-opacity: z;}CXr   )hashrh   KeyErrorri   
_add_class)	r   rl   rm   rn   ro   rp   stylekeynames	            r    	get_classzStyles.get_classy   s      !)N +-c2 3F )#.c	3 	 5k	$$S)) 		4==#$e$!%#s   0 	<<c                ~    t        j                  d      }d| d| |_        | j                  j	                  |       y )Nrw   . )r0   r1   textrf   append)r   ry   	style_strrw   s       r    rv   zStyles._add_class   s6    

7#a	{+
		r!   N)rG   rQ   rL   rM   )rl   r   rm   z	int | strrn   floatro   r   rp   r   rL   rR   )r   rR   rL   rM   )rS   rT   rU   r   rz   rv    r!   r    rd   rd   s   s^     "( #!   	
    
6 r!   rd   zM {0.x:.0f} {0.y:.0f}zm {0.x:.0f} {0.y:.0f}zL {0.x:.0f} {0.y:.0f}zl {0.x:.0f} {0.y:.0f}z)Q {0.x:.0f} {0.y:.0f} {1.x:.0f} {1.y:.0f}z)q {0.x:.0f} {0.y:.0f} {1.x:.0f} {1.y:.0f}z=C {0.x:.0f} {0.y:.0f} {1.x:.0f} {1.y:.0f} {2.x:.0f} {2.y:.0f}z=c {0.x:.0f} {0.y:.0f} {1.x:.0f} {1.y:.0f} {2.x:.0f} {2.y:.0f}z{0.x:.0f} {0.y:.0f}c                     e Zd ZdZddZddZddZddZddZddZ	ddZ
dd	Zd d
Z	 	 	 	 	 	 d!dZd"dZ	 	 	 	 	 	 d#dZ	 	 	 	 	 	 d$dZd%dZed&d'd       Zed(d       Zeed&d)d              Zd*dZd+dZd+dZd+dZd+dZy),rJ   aN  Creates the SVG output.

    This backend requires some preliminary work, record the frontend output via the
    Recorder backend to accomplish the following requirements:

    - Scale the content in y-axis by -1 to invert the y-axis (SVG).
    - Move content in the first quadrant of the coordinate system.
    - The viewBox is defined by the lower left corner in the origin (0, 0) and
      the upper right corner at (view_box_width, view_box_height)
    - The output coordinates are integer values, scale the content appropriately.
    - Replay the recorded output on this backend.

    c                   || _         t               | _        t        ||j                        \  }}||j
                  z  | _        d| _        d| _        t        j                  | _        t        |j                  |j                  z        | _        t        | j                  |j                  z        | _        t        | j                  |j                  z        | _        t!        j"                  dd|j
                  dd|j$                  ddd| d| 	      | _        t)        t!        j*                  | j&                  d
            | _        t!        j*                  | j&                  ddddt/        |      t/        |            | _        t!        j*                  | j&                  d      | _        | j2                  j5                  dd       | j2                  j5                  dd       | j2                  j5                  dd       y )N皙?rk   r'   zhttp://www.w3.org/2000/svggmmz0 0 r}   )xmlnsr.   r/   viewBoxdefsrectwhite0)ro   xyr.   r/   zstroke-linecapr\   zstroke-linejoinz	fill-ruleevenodd)r#   rg   _stroke_width_cacher_   r]   width_in_mmstroke_width_scalemin_lineweightlineweight_scalingr   ABSOLUTElineweight_policyintmax_stroke_widthmin_stroke_widthfixed_stroke_widthr0   r1   height_in_mmrootrd   
SubElementstylesrR   
backgroundentitiesset)r   r;   r#   view_box_widthview_box_heights        r    r   zSVGRenderBackend.__init__   s    59V *7(22+
'
 *8$:J:J)J""%!1!:!: &),,x/H/HH&
 &)!!H$=$==&

 (+!!H$?$??(
 JJ.%%a(+''*"->*!O+<=
	 R]]499f=>--IIn%'
 dii5*G4+W5+y1r!   c                    | j                   S r[   )r   r   s    r    r:   z%SVGRenderBackend.get_xml_root_element   s    yyr!   c                    |sy t        j                  | j                  d|      }| j                  |j                        }| j                  |j                        \  }}| j                  j                  |||      }|j                  d|       y )Npathd)rl   rm   rn   class)
r0   r   r   resolve_stroke_width
lineweightresolve_colorcolorr   rz   r   )r   r   
propertieselementrm   stroke_colorrn   clss           r    add_strokeszSVGRenderBackend.add_strokes   s    --v;001F1FG'+'9'9*:J:J'K$nkk##%) $ 

 	GS!r!   c                    |sy t        j                  | j                  d|      }| j                  |j                        \  }}| j
                  j                  ||      }|j                  d|       y )Nr   r   )ro   rp   r   )r0   r   r   r   r   r   rz   r   )r   r   r   r   
fill_colorrp   r   s          r    add_fillingzSVGRenderBackend.add_filling   s`    --v;#'#5#5j6F6F#G 
Lkk##,#OGS!r!   c                (    |d d t        |dd       fS )N   	   )alpha_to_opacity)r   r   s     r    r   zSVGRenderBackend.resolve_color   s    Ray*51:666r!   c                   	 | j                   |   S # t        $ r 	 | j                  }Y nw xY w| j                  }|t        j
                  k(  rU| j                  r$t        | j                  |      | j                  z  }n| j                  }t        || j                  z        }n4|t        j                  k(  r!t        || j                  | j                        }|| j                   |<   |S r[   )r   ru   r   r   r   r   r   maxr   r\   r   RELATIVEmap_lineweight_to_stroke_widthr   r   )r   r.   rm   policys       r    r   z%SVGRenderBackend.resolve_stroke_width  s    	3++E22 	322L	3 ''%...&&D//7$:Q:QQ++ )@)@!@AL'0009t,,d.C.CL +7  's    **c                    |d d }t        |dd       }| j                  j                  d|       | j                  j                  dt        |             y )Nr   r   ro   zfill-opacity)r   r   r   rR   )r   r   	color_stropacitys       r    set_backgroundzSVGRenderBackend.set_background  sI    "1I	"51:.FI.NCL9r!   c                J    | j                  | j                  ||g      |       y r[   r   make_polyline_str)r   posr   s      r    
draw_pointzSVGRenderBackend.draw_point  s!    //c
;ZHr!   c                J    | j                  | j                  ||g      |       y r[   r   )r   startendr   s       r    	draw_linezSVGRenderBackend.draw_line   s!    //=zJr!   c                z    t        |      }t        |      dk(  ry | j                  | j                  |      |       y )Nr   )listlenr   make_multi_line_str)r   linesr   s      r    draw_solid_linesz!SVGRenderBackend.draw_solid_lines#  s6     Uu:?11%8*Er!   c                F    | j                  | j                  |      |       y r[   )r   make_path_str)r   r   r   s      r    	draw_pathzSVGRenderBackend.draw_path+  s    ++D1:>r!   c                    g }|D ]0  }t        |      s|j                  | j                  |d             2 | j                  dj	                  |      |       y )NTcloser}   )r   r   r   r   join)r   pathsr   r   r   s        r    draw_filled_pathsz"SVGRenderBackend.draw_filled_paths.  sP     D4y++D+=>  	!j1r!   c                f    | j                  | j                  |j                         d      |       y )NTr   )r   r   vertices)r   pointsr   s      r    draw_filled_polygonz$SVGRenderBackend.draw_filled_polygon7  s.     	""6??#4D"A:	
r!   c                     y r[   r   )r   
image_datar   s      r    
draw_imagezSVGRenderBackend.draw_image>      r!   c                
   t        |       dk  ry| d   }t        j                  |      dg}| dd  D ]-  }||z
  }|}|j                  t        j                  |             / |r|j                  d       dj                  |      S )N    r   lr   Zr}   )r   	CMD_M_ABSformatr   CMD_CONTr   )r   r   currentr   pointrelatives         r    r   z"SVGRenderBackend.make_polyline_strA  s    v;?)!((137ABZEwHGHHX__X./   HHSMxx{r!   c                p   t        |       dkD  sJ | d   \  }}t        j                  |      t        j                  ||z
        g}|}| dd  D ]W  \  }}|j	                  t
        j                  ||z
               |}|j	                  t        j                  ||z
               |}Y dj                  |      S )Nr   r   r}   )r   r   r   	CMD_L_RELr   	CMD_M_RELr   )r   r   r   r   r   s        r    r   z$SVGRenderBackend.make_multi_line_strP  s    5zA~~1X
s!((/1A1A#+1NO)JE3HHY%%ego67GHHY%%cGm45G	 $
 xx{r!   c           	        t         j                  | j                        g}t        |       dk(  ry| j                  }| j	                         D ]N  }|j
                  }|j                  t        j                  k(  r(|j                  t        j                  ||z
               n|j                  t        j                  k(  r(|j                  t        j                  ||z
               n|j                  t        j                  k(  r6|j                  t        j                  |j                  |z
  ||z
               n`|j                  t        j                   k(  rC|j                  t"        j                  |j$                  |z
  |j&                  |z
  ||z
               |}Q |r|j                  d       dj)                  |      S )Nr   r   r   r}   )r   r   r   r   commandsr   typer   MOVE_TOr   r   LINE_TOr   	CURVE3_TO
CMD_C3_RELctrl	CURVE4_TO
CMD_C4_RELctrl1ctrl2r   )r   r   r   r   cmdr   s         r    r   zSVGRenderBackend.make_path_str]  sG    "((45t9>**==?C''Cxx7??*))#-89W__,))#-89W...**388g+=sW}MNW...%%		G+SYY-@#-
 G # HHSMxx{r!   c                    |j                   | _         |j                  r#|j                  dz  dz  }t        d|      | _        |j                  | _        y )Ngffffff9@i,  r   )r   r   r   r   )r   configmin_lineweight_mms      r    	configurezSVGRenderBackend.configurey  sM    !'!9!9   & 5 5 <s B"%d,=">D"(";";r!   c                     y r[   r   r   s    r    clearzSVGRenderBackend.clear  r   r!   c                     y r[   r   r   s    r    finalizezSVGRenderBackend.finalize  r   r!   c                     y r[   r   )r   entityr   s      r    enter_entityzSVGRenderBackend.enter_entity  r   r!   c                     y r[   r   )r   r	  s     r    exit_entityzSVGRenderBackend.exit_entity  r   r!   N)r;   rN   r#   rO   rL   rM   )rL   rQ   )r   rR   r   r   )r   r   rL   ztuple[Color, float])r.   r   rL   r   )r   r   rL   rM   )r   r   r   r   rL   rM   )r   r   r   r   r   r   rL   rM   )r   zIterable[tuple[Vec2, Vec2]]r   r   rL   rM   )r   r   r   r   rL   rM   )r   zIterable[BkPath2d]r   r   rL   rM   )r   r   r   r   rL   rM   )r   r   r   r   rL   rM   )F)r   zSequence[Vec2]rL   rR   )r   zSequence[tuple[Vec2, Vec2]]rL   rR   )r   r   rL   rR   )r  r   rL   rM   rK   )rS   rT   rU   rV   r   r:   r   r   r   r   r   r   r   r   r   r   r   r   rX   r   r   r   r   r  r  r  r
  r  r   r!   r    rJ   rJ      s    22h""7(:IKF0F>OF	F?2'25F2	2
 
.?
	
   
 
   4<r!   rJ   c                X    t        |       r	 t        | d      dz  S y# t        $ r Y yw xY w)N      rk   )r   r   
ValueError)alphas    r    r   r     s=     5z	ub>C''   		s    	))c                l    t        t        | |      |      |z
  } ||z
  ||z
  z  }|t        | |z        z   S )zDMap the DXF lineweight in mm to stroke-width in viewBox coordinates.)r   ra   r\   )r   r   r   r   max_lineweightfactors         r    r   r     sF     S^4nEVJ!11n~6UVFeJ$7888r!   )r;   rN   r]   r   rL   ztuple[int, int])r;   rN   r]   r   rL   r   )r  rR   rL   r   )r   gzG @)r   r   r   r   r   r   rL   r   )3
__future__r   typingr   r   r   r)   	xml.etreer   r0   numpynp
ezdxf.mathr   r	   r
   
ezdxf.pathr   
type_hintsr   rA   r   r   r   r   r  r   r   r   r   r   r   r   __all__Recorderr   r_   rb   rd   r   r   	CMD_L_ABSr   
CMD_C3_ABSr   
CMD_C4_ABSr   r   rJ   r   r   r   r!   r    <module>r"     s    # 4 4  '  4 4   F F 3 ) .J0"" J0Z:$  $ N $	#	#	#	8
8
L
L
 f' fR 
9
9
9 
9 	
9r!   