Ë
    £èhZP  ã                  ó  — U d dl mZ d dlmZmZmZmZ d dlmZm	Z	 d dl
Z
d dl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 d dlmZmZmZmZmZmZm Z m!Z! 	 d dl"m#Z# g d¢Z% e&ejN                  «      Z( e&ejR                  «      Z* e&ejV                  «      Z, e&ejZ                  «      Z. G d	„ d
e/«      Z0 G d„ de0«      Z1ejd                  Z3de4d<   ejj                  Z6de4d<    ejn                  g e6¬«      Z8 ejn                  g e3¬«      Z9 G d„ de
jt                  «      Z; G d„ de;«      Z< G d„ de;«      Z=d&d„Z>dZ?dZ@dZAdZBde@feAeAfeBeBeBfe?fgZCddœd&d„ZDd'd „ZEd(d!„ZF G d"„ d#e
jt                  «      ZG G d$„ d%eG«      ZHy# e$$ r dZ#Y �Œ+w xY w))é    )Úannotations)ÚIterableÚOptionalÚIteratorÚSequence)ÚSelfÚ	TypeAliasN)	ÚMatrix44ÚUVecÚVec2ÚVec3Úhas_clockwise_orientationÚBezier3PÚBezier4PÚBoundingBox2dÚBoundingBox)ÚPathÚCommandÚPathElementÚLineToÚMoveToÚCurve3ToÚCurve4ToÚnesting)Ú
np_support)	ÚNumpyPath2dÚNumpyPoints2dÚNumpyPoints3dÚNumpyShapesExceptionÚEmptyShapeErrorÚto_qpainter_pathÚto_matplotlib_pathÚsingle_pathsÚorient_pathsc                  ó   — e Zd Zy)r   N©Ú__name__Ú
__module__Ú__qualname__© ó    ú.lib/python3.12/site-packages/ezdxf/npshapes.pyr   r   9   ó   „ Ør+   r   c                  ó   — e Zd Zy)r    Nr&   r*   r+   r,   r    r    =   r-   r+   r    r	   ÚCommandNumpyTypeÚVertexNumpyType©Údtypec                  ó~   — e Zd ZU dZeZded<   dd„Zej                  dd„«       Z
dd„Zdd„Zdd„Zdd	„Zdd
„Zdd„Zy)ÚNumpyShape2dz¬This is an optimization to store many 2D paths and polylines in a compact way
    without sacrificing basic functions like transformation and bounding box calculation.
    únpt.NDArray[VertexNumpyType]Ú	_verticesc                ó´   — | j                   }t        |«      dkD  r4t        |j                  d«      «      t        |j	                  d«      «      fS t        d«      ‚©zBReturns the extents of the bounding box as tuple (extmin, extmax).r   zempty shape has no extends)r6   Úlenr   ÚminÚmaxr    ©ÚselfÚvs     r,   ÚextentszNumpyShape2d.extentsN   óE   € à�N‰NˆÜˆq‹6�AŠ:Ü˜Ÿ™˜a›“>¤4¨¯©¨a«£>Ð1Ð1ä!Ð">Ó?Ð?r+   c                 ó   — y ©Nr*   ©r=   s    r,   ÚclonezNumpyShape2d.cloneV   ó   € àr+   c                ó   — | j                   S rB   ©r6   rC   s    r,   Únp_verticeszNumpyShape2d.np_verticesZ   ó   € Ø�~‰~Ðr+   c                ó^   — | j                   }t        |«      dk(  ry|j                  |d«       y)ú-Transforms the vertices of the shape inplace.r   Né   ©r6   r9   Útransform_array_inplace©r=   Úmr>   s      r,   Útransform_inplacezNumpyShape2d.transform_inplace]   ó)   € à�N‰NˆÜˆq‹6�QŠ;ØØ	×!Ñ! ! QÕ'r+   c                óR   — | j                   D �cg c]  }t        |«      ‘Œ c}S c c}w )ziReturns the shape vertices as list of :class:`Vec2` 
        e.g. [Vec2(1, 2), Vec2(3, 4), ...] 
        ©r6   r   r<   s     r,   ÚverticeszNumpyShape2d.verticesd   s$   € ð "&§¢Ó0¡˜A”�Q• Ñ0Ð0ùÒ0ó   �$c                óR   — | j                   D �cg c]  }t        |«      ‘Œ c}S c c}w )z[Returns the shape vertices as list of 2-tuples 
        e.g. [(1, 2), (3, 4), ...]
        )r6   Útupler<   s     r,   Ú	to_tupleszNumpyShape2d.to_tuplesj   s$   € ð #'§.¢.Ó1¡.˜Q”�a• .Ñ1Ð1ùÒ1rV   c                ó6   — | j                   j                  «       S )zXReturns the shape vertices as list of lists 
        e.g. [[1, 2], [3, 4], ...]
        )r6   ÚtolistrC   s    r,   Úto_listzNumpyShape2d.to_listp   s   € ð �~‰~×$Ñ$Ó&Ð&r+   c                ó4   — t        | j                  «       «      S ©z)Returns the bounding box of all vertices.)r   r?   rC   s    r,   ÚbboxzNumpyShape2d.bboxv   s   € ä˜TŸ\™\›^Ó,Ð,r+   N)Úreturnztuple[Vec2, Vec2]©r`   r   ©r`   r5   ©rP   r
   r`   ÚNone©r`   z
list[Vec2])r`   zlist[tuple[float, float]])r`   zlist[list[float]])r`   r   )r'   r(   r)   Ú__doc__ÚEMPTY_SHAPEr6   Ú__annotations__r?   ÚabcÚabstractmethodrD   rH   rQ   rU   rY   r\   r_   r*   r+   r,   r4   r4   G   sR   … ñð /:€IÐ+Ó9ó@ð 	×Ñòó ðóó(ó1ó2ó'ô-r+   r4   c                  ó,   — e Zd ZdZdd„Zdd„ZeZdd„Zy)	r   z5Represents an array of 2D points stored as a ndarray.c                óœ   — |rEt        j                  |D �cg c]  }|j                  |j                  f‘Œ c}t        ¬«      | _        y y c c}w ©Nr1   )ÚnpÚarrayÚxÚyr0   r6   ©r=   Úpointsr>   s      r,   Ú__init__zNumpyPoints2d.__init__~   s=   € ÙÜŸX™XÙ%+Ó,¡V �!—#‘#�q—s‘s’ VÑ,´OôˆD�Nð ùâ,s   –A	c                óf   — | j                  d «      }| j                  j                  «       |_        |S rB   ©Ú	__class__r6   Úcopy©r=   rD   s     r,   rD   zNumpyPoints2d.clone„   ó)   € Ø—‘˜tÓ$ˆØŸ.™.×-Ñ-Ó/ˆŒØˆr+   c                ó,   — t        | j                  «      S rB   ©r9   r6   rC   s    r,   Ú__len__zNumpyPoints2d.__len__‹   ó   € Ü�4—>‘>Ó"Ð"r+   N)rs   zOptional[Iterable[Vec2 | Vec3]]r`   rd   ra   ©r`   Úint©r'   r(   r)   rf   rt   rD   Ú__copy__r}   r*   r+   r,   r   r   {   ó   „ Ù?óóð
 €Hô#r+   r   c                  ó0  — e Zd ZU dZded<   dd„Zdd„Zedd„«       Zedd„«       Z	dd„Z
dd	„ZeZd d
„Zd!d„Zd"d„Ze	 d#	 	 	 	 	 d$d„«       Zed%d„«       Zed%d„«       Zed%d„«       Zed%d„«       Zd&d„Zd%d„Zdd„Zdd„Zdd„Zd'd(d„Zd)d„Zed*d„«       Zy)+r   ab  Represents a 2D path, the path control vertices and commands are stored as ndarray.

    This class cannot build paths from scratch and is therefore not a drop-in replacement
    for the :class:`ezdxf.path.Path` class. Operations like transform and reverse are
    done inplace to utilize the `numpy` capabilities. This behavior is different from the
    :class:`ezdxf.path.Path` class!!!

    Construct new paths by the :class:`Path` class and convert them to
    :class:`NumpyPath2d` instances::

        path = Path((0, 0))
        path.line_to((50, 70))
        ...
        path2d = NumpyPath2d(path)

    znpt.NDArray[CommandNumpyType]Ú	_commandsc                ó®  — |€t         | _        t        | _        y |j	                  «       D �cg c]  }|j
                  |j                  f‘Œ }}t        |«      dk(  r	 t        |j                  «      g}t        j                  |t        ¬«      | _        t        j                  |j                  «       t        ¬«      | _        y c c}w # t        $ r g }Y Œaw xY w)Nr   r1   )rg   r6   ÚNO_COMMANDSr…   Úcontrol_verticesrp   rq   r9   r   ÚstartÚ
IndexErrorrn   ro   r0   Úcommand_codesr/   )r=   Úpathr>   rU   s       r,   rt   zNumpyPath2d.__init__£   s±   € Øˆ<Ü(ˆDŒNÜ(ˆDŒNØà(,×(=Ñ(=Ô(?Ó@Ñ(? 1�Q—S‘S˜!Ÿ#™#’JÐ(?ˆÐ@Üˆx‹=˜AÒðÜ  §¡Ó,Ð-�ô Ÿ™ (´/ÔBˆŒÜŸ™ $×"4Ñ"4Ó"6Ô>NÔOˆ�ùò Aøô ò Ø’ðús   ¬CÁC ÃCÃCc                ó,   — t        | j                  «      S rB   )r9   r…   rC   s    r,   r}   zNumpyPath2d.__len__²   r~   r+   c                ó2   — t        | j                  d   «      S )z>Returns the start point as :class:`~ezdxf.math.Vec2` instance.r   ©r   r6   rC   s    r,   r‰   zNumpyPath2d.startµ   s   € ô �D—N‘N 1Ñ%Ó&Ð&r+   c                ó2   — t        | j                  d   «      S )z<Returns the end point as :class:`~ezdxf.math.Vec2` instance.éÿÿÿÿr�   rC   s    r,   ÚendzNumpyPath2d.endº   s   € ô �D—N‘N 2Ñ&Ó'Ð'r+   c                óR   — | j                   D �cg c]  }t        |«      ‘Œ c}S c c}w rB   rT   r<   s     r,   rˆ   zNumpyPath2d.control_vertices¿   s"   € Ø!%§¢Ó0¡˜A”�Q• Ñ0Ð0ùÒ0rV   c                ó¤   — | j                  d «      }| j                  j                  «       |_        | j                  j                  «       |_        |S rB   )rw   r…   rx   r6   ry   s     r,   rD   zNumpyPath2d.cloneÂ   s=   € Ø—‘˜tÓ$ˆØŸ.™.×-Ñ-Ó/ˆŒØŸ.™.×-Ñ-Ó/ˆŒØˆr+   c                ó,   — t        | j                  «      S )zInternal API.)Úlistr…   rC   s    r,   r‹   zNumpyPath2d.command_codesÊ   s   € ä�D—N‘NÓ#Ð#r+   c              #  ót  K  — | j                  «       }d}| j                  D ]“  }|t        k(  rt        ||   «      –— |dz  }Œ"|t        k(  rt        ||dz      ||   «      –— |dz  }ŒH|t        k(  r$t        ||dz      ||   ||dz      «      –— |dz  }Œu|t        k(  sŒt        ||   «      –— |dz  }Œ• y ­w)Né   rL   é   )
rU   r…   ÚCMD_LINE_TOr   ÚCMD_CURVE3_TOr   ÚCMD_CURVE4_TOr   ÚCMD_MOVE_TOr   )r=   rU   ÚindexÚcmds       r,   ÚcommandszNumpyPath2d.commandsÎ   sÌ   è ø€ Ø—=‘=“?ˆØˆØ—>”>ˆCØ”kÒ!Ü˜X e™_Ó-Ò-Ø˜‘
‘ØœÒ%Ü˜x¨°©	Ñ2°H¸U±OÓDÒDØ˜‘
‘ØœÒ%ÜØ˜U Q™YÑ'¨°%©¸(À5È1Á9Ñ:Móò ð ˜‘
‘ØœÓ#Ü˜X e™_Ó-Ò-Ø˜‘
‘ñ "ùs   ‚BB8Â B8c                óÊ   — | j                   D �cg c]  }t        |«      ‘Œ }}| j                  D �cg c]  }t        |«      ‘Œ }}t	        j
                  ||«      S c c}w c c}w )z0Returns a new :class:`ezdxf.path.Path` instance.)r6   r   r…   r   r   Úfrom_vertices_and_commands)r=   r>   rU   Úcr    s        r,   Úto_pathzNumpyPath2d.to_pathá   sU   € à%)§^¢^Ó4¡^ ”D˜•G ^ˆÐ4Ø(,¯ªÓ7© 1”G˜A•J¨ˆÐ7Ü×.Ñ.¨x¸ÓBÐBùò 5ùÚ7s
   �A±A c                óœ  —  | d «      }t        |«      }t        |«      dk(  r|S |r+|d   j                  |d   «      s|j                  |d   «       |D �cg c]  }|j                  |j
                  f‘Œ }}t        j                  |t        ¬«      |_	        t        j                  t        |«      dz
  t        t        ¬«      |_        |S c c}w )Nr   r‘   r1   r˜   )Ú
fill_valuer2   )r–   r9   ÚiscloseÚappendrp   rq   rn   ro   r0   r6   Úfullrš   r/   r…   )ÚclsrU   ÚcloseÚnew_pathr>   rs   s         r,   Úfrom_verticeszNumpyPath2d.from_verticesç   s¯   € ñ �t“9ˆÜ˜“>ˆÜˆx‹=˜AÒØˆOÙ˜ !™×,Ñ,¨X°b©\Ô:Ø�O‰O˜H Q™KÔ(á&.Ó/¡h �1—3‘3˜Ÿ™’* hˆÐ/ÜŸX™X f´OÔDˆÔÜŸW™WÜ�‹K˜!‰O¬Ô;Kô
ˆÔð ˆùò 0s   ÁC	c                ó&   — t         | j                  v S )zoReturns ``True`` if the path is a :term:`Multi-Path` object that
        contains multiple sub-paths.

        )r�   r…   rC   s    r,   Úhas_sub_pathszNumpyPath2d.has_sub_pathsù   s   € ô ˜dŸn™nÐ,Ð,r+   c                ó~   — t        | j                  «      dkD  r%| j                  j                  | j                  «      S y)z>Returns ``True`` if the start point is close to the end point.r˜   F)r9   r6   r‰   r§   r’   rC   s    r,   Ú	is_closedzNumpyPath2d.is_closed  s1   € ô ˆt�~‰~Ó Ò"Ø—:‘:×%Ñ% d§h¡hÓ/Ð/Ør+   c                ó&   — t         | j                  v S )z3Returns ``True`` if the path has any line segments.)rš   r…   rC   s    r,   Ú	has_lineszNumpyPath2d.has_lines  s   € ô ˜dŸn™nÐ,Ð,r+   c                óN   — t         | j                  v xs t        | j                  v S )z4Returns ``True`` if the path has any curve segments.)r›   r…   rœ   rC   s    r,   Ú
has_curveszNumpyPath2d.has_curves  s!   € ô  §¡Ð.ÒQ´-À4Ç>Á>Ð2QÐQr+   c           	     óz  ‡ ‡‡‡‡‡‡‡	— dˆˆˆˆ ˆˆˆˆ	fd„}‰ j                   Št        ‰«      dk(  rg S t        ‰vr‰ gS g Š‰ j                  ŠdŠ	dŠdŠdŠ‰D ]P  }|t        k(  r‰dz  Šn:|t
        k(  r‰dz  Šn+|t        k(  r‰dz  Šn|t        k(  r |«        ‰dz  Š‰Š	‰dz   Š‰dz  ŠŒR ‰d   t        k7  r |«        ‰S )zÄYield all sub-paths as :term:`Single-Path` objects.

        It's safe to call :meth:`sub_paths` on any path-type:
        :term:`Single-Path`, :term:`Multi-Path` and :term:`Empty-Path`.

        c                 óx   •— ‰j                  d «      } ‰‰‰dz    | _        ‰‰‰ | _        ‰j                  | «       y )Nr˜   )rw   r6   r…   r¨   )	ÚsÚ	cmd_indexÚcmd_start_indexr    r=   Ú	sub_pathsrU   Ú	vtx_indexÚvtx_start_indexs	    €€€€€€€€r,   Úappend_sub_pathz.NumpyPath2d.sub_paths.<locals>.append_sub_path  s?   ø€ Ø—n‘n TÓ*ˆAØ" ?°YÀ±]ÐCˆAŒKØ" ?°9Ð=ˆAŒKØ×Ñ˜QÕr+   r   r˜   rL   r™   r‘   )r`   rd   )r…   r9   r�   r6   rš   r›   rœ   )
r=   r¾   rŸ   r¹   rº   r    r»   rU   r¼   r½   s
   `  @@@@@@@r,   r»   zNumpyPath2d.sub_paths  sß   ÿ€ ÷	 ô 	 ð —>‘>ˆÜˆx‹=˜AÒØˆIÜ˜hÑ&Ø�6ˆMà "ˆ	Ø—>‘>ˆØˆØˆ	ØˆØˆ	ÛˆCØ”kÒ!Ø˜Q‘‘	ØœÒ%Ø˜Q‘‘	ØœÒ%Ø˜Q‘‘	ØœÒ#ÙÔ!à˜Q‘�	Ø"+�Ø"+¨a¡-�Ø˜‰N‰Ið ð �B‰<œ;Ò&ÙÔØÐr+   c                ó¬   — | j                   rt        d«      ‚t        €t        | j	                  «       «      S t        j                  | j
                  «      S )z Returns ``True`` if 2D path has clockwise orientation.

        Raises:
            TypeError: can't detect orientation of a :term:`Multi-Path` object

        z/can't detect orientation of a multi-path object)r¯   Ú	TypeErrorr   r   rU   r6   rC   s    r,   r   z%NumpyPath2d.has_clockwise_orientation?  sE   € ð ×ÒÜÐMÓNÐNÜÐÜ,¨T¯]©]«_Ó=Ð=ä×7Ñ7¸¿¹ÓGÐGr+   c                óì  — | j                   }t        | j                   «      s| S |d   t        k(  rht        j                  |dd «      j                  «       | _         t        j                  | j                  dd…df   d¬«      j                  «       | _        | S t        j                  |«      j                  «       | _         t        j                  | j                  d¬«      j                  «       | _        | S )z!Reverse path orientation inplace.r‘   N.r   ©Úaxis)r…   r9   r�   rn   Úfliprx   r6   )r=   r    s     r,   ÚreversezNumpyPath2d.reverseM  s»   € à—>‘>ˆÜ�4—>‘>Ô"ØˆKØ�B‰<œ;Ò&ô
  ŸW™W X¨c¨r ]Ó3×8Ñ8Ó:ˆDŒNÜŸW™W T§^¡^°C°R°C¸°HÑ%=ÀAÔF×KÑKÓMˆDŒNð ˆô  ŸW™W XÓ.×3Ñ3Ó5ˆDŒNÜŸW™W T§^¡^¸!Ô<×AÑAÓCˆDŒNØˆr+   c                óF   — | j                  «       s| j                  «        | S )zŽApply clockwise orientation inplace.

        Raises:
            TypeError: can't detect orientation of a :term:`Multi-Path` object

        ©r   rÅ   rC   s    r,   Ú	clockwisezNumpyPath2d.clockwise^  s   € ð ×-Ñ-Ô/Ø�L‰LŒNØˆr+   c                óF   — | j                  «       r| j                  «        | S )z–Apply counter-clockwise orientation inplace.

        Raises:
            TypeError: can't detect orientation of a :term:`Multi-Path` object

        rÇ   rC   s    r,   Úcounter_clockwisezNumpyPath2d.counter_clockwisei  s   € ð ×)Ñ)Ô+Ø�L‰LŒNØˆr+   c           	   #  ó~  K  — t        | j                  «      sy| j                  «       }|d   }|–— d}| j                  D ]õ  }|t        k(  s	|t        k(  r||   }|dz  }|–— nÐ|t
        k(  rW|||dz    \  }}|dz  }t        j                  t        |||f«      j                  ||«      «      }	t        |	«       |	E d{  –—†  np|t        k(  rY|||dz    \  }
}}|dz  }t        j                  t        ||
||f«      j                  ||«      «      }	t        |	«       |	E d{  –—†  nt        d|› �«      ‚|}Œ÷ y7 Œz7 Œ­w)z4Flatten path to vertices as :class:`Vec2` instances.Nr   r˜   rL   r™   zInvalid command: )r9   r…   rU   rš   r�   r›   r   Úgenerater   Ú
flatteningÚnextrœ   r   Ú
ValueError)r=   ÚdistanceÚsegmentsrU   r‰   rž   rŸ   Úend_locationÚctrlÚptsÚctrl1Úctrl2s               r,   rÍ   zNumpyPath2d.flatteningu  sR  è ø€ ä�4—>‘>Ô"Øà—=‘=“?ˆØ˜‘ˆØŠØˆØ—>”>ˆCØ”kÒ! S¬KÒ%7Ø'¨™�Ø˜‘
�Ø"Ó"ØœÒ%Ø%-¨e°e¸a±iÐ%@Ñ"��lØ˜‘
�Ü—m‘mÜ˜e T¨<Ð8Ó9×DÑDÀXÈxÓXó�ô �S”	Ø—‘ØœÒ%Ø-5°e¸eÀa¹iÐ-HÑ*��u˜lØ˜‘
�Ü—m‘mÜ˜e U¨E°<Ð@ÓA×LÑLØ  (óó�ô
 �S”	Ø—‘ä Ð#4°S°EÐ!:Ó;Ð;Ø ‰Eñ3 "ð øð ús%   ‚B<D=Â>D9Â?A!D=Ä D;Ä!D=Ä;D=c                ó®  — t        |«      syt        | j                  «      s|d   }|dd }n| }|j                  g}|j                  g}|j                  }|D ]Æ  }t        |j                  «      dk(  rŒ|j	                  |j
                  «      sK|j                  t        j                  t        ft        ¬«      «       |j                  |j                  «       n|j                  |j                  dd «       |j                  }|j                  |j                  «       ŒÈ t        j                  |d¬«      | _        t        j                  |«      | _        y)zÌExtend an existing path by appending additional paths. The paths are
        connected by MOVE_TO commands if the end- and start point of sequential paths
        are not coincident (multi-path).
        Nr   r˜   r1   rÂ   )r9   r…   r6   r’   r§   r‰   r¨   rn   ro   r�   r/   Úconcatenate)r=   ÚpathsÚfirstrU   r    r’   Ú	next_paths          r,   ÚextendzNumpyPath2d.extendŸ  s  € ô
 �5ŒzØÜ�4—>‘>Ô"Ø˜!‘HˆEØ˜!˜"�I‰EàˆEà&+§o¡oÐ%6ˆØ&+§o¡oÐ%6ˆØ—I‘IˆãˆIÜ�9×&Ñ&Ó'¨1Ò,ØØ—;‘;˜yŸ™Ô/Ø—‘¤§¡¬+¨Ô?OÔ PÔQØ—‘ 	× 3Ñ 3Õ4à—‘ 	× 3Ñ 3°A°BÐ 7Ô8Ø—-‘-ˆCØ�O‰O˜I×/Ñ/Õ0ð ô Ÿ™¨°qÔ9ˆŒÜŸ™¨Ó1ˆ�r+   c                ón   — | st        d«      S | d   j                  «       }|j                  | dd «       |S )z¿Returns a new path of concatenated paths. The paths are connected by
        MOVE_TO commands if the end- and start point of sequential paths are not
        coincident (multi-path).
        Nr   r˜   )r   rD   rÜ   )rÙ   rÚ   s     r,   rØ   zNumpyPath2d.concatenate½  s9   € ñ Ü˜tÓ$Ð$Ø�a‘—‘Ó ˆØ�‰�U˜1˜2�YÔØˆr+   N)rŒ   zOptional[Path]r`   rd   r   )r`   r   re   ra   )r`   z	list[int])r`   zIterator[PathElement])r`   r   )F)rU   zIterable[Vec2 | Vec3]r«   Úboolr`   r   )r`   rÞ   )r`   z
list[Self])é   )rÐ   ÚfloatrÑ   r€   r`   zIterator[Vec2])rÙ   úSequence[NumpyPath2d]r`   rd   )rÙ   rá   r`   r   )r'   r(   r)   rf   rh   rt   r}   Úpropertyr‰   r’   rˆ   rD   r‚   r‹   r    r¤   Úclassmethodr­   r¯   r±   r³   rµ   r»   r   rÅ   rÈ   rÊ   rÍ   rÜ   ÚstaticmethodrØ   r*   r+   r,   r   r   �   s  … ñð" -Ó,óPó#ð ò'ó ð'ð ò(ó ð(ó1óð €Hó$óó&Cð à<AðØ,ðØ59ðà	òó ðð" ò-ó ð-ð òó ðð ò-ó ð-ð òRó ðRó+óZHóó"	ó
ô"!óT2ð< ò
ó ñ
r+   r   c           	     ó�  — ddl m}m} t        | «      } t	        | «      dk(  rt        d«      ‚ |«       }| D �]  }|j                  «       D �cg c]  } ||j                  |j                  «      ‘Œ! }}|j                  |d   «       d}|j                  «       D ]£  }|t        k(  r|j                  ||   «       |dz  }Œ&|t        k(  r!|j                  ||   ||dz      «       |dz  }ŒP|t        k(  r(|j!                  ||   ||dz      ||dz      «       |dz  }Œ�|t"        k(  sŒ‹|j                  ||   «       |dz  }Œ¥ �Œ
 |S c c}w )z>Convert the given `paths` into a single :class:`QPainterPath`.r   )ÚQPainterPathÚQPointFúone or more paths requiredr˜   rL   r™   )Úezdxf.addons.xqtræ   rç   r–   r9   rÏ   rU   rp   rq   ÚmoveTor‹   rš   ÚlineTor›   ÚquadTorœ   ÚcubicTor�   )	rÙ   ræ   rç   ÚqpathrŒ   r>   rs   rž   rŸ   s	            r,   r!   r!   Ë  s8  € ç6ä�‹K€EÜ
ˆ5ƒz�Q‚ÜÐ5Ó6Ð6á‹N€EÜˆØ-1¯]©]¬_Ó=©_¨‘'˜!Ÿ#™#˜qŸs™sÕ#¨_ˆÐ=Ø�‰�V˜A‘YÔØˆØ×%Ñ%Ö'ˆCà”kÒ!Ø—‘˜V E™]Ô+Ø˜‘
‘ØœÒ%Ø—‘˜V E™]¨F°5¸1±9Ñ,=Ô>Ø˜‘
‘ØœÒ%Ø—‘˜f U™m¨V°E¸A±IÑ->ÀÀuÈqÁyÑ@QÔRØ˜‘
‘ØœÓ#Ø—‘˜V E™]Ô+Ø˜‘
‘ò (ð	 ð$ €Lùò# >s   Á$Er˜   rL   r™   rß   )r   F)Údetect_holesc               ó  — ddl m} t        | «      } t        | «      dk(  rt	        d«      ‚|rt        | «      } g }g }| D ]c  }|j                  |j                  «       «       |j                  t        «       |j                  «       D ]  }|j                  t        |   «       Œ Œe t        j                  |«      }	  |||«      S # t        $ r4}t	        dt        |«      › dt        |«      › dt        |«      › �«      ‚d}~ww xY w)a  Convert the given `paths` into a single :class:`matplotlib.path.Path`.

    Matplotlib requires counter-clockwise oriented outside paths and clockwise oriented
    holes. Set the `detect_holes` argument to ``True`` if this path orientation is not
    yet satisfied.
    r   )r   rè   zmatplotlib.path.Path(z, z): N)Úmatplotlib.pathr   r–   r9   rÏ   r$   r¨   rH   Ú
MPL_MOVETOr‹   rÜ   Ú	MPL_CODESrn   rØ   Ú	ExceptionÚstr)	rÙ   rï   r   rU   ÚcodesrŒ   rŸ   rs   Úes	            r,   r"   r"   ÷  sí   € õ %ä�‹K€EÜ
ˆ5ƒz�Q‚ÜÐ5Ó6Ð6áä˜UÓ#ˆà!#€HØ€EÛˆØ�‰˜×(Ñ(Ó*Ô+Ø�‰”ZÔ Ø×%Ñ%Ö'ˆCØ�L‰Lœ 3™Õ(ñ (ð ô
 �^‰^˜HÓ%€FðYÙ�F˜EÓ"Ð"øÜò YÜÐ0´°V³°¸RÄÀEÃ
¸|È3ÌsÐSTËvÈhÐWÓXÐXûðYús   Â:C Ã	D Ã/C;Ã;D c                ó`   — g }| D ]&  }|j                  «       }|sŒ|j                  |«       Œ( |S rB   )r»   rÜ   )rÙ   Úsingle_paths_Úpr»   s       r,   r#   r#     s5   € Ø')€MÛˆØ—K‘K“Mˆ	ÚØ× Ñ  Õ+ð ð Ðr+   c                óø   — t        | «      }t        |«      dk  r| S t        j                  |«      }t        j                  |«      \  }}|D ]  }|j                  «        Œ |D ]  }|j                  «        Œ ||z   S )zoReturns a new list of paths, with outer paths oriented counter-clockwise and
    holes oriented clockwise.
    rL   )r#   r9   r   Úmake_polygon_structureÚwinding_deconstructionrÊ   rÈ   )rÙ   r»   ÚpolygonsÚouter_pathsÚholesrŒ   s         r,   r$   r$     s}   € ô $0°Ó#6€IÜ
ˆ9ƒ~˜ÒØˆä×-Ñ-¨iÓ8€Hô !×7Ñ7¸ÓAÑ€K�ó ˆØ×ÑÕ ð ãˆØ�‰Õð à˜ÑÐr+   c                  ón   — e Zd ZU dZeZded<   dd„Zej                  dd„«       Z
dd„Zdd„Zdd„Zdd	„Zy
)ÚNumpyShape3dz¬This is an optimization to store many 3D paths and polylines in a compact way
    without sacrificing basic functions like transformation and bounding box calculation.
    r5   r6   c                ó´   — | j                   }t        |«      dkD  r4t        |j                  d«      «      t        |j	                  d«      «      fS t        d«      ‚r8   )r6   r9   r   r:   r;   r    r<   s     r,   r?   zNumpyShape3d.extents;  r@   r+   c                 ó   — y rB   r*   rC   s    r,   rD   zNumpyShape3d.cloneC  rE   r+   c                ó   — | j                   S rB   rG   rC   s    r,   rH   zNumpyShape3d.np_verticesG  rI   r+   c                ó^   — | j                   }t        |«      dk(  ry|j                  |d«       y)rK   r   Nr™   rM   rO   s      r,   rQ   zNumpyShape3d.transform_inplaceJ  rR   r+   c                óR   — | j                   D �cg c]  }t        |«      ‘Œ c}S c c}w )z4Returns the shape vertices as list of :class:`Vec3`.)r6   r   r<   s     r,   rU   zNumpyShape3d.verticesQ  s"   € à!%§¢Ó0¡˜A”�Q• Ñ0Ð0ùÒ0rV   c                ó4   — t        | j                  «       «      S r^   )r   r?   rC   s    r,   r_   zNumpyShape3d.bboxU  s   € ä˜4Ÿ<™<›>Ó*Ð*r+   N)r`   ztuple[Vec3, Vec3]ra   rb   rc   )r`   z
list[Vec3])r`   r   )r'   r(   r)   rf   rg   r6   rh   r?   ri   rj   rD   rH   rQ   rU   r_   r*   r+   r,   r  r  4  sH   … ñð /:€IÐ+Ó9ó@ð 	×Ñòó ðóó(ó1ô+r+   r  c                  ó,   — e Zd ZdZdd„Zdd„ZeZdd„Zy)	r   z5Represents an array of 3D points stored as a ndarray.c                ó–   — |rBt        j                  |D �cg c]  }t        |«      j                  ‘Œ c}t        ¬«      | _        y y c c}w rm   )rn   ro   r   Úxyzr0   r6   rr   s      r,   rt   zNumpyPoints3d.__init__]  s9   € ÙÜŸX™XÙ&,Ó-¡f ”�a“—“ fÑ-´_ôˆD�Nð ùâ-s   –Ac                óf   — | j                  d «      }| j                  j                  «       |_        |S rB   rv   ry   s     r,   rD   zNumpyPoints3d.clonec  rz   r+   c                ó,   — t        | j                  «      S rB   r|   rC   s    r,   r}   zNumpyPoints3d.__len__j  r~   r+   N)rs   zOptional[Iterable[UVec]]r`   rd   ra   r   r�   r*   r+   r,   r   r   Z  rƒ   r+   r   )rÙ   úIterable[NumpyPath2d])rÙ   r  r`   úlist[NumpyPath2d])rÙ   r  r`   r  )IÚ
__future__r   Útypingr   r   r   r   Útyping_extensionsr   r	   ri   Únumpyrn   Únumpy.typingÚnptÚ
ezdxf.mathr
   r   r   r   r   r   r   r   r   Ú
ezdxf.pathr   r   r   r   r   r   r   r   Ú	ezdxf.accr   ÚImportErrorÚ__all__r€   ÚMOVE_TOr�   ÚLINE_TOrš   Ú	CURVE3_TOr›   Ú	CURVE4_TOrœ   rô   r   r    Úint8r/   rh   Úfloat64r0   ro   rg   r‡   ÚABCr4   r   r   r!   rò   Ú
MPL_LINETOÚ
MPL_CURVE3Ú
MPL_CURVE4ró   r"   r#   r$   r  r   r*   r+   r,   Ú<module>r%     sž  ðö #ß 9Ó 9ß -Û 
ã Ý ÷
÷ 
õ 
÷	÷ 	ó 	ðÝ$ò
€ñ �'—/‘/Ó"€Ù�'—/‘/Ó"€Ù�G×%Ñ%Ó&€Ù�G×%Ñ%Ó&€ô	˜9ô 	ô	Ð*ô 	ð !Ÿg™gÐ �)Ó %ØŸZ™Z€�Ó 'Øˆb�h‰h�r Ô1€Øˆb�h‰h�rÐ!1Ô2€ô1-�3—7‘7ô 1-ôh#�Lô #ô(y�,ô yóx	ð< €
Ø€
Ø€
Ø€
ð 	Ø€MØ�ÐØ�˜ZÐ(Ø€Mð€	ð FKõ Yó>óô*#+�3—7‘7ô #+ôL#�Lõ #øðo ò ØƒJðús   ÁE< Å<FÆF