
    'j                    j   d dl mZ d dlmZmZmZmZmZ d dlZd dl	Z	d dl
mZmZmZmZmZmZ d dl
mZmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZ d dl m!Z! d dl"m#Z#m$Z$ erd dl%m&Z& d dl"m'Z' d dl(m)Z)  G d de          Z*dZ+dZ,e,dz   Z-e,dz   Z.dZ/d[dZ0d\dZ1	 	 	 	 d]d^d&Z2d_d)Z3 G d* d+          Z4 G d, d-          Z5 G d. d/          Z6 G d0 d1          Z7 G d2 d3          Z8 G d4 d5e8          Z9 G d6 d7          Z: G d8 d9          Z;d`d?Z<dadCZ=dbdGZ>dcdOZ?dddSZ@dedWZAdfdZZBdS )g    )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                  F     e Zd ZdZ edd          dddddfd fdZ xZS )TextBoxzText boundaries representation.r           centerr
   widthfloatheightanglehgapvgapc                h    t                                          ||d|z  z   |d|z  z   |           d S )N       @)super__init__)selfr"   r#   r%   r&   r'   r(   	__class__s          O/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/render/dim_base.pyr,   zTextBox.__init__'   s;     	t!3VcDj5H%PPPPP    )r"   r
   r#   r$   r%   r$   r&   r$   r'   r$   r(   r$   )__name__
__module____qualname____doc__r
   r,   __classcell__)r.   s   @r/   r    r    $   sq        )) tAqzz	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Qr0   r       ±z\A{align};{txt}{{\H{fac:.2f}x;z{tol}}}z\S{upr}^ {lwr};}}z {{\H{fac:.2f}x;\S{upr}^ {lwr};}}returnOptional[Vec2]c                (    | t          |           S d S N)r
   )vs    r/   OptionalVec2r<   :   s    }Awwtr0   valuer$   strc                &    | dk     rdS | dk    rdS dS )Nr!   -r   +  )r=   s    r/   	sign_charrD   A   s#    s{{s	ssr0      .dimrndOptional[float]dimdecintdimzindimdsepc                4   |t          | |          } |d}|dz  }ndt          |          z   dz   }|                    |           }t          |dz            }t          |dz            }t	          |||          }|dk    r|                    d|          }|S )Nz{:f}   z{:.zf}   rF   )r   r>   formatboolr   replace)	r=   rG   rI   rK   rL   fmttextleadingpendings	            r/   format_textrW   J   s     uf%%~ !c&kk!D(::eD6A:G6A:G$11D#~~||C))Kr0   rT   dimpostc                    d|v r,|                     ddd          }|                    |           S t          d| d          )N<>z{}   zInvalid dimpost string: "")rR   rP   r   )rT   rX   rS   s      r/   apply_dimpostr]   e   sL    woodD!,,zz$BBBBCCCr0   c                  p    e Zd Z	 	 	 dddZed d            Zd Zd Zd!dZd Z	d"dZ
d#dZd$dZd%dZdS )&	Tolerance      ?	dim_styler   
cap_heightr$   width_factor	dim_scalec                   || _         || _        |j        }t           |dd                    | _        d| _        | j        st           |dd                    | _         |dd          | _        |                                | _        d| _	         |dd	          | _
         |d
d	          | _         |dd          | _         |dd          | _         |dd          | _        d| _        d	| _        d	| _        d| _        d| _        || j        z  | j        z  | _        | j        r|                                  d S | j        r|                                  d S d S )Ndimtolr   Fdimlimdimtfacg      ?g?dimtmr!   dimtpdimtdecrE   dimtoljdimtzin )text_width_factorrd   getrQ   has_tolerance
has_limitstext_scale_factorget_decimal_separatortext_decimal_separatorline_spacingminimummaximumdecimal_placesvalignr   rT   text_height
text_width
text_upper
text_lowerchar_heightinit_toleranceinit_limits)r-   ra   rb   rc   rd   rp   s         r/   r,   zTolerance.__init__n   s    "."m "##h"2"233! 	5"33x#3#344DO ),Is(;(;&/&E&E&G&G# $( "c'3// "c'3// $'3y!#4#4 3y!,, $'3y!#4#4	"%!$!!",t/E"E"V 	!!!!!_ 		 	r0   r7   rQ   c                    | j         p| j        S r:   rq   rr   r-   s    r/   enabledzTolerance.enabled   s    !4T_4r0   c                "    d| _         d| _        d S NFr   r   s    r/   disablezTolerance.disable   s    "r0   c                L   | j         | j        k    r2| j        | _        |                     | j        | j                  | _        nA| j        | j        | j        z  z   | _        |                     | j        | j	                  | _        | 
                    | j        | j                    d S r:   )rw   rx   r   r{   get_text_widthrT   r|   rv   r}   r~   update_tolerance_textr   s    r/   r   zTolerance.init_tolerance   s     <4<''#/D"11$)TYGGDOO  $/43CdFW3WXD"11$/4?SSDO""4<>>>>>r0   	tol_upper	tol_lowerc                V   ||k    r1t           |                     t          |                    z   | _        d S t	          |          |                     t          |                    z   | _        t	          |dz            |                     t          |                    z   | _        d S )N)
PLUS_MINUSrW   absrT   rD   r}   r~   )r-   r   r   s      r/   r   zTolerance.update_tolerance_text   s    	!!"T%5%5c)nn%E%EEDIII'	22T5E5Ec)nn5U5UUDO'	B77$:J:JI; ; DOOOr0   c                >    | j         | j        | j        z  z   | _        d S r:   )r   r{   rv   r   s    r/   r   zTolerance.init_limits   s%      +t/?$BS/STr0   r=   r>   c                H    t          |d| j        | j        | j                  S )zuRounding and text formatting of tolerance `value`, removes leading
        and trailing zeros if necessary.

        N)r=   rG   rI   rK   rL   )rW   ry   r   ru   r-   r=   s     r/   rW   zTolerance.format_text   s3     &&/
 
 
 	
r0   uprlwrc                z    t          t          |          t          |                    }| j        | j        z  |z  S )zCReturns the text width of the tolerance (upr/lwr) in drawing units.)maxlenr{   ro   )r-   r   r   counts       r/   r   zTolerance.get_text_width   s5     CHHc#hh''$"885@@r0   rT   c                   | j         rt          t          | j                  d          }t	          |d          }| j        s/t                              ||| j        | j	        | j
                  }n\t                              ||| j        | j                  }n3| j        r,t                              | j	        | j
        | j                  }|S )Nr   rE   )aligntxtfacr   r   )r   r   r   tol)r   r   r   )rq   r   rJ   rz   minrT   TOLERANCE_TEMPLATE2rP   rs   r}   r~   TOLERANCE_TEMPLATE1rr   LIMITS_TEMPLATE)r-   rT   r   s      r/   compile_mtextzTolerance.compile_mtext   s     	DK((!,,EqMME9 *11. 2   +11.		 2   _ 	"))OO* *  D
 r0   measurementNonec                    || j         z   }|| j        z
  }|                     |          | _        |                     |          | _        |                     | j        | j                  | _        d S r:   )rx   rw   rW   r}   r~   r   r|   )r-   r   upper_limitlower_limits       r/   update_limitszTolerance.update_limits  sc    !DL0!DL0**;77**;77--dotOOr0   N)r`   r`   r`   )ra   r   rb   r$   rc   r$   rd   r$   r7   rQ   )r   r$   r   r$   r=   r$   r7   r>   )r   r>   r   r>   r7   r$   )rT   r>   r7   r>   )r   r$   r7   r   )r1   r2   r3   r,   propertyr   r   r   r   r   rW   r   r   r   rC   r0   r/   r_   r_   m   s          !H H H H HT 5 5 5 X5     ? ? ?   U U U
 
 
 
A A A A   6P P P P P Pr0   r_   c                  :    e Zd ZU ej        Zded<   ddZdddZdS )ExtensionLinesrJ   default_lineweightra   r   default_colorscaler$   c                   |j         } |d|          | _         |dd          | _         |dd          | _         |d| j                  | _        t           |dd                    | _        t           |dd                    | _         |d	d
          |z  | _	         |dd
          |z  | _
        t           |dd                    | _         |d| j	                  |z  | _        d S )Ndimclredimltex1rn   dimltex2dimlwedimse1r   dimse2dimexer!   dimexodimfxlondimfxl)rp   color	linetype1	linetype2r   
lineweightrQ   	suppress1	suppress2extension_aboveoffsethas_fixed_lengthlength_belowr-   ra   r   r   rp   s        r/   r,   zExtensionLines.__init__  s   m#i77
!c*b11!c*b11"s8T-DEE#CC!$4$455#CC!$4$455
 '*c(C&8&85&@ !S3//%7 '+33z1+=+=&>&> $'3x1E#F#F#Nr0   r[   numr7   r   c                    d| j         i}|dk    r| j        }n |dk    r| j        }nt          d|           |r||d<   | j        | j        k    r
| j        |d<   |S )6Returns default dimension line DXF attributes as dict.r   r[   rE   zinvalid argument num:linetyper   )r   r   r   
ValueErrorr   r   )r-   r   attribsr   s       r/   
dxfattribszExtensionLines.dxfattribs/  s|    #*DJ"7!88~HHAXX~HH:S::;;; 	+"*GJ?d555$(OGL!r0   Nra   r   r   rJ   r   r$   )r[   )r   rJ   r7   r   	r1   r2   r3   r   LINEWEIGHT_BYBLOCKr   __annotations__r,   r   rC   r0   r/   r   r     s\         #66666O O O O2      r0   r   c                  8    e Zd ZU ej        Zded<   ddZddZdS )DimensionLinerJ   r   ra   r   r   r   r$   c                `   |j         } |d|          | _         |dd          |z  | _         |dd          | _         |d| j                  | _        t           |dd                    | _        t           |d	d                    | _        t           |d
d                    | _	        d S )Ndimclrddimdler!   dimltypern   dimlwddimsd1r   dimsd2dimtoflr[   )
rp   r   	extensionr   r   r   rQ   r   r   has_dim_line_if_text_outsider   s        r/   r,   zDimensionLine.__init__C  s    m#i77
 !$Hc 2 2U : SR00"s8T-DEE  $CC!$4$455  $CC!$4$455 37ss9a7H7H2I2I)))r0   r7   r   c                n    d| j         i}| j        r
| j        |d<   | j        | j        k    r
| j        |d<   |S )r   r   r   r   )r   r   r   r   )r-   r   s     r/   r   zDimensionLine.dxfattribs]  sE    #*DJ"7= 	0"&-GJ?d555$(OGL!r0   Nr   r7   r   r   rC   r0   r/   r   r   @  sW         #66666J J J J4     r0   r   c                  6    e Zd ZddZedd
            ZddZdS )Arrowsra   r   r   rJ   r   r$   c                8   |j         } |d|          | _         |dd          |z  | _        d| _        d| _         |dd          |z  | _        d| _        d| _        | j        dk    r| j        dz  | _        d S |                                \  | _        | _        d S )	Nr   dimtszr!   rn   dimaszg      ?Fr*   )	rp   r   	tick_sizearrow1_namearrow2_name
arrow_sizer   r   get_arrow_names)r-   ra   r   r   rp   s        r/   r,   zArrows.__init__h  s    m#i//
 #Hc 2 2U : " "!$Xt!4!4u!<>C #ns2DOOO ))++    r0   r7   rQ   c                    | j         dk    S Nr!   )r   r   s    r/   	has_tickszArrows.has_ticks~  s    ~##r0   r   c                    d| j         iS Nr   )r   r   s    r/   r   zArrows.dxfattribs  s    $$r0   Nra   r   r   rJ   r   r$   r   r   )r1   r2   r3   r,   r   r   r   rC   r0   r/   r   r   g  s\        , , , ,, $ $ $ X$% % % % % %r0   r   c                      e Zd Zd!dZed             Zed	             Zd"dZed#d            Zd#dZ	d$dZ
d%dZd&d'dZd(dZej        d)d            Zej        d*d            Zd S )+Measurementra   r   r   rJ   r   r$   c                   d| _         d| _        d| _        |j        }|j        }|
J d            t          |                    dd                     | _        |                    dd          | _        |                    dd          | _	        |                    dd          | _
        |j        }d	| _        |                    d
d           | _         |dd          | _         |dt           j                  }||j        j        vrd}|| _        t+          ||          }t-          ||          |z  | _        |                    dd          | _        |j        j        | _         |dd          |z  | _        |                    dd           | _        | j        | _         |d|          | _         |dd           | _         |dd          | _          |dd          | _!         |dd          | _"         |dd          | _#        |$                                | _%         |dd          | _&         |dd          | _'         |dd          | _(        d | _)         |d!d          | _*         |d"d          | _+         |d#d          | _,         |d$d          | _-        | j        d uo
| j-        dk    | _.         |d%d          | _/         |d&d          | _0        tc           |d'd                    | _2         |d(d          | _3         |d)d          | _4         |d*d          | _5         |d+d          | _6        d| _7         |d,d          dk    rd-| _7        d| _8        ts          dd          | _:        d| _;        d| _<        d S ).Nr!   rn   valid DXF document requireduser_locationrelative_user_locationFtext_shift_htext_shift_v   horizontal_directiondimlfacr`   dimtxstyStandardr#   dimgapg      ?text_rotationdimclrtrG   rI   rE   dimadecrK   rN   dimazinrX   dimtfillr   dimtfillclrr[   g?dimjustdimtaddimtvpdimtmovedimtihdimtohdimtixdimatfitdimlunitdimfracdimaunit	dimarcsymT)=	raw_valuer=   rT   	dimensiondocr<   popr   r   r   r   rp   text_attachment_pointget_dxf_attribr   measurement_factorr   default_dimension_text_styletablesstylestext_style_nameget_text_styleget_char_heightr{   ro   dxfstored_dim_texttext_gapuser_text_rotationr   
text_color
text_roundry   angular_decimal_placesr   angular_suppress_zerosrt   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_horizontalrQ   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-   ra   r   r   r  r  rp   
style_name
text_styles	            r/   r,   zMeasurement.__init__  s    !$
	'	m = .:MM/400.
 .

 -6MM$e-
 -
# $-==#E#E#,==#E#E m +," 6?5M5M"D6
 6
!
 *-Y)<)< #j'*NOO
SZ...#J$.#C44
"1)Z"H"H5"P(2(A(A'3(O(O$-M$6  #s8U33e; *3)A)A/SW)X)X$($;"s9e44+.3x+>+>#&3x#3#3+.3y!+<+<# $'3x#3#3 ,/3y!+<+<# '0&E&E&G&G-0SB-?-?%
 "c*a00$'Cq$9$9*-  !$Iq 1 1 !$Ha 0 0 .1S3-?-?# (+s:q'9'9 d*Kt/F!/K 	 -0C!,<,<# .1S1-=-=$ (,CC!,<,<'='= '*c*a&8&8 !$J 2 2 %(C	1$5$5 !$J 2 2+0"3{A!##)-D& &+ $(1:: #( 16'''r0   c                    | j          S r:   )r9  r   s    r/   text_is_insidezMeasurement.text_is_insideR  s    '''r0   c                8    t          | j        p| j                  S r:   )rQ   r   r   r   s    r/   has_relative_text_movementz&Measurement.has_relative_text_movementV  s    D%:):;;;r0   locationr
   r   r7   c                l    t          | j        | j        f          }||                    |          z  }|S )a5  Add `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-   rC  r   	shift_vecs       r/   apply_text_shiftzMeasurement.apply_text_shiftZ  s9     $+T->?@@	I((777r0   c                :    | j         dk    rdS | j         dk    rdS dS )z|Returns vertical placement of dimension text as 1 for above, 0 for
        center and -1 for below dimension line.

        r   rO   r   r[   )r-  r   s    r/   vertical_placementzMeasurement.vertical_placementj  s/     q  1""21r0   c                j    | j         dk    r| j        | j        z  S | j        dz  | j        z   | j        z  S )zReturns the vertical distance for dimension line to text midpoint.
        Positive values are above the line, negative values are below the line.

        r   r*   )r-  r{   r.  r!  rI  r   s    r/   text_vertical_distancez"Measurement.text_vertical_distancew  s@    
 q  #d&AAA$s*T]:d>UUUr0   rT   r>   c                D    | j         | j        z  }t          |          |z  S )z;
        Return width of `text` in drawing units.

        )r{   ro   r   )r-   rT   
char_widths      r/   r|   zMeasurement.text_width  s%     %(>>
4yy:%%r0   r   c                    | j         }|dk    rdS |                     |          }|r|                    d|d          S |S )zrCreate dimension text for `measurement` in drawing units and applies
        text overriding properties.

        rB   rn   rZ   r[   )r   rW   rR   )r-   r   rT   formatted_measurements       r/   text_overridezMeasurement.text_override  sT    
 #3;;2 $ 0 0 = = 	@<<&;Q???$$r0   Fr   r   c                `    t          |          | _        |rdnd| _        || _        d| _        dS )R  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.

        r[   rE   TN)r
   r   r/  r   r9  r-   rC  leaderrelatives       r/   location_overridezMeasurement.location_override  s9     "(^^'-"4!!1&.##r0   r   c                    d| j         iS r   )r#  r   s    r/   r   zMeasurement.dxfattribs  s    ))r0   raw_measurement_valuec                    dS )z\Update raw measurement value, scaled measurement value and
        dimension text.

        NrC   r-   rX  s     r/   updatezMeasurement.update        r0   r=   c                    dS )kRounding and text formatting of `value`, removes leading and
        trailing zeros if necessary.

        NrC   r   s     r/   rW   zMeasurement.format_text  r\  r0   Nr   )rC  r
   r   r$   r7   r
   r7   r$   )rT   r>   r7   r$   )r   r$   r7   r>   FFrC  r   r7   r   r   rX  r$   r7   r   r   )r1   r2   r3   r,   r   r@  rB  rG  rI  rK  r|   rP  rV  r   abcabstractmethodr[  rW   rC   r0   r/   r   r     sL       I6 I6 I6 I6V ( ( X( < < X<     
 
 
 X
V V V V& & & &% % % %$ $ $ $ $ * * * * 	    	     r0   r   c                      e Zd Zd
dZddZd	S )LengthMeasurementrX  r$   r7   r   c                p    || _         || j        z  | _        |                     | j                  | _        dS )z[Update raw measurement value, scaled measurement value and
        dimension text.
        N)r  r  r=   rP  rT   rZ  s     r/   r[  zLengthMeasurement.update  s5     /*T-DD
&&tz22			r0   r=   r>   c                    t          || j        | j        | j        | j                  }| j        rt          || j                  }|S )r^  )rW   r$  ry   r   r'  r(  r]   )r-   r=   rT   s      r/   rW   zLengthMeasurement.format_text  sR    
 O"
 
 ( 	F t'DEEDr0   Nrb  r   )r1   r2   r3   r[  rW   rC   r0   r/   rf  rf    s<        3 3 3 3     r0   rf  c                      e Zd ZdZd-dZed.d            Zd/dZd0dZd1dZ	d2dZ
d3dZd4dZd4dZd5d"Z	 d6d7d&Z	 	 d8d9d,Zd'S ):Geometryz
    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).

    r  r   ucsr   layout'GenericLayoutType'c                T   |j         
J d            || _        |j         | _         | j         j        | _        | j        dk    | _        | j        dk    | _        || _        |j        | _        | j                            t                     | _
        || _        t                      | _        d S )Nr   AC1015AC1021)r  r  
dxfversionsupports_dxf_r2000supports_dxf_r2007rk  uz	extrusioniscloser   requires_extrusionrl  r    	_text_box)r-   r  rk  rl  s       r/   r,   zGeometry.__init__  s     }((*G((($-%M#x2(,8(C(,8(C"v,0N,B,B6,J,J(J)/")))r0   r7   rQ   c                B    | j         j        dk    o| j         j        dk    S r   )rx  r#   r%   r   s    r/   has_text_boxzGeometry.has_text_box  s!    ~#c)Idn.Cc.IIr0   r   r   c                    || _         d S r:   )rl  )r-   rl  s     r/   
set_layoutzGeometry.set_layout  s    r0   text_boxr    c                    || _         d S r:   )rx  )r-   r}  s     r/   set_text_boxzGeometry.set_text_box  s    !r0   namer>   c                    || j         j        v S r:   )r  blocksr-   r  s     r/   	has_blockzGeometry.has_block  s    tx&&r0   insertr
   sizer$   rotationc                    | j                             t          |                    j        }| j                             |          }| j                            |||||           d S r:   )rk  to_ocsr	   vec2to_ocs_angle_degrl  add_arrow_blockref)r-   r  r  r  r  r   s         r/   r  zGeometry.add_arrow_blockref  sY     f..38,,X66&&tVT8ZPPPPPr0   c                    | j                             t          |                    j        }| j                             |          |d<   | j                            |||           d S )Nr  )rk  r  r	   r  r  rl  add_blockref)r-   r  r  r  r   s        r/   r  zGeometry.add_blockref  sZ     f..3!%!:!:8!D!D
:  vz:::::r0   rT   posc                   | j                             |          |d<   | j                            ||          }|                    | j                             t          |                    j        t          j	                   d S )Nr  r   )r   )
rk  r  rl  add_textset_placementr  r	   r  r   MIDDLE_CENTER)r-   rT   r  r  r   entitys         r/   r  zGeometry.add_text  s    !%!:!:8!D!D
:%%dz%BB
 	HOODII&&+%3 	 	
 	
 	
 	
 	
r0   c                    | j                             |          |d<   | j                             t          |                    j        |d<   | j                            ||           d S )Nr  r  )rk  r  r  r	   r  rl  	add_mtext)r-   rT   r  r  r   s        r/   r  zGeometry.add_mtext&  s]    
 "&!:!:8!D!D
:#xtCyy99>
8dJ/////r0   pointsIterable[Vec2]c                    ddi}|D ]Y}| j                             t          |                                        d          }| j                            ||           Zd S )Nlayer	Defpointsr!   )zr  )rk  r  r	   rR   rl  	add_point)r-   r  r   pointrC  s        r/   add_defpointszGeometry.add_defpoints/  sw    [
  	@ 	@E xtE{{33;;c;BBHK!!(w!????	@ 	@r0   Fstartendc                     fd}dfd} j         j        |r, j        r$ j        }t	          |                                        }t	          |                    |                    }	||	z   }
|
dk    rd	S |
d
k    r[|                    t          |                    }t          |          d
k    r	|d         }n || \  }}|	rn|} |||           d	S |                    t          |                    }t          |          dk    r5 ||d         |d
                   \  }} ||            |||           d	S  ||           d	S )a  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                    j                              t          |                     j         t          |                    j                   d S )Nr  )rl  add_liner	   r  )r  r  r   r-   r  s     r/   add_line_to_blockz,Geometry.add_line.<locals>.add_line_to_blockM  s[    K  tE{{##(tCyy!!&% !     r0   ar
   br7   tuple[Vec2, Vec2]c                @    | z
  j         |z
  j         k     r| |fS || fS r:   	magnitude)r  r  r  s     r/   orderz Geometry.add_line.<locals>.orderU  s.    	$	'<<<!t!tr0   rE   Nr[   r   )r  r
   r  r
   r7   r  )	rk  r  rz  rx  rJ   	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  zGeometry.add_line:  s   &	 	 	 	 	 	 		 	 	 	 	 	  	4#4 	~Hx11%8899LX//4455J!J.F{{1&.&8&89I%QT9U9U&V&V#*++q00,Q/BB "E#67EB(1UUc!!"b)))&.&8&89I%QT9U9U&V&V#*++q00"U#6q#9;Nq;QRRFB%%eR000%%b#...F%%%%%%r0   Nr"   radiusstart_angle	end_anglec                   
 d
 fd} j                             t          |                    j         j         j        
|r3 j        r,t          ||| j                  D ]\  }}	 |||	           dS  |||           dS )	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``

        sr$   er7   r   c           
         j                             t          j         |                     t          j         |                               dS )z!Add ARC entity to geometry block.)r"   r  r  r  r   N)rl  add_arcmathdegrees)r  r  r   	ocs_angle
ocs_centerr  r-   s     r/   r  z!Geometry.add_arc.<locals>.add_arc  s_    K! L166,yy||44%       r0   N)r  r$   r  r$   r7   r   )rk  r  r	   r  to_ocs_angle_radrz  visible_arcsrx  )r-   r"   r  r  r  r   r  r  r  r  r  r  s   ` `  `    @@r/   r  zGeometry.add_arcz  s    .	 	 	 	 	 	 	 	 	 	 X__T&\\227
H-	 
	,4#4 
	,*  $ $
s s####$ $ GK+++++r0   )r  r   rk  r   rl  rm  r   )rl  r   r7   r   )r}  r    r7   r   )r  r>   r7   rQ   )
r  r>   r  r
   r  r$   r  r$   r7   r   )r  r>   r  r
   r  r$   r7   r   rT   r>   r  r
   r  r$   r7   r   )r  r  r7   r   Fr  r
   r  r
   r7   r   r   
r"   r
   r  r$   r  r$   r  r$   r7   r   )r1   r2   r3   r4   r,   r   rz  r|  r  r  r  r  r  r  r  r  r  rC   r0   r/   rj  rj    s>        , , , ,$ J J J XJ   " " " "' ' ' 'Q Q Q Q ; ; ; ;

 

 

 

0 0 0 0	@ 	@ 	@ 	@  ">& >& >& >& >&L !1, 1, 1, 1, 1, 1, 1,r0   rj  c                      e Zd ZdZ	 	 d@dAd	ZdBdCd
ZdDdZdEdZdFdZdGdZ	dHdZ
dIdZdJd ZdKd#ZdLd$ZdMd&ZdNdOd+Z	 dPdQd.Z	 	 dRdSd3ZdTd6ZdUd9ZdVd=ZdWd>ZdWd?ZdS )XBaseDimensionRendererz,Base rendering class for DIMENSION entities.Nr  r   rk  Optional[UCS]overrideOptional[DimStyleOverride]c                   || _         |                     ||          | _        |  |r|| _        nt	          |          | _        | j         j        j        | _        | j         j        j        | _	        | j        j
        } |dd          | _        t          | j                  dk     rd| _         |dd          | _        |                     | j        | j                  | _        |                     | j        | j                  | _        |                     | j        | j                  | _        | j                            dd          | j        _        | j                            dd          | j        _        |                     | j        | j                  | _        |                     | j        | j                  | _        t7          | j        j        | j        j                  | j        _        d S )	Ndimscaler`   g&.>dimcenr   suppress_arrow1Fsuppress_arrow2)r  init_geometrygeometryra   r   r  r   r   r  default_layerrp   rd   r   dim_center_marksinit_measurementr   init_dimension_linedimension_lineinit_arrowsarrowsr  r   r   init_extension_linesextension_linesr   r   r   r{   )r-   r  rk  r  rp   s        r/   r,   zBaseDimensionRenderer.__init__  s    %.**9c:: 	( 	9%DNN-i88DN
 #'."4":"&."4":n  #J 4 4t~%% DN &)S1%5%5001CT^TT-1-E-E.
 .
 #..t/A4>RR !% 2 23De L L $ 2 23De L L/3/H/H0
 0
 #11$.$BRSS (+($(*>(
 (
$$$r0   c                \    ddl m} t          ||pt                       |                      S )Nr   )VirtualLayout)ezdxf.layoutsr  rj  r   )r-   r  rk  r  s       r/   r  z#BaseDimensionRenderer.init_geometry  s5    //////	3#9-//==??KKKr0   r   r$   r   r   r7   r_   c                F    t          | j        |j        |j        |          S )N)rb   rc   rd   )r_   ra   r{   ro   )r-   r   r   s      r/   r   z$BaseDimensionRenderer.init_tolerance  s-    N".$6	
 
 
 	
r0   r   rJ   r   c                .    t          | j        ||          S r:   )r   ra   r-   r   r   s      r/   r  z*BaseDimensionRenderer.init_extension_lines  s    dneU;;;r0   r   c                .    t          | j        ||          S r:   )r   ra   r  s      r/   r  z)BaseDimensionRenderer.init_dimension_line  s    T^UE:::r0   r   c                .    t          | j        ||          S r:   )r   ra   r  s      r/   r  z!BaseDimensionRenderer.init_arrows   s    dneU333r0   c                .    t          | j        ||          S r:   )rf  ra   r  s      r/   r  z&BaseDimensionRenderer.init_measurement  s     >>>r0   r    c           	         | j         }t          |j        |                                 |j        |j        pdd|j        dz            S )Nr!   g      ?)r"   r#   r%   r&   r'   r(   )r   r    r:  total_text_widthr{   r   r!  )r-   r   s     r/   init_text_boxz#BaseDimensionRenderer.init_text_box  sW    &,''))*+2s %,
 
 
 	
r0   r  r>   r
   c                ,    t          | j        |          S r:   )get_required_defpointr  r  s     r/   r  z+BaseDimensionRenderer.get_required_defpoint  s    $T^T:::r0   blockr   c                    | j                             |           | j         j        s| j                                         d S d S r:   )r  r|  rr  r   r   )r-   r  s     r/   renderzBaseDimensionRenderer.render  sM     	  ''' }/ 	H	 	r0   c                    d}| j         j        }|rN| j        j        r| j        j        }n5| j                             |          }| j        j        r|| j        j        z  }|S r   )r   rT   r   rr   r|   rq   )r-   r#   rT   s      r/   r  z&BaseDimensionRenderer.total_text_width"  sj    $ 	1x" 1+(33D998) 1TX00Er0   dict[str, Any]c                     | j         | j        dS )z'Returns default DXF attributes as dict.)r  r   )r  r   r   s    r/   default_attributesz(BaseDimensionRenderer.default_attributes.  s     ''
 
 	
r0   FrC  r   r   c                v    | j                             |||           | j                            |||           dS )rR  N)ra   set_locationr   rV  rS  s       r/   rV  z'BaseDimensionRenderer.location_override5  s?     	##Hfh???**8VXFFFFFr0   r  r  c                    |                                  }|r|                    |           | j                            ||||           dS )a  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  r[  r  r  )r-   r  r  r   r  r   s         r/   r  zBaseDimensionRenderer.add_lineC  sR    & ))++ 	'NN:&&&uc:7JKKKKKr0   r"   r  r  r  c                    |                                  }|r|                    |           | j                            ||||||           dS )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  r[  r  r  )r-   r"   r  r  r  r   r  r   s           r/   r  zBaseDimensionRenderer.add_arc[  sa    , ))++ 	'NN:&&&FKG=P	
 	
 	
 	
 	
r0   r  r  c                f   |                                  }|r|                    |           |t          v r | j                            |||||           dS || j                            |          st          d| d          |dk    r
||d<   ||d<   | j                            ||||           dS )ay  
        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: "r\   r`   xscaleyscale)r  r[  r   r  r  r  r   r  )r-   r  r  r  r   r   r   s          r/   r  z"BaseDimensionRenderer.add_blockrefx  s    & ))++ 	'NN:&&&6>>M,,T65(GTTTTT|4=#:#:4#@#@|,-I$-I-I-IJJJ||$)!$)!M&&tVXwGGGGGr0   rT   r  c                   | j         }| j        }|                                 }|j        |d<   |j        |d<   |j        rs|j        |d<   |j        |d<   |j        r&|j	        |d<   |j
        |d<   |j        dk    rdnd|d	<   |r|                    |           |                    ||||
           dS |j        |d<   |r|                    |           |                    ||||
           dS )aB  
        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_colorr[      bg_fillr  r%   N)r  r   r  r  r#  rr  r{   r  r)  r+  r*  r[  r  r  )r-   rT   r  r  r   r  r   r   s           r/   r  zBaseDimensionRenderer.add_text  s.    =&))++&6&1& 	G%0%<GM"*5*KG&'$ L,7,K()+6+F(*5*?1*D*DQQ!	" +z***tS(wGGGGG + 7GH +z***dCgFFFFFr0   r  r  p3c                ~    d| j         j        i}|                     |||           |                     |||           dS )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  r  r   s        r/   
add_leaderz BaseDimensionRenderer.add_leader  sF     t289
b"j)))b"j)))))r0   c                    dS )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.

        NrC   r   s    r/   transform_ucs_to_wcsz*BaseDimensionRenderer.transform_ucs_to_wcs  s	     	r0   c                    |                                   | j        j        r| j        j        | j        j        _        d S d S r:   )r  r  rw  ru  r  r  r   s    r/   finalizezBaseDimensionRenderer.finalize  sF    !!###=+ 	C+/=+BDN(((	C 	Cr0   )NN)r  r   rk  r  r  r  r:   )r  r   rk  r  )r   r$   r   r   r7   r_   )r   rJ   r   r$   r7   r   )r   rJ   r   r$   r7   r   )r   rJ   r   r$   r7   r   )r   rJ   r   r$   r7   r   )r7   r    )r  r>   r7   r
   )r  r   r_  )r7   r  r`  ra  r  r  r   r  )
r  r>   r  r
   r  r$   r   r$   r7   r   r  )r  r
   r  r
   r  r
   )r7   r   )r1   r2   r3   r4   r,   r  r   r  r  r  r  r  r  r  r  r  rV  r  r  r  r  r  r  r  rC   r0   r/   r  r    s       66
 "/3	:
 :
 :
 :
 :
xL L L L L

 
 
 
< < < <; ; ; ;4 4 4 4? ? ? ?
 
 
 
; ; ; ;   
 
 
 

 
 
 
G G G G G& "L L L L L< !
 
 
 
 
: H  H  H  HD G  G  G  GD* * * *   C C C C C Cr0   r  r  r
   r  r  r  c                >    | |z
  j         | |z
  j         k    r||fS ||fS r:   r  )r  r  r  s      r/   order_leader_pointsr
    s-    
Rb2g0002v2vr0   target_pointr}  
leg_lengthc                   |j         \  }}}}|                    |          }|                    |          }|}	||z
                      |          }
|                     |          |                     |          k    r|}	|
 }
|	|
z   |	fS )zFReturns the leader points of the "leg" for a vertical centered leader.)cornerslerp	normalizedistance)r  r}  r  c0c1c2c3left_centerright_centerconnection_point
leg_vectors              r/   get_center_leader_pointsr    s     %NBB ''"++K772;;L"r'$$Z00J[))L,A,A,,O,OOO' [

 j(*:::r0   dimr   r  c                    | j         }|                    |          r"t          |                    |                    S t	          j        |          r:   )r  hasattrr
   rp   r   DXFMissingDefinitionPoint)r  r  r  s      r/   r  r    sF    
'C
{{4 #CGGDMM"""

)$
/
//r0   r"   r  r  r  boxr   list[tuple[float, float]]c                t   g }t           j        z  |t           j        z  }t          | |t          j                  t          j        |                    }|                                D ]y}|                    |          D ]a}|| z
  j        t           j        z  }	|s|                    |	           1t          j        |d         |	          s|                    |	           bzt          |          dk    r<|k    rfd|D             }|
                                 |d         f|d         |fgS |fgS )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   rE   c                >    g | ]}|k    r|n|t           j        z   S rC   )r  tau).0r  r  s     r/   
<listcomp>z visible_arcs.<locals>.<listcomp>#  s:     # # #>?a;&&AL# # #r0   r   r[   )r  r#  r   r  border_linesintersect_liner&   appendrv  r   sort)
r"   r  r  r  r  intersection_anglesarclineintersection_pointr&   s
     `       r/   r  r    s   & (*48KI
[114<	3J3J C   "" 2 2"%"4"4T":": 	2 	2'&07$(BE& 2#**51111\"5b"95AA 2#**5111	2 1$$""# # # #CV# # # 	  """-a01 #Y/
 	
 i())r0   r  	'Drawing'r   c                    | 
J d            | j         j        j        }	  ||          }n # t          j        $ r  |d          }Y nw xY wt          d|          S )Nr   r   r   )r  r  rp   r   DXFTableEntryErrorr   )r  r  	get_styler  s       r/   r  r  1  st    ??9???
!%I&	$# & & &	*%%&U###s   + AAra   r   r>  c                t    |j                             dd          }|dk    r|                     dd          }|S )z:Unscaled character height defined by text style or DIMTXT.r%   r!   dimtxtr`   )r  rp   )ra   r>  r%   s      r/   r  r  ;  s:    N&&x55F}}x--Mr0   r   r   c                L    | j         }|j        r|                    |          }|S r:   )rT   r   r   )r   r   rT   s      r/   r   r   C  s,    D
{ '  &&Kr0   )r7   r8   r   )NrE   r   rF   )r=   r$   rG   rH   rI   rJ   rK   rJ   rL   r>   r7   r>   )rT   r>   rX   r>   r7   r>   )r  r
   r  r
   r  r
   r7   r  )r  r
   r}  r    r  r$   r7   r  )r  r   r  r>   r7   r
   )r"   r
   r  r$   r  r$   r  r$   r  r   r7   r   )r  r.  r  r>   r7   r   )ra   r   r>  r   r7   r$   )r   r   r   r_   r7   r>   )C
__future__r   typingr   r   r   r   r   r  rc  
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<   rD   rW   r]   r_   r   r   r   r   rf  rj  r  r
  r  r  r  r  r  r   rC   r0   r/   <module>rB     s   # " " " " "               



                : 9 9 9 9 9 9 9 9 9 9 9       + + + + + + " " " " " " C C C C C C C C & & & & & & & & & & & & 6 6 6 6 6 6 6 6 0&&&&&&((((((//////Q Q Q Q Qo Q Q Q 
5 '*4 '*>> 5       #    6D D D DcP cP cP cP cP cP cP cPL* * * * * * * *Z$ $ $ $ $ $ $ $N% % % % % % % %>q q q q q q q qh	       4W, W, W, W, W, W, W, W,tjC jC jC jC jC jC jC jCZ	   ; ; ; ;,0 0 0 0/* /* /* /*d$ $ $ $        r0   