
    h                       S SK Jr  S SKJrJrJrJrJr  S SKrS SK	r	S SK
JrJrJrJrJrJr  S SK
JrJrJrJr  S SKJr  S SKJr  S SKJr  S S	KJrJr  S S
KJr  S SK J!r!  S SK"J#r#J$r$  \(       a  S SK%J&r&  S SK"J'r'  S SK(J)r)   " S S\5      r*Sr+Sr,\,S-   r-\,S-   r.Sr/S2S jr0S3S jr1    S4           S5S jjr2S6S jr3 " S S5      r4 " S S5      r5 " S S 5      r6 " S! S"5      r7 " S# S$5      r8 " S% S&\85      r9 " S' S(5      r: " S) S*5      r;S7S+ jr<        S8S, jr=S9S- jr>            S:S. jr?S;S/ jr@S<S0 jrAS=S1 jrBg)>    )annotations)TYPE_CHECKINGIterableOptionalAnycastN)Vec3Vec2UVecConstructionLineConstructionBoxConstructionArc)UCSPassTroughUCSxroundZ_AXIS)const)TextEntityAlignment)options)DXFValueErrorDXFUndefinedBlockError)suppress_zeros)ARROWS)DimStyleOverride	Dimension)Drawing)	Textstyle)GenericLayoutTypec                  d   ^  \ rS rSrSr\" SS5      SSSSS4           SU 4S jjjrSrU =r$ )TextBox$   zText boundaries representation.r           c                @   > [         TU ]  XSU-  -   USU-  -   U5        g )N       @)super__init__)selfcenterwidthheightanglehgapvgap	__class__s          G/var/www/html/env/lib/python3.13/site-packages/ezdxf/render/dim_base.pyr&   TextBox.__init__'   s(     	t!3VcDj5H%P     )r(   r
   r)   floatr*   r3   r+   r3   r,   r3   r-   r3   )	__name__
__module____qualname____firstlineno____doc__r
   r&   __static_attributes____classcell__)r.   s   @r/   r    r    $   sl    ) Aqz	Q	Q 	Q 		Q
 	Q 	Q 	Q 	Qr1   r       ±z\A{align};{txt}{{\H{fac:.2f}x;z{tol}}}z\S{upr}^ {lwr};}}z {{\H{fac:.2f}x;\S{upr}^ {lwr};}}c                     U b  [        U 5      $ g N)r
   )vs    r/   OptionalVec2r?   :   s    }Awr1   c                     U S:  a  gU S:  a  gg)Nr"   -r   + r2   )values    r/   	sign_charrE   A   s    s{	r1   c                    Ub  [        X5      n Uc  SnUS-  nOS[        U5      -   S-   nUR                  U 5      n[        US-  5      n[        US-  5      n[	        XgU5      nUS:w  a  UR                  SU5      nU$ )Nz{:f}   z{:.zf}   .)r   strformatboolr   replace)	rD   dimrnddimdecdimzindimdsepfmttextleadingpendings	            r/   format_textrV   J   s     u%~ !c&k!D(::eD6A:G6A:G$1D#~||C)Kr1   c                t    SU;   a$  UR                  SSS5      nUR                  U 5      $ [        SU S35      e)N<>z{}   zInvalid dimpost string: "")rM   rK   r   )rS   dimpostrR   s      r/   apply_dimpostr\   e   s?    woodD!,zz$7yBCCr1   c                      \ rS rSr   S       SS jjr\SS j5       rS rS rSS jr	S r
SS jrSS	 jrSS
 jrSS jrSrg)	Tolerancem   c                   X0l         X@l        UR                  n[        U" SS5      5      U l        SU l        U R                  (       d  [        U" SS5      5      U l        U" SS5      U l        UR                  5       U l        SU l	        U" SS	5      U l
        U" S
S	5      U l        U" SS5      U l        U" SS5      U l        U" SS5      U l        SU l        S	U l        S	U l        SU l        SU l        X R                  -  U R                  -  U l        U R                  (       a  U R+                  5         g U R
                  (       a  U R-                  5         g g )Ndimtolr   Fdimlimdimtfacg      ?g?dimtmr"   dimtpdimtdec   dimtoljdimtzin )text_width_factor	dim_scalegetrL   has_tolerance
has_limitstext_scale_factorget_decimal_separatortext_decimal_separatorline_spacingminimummaximumdecimal_placesvalignr   rS   text_height
text_width
text_upper
text_lowerchar_heightinit_toleranceinit_limits)r'   	dim_style
cap_heightwidth_factorrl   rm   s         r/   r&   Tolerance.__init__n   s:    "."mm "#h"23!!"3x#34DO ),Is(;&/&E&E&G# $( "'3/ "'3/ $'y!#4 y!, $'y!#4	"%!$!!",/E/E"E"V!__ r1   c                @    U R                   =(       d    U R                  $ r=   rn   ro   r'   s    r/   enabledTolerance.enabled   s    !!4T__4r1   c                     SU l         SU l        g NFr   r   s    r/   disableTolerance.disable   s    "r1   c                   U R                   U R                  :X  a=  U R                  U l        U R	                  U R
                  U R
                  5      U l        OVU R                  U R                  U R                  -  -   U l        U R	                  U R                  U R                  5      U l        U R                  U R                  U R                   5        g r=   )rt   ru   r|   rx   get_text_widthrS   ry   rs   rz   r{   update_tolerance_textr   s    r/   r}   Tolerance.init_tolerance   s     <<4<<'#//D"11$))TYYGDO  $//43C3CdFWFW3WXD"11$//4??SDO""4<<>r1   c                   X:X  a'  [         U R                  [        U5      5      -   U l        g [	        U5      U R                  [        U5      5      -   U l        [	        US-  5      U R                  [        U5      5      -   U l        g )N)
PLUS_MINUSrV   absrS   rE   rz   r{   )r'   	tol_upper	tol_lowers      r/   r   Tolerance.update_tolerance_text   sl    !"T%5%5c)n%EEDI'	2T5E5Ec)n5UUDO'	B7$:J:JI; DOr1   c                Z    U R                   U R                  U R                  -  -   U l        g r=   )r|   rx   rs   r   s    r/   r~   Tolerance.init_limits   s(      ++t/?/?$BSBS/STr1   c                X    [        USU R                  U R                  U R                  S9$ )zeRounding and text formatting of tolerance `value`, removes leading
and trailing zeros if necessary.

N)rD   rN   rO   rP   rQ   )rV   rv   r   rr   r'   rD   s     r/   rV   Tolerance.format_text   s2     &&&&//
 	
r1   c                v    [        [        U5      [        U5      5      nU R                  U R                  -  U-  $ )zCReturns the text width of the tolerance (upr/lwr) in drawing units.)maxlenrx   rk   )r'   uprlwrcounts       r/   r   Tolerance.get_text_width   s4     CHc#h'$"8"885@@r1   c                   U R                   (       a  [        [        U R                  5      S5      n[	        US5      nU R
                  (       d7  [        R                  UUU R                  U R                  U R                  S9nU$ [        R                  UUU R                  U R
                  S9n U$ U R                  (       a3  [        R                  U R                  U R                  U R                  S9nU$ )Nr   rg   )aligntxtfacr   r   )r   r   r   tol)r   r   r   )rn   r   intrw   minrS   TOLERANCE_TEMPLATE2rK   rp   rz   r{   TOLERANCE_TEMPLATE1ro   LIMITS_TEMPLATE)r'   rS   r   s      r/   compile_mtextTolerance.compile_mtext   s    DKK(!,EqME99*11.. 2 (  +11..			 2   __"))OOOO** * D
 r1   c                    XR                   -   nXR                  -
  nU R                  U5      U l        U R                  U5      U l        U R                  U R                  U R                  5      U l        g r=   )ru   rt   rV   rz   r{   r   ry   )r'   measurementupper_limitlower_limits       r/   update_limitsTolerance.update_limits  sZ    !LL0!LL0**;7**;7--dootOr1   )r|   rv   rl   ro   rn   rs   ru   rt   r   rS   rr   rx   r{   rp   rz   ry   rk   rw   N)      ?r   r   )r   r   r   r3   r   r3   rl   r3   returnrL   )r   r3   r   r3   rD   r3   r   rJ   )r   rJ   r   rJ   r   r3   )rS   rJ   r   rJ   )r   r3   r   None)r4   r5   r6   r7   r&   propertyr   r   r}   r   r~   rV   r   r   r   r9   r2   r1   r/   r^   r^   m   s}      !H#H H 	H
 HT 5 5 ?U
A6Pr1   r^   c                  P    \ rS rSr% \R
                  rS\S'   SS jrS	S
S jjr	Sr
g)ExtensionLinesi  r   default_lineweightc                   UR                   nU" SU5      U l        U" SS5      U l        U" SS5      U l        U" SU R                  5      U l        [        U" SS5      5      U l        [        U" SS5      5      U l        U" S	S
5      U-  U l	        U" SS
5      U-  U l
        [        U" SS5      5      U l        U" SU R                  5      U-  U l        g )Ndimclredimltex1rj   dimltex2dimlwedimse1r   dimse2dimexer"   dimexodimfxlondimfxl)rm   color	linetype1	linetype2r   
lineweightrL   	suppress1	suppress2extension_aboveoffsethas_fixed_lengthlength_belowr'   r   default_colorscalerm   s        r/   r&   ExtensionLines.__init__  s    mmi7
!*b1!*b1"8T-D-DE#C!$45#C!$45
 '*(C&85&@ !3/%7 '+3z1+=&> $'x1E1E#F#Nr1   c                    SU R                   0nUS:X  a  U R                  nO!US:X  a  U R                  nO[        SU 35      eU(       a  X2S'   U R                  U R
                  :w  a  U R                  US'   U$ )6Returns default dimension line DXF attributes as dict.r   rY   rg   zinvalid argument num:linetyper   )r   r   r   
ValueErrorr   r   )r'   numattribsr   s       r/   
dxfattribsExtensionLines.dxfattribs/  ss    #*DJJ"7!8~~HAX~~H4SE:;;"*J??d555$(OOGL!r1   )
r   r   r   r   r   r   r   r   r   r   Nr   r   r   r   r   r3   )rY   )r   r   r   r   r4   r5   r6   r7   r   LINEWEIGHT_BYBLOCKr   __annotations__r&   r   r9   r2   r1   r/   r   r     s#    #666O2 r1   r   c                  L    \ rS rSr% \R
                  rS\S'   SS jrS	S jr	Sr
g)
DimensionLinei@  r   r   c                0   UR                   nU" SU5      U l        U" SS5      U-  U l        U" SS5      U l        U" SU R                  5      U l        [        U" SS5      5      U l        [        U" S	S5      5      U l        [        U" S
S5      5      U l	        g )Ndimclrddimdler"   dimltyperj   dimlwddimsd1r   dimsd2dimtoflrY   )
rm   r   	extensionr   r   r   rL   r   r   has_dim_line_if_text_outsider   s        r/   r&   DimensionLine.__init__C  s    mmi7
 !$Hc 2U : R0"8T-D-DE  $C!$45  $C!$45 37s9a7H2I)r1   c                    SU R                   0nU R                  (       a  U R                  US'   U R                  U R                  :w  a  U R                  US'   U$ )r   r   r   r   )r   r   r   r   )r'   r   s     r/   r   DimensionLine.dxfattribs]  sJ    #*DJJ"7=="&--GJ??d555$(OOGL!r1   )r   r   r   r   r   r   r   Nr   r   r   r   r2   r1   r/   r   r   @  s    #666J4r1   r   c                  <    \ rS rSrSS jr\SS j5       rS	S jrSrg)
Arrowsig  c                8   UR                   nU" SU5      U l        U" SS5      U-  U l        SU l        SU l        U" SS5      U-  U l        SU l        SU l        U R                  S:  a  U R                  S-  U l        g UR                  5       u  U l        U l        g )	Nr   dimtszr"   rj   dimaszg      ?Fr$   )	rm   r   	tick_sizearrow1_namearrow2_name
arrow_sizer   r   get_arrow_names)r'   r   r   r   rm   s        r/   r&   Arrows.__init__h  s    mmi/
 #Hc 2U : " "!$Xt!4u!<>>C #nns2DO ))+  r1   c                     U R                   S:  $ Nr"   )r   r   s    r/   	has_ticksArrows.has_ticks~  s    ~~##r1   c                    SU R                   0$ Nr   )r   r   s    r/   r   Arrows.dxfattribs  s    $$r1   )r   r   r   r   r   r   r   Nr   r   r   r   r   r3   r   r   )	r4   r5   r6   r7   r&   r   r   r   r9   r2   r1   r/   r   r   g  s     ,, $ $%r1   r   c                      \ rS rSr      SS jr\S 5       r\S 5       rSS jr\SS j5       r	SS jr
SS jrSS	 jrSSS
 jjrSS jr\R                   SS j5       r\R                   SS j5       rSrg)Measurementi  c                |   SU l         SU l        SU l        UR                  nUR                  nUc   S5       e[        UR                  SS 5      5      U l        UR                  SS5      U l        UR                  SS5      U l	        UR                  SS5      U l
        UR                  nS	U l        UR                  S
S 5      U l        U" SS5      U l        U" S[         R"                  5      nXuR$                  R&                  ;  a  SnXpl        [+        XW5      n[-        X5      U-  U l        UR                  SS5      U l        UR2                  R                  U l        U" SS5      U-  U l        UR                  SS 5      U l        U R8                  U l        U" SU5      U l        U" SS 5      U l        U" SS5      U l         U" SS5      U l!        U" SS5      U l"        U" SS5      U l#        URI                  5       U l%        U" SS5      U l&        U" SS5      U l'        U" SS5      U l(        S U l)        U" S!S5      U l*        U" S"S5      U l+        U" S#S5      U l,        U" S$S5      U l-        U R                  S L=(       a    U RZ                  S:H  U l.        U" S%S5      U l/        U" S&S5      U l0        [c        U" S'S5      5      U l2        U" S(S5      U l3        U" S)S5      U l4        U" S*S5      U l5        U" S+S5      U l6        SU l7        U" S,S5      S:X  a  S-U l7        SU l8        [s        SS5      U l:        SU l;        SU l<        g ).Nr"   rj   valid DXF document requireduser_locationrelative_user_locationFtext_shift_htext_shift_v   horizontal_directiondimlfacr   dimtxstyStandardr)   dimgapg      ?text_rotationdimclrtrN   rO   rg   dimadecrP   rG   dimazinr[   dimtfillr   dimtfillclrrY   g?dimjustdimtaddimtvpdimtmovedimtihdimtohdimtixdimatfitdimlunitdimfracdimaunit	dimarcsymT)=	raw_valuerD   rS   	dimensiondocr?   popr
  r  r  r  rm   text_attachment_pointget_dxf_attribr  measurement_factorr   default_dimension_text_styletablesstylestext_style_nameget_text_styleget_char_heightrx   rk   dxfstored_dim_texttext_gapuser_text_rotationr  
text_color
text_roundrv   angular_decimal_placesr   angular_suppress_zerosrq   decimal_separatortext_post_process_format	text_filltext_fill_colortext_box_fill_scaletext_haligntext_valigntext_vertical_positiontext_movement_rule
has_leadertext_inside_horizontaltext_outside_horizontalrL   force_text_insidetext_fitting_rulelength_unitfraction_formatangle_unitshas_arc_length_prefixtext_is_outsider
   text_locationis_wide_texthas_upside_down_correction)	r'   r   r   r   r'  r(  rm   
style_name
text_styles	            r/   r&   Measurement.__init__  s`    !$
	''	mm= == .:MM/40.

 -6MM$e-
# $-==#E#,==#E mm +," 6?5M5M"D6
!
 *-Y)< j'*N*NO
ZZ...#J$.#C4
"1)"H5"P(2(A(A'3(O$-MM$6$6  #8U3e; *3)A)A/SW)X$($;$;"9e4+.x+>#&x#3+.y!+<# $'x#3 ,/y!+<# '0&E&E&G-0B-?%
 "*a0$'q$9*-  !$Iq 1 !$Ha 0 .13-?# (+:q'9 d*Kt/F/F!/K 	 -0!,<# .11-=$ (,C!,<'= '**a&8 !$J 2 %(	1$5 !$J 2+0"{A!#)-D& &+ $(1: #( 16'r1   c                $    U R                   (       + $ r=   )rM  r   s    r/   text_is_insideMeasurement.text_is_insideR  s    ''''r1   c                R    [        U R                  =(       d    U R                  5      $ r=   )rL   r  r  r   s    r/   has_relative_text_movement&Measurement.has_relative_text_movementV  s    D%%:):):;;r1   c                n    [        U R                  U R                  45      nXR                  U5      -  nU$ )zAdd `self.text_shift_h` and `sel.text_shift_v` to point `location`,
shifting along and perpendicular to text orientation defined by
`text_rotation`.

Args:
    location: location point
    text_rotation: text rotation in degrees

Returns: new location

)r
   r  r  
rotate_deg)r'   locationr  	shift_vecs       r/   apply_text_shiftMeasurement.apply_text_shiftZ  s7     $++T->->?@	((77r1   c                H    U R                   S:X  a  gU R                   S:X  a  gg)zlReturns vertical placement of dimension text as 1 for above, 0 for
center and -1 for below dimension line.

r   rH   r   rY   )rA  r   s    r/   vertical_placementMeasurement.vertical_placementj  s)     q "r1   c                    U R                   S:X  a  U R                  U R                  -  $ U R                  S-  U R                  -   U R                  -  $ )zReturns the vertical distance for dimension line to text midpoint.
Positive values are above the line, negative values are below the line.

r   r$   )rA  rx   rB  r5  ra  r   s    r/   text_vertical_distance"Measurement.text_vertical_distancew  sN    
 q ##d&A&AAA$$s*T]]:d>U>UUUr1   c                P    U R                   U R                  -  n[        U5      U-  $ )z+
Return width of `text` in drawing units.

)rx   rk   r   )r'   rS   
char_widths      r/   ry   Measurement.text_width  s)     %%(>(>>
4y:%%r1   c                    U R                   nUS:X  a  gU R                  U5      nU(       a  UR                  SUS5      $ U$ )zbCreate dimension text for `measurement` in drawing units and applies
text overriding properties.

rC   rj   rX   rY   )r4  rV   rM   )r'   r   rS   formatted_measurements       r/   text_overrideMeasurement.text_override  sG    
 ##3; $ 0 0 =<<&;Q??$$r1   c                ^    [        U5      U l        U(       a  SOSU l        X0l        SU l        g)  Set user defined dimension text location. ezdxf defines a user
defined location per definition as 'outside'.

Args:
    location: text midpoint
    leader: use leader or not (movement rules)
    relative: is location absolute (in UCS) or relative to dimension
        line center.

rY   rg   TN)r
   r
  rC  r  rM  r'   r\  leaderrelatives       r/   location_overrideMeasurement.location_override  s*     "(^'-!1&.##r1   c                    SU R                   0$ r  )r7  r   s    r/   r   Measurement.dxfattribs  s    ))r1   c                    g)zLUpdate raw measurement value, scaled measurement value and
dimension text.

Nr2   r'   raw_measurement_values     r/   updateMeasurement.update      r1   c                    g)[Rounding and text formatting of `value`, removes leading and
trailing zeros if necessary.

Nr2   r   s     r/   rV   Measurement.format_text  r{  r1   )-rK  r9  r:  rv   r;  rG  rJ  rL  rD  rP  r  rO  rI  r,  r&  r  r4  r   rS   r*  r?  r7  r=  r>  rH  r5  r@  rx   rE  rM  rN  rC  rF  r<  r  r8  r  r  r0  rA  rB  rk   r
  r6  rD   Nr  )r\  r
   r  r3   r   r
   r   r3   )rS   rJ   r   r3   )r   r3   r   rJ   FFr\  r   r   r   r   rx  r3   r   r   r   )r4   r5   r6   r7   r&   r   rU  rX  r^  ra  rd  ry   rk  rr  r   abcabstractmethodry  rV   r9   r2   r1   r/   r  r    s    I6#I6 I6 	I6V ( ( < <  
 
V&%$ * 	  	 r1   r  c                  (    \ rS rSrSS jrSS jrSrg)LengthMeasurementi  c                v    Xl         XR                  -  U l        U R                  U R                  5      U l        g)zKUpdate raw measurement value, scaled measurement value and
dimension text.
N)r&  r,  rD   rk  rS   rw  s     r/   ry  LengthMeasurement.update  s/     /*-D-DD
&&tzz2	r1   c                    [        UU R                  U R                  U R                  U R                  5      nU R
                  (       a  [        X R
                  5      nU$ )r}  )rV   r8  rv   r   r;  r<  r\   )r'   rD   rS   s      r/   rV   LengthMeasurement.format_text  sS    
 OO""
 (( 'D'DEDr1   )r&  rS   rD   Nr  r   )r4   r5   r6   r7   ry  rV   r9   r2   r1   r/   r  r    s    3r1   r  c                      \ rS rSrSr      SS jr\SS j5       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S jjr  S         SS jjrSrg)Geometryi  z
Geometry layout entities are located in the OCS defined by the extrusion
vector of the DIMENSION entity and the z-axis of the OCS
point 'text_midpoint' (group code 11).

c                   UR                   c   S5       eXl        UR                   U l         U R                   R                  U l        U R                  S:  U l        U R                  S:  U l        X l        UR                  U l        U R                  R                  [        5      (       + U l
        X0l        [        5       U l        g )Nr	  AC1015AC1021)r(  r'  
dxfversionsupports_dxf_r2000supports_dxf_r2007ucsuz	extrusioniscloser   requires_extrusionlayoutr    	_text_box)r'   r'  r  r  s       r/   r&   Geometry.__init__  s     }}(G*GG($-%MM#xx22(,8(C(,8(C"vv,0NN,B,B6,J(J)/"))r1   c                t    U R                   R                  S:  =(       a    U R                   R                  S:  $ r   )r  r)   r*   r   s    r/   has_text_boxGeometry.has_text_box  s+    ~~##c)Idnn.C.Cc.IIr1   c                    Xl         g r=   )r  )r'   r  s     r/   
set_layoutGeometry.set_layout  s    r1   c                    Xl         g r=   )r  )r'   text_boxs     r/   set_text_boxGeometry.set_text_box  s    !r1   c                2    XR                   R                  ;   $ r=   )r(  blocksr'   names     r/   	has_blockGeometry.has_block  s    xx&&r1   c                    U R                   R                  [        U5      5      R                  nU R                   R	                  U5      nU R
                  R                  XX4U5        g r=   )r  to_ocsr	   vec2to_ocs_angle_degr  add_arrow_blockref)r'   r  insertsizerotationr   s         r/   r  Geometry.add_arrow_blockref  sJ     f.3388,,X6&&tTZPr1   c                    U R                   R                  [        U5      5      R                  nU R                   R	                  U5      US'   U R
                  R                  XU5        g )Nr  )r  r  r	   r  r  r  add_blockref)r'   r  r  r  r   s        r/   r  Geometry.add_blockref  sM     f.33!%!:!:8!D
:  z:r1   c                   U R                   R                  U5      US'   U R                  R                  XS9nUR	                  U R                   R                  [        U5      5      R                  [        R                  S9  g )Nr  r   )r   )
r  r  r  add_textset_placementr  r	   r  r   MIDDLE_CENTER)r'   rS   posr  r   entitys         r/   r  Geometry.add_text  sj    !%!:!:8!D
:%%d%B
 	HHOODI&++%33 	 	
r1   c                    U R                   R                  U5      US'   U R                   R                  [        U5      5      R                  US'   U R
                  R                  X5        g )Nr  r  )r  r  r  r	   r  r  	add_mtext)r'   rS   r  r  r   s        r/   r  Geometry.add_mtext&  sP    
 "&!:!:8!D
:#xxtCy9>>
8d/r1   c                    SS0nU HM  nU R                   R                  [        U5      5      R                  SS9nU R                  R                  XBS9  MO     g )Nlayer	Defpointsr"   )zr  )r  r  r	   rM   r  	add_point)r'   pointsr   pointr\  s        r/   add_defpointsGeometry.add_defpoints/  sU    [
 E xxtE{3;;c;BHKK!!(!? r1   c                l  ^ ^^^ UU U4S jnSU4S jjnT R                   R                  mU(       a  T R                  (       a  T R                  n[	        UR                  T5      5      n[	        UR                  U5      5      n	X-   n
U
S:X  a  gU
S:X  aK  UR                  [        TU5      5      n[        U5      S:X  a  US   nOU" U6 u  pU	(       a  TOUnU" X5        gUR                  [        TU5      5      n[        U5      S:X  a#  U" US   US   5      u  pU" TU5        U" X5        gU" TU5        g)aY  Add a LINE entity to the geometry layout. Removes parts of the line
hidden by dimension text if `remove_hidden_lines` is True.

Args:
    start: start point of line
    end: end point of line
    dxfattribs: additional or overridden DXF attributes
    remove_hidden_lines: removes parts of the line hidden by dimension
        text if ``True``

c                   > TR                   R                  T" [        U 5      5      R                  T" [        U5      5      R                  TS9  g )Nr  )r  add_liner	   r  )startendr   r'   r  s     r/   add_line_to_block,Geometry.add_line.<locals>.add_line_to_blockM  sA    KK  tE{#((tCy!&&% ! r1   c                P   > TU -
  R                   TU-
  R                   :  a  X4$ X4$ r=   	magnitude)abr  s     r/   order Geometry.add_line.<locals>.orderU  s-    	$$	'<'<<ttr1   rg   NrY   r   )r  r
   r  r
   r   tuple[Vec2, Vec2])	r  r  r  r  r   	is_inside	intersectr   r   )r'   r  r  r   remove_hidden_linesr  r  r  start_inside
end_insideinsideintersection_pointsp1_p2r  s   `` `           @r/   r  Geometry.add_line:  s)   &		 4#4#4~~Hx11%89LX//45J!.F{1&.&8&89I%QT9U&V#*+q0,Q/B "#67EB(Uc!")&.&8&89I%QT9U&V#*+q0"#6q#9;Nq;QRFB%eR0%b.%%r1   Nc                D  ^ ^^^
^ SUU
UUU 4S jjnT R                   R                  [        U5      5      R                  mT R                   R                  m
U(       a<  T R
                  (       a+  [        UTUUT R                  5       H  u  pU" X5        M     gU" X45        g)a  Add a ARC entity to the geometry layout. Removes parts of the arc
hidden by dimension text if `remove_hidden_lines` is True.

Args:
    center: center of arc
    radius: radius of arc
    start_angle: start angle in radians
    end_angle: end angle in radians
    dxfattribs: additional or overridden DXF attributes
    remove_hidden_lines: removes parts of the arc hidden by dimension
        text if ``True``

c           
        > TR                   R                  TT[        R                  " T" U 5      5      [        R                  " T" U5      5      TS9  g)z!Add ARC entity to geometry block.)r(   radiusstart_angle	end_angler   N)r  add_arcmathdegrees)ser   	ocs_angle
ocs_centerr  r'   s     r/   r  !Geometry.add_arc.<locals>.add_arc  sC    KK! LL16,,y|4%   r1   N)r  r3   r  r3   r   r   )r  r  r	   r  to_ocs_angle_radr  visible_arcsr  )r'   r(   r  r  r  r   r  r  r  r  r  r  s   ` `  `    @@r/   r  Geometry.add_arcz  s}    .	 	 XX__T&\277
HH--	4#4#4*
 # K+r1   )
r  r'  r(  r  r  r  r  r  r  r  )r'  r   r  r   r  z'GenericLayoutType'r   )r  r   r   r   )r  r    r   r   )r  rJ   r   rL   )
r  rJ   r  r
   r  r3   r  r3   r   r   )r  rJ   r  r
   r  r3   r   r   rS   rJ   r  r
   r  r3   r   r   )r  zIterable[Vec2]r   r   Fr  r
   r  r
   r   r   r   
r(   r
   r  r3   r  r3   r  r3   r   r   )r4   r5   r6   r7   r8   r&   r   r  r  r  r  r  r  r  r  r  r  r  r9   r2   r1   r/   r  r    s,   ,, , $	,$ J J"'QQ Q 	Q
 Q 
Q ;; ; 	; 
;

0	@  ">&>& >& 
>&L !1,1, 1, 	1,
 1, 
1, 1,r1   r  c                  8   \ rS rSrSr  S     SS jjr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(S jjr S)     S*S jjr  S+         S,S jjr          S-S jrS.S jrS/S jrS0S jrS0S jrSrg)1BaseDimensionRendereri  z,Base rendering class for DIMENSION entities.Nc                   Xl         U R                  X5      U l        U   U(       a  X0l        O[	        U5      U l        U R                   R
                  R                  U l        U R                   R
                  R                  U l	        U R                  R                  nU" SS5      U l        [        U R                  5      S:  a  SU l        U" SS5      U l        U R                  U R                  U R                  5      U l        U R!                  U R                  U R                  5      U l        U R%                  U R                  U R                  5      U l        U R                  R)                  SS5      U R&                  l        U R                  R)                  SS5      U R&                  l        U R/                  U R                  U R                  5      U l        U R3                  U R                  U R                  5      U l        [7        U R                  R8                  U R4                  R8                  5      U R                  l        g )	Ndimscaler   g&.>dimcenr   suppress_arrow1Fsuppress_arrow2)r'  init_geometrygeometryr   r   r3  r   r   r  default_layerrm   rl   r   dim_center_marksinit_measurementr   init_dimension_linedimension_lineinit_arrowsarrowsr)  r   r   init_extension_linesextension_linesr}   r   r   rx   )r'   r'  r  overriderm   s        r/   r&   BaseDimensionRenderer.__init__  s    %.**9: 	%N-i8DN
 #'.."4"4":":"&.."4"4":":nn   #J 4t~~% DN &)1%5001C1CT^^T-1-E-E.
 #..t/A/A4>>R !% 2 23De L $ 2 23De L/3/H/H0
 #11$..$BRBRS (+(($((*>*>(
$r1   c                R    SSK Jn  [        X=(       d
    [        5       U" 5       5      $ )Nr   )VirtualLayout)ezdxf.layoutsr  r  r   )r'   r'  r  r  s       r/   r   #BaseDimensionRenderer.init_geometry  s    /	#9-/=?KKr1   c                V    [        U R                  UR                  UR                  US9$ )N)r   r   rl   )r^   r   rx   rk   )r'   r   r   s      r/   r}   $BaseDimensionRenderer.init_tolerance  s+    NN"..$66	
 	
r1   c                .    [        U R                  X5      $ r=   )r   r   r'   r   r   s      r/   r	  *BaseDimensionRenderer.init_extension_lines  s    dnne;;r1   c                .    [        U R                  X5      $ r=   )r   r   r  s      r/   r  )BaseDimensionRenderer.init_dimension_line  s    T^^U::r1   c                .    [        U R                  X5      $ r=   )r   r   r  s      r/   r  !BaseDimensionRenderer.init_arrows   s    dnne33r1   c                .    [        U R                  X5      $ r=   )r  r   r  s      r/   r  &BaseDimensionRenderer.init_measurement  s     >>r1   c           	         U R                   n[        UR                  U R                  5       UR                  UR
                  =(       d    SSUR                  S-  S9$ )Nr"   g      ?)r(   r)   r*   r+   r,   r-   )r   r    rN  total_text_widthrx   r  r5  )r'   r   s     r/   init_text_box#BaseDimensionRenderer.init_text_box  sY    &&,,'')**++2s %%,
 	
r1   c                .    [        U R                  U5      $ r=   )get_required_defpointr'  r  s     r/   r!  +BaseDimensionRenderer.get_required_defpoint  s    $T^^T::r1   c                    U R                   R                  U5        U R                   R                  (       d  U R                  R	                  5         g g r=   )r  r  r  r   r   )r'   blocks     r/   renderBaseDimensionRenderer.render  s:     	  ' }}//HH 0r1   c                F   SnU R                   R                  nU(       a  U R                  R                  (       a  U R                  R                  nU$ U R                   R	                  U5      nU R                  R
                  (       a  XR                  R                  -  nU$ r   )r   rS   r   ro   ry   rn   )r'   r)   rS   s      r/   r  &BaseDimensionRenderer.total_text_width"  sz    $$xx""++
  ((33D988))XX000Er1   c                4    U R                   U R                  S.$ )z'Returns default DXF attributes as dict.)r  r   )r  r   r   s    r/   default_attributes(BaseDimensionRenderer.default_attributes.  s      ''''
 	
r1   c                t    U R                   R                  XU5        U R                  R                  XU5        g)rn  N)r   set_locationr   rr  ro  s       r/   rr  'BaseDimensionRenderer.location_override5  s.     	##Hh?**8XFr1   c                    U R                  5       nU(       a  UR                  U5        U R                  R                  XX45        g)aX  Add a LINE entity to the dimension BLOCK. Remove parts of the line
hidden by dimension text if `remove_hidden_lines` is True.

Args:
    start: start point of line
    end: end point of line
    dxfattribs: additional or overridden DXF attributes
    remove_hidden_lines: removes parts of the line hidden by dimension
        text if ``True``

N)r*  ry  r  r  )r'   r  r  r   r  r   s         r/   r  BaseDimensionRenderer.add_lineC  s5    & ))+NN:&u:Kr1   c                    U R                  5       nU(       a  UR                  U5        U R                  R                  XX4Xv5        g)a  Add a ARC entity to the geometry layout. Remove parts of the arc
hidden by dimension text if `remove_hidden_lines` is True.

Args:
    center: center of arc
    radius: radius of arc
    start_angle: start angle in radians
    end_angle: end angle in radians
    dxfattribs: additional or overridden DXF attributes
    remove_hidden_lines: removes parts of the arc hidden by dimension
        text if ``True``

N)r*  ry  r  r  )r'   r(   r  r  r  r   r  r   s           r/   r  BaseDimensionRenderer.add_arc[  s:    , ))+NN:&KG	
r1   c                \   U R                  5       nU(       a  UR                  U5        U[        ;   a  U R                  R	                  XXCU5        gUb   U R                  R                  U5      (       d  [        SU S35      eUS:w  a  XFS'   XFS'   U R                  R                  XX65        g)a9  
Add block references and standard arrows to the dimension BLOCK.

Args:
    name: block or arrow name
    insert: insertion point in UCS
    rotation: rotation angle in degrees in UCS (x-axis is 0 degrees)
    scale: scaling factor for x- and y-direction
    dxfattribs: additional or overridden DXF attributes

NzUndefined block: "rZ   r   xscaleyscale)r*  ry  r   r  r  r  r   r  )r'   r  r  r  r   r   r   s          r/   r  "BaseDimensionRenderer.add_blockrefx  s    & ))+NN:&6>MM,,T5GT|4==#:#:4#@#@,/A$q-IJJ|$)!$)!MM&&tXGr1   c                :   U R                   nU R                  nU R                  5       nUR                  US'   UR                  US'   UR
                  (       a  UR                  US'   UR                  US'   UR                  (       a5  UR                  US'   UR                  US'   UR                  S:X  a  SOSUS	'   U(       a  UR                  U5        UR                  XX7S
9  gUR                  US'   U(       a  UR                  U5        UR                  XX7S
9  g)a
  
Add TEXT (DXF R12) or MTEXT (DXF R2000+) entity to the dimension BLOCK.

Args:
    text: text as string
    pos: insertion location in UCS
    rotation: rotation angle in degrees in UCS (x-axis is 0 degrees)
    dxfattribs: additional or overridden DXF attributes

styler   r|   attachment_pointbox_fill_scalebg_fill_colorrY      bg_fillr  r*   N)r  r   r*  r0  r7  r  rx   r*  r=  r?  r>  ry  r  r  )r'   rS   r  r  r   r  r   r   s           r/   r  BaseDimensionRenderer.add_text  s    ==&&))+&66&11&&%0%<%<GM"*5*K*KG&'$$,7,K,K()+6+F+F(*5*?*?1*DQ!	"z*t(G + 7 7GHz*dFr1   c                |    SU R                   R                  0nU R                  XU5        U R                  X#U5        g)z}
Add simple leader line from p1 to p2 to p3.

Args:
    p1: target point
    p2: first text point
    p3: second text point

r   N)r  r   r  )r'   r  r  p3r   s        r/   
add_leader BaseDimensionRenderer.add_leader  s6     t22889
bj)bj)r1   c                    g)zTransforms dimension definition points into WCS or if required into
OCS.

Can not be called in __init__(), because inherited classes may be need
unmodified values.

Nr2   r   s    r/   transform_ucs_to_wcs*BaseDimensionRenderer.transform_ucs_to_wcs  s     	r1   c                    U R                  5         U R                  R                  (       a0  U R                  R                  U R                  R
                  l        g g r=   )rD  r  r  r  r'  r3  r   s    r/   finalizeBaseDimensionRenderer.finalize  s<    !!#==+++/==+B+BDNN( ,r1   )r  r   r  r  rl   r   r'  r  r
  r  r   r   )NN)r'  r   r  Optional[UCS]r  zOptional[DimStyleOverride]r=   )r'  r   r  rI  )r   r3   r   r  r   r^   )r   r   r   r3   r   r   )r   r   r   r3   r   r   )r   r   r   r3   r   r   )r   r   r   r3   r   r  )r   r    )r  rJ   r   r
   )r$  r   r  )r   zdict[str, Any]r  r  r  r  r   r  )
r  rJ   r  r
   r  r3   r   r3   r   r   r  )r  r
   r  r
   r@  r
   )r   r   )r4   r5   r6   r7   r8   r&   r   r}   r	  r  r  r  r  r!  r%  r  r*  rr  r  r  r  r  rA  rD  rG  r9   r2   r1   r/   r  r    s'   6
 "/3	:
:
 :
 -	:
xL

<;4?
;

G& "LL L 
L< !

 
 	

 
 

: H H  H 	 H
  H 
 HD GD*Cr1   r  c                J    X-
  R                   X-
  R                   :  a  X!4$ X4$ r=   r  )r  r  r@  s      r/   order_leader_pointsrK    s(    
bg000vvr1   c                    UR                   u  p4pVUR                  U5      nUR                  U5      nUn	X4-
  R                  U5      n
U R                  U5      U R                  U5      :  a  Un	U
* n
X-   U	4$ )zFReturns the leader points of the "leg" for a vertical centered leader.)cornerslerp	normalizedistance)target_pointr  
leg_lengthc0c1c2c3left_centerright_centerconnection_point
leg_vectors              r/   get_center_leader_pointsr[    s     %%NBB ''"+K772;L"'$$Z0J[)L,A,A,,OO' [

 (*:::r1   c                    U R                   nUR                  U5      (       a  [        UR                  U5      5      $ [        R
                  " U5      er=   )r3  hasattrr
   rm   r   DXFMissingDefinitionPoint)dimr  r3  s      r/   r!  r!    s>    
''C
{{4CGGDM""

)
)$
//r1   c                   / nU[         R                  -  nU[         R                  -  n[        X[         R                  " U5      [         R                  " U5      5      nUR	                  5        H  nUR                  U5       Hn  nX-
  R                  [         R                  -  n	U(       d  UR                  U	5        M<  [         R                  " US   U	5      (       a  M]  UR                  U	5        Mp     M     [        U5      S:X  aL  X#:  a*  U V
s/ s H  oU:  a  U
OU
[         R                  -   PM     nn
UR                  5         X%S   4US   U4/$ X#4/$ s  sn
f )aA  Returns the visible parts of an arc intersecting with a construction box
as (start angle, end angle) tuples.

Args:
    center: center of the arc
    radius: radius of the arc
    start_angle: start angle of arc in radians
    end_angle: end angle of arc in radians
    box: construction box which may intersect the arc

r   rg   r   rY   )r  taur   r  border_linesintersect_liner+   appendr  r   sort)r(   r  r  r  boxintersection_anglesarclineintersection_pointr+   r  s              r/   r  r    sI   & (*488KI
[14<<	3JC   ""%"4"4T":'077$((BE&#**51\\"5b"95AA#**51 #; # 1$"CV#CVa;&AL8CV   # 	  "a01 #Y/
 	
 ())#s   $Ec                    U c   S5       eU R                   R                  R                  n U" U5      n[        SU5      $ ! [        R                   a    U" S5      n N*f = f)Nr	  r  r   )r.  r/  rm   r   DXFTableEntryErrorr   )r(  r  	get_styler8  s       r/   r1  r1  1  se    ?999?

!!%%I&$ U## ## &*%&s   A   AAc                n    UR                   R                  SS5      nUS:X  a  U R                  SS5      nU$ )z:Unscaled character height defined by text style or DIMTXT.r*   r"   dimtxtr   )r3  rm   )r   rR  r*   s      r/   r2  r2  ;  s4    NN&&x5F}x-Mr1   c                b    U R                   nUR                  (       a  UR                  U5      nU$ r=   )rS   r   r   )r   r   rS   s      r/   r   r   C  s)    D
{{  &Kr1   )r   zOptional[Vec2]r   )Nrg   r   rI   )rD   r3   rN   zOptional[float]rO   r   rP   r   rQ   rJ   r   rJ   )rS   rJ   r[   rJ   r   rJ   )r  r
   r  r
   r@  r
   r   r  )rQ  r
   r  r    rR  r3   r   r  )r_  r   r  rJ   r   r
   )r(   r
   r  r3   r  r3   r  r3   rf  r   r   zlist[tuple[float, float]])r(  z	'Drawing'r  rJ   r   r   )r   r   rR  r   r   r3   )r   r  r   r^   r   rJ   )C
__future__r   typingr   r   r   r   r   r  r  
ezdxf.mathr	   r
   r   r   r   r   r   r   r   r   ezdxf.lldxfr   ezdxf.enumsr   ezdxf._optionsr   ezdxf.lldxf.constr   r   ezdxf.toolsr   ezdxf.render.arrowsr   ezdxf.entitiesr   r   ezdxf.documentr   r   ezdxf.eztypesr   r    r   _TOLERANCE_COMMONr   r   r   r?   rE   rV   r\   r^   r   r   r   r  r  r  r  rK  r[  r!  r  r1  r2  r   r2   r1   r/   <module>r~     s   #   
  : 9  + " C & & 6&(/Qo Q 
5 '*4 '*>> 5 #  	
  	6DcP cPL* *Z$ $N% %>q qh	 4W, W,tjC jCZ	;;");7<;;,0/*/*/* /* 	/*
 
/* /*d$r1   