
    'j                       d dl mZ d dlmZmZmZmZmZ d dlm	Z	 d dl
mZmZ d dlZd dlmZ d dlmZ d dlmZmZ d d	lmZmZmZmZmZmZ d d
lmZmZ d dlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(m)Z)m*Z* ddl+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 d dl4Z4er2d dlm5Z5 d dl6m7Z7 d dl8m9Z9m:Z: d dl;m<Z< d dl=m>Z> d dlm?Z? d dl@mAZA d dlBmCZC g dZD e4jE        d          ZF	 dJdKd"ZG ed# e ed$d%&           ed'           ed(dejH        e)           ed*d  ejI        d d+          e)           ed,d&           ed-ejJ        d./           ed0d$&           ed1ejJ        d2/           ed3ejK        e#ejL        e4          d5	                    ZM eeM          ZN G d6 d7          ZOe G d8 d9e.                      ZP ed: ed$d%&           ed*d &           ed+d;&           ed<d=ejQ        e)           ed>d?&           ed@d?&          dA          ZR eeR          ZS edBdC          ZT G dD dE          ZUe G dF dGe,                      ZV G dH dIe1eV                   ZWdS )L    )annotations)TYPE_CHECKINGIterableOptionalSequenceIterator)Self)OrderedDict
namedtupleN)
AuditError)register_entity)const	validator)DXFAttrDXFAttributesDefSubclassXTypeRETURN_DEFAULTgroup_code_mapping)Tags
group_tags)NULLVECX_AXISY_AXISZ_AXISUVecVec3UCSOCS   )
base_classSubclassProcessor)	DXFObject)
DXFGraphicacdb_entity)ObjectCollection)default_copy)Auditor)Drawing)DXFNamespace	DXFEntity)
BaseLayout)AbstractTagWriter)Matrix44)EntityQuery)xref)MLineMLineVertex
MLineStyleMLineStyleCollectionezdxf-q=verticesIterable[Vec3]abs_tolfloatreturnc              #  d   K   d }| D ](}||V  |}|                     ||          s|V  |})d S )Nr9   )isclose)r7   r9   prevvertexs       N/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/entities/mline.pyfilter_close_verticesrB   5   sb       D  <LLLDD>>$>88      	AcDbMline   Standard)defaultiT  (   )rG   r   fixerF      G   H   __len__)xtypegetterI   
   start_location   )rO   rG   r   rI   )	
style_namestyle_handlescale_factorjustificationflagscountstyle_element_countrS   	extrusionc                  h    e Zd ZddZddZeZedd            Zdd
Ze	 	 ddd            Z	ddZ
dS )r2   r;   Nonec                l    t           | _        t          | _        t          | _        g | _        	 g | _        d S N)r   locationr   line_directionr   miter_directionline_paramsfill_paramsselfs    rA   __init__zMLineVertex.__init__   s8    %$*%+2 35	, 35rC   c                    |                                  }| j        |_        | j        |_        | j        |_        t	          | j                  |_        t	          | j                  |_        |S r`   )	__class__ra   rb   rc   listrd   re   )rg   vtxs     rA   __copy__zMLineVertex.__copy__   sY    nn}!0"2t/00t/00
rC   tagsr   c                   t                      }g }d}g }d}|D ]f\  }}|dk    rt          |          |_        !|dk    rt          |          |_        <|dk    rt          |          |_        W|dk    r2|}|dk    r'|j                            t                                 g }|dk    rJ|                    |           |dz  }|dk    r)|j                            t          |                     g }|dk    r4|}|dk    r(|j                            t                                 g }|d	k    rG|                    |           |dz  }|dk    r'|j                            t          |                     h|S )
Nr            J   )   r    K   *   )	r2   r   ra   rb   rc   rd   appendtuplere   )	clsrn   rl   rd   line_params_countre   fill_params_countcodevalues	            rA   loadzMLineVertex.load   s   mm#%#% 	? 	?KD%rzz#E{{%)%[[""&*5kk##$)!$))O**5773333"$KK""5)))!Q&!$))O**5+=+=>>>"$K$)!$))O**5773333"$KK""5)))!Q&!$))O**5+=+=>>>
rC   	tagwriterr-   c                   |                     d| j                   |                     d| j                   |                     d| j                   t	          | j        | j                  D ]\  }}|                    dt          |                     |D ]}|                    d|           |                    dt          |                     |D ]}|                    d|           d S )Nrp   rq   rr   rs   rt   ru   rv   )	write_vertexra   rb   rc   ziprd   re   
write_tag2len)rg   r   rd   re   params        rA   
export_dxfzMLineVertex.export_dxf  s   r4=111r4#6777r4#7888(+D,<d>N(O(O 	0 	0$K  S%5%5666$ 0 0$$R////  S%5%5666$ 0 0$$R////0	0 	0rC   Nstartr   rb   rc   rd   #Optional[Iterable[Sequence[float]]]re   c                n   t                      }t          |          |_        t          |          |_        t          |          |_        t          |pg           |_        t          |pg           |_        t          |j                  t          |j                  k    rt          j
        d          |S )Nz+Count mismatch of line- and fill parameters)r2   r   ra   rb   rc   rk   rd   re   r   r   DXFValueError)ry   r   rb   rc   rd   re   rl   s          rA   newzMLineVertex.new  s     mmE{{!.11"?33{0b11{0b11s3s#7#777%&STTT
rC   mr.   c                    |                     | j                  | _        |                    | j                  | _        |                    | j                  | _        | S )z;Transform MLineVertex by transformation matrix `m` inplace.)	transformra   transform_directionrb   rc   )rg   r   s     rA   r   zMLineVertex.transform.  sN    DM2233D4GHH 44T5IJJrC   r;   r^   )r;   r2   )rn   r   r;   r2   r   r-   )NN)r   r   rb   r   rc   r   rd   r   re   r   r;   r2   )r   r.   r;   r2   )__name__
__module____qualname__rh   rm   copyclassmethodr~   r   r   r    rC   rA   r2   r2      s        35 35 35 35j    D$ $ $ [$L
0 
0 
0 
0  <@;?    [$     rC   r2   c                  L    e Zd ZdZ eeee          Ze	j
        Ze	j        Ze	j        Ze	j        Ze	j        Ze	j        Ze	j        Ze	j        ZdM fdZd ZefdNdZ	 dOdP fdZdQdZdRdZ dS fdZ!dSdZ"dT fdZ#dU fdZ$e%dVd            Z&dWdXd!Z'e%dVd"            Z(e(j)        dYd$            Z(e%dVd%            Z*e*j)        dYd&            Z*dZd(Z+d[d*Z,e%d\d,            Z-d]d/Z.d^d1Z/d_d3Z0d`d6Z1dMd7Z2dad8Z3d9 Z4dMd:Z5dOdb fd=Z6dcd@Z7dddBZ8dddCZ9dOdedGZ:df fdJZ;dgdLZ< xZ=S )hr1   MLINEr;   r^   c                V    t                                                       g | _        d S r`   )superrh   r7   rg   rj   s    rA   rh   zMLine.__init__C  s&    
 ,.rC   c                *    t          | j                  S )zCount of MLINE vertices.r   r7   rf   s    rA   rN   zMLine.__len__K  s    4=!!!rC   entityr	   c                `    t          |t                    sJ d | j        D             |_        d S )Nc                6    g | ]}|                                 S r   )r   .0vs     rA   
<listcomp>z#MLine.copy_data.<locals>.<listcomp>Q  s     ;;;16688;;;rC   )
isinstancer1   r7   rg   r   copy_strategys      rA   	copy_datazMLine.copy_dataO  s3    &%(((((;;T];;;rC   N	processorOptional[SubclassProcessor]r*   c                    t                                          |          }|r3|                    |t          dd          }|                     |           |S )NrE   F)log)r   load_dxf_attribsfast_load_dxfattribsacdb_mline_group_codesload_vertices)rg   r   dxfrn   rj   s       rA   r   zMLine.load_dxf_attribsS  sc     gg&&y11 	%11+QE 2  D t$$$
rC   rn   r   c                l    | j                             d t          |d          D                        d S )Nc              3  J   K   | ]}t                               |          V  d S r`   )r2   r~   )r   rn   s     rA   	<genexpr>z&MLine.load_vertices.<locals>.<genexpr>_  sA       
 
'+KT""
 
 
 
 
 
rC   rp   )	splitcode)r7   extendr   )rg   rn   s     rA   r   zMLine.load_vertices^  sO     
 
/9$"/M/M/M
 
 
 	
 	
 	
 	
 	
rC   r   r-   boolc                2    t          | j                  dk    S )Nr    r   )rg   r   s     rA   preprocess_exportzMLine.preprocess_exportc  s    4=!!A%%rC   c                l   |                      | j        d           t                                          |           |                    t
          j        t          j                   | j	        
                    |t          j                                                   |                     |           d S )NT)set_flag_stateHAS_VERTICESr   export_entityr   r   SUBCLASS_MARKER
acdb_mlinenamer   export_dxf_attribsattribskeysexport_verticesrg   r   rj   s     rA   r   zMLine.export_entityi  s     	D-t444i(((U2JODDD##Iz/A/F/F/H/HIIIY'''''rC   c                D    | j         D ]}|                    |           d S r`   )r7   r   )rg   r   r@   s      rA   r   zMLine.export_verticesr  s4    m 	) 	)Fi((((	) 	)rC   registryxref.Registryc                    t                                          |           |                    | j        j                   dS z5Register required resources to the resource registry.N)r   register_resources
add_handler   rV   )rg   r   rj   s     rA   r   zMLine.register_resourcesv  s:    ""8,,,DH122222rC   clonemappingxref.ResourceMapperc                   t                                          ||           |                    | j        j                  }t          |t                    s(|j        J |j        j        	                    d          }t          |t                    r.|j        j
        |j        _        |j        j        |j        _        dS d|j        _        d|j        _        dS )3Translate resources from self to the copied entity.NrF   0)r   map_resourcesget_reference_of_copyr   rV   r   r3   docmline_stylesgethandler   rU   )rg   r   r   stylerj   s       rA   r   zMLine.map_resources{  s    eW-----dh.CDD%,, 	;9(((I*..z::EeZ(( 	.%*Y%5EI"#(9>EI   %(EI"#-EI   rC   c                6    |                      | j                  S )zbReturns ``True`` if MLINE is closed.
        Compatibility interface to :class:`Polyline`
        )get_flag_stateCLOSEDrf   s    rA   	is_closedzMLine.is_closed  s    
 ""4;///rC   Tstatec                    t          |          }|| j        k    r1|                     | j        |           |                                  dS dS )z|Get/set closed state of MLINE and update geometry accordingly.
        Compatibility interface to :class:`Polyline`
        N)r   r   r   r   update_geometry)rg   r   s     rA   closezMLine.close  sT     UDN""U333  """"" #"rC   c                8    |                      | j                   S )zeGet/Set start caps state. ``True`` to enable start caps and
        ``False`` tu suppress start caps.)r   SUPPRESS_START_CAPSrf   s    rA   
start_capszMLine.start_caps  s     &&t'?@@@@rC   r}   c                X    |                      | j        t          |                      dS zSet start caps state.N)r   r   r   rg   r}   s     rA   r   zMLine.start_caps  s+     	D4$u++oFFFFFrC   c                8    |                      | j                   S )zaGet/Set end caps state. ``True`` to enable end caps and
        ``False`` tu suppress start caps.)r   SUPPRESS_END_CAPSrf   s    rA   end_capszMLine.end_caps  s     &&t'=>>>>rC   c                X    |                      | j        t          |                      dS r   )r   r   r   r   s     rA   r   zMLine.end_caps  s+     	D2UODDDDDrC   r:   c                    t          |          }t          j        | j        j        |          s"|| j        _        |                                  dS dS )z5Set the scale factor and update geometry accordingly.N)r:   mathr>   r   rW   r   r   s     rA   set_scale_factorzMLine.set_scale_factor  sR    e|DH1599 	#$)DH!  """""	# 	#rC   intc                    t          |          }| j        j        |k    r"|| j        _        |                                  dS dS )z{Set MLINE justification and update geometry accordingly.
        See :attr:`dxf.justification` for valid settings.
        N)r   r   rX   r   r   s     rA   set_justificationzMLine.set_justification  sI     E

8!U**%*DH"  """"" +*rC   Optional[MLineStyle]c                    | j         dS | j         j                            | j        j                  }|)| j         j                            | j        j                  }|S )zGet associated MLINESTYLE.N)r   entitydbr   r   rV   r   rU   )rg   _styles     rA   r   zMLine.style  sU     84"&&tx'<==>X*..tx/BCCFrC   r   strc                   | j         t                              d           dS 	 | j         j        |         }n*# t          j        $ r t	          j        d|           w xY wt          |t                    sJ | j	        }t          |j                  }d}|t          |j                  |k    }|| j        _        |j        j        | j        _        || j        _        |r|                                  dS dS )znSet MLINESTYLE by name and update geometry accordingly.
        The MLINESTYLE definition must exist.
        Nz-Can't change style of unbounded MLINE entity.zUndefined MLINE style: F)r   loggerdebugr   r   DXFKeyErrorr   r   r3   r   r   elementsr   rU   r   rV   r[   r   )rg   r   r   	old_stylenew_element_countresets         rA   	set_stylezMLine.set_style  s    8LLHIIIF	HH)$/EE  	H 	H 	H%&F&F&FGGG	H%,,,,, J	// 	*++/@@E" %	 0'8$ 	#  """""	# 	#s	   8 'Ar   c                \    t          | j                  r| j        d         j        S t          S )ztReturns the start location of the reference line. Callback function
        for :attr:`dxf.start_location`.
        r   )r   r7   ra   r   rf   s    rA   rS   zMLine.start_location  s+     t} 	=#,,NrC   
list[Vec3]c                $    d | j         D             S )z+Returns the vertices of the reference line.c                    g | ]	}|j         
S r   )ra   r   s     rA   r   z'MLine.get_locations.<locals>.<listcomp>  s    222q
222rC   )r7   rf   s    rA   get_locationszMLine.get_locations  s    22DM2222rC   r7   Iterable[UVec]c                    t          j        |          }|sdS g }t          |           r'|                    |                                            |                    |           |                     |           dS )zAppend multiple vertices to the reference line.

        It is possible to work with 3D vertices, but all vertices have to be in
        the same plane and the normal vector of this plan is stored as
        extrusion vector in the MLINE entity.

        N)r   rk   r   r   r  generate_geometry)rg   r7   all_verticess      rA   r   zMLine.extend  s     9X&& 	Ft99 	6 2 2 4 4555H%%%|,,,,,rC   c                T    |                      |                                            dS )z8Regenerate the MLINE geometry based on current settings.N)r  r  rf   s    rA   r   zMLine.update_geometry  s(    t113344444rC   c                   t          t          |d                    }t          |          dk    r|                                  dS t          |          dk    r4t                              |d         t          t                    g| _        dS | j	        }|
J d            t          |j
                  dk    r%t          j        dt          |           d          dd}t          j        |d         |d         | j        j                  }d |                    |          D             }|j        j        }|j        j        }d t+          ||dd                   D             }| j        rR|                    |d         |d         z
                                              ||d         |d                   }|g}	n9d}|                    |d                    |d                             |          g}	t+          ||dd                   D ]$\  }
}|	                     ||
|                     %|C|	                                 |	                    |d                             |                     n|	                    |           d t+          |||	          D             | _        |                                  | j        D ]}|                    |j                   dS )z\Regenerate the MLINE geometry for new reference line defined by
        `vertices`.
        ư>r=   r   Nr    valid MLINE style requiredNo line elements defined in .dir1r   dir2c                Z    | |z   dz                                                                   S )N      ?)	normalize
orthogonal)r  r  s     rA   miterz&MLine.generate_geometry.<locals>.miter  s)    D[C'2244??AAArC   )originpointaxisc                :    g | ]}|                     d           S )        )z)replacer   s     rA   r   z+MLine.generate_geometry.<locals>.<listcomp>"  s&    LLLAIII$$LLLrC   c                B    g | ]\  }}||z
                                   S r   )r  )r   v1v2s      rA   r   z+MLine.generate_geometry.<locals>.<listcomp>&  s9     
 
 
&,b"R"W!!
 
 
rC   c                N    g | ]"\  }}}t                               |||          #S r   )r2   r   )r   r   dr   s       rA   r   z+MLine.generate_geometry.<locals>.<listcomp><  s>     
 
 
1a OOAq!$$
 
 
rC   )r  r   r  r   )rk   rB   r   clearr2   r   r   r   r7   r   r   r   DXFStructureErrorr   r   from_z_axis_and_point_in_xzr   r\   points_from_wcsstart_angle	end_angler   r   rw   r  
rotate_degpop_update_parametrizationr   matrix)rg   r7   r   r  ucsr(  r)  line_directionsclosing_mitermiter_directionsd1d2r   s                rA   r  zMLine.generate_geometry  s%    -hEEEFFx==AJJLLLF]]a(__Xa[&&IIJDMF
  ">   u~!##)*VU*V*V*VWWW	B 	B 	B 	B -A;1+#
 
 
 MLc.A.A(.K.KLLLi+I'	
 
03Hhqrrl0K0K
 
 
 > 	L""HQK(2,$>#I#I#K#KLLL!E/!"4ob6IJJM - M""?2#6777 / 2 = =k J JK/?122+>?? 	3 	3FB##EE"bMM2222   """##OB$7$B$B9$M$MNNNN##M222
 
x:JKK
 
 
 	$$&&&  	$ 	$AKK
####	$ 	$rC   c                  	
 | j         j        }| j        }| j         j        }d |j        D             }t          |          }t          |          }d	|| j        k    r| 	n|| j        k    r| 	| j	        D ]{}|j
                            |j                  }	 |t          j        |          z  
n# t          $ r d
Y nw xY w	
fd|j        D             |_        d |j        D             |_        |d S )Nc                    g | ]	}|j         
S r   offsetr   es     rA   r   z1MLine._update_parametrization.<locals>.<listcomp>K  s    44418444rC   r         ?c                .    g | ]}|j         z   z  d fS )r  r6  )r   elementshiftstretchs     rA   r   z1MLine._update_parametrization.<locals>.<listcomp>Z  s7     " " ">E'.5(G3S9" " "rC   c                *    g | ]}t                      S r   )rx   )r   _s     rA   r   z1MLine._update_parametrization.<locals>.<listcomp>]  s    !B!B!Ba%''!B!B!BrC   )r   rW   r   rX   r   minmaxTOPBOTTOMr7   rb   angle_betweenrc   r   sinZeroDivisionErrorrd   re   )rg   scaler   rX   offsets
min_offset
max_offsetr@   angler=  r>  s            @@rA   r,  zMLine._update_parametrizationF  s>   %
.44U^444\\
\\
DH$$KEEdk))KEm 		C 		CF)778NOOE$(5//1$   " " " " "IN" " "F "C!B5>!B!B!BF		C 		Cs   B11C ?C c                8    | j                                          dS )zRemove all MLINE vertices.N)r7   r$  rf   s    rA   r$  zMLine.clear_  s    rC   otherOptional[Drawing]c                   | j         sdS t                                          |           d| j        _        |r>|j                            | j        j                  }|r|j        j        | j        _        dS d| j        _        dS )zORemove all dependencies from current document.

        (internal API)
        Nr   rF   )	is_aliver   remove_dependenciesr   rV   r   r   rU   r   )rg   rN  r   rj   s      rA   rR  zMLine.remove_dependenciesc  s    
 } 	F##E*** # 	&**48+>??E (-	(8%(rC   r   r.   c                   | j         D ]}|                    |           |                    | j        j                  | j        _        | j        j        }|                    t          |||                    }t          j        |j	        |j
        d          r=t          j        |j
        |j        d          rt          |          dz  | j        _        |                                  |                     |           | S )z<Transform MLINE entity by transformation matrix `m` inplace.r  r=   rK   )r7   r   r   r   r\   rW   r   r   r>   xyr  sumr   post_transform)rg   r   r@   rH  	scale_vecs        rA   r   zMLine.transformt  s    m 	  	 FQ22483EFF%))$ueU*C*CDD	<	Y[$??? 	7DLKdE
 E
 E
 	7 %(	NNQ$6DH!ArC   Iterator[DXFGraphic]c              #  d   K   ddl m}  ||           D ]}|                    |            |V  dS )zImplements the SupportsVirtualEntities protocol.

        This protocol is for consistent internal usage and does not replace
        the method :meth:`virtual_entities`!
        r   )virtual_entitiesN)ezdxf.render.mliner[  set_source_of_copy)rg   r[  r9  s      rA   __virtual_entities__zMLine.__virtual_entities__  s]       	877777!!$'' 	 	A  &&&GGGG	 	rC   c                *    |                                  S )a  Yields virtual DXF primitives of the MLINE entity  as LINE, ARC and HATCH
        entities.

        These entities are located at the original positions, but are not stored
        in the entity database, have no handle and are not assigned to any
        layout.

        )r^  rf   s    rA   r[  zMLine.virtual_entities  s     ((***rC   target_layoutOptional[BaseLayout]r/   c                &    ddl m}  || |          S )a  Explode the MLINE entity as LINE, ARC and HATCH entities into target
        layout, if target layout is ``None``, the target layout is the layout
        of the MLINE. This method destroys the source entity.

        Returns an :class:`~ezdxf.query.EntityQuery` container referencing all DXF
        primitives.

        Args:
            target_layout: target layout for DXF primitives, ``None`` for same layout
                as source entity.
        r   )explode_entity)ezdxf.exploderc  )rg   r`  rc  s      rA   explodezMLine.explode  s(     	100000~dM222rC   auditorr(   c                    d	 fd	}t                                                     j        dS j                             j        j                  }t          |t                    s|j	                             j        j
        d          }| |             n`                    t          j        dt                      d            |j        j         j        _        n|j        j         j        _
         j        }|
J d            t%          |j                  }| j        _         j        D ]R}t-          j        |j                  r n8t-          j        |j                  r nt%          |j                  |k    r nSdS                     t          j        dt                      d                                              dS )
zValidity check.rF   c           	                              t          j        d|  dt                     d           | j        _        j                            |           }|j        j        j        _	        d S )NzReset MLINESTYLE to "z" in r  r|   message
dxf_entity)
fixed_errorr   RESET_MLINE_STYLEr   r   rU   r   r   r   rV   )r   r   rf  r   rg   s     rA   reset_mline_stylez&MLine.audit.<locals>.reset_mline_style  s|    1GGG3t99GGG     
 #'DH$((..E$)I$4DH!!!rC   NzFixed invalid style handle in r  ri  r  zExecute geometry update for )rF   )r   auditr   r   r   r   rV   r   r3   r   rU   rl  r   INVALID_MLINESTYLE_HANDLEr   r   r   r   r   r   r[   r7   r   r>   rb   rc   rd   INVALID_MLINE_VERTEXr   )rg   rf  rn  r   element_countr@   r   rj   s   ``    @rA   ro  zMLine.audit  s   	5 	5 	5 	5 	5 	5 	5 	5 	gk;F   !677%,, 	1$(()<dCCE}!!#######=ISYYIII# $   
 ).	(8%%"').DH 
  ">    EN++'4$ m 		 		Fv455 v566 6%&&-77 8 F 	0?3t99??? 	 	
 	
 	

 	rC   r   c                    t                      S r`   )r   rf   s    rA   ocsz	MLine.ocs  s     uurC   r   r   r	   r;   r^   r`   r   r   r;   r*   )rn   r   r;   r^   )r   r-   r;   r   r   r-   r;   r^   r   r   r;   r^   r   r	   r   r   r;   r^   )r;   r   )T)r   r   r;   r^   )r}   r   r;   r^   )r}   r:   r;   r^   )r}   r   r;   r^   )r;   r   )r   r   r;   r^   )r;   r   )r;   r  )r7   r  r;   r^   )r7   r  r;   r^   )rN  rO  r;   r^   )r   r.   r;   r	   )r;   rY  )r`  ra  r;   r/   rf  r(   r;   r^   )r;   r   )>r   r   r   DXFTYPEr   r!   r%   r   
DXFATTRIBSr   DXF2000MIN_DXF_VERSION_FOR_EXPORT	MLINE_TOPrC  
MLINE_ZEROZEROMLINE_BOTTOMrD  MLINE_HAS_VERTICESr   MLINE_CLOSEDr   MLINE_SUPPRESS_START_CAPSr   MLINE_SUPPRESS_END_CAPSr   rh   rN   r'   r   r   r   r   r   r   r   r   propertyr   r   r   setterr   r   r   r   r   rS   r  r   r   r  r,  r$  rR  r   r^  r[  re  ro  rt  __classcell__rj   s   @rA   r1   r1   6  s       Gz;
CCJ!&
/CDF+LF95. . . . . ." " " 5A < < < < <
 8<	 	 	 	 	 	 	
 
 
 

& & & &( ( ( ( ( () ) ) )3 3 3 3 3 3
. . . . . . 0 0 0 X0# # # # # A A A XA
 G G G G ? ? ? X?
 _E E E _E# # # ## # # #    X# # # #8   3 3 3 3- - - -"5 5 5 5=$ =$ =$ =$~C C C2   ) ) ) ) ) ) )"    
 
 
 
	+ 	+ 	+ 	+3 3 3 3 3 < < < < < <|       rC   r1   AcDbMlineStyle >      3   Z   4   )r   rY   description
fill_colorr(  r)  MLineStyleElementzoffset color linetypec                  d    e Zd ZdddZddZd Zd Zd	 ZddZd d!dZ	e
d"d            Zd#dZdS )$MLineStyleElementsNrn   Optional[Tags]c           	        g | _         |r|                     |          D ]k}t          |                    dd          |                    dd          |                    dd                    }| j                             |           jd S d S )Nr7  r:  colorr   linetypeBYLAYER)r   
parse_tagsr  r   rw   )rg   rn   r9  datas       rA   rh   zMLineStyleElements.__init__  s    13 	+__T** + +(EE(C((EE'1%%EE*i00 
 $$T****	+ 	++ +rC   r;   c                T    t                      }t          | j                  |_        |S r`   )r  rk   r   )rg   r   s     rA   r   zMLineStyleElements.copy#  s$    %'' //rC   c                *    t          | j                  S r`   )r   r   rf   s    rA   rN   zMLineStyleElements.__len__)  s    4=!!!rC   c                    | j         |         S r`   )r   )rg   items     rA   __getitem__zMLineStyleElements.__getitem__,  s    }T""rC   c                *    t          | j                  S r`   )iterr   rf   s    rA   __iter__zMLineStyleElements.__iter__/  s    DM"""rC   r   r-   c                    |j         } |dt          | j                             | j        D ]*\  }}} |d|            |d|            |d|           +d S )NrL   1   r     )r   r   r   )rg   r   	write_tagr7  r  r  s         rA   r   zMLineStyleElements.export_dxf2  s    (		"c$-(()))'+} 	# 	##FE8Ib&!!!Ib%   Ia""""	# 	#rC   r   r  r7  r:   r  r   r  r   r^   c           	         | j                             t          t          |          t	          |          t          |                               dS )aF  Append a new line element.

        Args:
            offset: normal offset from the reference line: if justification is
                ``MLINE_ZERO``, positive values are above and negative values
                are below the reference line.
            color: :ref:`ACI` value
            linetype: linetype name

        N)r   rw   r  r:   r   r   )rg   r7  r  r  s       rA   rw   zMLineStyleElements.append:  sI     	eFmmSZZXGG	
 	
 	
 	
 	
rC   r   Iterator[dict]c              #  ~   K   d }| D ]-\  }}|dk    r||V  d|i}|dk    r||d<   "|dk    r||d<   .||V  d S d S )Nr  r7  r  r  r  r  r   )rn   	collectorr|   r}   s       rA   r  zMLineStyleElements.parse_tagsI  s      	 	. 	.KD%rzz(#OOO%u-		%*	'""(-	*% OOOOO ! rC   	list[int]c                \    d | j         D             fdt                    D             S )Nc                    g | ]	}|j         
S r   r6  r8  s     rA   r   z6MLineStyleElements.ordered_indices.<locals>.<listcomp>Y  s    33318333rC   c                :    g | ]}                     |          S r   )index)r   r}   rI  s     rA   r   z6MLineStyleElements.ordered_indices.<locals>.<listcomp>Z  s%    BBBe$$BBBrC   )r   sorted)rg   rI  s    @rA   ordered_indicesz"MLineStyleElements.ordered_indicesX  s8    33T]333BBBB&//BBBBrC   r`   )rn   r  )r;   r  r   )r   r  )r7  r:   r  r   r  r   r;   r^   )rn   r   r;   r  r;   r  )r   r   r   rh   r   rN   r  r  r   rw   staticmethodr  r  r   rC   rA   r  r    s        	+ 	+ 	+ 	+ 	+   " " "# # ## # ## # # #
 
 
 
 
    \C C C C C CrC   r  c                      e Zd ZdZ eee          Zej	        Z
ej        Zej        Zej        Zej        Zej        Zej        Zej        Z fdZefddZ	 dd fdZd  fdZd Zd!dZd" fdZ d# fdZ!d$ fdZ" xZ#S )%r3   
MLINESTYLEc                n    t                                                       t                      | _        d S r`   )r   rh   r  r   r   s    rA   rh   zMLineStyle.__init__j  s*    *,,rC   r   r	   r;   r^   c                p    t          |t                    sJ | j                                        |_        d S r`   )r   r3   r   r   r   s      rA   r   zMLineStyle.copy_datan  s1    &*------,,..rC   Nr   r   r*   c                   t                                          |          }|r|                    d          }|t          j        d|j         d          	 |                    d          }t          ||dz   d                    | _        ||d = n# t          j	        $ r Y nw xY w|
                    |t          |           |S )Nr    z'missing 'AcDbMLine' subclass in MLINE(#)rL   )r   r   subclass_by_indexr   r%  r   	tag_indexr  r   r   r   acdb_mline_style_group_codes)rg   r   r   rn   index71rj   s        rA   r   zMLineStyle.load_dxf_attribsr  s     gg&&y11 	T..q11D|-KcjKKK  	#..,,
 !34!3F G GNN &    **30LdSSS
s   B B&%B&r   r-   c                @   t                                          |           |                    t          j        t
          j                   | j                            |t
          j	        
                                           | j                            |           d S r`   )r   r   r   r   r   acdb_mline_styler   r   r   r   r   r   r   r   s     rA   r   zMLineStyle.export_entity  s|    i(((U24D4IJJJ##I/?/G/L/L/N/NOOO  +++++rC   c                    | j         r]| j        j        }d | j         j                                        D             }|D ](}|j        j        |k    r|                                 'dS dS )zUpdate all MLINE entities using this MLINESTYLE.

        The update is required if elements were added or removed or the offset
        of any element was changed.

        c              3  J   K   | ]}|                                 d k    |V  dS )r   N)dxftyper8  s     rA   r   z(MLineStyle.update_all.<locals>.<genexpr>  s4      VVAqyy{{g?U?Ua?U?U?U?UVVrC   N)r   r   r   r   valuesrV   r   )rg   r   mlinesmlines       rA   
update_allzMLineStyle.update_all  s     8 	,X_FVV!2!9!9!;!;VVVF , ,9)V33))+++	, 	,, ,rC   r  c                4    | j                                         S r`   )r   r  rf   s    rA   r  zMLineStyle.ordered_indices  s    },,...rC   rf  r(   c                    t                                          |           t          | j                  dk    r5|                    t
          j        dt          |            d|            d S d S )Nr   r  r  ri  )r   ro  r   r   	add_errorr    INVALID_MLINESTYLE_ELEMENT_COUNTr   )rg   rf  rj   s     rA   ro  zMLineStyle.audit  sz    gt}""@Cs4yyCCC       #"rC   r   r   c                    t                                          |           | j        D ]}|                    |j                   dS r   )r   r   r   add_linetyper  )rg   r   r<  rj   s      rA   r   zMLineStyle.register_resources  sP    ""8,,,} 	4 	4G!!'"23333	4 	4rC   r   r   r   c                    t          |t                    sJ t                                          |           fd| j        D             | j        _        dS )r   c           	     v    g | ]5}t          |j        |j                            |j                            6S r   )r  r7  r  get_linetyper  )r   r<  r   s     rA   r   z,MLineStyle.map_resources.<locals>.<listcomp>  sS     "
 "
 "
  $$W%566 "
 "
 "
rC   N)r   r3   r   r   r   )rg   r   r   rj   s     `rA   r   zMLineStyle.map_resources  sk    %,,,,,eW---"
 "
 "
 "
  ="
 "
 "
rC   ru  r`   rv  rw  r  rz  rx  ry  )$r   r   r   r{  r   r!   r  r|  r   MLINESTYLE_FILLFILLMLINESTYLE_MITERMITERMLINESTYLE_START_SQUARESTART_SQUAREMLINESTYLE_START_INNER_ARCSTART_INNER_ARCMLINESTYLE_START_ROUNDSTART_ROUNDMLINESTYLE_END_SQUARE
END_SQUAREMLINESTYLE_END_INNER_ARCEND_INNER_ARCMLINESTYLE_END_ROUND	END_ROUNDrh   r'   r   r   r   r  r  ro  r   r   r  r  s   @rA   r3   r3   ]  sq       Gz+;<<J D"E0L6O.K,J2M*I- - - - - 5A / / / / /
 8<      0, , , , , ,, , ,/ / / /     4 4 4 4 4 4
 
 
 
 
 
 
 
 
 
rC   r3   c                  (     e Zd Zd fdZddZ xZS )	r4   r   r)   c                x    t                                          |dd           |                                  d S )NACAD_MLINESTYLEr  )	dict_nameobject_type)r   rh   create_required_entries)rg   r   rj   s     rA   rh   zMLineStyleCollection.__init__  s;    (9|TTT$$&&&&&rC   r;   r^   c                    d| vrM|                      d          }|j                            dd           |j                            dd           d S d S )NrF   r  r  g      )r   r   rw   )rg   r   s     rA   r  z,MLineStyleCollection.create_required_entries  s\    T!!!%*!5!5FO""3,,,O""4----- "!rC   )r   r)   r   )r   r   r   rh   r  r  r  s   @rA   r4   r4     sQ        ' ' ' ' ' '. . . . . . . .rC   r4   )r6   )r7   r8   r9   r:   r;   r8   )X
__future__r   typingr   r   r   r   r   typing_extensionsr	   collectionsr
   r   r   ezdxf.auditr   ezdxf.entities.factoryr   ezdxf.lldxfr   r   ezdxf.lldxf.attributesr   r   r   r   r   r   ezdxf.lldxf.tagsr   r   
ezdxf.mathr   r   r   r   r   r   r   r   	dxfentityr!   r"   dxfobjr#   dxfgfxr$   r%   objectcollectionr&   r   r'   loggingr(   ezdxf.documentr)   ezdxf.entitiesr*   r+   ezdxf.layoutsr,   ezdxf.lldxf.tagwriterr-   r.   ezdxf.queryr/   r5   r0   __all__	getLoggerr   rB   is_not_zerois_in_integer_rangecallbackpoint3dis_not_null_vectorr   r   r2   r1   is_valid_aci_colorr  r  r  r  r3   r4   r   rC   rA   <module>r     s   # " " " " "              $ # # # # # / / / / / / / /  " " " " " " 2 2 2 2 2 2 ( ( ( ( ( ( ( (                . - - - - - - - L L L L L L L L L L L L L L L L L L L L 4 4 4 4 4 4 4 4       + + + + + + + + . . . . . .        ######&&&&&&66666666((((((777777######''''''
H
H
H		7	#	# 05     [K!'!Z888#GCLL#G#/$	   %W7)71==$	   WR+++WRu~iHHH#*72q#9#9#9%g%.1A   !m#6$  E8	
 8	
: := =
| ,+J77 LL L L L L L L L^ u u u u uJ u u up ;:... Q'''wq"---g2 	
 
 
 wr2...WR,,,1   # # H  212BCC J24KLL CC CC CC CC CC CC CC CCL ]
 ]
 ]
 ]
 ]
 ]
 ]
 ]
@	. 	. 	. 	. 	.+J7 	. 	. 	. 	. 	.rC   