
    Og=                    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                0    t         |           d| _        y )NT)super__init___init_flip_y)self	__class__s    ]/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/addons/drawing/svg.pyr   zSVGBackend.__init__   s         Nsettings
render_boxc                  d}t        j                   |      }d|_        | j                         }||j                         }t	        j
                  || j                        }|j                  ||      }|j                  dk(  s|j                  dk(  rt        j                  d      S |j                  |||      }|j                  |       |j                  rD|j                  |      \  }}	|j!                  |      }
d|
z  }|j#                  ||
z  |	|
z  |       d	| _        | j%                  ||      }|j'                  |       |j)                         S )
NTi@B )flip_yr   svg)r"   
top_origin)r'   g?F)copyoutput_coordinate_spaceplayerbboxr   Layoutr   get_final_pagewidthheightETElementget_placement_matrix	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mp1p2output_scalemax_sagittabackends                r   r:   zSVGBackend.get_xml_root_element!   sE    
99X& ,5( J j9J9JK++D(;::?dkkQ.::e$$..8
 / 
 	##))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)encodingrC   )r:   r0   tostring)r   r;   r"   r#   rC   xmls         r   
get_stringzSVGBackend.get_stringL   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_backenda   s      h//r    returnNone)r;   layout.Pager"   layout.Settingsr#   BoundingBox2d | NonerM   
ET.Element)r;   rO   r"   rP   r#   rQ   rM   str)r;   rO   r"   rP   rM   rK   )__name__
__module____qualname____doc__r   r   Settingsr:   rI   staticmethodr8   __classcell__)r   s   @r   r   r      s    
! %4FOO$5+/).). "	).
 )). 
).^ %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;   r)   sizes      r   make_view_boxr_   g   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   n   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   rH   s     r   r   zStyles.__init__w   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_class|   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)rH   rR   rM   rN   )rl   r   rm   z	int | strrn   floatro   r   rp   r   rM   rS   )r   rS   rM   rN   )rT   rU   rV   r   rz   rv    r    r   rd   rd   v   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),rK   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stylesrS   
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   rS   )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_paths1  sU      	?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_polygon:  s.     	""6??#4D"A:	
r    c                     y r\   r   )r   
image_datar   s      r   
draw_imagezSVGRenderBackend.draw_imageA      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_strD  s    v;?)!((137ABZ 	0EwHGHHX__X./	0 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_strS  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`  sL    "((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.configure|  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;   rO   r"   rP   rM   rN   )rM   rR   )r   rS   r   r   )r   r   rM   ztuple[Color, float])r.   r   rM   r   )r   r   rM   rN   )r   r   r   r   rM   rN   )r   r   r   r   r   r   rM   rN   )r   zIterable[tuple[Vec2, Vec2]]r   r   rM   rN   )r   r   r   r   rM   rN   )r   zIterable[BkPath2d]r   r   rM   rN   )r   r   r   r   rM   rN   )r   r   r   r   rM   rN   )F)r   zSequence[Vec2]rM   rS   )r   zSequence[tuple[Vec2, Vec2]]rM   rS   )r   r   rM   rS   )r  r   rM   rN   rL   )rT   rU   rV   rW   r   r:   r   r   r   r   r   r   r   r   r   r   r   r   rY   r   r   r   r   r  r  r  r
  r  r   r    r   rK   rK      s    22h""7(:IKF0F>OF	F?2'25F2	2
 
.?
	
   
 
   4<r    rK   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;   rO   r)   r   rM   ztuple[int, int])r;   rO   r)   r   rM   r   )r  rS   rM   r   )r   gzG @)r   r   r   r   r   r   rM   r   )3
__future__r   typingr   r   r   r(   	xml.etreer   r0   numpynp
ezdxf.mathr   r	   r
   
ezdxf.pathr   
type_hintsr   rB   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   rK   r   r   r   r    r   <module>r"     s    # 4 4  '  4 4   F F 3 ) .M0"" M0`:$  $ N $	#	#	#	8
8
L
L
 f' fR 
9
9
9 
9 	
9r    