
    h,                        S SK Jr  S SKJrJr  S SKrSSKJrJrJ	r	J
r
Jr  SSKJrJrJr  SSKJr  SSKJr  SS	KJr   " S
 S5      rSS jrSS jrSS jrSS jrg)    )annotations)SequenceIteratorN   )Vec2PathNULLVEC2ConstructionCircleBezier4P)RGB
PropertiesFillType)Backend)PolygonBuffer)Pagec                     \ rS rSrSrS/S jr\S0S j5       r\S0S j5       rS1S jr	S2S jr
S3S jr          S4S	 jrS5S
 jrS6S jr  S7         S8S jjr          S8S jrS9S jrS5S jrS5S jrS5S jrS5S jrS:S jrS;S jrS;S jrS5S jrS5S jrS<S jrS<S jrS=S jrS>S jrS?S jrS@S jr S5S jr!SAS jr"S5S  jr#SBS! jr$SBS" jr%SBS# jr&SCS$ jr'SDS% jr(SES& jr)SFS' jr*SFS( jr+SGS) jr,SGS* jr-SHS+ jr.SHS, jr/S-r0g.)IPlotter   a  
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.

c                    Xl         Xl        [        5       U l        [	        SS5      U l        [        5       U l        SU l        SU l	        SU l
        SU l        [        U l        / U l        g )Ni  iI  FT)backend_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     L/var/www/html/env/lib/python3.13/site-packages/ezdxf/addons/hpgl2/plotter.py__init__Plotter.__init__%   s]    &,sO	$,  $$!&&,.    c                    U R                   $ )zHReturns the current pen location as point in the user coordinate system.r   r!   s    r"   user_locationPlotter.user_location2   s     """r%   c                z    U R                   nU R                  R                  UR                  UR                  5      $ )z@Returns the current pen location as page point in plotter units.)r)   r   
page_pointxyr!   locations     r"   page_locationPlotter.page_location7   s.     %%yy##HJJ

;;r%   c                $    [        X5      U l        g N)r   r   )r!   size_xsize_ys      r"   
setup_pagePlotter.setup_page=   s    (	r%   c                :    U R                   R                  X5        g r4   )r   set_scaling_points)r!   p1p2s      r"   r:   Plotter.set_scaling_points@   s    		$$R,r%   c                :    U R                   R                  X5        g r4   )r   set_scaling_points_relative_1)r!   xp1yp1s      r"   r?   %Plotter.set_scaling_points_relative_1C   s    		//9r%   c                <    U R                   R                  XX45        g r4   )r   set_scaling_points_relative_2)r!   r@   rA   xp2yp2s        r"   rD   %Plotter.set_scaling_points_relative_2F   s     			//#Cr%   c                8    U R                   R                  5         g r4   )r   reset_scalingr(   s    r"   rI   Plotter.reset_scalingK   s    		!r%   c                <    U R                   R                  XU5        g r4   )r   set_ucs)r!   originscale_xscale_ys       r"   set_point_factorPlotter.set_point_factorN   s    		&73r%   c                >    U R                   R                  XX4XV5        g r4   )r   set_isotropic_scaling)r!   x_minx_maxy_miny_maxleftbottoms          r"   rS   Plotter.set_isotropic_scalingQ   s     			''eDQr%   c                <    U R                   R                  XX45        g r4   )r   set_anisotropic_scaling)r!   rT   rU   rV   rW   s        r"   r\   Plotter.set_anisotropic_scaling\   s     			))%Er%   c                    Xl         g r4   )r   r!   statuss     r"   set_merge_controlPlotter.set_merge_controla   s    !'r%   c                    SU l         g NFr   r(   s    r"   pen_upPlotter.pen_upd   s
     r%   c                    SU l         g NTre   r(   s    r"   pen_downPlotter.pen_downg   s
    r%   c                N    U R                   R                  U R                  5        g r4   )r    appendr   r(   s    r"   push_pen_statePlotter.push_pen_statej   s    $$T%5%56r%   c                x    [        U R                  5      (       a   U R                  R                  5       U l        g g r4   )lenr    popr   r(   s    r"   pop_pen_statePlotter.pop_pen_statem   s/    t$$%%#4488:D &r%   c                l    U R                   (       a  U R                  U5        g U R                  U5        g r4   )r   move_to_absmove_to_relr/   s     r"   move_toPlotter.move_toq   s'      X&X&r%   c                    Xl         g r4   r'   r!   r)   s     r"   rv   Plotter.move_to_absw   s    +r%   c                .    U =R                   U-  sl         g r4   r'   r{   s     r"   rw   Plotter.move_to_relz   s    },r%   c                    SU l         g ri   r   r(   s    r"   set_absolute_modePlotter.set_absolute_mode}   s
     $r%   c                    SU l         g rd   r   r(   s    r"   set_relative_modePlotter.set_relative_mode   s
     %r%   c                :    U R                   R                  U5        g r4   )r   set_current_penr!   indexs     r"   r   Plotter.set_current_pen   s    ''.r%   c                :    U R                   R                  U5        g r4   )r   set_max_pen_countr   s     r"   r   Plotter.set_max_pen_count   s    ))%0r%   c                :    U R                   R                  X5        g r4   )r   set_pen_width)r!   r   widths      r"   r   Plotter.set_pen_width       %%e3r%   c                :    U R                   R                  X5        g r4   )r   set_pen_color)r!   r   colors      r"   r   Plotter.set_pen_color   r   r%   c                    US;   a$  [        U R                  R                  U5      5      nU R                  R	                  XU5        g )N)      )maxr   scale_lengthr   set_fill_type)r!   	fill_typespacingangles       r"   r   Plotter.set_fill_type   s7    $))009:G%%i%@r%   c                    SU l         U R                  U l        US:X  a&  U R                  R                  U R                  5        g US:X  a  U R                  R                  5         g g )NTr   r   )r   r   r   resetr1   
close_pathr_   s     r"   enter_polygon_modePlotter.enter_polygon_mode   sV    #++Q;  &&t'9'9:q[  ++- r%   c                h    SU l         U R                  R                  5         U R                  U l        g rd   )r   r   r   r   r   r(   s    r"   exit_polygon_modePlotter.exit_polygon_mode   s)    $'')++r%   c                    U R                   R                  U5        U R                  U R                  R	                  5       5        g r4   )r   set_fill_methodplot_filled_polygon_bufferr   	get_paths)r!   fill_methods     r"   fill_polygonPlotter.fill_polygon   s1    ''4''(<(<(F(F(HIr%   c                V    U R                  U R                  R                  5       5        g r4   )plot_outline_polygon_bufferr   r   r(   s    r"   edge_polygonPlotter.edge_polygon   s    (()=)=)G)G)IJr%   c                |    U(       d  g U R                   (       a  U R                  U5        g U R                  U5        g r4   )r   plot_abs_polylineplot_rel_polyliner!   pointss     r"   plot_polylinePlotter.plot_polyline   s-      ""6*""6*r%   c                   U(       d  g U R                   nU R                  US   5        U R                  (       aT  U R                  R	                  U5      nUR                  SU5        U R                  R                  U R                  U5        g g )Nr   )	r1   rv   r   r   page_pointsinsertr   draw_polyliner   )r!   r   current_page_locations      r"   r   Plotter.plot_abs_polyline   so     $ 2 2$YY**62FMM!23LL&&t? r%   c                p    U(       d  g U R                  [        [        U R                  U5      5      5        g r4   )r   tuplerel_to_abs_points_dynamicr)   r   s     r"   r   Plotter.plot_rel_polyline   s,    +D,>,>GH	
r%   c                    U R                   (       ag  U R                  n[        SSU5       Vs/ s H  nU[        R                  " XA5      -   PM     nnU R
                  R                  U R                  U5        g g s  snf )Nr        v@)r   r)   
arc_anglesr   from_deg_angler   r   r   )r!   radiuschord_anglecenteraverticess         r"   plot_abs_circlePlotter.plot_abs_circle   su    ''F $Auk::A ,,Q77:  
 LL&&tA s   #A:c                   U R                   nXA-
  nUR                  nUR                  nXr-   nU[        R                  " X5      -   n	U R                  U	5        U R                  (       aZ  [        XrU5       V
s/ s H  n
U[        R                  " X5      -   PM     nn
U R                  R                  U R                  U5        g g s  sn
f r4   )r)   	magnitude	angle_degr   r   rv   r   r   r   r   r   )r!   r   sweep_angler   start_point
radius_vecr   start_angle	end_angle	end_pointr   r   s               r"   plot_abs_arcPlotter.plot_abs_arc   s    (( )
%% **-	T00CC	# $KkJJA ,,Q77J   LL&&tA s   6#Cc                @    U R                  XR                  -   X#5        g r4   )r   r)   )r!   
center_relr   r   s       r"   plot_rel_arcPlotter.plot_rel_arc   s    *'9'99;Tr%   c                    U R                   n[        R                  " XAU5      nUR                  nXF-
  R                  nX&-
  R                  nX-
  R                  n	[        XyU5      n
U R                  XjU5        g r4   )r)   r
   from_3pr   r   sweeping_angler   )r!   interendr   startcircler   r   r   inter_angler   s              r"   plot_abs_arc_three_points!Plotter.plot_abs_arc_three_points   sk    ""#++E#>~00\,,	~00$[yI&{;r%   c                J    U R                   nU R                  XA-   XB-   U5        g r4   )r)   r   )r!   r   r   r   currents        r"   plot_rel_arc_three_points!Plotter.plot_rel_arc_three_points   s#    $$&&w{Sr%   c                (   U R                   nU R                  U5        U R                  (       ad  U R                  R	                  XU45      u  pn[        U5      nUR                  X1U5        U R                  R                  U R                  U/SS9  g g NFfilled)
r1   rv   r   r   r   r   	curve4_tor   
draw_pathsr   )r!   ctrl1ctrl2r   r   ps         r"   plot_abs_cubic_bezierPlotter.plot_abs_cubic_bezier   s     $ 2 2 $		 5 5uS6I JE#*+AKKE*LL##DOOaS#G r%   c                ^    [        U R                  XU45      u  pnU R                  XU5        g r4   )rel_to_abs_points_staticr)   r   )r!   r   r   r   s       r"   plot_rel_cubic_bezierPlotter.plot_rel_cubic_bezier  s3    4s 3
c 	""55r%   c                N    U R                   R                  U R                  USS9  g )NTr   r   r   r   r!   pathss     r"   r   "Plotter.plot_filled_polygon_buffer  s    tDr%   c                N    U R                   R                  U R                  USS9  g r   r   r   s     r"   r   #Plotter.plot_outline_polygon_buffer  s    uEr%   )r   r    r   r   r   r   r   r   r   r   r   N)r   r   returnNone)r  r   )r5   intr6   r  )r;   r   r<   r   r  r  )r@   floatrA   r  r  r  )
r@   r  rA   r  rE   r  rF   r  r  r  )r  r  )rM   r   rN   r  rO   r  r  r  )      ?r  )
rT   r  rU   r  rV   r  rW   r  r  r  )r`   boolr  r  )r0   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  r  )r   r  r  r  )r   Sequence[Vec2])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   zSequence[Path])1__name__
__module____qualname____firstlineno____doc__r#   propertyr)   r1   r7   r:   r?   rD   rI   rP   rS   r\   ra   rf   rj   rn   rs   rx   rv   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __static_attributes__ r%   r"   r   r      s    / # # < <
)-:DD$D+0D7<D	D
"4 	R	R 	R 		R
 	R 
	RFF#(F16F?DF	F
(! 7;',-%&/144A
.,
JK+@
	BB U	<T

H6EFr%   r   c              #  .   #    U H  nX-  n U v   M     g7f)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     s       s   c              #  *   #    U H	  nX-   v   M     g7f)zhReturns the absolute location of increment points, all points are relative
to the current pen location.
Nr  r  s      r"   r   r     s      o s   c              #     #    [        S[        SU5      5      n[        [        X-  5      5      nX-  n[	        US-   5       H  nXU-  -   v   M     g 7f)Ng     f@r  r   )minr   absroundrange)r   r   r   countdeltar   s         r"   r   r   "  sR     eSk23Kk/01EEuqy!em## "s   AAc                    U S-  n US-  nUS-  nX -
  nX-
  nX!-
  n[         R                  " [        U5      [        U5      -   [        U5      5      (       a  U$ US:  a  SU-   $ US-
  $ )zYReturns the sweeping angle from start angle to end angle passing the
intermediate angle.
r   r   )mathiscloser  )r   intermediater   r   i_to_si_to_es         r"   r   r   +  sy     EME%'L
+CKE!FF||CK#f+-s5z::195= 5= r%   )r   r   r   r
  r  zIterator[Vec2])r   r  r   r  r   r  r  zIterator[float])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(     sN    # %   2 1  ) zF zFz$!r%   