
    'j=                        d dl mZ d dlmZmZ d dlZddlmZmZ ddl	m
Z
 ddlmZ ddlmZmZ  G d	 d
          ZddZd dZd!dZd"d#dZd$d%dZd Zd ZdS )&    )annotations)IteratorIterableN   )Vec2NULLVEC2)RGB)Plotter)Command	pe_decodec                  B   e Zd ZdZd.dZd/d	Zd0dZd1dZd2dZd2dZ	d2dZ
d2dZd2dZd2dZd2dZd2dZd2dZd2dZd2dZd2dZd2dZd2dZd2dZd2d Zd2d!Zed2d"            Zd2d#Zd2d$Zed2d%            Zd2d&Zd2d'Zed2d(            Z d2d)Z!d3d*Z"d3d+Z#d4d,Z$d-S )5Interpreteraa  The :class:`Interpreter` is the frontend for the :class:`Plotter` class.
    The :meth:`run` methods interprets the low level HPGL commands from the
    :func:`hpgl2_commands` parser and sends the commands to the virtual plotter
    device, which sends his output to a low level :class:`Backend` class.

    Most CAD application send a very restricted subset of commands to plotters,
    mostly just polylines and filled polygons. Implementing the whole HPGL/2 command set
    is not worth the effort - unless reality proofs otherwise.

    Not implemented commands:

        - the whole character group - text is send as filled polygons or polylines
        - configuration group: IN, DF, RO, IW - the plotter is initialized by creating a
          new plotter and page rotation is handled by the add-on itself
        - polygon group: EA, ER, EW, FA, RR, WG, the rectangle and wedge commands
        - line and fill attributes group: LA, RF, SM, SV, TR, UL, WU, linetypes and
          hatch patterns are decomposed into simple lines by CAD applications

    Args:
        plotter: virtual :class:`Plotter` device

    plotterr
   returnNonec                n    g | _         t                      | _        t                      | _        || _        d S N)errorssetnot_implemented_commands_disabled_commandsr   )selfr   s     X/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/addons/hpgl2/interpreter.py__init__zInterpreter.__init__$   s,    !#25%%%,/EE    errorstrc                :    | j                             |           d S r   )r   append)r   r   s     r   	add_errorzInterpreter.add_error*   s    5!!!!!r   commandslist[Command]c                    |D ]q\  }}|| j         v rt          | d|                                 d          }|r ||           C|d         t          j        v r| j                            |           rdS )zInterprets the low level HPGL commands from the :func:`hpgl2_commands` parser
        and sends the commands to the virtual plotter device.
        cmd_Nr   )r   getattrlowerstringascii_lettersr   add)r   r!   nameargsmethods        r   runzInterpreter.run-   s     # 	8 	8JD$t...T#8$**,,#8#8$??F 8taF000-11$777	8 	8r   Iterable[str]c                :    | j                             |           dS )zDisable commands manually, like the scaling command ["SC", "IP", "IR"].
        This is a feature for experts, because disabling commands which changes the pen
        location may distort or destroy the plotter output.
        N)r   update)r   r!   s     r   disable_commandszInterpreter.disable_commands:   s!    
 	&&x00000r   r+   list[bytes]c                   d}d}d}t          t          |                    }t          |          }|dk    rt          |d                   }|dk    r|d         }|dk    r|d         }| j                            |||           dS )zSet fill type.r           r      N)tuple	to_floatslenintr   set_fill_type)r   r+   	fill_typespacinganglevalues	arg_counts          r   cmd_ftzInterpreter.cmd_ftB   s    	y''KK	q==F1IIq==QiGq==1IE""9gu=====r   c                    t          t          |                    }t          |          dk    r3|\  }}}}| j                            |t          |||                     dS |                     d           dS )zSet pen color as RGB tuple.   z invalid arguments for PC commandN)listto_intsr8   r   set_pen_colorr	   r    )r   r+   r>   indexrgbs          r   cmd_pczInterpreter.cmd_pcQ   st    gdmm$$v;;!#NE1aL&&uc!Qll;;;;;NN=>>>>>r   c                    t          |          }|rt          |d         d          }n|                     d           dS d}|dk    rt          |d         |          }| j                            ||           dS )zSet pen width.r   gffffff?z invalid arguments for PW commandNr   )r8   to_floatr    to_intr   set_pen_width)r   r+   r?   widthrF   s        r   cmd_pwzInterpreter.cmd_pwZ   s    II	 	T!Wd++EENN=>>>Fq==47E**E""5%00000r   c                    t          |          r0| j                            t          |d         d                     dS dS )zSelect pen.r   r   N)r8   r   set_current_penrN   r   r+   s     r   cmd_spzInterpreter.cmd_spg   sD    t99 	=L((Q););<<<<<	= 	=r   c                    t          |          r0| j                            t          |d         d                     dS dS )zSet number of pens.r   r5   N)r8   r   set_max_pen_countrN   rT   s     r   cmd_npzInterpreter.cmd_npl   sD    t99 	?L**6$q'1+=+=>>>>>	? 	?r   c                <   t          |          dk    r| j                                         dS t          t	          |                    }t          |          dk    r)| j                            |d         |d                    dS |                     d           dS )z$Set input points p1 and p2 absolute.r   Nr    invalid arguments for IP command)r8   r   reset_scaling	to_pointsr7   set_scaling_pointsr    )r   r+   pointss      r   cmd_ipzInterpreter.cmd_ipq   s    t99>>L&&(((F9T??++v;;??L++F1IvayAAAAANN=>>>>>r   c                   t          |          dk    r| j                                         dS t          t	          |                    }t          |          dk    rQt          |d         dd          }t          |d         dd          }| j                            |dz  |dz             dS t          |          dk    rt          |d         dd          }t          |d         dd          }t          |d         dd          }t          |d         dd          }| j                            |dz  |dz  |dz  |dz             dS |                     d	           dS )
z6Set input points p1 and p2 in percentage of page size.r   Nr5   r4         Y@r   rB      rZ   )	r8   r   r[   rC   r7   clampset_scaling_points_relative_1set_scaling_points_relative_2r    )r   r+   r>   xp1yp1xp2yp2s          r   cmd_irzInterpreter.cmd_ir}   s[   t99>>L&&(((Fioo&&v;;!q	3..Cq	3..CL66sU{C%KPPPPP[[Aq	3..Cq	3..Cq	3..Cq	3..CL66eS5[#+sU{     NN=>>>>>r   c                n   t          |          dk    r| j                                         d S t          t	          |                    }t          |          dk     r|                     d           d S d}t          |          dk    rt          |d                   }|dk    rd}t          |          dk    rt          |d         dd          }d}t          |          d	k    rt          |d	         dd          }| j                            |d         |d         |d
         |d         ||           d S |d
k    rD| j        	                    t          |d         |d
                   |d         |d                    d S | j                            |d         |d         |d
         |d                    d S )Nr   rB   z invalid arguments for SC commandr   g      I@   r4   ra      r5   rb   )r8   r   r[   rC   r7   r    r9   rc   set_isotropic_scalingset_point_factorr   set_anisotropic_scaling)r   r+   r>   scaling_typeleftbottoms         r   cmd_sczInterpreter.cmd_sc   s   t99>>L&&(((Fioo&&v;;??NN=>>>Fv;;??vay>>L1D6{{QVAYU33F6{{Qvay#u55L..q	q	q	q	     QL))VAYq	**F1Ivay     L00q	6!9fQi    r   c                    d}t          |          r?t          |d         |          }| j                            t	          |                     d S d S Nr   )r8   rN   r   set_merge_controlboolr   r+   statuss      r   cmd_mczInterpreter.cmd_mc   sT    t99 	9DGV,,FL**4<<88888	9 	9r   c                    d}d}t          |          }|r(t          |d         |          }t          |dz            }|dk    rt          |d         |          }| j                            ||           d S )Ni  iI  r   g      ?r   )r8   rN   r9   r   
setup_page)r   r+   lengthheightcounts        r   cmd_pszInterpreter.cmd_ps   s}    D		 	'DGV,,F#&&F199DGV,,F/////r   c                    | j                                          t          |          r6| j                             t	          t          |                               dS dS )zLower pen down and plot lines.N)r   pen_downr8   plot_polyliner\   r7   rT   s     r   cmd_pdzInterpreter.cmd_pd   s[    t99 	CL&&y4'A'ABBBBB	C 	Cr   c                    | j                                          t          |          r6| j                             t	          t          |                               dS dS )zLift pen up and move pen.N)r   pen_upr8   r   r\   r7   rT   s     r   cmd_puzInterpreter.cmd_pu   s[    t99 	CL&&y4'A'ABBBBB	C 	Cr   c                    | j                                          t          |          r6| j                             t	          t          |                               dS dS )z3Place pen absolute. Plots polylines if pen is down.N)r   set_absolute_moder8   r   r\   r7   rT   s     r   cmd_pazInterpreter.cmd_pa   [    &&(((t99 	CL&&y4'A'ABBBBB	C 	Cr   c                    | j                                          t          |          r6| j                             t	          t          |                               dS dS )z2Place pen relative.Plots polylines if pen is down.N)r   set_relative_moder8   r   r\   r7   rT   s     r   cmd_przInterpreter.cmd_pr   r   r   c                   t          |          }|s|                     d           dS | j                                         | j                                         t          |d         d          }d}|dk    rt          |d         |          }| j                            ||           | j                                         dS )zPlot full circle.z invalid arguments for CI commandNr   g      ?      @r   )r8   r    r   push_pen_stater   rM   plot_abs_circlepop_pen_state)r   r+   r?   radiuschord_angles        r   cmd_cizInterpreter.cmd_ci   s    II	 	NN=>>>F##%%%$q'3''q=="47K88K$$V[999""$$$$$r   c                    t          |          dk     r|                     d           dS |                     || j        j                   dS )zPlot arc absolute.rb    invalid arguments for AR commandN)r8   r    _arc_outr   plot_abs_arcrT   s     r   cmd_aazInterpreter.cmd_aa   H    t99q==NN=>>>FdDL566666r   c                    t          |          dk     r|                     d           dS |                     || j        j                   dS )zPlot arc relative.rb   r   N)r8   r    r   r   plot_rel_arcrT   s     r   cmd_arzInterpreter.cmd_ar   r   r   c                $   t          |           }|dk     rdS t          | d                   }t          | d                   }t          | d                   }d}|dk    rt          | d         |          } |t          ||          ||           dS )zPlot arcrb   Nr   r   r5   r   )r8   rM   r   )r+   output_methodr?   xysweep_angler   s          r   r   zInterpreter._arc_out   s     II	q==FT!WT!WtAw''q=="47K88Kd1ajj+{;;;;;r   c                    t          |          dk     r|                     d           dS |                     || j        j                   dS )z$Plot arc absolute from three points.rB   z invalid arguments for AT commandN)r8   r    _arc_3p_outr   plot_abs_arc_three_pointsrT   s     r   cmd_atzInterpreter.cmd_at  J    t99q==NN=>>>Ft|EFFFFFr   c                    t          |          dk     r|                     d           dS |                     || j        j                   dS )z$Plot arc relative from three points.rB   z invalid arguments for RT commandN)r8   r    r   r   plot_rel_arc_three_pointsrT   s     r   cmd_rtzInterpreter.cmd_rt  r   r   c                (   t          |           }|dk     rdS t          t          |                     }t          |          dk     rdS d}|dk    rt          | d         |          }	  ||d         |d         |           dS # t          $ r Y dS w xY w)zPlot arc from three pointsrB   Nr5   r   r   r   )r8   r\   r7   rM   ZeroDivisionError)r+   r   r?   r^   r   s        r   r   zInterpreter._arc_3p_out  s     II	q==F9T??++v;;??Fq=="47K88K	M&)VAY<<<<<  	 	 	DD	s   (B 
BBc                F    |                      || j        j                   dS )z8Plot cubic Bezier curves with absolute user coordinates.N)_bezier_outr   plot_abs_cubic_bezierrT   s     r   cmd_bzzInterpreter.cmd_bz,  #    t|ABBBBBr   c                F    |                      || j        j                   dS )z8Plot cubic Bezier curves with relative user coordinates.N)r   r   plot_rel_cubic_bezierrT   s     r   cmd_brzInterpreter.cmd_br0  r   r   c                    d}t           }t           }t          t          |                     D ]1}|dk    r|}n|dk    r|}n|dk    r|} ||||           |dz   dz  }2d S )Nr   r   r5   rb   )r   r\   r7   )r+   r   kindctrl1ctrl2pointends          r   r   zInterpreter._bezier_out4  s    y// 	" 	"EqyyeUC0001H>DD	" 	"r   c                   t          |          r	|d         }n|                     d           dS | j        }d}d}d}d}d}t          |          }	g }
||	k     r||         }|dv r|dz  }|d	k    r{t          |||
          \  }}|                    t          |d                              t          |          dk    r*|
                    t          |dd                              n|dk    rd}n|dk    rht          |||
          \  }}t          |d                   }t          |          dk    r*|
                    t          |dd                              nJ|dk    rd}nA|dk    rd}n8t          ||||          \  }}|
                    t          |                     |
r|                                 |r|
d         |j	        z
  |
d<   |s@|

                    d          }|                    |           |
s|                                 |
r)|                    |
           |
                                 d}d}||	k     dS dS )zPlot Polyline Encoded.r   z invalid arguments for PE commandNTF@   s   :<>=7r   :   )basestart<   >   =   7       )	frac_bitsr   r   )r8   r    r   r   rS   r9   extendr\   r   user_locationpopmove_to_relr   plot_rel_polylineclear)r   r+   datar   r   absolutefrac_bin_bitsr   rF   r~   point_queuecharr>   targets                 r   cmd_pezInterpreter.cmd_peC  s   t99 	7DDNN=>>>F,T"$fnn;Dx
2::$-dU$K$K$KMFE++Cq	NN;;;6{{Q#**9VABBZ+@+@AAARZZ$HHRZZ$-dU$K$K$KMFE$'q	NNM6{{Q#**9VABBZ+@+@AAARZZ#HHRZZD )ME! ! ! ""9V#4#4555 !  """ L%0^g6K%KKN )(__Q//F''///& )((( (--k:::%%''' Q fnnnnnnr   c                    d}t          |          rt          |d         |          }|dk    r| j                                         dS | j                            |           dS )zEnter/Exit polygon mode.r   r5   N)r8   rN   r   exit_polygon_modeenter_polygon_modery   s      r   cmd_pmzInterpreter.cmd_pm  sg    t99 	-DGV,,FQ;;L**,,,,,L++F33333r   c                    d}t          |          r$t          t          |d         |          d          }| j                            |           dS )zPlot filled polygon.r   )r   r   N)r8   one_ofrN   r   fill_polygon)r   r+   fill_methods      r   cmd_fpzInterpreter.cmd_fp  sO    t99 	G Q!=!=vFFK!!+.....r   c                8    | j                                          dS )zPlot edged polygon.N)r   edge_polygon)r   _s     r   cmd_epzInterpreter.cmd_ep  s    !!#####r   N)r   r
   r   r   )r   r   r   r   )r!   r"   r   r   )r!   r.   r   r   )r+   r2   )r+   r2   r   r   )r   r   )%__name__
__module____qualname____doc__r   r    r-   r1   r@   rJ   rQ   rU   rX   r_   rj   rt   r{   r   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r    r   r   r   r      s        ,   " " " "8 8 8 81 1 1 1> > > >? ? ? ?1 1 1 1= = = =
? ? ? ?

? 
? 
? 
?? ? ? ?,! ! ! !F9 9 9 9	0 	0 	0 	0C C C CC C C CC C C CC C C C% % % % 7 7 7 77 7 7 7 < < < \<G G G GG G G G    \ C C C CC C C C " " " \";! ;! ;! ;!|4 4 4 4/ / / /$ $ $ $ $ $r   r   r+   Iterable[bytes]r   Iterator[float]c              #  X   K   | D ]$}	 t          |          V  # t          $ r Y !w xY wd S r   float
ValueErrorr+   args     r   r7   r7     sY        	** 	 	 	D	    
''Iterator[int]c              #  X   K   | D ]$}	 t          |          V  # t          $ r Y !w xY wd S r   r9   r   r   s     r   rD   rD     sU        	c((NNNN 	 	 	D	 r   r>   Iterable[float]
list[Vec2]c                t    g }d}d}| D ].}|r&|                     t          ||                     d}*|}d}/|S )NFr4   T)r   r   )r>   r^   append_pointbuffervalues        r   r\   r\     s\    FLF     	 MM$vu--... LLFLLMr   r4   sbytesr   c                F    	 t          |           S # t          $ r |cY S w xY wr   r   r   defaults     r   rM   rM     s6    Qxx         r9   c                F    	 t          |           S # t          $ r |cY S w xY wr   r   r   s     r   rN   rN     s6    1vv   r   c                >    t          t          ||           |          S r   )maxmin)vv_minv_maxs      r   rc   rc     s    s5!}}e$$$r   c                    | |v r| S |d         S rv   r   )r   choices     r   r   r     s    !9r   )r+   r   r   r   )r+   r   r   r   )r>   r   r   r   )r4   )r   r   r   r   )r   )r   r   r   r9   )
__future__r   typingr   r   r'   depsr   r   
propertiesr	   r   r
   	tokenizerr   r   r   r7   rD   r\   rM   rN   rc   r   r   r   r   <module>r     sU   # " " " " " % % % % % % % %                              ) ) ) ) ) ) ) )G$ G$ G$ G$ G$ G$ G$ G$T                 % % %    r   