
    Og=O                    r   d dl mZ d dlmZmZmZ d dlZd dlZd dl	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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  e!d      Z"dZ#dZ$dZ%dZ&d Z' e
jP                  ddd      Z) e
jP                  d d d       Z*dZ+ e,ejZ                        Z. e,ej^                        Z0 e,ejb                        Z2 e,ejf                        Z4 G d dejj                        Z6 G d d      Z7d!dZ8 G d de      Z9d"dZ:	 	 d#	 	 	 	 	 	 	 d$dZ;d%dZ<d&dZ=d'd(dZ>d)dZ?ed*d        Z@y)+    )annotations)IterableSequenceno_type_checkN)colors)Vec2BoundingBox2dMatrix44)Command   )Color)BackendInterfaceBkPath2d
BkPoints2d	ImageData)ConfigurationLineweightPolicy)BackendProperties)layoutrecorderPlotterBackend;s   %0B;IN;BP;s	   PU;PA0,0;
   (      c                  :    e Zd ZdZd fdZ ej                         ddddd	 	 	 	 	 	 	 	 	 ddZ ej                         f	 	 	 	 	 dd	Z ej                         f	 	 	 	 	 dd
Z	 ej                         f	 	 	 	 	 ddZ
 ej                         f	 	 	 	 	 ddZ xZS )r   a  The :class:`PlotterBackend` creates HPGL/2 plot files for output on raster
    plotters. This backend does not need any additional packages.  This backend support
    content cropping at page margins.

    The plot files are tested by the plot file viewer `ViewCompanion Standard`_
    but not on real hardware - please use with care and give feedback.

    .. _ViewCompanion Standard: http://www.softwarecompanions.com/

    c                "    t         |           y N)super__init__)self	__class__s    _/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/addons/drawing/hpgl2.pyr    zPlotterBackend.__init__2   s        NTr   @   )settings
render_boxcurvesdecimal_placesbasec                  d}t        j                   |      }| j                         }||j                         }t        j                  |d      }	|	j                  ||      }|j                  dk(  s|j                  dk(  ryt        |j                  |j                        t        z  |_        |	j                  |||      }
|j                  |
       |j                  rH|j!                  |      \  }}|j#                  |      }dt        z  }|j%                  ||z  ||z  |       t'        |||||      }|j)                  |       |j+                         S )	uo  Returns the HPGL/2 data as bytes.

        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
            curves: use Bèzier curves for HPGL/2 output
            decimal_places: HPGL/2 output precision, less decimal places creates smaller
                files but for the price of imprecise curves (text)
            base: base for polyline encoding, 32 for 7 bit encoding or 64 for 8 bit encoding

        F)flip_yr   r$   )r&   
top_origin)r-   g?r&   r(   r)   r*   )copyplayerbboxr   Layoutget_final_pagewidthheightmaxwidth_in_mmheight_in_mm	MM_TO_PLUoutput_coordinate_spaceget_placement_matrix	transformcrop_at_marginsget_margin_rectpage_output_scale_factor	crop_rect_RenderBackendreplay	get_bytes)r!   pager&   r'   r(   r)   r*   r-   r0   output_layoutmp1p2output_scalemax_sagittabackends                   r#   rC   zPlotterBackend.get_bytes5   sN   , 
99X&J j?++D(;::?dkkQ.   $"3"34y@ 	( ..8
 / 
 	##))Z)@FB#<<TBL	/KR,.\0A;O )
 	g  ""r$   c                .    | j                  ||ddd      S )a  Returns the HPGL/2 data as 7-bit encoded bytes curves as approximated
        polylines and coordinates are rounded to integer values.
        Has often the smallest file size and should be compatible to all output devices
        but has a low quality text rendering.
        Fr       r.   rC   r!   rD   r&   s      r#   
compatiblezPlotterBackend.compatibler   s%     ~~8E!"  
 	
r$   c                .    | j                  ||ddd      S )u
  Returns the HPGL/2 data as 8-bit encoded bytes, curves as Bézier
        curves and coordinates are rounded to integer values.
        Has a smaller file size than normal quality and the output device must support
        8-bit encoding and Bèzier curves.
        Tr   r%   r.   rN   rO   s      r#   low_qualityzPlotterBackend.low_quality~   %     ~~8D  
 	
r$   c                .    | j                  ||ddd      S )u*  Returns the HPGL/2 data as 8-bit encoded bytes, curves as Bézier
        curves and coordinates are floats rounded to one decimal place.
        Has a smaller file size than high quality and the output device must support
        8-bit encoding, Bèzier curves and fractional coordinates.
        Tr   r%   r.   rN   rO   s      r#   normal_qualityzPlotterBackend.normal_quality   rS   r$   c                .    | j                  ||ddd      S )u"  Returns the HPGL/2 data as 8-bit encoded bytes and all curves as Bézier
        curves and coordinates are floats rounded to two decimal places.
        Has the largest file size and the output device must support 8-bit encoding,
        Bèzier curves and fractional coordinates.
        T   r%   r.   rN   rO   s      r#   high_qualityzPlotterBackend.high_quality   rS   r$   returnNone)
rD   layout.Pager&   layout.Settingsr'   zBoundingBox2d | Noner)   intrZ   bytes)rD   r\   r&   r]   rZ   r_   )__name__
__module____qualname____doc__r    r   SettingsrC   rP   rR   rU   rX   __classcell__)r"   s   @r#   r   r   &   s   	 %4FOO$5+/;#;# "	;#
 );# ;# 
;#| >MV__=N



+:

	

 >MV__=N



+:

	

 >MV__=N



+:

	

 >MV__=N



+:

	

r$   c                  6    e Zd ZdddZd	dZd
dZddZddZy)PenTablec                B    t               | _        t        |      | _        y r   )dictpensr^   max_pens)r!   rk   s     r#   r    zPenTable.__init__   s    +/6	Hr$   c                    || j                   v S r   rj   r!   indexs     r#   __contains__zPenTable.__contains__   s    		!!r$   c                     | j                   |   S r   rm   rn   s     r#   __getitem__zPenTable.__getitem__   s    yyr$   c                "    || j                   |<   y r   rm   )r!   ro   colors      r#   add_penzPenTable.add_pen   s     		%r$   c                :   d| j                   dz
   dj                         g}| j                  j                         D cg c]	  \  }}||f }}}|j	                          |D ]   \  }}|j                  t        ||             " dj                  |      S c c}}w )NNPr   r   r$   )rk   encoderj   itemssortappendmake_pcjoin)r!   commandro   rgbrj   s        r#   to_byteszPenTable.to_bytes   s    "$T]]1_$5Q 7 > > @A+/99??+<.
'UCUCL.
 .
 			 	0JE3NN75#./	0xx  .
s    BN)r%   )rk   r^   rZ   r[   )ro   r^   rZ   bool)ro   r^   rZ   
colors.RGB)ro   r^   rt   r   rZ   r_   )r`   ra   rb   r    rp   rr   ru   r    r$   r#   rg   rg      s    &" !!r$   rg   c           	     x    d|  d|j                    d|j                   d|j                   d	j                         S )NPC,r   )rgbrx   )penr   s     r#   r|   r|      s8    uAceeWAceeWAceeWA.5577r$   c                  :   e Zd ZdZdddd	 	 	 	 	 	 	 	 	 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       Zd.dZd/dZd0dZd1dZ	 	 	 	 	 	 d2dZd3dZ	 	 	 	 	 	 d4dZ	 	 	 	 	 	 d5dZd6dZd7dZd)dZd)dZd)dZd)d Zy!)8rA   a  Creates the HPGL/2 output.

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

    - Move content in the first quadrant of the coordinate system.
    - The output coordinates are integer values, scale the content appropriately:
        - 1 plot unit (plu) = 0.025mm
        - 40 plu = 1mm
        - 1016 plu = 1 inch
        - 3.39 plu = 1 dot @300 dpi
    - Replay the recorded output on this backend.

    TrW   r%   )r(   r)   r*   c               x   || _         || _        t        |dz        | _        |rt	        |      nd | _        || _        g | _        g | _        t        d      | _
        d| _        d| _        | j                  |       t               | _        d| _        d| _        t$        j&                  | _        t+        |j,                  |j.                        }t        ||j0                  z  d      | _        t        | j0                  |j2                  z  d      | _        t        | j0                  |j4                  z  d      | _        y )	Ngp=
ף
@   )rk   r   g        皙?      ?rW   )r&   r(   roundfactional_bitsr^   r)   r*   headerdatarg   	pen_tablecurrent_pencurrent_pen_widthsetupri   _stroke_width_cachemin_lineweightlineweight_scalingr   ABSOLUTElineweight_policyr6   r7   r8   max_stroke_widthmin_stroke_widthfixed_stroke_width)r!   rD   r&   r(   r)   r*   max_sizes          r#   r    z_RenderBackend.__init__   s    !#NT$9:#1Ct 	 	#%!#	!3/ !(+

47;v  #"%!1!:!: t''):):;',X8Q8Q-QST'U',!!H$=$==q(

 */!!H$?$??*
r$   c                    d|j                   t        z  dd|j                  t        z  dd}| j                  j	                  |j                                | j                  j	                  d       y )NPSz.0fr   r   s   FT1;PA;)r7   r9   r8   r   r{   rx   )r!   rD   cmds      r#   r   z_RenderBackend.setup   s^    4##I-c2!D4E4Ei4OPS3TTUV3::<(:&r$   c                    t        | j                        }|j                  | j                  j	                                t        || j                        S r   )listr   r{   r   r   compile_hpgl2r   )r!   r   s     r#   rC   z_RenderBackend.get_bytes  s:    "4;;/dnn--/0VTYY//r$   c                    || j                   v rE| j                   |   }||k7  r/| j                  j                  t        t        |             t        }|S | j                   j                  ||       |S r   )r   r   r{   r|   DEFAULT_PENru   )r!   
pen_numberr   	pen_colors       r#   switch_current_penz!_RenderBackend.switch_current_pen
  sf    'z2Ii		  c!:;(
  NN"":s3r$   c                    | j                   |k(  ry | j                  j                  d| dj                                || _         y )NSPr   )r   r   r{   rx   )r!   r   s     r#   set_penz_RenderBackend.set_pen  s?    z)		2j\+2245%r$   c                    | j                   |k(  ry | j                  j                  d|ddj                                || _         y )NPWr   r   )r   r   r{   rx   )r!   r4   s     r#   set_pen_widthz_RenderBackend.set_pen_width  s@    !!U*		2eAYa//12!&r$   c                    t        |j                  | j                        }t        |j                  | j                        }| j                  j                  d| d| dj                                y )NzPA;PUr   z;PM;)r   xr)   yr   r{   rx   )r!   start_pointr   r   s       r#   enter_polygon_modez!_RenderBackend.enter_polygon_mode   sX    +--!4!45+--!4!45		51QCt,3356r$   c                :    | j                   j                  d       y )Ns   PM1;r   r{   r!   s    r#   close_current_polygonz$_RenderBackend.close_current_polygon%  s    		!r$   c                :    | j                   j                  d       y )Ns   PM2;FP;r   r   s    r#   fill_polygonz_RenderBackend.fill_polygon(  s    		$r$   c                    |j                   }| j                  |j                        \  }}| j                  |j                        }| j                  ||      }| j                  |       | j                  |       y r   )r   resolve_pen_colorrt   resolve_pen_width
lineweightr   r   r   )r!   
propertiesr   r   opacity	pen_widths         r#   set_propertiesz_RenderBackend.set_properties+  sh    ^^
!33J4D4DE	7**:+@+@A	,,ZC
Z 9%r$   c                    | j                  |       | j                  j                  t        || j                  | j
                               y r   )r   r   r{   polyline_encoderr   r*   )r!   verticesr   s      r#   add_polyline_encodedz#_RenderBackend.add_polyline_encoded3  s8     	J'		)(D4G4GSTr$   c                   | j                   rM|j                  rA| j                  |       | j                  j	                  t        || j                               y t        |j                  t        d            }| j                  ||       y )N   )segments)r(   
has_curvesr   r   r{   path_encoderr)   r   
flatteningMAX_FLATTENr   )r!   pathr   pointss       r#   add_pathz_RenderBackend.add_path9  sc    ;;4??
+II\$0C0CDE$//+/BCF%%fj9r$   c                ~    t         j                  j                  |       }|t        k(  rt        }|t        | dd       fS )N   	   )r   RGBfrom_hexWHITEBLACKalpha_to_opacity)rt   r   s     r#   r   z _RenderBackend.resolve_pen_colorA  s9    jj!!%(%<C$U1QZ000r$   c                   	 | j                   |   S # t        $ r 	 | j                  }Y nw xY w| j                  }|t        j
                  k(  rI| j                  r$t        | j                  |      | j                  z  }n| j                  }t        |d      }n>|t        j                  k(  r+t        t        || j                  | j                        d      }|| j                   |<   |S NrW   )r   KeyErrorr   r   r   r   r   r6   r   r   RELATIVEmap_lineweight_to_stroke_widthr   r   )r!   r4   stroke_widthpolicys       r#   r   z _RenderBackend.resolve_pen_widthH  s    	3++E22 	322L	3 ''%...&&D//7$:Q:QQ++ ?L'000 .400$2G2G 	L +7  's    **c                     y r   r   )r!   rt   s     r#   set_backgroundz_RenderBackend.set_background_  s    r$   c                *    | j                  |g|       y r   r   )r!   posr   s      r#   
draw_pointz_RenderBackend.draw_pointc  s    !!3%4r$   c                ,    | j                  ||g|       y r   r   )r!   startendr   s       r#   	draw_linez_RenderBackend.draw_linef  s    !!5#,
;r$   c                j    t        |      }t        |      dk(  ry |D ]  }| j                  ||        y Nr   )r   lenr   )r!   linesr   lines       r#   draw_solid_linesz_RenderBackend.draw_solid_linesi  s:     Uu:? 	8D%%dJ7	8r$   c                p    |j                         D ]#  }t        |      dk(  r| j                  ||       % y r   )	sub_pathsr   r   )r!   r   r   sub_paths       r#   	draw_pathz_RenderBackend.draw_pathr  s5    ( 	0H8}!MM(J/	0r$   c                .   t        |      }t        |      dk(  ry | j                  |d   j                         |D ]H  }|j	                         D ]3  }t        |      dk(  r| j                  ||       | j                          5 J | j                          y r   )r   r   r   r   r   r   r   r   )r!   pathsr   pr   s        r#   draw_filled_pathsz _RenderBackend.draw_filled_pathsx  s     Uu:?a/ 	-AKKM -x=A%h
3**,	-	- 	r$   c                    |j                         }|r7| j                  |d          | j                  ||       | j                          y y r   )r   r   r   r   )r!   r   r   points2ds       r#   draw_filled_polygonz"_RenderBackend.draw_filled_polygon  sF      &0##HQK0%%h
; r$   c                     y r   r   )r!   
image_datar   s      r#   
draw_imagez_RenderBackend.draw_image      r$   c                    |j                   | _         |j                  r#|j                  dz  dz  }t        d|      | _        |j                  | _        y )Ngffffff9@i,  r   )r   r   r6   r   )r!   configmin_lineweight_mms      r#   	configurez_RenderBackend.configure  sM    !'!9!9   & 5 5 <s B"%d,=">D"(";";r$   c                     y r   r   r   s    r#   clearz_RenderBackend.clear  r  r$   c                     y r   r   r   s    r#   finalizez_RenderBackend.finalize  r  r$   c                     y r   r   )r!   entityr   s      r#   enter_entityz_RenderBackend.enter_entity  r  r$   c                     y r   r   )r!   r  s     r#   exit_entityz_RenderBackend.exit_entity  r  r$   N)
rD   r\   r&   r]   r)   r^   r*   r^   rZ   r[   )rD   r\   rZ   r[   r   )r   r^   r   r   rZ   r^   )r   r^   rZ   r[   )r4   floatrZ   r[   )r   r   rZ   r[   rY   )r   r   rZ   r[   )r   Iterable[Vec2]r   r   )r   r   r   r   )rt   r   rZ   ztuple[colors.RGB, float])r4   r  rZ   r  )rt   r   rZ   r[   )r   r   r   r   rZ   r[   )r   r   r   r   r   r   rZ   r[   )r   zIterable[tuple[Vec2, Vec2]]r   r   rZ   r[   )r   r   r   r   rZ   r[   )r   zIterable[BkPath2d]r   r   rZ   r[   )r   r   r   r   rZ   r[   )r   r   r   r   rZ   r[   )r  r   rZ   r[   ) r`   ra   rb   rc   r    r   rC   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r  r  r	  r  r  r   r$   r#   rA   rA      s4   ( -
-
 "	-
 -
 -
 
-
^'
0
&'7
"%&U&U4EU: 1 1.5<808>O8	80'5F	   .? 	 <r$   rA   c                X    t        |       r	 t        | d      dz  S y# t        $ r Y yw xY w)N   r   r   )r   r^   
ValueError)alphas    r#   r   r     s=     5z	ub>C''   		s    	))c                    t        t        | |      |      |z
  } ||z
  ||z
  z  }t        |t        | |z        z   d      S r   )r6   minr   )r   r   r   r   max_lineweightfactors         r#   r   r     sN     S^4nEVJ!11n~6UVF!E*v*=$>>BBr$   c                D    t        | j                  t                    }|S )N)distance)r   r   FLATTEN_MAX)r   r   s     r#   flatten_pathr    s    $//;/78FMr$   c                    t        t              }|j                  dj                  |              |j                  dj                  |             |j                  t               t        |      S )Nr$   )	bytearrayPRELUDEextendr}   EPILOGr_   )r   commandsoutputs      r#   r   r     sL    wF
MM#((6"#
MM#((8$%
MM&=r$   c                Z   |r| d|z  z  } t        |       }|dk\  r|dz  }nt        |      dz  dz   }t               }||k\  r)t        ||      \  }}|j	                  d|z          ||k\  r)|dk(  r|j	                  d|z          t        |      S |j	                  d|z          t        |      S )Nr   r   rW   ?   r%      _   )r   absr  divmodr{   r_   )value	frac_bitsr*   r   charsr   s         r#   	pe_encoder.    s    ieAAv	QFQJNKE
t)a1R!V t) rzS1W < 	R!V<r$   c                    d}|dk(  rd}|r|dt        |d|      z   z  }|dz   g}t        |       } | d   }|j                  t        |j                  ||             |j                  t        |j                  ||             | dd  D ]U  }||z
  }|j                  t        |j                  ||             |j                  t        |j                  ||             |}W |j                  d       d	j                  |      S )
Ns   PErM   s   PE7   >r   s   <=r      ;r$   )r.  r   r{   r   r   r}   )r   r,  r*   r   r   currentvertexdeltas           r#   r   r     s    
Crzti	1d333%K=DH~HqkGKK	'))Y56KK	'))Y5612,  Ieggy$78Ieggy$78 	KK88D>r$   c                   | j                   }t        |j                  |      }t        |j                  |      }d|dd|ddj	                         g}t
        j                  }t        |       rbg }| j                         D ],  }|j                  |z
  }	t        |	j                  |      }
t        |	j                  |      }|j                  t
        j                  k(  rc|
dd|ddj	                         }|t
        j                  k(  r|d   d d dz   |z   |d<   n|j                  d|z          t
        j                  }nb|j                  t
        j                  k(  r5|j                  |z
  }|j                  |z
  }d	|z  d
z  }|d	||z
  z  d
z  z   }nG|j                  t
        j                  k(  r|j                   |z
  }|j"                  |z
  }nt%        d      t        |j                  |      }t        |j                  |      }t        |j                  |      }t        |j                  |      }|dd|dd|dd|dd|
dd|ddj	                         }|t
        j                  k(  r|d   d d dz   |z   |d<   n|j                  d|z          t
        j                  }|j                  }/ |j                  dj'                  |             |j                  d       dj'                  |      S )NzPU;PAr   r   z;PD;r      ,s   PRg       @g      @z/internal error: MOVE_TO command is illegal heres   BRr$   s   PU;)r   r   r   r   rx   r   MOVE_TOr   r#  r   typeLINE_TOr{   	CURVE3_TOctrl	CURVE4_TOctrl1ctrl2r  r}   )r   r)   r2  r   r   r   prev_commandr#  r   r4  xeyecoordscontrolr   	control_1	control_2x1y1x2y2s                        r#   r   r     s    jjGgii(Agii(AAa5!Ad#**,-D??L
4y "==? "	CGGg%Euww/Buww/Bxx7??*q62a&*1137??2#+B<#4t#;f#DHRLOOEFN3&88w000!hh0G''G+C #g 3I #cWs]&;c&A AIXX!2!22 #		G 3I #		G 3I$%VWW9;;79;;79;;79;;7q62a&"QqAa1vQr!fAFMMO7#4#44#+B<#4t#;f#DHRLOOEFN3&00ggGE"	F 	CHHX&'KK88D>r$   )r   r^   r   r   rZ   r_   )r  strrZ   r  )r   gzG @)r   r  r   r  r   r  rZ   r  )r   r   rZ   zSequence[Vec2])r   Sequence[bytes]r#  rL  rZ   r_   )r   r%   )r+  r  r,  r^   r*   r^   rZ   r_   )r   r  r,  r^   r*   r^   rZ   r_   )r   r   r)   z
int | NonerZ   r_   )A
__future__r   typingr   r   r   r/   numpynpezdxfr   
ezdxf.mathr   r	   r
   
ezdxf.pathr   
type_hintsr   rK   r   r   r   r   r  r   r   r   r    r   r   __all__ord	SEMICOLONr   r"  r  r9   r   r   r   r   r   r^   r8  CMD_MOVE_TOr:  CMD_LINE_TOr;  CMD_CURVE3_TOr=  CMD_CURVE4_TORecorderr   rg   r|   rA   r   r   r  r   r.  r   r   r   r$   r#   <module>r^     sb   # 4 4    4 4   F F 3 )  
H	
		

3S!

1a '//"'//"G%%&G%%&z
X&& z
z! !28
d% dN 	C	C	C 	C 	C
(, . .r$   