
    h=O                       S SK Jr  S SKJrJrJr  S SKrS SKrS SK	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JrJrJr  SS
KJrJr  SSKJr  SSKJrJr  S/r \!" S5      r"Sr#Sr$Sr%Sr&S r'\
RP                  " SSS5      r)\
RP                  " S S S 5      r*Sr+\," \RZ                  5      r.\," \R^                  5      r0\," \Rb                  5      r2\," \Rf                  5      r4 " S S\Rj                  5      r6 " S S5      r7S!S jr8 " S S\5      r9S"S jr:  S#       S$S jjr;S%S jr<S&S jr=S'S(S jjr>S)S jr?\S*S  j5       r@g)+    )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                  Z  ^  \ rS rSrSrSU 4S jjr\R                  " 5       SSSSS.         SS	 jjr\R                  " 5       4     SS
 jjr	\R                  " 5       4     SS jjr
\R                  " 5       4     SS jjr\R                  " 5       4     SS jjrSrU =r$ )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U ]  5         g N)super__init__)self	__class__s    L/var/www/html/env/lib/python3.13/site-packages/ezdxf/addons/drawing/hpgl2.pyr!   PlotterBackend.__init__2   s        NTr   @   )settings
render_boxcurvesdecimal_placesbasec                  Sn[         R                   " U5      nU R                  5       nUc  UR                  5       n[        R                  " USS9n	U	R                  X5      nUR                  S:X  d  UR                  S:X  a  g[        UR                  UR                  5      [        -  Ul        U	R                  XUS9n
UR                  U
5        UR                  (       aB  UR!                  US9u  pUR#                  U5      nS[        -  nUR%                  X-  X-  U5        ['        UUUUUS9nUR)                  U5        UR+                  5       $ )	u'  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/   r2   output_layoutmp1p2output_scalemax_sagittabackends                   r$   rE   PlotterBackend.get_bytes5   sD   , 
99X&J j?++D;::?dkkQ.   $"3"34y@ 	( ..
 / 
 	##))Z)@FB#<<TBL	/KR.0A;O )
 	g  ""r&   c                &    U R                  XSSSS9$ )zReturns 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       r0   rE   r"   rF   r(   s      r$   
compatiblePlotterBackend.compatibler   s#     ~~E!"  
 	
r&   c                &    U R                  XSSSS9$ )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'   r0   rQ   rR   s      r$   low_qualityPlotterBackend.low_quality~   #     ~~D  
 	
r&   c                &    U R                  XSSSS9$ )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'   r0   rQ   rR   s      r$   normal_qualityPlotterBackend.normal_quality   rX   r&   c                &    U R                  XSSSS9$ )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'   r0   rQ   rR   s      r$   high_qualityPlotterBackend.high_quality   rX   r&    returnNone)
rF   layout.Pager(   layout.Settingsr)   zBoundingBox2d | Noner+   intrb   bytes)rF   rd   r(   re   rb   rg   )__name__
__module____qualname____firstlineno____doc__r!   r   SettingsrE   rS   rV   rZ   r^   __static_attributes____classcell__)r#   s   @r$   r   r   &   s   	 %+OO$5+/;#;# "	;#
 );# ;# 
;#| >D__=N



+:

	

 >D__=N



+:

	

 >D__=N



+:

	

 >D__=N



+:

	

 

r&   c                  J    \ rS rSrS	S
S jjrSS jrSS jrSS jrSS jrSr	g)PenTable   c                B    [        5       U l        [        U5      U l        g r   )dictpensrf   max_pens)r"   rv   s     r$   r!   PenTable.__init__   s    +/6	Hr&   c                    XR                   ;   $ r   ru   r"   indexs     r$   __contains__PenTable.__contains__   s    		!!r&   c                     U R                   U   $ r   ry   rz   s     r$   __getitem__PenTable.__getitem__   s    yyr&   c                     X R                   U'   g r   ry   )r"   r{   colors      r$   add_penPenTable.add_pen   s     		%r&   c                <   SU R                   S-
   S3R                  5       /nU R                  R                  5        VVs/ s H  u  p#X#4PM
     nnnUR	                  5         U H  u  p#UR                  [        X#5      5        M!     SR                  U5      $ s  snnf )NNPr   r   r&   )rv   encoderu   itemssortappendmake_pcjoin)r"   commandr{   rgbru   s        r$   to_bytesPenTable.to_bytes   s    "$T]]1_$5Q 7 > > @A+/99??+<.
+<ZUUL+< 	 .
 			JENN75./ xx  .
s    B)rv   ru   N)r'   )rv   rf   rb   rc   )r{   rf   rb   bool)r{   rf   rb   
colors.RGB)r{   rf   r   r   rb   rg   )
rh   ri   rj   rk   r!   r|   r   r   r   rn   r`   r&   r$   rq   rq      s    &" !!r&   rq   c           	     x    SU  SUR                    SUR                   SUR                   S3	R                  5       $ )NPC,r   )rgbr   )penr   s     r$   r   r      s8    uAceeWAceeWAceeWA.5577r&   c                  z   \ rS rSrSrSSSS.         S$S j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S+S jrS+S jrS,S jr    S-S jrS.S jr\S/S j5       rS0S jrS1S jrS2S jrS3S jr      S4S jrS5S jr      S6S jr      S7S jrS8S jrS9S jrS+S jrS+S jrS+S  jrS+S! jr S"r!g#):rC      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.

Tr]   r'   )r*   r+   r,   c               t   X l         X0l        [        US-  5      U l        U(       a  [	        U5      OS U l        XPl        / U l        / U l        [        SS9U l
        SU l        SU l        U R                  U5        [        5       U l        SU l        SU l        [$        R&                  U l        [+        UR,                  UR.                  5      n[        XbR0                  -  S5      U l        [        U R0                  UR2                  -  S5      U l        [        U R0                  UR4                  -  S5      U l        g )	Ngp=
ף
@   )rv   r   g        皙?      ?r]   )r(   r*   roundfactional_bitsrf   r+   r,   headerdatarq   	pen_tablecurrent_pencurrent_pen_widthsetuprt   _stroke_width_cachemin_lineweightlineweight_scalingr   ABSOLUTElineweight_policyr8   r9   r:   max_stroke_widthmin_stroke_widthfixed_stroke_width)r"   rF   r(   r*   r+   r,   max_sizes          r$   r!   _RenderBackend.__init__   s    !#NT$9:#1Ct 	 	#%!#	!3/ !(+

47;v  #"%!1!:!: t''):):;',X8Q8Q-QST'U',!!H$=$==q(

 */!!H$?$??*
r&   c                    SUR                   [        -  S SUR                  [        -  S S3nU R                  R	                  UR                  5       5        U R                  R	                  S5        g )NPSz.0fr   r   s   FT1;PA;)r9   r;   r:   r   r   r   )r"   rF   cmds      r$   r   _RenderBackend.setup   s^    4##I-c2!D4E4Ei4OPS3TTUV3::<(:&r&   c                    [        U R                  5      nUR                  U R                  R	                  5       5        [        XR                  5      $ r   )listr   r   r   r   compile_hpgl2r   )r"   r   s     r$   rE   _RenderBackend.get_bytes  s8    "4;;/dnn--/0VYY//r&   c                    XR                   ;   aE  U R                   U   nX#:w  a/  U R                  R                  [        [        U5      5        [        nU$ U R                   R                  X5        U$ r   )r   r   r   r   DEFAULT_PENr   )r"   
pen_numberr   	pen_colors       r$   switch_current_pen!_RenderBackend.switch_current_pen
  s`    'z2I		  c!:;(
  NN"":3r&   c                    U R                   U:X  a  g U R                  R                  SU S3R                  5       5        Xl         g )NSPr   )r   r   r   r   )r"   r   s     r$   set_pen_RenderBackend.set_pen  s=    z)		2j\+2245%r&   c                    U R                   U:X  a  g U R                  R                  SUS S3R                  5       5        Xl         g )NPWr   r   )r   r   r   r   )r"   r6   s     r$   set_pen_width_RenderBackend.set_pen_width  s>    !!U*		2eAYa//12!&r&   c                    [        UR                  U R                  5      n[        UR                  U R                  5      nU R                  R                  SU SU S3R                  5       5        g )NzPA;PUr   z;PM;)r   xr+   yr   r   r   )r"   start_pointr   r   s       r$   enter_polygon_mode!_RenderBackend.enter_polygon_mode   sX    +--!4!45+--!4!45		51QCt,3356r&   c                :    U R                   R                  S5        g )Ns   PM1;r   r   r"   s    r$   close_current_polygon$_RenderBackend.close_current_polygon%  s    		!r&   c                :    U R                   R                  S5        g )Ns   PM2;FP;r   r   s    r$   fill_polygon_RenderBackend.fill_polygon(  s    		$r&   c                    UR                   nU R                  UR                  5      u  p4U R                  UR                  5      nU R                  X#5      nU R                  U5        U R                  U5        g r   )r   resolve_pen_colorr   resolve_pen_width
lineweightr   r   r   )r"   
propertiesr   r   opacity	pen_widths         r$   set_properties_RenderBackend.set_properties+  sd    ^^
!33J4D4DE	**:+@+@A	,,ZC
Z 9%r&   c                    U R                  U5        U R                  R                  [        XR                  U R
                  5      5        g r   )r   r   r   polyline_encoderr   r,   )r"   verticesr   s      r$   add_polyline_encoded#_RenderBackend.add_polyline_encoded3  s6     	J'		)(4G4GSTr&   c                $   U R                   (       aQ  UR                  (       a@  U R                  U5        U R                  R	                  [        XR                  5      5        g [        UR                  [        SS95      nU R                  X25        g )N   )segments)r*   
has_curvesr   r   r   path_encoderr+   r   
flatteningMAX_FLATTENr   )r"   pathr   pointss       r$   add_path_RenderBackend.add_path9  s_    ;;4??
+II\$0C0CDE$//+/BCF%%f9r&   c                    [         R                  R                  U 5      nU[        :X  a  [        nU[        U SS 5      4$ )N   	   )r   RGBfrom_hexWHITEBLACKalpha_to_opacity)r   r   s     r$   r    _RenderBackend.resolve_pen_colorA  s9    jj!!%(%<C$U1QZ000r&   c                    U R                   U   $ ! [         a     U R                  n Of = fU R                  nU[        R
                  :X  aN  U R                  (       a$  [        U R                  U5      U R                  -  nOU R                  n[        US5      nO>U[        R                  :X  a*  [        [        XR                  U R                  5      S5      nX R                   U'   U$ Nr]   )r   KeyErrorr   r   r   r   r   r8   r   r   RELATIVEmap_lineweight_to_stroke_widthr   r   )r"   r6   stroke_widthpolicys       r$   r    _RenderBackend.resolve_pen_widthH  s    	3++E22 	322L	3 ''%...&&D//7$:Q:QQ++ ?L'000 .00$2G2G 	L +7  's    ++c                    g r   r`   )r"   r   s     r$   set_background_RenderBackend.set_background_  s    r&   c                *    U R                  U/U5        g r   r   )r"   posr   s      r$   
draw_point_RenderBackend.draw_pointc  s    !!3%4r&   c                *    U R                  X/U5        g r   r  )r"   startendr   s       r$   	draw_line_RenderBackend.draw_linef  s    !!5,
;r&   c                n    [        U5      n[        U5      S:X  a  g U H  nU R                  X25        M     g Nr   )r   lenr   )r"   linesr   lines       r$   draw_solid_lines_RenderBackend.draw_solid_linesi  s3     Uu:?D%%d7 r&   c                v    UR                  5        H%  n[        U5      S:X  a  M  U R                  X25        M'     g r  )	sub_pathsr  r   )r"   r   r   sub_paths       r$   	draw_path_RenderBackend.draw_pathr  s.    (H8}!MM(/ )r&   c                :   [        U5      n[        U5      S:X  a  g U R                  US   R                  5        U HL  nUR	                  5        H5  n[        U5      S:X  a  M  U R                  XB5        U R                  5         M7     MN     U R                  5         g r  )r   r  r   r
  r  r   r   r   )r"   pathsr   pr  s        r$   draw_filled_paths _RenderBackend.draw_filled_pathsx  s     Uu:?a/AKKMx=A%h3**,	 *  	r&   c                    UR                  5       nU(       a6  U R                  US   5        U R                  X25        U R                  5         g g r  )r   r   r   r   )r"   r   r   points2ds       r$   draw_filled_polygon"_RenderBackend.draw_filled_polygon  sD      &0##HQK0%%h; r&   c                    g r   r`   )r"   
image_datar   s      r$   
draw_image_RenderBackend.draw_image      r&   c                    UR                   U l         UR                  (       a#  UR                  S-  S-  n[        SU5      U l        UR                  U l        g )Ngffffff9@i,  r   )r   r   r8   r   )r"   configmin_lineweight_mms      r$   	configure_RenderBackend.configure  sM    !'!9!9   & 5 5 <s B"%d,=">D"(";";r&   c                    g r   r`   r   s    r$   clear_RenderBackend.clear  r'  r&   c                    g r   r`   r   s    r$   finalize_RenderBackend.finalize  r'  r&   c                    g r   r`   )r"   entityr   s      r$   enter_entity_RenderBackend.enter_entity  r'  r&   c                    g r   r`   )r"   r4  s     r$   exit_entity_RenderBackend.exit_entity  r'  r&   )r   r,   r   r   r*   r   r+   r   r   r   r   r   r   r   r   r   r(   N)
rF   rd   r(   re   r+   rf   r,   rf   rb   rc   )rF   rd   rb   rc   r   )r   rf   r   r   rb   rf   )r   rf   rb   rc   )r6   floatrb   rc   )r   r   rb   rc   ra   )r   r   rb   rc   )r   Iterable[Vec2]r   r   )r   r   r   r   )r   r   rb   ztuple[colors.RGB, float])r6   r:  rb   r:  )r   r   rb   rc   )r  r   r   r   rb   rc   )r
  r   r  r   r   r   rb   rc   )r  zIterable[tuple[Vec2, Vec2]]r   r   rb   rc   )r   r   r   r   rb   rc   )r  zIterable[BkPath2d]r   r   rb   rc   )r   r   r   r   rb   rc   )r$  r   r   r   rb   rc   )r)  r   rb   rc   )"rh   ri   rj   rk   rl   r!   r   rE   r   r   r   r   r   r   r   r   r   staticmethodr   r   r  r  r  r  r  r  r!  r%  r+  r.  r1  r5  r8  rn   r`   r&   r$   rC   rC      s4   ( -
-
 "	-
 -
 -
 
-
^'
0
&'7
"%&U&U4EU: 1 1.5<808>O8	80'5F	   .? 	 <r&   rC   c                d    [        U 5      (       a   [        U S5      S-  $ g! [         a     gf = f)N   r   r   )r  rf   
ValueError)alphas    r$   r   r     s?     5zz	ub>C''   		s   " 
//c                x    [        [        X5      U5      U-
  n X!-
  XC-
  -  n[        U[        X-  5      -   S5      $ r   )r8   minr   )r   r   r   r   max_lineweightfactors         r$   r   r     sE     S4nEVJ1n6UVF!E**=$>>BBr&   c                >    [        U R                  [        S95      nU$ )N)distance)r   r   FLATTEN_MAX)r   r   s     r$   flatten_pathrH    s    $//;/78FMr&   c                    [        [        5      nUR                  SR                  U 5      5        UR                  SR                  U5      5        UR                  [        5        [        U5      $ )Nr&   )	bytearrayPRELUDEextendr   EPILOGrg   )r   commandsoutputs      r$   r   r     sL    wF
MM#((6"#
MM#((8$%
MM&=r&   c                R   U(       a  U SU-  -  n [        U 5      nUS:  a  US-  nO[        U5      S-  S-   n[        5       nX2:  a(  [        X25      u  p5UR	                  SU-   5        X2:  a  M(  US:X  a  UR	                  SU-   5        OUR	                  SU-   5        [        U5      $ )Nr   r   r]   ?   r'      _   )r   absrJ  divmodr   rg   )value	frac_bitsr,   r   charsr   s         r$   	pe_encoderY    s    ieAAv	QFQJNKE
)aR!V ) rzS1WR!V<r&   c                   SnUS:X  a  SnU(       a  US[        USU5      -   -  nUS-   /n[        U 5      n U S   nUR                  [        UR                  X5      5        UR                  [        UR                  X5      5        U SS   HS  nXe-
  nUR                  [        UR                  X5      5        UR                  [        UR                  X5      5        UnMU     UR                  S5        S	R                  U5      $ )
Ns   PErP   s   PE7   >r   s   <=r      ;r&   )rY  r   r   r   r   r   )r   rW  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                   U R                   n[        UR                  U5      n[        UR                  U5      nSUS SUS S3R	                  5       /n[
        R                  n[        U 5      (       Gah  / nU R                  5        GH1  nUR                  U-
  n	[        U	R                  U5      n
[        U	R                  U5      nUR                  [
        R                  :X  ad  U
S SUS S3R	                  5       nU[
        R                  :X  a  US   S S S-   U-   US'   OUR                  SU-   5        [
        R                  nGOdUR                  [
        R                  :X  a4  UR                  U-
  nUR                  U-
  nS	U-  S
-  nUS	X-
  -  S
-  -   nOHUR                  [
        R                  :X  a  UR                   U-
  nUR"                  U-
  nO[%        S5      e[        UR                  U5      n[        UR                  U5      n[        UR                  U5      n[        UR                  U5      nUS SUS SUS SUS SU
S SUS S3R	                  5       nU[
        R                  :X  a  US   S S S-   U-   US'   OUR                  SU-   5        [
        R                  nUR                  nGM4     UR                  SR'                  U5      5        UR                  S5        SR'                  U5      $ )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   r   r   MOVE_TOr  rN  r  typeLINE_TOr   	CURVE3_TOctrl	CURVE4_TOctrl1ctrl2r?  r   )r   r+   r]  r   r   r   prev_commandrN  r   r_  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
4yy "==?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 #cW]&;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   rf   r   r   rb   rg   )r@  strrb   r:  )r   gzG @)r   r:  r   r:  r   r:  rb   r:  )r   r   rb   zSequence[Vec2])r   Sequence[bytes]rN  rw  rb   rg   )r   r'   )rV  r:  rW  rf   r,   rf   rb   rg   )r   r;  rW  rf   r,   rf   rb   rg   )r   r   r+   z
int | Nonerb   rg   )A
__future__r   typingr   r   r   r1   numpynpezdxfr   
ezdxf.mathr   r	   r
   
ezdxf.pathr   
type_hintsr   rM   r   r   r   r   r)  r   r   r   r    r   r   __all__ord	SEMICOLONrK  rM  rG  r;   r   r   r   r   r   rf   rc  CMD_MOVE_TOre  CMD_LINE_TOrf  CMD_CURVE3_TOrh  CMD_CURVE4_TORecorderr   rq   r   rC   r   r   rH  r   rY  r   r   r`   r&   r$   <module>r     s^   # 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&   