Ë
    £èhó�  ã            
      óÚ
  — U d Z 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ZddlZddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& g d¢Z'dZ(dZ)dZ*ejV                  Z+ejX                  dUd„«       Z-e-j]                  ej^                  «      dVd„«       Z0e-j]                  ejb                  «      dWd„«       Z2e-j]                  ejf                  «      dXd„«       Z4e-j]                  ejj                  «      dYd„«       Z6e-j]                  ejn                  «      dZd„«       Z8e-j]                  ejr                  «      d[d„«       Z:e-j]                  ejv                  «      d\d„«       Z<e-j]                  ejz                  «      e-j]                  ej|                  «      d]d„«       «       Z?ejX                  dUd„«       Z@e@j]                  ej‚                  «      d^d„«       ZBe@j]                  ejb                  «      e@j]                  ej^                  «      d_d„«       «       ZCe@j]                  ejf                  «      dXd„«       ZDe@j]                  ejj                  «      dYd„«       ZEe@j]                  ejn                  «      dZd„«       ZFe@j]                  ejr                  «      d[d„«       ZGe@j]                  ejv                  «      d\d „«       ZHe@j]                  ejz                  «      e@j]                  ej|                  «      d]d!„«       «       ZId`d"„ZJd`d#„ZKd`d$„ZLdad%„ZMejX                  e+d&œdbd'„«       ZNeNj]                  ej‚                  «      e+d&œdcd(„«       ZOeNj]                  ej^                  «      e+d&œddd)„«       ZPeNj]                  ejf                  «      e+d&œded*„«       ZQeNj]                  ejj                  «      e+d&œdfd+„«       ZReNj]                  ejn                  «      e+d&œdgd,„«       ZSeNj]                  ejr                  «      e+d&œdhd-„«       ZTe+d&œ	 	 	 did.„ZUe+d&œdjd/„ZVdd0d1œ	 	 	 	 	 	 	 dkd2„ZWdd0d1œ	 	 	 	 	 	 	 dld3„ZXeYeZee[f      Z\d4e]d5<   dmd6„Z^	 	 	 	 	 	 	 	 dnd7„Z_dod8„Z`dod9„Zadpd:„Zbdqd;„Zcdod<„Zddod=„Zedod>„Zfdrd?„Zgdsd@„Zhej^                  e`ejf                  eaejj                  edejn                  eeejr                  efiZidtdA„Zjd0dBdCdDœ	 	 	 	 	 	 	 dudE„Zkd0dCdFœ	 	 	 	 	 	 	 dvdG„Zl	 	 	 	 	 	 	 	 dwdH„Zm	 	 	 	 	 	 	 	 	 	 dxdI„Zn	 	 	 	 	 	 	 	 	 	 dydJ„Zo	 	 	 	 	 	 	 	 dzdK„Zpd{dL„Zq	 	 	 	 	 	 	 	 	 	 d|dM„Zrd}dN„Zs G dO„ dPe«      Ztd~dQ„Zu	 d	 	 	 	 	 	 	 d€dR„Zve+d&œ	 	 	 	 	 d�dS„Zwe+d&œd‚dT„Zxy)ƒzŸ
EdgeSmith
=========

A module for creating entities like polylines and hatch boundary paths from linked edges.

The complementary module to ezdxf.edgeminer.

é    )Úannotations)ÚIteratorÚIterableÚSequenceÚAnyÚ
NamedTuple)Ú	TypeAliasN)Ú
itemgetter)Ú	edgeminer©Úentities)Úpath)Úboundary_paths)Úupright_all)ÚUVecÚVec2ÚVec3Úarc_angle_span_degÚellipse_param_spanÚbulge_from_arc_angleÚZ_AXISÚMatrix44Úintersection_line_line_2dÚis_point_in_polygon_2dÚBoundingBox2dÚarea)Úbounding_box_2dÚchain_verticesÚedge_path_from_chainÚedges_from_entities_2dÚfilter_2d_entitiesÚfilter_edge_entitiesÚfilter_open_edgesÚintersecting_edges_2dÚis_closed_entityÚis_inside_polygon_2dÚis_pure_2d_entityÚ	loop_areaÚlwpolyline_from_chainÚmake_edge_2dÚpath2d_from_chainÚpolyline2d_from_chainÚpolyline_path_from_chaing•Ö&è.>gH¯¼šò×z>c                 ó   — y)aE  Returns ``True`` if the given entity represents a closed loop.

    Tests the following DXF entities:

        - CIRCLE (radius > 0)
        - ARC
        - ELLIPSE
        - SPLINE
        - LWPOLYLINE
        - POLYLINE
        - HATCH
        - SOLID
        - TRACE

    Returns ``False`` for all other DXF entities.
    F© ©Úentitys    ú/lib/python3.12/site-packages/ezdxf/edgesmith.pyr%   r%   E   s   € ð$ ó    c                ó  — t        | j                  j                  «      }| j                  j                  }| j                  j                  }t        ||«      }t        |«      t        kD  xr t        j                  |dt        ¬«      S )Ng     €v@©Úabs_tol)	ÚabsÚdxfÚradiusÚstart_angleÚ	end_angler   ÚLEN_TOLÚmathÚisclose)r1   r9   r:   r;   Ú
angle_spans        r2   Ú_is_closed_arcr@   Z   sa   € ä�—‘×"Ñ"Ó#€FØ—*‘*×(Ñ(€KØ—
‘
×$Ñ$€IÜ# K°Ó;€JÜˆv‹;œÑ ÒU¤T§\¡\°*¸eÌWÔ%UÐUr3   c                óN   — t        | j                  j                  «      t        kD  S ©N)r7   r8   r9   r<   r0   s    r2   Ú_is_closed_circlerC   c   s   € äˆv�z‰z× Ñ Ó!¤GÑ+Ð+r3   c                óÊ   — | j                   j                  }| j                   j                  }t        ||«      }t	        j
                  |t        j                  t        ¬«      syy)Nr5   FT)r8   Ústart_paramÚ	end_paramr   r=   r>   ÚtauÚRAD_TOL)r1   rE   rF   Úspans       r2   Ú_is_closed_ellipserJ   h   sF   € à—*‘*×(Ñ(€KØ—
‘
×$Ñ$€IÜ˜k¨9Ó5€DÜ�<‰<˜œdŸh™h´Õ8ØØr3   c                óº   — 	 | j                  «       }|j                  }t        |«      dk  ry|d   }|d   }|j	                  |t
        ¬«      S # t        $ r Y yw xY w)NFé   r   éÿÿÿÿr5   )Úconstruction_toolÚ
ValueErrorÚcontrol_pointsÚlenr>   r<   )r1   ÚbsplinerP   ÚstartÚends        r2   Ú_is_closed_splinerU   r   sm   € ðØ×*Ñ*Ó,ˆð ×+Ñ+€NÜ
ˆ>Ó˜QÒØØ˜1Ñ€EØ
˜Ñ
€CØ�=‰=˜¤gˆ=Ó.Ð.øô ò Ùðús   ‚A Á	AÁAc                óØ   — t        | «      dk  ry| j                  du ryt        | j                  d   d d «      }t        | j                  d   d d «      }|j	                  |t
        ¬«      S )Né   FTr   é   rM   r5   )rQ   Úclosedr   Úlwpointsr>   r<   )r1   rS   rT   s      r2   Ú_is_closed_lwpolyliner[   €   sf   € ä
ˆ6ƒ{�Q‚ØØ‡}�}˜ÑØÜ�—‘ Ñ# B QÐ'Ó(€EÜ
ˆv�‰˜rÑ" 2 AÐ&Ó
'€CØ�=‰=˜¤gˆ=Ó.Ð.r3   c                ó  — | j                   s| j                  rr| j                  }t        |«      dk  ry| j                  ry|d   j
                  j                  }|d   j
                  j                  }|j                  |t        ¬«      ryy)NrX   FTr   rM   r5   )	Úis_2d_polylineÚis_3d_polylineÚverticesrQ   Ú	is_closedr8   Úlocationr>   r<   )r1   r_   Úp0Úp1s       r2   Ú_is_closed_polyline2drd   ‹   sw   € à×Ò × 5Ò 5ð —?‘?ˆÜˆx‹=˜1ÒØØ×ÒØØ˜A‘;—?‘?×+Ñ+ˆØ˜B‘<×#Ñ#×,Ñ,ˆØ�:‰:�b¤'ˆ:Ô*ØØr3   c                ó>   — t        t        | j                  «      «      S rB   )ÚboolrQ   Úpathsr0   s    r2   Ú_is_closed_hatchrh   œ   s   € ä”�F—L‘LÓ!Ó"Ð"r3   c                 ó   — y)NTr/   r0   s    r2   Ú_is_closed_solidrj   ¡   s   € ð r3   c                 ó   — y)a­  Returns ``True`` if the given entity represents a pure 2D entity in the
    xy-plane of the WCS.

    - All vertices must be in the xy-plane of the WCS.
    - Thickness must be 0.
    - The extrusion vector must be (0, 0, 1).
    - Entities with inverted extrusions vectors (0, 0, -1) are **not** pure 2D entities.
      The ezdxf.upright module can be used to revert inverted extrusion vectors
      back to (0, 0, 1).

    Tests the following DXF entities:

        - LINE
        - CIRCLE
        - ARC
        - ELLIPSE
        - SPLINE
        - LWPOLYLINE
        - POLYLINE
        - HATCH
        - SOLID
        - TRACE

    Returns ``False`` for all other DXF entities.

    Fr/   r0   s    r2   r'   r'   ¨   s   € ð8 r3   c                óŽ  — t        j                  | j                  j                  «      syt	        | j                  j
                  «      t        kD  ryt	        t        | j                  j                  «      j                  «      t        kD  ryt	        t        | j                  j                  «      j                  «      t        kD  ryy©NFT)r   r>   r8   Ú	extrusionr7   Ú	thicknessr<   r   rS   ÚzrT   r0   s    r2   Ú_is_pure_2d_entityrq   Ç   s€   € ä�>‰>˜&Ÿ*™*×.Ñ.Ô/ØÜ
ˆ6�:‰:×ÑÓ ¤7Ò*ØÜ
Œ4�—
‘
× Ñ Ó!×#Ñ#Ó$¤wÒ.ØÜ
Œ4�—
‘
—‘Ó×!Ñ!Ó"¤WÒ,ØØr3   c                óh  — t        j                  | j                  j                  «      syt	        t        | j                  j                  «      j                  «      t        kD  ryt	        | j                  j                  «      t        kD  ryt	        | j                  j                  «      t        kD  ryyrm   )r   r>   r8   rn   r7   r   Úcenterrp   r<   Ú	elevationro   r0   s    r2   Ú_is_pure_2d_arcru   Ô   sy   € ô �>‰>˜&Ÿ*™*×.Ñ.Ô/ØÜ
Œ4�—
‘
×!Ñ!Ó"×$Ñ$Ó%¬Ò/ØÜ
ˆ6�:‰:×ÑÓ ¤7Ò*ØÜ
ˆ6�:‰:×ÑÓ ¤7Ò*ØØr3   c                óÌ   — t        j                  | j                  j                  «      syt	        t        | j                  j                  «      j                  «      t        kD  ryyrm   )	r   r>   r8   rn   r7   r   rs   rp   r<   r0   s    r2   Ú_is_pure_2d_ellipserw   â   sC   € ä�>‰>˜&Ÿ*™*×.Ñ.Ô/ØÜ
Œ4�—
‘
×!Ñ!Ó"×$Ñ$Ó%¬Ò/ØØr3   c                óÒ   — t        j                  | j                  j                  «      sy	 | j	                  «       }t        d„ |j                  D «       «      ryy# t
        $ r Y yw xY w)NFc              3  óT   K  — | ]   }t        |j                  «      t        kD  –— Œ" y ­wrB   ©r7   rp   r<   ©Ú.0Úvs     r2   Ú	<genexpr>z%_is_pure_2d_spline.<locals>.<genexpr>ó   s    è ø€ Ð
9Ñ'8 !Œ3ˆq�s‰s‹8”gÕÑ'8ùó   ‚&(T)r   r>   r8   rn   rN   rO   ÚanyrP   )r1   Úcts     r2   Ú_is_pure_2d_spliner‚   ë   s^   € ä�>‰>˜&Ÿ*™*×.Ñ.Ô/ØðØ×%Ñ%Ó'ˆô Ñ
9 r×'8Ò'8Ó
9Ô9ØØøô	 ò Ùðús   ¬A Á	A&Á%A&c                óô   — t        j                  | j                  j                  «      syt	        | j                  j
                  «      t        kD  ryt	        | j                  j                  «      t        kD  ryyrm   )r   r>   r8   rn   r7   rt   r<   ro   r0   s    r2   Ú_is_pure_2d_lwpolyliner„   ø   sR   € ä�>‰>˜&Ÿ*™*×.Ñ.Ô/ØÜ
ˆ6�:‰:×ÑÓ ¤7Ò*ØÜ
ˆ6�:‰:×ÑÓ ¤7Ò*ØØr3   c                óÆ   — | j                   s| j                  ryt        d„ | j                  «       D «       «      ryt	        | j
                  j                  «      t        kD  ryy)NFc              3  óT   K  — | ]   }t        |j                  «      t        kD  –— Œ" y ­wrB   rz   r{   s     r2   r~   z'_is_pure_2d_polyline.<locals>.<genexpr>  s    è ø€ Ð
>Ñ'= !Œ3ˆq�s‰s‹8”gÕÑ'=ùr   T)Úis_polygon_meshÚis_poly_face_meshr€   Úpoints_in_wcsr7   r8   ro   r<   r0   s    r2   Ú_is_pure_2d_polylinerŠ     sM   € à×Ò ×!9Ò!9ØÜ
Ñ
> v×';Ñ';Ô'=Ó
>Ô>ØÜ
ˆ6�:‰:×ÑÓ ¤7Ò*ØØr3   c                óÌ   — t        j                  | j                  j                  «      syt	        t        | j                  j                  «      j                  «      t        kD  ryyrm   )	r   r>   r8   rn   r7   r   rt   rp   r<   r0   s    r2   Ú_is_pure_2d_hatchrŒ     sC   € ä�>‰>˜&Ÿ*™*×.Ñ.Ô/ØÜ
Œ4�—
‘
×$Ñ$Ó%×'Ñ'Ó(¬7Ò2ØØr3   c                ó6  — t        j                  | j                  j                  «      syt	        | j                  j
                  «      t        kD  ryt	        | j                  j                  «      t        kD  ryt        d„ | j                  «       D «       «      ryy)NFc              3  óT   K  — | ]   }t        |j                  «      t        kD  –— Œ" y ­wrB   rz   r{   s     r2   r~   z$_is_pure_2d_solid.<locals>.<genexpr>   s    è ø€ Ð
=Ñ'< !Œ3ˆq�s‰s‹8”gÕÑ'<ùr   T)
r   r>   r8   rn   r7   rt   r<   ro   r€   Úwcs_verticesr0   s    r2   Ú_is_pure_2d_solidr�     sn   € ô �>‰>˜&Ÿ*™*×.Ñ.Ô/ØÜ
ˆ6�:‰:×ÑÓ ¤7Ò*ØÜ
ˆ6�:‰:×ÑÓ ¤7Ò*ØÜ
Ñ
= v×':Ñ':Ô'<Ó
=Ô=ØØr3   c                ó   — d„ | D «       S )a'  Returns all entities that can be used to build edges in the context of
    :mod:`ezdxf.edgeminer`.

    Returns the following DXF entities:

        - LINE
        - ARC
        - ELLIPSE
        - SPLINE
        - LWPOLYLINE
        - POLYLINE

    .. note::

        - CIRCLE, TRACE and SOLID are closed shapes by definition and cannot be used as
          edge in the context of :mod:`ezdxf.edgeminer` or :mod:`ezdxf.edgesmith`.
        - This filter is not limited to pure 2D entities!
        - Does not test if the entity is a closed loop!

    c           
   3  óì   K  — | ]l  }t        |t        j                  t        j                  t        j                  t        j
                  t        j                  t        j                  f«      r|–— Œn y ­wrB   )Ú
isinstanceÚetÚLineÚArcÚEllipseÚSplineÚ
LWPolylineÚPolyline)r|   r1   s     r2   r~   z'filter_edge_entities.<locals>.<genexpr>:  sR   è ø€ ð áˆFÜØä—‘Ü—‘Ü—
‘
Ü—	‘	Ü—‘Ü—‘ðô

ô 	Ùùs   ‚A2A4r/   r   s    r2   r"   r"   %  s   € ñ*áóð r3   c                ó   — d„ | D «       S )z·Returns all pure 2D entities, ignores all entities placed outside or extending
    beyond the xy-plane of the :ref:`WCS`. See :func:`is_pure_2d_entity` for more
    information.

    c              3  ó8   K  — | ]  }t        |«      rŒ|–— Œ y ­wrB   )r'   ©r|   Úes     r2   r~   z%filter_2d_entities.<locals>.<genexpr>Q  s   è ø€ Ð<‘x�!Ô'8¸Õ';ŒA‘xùó   ‚“r/   r   s    r2   r!   r!   K  s   € ñ =‘xÓ<Ð<r3   c                ó*   — t        | «      }d„ |D «       S )aQ  Returns all open linear entities usable as edges in the context of
    :mod:`ezdxf.edgeminer` or :mod:`ezdxf.edgesmith`.

    Ignores all entities that represent closed loops like circles, closed arcs, closed
    ellipses, closed splines and closed polylines.

    .. note::

        This filter is not limited to pure 2D entities!

    c              3  ó8   K  — | ]  }t        |«      rŒ|–— Œ y ­wrB   )r%   r�   s     r2   r~   z$filter_open_edges.<locals>.<genexpr>a  s   è ø€ Ð8‘u�!Ô$4°QÕ$7ŒA‘uùrŸ   )r"   )r   Úedgess     r2   r#   r#   T  s   € ô ! Ó*€EÙ8‘uÓ8Ð8r3   c                óx   — | j                   j                  | j                  «      |k  ry | j                  |k  ry | S rB   )rS   ÚdistancerT   Úlength)ÚedgeÚgap_tols     r2   Ú_validate_edger¨   d  s4   € Ø‡z�z×Ñ˜4Ÿ8™8Ó$ wÒ.ØØ‡{�{�WÒØØ€Kr3   ©r§   c                ó   — y)aB  Makes an Edge instance from the following DXF entity types:

        - LINE (length accurate)
        - ARC (length accurate)
        - ELLIPSE (length approximated)
        - SPLINE (length approximated as straight lines between control points)
        - LWPOLYLINE (length of bulges as straight line from start- to end point)
        - POLYLINE (length of bulges as straight line from start- to end point)

    The start- and end points of the edge is projected onto the xy-plane. Returns
    ``None`` if the entity has a closed shape or cannot be represented as an edge.
    Nr/   )r1   r§   s     r2   r*   r*   m  s   € ð r3   c               óæ   — t        | j                  j                  «      }t        | j                  j                  «      }|j	                  |«      }t        t        j                  |||| ¬«      |«      S )N©Úpayload)r   r8   rS   rT   r¤   r¨   ÚemÚ	make_edge)r1   r§   rS   rT   r¥   s        r2   Ú_edge_from_liner°   ~  sT   € ô �—‘×!Ñ!Ó"€EÜ
ˆv�z‰z�~‰~Ó
€CØ�^‰^˜CÓ €FÜœ"Ÿ,™, u¨c°6À6ÔJÈGÓTÐTr3   c               óŒ  — t        | j                  j                  «      }|t        k  ry | j                  j                  }| j                  j
                  }t        ||«      }||z  dz  t        j                  z  }| j                  ||f«      \  }}t        t        j                  t        |«      t        |«      || ¬«      |«      S )Ng     €f@r¬   )r7   r8   r9   r<   r:   r;   r   r=   Úpir_   r¨   r®   r¯   r   )	r1   r§   r9   r:   r;   Úspan_degr¥   ÚspÚeps	            r2   Ú_edge_from_arcr¶   ‡  s¤   € ä�—‘×"Ñ"Ó#€FØ”ÒØØ—*‘*×(Ñ(€KØ—
‘
×$Ñ$€IÜ! +¨yÓ9€HØ�hÑ Ñ&¬¯©Ñ0€FØ�_‰_˜k¨9Ð5Ó6�F€BˆÜä
�‰”T˜"“Xœt B›x¨¸Ô@Øóð r3   c          	     ó  — 	 | j                  «       }|j                  j                  t        k  s|j
                  j                  t        k  ry t        |j                  |j                  «      }t        dt        |dz  «      «      }t        j                  |j                  |j                  |«      «      «      }t        d„ t!        ||dd  «      D «       «      }t#        t%        j&                  |d   |d   || ¬«      |«      S # t        $ r Y y w xY w)NrL   g¼t“VÆ?c              3  óD   K  — | ]  \  }}|j                  |«      –— Œ y ­wrB   ©r¤   ©r|   ÚaÚbs      r2   r~   z%_edge_from_ellipse.<locals>.<genexpr>¥  ó   è ø€ ÐCÑ+B¡4 1 a�—‘˜A—Ñ+Bùó   ‚ rW   r   rM   r¬   )rN   rO   Ú
major_axisÚ	magnituder<   Ú
minor_axisr   rE   rF   ÚmaxÚroundr   Úlistr_   ÚparamsÚsumÚzipr¨   r®   r¯   )r1   r§   Úct1rI   ÚnumÚpointsr¥   s          r2   Ú_edge_from_ellipserË   ˜  sá   € ðØ×&Ñ&Ó(ˆð ‡~�~×Ñ¤'Ò)¨S¯^©^×-EÑ-EÌÒ-OØÜ˜cŸo™o¨s¯}©}Ó=€DÜ
ˆa”�t˜f‘}Ó%Ó
&€Cô �Y‰Y�s—|‘| C§J¡J¨s£OÓ4Ó5€FÜÑC¬3¨v°v¸a¸b°zÔ+BÓCÓC€FÜÜ
�‰�V˜A‘Y  r¡
¨F¸FÔCÀWóð øô ò Ùðús   ‚D  Ä 	DÄDc          	     ód  — 	 | j                  «       }t        |j                  d   «      }t        |j                  d   «      }t        j                  |j                  «      }t        d„ t        ||dd  «      D «       «      }t        t        j                  |||| ¬«      |«      S # t        $ r Y y w xY w)Nr   rM   c              3  óD   K  — | ]  \  }}|j                  |«      –— Œ y ­wrB   r¹   rº   s      r2   r~   z$_edge_from_spline.<locals>.<genexpr>¶  r½   r¾   rW   r¬   )
rN   rO   r   rP   rÄ   rÆ   rÇ   r¨   r®   r¯   )r1   r§   Úct2rS   rT   rÊ   r¥   s          r2   Ú_edge_from_splinerÏ   «  s¢   € ðØ×&Ñ&Ó(ˆô �×#Ñ# AÑ&Ó'€EÜ
ˆs×!Ñ! "Ñ%Ó
&€CÜ�Y‰Y�s×)Ñ)Ó*€FäÑC¬3¨v°v¸a¸b°zÔ+BÓCÓC€FÜœ"Ÿ,™, u¨c°6À6ÔJÈGÓTÐTøô ò Ùðús   ‚B# Â#	B/Â.B/c          	     ó  — t        | «      ry t        j                  | j                  «       «      }t	        |«      dk  ry |d   }|d   }t        d„ t        ||dd  «      D «       «      }t        t        j                  |||| ¬«      |«      S )NrX   r   rM   c              3  óD   K  — | ]  \  }}|j                  |«      –— Œ y ­wrB   r¹   rº   s      r2   r~   z(_edge_from_lwpolyline.<locals>.<genexpr>Å  r½   r¾   rW   r¬   )
r[   r   rÄ   Úvertices_in_wcsrQ   rÆ   rÇ   r¨   r®   r¯   ©r1   r§   rÊ   rS   rT   r¥   s         r2   Ú_edge_from_lwpolylinerÔ   º  s}   € ä˜VÔ$Øä�Y‰Y�v×-Ñ-Ó/Ó0€FÜ
ˆ6ƒ{�Q‚ØØ�1‰I€EØ
�‰*€CäÑC¬3¨v°v¸a¸b°zÔ+BÓCÓC€FÜœ"Ÿ,™, u¨c°6À6ÔJÈGÓTÐTr3   c          	     óH  — | j                   s| j                  sy t        | «      ry t        j                  | j                  «       «      }t        |«      dk  ry |d   }|d   }t        d„ t        ||dd  «      D «       «      }t        t        j                  |||| ¬«      |«      S )NrX   r   rM   c              3  óD   K  — | ]  \  }}|j                  |«      –— Œ y ­wrB   r¹   rº   s      r2   r~   z&_edge_from_polyline.<locals>.<genexpr>×  r½   r¾   rW   r¬   )r]   r^   rd   r   rÄ   r‰   rQ   rÆ   rÇ   r¨   r®   r¯   rÓ   s         r2   Ú_edge_from_polyliner×   É  s‘   € à×!Ò! V×%:Ò%:ØÜ˜VÔ$Øä�Y‰Y�v×+Ñ+Ó-Ó.€FÜ
ˆ6ƒ{�Q‚Øà�1‰I€EØ
�‰*€CäÑC¬3¨v°v¸a¸b°zÔ+BÓCÓC€FÜœ"Ÿ,™, u¨c°6À6ÔJÈGÓTÐTr3   c             #  óB   K  — | D ]  }t        ||¬«      }|€Œ|–— Œ y­w)zŸYields all DXF entities as 2D edges in the xy-plane of the :ref:`WCS`.

    Skips all entities that have a closed shape or can not be represented as edge.
    r©   N)r*   )r   r§   r1   r¦   s       r2   r    r    Û  s)   è ø€ ó ˆÜ˜F¨GÔ4ˆØÑØ‹Jñ ùs   ‚˜c               ó  — | s
t        «       S | d   j                  g}| D ]]  }t        j                  |d   |j                  |¬«      s|j	                  |j                  «       |j	                  |j
                  «       Œ_ |S )zŠReturns all vertices from a sequence of connected edges.

    Adds line segments between edges when the gap is bigger than `gap_tol`.
    r   rM   r©   )ÚtuplerS   r®   r>   ÚappendrT   )r¢   r§   r_   r¦   s       r2   r   r   è  sg   € ñ
 Ü‹wˆØ! !™HŸN™NÐ+€HÛˆÜ�z‰z˜( 2™,¨¯
©
¸GÕDØ�O‰O˜DŸJ™JÔ'Ø�‰˜Ÿ™Õ!ð ð €Or3   rM   )Ú
dxfattribsÚmax_sagittac               ó    — t         j                  j                  |¬«      }t        | «      dk(  r|S |j	                  t        | |«      d¬«       |S )a�  Returns a new virtual :class:`~ezdxf.entities.LWPolyline` entity.

    This function assumes the building blocks as simple DXF entities attached as payload
    to the edges. The edges are processed in order of the input sequence and the start-
    and end points of the edges should be connected. The output polyline is projected
    onto the xy-plane of the :ref:`WCS`.

        - :class:`~ezdxf.entities.Line` as line segment
        - :class:`~ezdxf.entities.Arc` as bulge
        - :class:`~ezdxf.entities.Ellipse` as bulge or as flattened line segments
        - :class:`~ezdxf.entities.Spline` as flattened line segments
        - :class:`~ezdxf.entities.LWPolyline` and :class:`~ezdxf.entities.Polyline`
          will be merged
        - Everything else will be added as line segment from :attr:`Edge.start` to
          :attr:`Edge.end`
        - Gaps between edges are connected by line segments.

    ©rÜ   r   Úvb©Úformat)r”   r™   ÚnewrQ   Ú
set_pointsÚ_make_polyline_points©r¢   rÜ   rÝ   Úpolylines       r2   r)   r)   ÷  sK   € ô0 �}‰}× Ñ ¨JÐ Ó7€HÜ
ˆ5ƒz�Q‚ØˆØ×ÑÔ-¨e°[ÓAÈ$ÐÔOØ€Or3   c               ó    — t         j                  j                  |¬«      }t        | «      dk(  r|S |j	                  t        | |«      d¬«       |S )a~  Returns a new virtual :class:`Polyline` entity.

    This function assumes the building blocks as simple DXF entities attached as payload
    to the edges. The edges are processed in order of the input sequence and the start-
    and end points of the edges should be connected. The output polyline is projected
    onto the xy-plane of the :ref:`WCS`.

        - :class:`~ezdxf.entities.Line` as line segment
        - :class:`~ezdxf.entities.Arc` as bulge
        - :class:`~ezdxf.entities.Ellipse` as bulge or as flattened line segments
        - :class:`~ezdxf.entities.Spline` as flattened line segments
        - :class:`~ezdxf.entities.LWPolyline` and :class:`~ezdxf.entities.Polyline`
          will be merged
        - Everything else will be added as line segment from :attr:`Edge.start` to
          :attr:`Edge.end`
        - Gaps between edges are connected by line segments.

    rß   r   rà   rá   )r”   rš   rã   rQ   Úappend_formatted_verticesrå   ræ   s       r2   r,   r,     sN   € ô* �{‰{�‰¨*ˆÓ5€HÜ
ˆ5ƒz�Q‚ØˆØ×&Ñ&Ü˜e [Ó1¸$ð 'ô ð €Or3   r	   ÚBulgePointsc                ó   — | dk  r|dz  } | S ©Nr   g      Y@r/   )rÝ   r¥   s     r2   Ú_adjust_max_sagittarí   7  s   € Ø�Q‚Ø˜u‘nˆØÐr3   c                ó  — g }	 t        j                  | «      }t        ||«      }|t        kD  r:|j                  d„ t        j                  |j                  |«      «      D «       «       |r|j                  «        |S # t        $ r |cY S w xY w)Nc              3  ó$   K  — | ]  }|d f–— Œ
 y­w©ç        Nr/   ©r|   Úps     r2   r~   z%_flatten_3d_entity.<locals>.<genexpr>G  s   è ø€ ÐWÑ(V 1�q˜#”hÑ(Vùs   ‚)
r   Ú	make_pathÚ	TypeErrorrí   r<   Úextendr   rÄ   Ú
flatteningÚreverse)r1   r¥   rÝ   Ú
is_reverserÊ   Úentity_paths         r2   Ú_flatten_3d_entityrû   =  s‚   € ð €FðÜ—n‘n VÓ,ˆô & k°6Ó:€KØ”WÒØ�‰ÑW¬¯	©	°+×2HÑ2HÈÓ2UÔ(VÓWÔWÙð 	�‰ÔØ€Møô ò ØŠðús   „A< Á<B
Â	B
c                óä  — | j                   }t        j                  |j                  j                  «      ršt        |j                  j                  |j                  j                  «      }d}|t        kD  r-t        t        j                  |«      «      }| j                  r| }t        | j                  «      |ft        | j                  «      dfgS t!        || j"                  || j                  «      S )Nrñ   )r­   r   r>   r8   rn   r   r:   r;   ÚDEG_TOLr   r=   Úradiansrù   r   rS   rT   rû   r¥   )r¦   rÝ   ÚarcrI   Úbulges        r2   Ú_arc_to_bulge_pointsr  O  s´   € Ø—,‘,€CÜ‡~�~�c—g‘g×'Ñ'Ô(Ü! #§'¡'×"5Ñ"5°s·w±w×7HÑ7HÓIˆØˆØ”'Š>Ü(¬¯©°dÓ);Ó<ˆEØ�ŠØ˜�ä�$—*‘*Ó˜uÐ%Ü�$—(‘(‹^˜SÐ!ð
ð 	
ô
 ˜c 4§;¡;°¸T¿_¹_ÓMÐMr3   c                ó(  — | j                   }t        |j                  j                  «      }t	        |j                  j
                  |j                  j                  «      }t        j                  |d«      r|t        j                  |j                  j                  «      rSd}|t        kD  rt        |«      }| j                  r| }t        | j                  «      |ft        | j                   «      dfgS t#        || j$                  || j                  «      S )Nç      ð?rñ   )r­   r7   r8   Úratior   rE   rF   r=   r>   r   rn   rH   r   rù   r   rS   rT   rû   r¥   )r¦   rÝ   Úellipser  rI   r   s         r2   Ú_ellipse_to_bulge_pointsr  `  sÌ   € ØŸ,™,€GÜ�—‘×!Ñ!Ó"€EÜ˜gŸk™k×5Ñ5°w·{±{×7LÑ7LÓM€DÜ‡|�|�E˜3Ô¤F§N¡N°7·;±;×3HÑ3HÔ$IØˆØ”'Š>Ü(¨Ó.ˆEØ�ŠØ˜�ä�$—*‘*Ó˜uÐ%Ü�$—(‘(‹^˜SÐ!ð
ð 	
ô
 ˜g t§{¡{°KÀÇÁÓQÐQr3   c           	     ó^   — t        | «      dk  ryt        d„ t        | | dd  «      D «       «      S )NrX   rñ   c              3  óD   K  — | ]  \  }}|j                  |«      –— Œ y ­wrB   r¹   )r|   rb   rc   s      r2   r~   z!_sum_distances.<locals>.<genexpr>u  s   è ø€ ÐIÑ-H¡6 2 rˆr�{‰{˜2�Ñ-Hùr¾   rW   )rQ   rÆ   rÇ   )r_   s    r2   Ú_sum_distancesr	  r  s/   € Ü
ˆ8ƒ}�qÒØÜÑI¬S°¸8ÀAÀB¸<Ô-HÓIÓIÐIr3   c                ó,   — | dkD  r| S t        |«      dz  S rì   )r	  )rÝ   rP   s     r2   Ú_max_sagitta_spliner  x  s   € Ø�Q‚ØÐÜ˜.Ó)¨EÑ1Ð1r3   c                ó*  — | j                   }g }	 |j                  «       }t        ||j                  «      }|t
        kD  r'|j                  d„ |j                  |«      D «       «       | j                  r|j                  «        |S # t        $ r |cY S w xY w)Nc              3  ó6   K  — | ]  }t        |«      d f–— Œ y­wrð   )r   rò   s     r2   r~   z*_spline_to_bulge_points.<locals>.<genexpr>ˆ  s   è ø€ ÐIÑ.H¨”t˜A“w ”nÑ.Hùs   ‚)
r­   rN   rO   r  rP   r<   rö   r÷   rù   rø   )r¦   rÝ   ÚsplinerÊ   r�   s        r2   Ú_spline_to_bulge_pointsr  ~  sˆ   € ØŸ™€FØ€FðØ×%Ñ%Ó'ˆô & k°2×3DÑ3DÓE€KØ”WÒØ�‰ÑI¨b¯m©m¸KÔ.HÓIÔIØ‡‚ð 	�‰ÔØ€Møô ò ØŠðús   �B ÂBÂBc           	     óV  — | j                   }t        j                  |j                  j                  «      rL|j                  d¬«      D ���cg c]  \  }}}t        ||«      |f‘Œ }}}}| j                  rt        |«      S |S t        || j                  || j                  «      S c c}}}w )NÚxybrá   )r­   r   r>   r8   rn   Ú
get_pointsr   rù   Ú_revert_bulge_pointsrû   r¥   )r¦   rÝ   ÚplÚxÚyr¼   rÊ   s          r2   Ú_lwpolyline_to_bulge_pointsr  �  sˆ   € ØŸ™€BÜ‡~�~�b—f‘f×&Ñ&Ô'Ø13·±Àe°Ô1LÕMÑ1L¡g a¨¨A”4˜˜1“:˜q’/Ð1LˆÒMØ�?Š?Ü'¨Ó/Ð/ØˆÜ˜b $§+¡+¨{¸D¿O¹OÓLÐLùô	 Ns   ÁB$c                óœ  — | j                   }|j                  rŽt        j                  |j                  j
                  «      re|j                  D �cg c]7  }t        |j                  j                  «      |j                  j                  f‘Œ9 }}| j                  rt        |«      S |S t        || j                  || j                  «      S c c}w rB   )r­   r]   r   r>   r8   rn   r_   r   ra   r   rù   r  rû   r¥   )r¦   rÝ   r  r}   rÊ   s        r2   Ú_polyline2d_to_bulge_pointsr  š  s‘   € Ø—l‘l€Bà	×ÒœVŸ^™^¨B¯F©F×,<Ñ,<Ô=Ø?A¿{º{ÓK¹{¸!”4˜Ÿ™Ÿ™Ó'¨¯©¯©Ò5¸{ˆÐKØ�?Š?Ü'¨Ó/Ð/ØˆÜ˜b $§+¡+¨{¸D¿O¹OÓLÐLùò	 Ls   Á<C	c                ó  — t        | «      dk  r| S | j                  «        | D �cg c]  }|d   ‘Œ	 }}t        |«      r>|j                  d«      }|j	                  |«       t        t        d„ | D «       |«      «      S | S c c}w )NrX   rW   r   c              3  ó&   K  — | ]	  }|d    –— Œ y­w)r   Nr/   )r|   Úpnts     r2   r~   z'_revert_bulge_points.<locals>.<genexpr>®  s   è ø€ Ð/©3 C˜˜Q�©3ùs   ‚)rQ   rø   r€   ÚpoprÛ   rÄ   rÇ   )Úptsr  ÚbulgesÚfirsts       r2   r  r  ¥  su   € Ü
ˆ3ƒx�!‚|Øˆ
Ø‡K�K„MÙ #Ó$¡˜ˆc�!‹f €FÐ$Ü
ˆ6„{à—
‘
˜1“ˆØ�‰�eÔÜ”CÑ/©3Ó/°Ó8Ó9Ð9Ø€Jùò %s   ¥A>c                óþ   — t        |«      dk  r| S 	 | d   \  }}|d   \  }}|j                  |«      t        k  r| j                  «        | j                  |«       | S # t        $ r | j                  |«       | cY S w xY w)NrX   rM   r   )rQ   Ú
IndexErrorrö   r¤   r<   r  )rÊ   Ú	extensionÚcurrent_endÚ_Úconnection_points        r2   Ú_extend_bulge_pointsr'  ²  s†   € Ü
ˆ9ƒ~˜ÒØˆðØ ™‰ˆ�Qð
 $ A™,ÑÐ�aØ×ÑÐ,Ó-´Ò7Ø�
‰
ŒØ
‡M�M�)ÔØ€Møô ò Ø�‰�iÔ ØŠðús   ’A ÁA<Á;A<c                ó2  — g }g }| D ]�  }|j                  «        t        j                  t        |j                  «      «      }|r	 |||«      }t        |«      dk  r.t        |j                  «      dft        |j                  «      dfg}t        ||«      }Œ� |S )zKReturns the polyline points to create a LWPolyline or a 2D Polyline entity.rX   rñ   )
ÚclearÚPOLYLINE_CONVERTERSÚgetÚtyper­   rQ   r   rS   rT   r'  )r¢   rÝ   rÊ   r#  r¦   Ú	converters         r2   rå   rå   Ë  s‘   € à€FØ€IÛˆØ�‰ÔÜ'×+Ñ+¬D°·±Ó,>Ó?ˆ	ÙÙ! $¨Ó4ˆIÜˆy‹>˜AÒä�d—j‘jÓ! 3Ð'Ü�d—h‘h“ Ð%ðˆIô & f¨iÓ8‰ð ð €Mr3   TrW   )rÝ   r`   Úflagsc          	     ó@  — t        j                  «       }t        |«      |_        |xj                  |z  c_        t        | «      dk(  r|S t        | |«      }|j                  |D ��cg c]  \  }}|j                  |j                  |f‘Œ  c}}«       d|_        |S c c}}w )a÷  Returns a new :class:`~ezdxf.entities.PolylinePath` for :class:`~ezdxf.entities.Hatch`
    entities.

    This function assumes the building blocks as simple DXF entities attached as payload
    to the edges. The edges are processed in order of the input sequence and the start-
    and end points of the edges should be connected. The output path is projected onto
    the xy-plane of the :ref:`WCS`.

        - :class:`~ezdxf.entities.Line` as line segment
        - :class:`~ezdxf.entities.Arc` as bulge
        - :class:`~ezdxf.entities.Ellipse` as bulge or flattened line segments
        - :class:`~ezdxf.entities.Spline` as flattened line segments
        - :class:`~ezdxf.entities.LWPolyline` and :class:`~ezdxf.entities.Polyline` are
          merged
        - Everything else will be added as line segment from :attr:`Edge.start` to
          :attr:`Edge.end`
        - Gaps between edges are connected by line segments.

    Args:
        edges: Sequence of :class:`~ezdxf.edgeminer.Edge` instances with DXF primitives
            attached as payload
        max_sagitta (float): curve flattening parameter
        is_closed (bool): ``True`` if path is implicit closed
        flags (int): default(0), external(1), derived(4), textbox(8) or outermost(16)

    r   T)
ÚbpÚPolylinePathrf   r`   Úpath_type_flagsrQ   rå   Úset_verticesr  r  )r¢   rÝ   r`   r.  Úpolyline_pathÚbulge_pointsró   r¼   s           r2   r-   r-   Ý  s�   € ô: —O‘OÓ%€MÜ" 9›o€MÔØ×!Ò! UÑ*Õ!Ü
ˆ5ƒz�Q‚ØÐÜ(¨°Ó<€LØ×Ñ¹,ÔG¹,±$°!°Q §¡ a§c¡c¨1¢¸,ÒGÔHØ"€MÔØÐùó  Hs   Á&#B
)rÝ   r.  c               óÔ  — t        j                  «       }|xj                  |z  c_        t        | «      dk(  r|S | D �]“  }|j                  }t        ||j                  «      }|j                  }t        |t        j                  «      rt        |||«       ŒZt        |t        j                  «      rt        ||||«       Œƒt        |t        j                  «      rt        ||||«       Œ¬t        |t        j                   «      rt#        |||«       ŒÔt        |t        j$                  «      r?|j&                  s|j(                  r't+        |t-        |j/                  «       «      ||«       �Œ-t        |t        j0                  «      r't+        |t-        |j/                  «       «      ||«       �Œn|j3                  |j4                  |j6                  «       �Œ– |j9                  t:        «       |S )aY  Returns a new :class:`~ezdxf.entities.EdgePath` for :class:`~ezdxf.entities.Hatch`
    entities.

    This function assumes the building blocks as simple DXF entities attached as payload
    to the edges. The edges are processed in order of the input sequence and the start-
    and end points of the edges should be connected. The output path is projected onto
    the xy-plane of the :ref:`WCS`.

        - :class:`~ezdxf.entities.Line` as :class:`~ezdxf.entities.LineEdge`
        - :class:`~ezdxf.entities.Arc` as :class:`~ezdxf.entities.ArcEdge`
        - :class:`~ezdxf.entities.Ellipse` as :class:`~ezdxf.entities.EllipseEdge`
        - :class:`~ezdxf.entities.Spline` as :class:`~ezdxf.entities.SplineEdge`
        - :class:`~ezdxf.entities.LWPolyline` and :class:`~ezdxf.entities.Polyline` will
          be exploded and added as :class:`~ezdxf.entities.LineEdge` and
          :class:`~ezdxf.entities.ArcEdge`
        - Everything else will be added as line segment from :attr:`Edge.start` to
          :attr:`Edge.end`
        - Gaps between edges are connected by line segments.

    Args:
        edges: Sequence of :class:`~ezdxf.edgeminer.Edge` instances with DXF primitives
            attached as payload
        max_sagitta (float): curve flattening parameter
        flags (int): default(0), external(1), derived(4), textbox(8) or outermost(16)

    r   )r0  ÚEdgePathr2  rQ   r­   rí   r¥   rù   r“   r”   r•   Ú_add_line_to_edge_path_2dr–   Ú_add_arc_to_edge_path_2dr—   Ú_add_ellipse_to_edge_path_2dr˜   Ú_add_spline_to_edge_path_2drš   r]   r^   Ú _add_polyline_parts_to_edge_pathrÄ   Úvirtual_entitiesr™   Úadd_linerS   rT   Ú
close_gapsr<   )r¢   rÝ   r.  Ú	edge_pathr¦   r1   r¤   rø   s           r2   r   r     sf  € ô: —‘“€IØ×Ò Ñ&ÕÜ
ˆ5ƒz�Q‚ØÐäˆØ—‘ˆÜ& {°D·K±KÓ@ˆØ—/‘/ˆÜ�fœbŸg™gÔ&Ü% i°¸ÕAÜ˜¤§¡Ô'Ü$ Y°¸ÀÕJÜ˜¤§
¡
Ô+Ü(¨°F¸GÀXÕNÜ˜¤§	¡	Ô*Ü'¨	°6¸7ÕCÜ˜¤§¡Ô,Ø×!Ò! V×%:Ò%:ä,Øœ4 × 7Ñ 7Ó 9Ó:¸GÀ[öô ˜¤§¡Ô.Ü,Øœ4 × 7Ñ 7Ó 9Ó:¸GÀ[öð ×Ñ˜tŸz™z¨4¯8©8Ö4ð/ ð0 ×ÑœÔ!ØÐr3   c                ó°   — t        |j                  j                  «      }t        |j                  j                  «      }|r||}}| j	                  ||«       y rB   )r   r8   rS   rT   r>  )r@  Úlinerø   rS   rT   s        r2   r8  r8  C  sD   € ô �—‘—‘Ó €EÜ
ˆt�x‰x�|‰|Ó
€CÙØ˜%ˆsˆØ×Ñ�u˜cÕ"r3   c                ó¼  — t        j                  |j                  j                  «      rq| j	                  t        |j                  j                  «      |j                  j                  |j                  j                  |j                  j                  | ¬«       y t        j                  |j                  |«      «      }|r|j                  «        t        | |«       y )N)rs   r9   r:   r;   Úccw)r   r>   r8   rn   Úadd_arcr   rs   r9   r:   r;   rÄ   r÷   rø   Ú_add_vertices_to_edge_path_2d)r@  rÿ   rø   rÝ   r_   s        r2   r9  r9  M  s™   € ô ‡~�~�c—g‘g×'Ñ'Ô(Ø×ÑÜ˜Ÿ™Ÿ™Ó'Ø—7‘7—>‘>ØŸ™×+Ñ+Ø—g‘g×'Ñ'Ø�ð 	õ 	
ô —9‘9˜SŸ^™^¨KÓ8Ó9ˆÙØ×ÑÔÜ% i°Õ:r3   c           	     ó   — t        j                  |j                  j                  «      r”	 |j	                  «       }| j                  t        |j                  «      t        |j                  «      |j                  t        j                  |j                  «      t        j                  |j                  «      | ¬«       y t        j                  |j!                  |«      «      }|r|j#                  «        t%        | |«       y # t
        $ r Y y w xY w)N)rs   r¿   r  r:   r;   rD  )r   r>   r8   rn   rN   rO   Úadd_ellipser   rs   r¿   r  r=   ÚdegreesrE   rF   rÄ   r÷   rø   rF  )r@  r  rø   rÝ   r�   r_   s         r2   r:  r:  _  sÍ   € ô ‡~�~�g—k‘k×+Ñ+Ô,ð	Ø×*Ñ*Ó,ˆBð 	×ÑÜ˜Ÿ	™	“?Ü˜BŸM™MÓ*Ø—(‘(ÜŸ™ R§^¡^Ó4Ü—l‘l 2§<¡<Ó0Ø�ð 	õ 	
ô —9‘9˜W×/Ñ/°Ó<Ó=ˆÙØ×ÑÔÜ% i°Õ:øô ò 	Ùð	ús   «D Ä	DÄDc                ó�  — 	 |j                  «       }t        j                  |j                  «      }t        |j                  «       «      }t        |j                  «       «      }|r0|j                  «        |j                  «        |j                  «        | j                  |||r|nd |j                  ¬«       y # t        $ r Y y w xY w)N)rP   Úknot_valuesÚweightsÚdegree)
rN   rO   r   rÄ   rP   ÚknotsrL  rø   Ú
add_splinerM  )r@  r  rø   r�   rP   rN  rL  s          r2   r;  r;  v  s¨   € ðØ×%Ñ%Ó'ˆô —Y‘Y˜r×0Ñ0Ó1€NÜ�—‘“Ó€EÜ�2—:‘:“<Ó €GÙØ×ÑÔ Ø�‰ŒØ�‰Ôà×ÑØ%ØÙ"‘¨Ø�y‰yð	 õ øô ò Ùðús   ‚B9 Â9	CÃCc                óV   — t        ||dd  «      D ]  \  }}| j                  ||«       Œ y )NrW   )rÇ   r>  )r@  r_   rS   rT   s       r2   rF  rF  �  s-   € Ü˜( H¨Q¨R LÖ1‰
ˆˆsØ×Ñ˜5 #Õ&ñ 2r3   c                óÈ  — t        |«       t        t        |«      «      }t        t        j                  |«      «      }|rt        j
                  |«      }|D ]‰  }|j                  }t        |t        j                  «      rt        | ||j                  «       ŒAt        |t        j                  «      sŒ\t        ||j                  «      }t        | ||j                  |«       Œ‹ y rB   )r   rÄ   r    r®   Úfind_sequential_chainÚreverse_chainr­   r“   r”   r•   r8  rù   r–   rí   r¥   r9  )r@  r   rø   rÝ   r¢   r¦   r1   r¤   s           r2   r<  r<  ’  s§   € ô �Ôô Ô'¨Ó1Ó2€EÜ”×)Ñ)¨%Ó0Ó1€EÙÜ× Ñ  Ó'ˆãˆØ—‘ˆÜ�fœbŸg™gÔ&Ü% i°¸¿¹ÕIÜ˜¤§¡Õ'Ü*¨;¸¿¹ÓDˆHÜ$ Y°¸¿¹ÈÕRñ r3   c                óp  — t        j                  «       }t        | «      dk(  r|S t        j                  ddd«      }| D ]`  }	 t        j
                  |j                  «      }|j                  |«      }|j                  r|j                  «       }|j                  |«       Œb |S # t        t        f$ r Y Œvw xY w)u’  Returns a new :class:`ezdxf.path.Path` entity.

    This function assumes the building blocks as simple DXF entities attached as payload
    to the edges. The edges are processed in order of the input sequence and the start-
    and end points of the edges should be connected. The output is a 2D path projected
    onto the xy-plane of the :ref:`WCS`.

        - :class:`~ezdxf.entities.Line` as line segment
        - :class:`~ezdxf.entities.Arc` as cubic BÃ©zier curves
        - :class:`~ezdxf.entities.Ellipse` as cubic BÃ©zier curves
        - :class:`~ezdxf.entities.Spine` cubic BÃ©zier curves
        - :class:`~ezdxf.entities.LWPolyline` and :class:`~ezdxf.entities.Polyline`
          as line segments and cubic BÃ©zier curves
        - Everything else will be added as line segment from :attr:`Edge.start` to
          :attr:`Edge.end`
        - Gaps between edges are connected by line segments.

    r   r  rñ   )r   ÚPathrQ   r   Úscalerô   r­   rO   rõ   Ú	transformrù   ÚreversedÚappend_path)r¢   Ú	main_pathÚmr¦   Úsub_paths        r2   r+   r+   ª  s«   € ô& —	‘	“€IÜ
ˆ5ƒz�Q‚ØÐô 	�‰�s˜C Ó%€AÛˆð	Ü—~‘~ d§l¡lÓ3ˆHð ×%Ñ% aÓ(ˆØ�?Š?Ø×(Ñ(Ó*ˆHØ×Ñ˜hÕ'ð ð Ðøô œIÐ&ò 	Ùð	ús   ÁB#Â#B5Â4B5c                  ó"   — e Zd ZU ded<   ded<   y)ÚIntersectingEdgeúem.Edger¦   Úfloatr¤   N)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r/   r3   r2   r^  r^  Ï  s   … Ø
ƒMØ„Or3   r^  c                óZ   — t        d„ | D «       «      }|j                  d„ | D «       «       |S )zNReturns the :class:`~ezdxf.math.BoundingBox2d` of all start- and end vertices.c              3  ó4   K  — | ]  }|j                   –— Œ y ­wrB   ©rS   r�   s     r2   r~   z"bounding_box_2d.<locals>.<genexpr>Ö  s   è ø€ Ð0©% Q˜Ÿ�©%ùó   ‚c              3  ó4   K  — | ]  }|j                   –— Œ y ­wrB   )rT   r�   s     r2   r~   z"bounding_box_2d.<locals>.<genexpr>×  s   è ø€ Ð%™u˜!�—•™uùrh  )r   rö   )r¢   Úbboxs     r2   r   r   Ô  s)   € äÑ0©%Ó0Ó0€DØ‡K�KÑ%™uÓ%Ô%Ø€Kr3   c           	     óæ  — g }t        | «      dk(  r|S t        |«      }|€9t        | «      }t        |j                  j                  dz   |j
                  «      }nt        |«      }||f}| D ]i  }t        |j                  «      }	t        |j                  «      }
t        ||	|
fd¬«      }|€Œ@|j                  t        ||j                  |«      «      «       Œk |j                  t        d«      ¬«       |S )a�  Returns all edges that intersect a line from point `p1` to point `p2`.

    If `p2` is ``None`` an arbitrary point outside the bounding box of all start- and
    end vertices beyond extmax.x will be chosen.
    The edges are handled as straight lines from start- to end vertex, projected onto
    the xy-plane of the :ref:`WCS`. The result is sorted by the distance from
    intersection point to point `p1`.
    r   r  F)ÚvirtualrW   )Úkey)rQ   r   r   Úextmaxr  r  rS   rT   r   rÛ   r^  r¤   Úsortr
   )r¢   rc   Úp2ÚintersectionsÚinner_pointrj  Úouter_pointÚ	test_liner¦   rS   rT   Úips               r2   r$   r$   Û  sÜ   € ð -/€MÜ
ˆ5ƒz�Q‚ØÐä�r“(€KØ	€zÜ˜uÓ%ˆÜ˜4Ÿ;™;Ÿ=™=¨3Ñ.°·±Ó>‰ä˜2“hˆà˜kÐ*€IÛˆÜ�T—Z‘ZÓ ˆÜ�4—8‘8‹nˆÜ& y°5¸#°,ÈÔNˆØ‰>Ø× Ñ Ô!1°$¸×8LÑ8LÈRÓ8PÓ!QÕRð ð ×Ñœ: a›=ÐÔ)ØÐr3   c               ó®   — t        j                  | |¬«      st        d«      ‚t        j                  d„ | D «       «      }t        t        |«      |«      dk\  S )a   Returns ``True`` when `point` is inside the polygon.

    The edges must be a closed loop. The polygon is build from edges as straight lines
    from start- to end vertex, independently whatever the edges really represent.
    A point at a boundary line is inside the polygon.

    Args:
        edges: sequence of :class:`~ezdxf.edgeminer.Edge` representing a closed loop
        point: point to test
        gap_tol: maximum vertex distance to consider two edges as connected

    Raises:
        ValueError: edges are not a closed loop

    r©   úedges are not a closed loopc              3  ó4   K  — | ]  }|j                   –— Œ y ­wrB   rg  r�   s     r2   r~   z'is_inside_polygon_2d.<locals>.<genexpr>  s   è ø€ Ð/© A˜Ÿ�©ùrh  rñ   )r®   Úis_looprO   r   rÄ   r   )r¢   Úpointr§   Úpolygons       r2   r&   r&   ü  sH   € ô$ �:‰:�e WÕ-ÜÐ6Ó7Ð7Ü�i‰iÑ/©Ó/Ó/€Gä!¤$ u£+¨wÓ7¸3Ñ>Ð>r3   c               ój   — t        j                  | |¬«      st        d«      ‚t        d„ | D «       «      S )zeReturns the area of a closed loop.

    Raises:
        ValueError: edges are not a closed loop

    r©   rw  c              3  ó4   K  — | ]  }|j                   –— Œ y ­wrB   rg  r�   s     r2   r~   zloop_area.<locals>.<genexpr>  s   è ø€ Ð'¡˜A�—•¡ùrh  )r®   ry  rO   r   )r¢   r§   s     r2   r(   r(     s/   € ô �:‰:�e WÕ-ÜÐ6Ó7Ð7ÜÑ'¡Ó'Ó'Ð'r3   )r1   úet.DXFEntityÚreturnrf   )r1   úet.Arcr  rf   )r1   z	et.Circler  rf   )r1   ú
et.Ellipser  rf   )r1   ú	et.Spliner  rf   )r1   úet.LWPolyliner  rf   )r1   úet.Polyliner  rf   )r1   zet.Hatchr  rf   )r1   zet.Solid | et.Tracer  rf   )r1   úet.Liner  rf   )r1   zet.Circle | et.Arcr  rf   )r   úIterable[et.DXFEntity]r  zIterator[et.DXFEntity])r¦   r_  r§   r`  r  úem.Edge | None)r1   r~  r  r‡  )r1   r…  r  r‡  )r1   r€  r  r‡  )r1   r�  r  r‡  )r1   r‚  r  r‡  )r1   rƒ  r  r‡  )r1   r„  r  r‡  )r   r†  r  zIterator[em.Edge])r¢   úSequence[em.Edge]r  úSequence[Vec3])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`  rù   rf   r  rê   )r¦   r_  rÝ   r`  r  rê   )r_   r‰  r  r`  )rÝ   r`  rP   r‰  )r  rê   r  rê   )rÊ   rê   r#  rê   r  rê   )r¢   rˆ  rÝ   r`  r  rê   )r¢   rˆ  rÝ   r`  r.  Úintr  zbp.PolylinePath)r¢   rˆ  rÝ   r`  r.  rŠ  r  úbp.EdgePath)r@  r‹  rB  r…  rø   rf   r  ÚNone)
r@  r‹  rÿ   r€  rø   rf   rÝ   r`  r  rŒ  )
r@  r‹  r  r�  rø   rf   rÝ   r`  r  rŒ  )r@  r‹  r  r‚  rø   rf   r  rŒ  )r@  r‹  r_   z
list[Vec2]r  rŒ  )
r@  r‹  r   zlist[et.DXFGraphic]rø   rf   rÝ   r`  r  rŒ  )r¢   rˆ  r  z	path.Path)r¢   rˆ  r  r   rB   )r¢   rˆ  rc   r   rp  zUVec | Noner  zlist[IntersectingEdge])r¢   rˆ  rz  r   r  rf   )r¢   rˆ  r  r`  )yÚ__doc__Ú
__future__r   Útypingr   r   r   r   r   Útyping_extensionsr	   r=   Ú	functoolsÚoperatorr
   Úezdxfr   r®   r   r”   r   Úezdxf.entitiesr   r0  Úezdxf.uprightr   Ú
ezdxf.mathr   r   r   r   r   r   r   r   r   r   r   r   Ú__all__r<   rý   rH   ÚGAP_TOLÚsingledispatchr%   Úregisterr–   r@   ÚCirclerC   r—   rJ   r˜   rU   r™   r[   rš   rd   ÚHatchrh   ÚTraceÚSolidrj   r'   r•   rq   ru   rw   r‚   r„   rŠ   rŒ   r�   r"   r!   r#   r¨   r*   r°   r¶   rË   rÏ   rÔ   r×   r    r   r)   r,   rÄ   rÚ   r`  rê   rd  rí   rû   r  r  r	  r  r  r  r  r  r'  r*  rå   r-   r   r8  r9  r:  r;  rF  r<  r+   r^  r   r$   r&   r(   r/   r3   r2   Ú<module>rŸ     s  ðòõ #ç @Õ @Ý 'Û Û Ý å !Ý  Ý Ý /Ý %÷÷ ÷ ó ò€ð* €Ø
€Ø
€Ø
�*‰*€ð ×Ñòó ðð( ×Ñ˜2Ÿ6™6Ó"òVó #ðVð ×Ñ˜2Ÿ9™9Ó%ò,ó &ð,ð ×Ñ˜2Ÿ:™:Ó&òó 'ðð ×Ñ˜2Ÿ9™9Ó%ò
/ó &ð
/ð ×Ñ˜2Ÿ=™=Ó)ò/ó *ð/ð ×Ñ˜2Ÿ;™;Ó'òó (ðð  ×Ñ˜2Ÿ8™8Ó$ò#ó %ð#ð ×Ñ˜2Ÿ8™8Ó$Ø×Ñ˜2Ÿ8™8Ó$òó %ó %ðð
 ×Ñòó ðð< ×Ñ˜BŸG™GÓ$ò	ó %ð	ð ×Ñ˜BŸI™IÓ&Ø×Ñ˜BŸF™FÓ#ò	ó $ó 'ð	ð ×Ñ˜BŸJ™JÓ'òó (ðð ×Ñ˜BŸI™IÓ&ò	ó 'ð	ð ×Ñ˜BŸM™MÓ*òó +ðð ×Ñ˜BŸK™KÓ(òó )ðð ×Ñ˜BŸH™HÓ%òó &ðð ×Ñ˜BŸH™HÓ%Ø×Ñ˜BŸH™HÓ%ò	ó &ó &ð	ó#óL=ó9ó ð ×ÑØ29ô ó ðð  ×Ñ�r—w‘wÓØ07ô Uó  ðUð ×Ñ�r—v‘vÓØ.5ô ó ðð  ×Ñ�r—z‘zÓ"Ø6=ô ó #ðð$ ×Ñ�r—y‘yÓ!Ø4;ô Uó "ðUð ×Ñ�r—}‘}Ó%Ø<Cô Uó &ðUð ×Ñ�r—{‘{Ó#Ø8?ô Uó $ðUð$ 29ñ
Ø$ð
àó
ð 9@õ ð$ Øñ	Øðð ðð ð	ð
 óð@ 48ÈbñØðØ-0ðØFKðàóð< ˜e D¨% KÑ0Ñ1€ˆYÓ 1óðØðØ(-ðØ;?ðàóó$Nó"Ró$Jó2óó$MóMó
óð" ‡F�FÐ Ø‡J�JÐ(Ø‡I�IÐ&Ø‡M�MÐ.Ø‡K�KÐ,ðÐ óð& 79ÀDÐWXñ%Øð%Ø.3ð%ØQTð%àó%ðR 79Àqñ;Øð;Ø.3ð;ØADð;àó;ð|#Øð#Ø")ð#Ø48ð#à	ó#ð;Øð;Ø!'ð;Ø26ð;ØEJð;à	ó;ð$;Øð;Ø%/ð;Ø:>ð;ØMRð;à	ó;ð.ØðØ$-ðØ8<ðà	óó.'ð
SØðSà!ðSð ðSð ð	Sð
 
óSó0"ôJ�zô ó
ð ;?ðØðØ"&ðØ,7ðàóðD 7>ñ?Øð?Ø%)ð?à	ó?ð2 4;ö 	(r3   