
    'j,                        d dl mZ d dlmZmZ d dlZddlmZmZm	Z	m
Z
m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  G d
 d          ZddZddZddZddZdS )     )annotations)SequenceIteratorN   )Vec2PathNULLVEC2ConstructionCircleBezier4P)RGB
PropertiesFillType)Backend)PolygonBuffer)Pagec                     e Zd ZdZd]dZed^d            Zed^d	            Zd_dZd`dZ	dadZ
dbdZdcdZdddZ	 	 dedfd"Zdfd#Zdgd&Zdcd'Zdcd(Zdcd)Zdcd*Zdhd,Zdid.Zdid/Zdcd0Zdcd1Zdjd3Zdjd4Zdkd6Zdld9Zdmd=Zdnd>Zdcd?Z dodAZ!dcdBZ"dpdEZ#dpdFZ$dpdGZ%dqdJZ&drdMZ'dsdOZ(dtdRZ)dtdSZ*dudVZ+dudWZ,dvdZZ-dvd[Z.d\S )wPlottera  
    The :class:`Plotter` class represents a virtual plotter device.

    The HPGL/2 commands send by the :class:`Interpreter` are processed into simple
    polylines and filled polygons and send to low level :class:`Backend`.

    HPGL/2 uses a units system called "Plot Units":

    - 1 plot unit (plu) = 0.025mm
    - 40 plu = 1 mm
    - 1016 plu = 1 inch

    The Plotter device does not support font rendering and page rotation (RO).
    The scaling commands IP, RP, SC are supported.

    backendr   returnNonec                    || _         || _        t                      | _        t	          dd          | _        t                      | _        d| _        d| _	        d| _
        d| _        t          | _        g | _        d S )Ni  iI  FT)r   _output_backendr   _polygon_bufferr   pager   
propertiesis_pen_downis_absolute_modeis_polygon_modehas_merge_controlr	   _user_location_pen_state_stack)selfr   s     T/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/addons/hpgl2/plotter.py__init__zPlotter.__init__%   sm    &,sOO	$,,  $$!&&,.    r   c                    | j         S )zHReturns the current pen location as point in the user coordinate system.r    r"   s    r#   user_locationzPlotter.user_location2   s     ""r%   c                Z    | j         }| j                            |j        |j                  S )z@Returns the current pen location as page point in plotter units.)r)   r   
page_pointxyr"   locations     r#   page_locationzPlotter.page_location7   s(     %y##HJ
;;;r%   size_xintsize_yc                0    t          ||          | _        d S N)r   r   )r"   r1   r3   s      r#   
setup_pagezPlotter.setup_page=   s    ((			r%   p1p2c                <    | j                             ||           d S r5   )r   set_scaling_points)r"   r7   r8   s      r#   r:   zPlotter.set_scaling_points@   s     	$$R,,,,,r%   xp1floatyp1c                <    | j                             ||           d S r5   )r   set_scaling_points_relative_1)r"   r;   r=   s      r#   r?   z%Plotter.set_scaling_points_relative_1C   s     	//S99999r%   xp2yp2c                @    | j                             ||||           d S r5   )r   set_scaling_points_relative_2)r"   r;   r=   r@   rA   s        r#   rC   z%Plotter.set_scaling_points_relative_2F   s&     		//S#sCCCCCr%   c                8    | j                                          d S r5   )r   reset_scalingr(   s    r#   rE   zPlotter.reset_scalingK   s    	!!!!!r%   originscale_xscale_yc                >    | j                             |||           d S r5   )r   set_ucs)r"   rF   rG   rH   s       r#   set_point_factorzPlotter.set_point_factorN   s"    	&'733333r%         ?x_minx_maxy_miny_maxc                D    | j                             ||||||           d S r5   )r   set_isotropic_scaling)r"   rM   rN   rO   rP   leftbottoms          r#   rR   zPlotter.set_isotropic_scalingQ   s*     		''ueUD&QQQQQr%   c                @    | j                             ||||           d S r5   )r   set_anisotropic_scaling)r"   rM   rN   rO   rP   s        r#   rV   zPlotter.set_anisotropic_scaling\   s&     		))%uEEEEEr%   statusboolc                    || _         d S r5   )r   r"   rW   s     r#   set_merge_controlzPlotter.set_merge_controla   s    !'r%   c                    d| _         d S NFr   r(   s    r#   pen_upzPlotter.pen_upd   s     r%   c                    d| _         d S NTr^   r(   s    r#   pen_downzPlotter.pen_downg   s    r%   c                D    | j                             | j                   d S r5   )r!   appendr   r(   s    r#   push_pen_statezPlotter.push_pen_statej   s"    $$T%566666r%   c                n    t          | j                  r | j                                        | _        d S d S r5   )lenr!   popr   r(   s    r#   pop_pen_statezPlotter.pop_pen_statem   s<    t$%% 	;#488::D	; 	;r%   r/   c                l    | j         r|                     |           d S |                     |           d S r5   )r   move_to_absmove_to_relr.   s     r#   move_tozPlotter.move_toq   sA      	'X&&&&&X&&&&&r%   r)   c                    || _         d S r5   r'   r"   r)   s     r#   rk   zPlotter.move_to_absw   s    +r%   c                &    | xj         |z  c_         d S r5   r'   ro   s     r#   rl   zPlotter.move_to_relz   s    },r%   c                    d| _         d S ra   r   r(   s    r#   set_absolute_modezPlotter.set_absolute_mode}   s     $r%   c                    d| _         d S r]   rr   r(   s    r#   set_relative_modezPlotter.set_relative_mode   s     %r%   indexc                :    | j                             |           d S r5   )r   set_current_penr"   rv   s     r#   rx   zPlotter.set_current_pen   s    ''.....r%   c                :    | j                             |           d S r5   )r   set_max_pen_country   s     r#   r{   zPlotter.set_max_pen_count   s    ))%00000r%   widthc                <    | j                             ||           d S r5   )r   set_pen_width)r"   rv   r|   s      r#   r~   zPlotter.set_pen_width        %%eU33333r%   colorr   c                <    | j                             ||           d S r5   )r   set_pen_color)r"   rv   r   s      r#   r   zPlotter.set_pen_color   r   r%   	fill_typespacinganglec                    |dv r't          | j                            |                    }| j                            |||           d S )N)      )maxr   scale_lengthr   set_fill_type)r"   r   r   r   s       r#   r   zPlotter.set_fill_type   sJ    $)0099::G%%i%@@@@@r%   c                    d| _         | j        | _        |dk    r!| j                            | j                   d S |dk    r| j                                         d S d S )NTr   r   )r   r   r   resetr0   
close_pathrZ   s     r#   enter_polygon_modezPlotter.enter_polygon_mode   sh    #+Q;; &&t'9:::::q[[ ++----- [r%   c                ^    d| _         | j                                         | j        | _        d S r]   )r   r   r   r   r   r(   s    r#   exit_polygon_modezPlotter.exit_polygon_mode   s-    $'')))+r%   fill_methodc                    | j                             |           |                     | j                                                   d S r5   )r   set_fill_methodplot_filled_polygon_bufferr   	get_paths)r"   r   s     r#   fill_polygonzPlotter.fill_polygon   sA    ''444''(<(F(F(H(HIIIIIr%   c                ^    |                      | j                                                   d S r5   )plot_outline_polygon_bufferr   r   r(   s    r#   edge_polygonzPlotter.edge_polygon   s+    (()=)G)G)I)IJJJJJr%   pointsSequence[Vec2]c                t    |sd S | j         r|                     |           d S |                     |           d S r5   )r   plot_abs_polylineplot_rel_polyliner"   r   s     r#   plot_polylinezPlotter.plot_polyline   sN     	F  	+""6*****""6*****r%   c                   |sd S | j         }|                     |d                    | j        rR| j                            |          }|                    d|           | j                            | j        |           d S d S )Nr   )	r0   rk   r   r   page_pointsinsertr   draw_polyliner   )r"   r   current_page_locations      r#   r   zPlotter.plot_abs_polyline   s     	F $ 2$$$ 	@Y**622FMM!2333L&&t?????	@ 	@r%   c                x    |sd S |                      t          t          | j        |                               d S r5   )r   tuplerel_to_abs_points_dynamicr)   r   s     r#   r   zPlotter.plot_rel_polyline   sJ     	F+D,>GGHH	
 	
 	
 	
 	
r%   radiuschord_anglec                    | j         rG| j        fdt          dd|          D             }| j                            | j        |           d S d S )Nc                @    g | ]}t          j        |          z   S  r   from_deg_angle.0acenterr   s     r#   
<listcomp>z+Plotter.plot_abs_circle.<locals>.<listcomp>   ;        ,Q777  r%   r        v@)r   r)   
arc_anglesr   r   r   )r"   r   r   verticesr   s    `  @r#   plot_abs_circlezPlotter.plot_abs_circle   s     	B'F    #Auk::  H
 L&&tAAAAA	B 	Br%   r   sweep_anglec                0  
 | j         }|z
  }|j        
|j        }||z   }t          j        |
          z   }|                     |           | j        r@
fdt          |||          D             }	| j        	                    | j
        |	           d S d S )Nc                @    g | ]}t          j        |          z   S r   r   r   s     r#   r   z(Plotter.plot_abs_arc.<locals>.<listcomp>   r   r%   )r)   	magnitude	angle_degr   r   rk   r   r   r   r   r   )r"   r   r   r   start_point
radius_vecstart_angle	end_angle	end_pointr   r   s    `        @r#   plot_abs_arczPlotter.plot_abs_arc   s    ( 6)
% *+-	T0FCCC	### 	B    #KkJJ  H L&&tAAAAA	B 	Br%   
center_relc                D    |                      || j        z   ||           d S r5   )r   r)   )r"   r   r   r   s       r#   plot_rel_arczPlotter.plot_rel_arc   s(    *t'99;TTTTTr%   interendc                    | j         }t          j        |||          }|j        }||z
  j        }||z
  j        }||z
  j        }	t          ||	|          }
|                     ||
|           d S r5   )r)   r
   from_3pr   r   sweeping_angler   )r"   r   r   r   startcircler   r   r   inter_angler   s              r#   plot_abs_arc_three_pointsz!Plotter.plot_abs_arc_three_points   sx    "#+E5#>>v~06\,	v~0$[+yII&+{;;;;;r%   c                N    | j         }|                     ||z   ||z   |           d S r5   )r)   r   )r"   r   r   r   currents        r#   plot_rel_arc_three_pointsz!Plotter.plot_rel_arc_three_points   s0    $&&w#{SSSSSr%   ctrl1ctrl2c                $   | j         }|                     |           | j        rl| j                            |||f          \  }}}t          |          }|                    |||           | j                            | j	        |gd           d S d S NFfilled)
r0   rk   r   r   r   r   	curve4_tor   
draw_pathsr   )r"   r   r   r   r   ps         r#   plot_abs_cubic_bezierzPlotter.plot_abs_cubic_bezier   s     $ 2 	H $	 5 5ueS6I J JE5#*++AKKUE***L##DOaS#GGGGG	H 	Hr%   c                l    t          | j        |||f          \  }}}|                     |||           d S r5   )rel_to_abs_points_staticr)   r   )r"   r   r   r   s       r#   plot_rel_cubic_bezierzPlotter.plot_rel_cubic_bezier  sG    4s 3
 
uc 	""5%55555r%   pathsSequence[Path]c                J    | j                             | j        |d           d S )NTr   r   r   r   r"   r   s     r#   r   z"Plotter.plot_filled_polygon_buffer  s'    tDDDDDr%   c                J    | j                             | j        |d           d S r   r   r   s     r#   r   z#Plotter.plot_outline_polygon_buffer  s'    uEEEEEr%   N)r   r   r   r   )r   r   )r1   r2   r3   r2   )r7   r   r8   r   r   r   )r;   r<   r=   r<   r   r   )
r;   r<   r=   r<   r@   r<   rA   r<   r   r   )r   r   )rF   r   rG   r<   rH   r<   r   r   )rL   rL   )
rM   r<   rN   r<   rO   r<   rP   r<   r   r   )rW   rX   r   r   )r/   r   r   r   )r)   r   r   r   )rv   r2   r   r   )rv   r2   r|   r<   r   r   )rv   r2   r   r   r   r   )r   r2   r   r<   r   r<   r   r   )rW   r2   r   r   )r   r2   r   r   )r   r   )r   r<   r   r<   )r   r   r   r<   r   r<   )r   r   r   r<   r   r<   )r   r   r   r   r   r<   )r   r   r   r   r   r   )r   r   )/__name__
__module____qualname____doc__r$   propertyr)   r0   r6   r:   r?   rC   rE   rK   rR   rV   r[   r_   rb   re   ri   rm   rk   rl   rs   ru   rx   r{   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r%   r#   r   r      s         / / / / # # # X# < < < X<
) ) ) )- - - -: : : :D D D D
" " " "4 4 4 4 	R 	R 	R 	R 	RF F F F
( ( ( (! ! ! !       7 7 7 7; ; ; ;' ' ' ', , , ,- - - -% % % %& & & &/ / / /1 1 1 14 4 4 44 4 4 4A A A A
. . . ., , , ,
J J J JK K K K+ + + +@ @ @ @
 
 
 
	B 	B 	B 	BB B B B U U U U	< 	< 	< 	<T T T T

H 
H 
H 
H6 6 6 6E E E EF F F F F Fr%   r   r   r   r   r   r   Iterator[Vec2]c              #  &   K   |D ]}| |z  } | V  dS )zReturns the absolute location of increment points, each point is an increment
    of the previous point starting at the current pen location.
    Nr   r   r   points      r#   r   r     s6         5 r%   c              #  "   K   |D ]	}| |z   V  
dS )zpReturns the absolute location of increment points, all points are relative
    to the current pen location.
    Nr   r   s      r#   r   r     s4         o r%   r   r<   r   r   Iterator[float]c              #     K   t          dt          d|                    }t          t          ||z                      }||z  }t	          |dz             D ]}| ||z  z   V  d S )Ng     f@rL   r   )minr   absroundrange)r   r   r   countdeltarv   s         r#   r   r   "  s      eSk2233KkK/0011E%Euqy!! $ $eem#####$ $r%   intermediater   c                    | dz  } |dz  }|dz  }|| z
  }| |z
  }||z
  }t          j        t          |          t          |          z   t          |                    r|S |dk     rd|z   S |dz
  S )zaReturns the sweeping angle from start angle to end angle passing the
    intermediate angle.
    r   r   )mathiscloser   )r   r   r   r   i_to_si_to_es         r#   r   r   +  s     EME%'L
+C%KE\!F<F|CKK#f++-s5zz:: !1995= 5= r%   )r   r   r   r   r   r   )r   r<   r   r<   r   r<   r   r   )r   r<   r   r<   r   r<   r   r<   )
__future__r   typingr   r   r   depsr   r   r	   r
   r   r   r   r   r   r   r   polygon_bufferr   r   r   r   r   r   r   r   r   r%   r#   <module>r     si   # " " " " " % % % % % % % %               2 1 1 1 1 1 1 1 1 1       ) ) ) ) ) )      zF zF zF zF zF zF zF zFz      $ $ $ $! ! ! ! ! !r%   